From d99bfa61369a2af4146fdeb3f457e59886f1d0e8 Mon Sep 17 00:00:00 2001 From: Marcus Watts Date: Thu, 3 Jan 2008 16:46:56 +0000 Subject: [PATCH] RXK5DEVEL-mdw-rxk5-m58-20080103 merge in latest changes from openafs-devel-1_5_x update to rxk5-m58 --- Makefile.in | 3 +- README | 24 + README-NT | 120 +- README-WIN9X | 200 - acinclude.m4 | 54 +- configure-libafs.in | 7 +- configure.in | 10 +- doc/man-pages/README | 14 +- doc/man-pages/pod1/fs_apropos.pod | 2 +- doc/man-pages/pod1/fs_checkservers.pod | 2 +- doc/man-pages/pod1/fs_checkvolumes.pod | 2 +- doc/man-pages/pod1/fs_cleanacl.pod | 2 +- doc/man-pages/pod1/fs_copyacl.pod | 2 +- doc/man-pages/pod1/fs_diskfree.pod | 2 +- doc/man-pages/pod1/fs_examine.pod | 2 +- doc/man-pages/pod1/fs_exportafs.pod | 2 +- doc/man-pages/pod1/fs_flush.pod | 2 +- doc/man-pages/pod1/fs_flushall.pod | 2 +- doc/man-pages/pod1/fs_flushmount.pod | 2 +- doc/man-pages/pod1/fs_flushvolume.pod | 2 +- doc/man-pages/pod1/fs_getcacheparms.pod | 2 +- doc/man-pages/pod1/fs_getcalleraccess.pod | 2 +- doc/man-pages/pod1/fs_getcellstatus.pod | 2 +- doc/man-pages/pod1/fs_getclientaddrs.pod | 2 +- doc/man-pages/pod1/fs_getcrypt.pod | 2 +- doc/man-pages/pod1/fs_getserverprefs.pod | 2 +- doc/man-pages/pod1/fs_help.pod | 2 +- doc/man-pages/pod1/fs_listacl.pod | 2 +- doc/man-pages/pod1/fs_listaliases.pod | 2 +- doc/man-pages/pod1/fs_listcells.pod | 2 +- doc/man-pages/pod1/fs_listquota.pod | 2 +- doc/man-pages/pod1/fs_lsmount.pod | 2 +- doc/man-pages/pod1/fs_messages.pod | 2 +- doc/man-pages/pod1/fs_mkmount.pod | 2 +- doc/man-pages/pod1/fs_newalias.pod | 2 +- doc/man-pages/pod1/fs_newcell.pod | 2 +- doc/man-pages/pod1/fs_quota.pod | 2 +- doc/man-pages/pod1/fs_rmmount.pod | 2 +- doc/man-pages/pod1/fs_rxstatpeer.pod | 67 + doc/man-pages/pod1/fs_setacl.pod | 2 +- doc/man-pages/pod1/fs_setcachesize.pod | 2 +- doc/man-pages/pod1/fs_setcell.pod | 2 +- doc/man-pages/pod1/fs_setclientaddrs.pod | 2 +- doc/man-pages/pod1/fs_setcrypt.pod | 2 +- doc/man-pages/pod1/fs_setquota.pod | 2 +- doc/man-pages/pod1/fs_setserverprefs.pod | 2 +- doc/man-pages/pod1/fs_setvol.pod | 2 +- doc/man-pages/pod1/fs_storebehind.pod | 2 +- doc/man-pages/pod1/fs_sysname.pod | 45 +- doc/man-pages/pod1/fs_uuid.pod | 81 + doc/man-pages/pod1/fs_whereis.pod | 2 +- doc/man-pages/pod1/fs_whichcell.pod | 2 +- doc/man-pages/pod1/fs_wscell.pod | 2 +- doc/man-pages/pod1/pts_adduser.pod | 2 +- doc/man-pages/pod1/pts_apropos.pod | 2 +- doc/man-pages/pod1/pts_chown.pod | 2 +- doc/man-pages/pod1/pts_creategroup.pod | 2 +- doc/man-pages/pod1/pts_createuser.pod | 2 +- doc/man-pages/pod1/pts_delete.pod | 2 +- doc/man-pages/pod1/pts_examine.pod | 2 +- doc/man-pages/pod1/pts_help.pod | 2 +- doc/man-pages/pod1/pts_interactive.pod | 2 +- doc/man-pages/pod1/pts_listentries.pod | 2 +- doc/man-pages/pod1/pts_listmax.pod | 2 +- doc/man-pages/pod1/pts_listowned.pod | 2 +- doc/man-pages/pod1/pts_membership.pod | 2 +- doc/man-pages/pod1/pts_quit.pod | 2 +- doc/man-pages/pod1/pts_removeuser.pod | 2 +- doc/man-pages/pod1/pts_rename.pod | 2 +- doc/man-pages/pod1/pts_setfields.pod | 2 +- doc/man-pages/pod1/pts_setmax.pod | 2 +- doc/man-pages/pod1/pts_sleep.pod | 2 +- doc/man-pages/pod1/pts_source.pod | 2 +- doc/man-pages/pod1/symlink.pod | 40 + doc/man-pages/pod1/symlink_list.pod | 79 + doc/man-pages/pod1/symlink_make.pod | 76 + doc/man-pages/pod1/symlink_remove.pod | 70 + doc/man-pages/pod1/vos.pod | 3 +- doc/man-pages/pod1/vos_addsite.pod | 2 +- doc/man-pages/pod1/vos_apropos.pod | 2 +- doc/man-pages/pod1/vos_backup.pod | 2 +- doc/man-pages/pod1/vos_backupsys.pod | 2 +- doc/man-pages/pod1/vos_changeaddr.pod | 2 +- doc/man-pages/pod1/vos_changeloc.pod | 2 +- doc/man-pages/pod1/vos_convertROtoRW.pod | 122 + doc/man-pages/pod1/vos_copy.pod | 158 + doc/man-pages/pod1/vos_create.pod | 2 +- doc/man-pages/pod1/vos_delentry.pod | 2 +- doc/man-pages/pod1/vos_dump.pod | 2 +- doc/man-pages/pod1/vos_examine.pod | 2 +- doc/man-pages/pod1/vos_help.pod | 2 +- doc/man-pages/pod1/vos_listaddrs.pod | 2 +- doc/man-pages/pod1/vos_listpart.pod | 2 +- doc/man-pages/pod1/vos_listvldb.pod | 2 +- doc/man-pages/pod1/vos_listvol.pod | 2 +- doc/man-pages/pod1/vos_lock.pod | 2 +- doc/man-pages/pod1/vos_move.pod | 2 +- doc/man-pages/pod1/vos_offline.pod | 2 +- doc/man-pages/pod1/vos_online.pod | 2 +- doc/man-pages/pod1/vos_partinfo.pod | 2 +- doc/man-pages/pod1/vos_release.pod | 2 +- doc/man-pages/pod1/vos_remove.pod | 2 +- doc/man-pages/pod1/vos_remsite.pod | 2 +- doc/man-pages/pod1/vos_rename.pod | 2 +- doc/man-pages/pod1/vos_restore.pod | 2 +- doc/man-pages/pod1/vos_size.pod | 2 +- doc/man-pages/pod1/vos_status.pod | 2 +- doc/man-pages/pod1/vos_syncserv.pod | 2 +- doc/man-pages/pod1/vos_syncvldb.pod | 2 +- doc/man-pages/pod1/vos_unlock.pod | 2 +- doc/man-pages/pod1/vos_unlockvldb.pod | 2 +- doc/man-pages/pod1/vos_zap.pod | 2 +- doc/man-pages/pod8/backup_adddump.pod | 2 +- doc/man-pages/pod8/backup_addhost.pod | 2 +- doc/man-pages/pod8/backup_addvolentry.pod | 2 +- doc/man-pages/pod8/backup_addvolset.pod | 2 +- doc/man-pages/pod8/backup_apropos.pod | 2 +- doc/man-pages/pod8/backup_dbverify.pod | 2 +- doc/man-pages/pod8/backup_deldump.pod | 2 +- doc/man-pages/pod8/backup_deletedump.pod | 2 +- doc/man-pages/pod8/backup_delhost.pod | 2 +- doc/man-pages/pod8/backup_delvolentry.pod | 2 +- doc/man-pages/pod8/backup_delvolset.pod | 2 +- doc/man-pages/pod8/backup_diskrestore.pod | 2 +- doc/man-pages/pod8/backup_dump.pod | 2 +- doc/man-pages/pod8/backup_dumpinfo.pod | 2 +- doc/man-pages/pod8/backup_help.pod | 2 +- doc/man-pages/pod8/backup_interactive.pod | 2 +- doc/man-pages/pod8/backup_jobs.pod | 2 +- doc/man-pages/pod8/backup_kill.pod | 2 +- doc/man-pages/pod8/backup_labeltape.pod | 2 +- doc/man-pages/pod8/backup_listdumps.pod | 2 +- doc/man-pages/pod8/backup_listhosts.pod | 2 +- doc/man-pages/pod8/backup_listvolsets.pod | 2 +- doc/man-pages/pod8/backup_quit.pod | 2 +- doc/man-pages/pod8/backup_readlabel.pod | 2 +- doc/man-pages/pod8/backup_restoredb.pod | 2 +- doc/man-pages/pod8/backup_savedb.pod | 2 +- doc/man-pages/pod8/backup_scantape.pod | 2 +- doc/man-pages/pod8/backup_setexp.pod | 2 +- doc/man-pages/pod8/backup_status.pod | 2 +- doc/man-pages/pod8/backup_volinfo.pod | 2 +- doc/man-pages/pod8/backup_volrestore.pod | 2 +- doc/man-pages/pod8/backup_volsetrestore.pod | 2 +- doc/man-pages/pod8/bos_addhost.pod | 2 +- doc/man-pages/pod8/bos_addkey.pod | 2 +- doc/man-pages/pod8/bos_adduser.pod | 2 +- doc/man-pages/pod8/bos_apropos.pod | 2 +- doc/man-pages/pod8/bos_create.pod | 2 +- doc/man-pages/pod8/bos_delete.pod | 2 +- doc/man-pages/pod8/bos_exec.pod | 2 +- doc/man-pages/pod8/bos_getdate.pod | 2 +- doc/man-pages/pod8/bos_getlog.pod | 2 +- doc/man-pages/pod8/bos_getrestart.pod | 2 +- doc/man-pages/pod8/bos_help.pod | 2 +- doc/man-pages/pod8/bos_install.pod | 2 +- doc/man-pages/pod8/bos_listhosts.pod | 2 +- doc/man-pages/pod8/bos_listkeys.pod | 2 +- doc/man-pages/pod8/bos_listusers.pod | 2 +- doc/man-pages/pod8/bos_prune.pod | 2 +- doc/man-pages/pod8/bos_removehost.pod | 2 +- doc/man-pages/pod8/bos_removekey.pod | 2 +- doc/man-pages/pod8/bos_removeuser.pod | 2 +- doc/man-pages/pod8/bos_restart.pod | 2 +- doc/man-pages/pod8/bos_salvage.pod | 2 +- doc/man-pages/pod8/bos_setauth.pod | 2 +- doc/man-pages/pod8/bos_setcellname.pod | 2 +- doc/man-pages/pod8/bos_setrestart.pod | 2 +- doc/man-pages/pod8/bos_shutdown.pod | 2 +- doc/man-pages/pod8/bos_start.pod | 2 +- doc/man-pages/pod8/bos_startup.pod | 2 +- doc/man-pages/pod8/bos_status.pod | 2 +- doc/man-pages/pod8/bos_stop.pod | 2 +- doc/man-pages/pod8/bos_uninstall.pod | 2 +- doc/man-pages/pod8/fileserver.pod | 190 +- doc/man-pages/pod8/fstrace_apropos.pod | 2 +- doc/man-pages/pod8/fstrace_clear.pod | 2 +- doc/man-pages/pod8/fstrace_dump.pod | 2 +- doc/man-pages/pod8/fstrace_help.pod | 2 +- doc/man-pages/pod8/fstrace_lslog.pod | 2 +- doc/man-pages/pod8/fstrace_lsset.pod | 2 +- doc/man-pages/pod8/fstrace_setlog.pod | 2 +- doc/man-pages/pod8/fstrace_setset.pod | 2 +- doc/man-pages/pod8/kas_apropos.pod | 2 +- doc/man-pages/pod8/kas_create.pod | 2 +- doc/man-pages/pod8/kas_delete.pod | 2 +- doc/man-pages/pod8/kas_examine.pod | 2 +- doc/man-pages/pod8/kas_forgetticket.pod | 2 +- doc/man-pages/pod8/kas_help.pod | 2 +- doc/man-pages/pod8/kas_interactive.pod | 2 +- doc/man-pages/pod8/kas_list.pod | 2 +- doc/man-pages/pod8/kas_listtickets.pod | 2 +- doc/man-pages/pod8/kas_noauthentication.pod | 2 +- doc/man-pages/pod8/kas_quit.pod | 2 +- doc/man-pages/pod8/kas_setfields.pod | 2 +- doc/man-pages/pod8/kas_setpassword.pod | 2 +- doc/man-pages/pod8/kas_statistics.pod | 2 +- doc/man-pages/pod8/kas_stringtokey.pod | 2 +- doc/man-pages/pod8/kas_unlock.pod | 2 +- doc/man-pages/pod8/read_tape.pod | 106 + doc/man-pages/pod8/uss_add.pod | 2 +- doc/man-pages/pod8/uss_apropos.pod | 2 +- doc/man-pages/pod8/uss_bulk.pod | 2 +- doc/man-pages/pod8/uss_delete.pod | 2 +- doc/man-pages/pod8/uss_help.pod | 2 +- doc/txt/winnotes/afs-changes-since-1.2.txt | 210 + doc/txt/winnotes/afs-issues.txt | 2 +- src/NTMake9x | 332 -- src/NTMakefile | 15 +- src/TechNotes-WIN9X | 154 - src/WINNT/afs_setup_utils/afsrm.c | 4 +- src/WINNT/afsd/afsd.h | 2 +- src/WINNT/afsd/afsd_init.c | 52 +- src/WINNT/afsd/afsd_service.c | 2 + src/WINNT/afsd/afskfw.c | 81 +- src/WINNT/afsd/cklog.c | 9 +- src/WINNT/afsd/cm_aclent.c | 7 +- src/WINNT/afsd/cm_btree.c | 620 ++- src/WINNT/afsd/cm_btree.h | 36 +- src/WINNT/afsd/cm_buf.c | 48 +- src/WINNT/afsd/cm_buf.h | 4 +- src/WINNT/afsd/cm_callback.c | 67 +- src/WINNT/afsd/cm_callback.h | 3 + src/WINNT/afsd/cm_cell.c | 3 + src/WINNT/afsd/cm_conn.c | 19 +- src/WINNT/afsd/cm_daemon.c | 71 +- src/WINNT/afsd/cm_dcache.c | 22 +- src/WINNT/afsd/cm_dir.c | 185 +- src/WINNT/afsd/cm_dir.h | 10 +- src/WINNT/afsd/cm_freelance.c | 12 +- src/WINNT/afsd/cm_ioctl.c | 409 +- src/WINNT/afsd/cm_memmap.h | 2 +- src/WINNT/afsd/cm_scache.c | 157 +- src/WINNT/afsd/cm_scache.h | 21 +- src/WINNT/afsd/cm_server.c | 8 +- src/WINNT/afsd/cm_user.c | 21 +- src/WINNT/afsd/cm_utils.c | 7 +- src/WINNT/afsd/cm_vnodeops.c | 87 +- src/WINNT/afsd/cm_vnodeops.h | 2 + src/WINNT/afsd/cm_volstat.c | 27 +- src/WINNT/afsd/cm_volstat.h | 28 +- src/WINNT/afsd/cm_volume.c | 82 +- src/WINNT/afsd/cm_volume.h | 6 +- src/WINNT/afsd/cunlog.c | 7 +- src/WINNT/afsd/fs.c | 239 +- src/WINNT/afsd/lanahelper.cpp | 1 + src/WINNT/afsd/sample/token.c | 9 +- src/WINNT/afsd/smb.c | 124 +- src/WINNT/afsd/smb3.c | 240 +- src/WINNT/afsd/smb_ioctl.c | 2 +- src/WINNT/afsd/symlink.c | 26 +- src/WINNT/afsreg/test/regman.c | 32 +- src/WINNT/aklog/NTMakefile | 10 +- src/WINNT/aklog/aklog.c | 68 + src/WINNT/aklog/aklog.rc | 2 +- src/WINNT/aklog/asetkey.c | 47 + src/WINNT/client_osi/osibasel.h | 8 +- .../en_US/html/ReleaseNotes/logo.htm | 2 +- .../html/ReleaseNotes/relnotes-frames.htm | 2 +- .../en_US/html/ReleaseNotes/relnotes.htm | 1605 ++++---- .../en_US/html/ReleaseNotes/toc.htm | 785 ++-- .../Documentation/en_US/html/index.htm | 4 +- src/WINNT/eventlog/NTMakefile | 3 +- src/WINNT/eventlog/lang/NTMakefile | 1 + src/WINNT/eventlog/lang/de_DE/event.rc | 2 - src/WINNT/eventlog/lang/en_US/event.rc | 2 - src/WINNT/eventlog/lang/es_ES/event.rc | 2 - src/WINNT/eventlog/lang/ja_JP/event.rc | 2 - src/WINNT/eventlog/lang/ko_KR/event.rc | 2 - src/WINNT/eventlog/lang/pt_BR/event.rc | 2 - src/WINNT/eventlog/lang/zh_CN/event.rc | 2 - src/WINNT/eventlog/lang/zh_TW/event.rc | 2 - src/WINNT/install/InstallShield5/Build.tsb | 66 - .../install/InstallShield5/BuildSetup.bat | 37 - .../install/InstallShield5/CompileScript.bat | 37 - .../InstallShield5/CreateGeneratedFiles.bat | 20 - .../InstallShield5/CreateISDirTree.bat | 74 - src/WINNT/install/InstallShield5/Default.cdf | 2920 -------------- src/WINNT/install/InstallShield5/Default.fdf | 1102 ----- src/WINNT/install/InstallShield5/Default.fgl | 156 - .../install/InstallShield5/Default.shell | 154 - src/WINNT/install/InstallShield5/Default.shl | 454 --- src/WINNT/install/InstallShield5/Default.txt | 269 -- .../install/InstallShield5/DelISDirTree.bat | 162 - .../install/InstallShield5/GatherFiles.bat | 44 - .../install/InstallShield5/GenDefault.mda.bat | 66 - .../install/InstallShield5/GenFileGroups.bat | 1418 ------- .../install/InstallShield5/GenIS5.ipr.bat | 67 - .../InstallShield5/HowToSetTheVersion.txt | 30 - src/WINNT/install/InstallShield5/NTMakefile | 78 - .../install/InstallShield5/PackageWeb.pfw | 267 -- src/WINNT/install/InstallShield5/README.TXT | 94 - .../install/InstallShield5/ScatterFiles.bat | 47 - src/WINNT/install/InstallShield5/Setup.tsb | 131 - src/WINNT/install/InstallShield5/afsdcell.ini | 483 --- src/WINNT/install/InstallShield5/setup.rul | 3578 ----------------- src/WINNT/install/NSIS/CellServDB | 42 +- src/WINNT/install/wix/CellServDB | 42 +- src/WINNT/install/wix/config.wxi | 6 +- src/WINNT/install/wix/files.wxi | 56 +- src/WINNT/install/wix/property.wxi | 2 +- src/WINNT/install/wix/registry.wxi | 6 +- src/WINNT/netidmgr_plugin/afsfuncs.c | 3 +- src/afs/DARWIN/osi_file.c | 33 +- src/afs/DARWIN/osi_misc.c | 13 +- src/afs/DARWIN/osi_vnodeops.c | 53 +- src/afs/LINUX/osi_export.c | 4 + src/afs/LINUX/osi_machdep.h | 11 + src/afs/LINUX/osi_module.c | 8 - src/afs/LINUX/osi_nfssrv.c | 16 +- src/afs/LINUX/osi_sysctl.c | 28 + src/afs/LINUX/osi_vfsops.c | 21 + src/afs/LINUX/osi_vnodeops.c | 31 +- src/afs/Makefile.in | 2 +- src/afs/SOLARIS/osi_machdep.h | 19 + src/afs/SOLARIS/osi_vfsops.c | 21 +- src/afs/SOLARIS/osi_vnodeops.c | 54 +- src/afs/UKERNEL/afs_usrops.c | 30 +- src/afs/UKERNEL/osi_groups.c | 1 + src/afs/VNOPS/afs_vnop_create.c | 2 + src/afs/VNOPS/afs_vnop_dirops.c | 2 + src/afs/VNOPS/afs_vnop_link.c | 2 + src/afs/VNOPS/afs_vnop_read.c | 33 +- src/afs/VNOPS/afs_vnop_rename.c | 2 + src/afs/VNOPS/afs_vnop_symlink.c | 2 + src/afs/VNOPS/afs_vnop_write.c | 2 +- src/afs/afs.h | 8 +- src/afs/afs_call.c | 98 +- src/afs/afs_callback.c | 32 +- src/afs/afs_cell.c | 113 +- src/afs/afs_daemons.c | 11 +- src/afs/afs_dcache.c | 1 + src/afs/afs_init.c | 14 +- src/afs/afs_nfsclnt.c | 2 + src/afs/afs_osi_alloc.c | 6 +- src/afs/afs_osi_pag.c | 6 +- src/afs/afs_osidnlc.c | 7 +- src/afs/afs_pioctl.c | 5 +- src/afs/afs_prototypes.h | 9 + src/afs/afs_segments.c | 4 + src/afs/afs_server.c | 61 +- src/afs/afs_trace.et | 1 + src/afs/lock.h | 6 + src/afs/sysincludes.h | 3 + src/afsd/afsd.c | 40 +- src/afsd/vsys.c | 6 - src/afsmonitor/afsmon-output.c | 7 - src/afsmonitor/afsmon-win.c | 3 +- src/afsmonitor/afsmonitor.c | 5 +- src/afsweb/weblog.c | 8 +- src/aklog/Makefile.in | 10 +- src/aklog/aklog_main.c | 51 +- src/aklog/asetkey.c | 8 - src/auth/authcon.c | 24 +- src/auth/cellconfig.c | 33 +- src/auth/cellconfig.p.h | 13 +- src/auth/copyauth.c | 12 +- src/auth/ktc.c | 148 +- src/auth/setkey.c | 11 +- src/auth/test/testcellconf.c | 8 +- src/auth/userok.c | 46 +- src/auth/writeconfig.c | 24 +- src/bozo/Makefile.in | 8 +- src/bozo/bnode.c | 8 +- src/bozo/bos.c | 228 +- src/bozo/bos_util.c | 7 - src/bozo/bosoprocs.c | 9 +- src/bozo/bosprototypes.h | 16 + src/bozo/bosserver.c | 17 +- src/bozo/cronbnodeops.c | 7 +- src/bozo/ezbnodeops.c | 7 +- src/bozo/fsbnodeops.c | 8 +- src/bu_utils/fms.c | 13 +- src/bubasics/Makefile.in | 8 +- src/bucoord/bc.p.h | 7 +- src/bucoord/commands.c | 96 +- src/bucoord/dsstub.c | 2 + src/bucoord/dsvs.c | 2 + src/bucoord/dump.c | 1 + src/bucoord/dump_sched.c | 33 +- src/bucoord/main.c | 67 +- src/bucoord/regex.c | 4 + src/bucoord/restore.c | 3 +- src/bucoord/status.c | 6 + src/bucoord/tape_hosts.c | 18 +- src/bucoord/vol_sets.c | 38 +- src/budb/Makefile.in | 8 +- src/budb/database.c | 8 - src/budb/db_alloc.c | 6 - src/budb/db_dump.c | 9 +- src/budb/db_hash.c | 6 - src/budb/db_text.c | 8 +- src/budb/ol_verify.c | 6 - src/budb/procs.c | 7 - src/budb/server.c | 22 +- src/budb/struct_ops.c | 18 +- src/butc/dbentries.c | 2 + src/butc/dump.c | 1 + src/butc/lwps.c | 4 + src/butc/read_tape.c | 8 +- src/butc/recoverDb.c | 3 + src/butc/tcmain.c | 2 +- src/butc/tcprocs.c | 10 +- src/butc/tcstatus.c | 1 + src/butc/tcudbprocs.c | 7 +- src/butc/test.c | 55 +- src/butm/file_tm.c | 3 + src/cf/kerberos.m4 | 7 +- src/cf/linux-test1.m4 | 29 +- src/cf/linux-test4.m4 | 105 + src/cf/osconf.m4 | 23 +- src/cmd/cmd.c | 28 +- src/cmd/cmd.p.h | 16 +- src/cmd/test/ctest.c | 17 +- src/cmd/test/dtest.c | 11 +- src/cmd/test/itest.c | 23 +- src/comerr/error_table_nt.c | 2670 ++++++------ src/comerr/error_table_nt.h | 34 +- src/comerr/et_lex.lex_nt.c | 3260 +++++++-------- src/config/Makefile.config.in | 5 +- src/config/NTMakefile.amd64_w2k | 2 +- src/config/NTMakefile.i386_nt40 | 2 +- src/config/NTMakefile.i386_w2k | 2 +- src/config/afs_args.h | 14 + src/config/mc.c | 2 - src/config/param.amd64_nbsd30.h | 21 + src/config/param.amd64_nbsd40.h | 21 + src/config/param.nbsd30.h | 1 + src/config/param.nbsd40.h | 160 + src/config/param.ppc_darwin_90.h | 1 + src/config/param.x86_darwin_90.h | 1 + src/des/NTMakefile | 1 + src/dir/dir.c | 10 +- src/dir/salvage.c | 6 - src/fsint/Makefile.in | 42 +- src/fsprobe/fsprobe.c | 6 - src/fsprobe/fsprobe_test.c | 7 - src/gtx/curseswindows.c | 7 - src/gtx/frame.c | 7 +- src/gtx/gtxtest.c | 8 +- src/gtx/input.c | 1 + src/gtx/keymap.c | 7 - src/gtx/lightobject.c | 8 - src/gtx/object_test.c | 7 +- src/gtx/objects.c | 7 - src/gtx/screen_test.c | 7 +- src/gtx/textcb.c | 7 - src/gtx/textobject.c | 11 +- src/kauth/Makefile.in | 48 +- src/kauth/admin_tools.c | 79 +- src/kauth/authclient.c | 12 +- src/kauth/client.c | 6 - src/kauth/ka-forwarder.c | 6 +- src/kauth/kaauxdb.c | 6 - src/kauth/kadatabase.c | 8 +- src/kauth/kalocalcell.c | 6 - src/kauth/kalog.c | 6 - src/kauth/kas.c | 6 - src/kauth/kaserver.c | 6 - src/kauth/kautils.c | 6 - src/kauth/kdb.c | 8 +- src/kauth/kkids.c | 1 + src/kauth/klog.c | 13 +- src/kauth/knfs.c | 17 +- src/kauth/kpasswd.c | 12 +- src/kauth/kpwvalid.c | 7 +- src/kauth/krb_tf.c | 6 - src/kauth/krb_udp.c | 8 +- src/kauth/manyklog.c | 9 +- src/kauth/read_passwd.c | 7 - src/kauth/rebuild.c | 13 +- src/kauth/test/multiklog.c | 9 +- src/kauth/test/test_getticket.c | 10 +- src/kauth/test/test_rxkad_free.c | 10 +- src/kauth/token.c | 6 - src/kauth/user.c | 6 - src/libacl/aclprocs.c | 2 - src/libadmin/adminutil/afs_AdminInternal.h | 6 + src/libadmin/bos/afs_bosAdmin.c | 7 - src/libadmin/cfg/cfgclient.c | 10 +- src/libadmin/cfg/cfginternal.c | 4 +- src/libadmin/cfg/test/cfgtest.c | 56 +- src/libadmin/client/afs_clientAdmin.c | 262 +- src/libadmin/kas/afs_kasAdmin.c | 7 - src/libadmin/pts/afs_ptsAdmin.c | 9 - src/libadmin/samples/rxdebug_conns.c | 2 +- src/libadmin/samples/rxdebug_rx_stats.c | 8 - src/libadmin/samples/rxstat_get_peer.c | 6 - src/libadmin/samples/rxstat_get_process.c | 7 - src/libadmin/test/afscp.c | 4 +- src/libadmin/test/bos.c | 144 +- src/libadmin/test/client.c | 56 +- src/libadmin/test/kas.c | 44 +- src/libadmin/test/pts.c | 80 +- src/libadmin/test/util.c | 12 +- src/libadmin/test/util.h | 6 +- src/libadmin/test/vos.c | 140 +- src/libadmin/vos/afs_vosAdmin.c | 6 - src/libadmin/vos/lockprocs.c | 6 - src/libadmin/vos/vosutils.c | 6 - src/libadmin/vos/vsprocs.c | 6 - src/libafs/MakefileProto.DARWIN.in | 28 +- src/libafs/afs.ppc_darwin_12.plist.in | 4 +- src/libafs/afs.ppc_darwin_13.plist.in | 4 +- src/libafs/afs.ppc_darwin_14.plist.in | 4 +- src/libafs/afs.ppc_darwin_60.plist.in | 4 +- src/libafs/afs.ppc_darwin_70.plist.in | 4 +- src/libafs/afs.ppc_darwin_80.plist.in | 4 +- src/libafs/afs.ppc_darwin_90.plist.in | 4 +- src/libafs/afs.x86_darwin_80.plist.in | 4 +- src/libafs/afs.x86_darwin_90.plist.in | 4 +- src/libafsrpc/Makefile.in | 8 +- src/libuafs/nsafslib.exp | 0 src/log/Makefile.in | 8 +- src/log/kseal.c | 6 - src/log/tokens.c | 7 +- src/log/unlog.c | 13 +- src/lwp/Makefile.in | 14 +- src/lwp/lwp.c | 8 +- src/lwp/threadname.c | 7 +- src/lwp/waitkey.c | 6 - src/package/tags | 61 - ...enAFS.Info.plist => OpenAFS.Info.plist.in} | 6 +- .../MacOS/{OpenAFS.info => OpenAFS.info.in} | 4 +- src/packaging/MacOS/OpenAFS.post_install | 12 +- src/packaging/MacOS/OpenAFS.pre_upgrade | 3 - .../MacOS/{ReadMe.rtf => ReadMe.rtf.8} | 2 +- src/packaging/MacOS/ReadMe.rtf.9 | 13 + .../MacOS/{buildpkg.sh => buildpkg.sh.in} | 44 +- src/packaging/RedHat/.cvsignore | 1 + src/packaging/RedHat/RPM-build-notes | 35 + .../RedHat/afs-krb5-2.0-com_err.patch | 24 - .../RedHat/afs-krb5-2.0-krb524.patch | 31 - .../RedHat/afs-krb5-2.0-libsocket.patch | 39 - .../RedHat/afs-krb5-2.0-openafs1.3.patch | 12 - .../RedHat/afs-krb5-2.0-res_search.patch | 14 - src/packaging/RedHat/kmodtool | 172 + .../RedHat/openafs-1.4.0-kmodule26.patch | 17 + src/packaging/RedHat/openafs-buildall.sh | 7 + src/packaging/RedHat/openafs-buildfedora.pl | 49 + src/packaging/RedHat/openafs-client.init | 5 - src/packaging/RedHat/openafs-krb5-2.0.tar.gz | Bin 1042351 -> 0 bytes src/packaging/RedHat/openafs.spec.in | 289 +- src/pam/afs_pam_msg.c | 6 - src/pam/afs_util.c | 14 - src/platform/DARWIN/Makefile.in | 4 +- src/ptserver/Makefile.in | 14 +- src/ptserver/db_verify.c | 8 +- src/ptserver/display.c | 6 - src/ptserver/pt_util.c | 6 +- src/ptserver/ptprocs.c | 6 - src/ptserver/pts.c | 76 +- src/ptserver/ptserver.c | 6 - src/ptserver/ptuser.c | 6 - src/ptserver/ptutils.c | 6 - src/ptserver/readgroup.c | 7 +- src/ptserver/readpwd.c | 7 +- src/ptserver/testpt.c | 22 +- src/ptserver/ubik.c | 7 - src/ptserver/utils.c | 6 - src/rx/SOLARIS/rx_knet.c | 286 +- src/rx/rx.c | 8 +- src/rx/rx.h | 1 + src/rx/rx_kcommon.h | 4 + src/rx/rx_misc.c | 6 - src/rx/rx_packet.c | 6 - src/rx/rx_prototypes.h | 6 +- src/rx/rx_pthread.c | 1 + src/rx/rx_rdwr.c | 6 - src/rx/rx_trace.c | 7 +- src/rx/rx_user.c | 8 +- src/rx/test/generator.c | 8 +- src/rx/xdr.c | 1 + src/rx/xdr_array.c | 1 + src/rx/xdr_rec.c | 6 - src/rx/xdr_refernce.c | 1 + src/rxdebug/rxdebug.c | 12 +- src/rxgen/Makefile.in | 3 + src/rxgen/rpc_cout.c | 6 - src/rxgen/rpc_main.c | 20 +- src/rxgen/rpc_parse.c | 76 +- src/rxgen/rpc_scan.c | 7 +- src/rxgen/rpc_svcout.c | 6 - src/rxgen/rpc_util.c | 6 - src/rxgen/rpc_util.h | 1 + src/rxkad/crc.c | 6 - src/rxkad/domestic/crypt_conn.c | 1 + src/rxkad/domestic/fcrypt.c | 1 + src/rxkad/md4.c | 6 - src/rxkad/md5.c | 7 - src/rxkad/rxkad_client.c | 6 - src/rxkad/rxkad_common.c | 8 +- src/rxkad/rxkad_server.c | 6 - src/rxkad/test/stress.c | 6 +- src/rxkad/ticket.c | 6 - src/rxkad/ticket5.c | 6 - src/rxstat/Makefile.in | 8 +- src/scout/scout.c | 14 +- src/shlibafsauthent/afsauthent.exp | 0 src/shlibafsauthent/mapfile | 0 src/shlibafsrpc/Makefile.in | 4 +- src/shlibafsrpc/afsrpc.exp | 0 src/shlibafsrpc/mapfile | 0 src/shlibafsrpc/mapfile.afs_xdr | 0 src/sys/Makefile.in | 30 +- src/sys/pagsh.c | 3 +- src/sys/pioctl_nt.c | 2 + src/sys/rmtsysc.c | 6 +- src/sys/rmtsysd.c | 1 + src/sys/rmtsysnet.c | 12 +- src/sys/rmtsyss.c | 3 +- src/tbutc/NTMakefile | 9 +- src/tbutc/butc.rc | 17 + src/tsalvaged/Makefile.in | 8 +- src/tsalvaged/salvsync-debug.c | 36 +- src/tsm41/aix_aklog.c | 5 +- src/tviced/NTMakefile | 10 +- src/tviced/serialize_state.c | 8 +- src/tviced/state_analyzer.c | 7 - src/ubik/Makefile.in | 22 +- src/ubik/beacon.c | 7 +- src/ubik/disk.c | 6 - src/ubik/phys.c | 6 - src/ubik/recovery.c | 6 - src/ubik/remote.c | 6 - src/ubik/ubik.c | 6 - src/ubik/ubikcmd.c | 6 - src/ubik/udebug.c | 10 +- src/ubik/uinit.c | 6 - src/ubik/utst_client.c | 6 - src/ubik/utst_server.c | 6 - src/ubik/vote.c | 6 - src/update/Makefile.in | 8 +- src/update/client.c | 6 - src/update/server.c | 6 - src/update/utils.c | 6 - src/usd/usd_file.c | 6 - src/uss/grammar.y | 8 +- src/uss/lex.l | 7 +- src/uss/uss.c | 48 +- src/uss/uss_acl.c | 6 - src/uss/uss_common.c | 7 - src/uss/uss_common.h | 6 - src/uss/uss_fs.c | 8 +- src/uss/uss_kauth.c | 6 - src/uss/uss_procs.c | 6 - src/uss/uss_vol.c | 6 - src/util/afsutil.h | 2 +- src/util/afsutil_prototypes.h | 2 +- src/util/assert.c | 8 +- src/util/casestrcpy.c | 6 - src/util/fileutil.c | 8 +- src/util/get_krbrlm.c | 2 +- src/util/hostparse.c | 6 - src/util/kreltime.c | 6 - src/util/ktime.c | 6 - src/util/netutils.c | 9 +- src/util/serverLog.c | 13 +- src/util/snprintf.c | 8 +- src/util/softsig.c | 1 + src/util/sys.c | 2 +- src/util/uuid.c | 8 +- src/util/volparse.c | 6 - src/venus/Makefile.in | 52 +- src/venus/cacheout.c | 21 +- src/venus/cmdebug.c | 36 +- src/venus/dedebug.c | 7 +- src/venus/fs.c | 249 +- src/venus/fstrace.c | 57 +- src/venus/kdump.c | 11 +- src/venus/livesys.c | 6 - src/venus/test/fulltest.c | 82 +- src/venus/test/getinitparams.c | 2 +- src/venus/test/idtest.c | 1 + src/venus/test/owntest.c | 1 + src/venus/twiddle.c | 10 +- src/venus/up.c | 7 +- src/venus/whatfid.c | 5 +- src/vfsck/dirutils.c | 1 + src/vfsck/setup.c | 1 + src/vfsck/utilities.c | 1 + src/viced/afsfileprocs.c | 9 +- src/viced/callback.c | 73 +- src/viced/check_sysid.c | 1 + src/viced/fsprobe.c | 9 +- src/viced/host.c | 21 +- src/viced/physio.c | 8 +- src/viced/viced.c | 25 +- src/vlserver/Makefile.in | 12 +- src/vlserver/cnvldb.c | 21 +- src/vlserver/sascnvldb.c | 7 +- src/vlserver/vlclient.c | 14 +- src/vlserver/vldb_check.c | 19 +- src/vlserver/vlprocs.c | 28 +- src/vlserver/vlserver.c | 11 +- src/vlserver/vlutils.c | 9 +- src/vol/Makefile.in | 24 +- src/vol/clone.c | 6 - src/vol/daemon_com.c | 84 +- src/vol/daemon_com.h | 5 +- src/vol/devname.c | 11 +- src/vol/fssync-client.c | 17 +- src/vol/fssync-debug.c | 66 +- src/vol/fssync-server.c | 90 +- src/vol/ihandle.c | 24 +- src/vol/listinodes.c | 550 ++- src/vol/namei_ops.c | 90 +- src/vol/partition.c | 11 +- src/vol/physio.c | 6 - src/vol/purge.c | 6 - src/vol/salvaged.c | 25 +- src/vol/salvager.c | 5 +- src/vol/salvsync-client.c | 65 +- src/vol/salvsync-server.c | 363 +- src/vol/salvsync.h | 105 +- src/vol/vnode.c | 6 - src/vol/vol-bless.c | 4 +- src/vol/vol-info.c | 4 +- src/vol/vol-salvage.c | 72 +- src/vol/vol-salvage.h | 5 +- src/vol/voldefs.h | 2 + src/vol/volume.c | 10 +- src/volser/Makefile.in | 8 +- src/volser/dumpstuff.c | 8 +- src/volser/lockprocs.c | 12 +- src/volser/physio.c | 6 - src/volser/restorevol.c | 14 +- src/volser/vol-dump.c | 4 +- src/volser/volmain.c | 9 +- src/volser/volprocs.c | 170 +- src/volser/voltrans.c | 9 +- src/volser/vos.c | 291 +- src/volser/vsprocs.c | 11 +- src/volser/vsutils.c | 9 +- src/xstat/xstat_cm.c | 7 - src/xstat/xstat_cm_test.c | 13 +- src/xstat/xstat_fs.c | 7 - src/xstat/xstat_fs_callback.c | 7 - src/xstat/xstat_fs_test.c | 6 - 739 files changed, 12990 insertions(+), 22017 deletions(-) delete mode 100644 README-WIN9X create mode 100644 doc/man-pages/pod1/fs_rxstatpeer.pod create mode 100644 doc/man-pages/pod1/fs_uuid.pod create mode 100644 doc/man-pages/pod1/symlink.pod create mode 100644 doc/man-pages/pod1/symlink_list.pod create mode 100644 doc/man-pages/pod1/symlink_make.pod create mode 100644 doc/man-pages/pod1/symlink_remove.pod create mode 100644 doc/man-pages/pod1/vos_convertROtoRW.pod create mode 100644 doc/man-pages/pod1/vos_copy.pod create mode 100644 doc/man-pages/pod8/read_tape.pod delete mode 100644 src/NTMake9x delete mode 100644 src/TechNotes-WIN9X delete mode 100644 src/WINNT/eventlog/lang/de_DE/event.rc delete mode 100644 src/WINNT/eventlog/lang/en_US/event.rc delete mode 100644 src/WINNT/eventlog/lang/es_ES/event.rc delete mode 100644 src/WINNT/eventlog/lang/ja_JP/event.rc delete mode 100644 src/WINNT/eventlog/lang/ko_KR/event.rc delete mode 100644 src/WINNT/eventlog/lang/pt_BR/event.rc delete mode 100644 src/WINNT/eventlog/lang/zh_CN/event.rc delete mode 100644 src/WINNT/eventlog/lang/zh_TW/event.rc delete mode 100644 src/WINNT/install/InstallShield5/Build.tsb delete mode 100644 src/WINNT/install/InstallShield5/BuildSetup.bat delete mode 100644 src/WINNT/install/InstallShield5/CompileScript.bat delete mode 100644 src/WINNT/install/InstallShield5/CreateGeneratedFiles.bat delete mode 100644 src/WINNT/install/InstallShield5/CreateISDirTree.bat delete mode 100644 src/WINNT/install/InstallShield5/Default.cdf delete mode 100644 src/WINNT/install/InstallShield5/Default.fdf delete mode 100644 src/WINNT/install/InstallShield5/Default.fgl delete mode 100644 src/WINNT/install/InstallShield5/Default.shell delete mode 100644 src/WINNT/install/InstallShield5/Default.shl delete mode 100644 src/WINNT/install/InstallShield5/Default.txt delete mode 100644 src/WINNT/install/InstallShield5/DelISDirTree.bat delete mode 100644 src/WINNT/install/InstallShield5/GatherFiles.bat delete mode 100644 src/WINNT/install/InstallShield5/GenDefault.mda.bat delete mode 100644 src/WINNT/install/InstallShield5/GenFileGroups.bat delete mode 100644 src/WINNT/install/InstallShield5/GenIS5.ipr.bat delete mode 100755 src/WINNT/install/InstallShield5/HowToSetTheVersion.txt delete mode 100644 src/WINNT/install/InstallShield5/NTMakefile delete mode 100644 src/WINNT/install/InstallShield5/PackageWeb.pfw delete mode 100755 src/WINNT/install/InstallShield5/README.TXT delete mode 100644 src/WINNT/install/InstallShield5/ScatterFiles.bat delete mode 100644 src/WINNT/install/InstallShield5/Setup.tsb delete mode 100644 src/WINNT/install/InstallShield5/afsdcell.ini delete mode 100644 src/WINNT/install/InstallShield5/setup.rul create mode 100644 src/bozo/bosprototypes.h create mode 100644 src/config/param.amd64_nbsd30.h create mode 100644 src/config/param.amd64_nbsd40.h create mode 100644 src/config/param.nbsd40.h delete mode 100644 src/libuafs/nsafslib.exp delete mode 100644 src/package/tags rename src/packaging/MacOS/{OpenAFS.Info.plist => OpenAFS.Info.plist.in} (91%) rename src/packaging/MacOS/{OpenAFS.info => OpenAFS.info.in} (90%) rename src/packaging/MacOS/{ReadMe.rtf => ReadMe.rtf.8} (98%) create mode 100644 src/packaging/MacOS/ReadMe.rtf.9 rename src/packaging/MacOS/{buildpkg.sh => buildpkg.sh.in} (84%) create mode 100644 src/packaging/RedHat/.cvsignore create mode 100644 src/packaging/RedHat/RPM-build-notes delete mode 100644 src/packaging/RedHat/afs-krb5-2.0-com_err.patch delete mode 100644 src/packaging/RedHat/afs-krb5-2.0-krb524.patch delete mode 100644 src/packaging/RedHat/afs-krb5-2.0-libsocket.patch delete mode 100644 src/packaging/RedHat/afs-krb5-2.0-openafs1.3.patch delete mode 100644 src/packaging/RedHat/afs-krb5-2.0-res_search.patch create mode 100644 src/packaging/RedHat/kmodtool create mode 100644 src/packaging/RedHat/openafs-1.4.0-kmodule26.patch create mode 100755 src/packaging/RedHat/openafs-buildfedora.pl delete mode 100644 src/packaging/RedHat/openafs-krb5-2.0.tar.gz delete mode 100644 src/shlibafsauthent/afsauthent.exp delete mode 100644 src/shlibafsauthent/mapfile delete mode 100644 src/shlibafsrpc/afsrpc.exp delete mode 100644 src/shlibafsrpc/mapfile delete mode 100644 src/shlibafsrpc/mapfile.afs_xdr create mode 100644 src/tbutc/butc.rc diff --git a/Makefile.in b/Makefile.in index d705b82e48..c782499152 100644 --- a/Makefile.in +++ b/Makefile.in @@ -443,7 +443,7 @@ volser_depinstall: pinstall rxgen comerr ${COMPILE_PART1} volser ${COMPILE_DEPINSTALL} ${DEST}/bin/dedebug: dedebug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ # @@ -722,6 +722,7 @@ clean2: -${COMPILE_PART1} libafsauthent ${COMPILE_CLEAN} -${COMPILE_PART1} shlibafsrpc ${COMPILE_CLEAN} -${COMPILE_PART1} shlibafsauthent ${COMPILE_CLEAN} + -${COMPILE_PART1} platform ${COMPILE_CLEAN} -${COMPILE_PART1} libadmin ${COMPILE_CLEAN} -${COMPILE_PART1} libadmin/adminutil ${COMPILE_CLEAN} -${COMPILE_PART1} libadmin/client ${COMPILE_CLEAN} diff --git a/README b/README index a5cc1f12bf..0d3c04e43c 100644 --- a/README +++ b/README @@ -71,6 +71,30 @@ A. Creating the proper directory structure. or insecure software included with OpenAFS. See README.OBSOLETE and README.SECURITY for more details. + There is an option to control whether or not binaries are stripped + of their symbol table information. All binaries, except for the + 'fileserver' and 'volserver' executables, are stripped by default. + + To prevent stripping, specify the '--disable-strip-binaries' option on + the ./configure command line. + + This option works alongside the existing --enable-debug option to + control how binaries are produced. When --enable-debug is specified, + binaries will not be stripped. This behavior can be modified by + using different combinations of --enable-debug and --enable (or + --disable)-strip-binaries. One can, for example, compile binaries for + debug and strip them anyway. Alternatively, one can compile without + debug and force the binaries to not be stripped. Note that these + combinations are not necessarily useful. + + If neither of these options is specified, the default will be to build + non-debug binaries that are stripped (with the exceptions noted above, + which are never stripped at present). Specifying --enable-debug also + turns on --disable-strip-binaries. These are the most useful settings. + + The two binaries noted above, 'fileserver' and 'volserver' will never + be stripped, regardless of any options given to configure. + There are two modes for directory path handling: "Transarc mode" and "default mode": - In Transarc mode, we retain compatibility with Transarc/IBM AFS tools by putting client configuaration files in /usr/vice/etc, and server diff --git a/README-NT b/README-NT index c2faf8411f..978e2467bf 100644 --- a/README-NT +++ b/README-NT @@ -53,7 +53,7 @@ The following steps describe how to configure Windows 2000/XP: F. Build the binaries G. Install NSIS 2.30 H. Build NSIS Install Package - I. Install Wix 2.0.4310 + I. Install Wix 2.0.5325 J. Build Wix MSI Install Package K. Final Results L. Optional Items @@ -97,8 +97,8 @@ version is supported: The WiX installer requires about 18 MB of storage. The following version is supported: - Wix 2.0.4310.0 - http://prdownloads.sourceforge.net/wix/sources-2.0.4310.0.zip + Wix 2.0.5325.0 + http://prdownloads.sourceforge.net/wix/sources-2.0.5325.0.zip The InstallShield scripts (although not supported) require version 5.5 of InstallShiled. Version 6.0 or higher of InstallShield are not @@ -352,119 +352,9 @@ From the %AFSROOT% directory execute: STEP I. Install Wix MSI Installer -Download the Wix 2.0.2217.0 installer from +Download the Wix 2.0.5325.0 installer from - http://prdownloads.sourceforge.net/wix/sources-2.0.2217.0.zip - -Apply the following patches to the source tree and execute - - make ship - -from the \src\wix directory. - -Index: src/wix/Common.cs -=================================================================== -RCS file: /cvsroot/wix/wix/src/wix/Common.cs,v -retrieving revision 1.7 -diff -w -r1.7 Common.cs -140a141,146 -> public static long GetFileTimeFromDateTime(string dateTime) -> { -> System.DateTime sdt = System.Xml.XmlConvert.ToDateTime(dateTime); -> return sdt.ToFileTime(); -> } -> -Index: src/wix/Compiler.cs -=================================================================== -RCS file: /cvsroot/wix/wix/src/wix/Compiler.cs,v -retrieving revision 1.14 -diff -w -r1.14 Compiler.cs -847c847 -< this.AddRegistryKey(sourceLineNumbers, null, MsiInterop.MsidbRegistryRootClassesRoot, String.Concat("CLSID\\", classId, "\\", context[i]), String.Empty, String.Concat("\"[!", fileServer, "]", argument == null ? String.Empty : " ", argument, "\""), componentId); // ClassId context ---- -> this.AddRegistryKey(sourceLineNumbers, null, MsiInterop.MsidbRegistryRootClassesRoot, String.Concat("CLSID\\", classId, "\\", context[i]), String.Empty, String.Concat("\"[#", fileServer, "]", argument == null ? String.Empty : " ", argument, "\""), componentId); // ClassId context -2352a2353,2358 -> // if a Value attribute was given by itself, make this a type 19 custom action -> if( sourceBits == 0 && targetBits == MsiInterop.MsidbCustomActionTypeTextData ) -> { -> sourceBits = MsiInterop.MsidbCustomActionTypeSourceFile; -> } -> -3881c3887 -< minDate = attrib.Value; ---- -> minDate = Common.GetFileTimeFromDateTime( attrib.Value ).ToString(); -3884c3890 -< maxDate = attrib.Value; ---- -> maxDate = Common.GetFileTimeFromDateTime( attrib.Value ).ToString(); -8187a8194,8207 -> case "Delete": -> switch (attrib.Value) -> { -> case "install": -> events |= MsiInterop.MsidbServiceControlEventDelete; -> break; -> case "uninstall": -> events |= MsiInterop.MsidbServiceControlEventUninstallDelete; -> break; -> case "both": -> events |= MsiInterop.MsidbServiceControlEventDelete | MsiInterop.MsidbServiceControlEventUninstallDelete; -> break; -> } -> break; -9685a9706 -> -Index: src/wix/Preprocessor.cs -=================================================================== -RCS file: /cvsroot/wix/wix/src/wix/Preprocessor.cs,v -retrieving revision 1.6 -diff -w -r1.6 Preprocessor.cs -274c274 -< context = new IfContext(context.IsTrue & context.Active, this.variables.ContainsKey(reader.Value.Trim()), IfState.If); ---- -> context = new IfContext(context.IsTrue & context.Active, this.IsDefined(reader.Value.Trim()), IfState.If); -279c279 -< context = new IfContext(context.IsTrue & context.Active, !this.variables.ContainsKey(reader.Value.Trim()), IfState.If); ---- -> context = new IfContext(context.IsTrue & context.Active, !this.IsDefined(reader.Value.Trim()), IfState.If); -360a361,362 -> case "error": -> throw new WixPreprocessorException(this.GetCurrentSourceLineNumbers(), this.PreprocessVariables(reader.Value)); -419a422,437 -> /// Returns true if the symbol exists. -> /// -> /// symbol name to check -> /// true if symbol is defined -> private bool IsDefined(string symbol) -> { -> if( symbol.StartsWith("env.") ) -> return Environment.GetEnvironmentVariable(symbol.Substring(4)) != null; -> if( symbol.StartsWith("var.") ) -> return this.variables.ContainsKey(symbol.Substring(4)); -> if( symbol.StartsWith("sys.") ) -> return this.systemVariables.ContainsKey(symbol.Substring(4)); -> return this.variables.ContainsKey(symbol); -> } -> -> /// -Index: src/wix/wix.csproj -=================================================================== -RCS file: /cvsroot/wix/wix/src/wix/wix.csproj,v -retrieving revision 1.4 -diff -w -r1.4 wix.csproj -661a662,666 -> RelPath = "Xsd\wix.xsx" -> DependentUpon = "wix.xsd" -> BuildAction = "None" -> /> -> RelPath = "Xsd\wixloc.xsx" -> DependentUpon = "wixloc.xsd" -> BuildAction = "None" -> /> + http://prdownloads.sourceforge.net/wix/sources-2.0.5325.0.zip STEP J. Build Wix MSI install package diff --git a/README-WIN9X b/README-WIN9X deleted file mode 100644 index a1a28debb0..0000000000 --- a/README-WIN9X +++ /dev/null @@ -1,200 +0,0 @@ -Copyright 2000, International Business Machines Corporation and others. -All Rights Reserved. - -This software has been released under the terms of the IBM Public -License. For details, see the LICENSE file in the top-level source -directory or online at http://www.openafs.org/dl/license10.html - -NOTE: As of the OpenAFS 1.3 release series, Windows 9x platforms are no -longer officially supported. It is not clear whether or not the source -tree will build successfully or not. As far as we know, no one has tried -in a very long time. - -Building Open AFS on Win 95 ---------------------------- - -The Windows 95 Open AFS client consists of two main components: the client -program afsd.exe, which is compiled with the DJGPP compiler and runs in a -DOS virtual machine; and the utility programs, which are built on Windows -NT or 9x using the Microsoft Visual C++ compiler V6.0. - -afsd.exe --------- - -afsd.exe is built using the DJGPP cross-compiler, executed from Linux. -It should also be possible to build it using the native DOS DJGPP compiler, -but we did not try this. You will need to install the following packages -from DJGPP and the Coda project. - -ftp://ftp.coda.cs.cmu.edu/pub/tools/djgpp-2.01_0.93_glibc-1.i386.rpm -ftp://ftp.coda.cs.cmu.edu/pub/tools/djgpp-win95ext-2.01_0.93_glibc-1.i386.rpm -ftp://ftp.coda.cs.cmu.edu/pub/tools/gdb-djgpp-4.16-2.i386.rpm - -You will also need the MMAP.VXD and SOCK.VXD from the Coda project. Source -is available here: -ftp://ftp.coda.cs.cmu.edu/pub/coda/src/win95-coda-5.2.0.zip - -Follow the Coda instructions to build these VXD's, which you can read here: -http://www.coda.cs.cmu.edu/doc/html/coda-howto-6.html#ss6.4 - -Once you have the necessary tools installed, set the following environment -variables: -SYS_NAME: set to i386_djgpp -LINUX_SYS: set to the sysname of the Linux version you are using, e.g., - i386_linux22 - -The makefile expects to build into a platform directory with symlinks -into the source directory. The Perl script "mkdest.pl" in this dir. will -set this up for you. To use it, create a directory under the top-level -dir. (the directory above src) called "i386_djgpp". Then cd to that -directory and type "../src/mkdest.pl " - -Then execute "make -f Makefile.djgpp" from the top-level directory. -(You can create a symlink to src/Makefile.djgpp from this dir.) -The afsd.exe will be built into i386_djgpp/dest/bin. - -Build notes: - - The Makefile.djgpp actually builds Linux versions of the utilities - rxgen, install, compile_et, and util.a. It uses the Linux version - of param.h which it copies to the afs subdirectory of the above - components. You will need to set SYS_NAME to your Linux system name - manually if you want to build these utilities separately. - -Utilities and GUI programs --------------------------- - -The rest of the support programs are built as Win32 executables from a -Windows 9x or NT system. You will need to set the following environment -variables: - -set SYS_NAME=i386_win95 -set AFSDEV_BUILDTYPE=CHECKED (or FREE if you want to skip debugging info.) -set AFSDEV_INCLUDE= -set AFSDEV_LIB= -set AFSDEV_BIN=. -set AFSROOT= - e.g. AFSROOT\SRC is source directory of the build tree -SET _WIN32_IE=0x400 -set OBJ=src or obj, see below -set MSSDK=, see below - -If you are building on a Unix directory exported to Windows through Samba -or AFS, you can create a platform directory named "i386_win95" using the -"mkdest.pl" script as described above (run from a Unix system). This will -only work on a file system that supports symbolic links. If you are using -a platform directory, set the OBJ environment var. to "obj" and create -a symlink "obj" in the top-level dir. that points to "i386_win95/obj". -Otherwise, set OBJ to "src" to build the objects with the sources. - -The environment variable AFSROOT points to the parent of the AFS src -directory. Executables will be built by default in AFSROOT\dest. - -Copy the file src\NTMake9x to the parent of the src directory. You only -need to do this once. If you are building on a local drive, copy -AFSROOT\src\symlink.bat to AFSROOT\. - -Follow the NT build instructions in file "README-NT" to perform the build. -You will be using "NTMake9x" as the top-level makefile, instead of -"NTMakefile". Most of the instructions in "README-NT" apply to the Win9x -build as well. - -Build Notes: - -1) If you are building the Windows 9x AFS Client Control Panel - (win9xpanel), it requires shlwapi.h. This file can be found in the - header files associated with the Windows SDK (95/98 NT or W2000). - -2) You can build the Windows 9x client from a Windows NT or W2000 system. - This requires you to edit AFSROOT\config\NTMakefile.i386_win95. - Change line: DEL = $(AFSROOT)\src\rmbat - to: DEL = -del /q /f - -3) If you build the W2000 client, then switch to building the Windows 95 - client (or vice versa), you should clean the previous build by either: - nmake -f ntmakefile clean -or nmake -f ntmake9x clean - -4) When building the "comerr" component, the makefile now uses the - existing error_table_nt.c file (and touches it so it will be up to date - by default.) If you make changes to the lex or yacc source files and want - to rebuild error_table_nt.c, you can simply delete it and rerun make, - which will cause the file to be built using lex and yacc. Make sure - you have these utilities on your system. - -5) Required DLL's for redistribution - - The AFS Control Panel for Win95/98 requires Microsoft DLL's that can - be installed using: - VC6RedistSetup_enu.exe - This is located at: - http://support.microsoft.com/support/kb/articles/Q259/4/03.ASP - Two Microsoft DLL's must be included at DEST\WinInstall\Config\. - SHLWAPI.DLL - WININET.DLL - These DLL's will not be left on the target machine, there are only - used for installation and removed after installation is complete. - -6) Required changes to configuration file .\src\config\NTMakefile.i386_win95 - -AFSPRODUCT_VERSION - Product version -CELLNAME_DEFAULT - The default AFS cell name -CELLSERVDB_INSTALL - The default name for the CellServDB included in the install script -CELLSERVDB_WEB - The default web address to obtain CellServDB - -For Example: - - .\src\config\NTMakefile.i386_win95 - AFSPRODUCT_VERSION=1.1.1a - CELLNAME_DEFAULT=openafs.org - CELLSERVDB_INSTALL=CellServDB.GrandCentral - CELLSERVDB_WEB=http://grand.central.org/dl/cellservdb/CellServDB - -Version level may be specified in different formats, for example the following -forms all have the same version level; however will be displayed differently: - -AFSPRODUCT_VERSION=1.1.1a -AFSPRODUCT_VERSION=1.1.1 a -AFSPRODUCT_VERSION=1.1.1.1 -AFSPRODUCT_VERSION=1.1.101 - -6) Installation - - First, execute "nmake /f ntmake9x media" to copy all the client - executables and other files to DEST\WinInstall. - - You can then install the client onto a target Windows 9x machine by - executing: - install.bat - For example, - install.bat DEST\WinInstall\ c: \afscli almaden.ibm.com 40000 - - If you do not wish to use the batch file, you can install the client - manually by performing the following steps. - - 1. On the target machine, copy all the files from DEST\WinInstall to the - install location (usually c:\afscli). - 2. Add entries to the target's AUTOEXEC.BAT file as follows: - set AFSCONF=c:\afscli (replace with your install dir.) - path %path%;c:\afscli - 3. Copy the template.reg file to afscli.reg. Replace any references - to c: and afscli with your install location. Double click on the - afscli.reg file to add the registry entries to the target system. - 4. Create the following AFS configuration files in the install dir.: - - ThisCell: - containing the name of your home cell - - cache.info: - containing your cache configuration. For example, - to configure a cache of 40,000 1KB blocks with a disk cache - location of c:\afscache, you would enter in this file: - /afs:c:\afscache;40000 - (The cache location has no effect unless you have enabled - the experimental disk cache support.) - - CellServDB: - the cell server database. You can get the latest version from AFS: - /afs/transarc.com/service/etc/CellServDB.export - 5. Reboot the target machine. - 6. You can now start the client by executing the program WinAfsLoad.exe - from the install directory. - - diff --git a/acinclude.m4 b/acinclude.m4 index 0bc163f14d..8deeaae3f9 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -120,6 +120,9 @@ AC_ARG_ENABLE(optimize-kernel, AC_ARG_ENABLE(debug, [ --enable-debug enable compilation of the user space code with debugging information (defaults to disabled)],, enable_debug="no" ) +AC_ARG_ENABLE(strip-binaries, +[ --disable-strip-binaries disable stripping of symbol information from binaries (defaults to enabled)],, enable_strip_binaries="maybe" +) AC_ARG_ENABLE(optimize, [ --disable-optimize disable optimization for compilation of the user space code (defaults to enabled)],, enable_optimize="yes" ) @@ -350,6 +353,14 @@ else AFS_PARAM_COMMON=param.nbsd20.h AFS_SYSNAME="amd64_nbsd20" ;; + x86_64-*-netbsd*3.[0-8]*) + AFS_PARAM_COMMON=param.nbsd30.h + AFS_SYSNAME="amd64_nbsd30" + ;; + x86_64-*-netbsd*4.[0-8]*) + AFS_PARAM_COMMON=param.nbsd40.h + AFS_SYSNAME="amd64_nbsd40" + ;; powerpc-*-netbsd*2.0*) AFS_PARAM_COMMON=param.nbsd20.h AFS_SYSNAME="ppc_nbsd20" @@ -625,10 +636,16 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) fi LINUX_KERNEL_COMPILE_WORKS + LINUX_KBUILD_USES_EXTRA_CFLAGS + LINUX_HAVE_CURRENT_KERNEL_TIME + LINUX_KMEM_CACHE_INIT + LINUX_HAVE_KMEM_CACHE_T + LINUX_KMEM_CACHE_CREATE_TAKES_DTOR dnl XXX ask about LINUX_KERNEL_HAS_NFSSRV LINUX_KERNEL_HAS_NFSSRV LINUX_CONFIG_H_EXISTS LINUX_COMPLETION_H_EXISTS + LINUX_EXPORTFS_H_EXISTS LINUX_DEFINES_FOR_EACH_PROCESS LINUX_DEFINES_PREV_TASK LINUX_FS_STRUCT_SUPER_HAS_ALLOC_INODE @@ -656,12 +673,15 @@ dnl XXX ask about LINUX_KERNEL_HAS_NFSSRV LINUX_FOP_F_FLUSH_TAKES_FL_OWNER_T LINUX_AOP_WRITEBACK_CONTROL LINUX_FS_STRUCT_FOP_HAS_FLOCK + LINUX_FS_STRUCT_FOP_HAS_SENDFILE + LINUX_FS_STRUCT_FOP_HAS_SPLICE LINUX_KERNEL_LINUX_SYSCALL_H LINUX_KERNEL_LINUX_SEQ_FILE_H LINUX_KERNEL_POSIX_LOCK_FILE_WAIT_ARG LINUX_KERNEL_SELINUX LINUX_KERNEL_SOCK_CREATE LINUX_KERNEL_PAGE_FOLLOW_LINK + LINUX_KEY_TYPE_H_EXISTS LINUX_NEED_RHCONFIG LINUX_RECALC_SIGPENDING_ARG_TYPE LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_PARENT @@ -679,6 +699,7 @@ dnl XXX ask about LINUX_KERNEL_HAS_NFSSRV LINUX_GET_SB_HAS_STRUCT_VFSMOUNT LINUX_STATFS_TAKES_DENTRY LINUX_FREEZER_H_EXISTS + LINUX_HAVE_SVC_ADDR_IN if test "x$ac_cv_linux_freezer_h_exists" = "xyes" ; then AC_DEFINE(FREEZER_H_EXISTS, 1, [define if you have linux/freezer.h]) fi @@ -689,6 +710,7 @@ dnl XXX ask about LINUX_KERNEL_HAS_NFSSRV LINUX_GENERIC_FILE_AIO_READ LINUX_INIT_WORK_HAS_DATA LINUX_REGISTER_SYSCTL_TABLE_NOFLAG + LINUX_SYSCTL_TABLE_CHECKING LINUX_EXPORTS_SYS_CHDIR LINUX_EXPORTS_SYS_CLOSE LINUX_EXPORTS_SYS_OPEN @@ -762,6 +784,12 @@ dnl XXX ask about LINUX_KERNEL_HAS_NFSSRV if test "x$ac_cv_linux_config_h_exists" = "xyes" ; then AC_DEFINE(CONFIG_H_EXISTS, 1, [define if config.h exists]) fi + if test "x$ac_cv_linux_exportfs_h_exists" = "xyes"; then + AC_DEFINE(EXPORTFS_H_EXISTS, 1, [define if linux/exportfs.h exists]) + fi + if test "x$ac_cv_linux_key_type_h_exists" = "xyes" ; then + AC_DEFINE(KEY_TYPE_H_EXISTS, 1, [define if key-type.h exists]) + fi if test "x$ac_cv_linux_defines_for_each_process" = "xyes" ; then AC_DEFINE([DEFINED_FOR_EACH_PROCESS], 1, [define if for_each_process defined]) fi @@ -900,17 +928,41 @@ dnl XXX ask about LINUX_KERNEL_HAS_NFSSRV if test "x$ac_cv_linux_fs_struct_fop_has_flock" = "xyes" ; then AC_DEFINE(STRUCT_FILE_OPERATIONS_HAS_FLOCK, 1, [define if your struct file_operations has flock]) fi + if test "x$ac_cv_linux_fs_struct_fop_has_sendfile" = "xyes" ; then + AC_DEFINE(STRUCT_FILE_OPERATIONS_HAS_SENDFILE, 1, [define if your struct file_operations has sendfile]) + fi + if test "x$ac_cv_linux_fs_struct_fop_has_splice" = "xyes" ; then + AC_DEFINE(STRUCT_FILE_OPERATIONS_HAS_SPLICE, 1, [define if your struct file_operations has splice_write and splice_read]) + fi if test "x$ac_cv_linux_register_sysctl_table_noflag" = "xyes" ; then AC_DEFINE(REGISTER_SYSCTL_TABLE_NOFLAG, 1, [define if register_sysctl_table has no insert_at head flag]) fi + if test "x$ac_cv_linux_sysctl_table_checking" = "xyes" ; then + AC_DEFINE(SYSCTL_TABLE_CHECKING, 1, [define if your kernel has sysctl table checking]) + fi if test "x$ac_cv_linux_exports_tasklist_lock" = "xyes" ; then AC_DEFINE(EXPORTED_TASKLIST_LOCK, 1, [define if tasklist_lock exported]) fi + if test "x$ac_cv_linux_have_kmem_cache_t" = "xyes" ; then + AC_DEFINE(HAVE_KMEM_CACHE_T, 1, [define if kmem_cache_t exists]) + fi + if test "x$ac_cv_linux_kmem_cache_init" = "xyes" ; then + AC_DEFINE(KMEM_CACHE_INIT, 1, [define for new kmem_cache init function parameters]) + fi + if test "x$ac_cv_linux_have_current_kernel_time" = "xyes" ; then + AC_DEFINE(HAVE_CURRENT_KERNEL_TIME, 1, [define if current_kernel_time() exists]) + fi + if test "x$ac_cv_linux_have_kmem_cache_t" = "xyes" ; then + AC_DEFINE(KMEM_CACHE_TAKES_DTOR, 1, [define if kmem_cache_create takes a destructor argument]) + fi if test "x$ac_cv_linux_kernel_page_follow_link" = "xyes" -o "x$ac_cv_linux_func_i_put_link_takes_cookie" = "xyes"; then AC_DEFINE(USABLE_KERNEL_PAGE_SYMLINK_CACHE, 1, [define if your kernel has a usable symlink cache API]) else AC_MSG_WARN([your kernel does not have a usable symlink cache API]) fi + if test "x$ac_cv_linux_have_svc_addr_in" = "xyes"; then + AC_DEFINE(HAVE_SVC_ADDR_IN, 1, [define if svc_add_in exists]) + fi : fi esac @@ -1226,7 +1278,7 @@ dnl checks for header files. AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_HEADER_DIRENT -AC_CHECK_HEADERS(stdlib.h string.h unistd.h fcntl.h sys/time.h sys/file.h) +AC_CHECK_HEADERS(stdlib.h string.h unistd.h poll.h fcntl.h sys/time.h sys/file.h) AC_CHECK_HEADERS(netinet/in.h netdb.h sys/fcntl.h sys/mnttab.h sys/mntent.h) AC_CHECK_HEADERS(mntent.h sys/vfs.h sys/param.h sys/fs_types.h sys/fstyp.h) AC_CHECK_HEADERS(sys/mount.h strings.h termios.h signal.h) diff --git a/configure-libafs.in b/configure-libafs.in index 0cde5b0cb1..7fe049d598 100644 --- a/configure-libafs.in +++ b/configure-libafs.in @@ -1,8 +1,11 @@ AC_INIT(src/libafs/Makefile.common.in) -AM_INIT_AUTOMAKE(openafs-libafs,1.5.25) +AM_INIT_AUTOMAKE(openafs-libafs,1.5.28) AC_CONFIG_HEADER(src/config/afsconfig.h) -define(OPENAFS_CONFIGURE_LIBAFS) +MACOS_VERSION=1.5.28 +AC_SUBST(MACOS_VERSION) + +define(OPENAFS_CONFIGURE_LIBAFS) AC_PROG_CC OPENAFS_CONFIGURE_COMMON diff --git a/configure.in b/configure.in index 8ff095236e..0816bfc141 100644 --- a/configure.in +++ b/configure.in @@ -1,9 +1,13 @@ -AC_INIT(openafs,1.5.25) +AC_INIT(openafs,1.5.28) AC_CONFIG_SRCDIR(src/config/stds.h) AM_INIT_AUTOMAKE AC_CONFIG_HEADER(src/config/afsconfig.h) +MACOS_VERSION=1.5.28 + +AC_SUBST(MACOS_VERSION) AC_PROG_CC +AC_CHECK_PROGS(CPP,[/lib/cpp /usr/bin/cpp /usr/ccs/lib/cpp cpp]) OPENAFS_CONFIGURE_COMMON if test -e 'doc/man-pages/Makefile.in' ; then @@ -81,6 +85,10 @@ src/lwp/test/Makefile \ src/mpp/Makefile \ src/null/Makefile \ src/package/Makefile \ +src/packaging/MacOS/OpenAFS.Info.plist \ +src/packaging/MacOS/OpenAFS.info \ +src/packaging/MacOS/buildpkg.sh \ +src/packaging/RedHat/openafs.spec \ src/pam/Makefile \ src/pinstall/Makefile \ src/pinstall/test/Makefile \ diff --git a/doc/man-pages/README b/doc/man-pages/README index 7c8c5b209c..4f789c6127 100644 --- a/doc/man-pages/README +++ b/doc/man-pages/README @@ -78,7 +78,10 @@ Formatting Standards documents common options, and discusses the general use of the suite. Then, each operation code in the suite should have a separate man page, named after the command with the space between the command suite and the - operation code replaced with an underscore. + operation code replaced with an underscore. The NAME section of the + operation man page must also use an underscore (fs_listacl, not fs + listacl) for compatibility with some man programs. The SYNOPSIS section + should, of course, use a space, since that's what the user must type. All man pages must follow the standard layout for man page sections and formatting. The best general reference is the pod2man man page, @@ -199,17 +202,13 @@ Known Problems * The following installed commands have no man pages: copyauth - fs rxstatpeer fs rxstatproc fs setcbaddr - kseal - read_tape restorevol rmtsysd vldb_convert vos clone - vos convertROtoRW - vos copy + vos setfields vos shadow vsys @@ -221,9 +220,6 @@ Known Problems * Some of the documentation in fs getserverprefs needs minor updates to reflect what happens in the dynroot case. - * fs sysname documentation needs to include the possibility of setting - multiple sysnames and the resulting behavior. - * bos listkeys and the KeyFile man page assume that you're using the kaserver. diff --git a/doc/man-pages/pod1/fs_apropos.pod b/doc/man-pages/pod1/fs_apropos.pod index ba0b3d42b8..b626d4c1ce 100644 --- a/doc/man-pages/pod1/fs_apropos.pod +++ b/doc/man-pages/pod1/fs_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -fs apropos - Displays each help entry containing a keyword string +fs_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_checkservers.pod b/doc/man-pages/pod1/fs_checkservers.pod index 71fb179ed6..9f6996f642 100644 --- a/doc/man-pages/pod1/fs_checkservers.pod +++ b/doc/man-pages/pod1/fs_checkservers.pod @@ -1,6 +1,6 @@ =head1 NAME -fs checkservers - Displays the status of server machines +fs_checkservers - Displays the status of server machines =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_checkvolumes.pod b/doc/man-pages/pod1/fs_checkvolumes.pod index 3e41e1eb2b..e822b36ca6 100644 --- a/doc/man-pages/pod1/fs_checkvolumes.pod +++ b/doc/man-pages/pod1/fs_checkvolumes.pod @@ -1,6 +1,6 @@ =head1 NAME -fs checkvolumes - Forces the Cache Manager to update volume information +fs_checkvolumes - Forces the Cache Manager to update volume information =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_cleanacl.pod b/doc/man-pages/pod1/fs_cleanacl.pod index 50bf48139d..538076b471 100644 --- a/doc/man-pages/pod1/fs_cleanacl.pod +++ b/doc/man-pages/pod1/fs_cleanacl.pod @@ -1,6 +1,6 @@ =head1 NAME -fs cleanacl - Remove obsolete entries from an ACL +fs_cleanacl - Remove obsolete entries from an ACL =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_copyacl.pod b/doc/man-pages/pod1/fs_copyacl.pod index d11549d5e5..6228ec2ffb 100644 --- a/doc/man-pages/pod1/fs_copyacl.pod +++ b/doc/man-pages/pod1/fs_copyacl.pod @@ -1,6 +1,6 @@ =head1 NAME -fs copyacl - Copies an ACL from a directory to one or more other directories +fs_copyacl - Copies an ACL from a directory to one or more other directories =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_diskfree.pod b/doc/man-pages/pod1/fs_diskfree.pod index 6dc8ad3112..bb8fbdecd3 100644 --- a/doc/man-pages/pod1/fs_diskfree.pod +++ b/doc/man-pages/pod1/fs_diskfree.pod @@ -1,6 +1,6 @@ =head1 NAME -fs diskfree - Shows data about the partition housing a directory or file +fs_diskfree - Shows data about the partition housing a directory or file =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_examine.pod b/doc/man-pages/pod1/fs_examine.pod index 5db1e970d7..26219a47dd 100644 --- a/doc/man-pages/pod1/fs_examine.pod +++ b/doc/man-pages/pod1/fs_examine.pod @@ -1,6 +1,6 @@ =head1 NAME -fs examine - Shows data about the volume containing a directory or file +fs_examine - Shows data about the volume containing a directory or file =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_exportafs.pod b/doc/man-pages/pod1/fs_exportafs.pod index b4d1f31b5f..ecc3d568b0 100644 --- a/doc/man-pages/pod1/fs_exportafs.pod +++ b/doc/man-pages/pod1/fs_exportafs.pod @@ -1,6 +1,6 @@ =head1 NAME -fs exportafs - Configures export of AFS to clients of other file systems +fs_exportafs - Configures export of AFS to clients of other file systems =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_flush.pod b/doc/man-pages/pod1/fs_flush.pod index 3caaecdd57..61ee4dab2e 100644 --- a/doc/man-pages/pod1/fs_flush.pod +++ b/doc/man-pages/pod1/fs_flush.pod @@ -1,6 +1,6 @@ =head1 NAME -fs flush - Forces the Cache Manager to discard a cached file or directory +fs_flush - Forces the Cache Manager to discard a cached file or directory =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_flushall.pod b/doc/man-pages/pod1/fs_flushall.pod index 3fac90f510..107e521158 100644 --- a/doc/man-pages/pod1/fs_flushall.pod +++ b/doc/man-pages/pod1/fs_flushall.pod @@ -1,6 +1,6 @@ =head1 NAME -fs flushall - Force the AFS Cache Manager to discard all data +fs_flushall - Force the AFS Cache Manager to discard all data =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_flushmount.pod b/doc/man-pages/pod1/fs_flushmount.pod index 061c85d08f..b7709695a5 100644 --- a/doc/man-pages/pod1/fs_flushmount.pod +++ b/doc/man-pages/pod1/fs_flushmount.pod @@ -1,6 +1,6 @@ =head1 NAME -fs flushmount - Forces the Cache Manager to discard a mount point +fs_flushmount - Forces the Cache Manager to discard a mount point =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_flushvolume.pod b/doc/man-pages/pod1/fs_flushvolume.pod index be98d162c9..c8ac98175c 100644 --- a/doc/man-pages/pod1/fs_flushvolume.pod +++ b/doc/man-pages/pod1/fs_flushvolume.pod @@ -1,6 +1,6 @@ =head1 NAME -fs flushvolume - Forces the Cache Manager to discard cached data from a volume +fs_flushvolume - Forces the Cache Manager to discard cached data from a volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_getcacheparms.pod b/doc/man-pages/pod1/fs_getcacheparms.pod index dde57a3d79..f65be0f051 100644 --- a/doc/man-pages/pod1/fs_getcacheparms.pod +++ b/doc/man-pages/pod1/fs_getcacheparms.pod @@ -1,6 +1,6 @@ =head1 NAME -fs getcacheparms - Displays the current size and usage of the cache +fs_getcacheparms - Displays the current size and usage of the cache =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_getcalleraccess.pod b/doc/man-pages/pod1/fs_getcalleraccess.pod index 56a14f8923..12d96c487b 100644 --- a/doc/man-pages/pod1/fs_getcalleraccess.pod +++ b/doc/man-pages/pod1/fs_getcalleraccess.pod @@ -1,6 +1,6 @@ =head1 NAME -fs getcalleraccess - Show the current user's access to a file or directory +fs_getcalleraccess - Show the current user's access to a file or directory =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_getcellstatus.pod b/doc/man-pages/pod1/fs_getcellstatus.pod index 1d835d6de5..f3fb9a0d5d 100644 --- a/doc/man-pages/pod1/fs_getcellstatus.pod +++ b/doc/man-pages/pod1/fs_getcellstatus.pod @@ -1,6 +1,6 @@ =head1 NAME -fs getcellstatus - Reports whether setuid programs are honored in a cell +fs_getcellstatus - Reports whether setuid programs are honored in a cell =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_getclientaddrs.pod b/doc/man-pages/pod1/fs_getclientaddrs.pod index 692aa57c0d..6dc9abca84 100644 --- a/doc/man-pages/pod1/fs_getclientaddrs.pod +++ b/doc/man-pages/pod1/fs_getclientaddrs.pod @@ -1,6 +1,6 @@ =head1 NAME -fs getclientaddrs - Displays the client interfaces to register +fs_getclientaddrs - Displays the client interfaces to register =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_getcrypt.pod b/doc/man-pages/pod1/fs_getcrypt.pod index a1402f5aa1..f0e24f01b6 100644 --- a/doc/man-pages/pod1/fs_getcrypt.pod +++ b/doc/man-pages/pod1/fs_getcrypt.pod @@ -1,6 +1,6 @@ =head1 NAME -fs getcrypt - Displays the state of encryption for AFS file transfers +fs_getcrypt - Displays the state of encryption for AFS file transfers =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_getserverprefs.pod b/doc/man-pages/pod1/fs_getserverprefs.pod index e59ef3e15d..0bb00c4ef3 100644 --- a/doc/man-pages/pod1/fs_getserverprefs.pod +++ b/doc/man-pages/pod1/fs_getserverprefs.pod @@ -1,6 +1,6 @@ =head1 NAME -fs getserverprefs - Displays preference ranks for file servers or VL servers +fs_getserverprefs - Displays preference ranks for file servers or VL servers =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_help.pod b/doc/man-pages/pod1/fs_help.pod index a0d73a30bd..98ae7ba6d7 100644 --- a/doc/man-pages/pod1/fs_help.pod +++ b/doc/man-pages/pod1/fs_help.pod @@ -1,6 +1,6 @@ =head1 NAME -fs help - Displays help for fs commands +fs_help - Displays help for fs commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_listacl.pod b/doc/man-pages/pod1/fs_listacl.pod index 35098cc89c..8537fa161a 100644 --- a/doc/man-pages/pod1/fs_listacl.pod +++ b/doc/man-pages/pod1/fs_listacl.pod @@ -1,6 +1,6 @@ =head1 NAME -fs listacl - Displays ACLs +fs_listacl - Displays ACLs =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_listaliases.pod b/doc/man-pages/pod1/fs_listaliases.pod index 225aa42bfe..46b6395329 100644 --- a/doc/man-pages/pod1/fs_listaliases.pod +++ b/doc/man-pages/pod1/fs_listaliases.pod @@ -1,6 +1,6 @@ =head1 NAME -fs listaliases - Displays the current list of aliases for AFS cells +fs_listaliases - Displays the current list of aliases for AFS cells =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_listcells.pod b/doc/man-pages/pod1/fs_listcells.pod index 513cc0867d..4725a8ef79 100644 --- a/doc/man-pages/pod1/fs_listcells.pod +++ b/doc/man-pages/pod1/fs_listcells.pod @@ -1,6 +1,6 @@ =head1 NAME -fs listcells - Displays the database server machines known to the Cache Manager +fs_listcells - Displays the database server machines known to the Cache Manager =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_listquota.pod b/doc/man-pages/pod1/fs_listquota.pod index 29a20e0202..030736a62c 100644 --- a/doc/man-pages/pod1/fs_listquota.pod +++ b/doc/man-pages/pod1/fs_listquota.pod @@ -1,6 +1,6 @@ =head1 NAME -fs listquota - Displays quota information for a volume +fs_listquota - Displays quota information for a volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_lsmount.pod b/doc/man-pages/pod1/fs_lsmount.pod index 9b238da527..d79e6e7ede 100644 --- a/doc/man-pages/pod1/fs_lsmount.pod +++ b/doc/man-pages/pod1/fs_lsmount.pod @@ -1,6 +1,6 @@ =head1 NAME -fs lsmount - Reports the volume for which a directory is the mount point. +fs_lsmount - Reports the volume for which a directory is the mount point. =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_messages.pod b/doc/man-pages/pod1/fs_messages.pod index ee1921d3e3..2a47345fe4 100644 --- a/doc/man-pages/pod1/fs_messages.pod +++ b/doc/man-pages/pod1/fs_messages.pod @@ -1,6 +1,6 @@ =head1 NAME -fs messages - Sets whether the Cache Manager writes log messages +fs_messages - Sets whether the Cache Manager writes log messages =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_mkmount.pod b/doc/man-pages/pod1/fs_mkmount.pod index 4ec5949f93..fd74d9b50f 100644 --- a/doc/man-pages/pod1/fs_mkmount.pod +++ b/doc/man-pages/pod1/fs_mkmount.pod @@ -1,6 +1,6 @@ =head1 NAME -fs mkmount - Creates a mount point for a volume +fs_mkmount - Creates a mount point for a volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_newalias.pod b/doc/man-pages/pod1/fs_newalias.pod index 2c56c83ce8..61d304e511 100644 --- a/doc/man-pages/pod1/fs_newalias.pod +++ b/doc/man-pages/pod1/fs_newalias.pod @@ -1,6 +1,6 @@ =head1 NAME -fs newalias - Creates a new alias for a cell +fs_newalias - Creates a new alias for a cell =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_newcell.pod b/doc/man-pages/pod1/fs_newcell.pod index 6e337b48f0..3c56f56824 100644 --- a/doc/man-pages/pod1/fs_newcell.pod +++ b/doc/man-pages/pod1/fs_newcell.pod @@ -1,6 +1,6 @@ =head1 NAME -fs newcell - Changes the kernel-resident list of a cell's database servers +fs_newcell - Changes the kernel-resident list of a cell's database servers =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_quota.pod b/doc/man-pages/pod1/fs_quota.pod index 40b715ff59..63a3d12f92 100644 --- a/doc/man-pages/pod1/fs_quota.pod +++ b/doc/man-pages/pod1/fs_quota.pod @@ -1,6 +1,6 @@ =head1 NAME -fs quota - Displays the quota used in the volume containing a directory or file +fs_quota - Displays the quota used in the volume containing a directory or file =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_rmmount.pod b/doc/man-pages/pod1/fs_rmmount.pod index 306a22b5db..9a68aa5ff9 100644 --- a/doc/man-pages/pod1/fs_rmmount.pod +++ b/doc/man-pages/pod1/fs_rmmount.pod @@ -1,6 +1,6 @@ =head1 NAME -fs rmmount - Removes a mount point +fs_rmmount - Removes a mount point =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_rxstatpeer.pod b/doc/man-pages/pod1/fs_rxstatpeer.pod new file mode 100644 index 0000000000..f7bd5bef14 --- /dev/null +++ b/doc/man-pages/pod1/fs_rxstatpeer.pod @@ -0,0 +1,67 @@ +=head1 NAME + +fs_rxstatpeer - Enables Rx packet logging in the OpenAFS kernel module + +=head1 SYNOPSIS + +=for html +
+ +B [B<-clear>] [B<-disable>] [B<-enable>] [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +B manipulates some of the Rx protocol counters in the +OpenAFS kernel interface. + +=head1 OPTIONS + +=over 4 + +=item B<-clear> + +Clear the Rx stats for peers in the kernel module. + +=item B<-disable> + +Disable logging of Rx stats for peers in the kernel module. + +=item B<-enable> + +Enable logging of Rx stats for peers in the kernel module. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 OUTPUT + +This command produces no output other than error messages. + +=head1 EXAMPLES + +Enable Rx Stats for peers: + + % fs rxstatpeer -enable + +=head1 PRIVILEGE REQUIRED + +The issuer must be logged in as the local superuser root. + +=head1 SEE ALSO + +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/fs_setacl.pod b/doc/man-pages/pod1/fs_setacl.pod index ec437023ee..fa0562e1ed 100644 --- a/doc/man-pages/pod1/fs_setacl.pod +++ b/doc/man-pages/pod1/fs_setacl.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setacl - Sets the ACL for a directory +fs_setacl - Sets the ACL for a directory =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setcachesize.pod b/doc/man-pages/pod1/fs_setcachesize.pod index 5c53b5fafe..b0aafd7fc9 100644 --- a/doc/man-pages/pod1/fs_setcachesize.pod +++ b/doc/man-pages/pod1/fs_setcachesize.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setcachesize - Sets the size of the disk cache +fs_setcachesize - Sets the size of the disk cache =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setcell.pod b/doc/man-pages/pod1/fs_setcell.pod index 0a0963f60f..fb4971fae4 100644 --- a/doc/man-pages/pod1/fs_setcell.pod +++ b/doc/man-pages/pod1/fs_setcell.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setcell - Configures permissions for setuid programs from specified cells +fs_setcell - Configures permissions for setuid programs from specified cells =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setclientaddrs.pod b/doc/man-pages/pod1/fs_setclientaddrs.pod index e76a05d5a0..213d45160a 100644 --- a/doc/man-pages/pod1/fs_setclientaddrs.pod +++ b/doc/man-pages/pod1/fs_setclientaddrs.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setclientaddrs - Sets the client interfaces to register with the File Server +fs_setclientaddrs - Sets the client interfaces to register with the File Server =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setcrypt.pod b/doc/man-pages/pod1/fs_setcrypt.pod index 76676f167d..c303b25a82 100644 --- a/doc/man-pages/pod1/fs_setcrypt.pod +++ b/doc/man-pages/pod1/fs_setcrypt.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setcrypt - Enables of disables the encryption of AFS file transfers +fs_setcrypt - Enables of disables the encryption of AFS file transfers =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setquota.pod b/doc/man-pages/pod1/fs_setquota.pod index 19a0fded02..dfec2998bb 100644 --- a/doc/man-pages/pod1/fs_setquota.pod +++ b/doc/man-pages/pod1/fs_setquota.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setquota - Sets the quota for the volume containing a file or directory +fs_setquota - Sets the quota for the volume containing a file or directory =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setserverprefs.pod b/doc/man-pages/pod1/fs_setserverprefs.pod index 2a709147f5..9b4c0c3ffd 100644 --- a/doc/man-pages/pod1/fs_setserverprefs.pod +++ b/doc/man-pages/pod1/fs_setserverprefs.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setserverprefs - Sets the preference ranks for file servers or VL servers +fs_setserverprefs - Sets the preference ranks for file servers or VL servers =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_setvol.pod b/doc/man-pages/pod1/fs_setvol.pod index 104faa5ef2..c0fd59ab4f 100644 --- a/doc/man-pages/pod1/fs_setvol.pod +++ b/doc/man-pages/pod1/fs_setvol.pod @@ -1,6 +1,6 @@ =head1 NAME -fs setvol - Set quota and messages for a volume containing a file or directory +fs_setvol - Set quota and messages for a volume containing a file or directory =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_storebehind.pod b/doc/man-pages/pod1/fs_storebehind.pod index 82f1682d86..70e804166d 100644 --- a/doc/man-pages/pod1/fs_storebehind.pod +++ b/doc/man-pages/pod1/fs_storebehind.pod @@ -1,6 +1,6 @@ =head1 NAME -fs storebehind - Enables asynchronous writes to the file server +fs_storebehind - Enables asynchronous writes to the file server =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_sysname.pod b/doc/man-pages/pod1/fs_sysname.pod index de6c9abd6f..b3026a646c 100644 --- a/doc/man-pages/pod1/fs_sysname.pod +++ b/doc/man-pages/pod1/fs_sysname.pod @@ -1,15 +1,15 @@ =head1 NAME -fs sysname - Reports or sets the CPU/operating system type +fs_sysname - Reports or sets the CPU/operating system type =head1 SYNOPSIS =for html
-B S<<< [B<-newsys> >] >>> [B<-help>] +B S<<< [B<-newsys> >]+ >>> [B<-help>] -B S<<< [B<-n> >] >>> [B<-h>] +B S<<< [B<-n> >]+ >>> [B<-h>] =for html
@@ -19,7 +19,7 @@ B S<<< [B<-n> >] >>> [B<-h>] The B command sets or displays the local machine's CPU/operating system type as recorded in kernel memory. The Cache Manager substitutes the string for the I<@sys> variable which can occur in AFS -pathnames; the I and I and I explain how using I<@sys> can simplify cell configuration. It is best to use it sparingly, however, because it can make the effect of changing directories unpredictable. @@ -42,10 +42,14 @@ must verify that the correct string is set for the new identity also. =item B<-newsys> > -Sets the CPU/operating system indicator string for the local machine. If -this argument is omitted, the output displays the current setting -instead. AFS uses a standardized set of strings; consult the I or I. +Sets the CPU/operating system indicator string for the local machine. This +option may be used multiple times in the same invocation, which sets I<@sys> +to an array of values. When I<@sys> contains an array of values, the first +value that matches a path is used. + +If this argument is omitted, the output displays the current setting +instead. AFS uses a standardized set of strings; consult the I or I. =item B<-help> @@ -61,6 +65,10 @@ system type in the following format: Current sysname is '' +When the B<-newsys> argument is included, the output is the following: + + fs: new sysname list set. + =head1 EXAMPLES The following example shows the output produced on a Sun SPARCStation @@ -74,6 +82,18 @@ The following command defines a machine to be a IBM RS/6000 running AIX % fs sysname -newsys rs_aix42 +The following command defines a machine to be Mac OS X PPC and a +custom type 'foo'. The second command queries the new sysname: + + % fs sysname -newsys ppc_darwin_80 -newsys foo + fs: new sysname list set. + % fs sysname + Current sysname list is 'ppc_darwin_80' 'foo' + +If I<@sys> is C, then C will try to change +to the C directory. If the C directory +doesn't exist, then the C directory is tried. + =head1 PRIVILEGE REQUIRED To display the current setting, no privilege is required. To include the @@ -85,9 +105,14 @@ as the local superuser C. L, L -I +I +L -I +I +L + +For the list of assigned standard sysname values, see +L =head1 COPYRIGHT diff --git a/doc/man-pages/pod1/fs_uuid.pod b/doc/man-pages/pod1/fs_uuid.pod new file mode 100644 index 0000000000..9d6a2c1da1 --- /dev/null +++ b/doc/man-pages/pod1/fs_uuid.pod @@ -0,0 +1,81 @@ +=head1 NAME + +fs_uuid - Prints the uuid of the client or generates a new one + +=head1 SYNOPSIS + +=for html +
+ +B [B<-generate>] [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +B prints the current UUID of an OpenAFS client. It can +optionally force the generation of a new UUID, if needed. The client UUID +is used by the B to differentiate clients with the same IP +address. + +=head1 CAUTIONS + +The B command is only available in OpenAFS versions after 1.4.5 +and 1.5.8. The behavior differs slightly between versions. In OpenAFS +1.4.5 and later, the B<-generate> option is required and the UUID for the +client machine is never printed. OpenAFS versions 1.5.8 and later will +print the UUID. + +=head1 OPTIONS + +=over 4 + +=item B<-generate> + +Generates a new UUID for the cache manager. This is useful if two clients +share the same UUID (if systems were cloned incorrectly, for example). +B<-generate> is optional in OpenAFS versions 1.5.8 and later, but it is +required in OpenAFS versions 1.4.5 and later. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 OUTPUT + +B prints out the current UUID for the client or the new UUID +if the B<-generate> option is passed to it. + +=head1 EXAMPLES + +There are only two ways to invoke B under 1.5.8 and later: + + % fs uuid + UUID: 8ac66f9308a8e-47d7-80f7-50d0040cddc2 + + % fs uuid -generate + New UUID: 436bd660-1720-429508e470cff38f5c6fb0 + +Here is the only way to invoke B under OpenAFS 1.4.5 and later: + + % fs uuid -generate + New uuid generated. + +=head1 PRIVILEGE REQUIRED + +The issuer must be logged on as the local superuser C. + +=head1 SEE ALSO + +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/fs_whereis.pod b/doc/man-pages/pod1/fs_whereis.pod index 1665c60ca3..23dfc75bdb 100644 --- a/doc/man-pages/pod1/fs_whereis.pod +++ b/doc/man-pages/pod1/fs_whereis.pod @@ -1,6 +1,6 @@ =head1 NAME -fs whereis - Reports each file server housing a file or directory +fs_whereis - Reports each file server housing a file or directory =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_whichcell.pod b/doc/man-pages/pod1/fs_whichcell.pod index 101c111b08..56fdfb9b33 100644 --- a/doc/man-pages/pod1/fs_whichcell.pod +++ b/doc/man-pages/pod1/fs_whichcell.pod @@ -1,6 +1,6 @@ =head1 NAME -fs whichcell - Returns the cell to which a file or directory belongs +fs_whichcell - Returns the cell to which a file or directory belongs =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/fs_wscell.pod b/doc/man-pages/pod1/fs_wscell.pod index cfd6898275..a71fa2677b 100644 --- a/doc/man-pages/pod1/fs_wscell.pod +++ b/doc/man-pages/pod1/fs_wscell.pod @@ -1,6 +1,6 @@ =head1 NAME -fs wscell - Returns the name of the cell to which a machine belongs +fs_wscell - Returns the name of the cell to which a machine belongs =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_adduser.pod b/doc/man-pages/pod1/pts_adduser.pod index 671c76e6b0..ac2f332f64 100644 --- a/doc/man-pages/pod1/pts_adduser.pod +++ b/doc/man-pages/pod1/pts_adduser.pod @@ -1,6 +1,6 @@ =head1 NAME -pts adduser - Adds a user or machine to a Protection Database group +pts_adduser - Adds a user or machine to a Protection Database group =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_apropos.pod b/doc/man-pages/pod1/pts_apropos.pod index 89653617e6..9e213710e9 100644 --- a/doc/man-pages/pod1/pts_apropos.pod +++ b/doc/man-pages/pod1/pts_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -pts apropos - Displays each help entry containing a keyword string +pts_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_chown.pod b/doc/man-pages/pod1/pts_chown.pod index 397ed0c5e3..cde8b98c26 100644 --- a/doc/man-pages/pod1/pts_chown.pod +++ b/doc/man-pages/pod1/pts_chown.pod @@ -1,6 +1,6 @@ =head1 NAME -pts chown - Changes the owner of a Protection Database entry +pts_chown - Changes the owner of a Protection Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_creategroup.pod b/doc/man-pages/pod1/pts_creategroup.pod index 861efe3593..d2886e9541 100644 --- a/doc/man-pages/pod1/pts_creategroup.pod +++ b/doc/man-pages/pod1/pts_creategroup.pod @@ -1,6 +1,6 @@ =head1 NAME -pts creategroup - Creates an (empty) Protection Database group entry +pts_creategroup - Creates an (empty) Protection Database group entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_createuser.pod b/doc/man-pages/pod1/pts_createuser.pod index 1b706daa78..64abd23236 100644 --- a/doc/man-pages/pod1/pts_createuser.pod +++ b/doc/man-pages/pod1/pts_createuser.pod @@ -1,6 +1,6 @@ =head1 NAME -pts createuser - Creates a user or machine entry in the Protection Database +pts_createuser - Creates a user or machine entry in the Protection Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_delete.pod b/doc/man-pages/pod1/pts_delete.pod index b88274be56..6af95427ca 100644 --- a/doc/man-pages/pod1/pts_delete.pod +++ b/doc/man-pages/pod1/pts_delete.pod @@ -1,6 +1,6 @@ =head1 NAME -pts delete - Deletes a Protection Database entry +pts_delete - Deletes a Protection Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_examine.pod b/doc/man-pages/pod1/pts_examine.pod index 0a7572756a..068e1eb30c 100644 --- a/doc/man-pages/pod1/pts_examine.pod +++ b/doc/man-pages/pod1/pts_examine.pod @@ -1,6 +1,6 @@ =head1 NAME -pts examine - Displays a Protection Database entry +pts_examine - Displays a Protection Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_help.pod b/doc/man-pages/pod1/pts_help.pod index 970c22f093..6a26098fa9 100644 --- a/doc/man-pages/pod1/pts_help.pod +++ b/doc/man-pages/pod1/pts_help.pod @@ -1,6 +1,6 @@ =head1 NAME -pts help - Displays help for pts commands +pts_help - Displays help for pts commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_interactive.pod b/doc/man-pages/pod1/pts_interactive.pod index b21ef59ee4..dc9f831b1e 100644 --- a/doc/man-pages/pod1/pts_interactive.pod +++ b/doc/man-pages/pod1/pts_interactive.pod @@ -1,6 +1,6 @@ =head1 NAME -pts interactive - issue multiple multiple pts commands +pts_interactive - issue multiple multiple pts commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_listentries.pod b/doc/man-pages/pod1/pts_listentries.pod index 10c8b69039..99b71072c3 100644 --- a/doc/man-pages/pod1/pts_listentries.pod +++ b/doc/man-pages/pod1/pts_listentries.pod @@ -1,6 +1,6 @@ =head1 NAME -pts listentries - Displays all users or groups in the Protection Database +pts_listentries - Displays all users or groups in the Protection Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_listmax.pod b/doc/man-pages/pod1/pts_listmax.pod index 110dc200c1..151ac68c90 100644 --- a/doc/man-pages/pod1/pts_listmax.pod +++ b/doc/man-pages/pod1/pts_listmax.pod @@ -1,6 +1,6 @@ =head1 NAME -pts listmax - Displays the max user id and max group id counters +pts_listmax - Displays the max user id and max group id counters =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_listowned.pod b/doc/man-pages/pod1/pts_listowned.pod index 2d3de80c8b..fc0d464b24 100644 --- a/doc/man-pages/pod1/pts_listowned.pod +++ b/doc/man-pages/pod1/pts_listowned.pod @@ -1,6 +1,6 @@ =head1 NAME -pts listowned - Show the Protection Database groups owned by a user or group +pts_listowned - Show the Protection Database groups owned by a user or group =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_membership.pod b/doc/man-pages/pod1/pts_membership.pod index 36455ebefe..7bacc0b8fc 100644 --- a/doc/man-pages/pod1/pts_membership.pod +++ b/doc/man-pages/pod1/pts_membership.pod @@ -1,6 +1,6 @@ =head1 NAME -pts membership - Displays the membership list for a user or group +pts_membership - Displays the membership list for a user or group =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_quit.pod b/doc/man-pages/pod1/pts_quit.pod index 4f8abfa2ea..844545f79a 100644 --- a/doc/man-pages/pod1/pts_quit.pod +++ b/doc/man-pages/pod1/pts_quit.pod @@ -1,6 +1,6 @@ =head1 NAME -pts quit - Exit from pts interactive mode +pts_quit - Exit from pts interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_removeuser.pod b/doc/man-pages/pod1/pts_removeuser.pod index 7012d6066d..eb7bc9f6a9 100644 --- a/doc/man-pages/pod1/pts_removeuser.pod +++ b/doc/man-pages/pod1/pts_removeuser.pod @@ -1,6 +1,6 @@ =head1 NAME -pts removeuser - Removes a user from a Protection Database group +pts_removeuser - Removes a user from a Protection Database group =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_rename.pod b/doc/man-pages/pod1/pts_rename.pod index 72c8ffb938..aef05eab39 100644 --- a/doc/man-pages/pod1/pts_rename.pod +++ b/doc/man-pages/pod1/pts_rename.pod @@ -1,6 +1,6 @@ =head1 NAME -pts rename - Changes the name of a Protection Database entry +pts_rename - Changes the name of a Protection Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_setfields.pod b/doc/man-pages/pod1/pts_setfields.pod index 76050c9cef..f530d1026f 100644 --- a/doc/man-pages/pod1/pts_setfields.pod +++ b/doc/man-pages/pod1/pts_setfields.pod @@ -1,6 +1,6 @@ =head1 NAME -pts setfields - Sets privacy flags or quota for a Protection Database entry +pts_setfields - Sets privacy flags or quota for a Protection Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_setmax.pod b/doc/man-pages/pod1/pts_setmax.pod index 9a5bce5c51..09df9de1cd 100644 --- a/doc/man-pages/pod1/pts_setmax.pod +++ b/doc/man-pages/pod1/pts_setmax.pod @@ -1,6 +1,6 @@ =head1 NAME -pts setmax - Sets the value of the max group id or max user id counter +pts_setmax - Sets the value of the max group id or max user id counter =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_sleep.pod b/doc/man-pages/pod1/pts_sleep.pod index b781201a13..06d31aad38 100644 --- a/doc/man-pages/pod1/pts_sleep.pod +++ b/doc/man-pages/pod1/pts_sleep.pod @@ -1,6 +1,6 @@ =head1 NAME -pts sleep - pause for time +pts_sleep - pause for time =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/pts_source.pod b/doc/man-pages/pod1/pts_source.pod index 595780b430..11312aaeb7 100644 --- a/doc/man-pages/pod1/pts_source.pod +++ b/doc/man-pages/pod1/pts_source.pod @@ -1,6 +1,6 @@ =head1 NAME -pts source - read pts commands from a file. +pts_source - read pts commands from a file. =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/symlink.pod b/doc/man-pages/pod1/symlink.pod new file mode 100644 index 0000000000..04f8681c47 --- /dev/null +++ b/doc/man-pages/pod1/symlink.pod @@ -0,0 +1,40 @@ +=head1 NAME + +symlink - Introduction to the symlink command suite + +=head1 DESCRIPTION + +The B command creates, lists and removes Unix-style symbolic links +(symlinks) in OpenAFS filespace from a platform that does not support +symlinks, like Windows. The B command is equivalent to +C on a Unix platform. B can manipulate symlinks created +by C on Unix and vice versa. + +=head1 CAUTIONS + +The B commands are only available on Windows platforms. On +other platforms, use the C command. + +=head1 OPTIONS + +=over 4 + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 SEE ALSO + +L, +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/symlink_list.pod b/doc/man-pages/pod1/symlink_list.pod new file mode 100644 index 0000000000..a56629d7bf --- /dev/null +++ b/doc/man-pages/pod1/symlink_list.pod @@ -0,0 +1,79 @@ +=head1 NAME + +symlink_list - Show the file to which a symlink points + +=head1 SYNOPSIS + +=for html +
+ +B S<<< [B<-name>] > >>> [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +The B command shows if a file is a symbolic link and, if so, +shows to which file the link points. + +=head1 CAUTIONS + +The B commands are only available on Windows platforms. On other +platforms, use the B command. + +=head1 OPTIONS + +=over 4 + +=item [B<-name>] > + +Specify one or more symbolic links to list. The C<-name> is optional, but +the file name is not. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 OUTPUT + +This command prints "'file' is a symlink to 'otherfile'" or "'file' is +not a symlink." + +=head1 EXAMPLES + +Given that file C is a link pointing to file C, the +following commands will list the files: + + % symlink list -name mylink + 'mylink' is a symlink to 'myfile' + + % symlink list mylink + 'mylink' is a symlink to 'myfile' + + % symlink list -name myfile + 'myfile' is not a symlink. + + % symlink list myfile + 'myfile' is not a symlink. + +=head1 PRIVILEGE REQUIRED + +The issuer must have the C (look) and C (read) permissions on the ACL +of the directory that houses the symlink. + +=head1 SEE ALSO + +L, +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/symlink_make.pod b/doc/man-pages/pod1/symlink_make.pod new file mode 100644 index 0000000000..d9d57336a2 --- /dev/null +++ b/doc/man-pages/pod1/symlink_make.pod @@ -0,0 +1,76 @@ +=head1 NAME + +symlink_make - Create a symbolic link + +=head1 SYNOPSIS + +=for html +
+ +B S<<< [B<-name>] > >>> + S<<< [B<-to>] > >>> [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +The B command creates a new symbolic link to a file. The file +to which the link points does not have to exist when the link is created. + +=head1 CAUTIONS + +The B commands are only available on Windows platforms. On other +platforms, use the C command. + +=head1 OPTIONS + +=over 4 + +=item [B<-name>] > + +Specify the name of the new link. B<-name> is optional, but the file name +is not. + +=item [B<-to>] > + +Specify the file to which the new link points. B<-to> is optional, but the +file name is not. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 OUTPUT + +Prints the online help for this command. All other valid options are +ignored. + +=head1 EXAMPLES + +In order to create a link named C pointing to the file C, +use one of the following commands: + + % symlink make -name mylink -to myfile + % symlink make mylink myfile + +=head1 PRIVILEGE REQUIRED + +The issuer must have the C (look) and C (insert) permissions on the +ACL of the directory that houses the symlink. + +=head1 SEE ALSO + +L, +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/symlink_remove.pod b/doc/man-pages/pod1/symlink_remove.pod new file mode 100644 index 0000000000..917b317ea1 --- /dev/null +++ b/doc/man-pages/pod1/symlink_remove.pod @@ -0,0 +1,70 @@ +=head1 NAME + +symlink_remove - Remove a symbolic link. + +=head1 SYNOPSIS + +=for html +
+ +B S<<< [B<-name>] > >>> [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +The B command removes a symbolic link to a file. + +=head1 CAUTIONS + +The B commands are only available on Windows platforms. On other +platforms, use the B command. + +=head1 OPTIONS + +=over 4 + +=item [B<-name>] > + +Specify one or more symbolic links to remove. The B<-name> is optional, but +the file name is not. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 OUTPUT + +This command has no output except error and help messages. If the command +is passed a real file instead of a symlink, it prints "symlink: 'file name' +is not a symlink" instead of removing the file. + +=head1 EXAMPLES + +Given that file C is a link pointing to file C, the +following commands will remove the link C: + + % symlink remove -name mylink + % symlink remove mylink + +=head1 PRIVILEGE REQUIRED + +The issuer must have the C (look) and C (delete) permissions on +the ACL of the directory that houses the symlink. + +=head1 SEE ALSO + +L, +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/vos.pod b/doc/man-pages/pod1/vos.pod index d81af1031b..1ea17e9911 100644 --- a/doc/man-pages/pod1/vos.pod +++ b/doc/man-pages/pod1/vos.pod @@ -237,7 +237,8 @@ L, L, L, L, -L, +L, +L, L, L, L, diff --git a/doc/man-pages/pod1/vos_addsite.pod b/doc/man-pages/pod1/vos_addsite.pod index ac36e8fa5c..1c4d96131a 100644 --- a/doc/man-pages/pod1/vos_addsite.pod +++ b/doc/man-pages/pod1/vos_addsite.pod @@ -1,6 +1,6 @@ =head1 NAME -vos addsite - Adds a read-only site definition to a volume's VLDB entry +vos_addsite - Adds a read-only site definition to a volume's VLDB entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_apropos.pod b/doc/man-pages/pod1/vos_apropos.pod index dce7bf25b5..a0cce8fce0 100644 --- a/doc/man-pages/pod1/vos_apropos.pod +++ b/doc/man-pages/pod1/vos_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -vos apropos - Displays each help entry containing a keyword string +vos_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_backup.pod b/doc/man-pages/pod1/vos_backup.pod index 7de3df8d94..19312dbe7b 100644 --- a/doc/man-pages/pod1/vos_backup.pod +++ b/doc/man-pages/pod1/vos_backup.pod @@ -1,6 +1,6 @@ =head1 NAME -vos backup - Creates a backup volume for a single read/write volume +vos_backup - Creates a backup volume for a single read/write volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_backupsys.pod b/doc/man-pages/pod1/vos_backupsys.pod index e430f6d263..8a12c5a61b 100644 --- a/doc/man-pages/pod1/vos_backupsys.pod +++ b/doc/man-pages/pod1/vos_backupsys.pod @@ -1,6 +1,6 @@ =head1 NAME -vos backupsys - Creates a backup volume for several read/write volumes +vos_backupsys - Creates a backup volume for several read/write volumes =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_changeaddr.pod b/doc/man-pages/pod1/vos_changeaddr.pod index 81a703fde3..02d9fb816f 100644 --- a/doc/man-pages/pod1/vos_changeaddr.pod +++ b/doc/man-pages/pod1/vos_changeaddr.pod @@ -1,6 +1,6 @@ =head1 NAME -vos changeaddr - Changes or removes a file server machine's entry in the VLDB +vos_changeaddr - Changes or removes a file server machine's entry in the VLDB =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_changeloc.pod b/doc/man-pages/pod1/vos_changeloc.pod index ff40f92ff6..079d1dc9d7 100644 --- a/doc/man-pages/pod1/vos_changeloc.pod +++ b/doc/man-pages/pod1/vos_changeloc.pod @@ -1,6 +1,6 @@ =head1 NAME -vos changeloc - Change a volume's entry in the VLDB +vos_changeloc - Change a volume's entry in the VLDB =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_convertROtoRW.pod b/doc/man-pages/pod1/vos_convertROtoRW.pod new file mode 100644 index 0000000000..863ea0da81 --- /dev/null +++ b/doc/man-pages/pod1/vos_convertROtoRW.pod @@ -0,0 +1,122 @@ +=head1 NAME + +vos_convertROtoRW - Converts a Read-Only volume into a Read/Write volume + +=head1 SYNOPSIS + +=for html +
+ +B S<<< [B<-server>] > >>> + S<<< [B<-partition>] > >>> + S<<< [B<-id>] > >>> [B<-force>] + S<<< [B<-cell> >] >>> [B<-noauth>] [B<-localauth>] + [B<-verbose>] [B<-encrypt>] [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +B converts a Read-Only volume into a Read/Write volume +when the original Read/Write volume is no longer available. It's normal use +is to recover the Read/Write volume from a replica after a failed disk, +failed server, or accidental deletion. + +=head1 CAUTIONS + +This command can only be used with namei AFS file servers. If used on an +inode AFS file server, it will fail with an error. + +The command name is case-sensitive. It must be issued with the capital "RO" +and "RW". + +=head1 OPTIONS + +=over 4 + +=item B<-server> > + +Identifies the file server machine that houses the Read-Only volume which +will be converted. Provide the machine's IP address or its host name +(either fully qualified or using an unambiguous abbreviation). For details, +see L. + +=item B<-partition> > + +Identifies the partition on the file server machine that houses the +Read-Only volume which will be converted. Provide the full partition name +(for, example, B) or one of the abbreviated forms described in +L. + +=item B<-id> > + +Specifies either the complete name or volume ID number of a Read/Write +volume. + +=item B<-force> + +Don't ask for confirmation. + +=item B<-cell> > + +Names the cell in which to run the command. Do not combine this argument +with the B<-localauth> flag. For more details, see L. + +=item B<-noauth> + +Assigns the unprivileged identity C to the issuer. Do not +combine this flag with the B<-localauth> flag. For more details, see +L. + +=item B<-localauth> + +Constructs a server ticket using a key from the local +F file. The B command interpreter presents it +to the Volume Server and Volume Location Server during mutual +authentication. Do not combine this flag with the B<-cell> argument or +B<-noauth> flag. For more details, see L. + +=item B<-verbose> + +Produces on the standard output stream a detailed trace of the command's +execution. If this argument is omitted, only warnings and error messages +appear. + +=item B<-encrypt> + +Encrypts the command so that the operation's results are not transmitted +across the network in clear text. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 EXAMPLES + +The following example converts the read-only volume test3.readonly in +partition vicepb on server1 to a read-write volume: + + % vos convertROtoRW server1 b test3.readonly + +=head1 PRIVILEGE REQUIRED + +The issuer must be listed in the F file on the +machines specified with the B<-toserver> and B<-fromserver> arguments and +on each database server machine. If the B<-localauth> flag is included, +the issuer must instead be logged on to a server machine as the local +superuser C. + +=head1 SEE ALSO + +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/vos_copy.pod b/doc/man-pages/pod1/vos_copy.pod new file mode 100644 index 0000000000..1cf7ec69dd --- /dev/null +++ b/doc/man-pages/pod1/vos_copy.pod @@ -0,0 +1,158 @@ +=head1 NAME + +vos_copy - Make a copy of a volume + +=head1 SYNOPSIS + +=for html +
+ +B S<<< [B<-id>] > >>> + S<<< [B<-fromserver>] > >>> + S<<< [B<-frompartition>] > >>> + S<<< [B<-toname>] > >>> + S<<< [B<-toserver>] > >>> + S<<< [B<-topartition>] > >>> + [B<-offline>] [B<-readonly>] [B<-live>] S<<< [B<-cell> >] >>> + [B<-noauth>] [B<-localauth>] [B<-verbose>] [B<-encrypt>] [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +The B command makes a copy of a volume with a new name. It is +equivalent to B followed by B, but doesn't require +the volume be stored locally by the client. + +=head1 OPTIONS + +=over 4 + +=item [B<-id>] > + +Specifies either the complete name or volume ID number of a read/write +volume. + +=item [B<-fromserver>] > + +Identifies the file server machine where the source volume resides. Provide +the machine's IP address or its host name (either fully qualified or using +an unambiguous abbreviation). For details, see L. + +=item [B<-frompartition>] > + +Names the partition where the source volume resides. Provide the full +partition name (for, example, B) or one of the abbreviated forms +described in L. + +=item [B<-toname>] > + +The complete name of the new volume to create. + +=item [B<-toserver>] > + +Identifies the file server machine to which to copy the volume. Provide +the machine's IP address or its host name (either fully qualified or using +an unambiguous abbreviation). For details, see L. + +=item [B<-topartition>] > + +Names the partition to which to copy the volume. Provide the full partition +name (for, example, B) or one of the abbreviated forms described in +L. + +=item B<-offline> + +Leaves the new volume flagged as off-line in the volume database. + +=item B<-readonly> + +Flags the new volume as read-only in the volume database. + +=item B<-live> + +Copies the live volume without cloning. This is normally not necessary and +causes the volume to be kept locked for longer than the normal copy +mechanism. + +=item B<-localauth> + +Constructs a server ticket using a key from the local +F file. The B command interpreter presents it to +the Volume Server and Volume Location Server during mutual +authentication. Do not combine this flag with the B<-cell> argument or +B<-noauth> flag. For more details, see L. + +=item B<-verbose> + +Produces on the standard output stream a detailed trace of the command's +execution. If this argument is omitted, only warnings and error messages +appear. + +=item B<-encrypt> + +Encrypts the command so that the operation's results are not transmitted +across the network in clear text. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 OUTPUT + +This command has no output unless C<-verbose> is specified or there is +an error. + +=head1 EXAMPLES + +The following example makes a verbose copy of the C volume named +C in the cell C. The volume and copy both reside on +C of C. + + % vos copy test server1 a test2 server1 a -cell localcell -verbose + Starting transaction on source volume 536870921 ... done + Allocating new volume id for clone of volume 536870921 ... done + Allocating new volume id for copy of volume 536870921 ... done + Cloning source volume 536870921 ... done + Ending the transaction on the source volume 536870921 ... done + Starting transaction on the cloned volume 536870926 ... done + Setting flags on cloned volume 536870926 ... done + Getting status of cloned volume 536870926 ... done + Creating the destination volume 536870927 ... done + Setting volume flags on destination volume 536870927 ... done + Dumping from clone 536870926 on source to volume 536870927 on destination ... done + Ending transaction on cloned volume 536870926 ... done + Starting transaction on source volume 536870921 ... done + Doing the incremental dump from source to destination for volume 536870921 ... done + Setting volume flags on destination volume 536870927 ... done + Ending transaction on destination volume 536870927 ... done + Ending transaction on source volume 536870921 ... done + Starting transaction on the cloned volume 536870926 ... done + Deleting the cloned volume 536870926 ... done + Ending transaction on cloned volume 536870926 ... done + Created the VLDB entry for the volume test2 536870927 + Volume 536870921 copied from server1 /vicepa to test2 on server1 /vicepa + +=head1 PRIVILEGE REQUIRED + +The issuer must be listed in the F file on the +machine specified with the B<-server> argument and on each database server +machine. If the B<-localauth> flag is included, the issuer must instead be +logged on to a server machine as the local superuser C. + +=head1 SEE ALSO + +L, +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod1/vos_create.pod b/doc/man-pages/pod1/vos_create.pod index 7c2b5ed462..b3a98d4c4a 100644 --- a/doc/man-pages/pod1/vos_create.pod +++ b/doc/man-pages/pod1/vos_create.pod @@ -1,6 +1,6 @@ =head1 NAME -vos create - Creates a read/write volume and associated VLDB entry +vos_create - Creates a read/write volume and associated VLDB entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_delentry.pod b/doc/man-pages/pod1/vos_delentry.pod index 854a22a208..b28bb8c3c1 100644 --- a/doc/man-pages/pod1/vos_delentry.pod +++ b/doc/man-pages/pod1/vos_delentry.pod @@ -1,6 +1,6 @@ =head1 NAME -vos delentry - Removes a volume entry from the VLDB. +vos_delentry - Removes a volume entry from the VLDB. =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_dump.pod b/doc/man-pages/pod1/vos_dump.pod index 0686f732c1..8fdbc7110c 100644 --- a/doc/man-pages/pod1/vos_dump.pod +++ b/doc/man-pages/pod1/vos_dump.pod @@ -1,6 +1,6 @@ =head1 NAME -vos dump - Converts a volume into ASCII format and writes it to a file +vos_dump - Converts a volume into ASCII format and writes it to a file =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_examine.pod b/doc/man-pages/pod1/vos_examine.pod index bfc0ae5be8..6f6c33489c 100644 --- a/doc/man-pages/pod1/vos_examine.pod +++ b/doc/man-pages/pod1/vos_examine.pod @@ -1,6 +1,6 @@ =head1 NAME -vos examine - Shows volume header and VLDB entry information for a volume +vos_examine - Shows volume header and VLDB entry information for a volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_help.pod b/doc/man-pages/pod1/vos_help.pod index 9eda9c52b4..cb51b2dd5a 100644 --- a/doc/man-pages/pod1/vos_help.pod +++ b/doc/man-pages/pod1/vos_help.pod @@ -1,6 +1,6 @@ =head1 NAME -vos help - Displays help for vos commands +vos_help - Displays help for vos commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_listaddrs.pod b/doc/man-pages/pod1/vos_listaddrs.pod index 57ea78bdf9..3e4fbae61c 100644 --- a/doc/man-pages/pod1/vos_listaddrs.pod +++ b/doc/man-pages/pod1/vos_listaddrs.pod @@ -1,6 +1,6 @@ =head1 NAME -vos listaddrs - Displays all VLDB server entries +vos_listaddrs - Displays all VLDB server entries =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_listpart.pod b/doc/man-pages/pod1/vos_listpart.pod index 1498e9727b..e924bd55ff 100644 --- a/doc/man-pages/pod1/vos_listpart.pod +++ b/doc/man-pages/pod1/vos_listpart.pod @@ -1,6 +1,6 @@ =head1 NAME -vos listpart - Displays all AFS partitions on a file server machine +vos_listpart - Displays all AFS partitions on a file server machine =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_listvldb.pod b/doc/man-pages/pod1/vos_listvldb.pod index 9684376664..f9947c62b2 100644 --- a/doc/man-pages/pod1/vos_listvldb.pod +++ b/doc/man-pages/pod1/vos_listvldb.pod @@ -1,6 +1,6 @@ =head1 NAME -vos listvldb - Displays a volume's VLDB entry +vos_listvldb - Displays a volume's VLDB entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_listvol.pod b/doc/man-pages/pod1/vos_listvol.pod index 619c9d2ed0..32d57d57d3 100644 --- a/doc/man-pages/pod1/vos_listvol.pod +++ b/doc/man-pages/pod1/vos_listvol.pod @@ -1,6 +1,6 @@ =head1 NAME -vos listvol - Displays information from a volume header +vos_listvol - Displays information from a volume header =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_lock.pod b/doc/man-pages/pod1/vos_lock.pod index efcaa15654..ef84a5ff19 100644 --- a/doc/man-pages/pod1/vos_lock.pod +++ b/doc/man-pages/pod1/vos_lock.pod @@ -1,6 +1,6 @@ =head1 NAME -vos lock - Locks a VLDB volume entry +vos_lock - Locks a VLDB volume entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_move.pod b/doc/man-pages/pod1/vos_move.pod index 4043481e9c..d52787cbbb 100644 --- a/doc/man-pages/pod1/vos_move.pod +++ b/doc/man-pages/pod1/vos_move.pod @@ -1,6 +1,6 @@ =head1 NAME -vos move - Moves a read/write volume to another site +vos_move - Moves a read/write volume to another site =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_offline.pod b/doc/man-pages/pod1/vos_offline.pod index fd134e81bf..b00a039a6f 100644 --- a/doc/man-pages/pod1/vos_offline.pod +++ b/doc/man-pages/pod1/vos_offline.pod @@ -1,6 +1,6 @@ =head1 NAME -vos offline - Takes a volume offline +vos_offline - Takes a volume offline =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_online.pod b/doc/man-pages/pod1/vos_online.pod index 409af7dcd7..e430a188df 100644 --- a/doc/man-pages/pod1/vos_online.pod +++ b/doc/man-pages/pod1/vos_online.pod @@ -1,6 +1,6 @@ =head1 NAME -vos online - Brings a volume online +vos_online - Brings a volume online =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_partinfo.pod b/doc/man-pages/pod1/vos_partinfo.pod index 2f4959dc6f..c9f37a2ee6 100644 --- a/doc/man-pages/pod1/vos_partinfo.pod +++ b/doc/man-pages/pod1/vos_partinfo.pod @@ -1,6 +1,6 @@ =head1 NAME -vos partinfo - Reports the available and total space on a partition +vos_partinfo - Reports the available and total space on a partition =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_release.pod b/doc/man-pages/pod1/vos_release.pod index 54b5d70574..37a4345ff9 100644 --- a/doc/man-pages/pod1/vos_release.pod +++ b/doc/man-pages/pod1/vos_release.pod @@ -1,6 +1,6 @@ =head1 NAME -vos release - Updates read-only volumes to match the read/write source volume +vos_release - Updates read-only volumes to match the read/write source volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_remove.pod b/doc/man-pages/pod1/vos_remove.pod index a776219b88..820006edda 100644 --- a/doc/man-pages/pod1/vos_remove.pod +++ b/doc/man-pages/pod1/vos_remove.pod @@ -1,6 +1,6 @@ =head1 NAME -vos remove - Removes a volume from a site +vos_remove - Removes a volume from a site =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_remsite.pod b/doc/man-pages/pod1/vos_remsite.pod index a2829bd440..e455f8eed1 100644 --- a/doc/man-pages/pod1/vos_remsite.pod +++ b/doc/man-pages/pod1/vos_remsite.pod @@ -1,6 +1,6 @@ =head1 NAME -vos remsite - Removes a read-only site definition from a VLDB entry +vos_remsite - Removes a read-only site definition from a VLDB entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_rename.pod b/doc/man-pages/pod1/vos_rename.pod index 0939facf49..5480acaf06 100644 --- a/doc/man-pages/pod1/vos_rename.pod +++ b/doc/man-pages/pod1/vos_rename.pod @@ -1,6 +1,6 @@ =head1 NAME -vos rename - Renames a volume +vos_rename - Renames a volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_restore.pod b/doc/man-pages/pod1/vos_restore.pod index 98162e3ed0..e067b460c4 100644 --- a/doc/man-pages/pod1/vos_restore.pod +++ b/doc/man-pages/pod1/vos_restore.pod @@ -1,6 +1,6 @@ =head1 NAME -vos restore - Converts an ASCII dump file into an AFS volume +vos_restore - Converts an ASCII dump file into an AFS volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_size.pod b/doc/man-pages/pod1/vos_size.pod index 8465d9ff96..8259e984dd 100644 --- a/doc/man-pages/pod1/vos_size.pod +++ b/doc/man-pages/pod1/vos_size.pod @@ -1,6 +1,6 @@ =head1 NAME -vos size - Computes the size of a volume dump +vos_size - Computes the size of a volume dump =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_status.pod b/doc/man-pages/pod1/vos_status.pod index 8902bf1db0..61bacef3a9 100644 --- a/doc/man-pages/pod1/vos_status.pod +++ b/doc/man-pages/pod1/vos_status.pod @@ -1,6 +1,6 @@ =head1 NAME -vos status - Reports a Volume Server's status +vos_status - Reports a Volume Server's status =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_syncserv.pod b/doc/man-pages/pod1/vos_syncserv.pod index e6c26b7b93..1367c34823 100644 --- a/doc/man-pages/pod1/vos_syncserv.pod +++ b/doc/man-pages/pod1/vos_syncserv.pod @@ -1,6 +1,6 @@ =head1 NAME -vos syncserv - Verifies VLDB entries that mention a specified site +vos_syncserv - Verifies VLDB entries that mention a specified site =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_syncvldb.pod b/doc/man-pages/pod1/vos_syncvldb.pod index 6b2024aa35..ae3b4a4539 100644 --- a/doc/man-pages/pod1/vos_syncvldb.pod +++ b/doc/man-pages/pod1/vos_syncvldb.pod @@ -1,6 +1,6 @@ =head1 NAME -vos syncvldb - Verifies VLDB entries for volumes residing at specified site +vos_syncvldb - Verifies VLDB entries for volumes residing at specified site =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_unlock.pod b/doc/man-pages/pod1/vos_unlock.pod index 91d86fd080..47b856f7a3 100644 --- a/doc/man-pages/pod1/vos_unlock.pod +++ b/doc/man-pages/pod1/vos_unlock.pod @@ -1,6 +1,6 @@ =head1 NAME -vos unlock - Unlocks a single VLDB entry +vos_unlock - Unlocks a single VLDB entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_unlockvldb.pod b/doc/man-pages/pod1/vos_unlockvldb.pod index f58249ef8c..5c9f8763f7 100644 --- a/doc/man-pages/pod1/vos_unlockvldb.pod +++ b/doc/man-pages/pod1/vos_unlockvldb.pod @@ -1,6 +1,6 @@ =head1 NAME -vos unlockvldb - Unlocks several locked VLDB entries +vos_unlockvldb - Unlocks several locked VLDB entries =head1 SYNOPSIS diff --git a/doc/man-pages/pod1/vos_zap.pod b/doc/man-pages/pod1/vos_zap.pod index 3ee6ea86a3..7a2ed431f7 100644 --- a/doc/man-pages/pod1/vos_zap.pod +++ b/doc/man-pages/pod1/vos_zap.pod @@ -1,6 +1,6 @@ =head1 NAME -vos zap - Removes a volume from its site without writing to the VLDB +vos_zap - Removes a volume from its site without writing to the VLDB =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_adddump.pod b/doc/man-pages/pod8/backup_adddump.pod index d694b8c194..e9a522a5ef 100644 --- a/doc/man-pages/pod8/backup_adddump.pod +++ b/doc/man-pages/pod8/backup_adddump.pod @@ -1,6 +1,6 @@ =head1 NAME -backup adddump - Defines a dump level in the dump hierarchy +backup_adddump - Defines a dump level in the dump hierarchy =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_addhost.pod b/doc/man-pages/pod8/backup_addhost.pod index f48bab8c48..aa3e26a2f8 100644 --- a/doc/man-pages/pod8/backup_addhost.pod +++ b/doc/man-pages/pod8/backup_addhost.pod @@ -1,6 +1,6 @@ =head1 NAME -backup addhost - Adds a Tape Coordinator entry to the Backup Database +backup_addhost - Adds a Tape Coordinator entry to the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_addvolentry.pod b/doc/man-pages/pod8/backup_addvolentry.pod index 9bbb755385..ccf1d6f3ca 100644 --- a/doc/man-pages/pod8/backup_addvolentry.pod +++ b/doc/man-pages/pod8/backup_addvolentry.pod @@ -1,6 +1,6 @@ =head1 NAME -backup addvolentry - Defines a volume entry in a volume set +backup_addvolentry - Defines a volume entry in a volume set =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_addvolset.pod b/doc/man-pages/pod8/backup_addvolset.pod index 1ff05cf5f8..000aaf201a 100644 --- a/doc/man-pages/pod8/backup_addvolset.pod +++ b/doc/man-pages/pod8/backup_addvolset.pod @@ -1,6 +1,6 @@ =head1 NAME -backup addvolset - Creates a new (empty) volume set +backup_addvolset - Creates a new (empty) volume set =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_apropos.pod b/doc/man-pages/pod8/backup_apropos.pod index f13dd9ce3d..060731449a 100644 --- a/doc/man-pages/pod8/backup_apropos.pod +++ b/doc/man-pages/pod8/backup_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -backup apropos - Displays each help entry containing a keyword string +backup_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_dbverify.pod b/doc/man-pages/pod8/backup_dbverify.pod index 53359b911e..0ec5db3c92 100644 --- a/doc/man-pages/pod8/backup_dbverify.pod +++ b/doc/man-pages/pod8/backup_dbverify.pod @@ -1,6 +1,6 @@ =head1 NAME -backup dbverify - Checks the integrity of the Backup Database +backup_dbverify - Checks the integrity of the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_deldump.pod b/doc/man-pages/pod8/backup_deldump.pod index d9de9ee9df..2c9643a65e 100644 --- a/doc/man-pages/pod8/backup_deldump.pod +++ b/doc/man-pages/pod8/backup_deldump.pod @@ -1,6 +1,6 @@ =head1 NAME -backup deldump - Deletes a dump level from the Backup Database +backup_deldump - Deletes a dump level from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_deletedump.pod b/doc/man-pages/pod8/backup_deletedump.pod index a8688b9c08..adc78e8205 100644 --- a/doc/man-pages/pod8/backup_deletedump.pod +++ b/doc/man-pages/pod8/backup_deletedump.pod @@ -1,6 +1,6 @@ =head1 NAME -backup deletedump - Deletes one or more dump records from the Backup Database +backup_deletedump - Deletes one or more dump records from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_delhost.pod b/doc/man-pages/pod8/backup_delhost.pod index 55be623be2..fac5dbec86 100644 --- a/doc/man-pages/pod8/backup_delhost.pod +++ b/doc/man-pages/pod8/backup_delhost.pod @@ -1,6 +1,6 @@ =head1 NAME -backup delhost - Deletes a Tape Coordinator entry from the Backup Database +backup_delhost - Deletes a Tape Coordinator entry from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_delvolentry.pod b/doc/man-pages/pod8/backup_delvolentry.pod index c95b691fb9..cb50628027 100644 --- a/doc/man-pages/pod8/backup_delvolentry.pod +++ b/doc/man-pages/pod8/backup_delvolentry.pod @@ -1,6 +1,6 @@ =head1 NAME -backup delvolentry - Deletes a volume entry from a volume set +backup_delvolentry - Deletes a volume entry from a volume set =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_delvolset.pod b/doc/man-pages/pod8/backup_delvolset.pod index ba273e6e63..50939ff04f 100644 --- a/doc/man-pages/pod8/backup_delvolset.pod +++ b/doc/man-pages/pod8/backup_delvolset.pod @@ -1,6 +1,6 @@ =head1 NAME -backup delvolset - Deletes one or more volume sets from the Backup Database +backup_delvolset - Deletes one or more volume sets from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_diskrestore.pod b/doc/man-pages/pod8/backup_diskrestore.pod index 205493d35a..30f6413011 100644 --- a/doc/man-pages/pod8/backup_diskrestore.pod +++ b/doc/man-pages/pod8/backup_diskrestore.pod @@ -1,6 +1,6 @@ =head1 NAME -backup diskrestore - Restores the entire contents of a partition +backup_diskrestore - Restores the entire contents of a partition =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_dump.pod b/doc/man-pages/pod8/backup_dump.pod index b761f29e15..aa1c95261c 100644 --- a/doc/man-pages/pod8/backup_dump.pod +++ b/doc/man-pages/pod8/backup_dump.pod @@ -1,6 +1,6 @@ =head1 NAME -backup dump - Creates a dump (dumps a volume set at a particular dump level) +backup_dump - Creates a dump (dumps a volume set at a particular dump level) =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_dumpinfo.pod b/doc/man-pages/pod8/backup_dumpinfo.pod index 36aba68a0e..ee12d16c56 100644 --- a/doc/man-pages/pod8/backup_dumpinfo.pod +++ b/doc/man-pages/pod8/backup_dumpinfo.pod @@ -1,6 +1,6 @@ =head1 NAME -backup dumpinfo - Displays a dump record from the Backup Database +backup_dumpinfo - Displays a dump record from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_help.pod b/doc/man-pages/pod8/backup_help.pod index 081a29da23..58e18de687 100644 --- a/doc/man-pages/pod8/backup_help.pod +++ b/doc/man-pages/pod8/backup_help.pod @@ -1,6 +1,6 @@ =head1 NAME -backup help - Displays help for backup commands +backup_help - Displays help for backup commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_interactive.pod b/doc/man-pages/pod8/backup_interactive.pod index 44b4db5ea4..16ee3c0216 100644 --- a/doc/man-pages/pod8/backup_interactive.pod +++ b/doc/man-pages/pod8/backup_interactive.pod @@ -1,6 +1,6 @@ =head1 NAME -backup interactive - Enters interactive mode +backup_interactive - Enters interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_jobs.pod b/doc/man-pages/pod8/backup_jobs.pod index 77adb3d2a8..89e5a17f74 100644 --- a/doc/man-pages/pod8/backup_jobs.pod +++ b/doc/man-pages/pod8/backup_jobs.pod @@ -1,6 +1,6 @@ =head1 NAME -backup jobs - Lists pending and running operations in interactive mode +backup_jobs - Lists pending and running operations in interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_kill.pod b/doc/man-pages/pod8/backup_kill.pod index 08ae8f3a42..8cc1effc6a 100644 --- a/doc/man-pages/pod8/backup_kill.pod +++ b/doc/man-pages/pod8/backup_kill.pod @@ -1,6 +1,6 @@ =head1 NAME -backup kill - Terminates a pending or running operation +backup_kill - Terminates a pending or running operation =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_labeltape.pod b/doc/man-pages/pod8/backup_labeltape.pod index bf06ffe946..8e9655d6be 100644 --- a/doc/man-pages/pod8/backup_labeltape.pod +++ b/doc/man-pages/pod8/backup_labeltape.pod @@ -1,6 +1,6 @@ =head1 NAME -backup labeltape - Creates the magnetic label on a tape +backup_labeltape - Creates the magnetic label on a tape =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_listdumps.pod b/doc/man-pages/pod8/backup_listdumps.pod index c7f7aa867d..508b04327b 100644 --- a/doc/man-pages/pod8/backup_listdumps.pod +++ b/doc/man-pages/pod8/backup_listdumps.pod @@ -1,6 +1,6 @@ =head1 NAME -backup listdumps - Displays the dump hierarchy from the Backup Database +backup_listdumps - Displays the dump hierarchy from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_listhosts.pod b/doc/man-pages/pod8/backup_listhosts.pod index c1213af2be..103b288521 100644 --- a/doc/man-pages/pod8/backup_listhosts.pod +++ b/doc/man-pages/pod8/backup_listhosts.pod @@ -1,6 +1,6 @@ =head1 NAME -backup listhosts - Lists Tape Coordinators registered in the Backup Database +backup_listhosts - Lists Tape Coordinators registered in the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_listvolsets.pod b/doc/man-pages/pod8/backup_listvolsets.pod index 92ae5fc940..ffbd288a46 100644 --- a/doc/man-pages/pod8/backup_listvolsets.pod +++ b/doc/man-pages/pod8/backup_listvolsets.pod @@ -1,6 +1,6 @@ =head1 NAME -backup listvolsets - Lists volume set entries from the Backup Database +backup_listvolsets - Lists volume set entries from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_quit.pod b/doc/man-pages/pod8/backup_quit.pod index e0149426b5..1c356f902a 100644 --- a/doc/man-pages/pod8/backup_quit.pod +++ b/doc/man-pages/pod8/backup_quit.pod @@ -1,6 +1,6 @@ =head1 NAME -backup quit - Leaves interactive mode +backup_quit - Leaves interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_readlabel.pod b/doc/man-pages/pod8/backup_readlabel.pod index 55ba261fe1..a317c6b7d6 100644 --- a/doc/man-pages/pod8/backup_readlabel.pod +++ b/doc/man-pages/pod8/backup_readlabel.pod @@ -1,6 +1,6 @@ =head1 NAME -backup readlabel - Reads and displays a tape's label +backup_readlabel - Reads and displays a tape's label =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_restoredb.pod b/doc/man-pages/pod8/backup_restoredb.pod index ba941c6f15..68a2fa2e4f 100644 --- a/doc/man-pages/pod8/backup_restoredb.pod +++ b/doc/man-pages/pod8/backup_restoredb.pod @@ -1,6 +1,6 @@ =head1 NAME -backup restoredb - Restores a saved copy of the Backup Database +backup_restoredb - Restores a saved copy of the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_savedb.pod b/doc/man-pages/pod8/backup_savedb.pod index 6c3d3e03bb..15ee2215f1 100644 --- a/doc/man-pages/pod8/backup_savedb.pod +++ b/doc/man-pages/pod8/backup_savedb.pod @@ -1,6 +1,6 @@ =head1 NAME -backup savedb - Creates a saved copy of the Backup Database +backup_savedb - Creates a saved copy of the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_scantape.pod b/doc/man-pages/pod8/backup_scantape.pod index ee99d1bb8d..a5e1e54edb 100644 --- a/doc/man-pages/pod8/backup_scantape.pod +++ b/doc/man-pages/pod8/backup_scantape.pod @@ -1,6 +1,6 @@ =head1 NAME -backup scantape - Extracts dump information from a tape +backup_scantape - Extracts dump information from a tape =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_setexp.pod b/doc/man-pages/pod8/backup_setexp.pod index fc06956015..7f741419e6 100644 --- a/doc/man-pages/pod8/backup_setexp.pod +++ b/doc/man-pages/pod8/backup_setexp.pod @@ -1,6 +1,6 @@ =head1 NAME -backup setexp - Sets the expiration date for existing dump levels. +backup_setexp - Sets the expiration date for existing dump levels. =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_status.pod b/doc/man-pages/pod8/backup_status.pod index 9ae180eba3..ba8a5ee5e0 100644 --- a/doc/man-pages/pod8/backup_status.pod +++ b/doc/man-pages/pod8/backup_status.pod @@ -1,6 +1,6 @@ =head1 NAME -backup status - Reports a Tape Coordinator's status +backup_status - Reports a Tape Coordinator's status =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_volinfo.pod b/doc/man-pages/pod8/backup_volinfo.pod index c3ac9d3921..d1a55e8dfc 100644 --- a/doc/man-pages/pod8/backup_volinfo.pod +++ b/doc/man-pages/pod8/backup_volinfo.pod @@ -1,6 +1,6 @@ =head1 NAME -backup volinfo - Displays a volume's dump history from the Backup Database +backup_volinfo - Displays a volume's dump history from the Backup Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_volrestore.pod b/doc/man-pages/pod8/backup_volrestore.pod index 4e27a85336..e52896b3ba 100644 --- a/doc/man-pages/pod8/backup_volrestore.pod +++ b/doc/man-pages/pod8/backup_volrestore.pod @@ -1,6 +1,6 @@ =head1 NAME -backup volrestore - Restores one or more volumes +backup_volrestore - Restores one or more volumes =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/backup_volsetrestore.pod b/doc/man-pages/pod8/backup_volsetrestore.pod index f4afd266a2..fcac347401 100644 --- a/doc/man-pages/pod8/backup_volsetrestore.pod +++ b/doc/man-pages/pod8/backup_volsetrestore.pod @@ -1,6 +1,6 @@ =head1 NAME -backup volsetrestore - Restores all volumes in a volume set +backup_volsetrestore - Restores all volumes in a volume set =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_addhost.pod b/doc/man-pages/pod8/bos_addhost.pod index f5888f52c1..00c540ce94 100644 --- a/doc/man-pages/pod8/bos_addhost.pod +++ b/doc/man-pages/pod8/bos_addhost.pod @@ -1,6 +1,6 @@ =head1 NAME -bos addhost - Adds a database server machine to the CellServDB file +bos_addhost - Adds a database server machine to the CellServDB file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_addkey.pod b/doc/man-pages/pod8/bos_addkey.pod index 6bb70e9253..8a066a52ea 100644 --- a/doc/man-pages/pod8/bos_addkey.pod +++ b/doc/man-pages/pod8/bos_addkey.pod @@ -1,6 +1,6 @@ =head1 NAME -bos addkey - Adds a new server encryption key to the KeyFile file +bos_addkey - Adds a new server encryption key to the KeyFile file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_adduser.pod b/doc/man-pages/pod8/bos_adduser.pod index 4ccaab01fb..148ee8d320 100644 --- a/doc/man-pages/pod8/bos_adduser.pod +++ b/doc/man-pages/pod8/bos_adduser.pod @@ -1,6 +1,6 @@ =head1 NAME -bos adduser - Adds a privileged user to the UserList file +bos_adduser - Adds a privileged user to the UserList file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_apropos.pod b/doc/man-pages/pod8/bos_apropos.pod index 916a3749de..cea38e355e 100644 --- a/doc/man-pages/pod8/bos_apropos.pod +++ b/doc/man-pages/pod8/bos_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -bos apropos - Displays each help entry containing a keyword string +bos_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_create.pod b/doc/man-pages/pod8/bos_create.pod index b6d55f3b7c..4c3cc5c125 100644 --- a/doc/man-pages/pod8/bos_create.pod +++ b/doc/man-pages/pod8/bos_create.pod @@ -1,6 +1,6 @@ =head1 NAME -bos create - Defines a new process in the BosConfig file and starts it +bos_create - Defines a new process in the BosConfig file and starts it =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_delete.pod b/doc/man-pages/pod8/bos_delete.pod index b73bcb1e3a..9b4d558182 100644 --- a/doc/man-pages/pod8/bos_delete.pod +++ b/doc/man-pages/pod8/bos_delete.pod @@ -1,6 +1,6 @@ =head1 NAME -bos delete - Deletes a server process from the BosConfig file +bos_delete - Deletes a server process from the BosConfig file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_exec.pod b/doc/man-pages/pod8/bos_exec.pod index 0cb71941c3..4cdbe4e63b 100644 --- a/doc/man-pages/pod8/bos_exec.pod +++ b/doc/man-pages/pod8/bos_exec.pod @@ -1,6 +1,6 @@ =head1 NAME -bos exec - Executes a command on a remote server machine +bos_exec - Executes a command on a remote server machine =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_getdate.pod b/doc/man-pages/pod8/bos_getdate.pod index d33398e037..f451778c81 100644 --- a/doc/man-pages/pod8/bos_getdate.pod +++ b/doc/man-pages/pod8/bos_getdate.pod @@ -1,6 +1,6 @@ =head1 NAME -bos getdate - Displays the time stamps on an AFS binary file +bos_getdate - Displays the time stamps on an AFS binary file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_getlog.pod b/doc/man-pages/pod8/bos_getlog.pod index bc986e9b63..75d52eb3ae 100644 --- a/doc/man-pages/pod8/bos_getlog.pod +++ b/doc/man-pages/pod8/bos_getlog.pod @@ -1,6 +1,6 @@ =head1 NAME -bos getlog - Prints a server process's log file +bos_getlog - Prints a server process's log file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_getrestart.pod b/doc/man-pages/pod8/bos_getrestart.pod index 51ff8115ac..11de5daa60 100644 --- a/doc/man-pages/pod8/bos_getrestart.pod +++ b/doc/man-pages/pod8/bos_getrestart.pod @@ -1,6 +1,6 @@ =head1 NAME -bos getrestart - Displays the automatic restart times for server processes +bos_getrestart - Displays the automatic restart times for server processes =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_help.pod b/doc/man-pages/pod8/bos_help.pod index 74478c253a..a338c2b447 100644 --- a/doc/man-pages/pod8/bos_help.pod +++ b/doc/man-pages/pod8/bos_help.pod @@ -1,6 +1,6 @@ =head1 NAME -bos help - Displays help for bos commands +bos_help - Displays help for bos commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_install.pod b/doc/man-pages/pod8/bos_install.pod index 08c16d52ad..3b1307b001 100644 --- a/doc/man-pages/pod8/bos_install.pod +++ b/doc/man-pages/pod8/bos_install.pod @@ -1,6 +1,6 @@ =head1 NAME -bos install - Installs a new version of a binary file +bos_install - Installs a new version of a binary file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_listhosts.pod b/doc/man-pages/pod8/bos_listhosts.pod index f4d3f06bdd..9861707425 100644 --- a/doc/man-pages/pod8/bos_listhosts.pod +++ b/doc/man-pages/pod8/bos_listhosts.pod @@ -1,6 +1,6 @@ =head1 NAME -bos listhosts - Displays the contents of the CellServDB file +bos_listhosts - Displays the contents of the CellServDB file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_listkeys.pod b/doc/man-pages/pod8/bos_listkeys.pod index ecb0bf2c8c..11ff9015d4 100644 --- a/doc/man-pages/pod8/bos_listkeys.pod +++ b/doc/man-pages/pod8/bos_listkeys.pod @@ -1,6 +1,6 @@ =head1 NAME -bos listkeys - Displays the server encryption keys from the KeyFile file +bos_listkeys - Displays the server encryption keys from the KeyFile file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_listusers.pod b/doc/man-pages/pod8/bos_listusers.pod index 6b0c1f9f8f..8f3796851a 100644 --- a/doc/man-pages/pod8/bos_listusers.pod +++ b/doc/man-pages/pod8/bos_listusers.pod @@ -1,6 +1,6 @@ =head1 NAME -bos listusers - Lists the privileged users from the UserList file +bos_listusers - Lists the privileged users from the UserList file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_prune.pod b/doc/man-pages/pod8/bos_prune.pod index 0f59596244..b85f96f06c 100644 --- a/doc/man-pages/pod8/bos_prune.pod +++ b/doc/man-pages/pod8/bos_prune.pod @@ -1,6 +1,6 @@ =head1 NAME -bos prune - Removes obsolete files from /usr/afs/bin and /usr/afs/logs +bos_prune - Removes obsolete files from /usr/afs/bin and /usr/afs/logs =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_removehost.pod b/doc/man-pages/pod8/bos_removehost.pod index 1cde179830..eb1410d539 100644 --- a/doc/man-pages/pod8/bos_removehost.pod +++ b/doc/man-pages/pod8/bos_removehost.pod @@ -1,6 +1,6 @@ =head1 NAME -bos removehost - Removes a database server machine from the CellServDB file +bos_removehost - Removes a database server machine from the CellServDB file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_removekey.pod b/doc/man-pages/pod8/bos_removekey.pod index bf08926d45..01e498f5b6 100644 --- a/doc/man-pages/pod8/bos_removekey.pod +++ b/doc/man-pages/pod8/bos_removekey.pod @@ -1,6 +1,6 @@ =head1 NAME -bos removekey - Removes a server encryption key from the KeyFile file +bos_removekey - Removes a server encryption key from the KeyFile file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_removeuser.pod b/doc/man-pages/pod8/bos_removeuser.pod index b3f94414d8..08d9bb277c 100644 --- a/doc/man-pages/pod8/bos_removeuser.pod +++ b/doc/man-pages/pod8/bos_removeuser.pod @@ -1,6 +1,6 @@ =head1 NAME -bos removeuser - Removes a privileged user from the UserList file +bos_removeuser - Removes a privileged user from the UserList file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_restart.pod b/doc/man-pages/pod8/bos_restart.pod index 4dc17b1667..24e66a9d7a 100644 --- a/doc/man-pages/pod8/bos_restart.pod +++ b/doc/man-pages/pod8/bos_restart.pod @@ -1,6 +1,6 @@ =head1 NAME -bos restart - Restarts a server process +bos_restart - Restarts a server process =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_salvage.pod b/doc/man-pages/pod8/bos_salvage.pod index 042dc9b9ef..c9ae4e85f2 100644 --- a/doc/man-pages/pod8/bos_salvage.pod +++ b/doc/man-pages/pod8/bos_salvage.pod @@ -1,6 +1,6 @@ =head1 NAME -bos salvage - Restores internal consistency to a file system or volume +bos_salvage - Restores internal consistency to a file system or volume =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_setauth.pod b/doc/man-pages/pod8/bos_setauth.pod index 6f89b7859e..4ccd9623bc 100644 --- a/doc/man-pages/pod8/bos_setauth.pod +++ b/doc/man-pages/pod8/bos_setauth.pod @@ -1,6 +1,6 @@ =head1 NAME -bos setauth - Sets authorization checking requirements for all server processes +bos_setauth - Sets authorization checking requirements for all server processes =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_setcellname.pod b/doc/man-pages/pod8/bos_setcellname.pod index 6f727dafa9..6d1faefdda 100644 --- a/doc/man-pages/pod8/bos_setcellname.pod +++ b/doc/man-pages/pod8/bos_setcellname.pod @@ -1,6 +1,6 @@ =head1 NAME -bos setcellname - Sets the cell's name in ThisCell and CellServDB +bos_setcellname - Sets the cell's name in ThisCell and CellServDB =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_setrestart.pod b/doc/man-pages/pod8/bos_setrestart.pod index 6110fe8f55..27c18e9e3e 100644 --- a/doc/man-pages/pod8/bos_setrestart.pod +++ b/doc/man-pages/pod8/bos_setrestart.pod @@ -1,6 +1,6 @@ =head1 NAME -bos setrestart - Sets when the BOS Server restarts processes +bos_setrestart - Sets when the BOS Server restarts processes =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_shutdown.pod b/doc/man-pages/pod8/bos_shutdown.pod index 9f30af9ef2..7ccfd6faeb 100644 --- a/doc/man-pages/pod8/bos_shutdown.pod +++ b/doc/man-pages/pod8/bos_shutdown.pod @@ -1,6 +1,6 @@ =head1 NAME -bos shutdown - Stops a process without changing its status flag +bos_shutdown - Stops a process without changing its status flag =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_start.pod b/doc/man-pages/pod8/bos_start.pod index fce2944d83..4be521b52f 100644 --- a/doc/man-pages/pod8/bos_start.pod +++ b/doc/man-pages/pod8/bos_start.pod @@ -1,6 +1,6 @@ =head1 NAME -bos start - Starts a process after setting its status flag +bos_start - Starts a process after setting its status flag =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_startup.pod b/doc/man-pages/pod8/bos_startup.pod index ac10c75b70..7e7a16cf00 100644 --- a/doc/man-pages/pod8/bos_startup.pod +++ b/doc/man-pages/pod8/bos_startup.pod @@ -1,6 +1,6 @@ =head1 NAME -bos startup - Starts a process without changing its status flag +bos_startup - Starts a process without changing its status flag =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_status.pod b/doc/man-pages/pod8/bos_status.pod index 018d58939b..da9088d26e 100644 --- a/doc/man-pages/pod8/bos_status.pod +++ b/doc/man-pages/pod8/bos_status.pod @@ -1,6 +1,6 @@ =head1 NAME -bos status - Displays the status of server processes +bos_status - Displays the status of server processes =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_stop.pod b/doc/man-pages/pod8/bos_stop.pod index da196f22eb..354603c52a 100644 --- a/doc/man-pages/pod8/bos_stop.pod +++ b/doc/man-pages/pod8/bos_stop.pod @@ -1,6 +1,6 @@ =head1 NAME -bos stop - Stops a process after changing its status flag +bos_stop - Stops a process after changing its status flag =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/bos_uninstall.pod b/doc/man-pages/pod8/bos_uninstall.pod index 58ed8502dd..fe20ba5003 100644 --- a/doc/man-pages/pod8/bos_uninstall.pod +++ b/doc/man-pages/pod8/bos_uninstall.pod @@ -1,6 +1,6 @@ =head1 NAME -bos uninstall - Reverts to the former version of a process's binary file +bos_uninstall - Reverts to the former version of a process's binary file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fileserver.pod b/doc/man-pages/pod8/fileserver.pod index 5b82544a67..c29b07b47a 100644 --- a/doc/man-pages/pod8/fileserver.pod +++ b/doc/man-pages/pod8/fileserver.pod @@ -7,8 +7,7 @@ fileserver - Initializes the File Server component of the fs process =for html
-B S<<< [B<-auditlog> >] >>> - S<<< [B<-d> >] >>> +B S<<< [B<-d> >] >>> S<<< [B<-p> >] >>> S<<< [B<-spare> >] >>> S<<< [B<-pctspare> >] >>> S<<< [B<-b> >] >>> @@ -17,7 +16,7 @@ B S<<< [B<-auditlog> >] >>> S<<< [B<-cb> >] >>> [B<-banner>] [B<-novbc>] S<<< [B<-implicit> >] >>> [B<-readonly>] S<<< [B<-hr> >] >>> - [B<-busyat> n >>>] + S<<< [B<-busyat> n >>>] >>> [B<-nobusy>] S<<< [B<-rxpck> >] >>> [B<-rxdbg>] [B<-rxdbge>] S<<< [B<-rxmaxmtu> >] >>> S<<< [B<-rxbind> >] >>> @@ -48,9 +47,9 @@ file server machine as the local superuser C. The File Server creates the F log file as it initializes, if the file does not already exist. It does not write a -detailed trace by default, but use the B<-d> option to increase the amount -of detail. Use the B command to display the contents of the -log file. +detailed trace by default, but the B<-d> option may be used to +increase the amount of detail. Use the B command to +display the contents of the log file. The command's arguments enable the administrator to control many aspects of the File Server's performance, as detailed in L. By default @@ -68,7 +67,7 @@ machine sizes. The maximum number of lightweight processes (LWPs) the File Server uses to handle requests for data; corresponds to the B<-p> argument. The File -Server always uses a minimum of 32 KB for these processes. +Server always uses a minimum of 32 KB of memory for these processes. =item * @@ -168,6 +167,16 @@ the Protection Server every two hours to recompute host CPSs, implying that it can take that long for changed group memberships to become effective. To change this frequency, use the B<-hr> argument. +The File Server stores volumes in partitions. A partition is a +filesystem or directory on the server machine that is named C +or C where XX is "a" through "z" or "aa" though "zz". The +File Server expects that the /vicepXX directories are each on a +dedicated filesystem. The File Server will only use a /vicepXX if it's +a mountpoint for another filesystem, unless the file +C exists. The data in the partition is a +special format that can only be access using OpenAFS commands or an +OpenAFS client. + The File Server generates the following message when a partition is nearly full: @@ -178,12 +187,12 @@ suites. Provide the command name and all option names in full. =head1 CAUTIONS -Do not use the B<-k> and -w arguments, which are intended for use by the -AFS Development group only. Changing them from their default values can -result in unpredictable File Server behavior. In any case, on many -operating systems the File Server uses native threads rather than the LWP -threads, so using the B<-k> argument to set the number of LWP threads has -no effect. +Do not use the B<-k> and B<-w> arguments, which are intended for use +by the AFS Development group only. Changing them from their default +values can result in unpredictable File Server behavior. In any case, +on many operating systems the File Server uses native threads rather +than the LWP threads, so using the B<-k> argument to set the number of +LWP threads has no effect. Do not specify both the B<-spare> and B<-pctspare> arguments. Doing so causes the File Server to exit, leaving an error message in the @@ -398,10 +407,160 @@ line: -cmd "/usr/afs/bin/fileserver -pctspare 10 \ -L" /usr/afs/bin/volserver /usr/afs/bin/salvager + +=head1 TROUBLESHOOTING + +Sending process signals to the File Server Process can change its +behavior in the following ways: + + Process Signal OS Result + --------------------------------------------------------------------- + + File Server XCPU Unix Prints a list of client IP + Addresses. + + File Server USR2 Windows Prints a list of client IP + Addresses. + + File Server POLL HPUX Prints a list of client IP + Addresses. + + Any server TSTP Any Increases Debug level by a power + of 5 -- 1,5,25,125, etc. + This has the same effect as the + -debug XXX command-line option. + + Any Server HUP Any Resets Debug level to 0 + + File Server TERM Any Run minor instrumentation over + the list of descriptors. + + Other Servers TERM Any Causes the process to quit. + + File Server QUIT Any Causes the File Server to Quit. + Bos Server knows this. + +The basic metric of whether an AFS file server is doing well is the number +of connections waiting for a thread, +which can be found by running the following command: + + % rxdebug | grep waiting_for | wc -l + +Each line returned by C that contains the text "waiting_for" +represents a connection that's waiting for a file server thread. + +If the blocked connection count is ever above 0, the server is having +problems replying to clients in a timely fashion. If it gets above 10, +roughly, there will be noticable slowness by the user. The total number of +connections is a mostly irrelevant number that goes essentially +monotonically for as long as the server has been running and then goes back +down to zero when it's restarted. + +The most common cause of blocked connections rising on a server is some +process somewhere performing an abnormal number of accesses to that server +and its volumes. If multiple servers have a blocked connection count, the +most likely explanation is that there is a volume replicated between those +servers that is absorbing an abnormally high access rate. + +To get an access count on all the volumes on a server, run: + + % vos listvol -long + +and save the output in a file. The results will look like a bunch of B output for each volume on the server. Look for lines like: + + 40065 accesses in the past day (i.e., vnode references) + +and look for volumes with an abnormally high number of accesses. Anything +over 10,000 is fairly high, but some volumes like root.cell and other +volumes close to the root of the cell will have that many hits routinely. +Anything over 100,000 is generally abnormally high. The count resets about +once a day. + +Another approach that can be used to narrow the possibilities for a +replicated volume, when multiple servers are having trouble, is to find all +replicated volumes for that server. Run: + + % vos listvldb -server + +where is one of the servers having problems to refresh the VLDB +cache, and then run: + + % vos listvldb -server -part + +to get a list of all volumes on that server and partition, including every +other server with replicas. + +Once the volume causing the problem has been identified, the best way to +deal with the problem is to move that volume to another server with a low +load or to stop any runaway programs that are accessing that volume +unnecessarily. Often the volume will be enough information to tell what's +going on. + +If you still need additional information about who's hitting that server, +sometimes you can guess at that information from the failed callbacks in the +F log in F on the server, or from the output of: + + % /usr/afsws/etc/rxdebug -rxstats + +but the best way is to turn on debugging output from the file server. +(Warning: This generates a lot of output into FileLog on the AFS server.) +To do this, log on to the AFS server, find the PID of the fileserver +process, and do: + + kill -TSTP + +where is the PID of the file server process. This will raise the +debugging level so that you'll start seeing what people are actually doing +on the server. You can do this up to three more times to get even more +output if needed. To reset the debugging level back to normal, use (The +following command will NOT terminate the file server): + + kill -HUP + +The debugging setting on the File Server should be reset back to normal when +debugging is no longer needed. Otherwise, the AFS server may well fill its +disks with debugging output. + +The lines of the debugging output that are most useful for debugging load +problems are: + + SAFS_FetchStatus, Fid = 2003828163.77154.82248, Host 171.64.15.76 + SRXAFS_FetchData, Fid = 2003828163.77154.82248 + +(The example above is partly truncated to highlight the interesting +information). The Fid identifies the volume and inode within the volume; +the volume is the first long number. So, for example, this was: + + % vos examine 2003828163 + pubsw.matlab61 2003828163 RW 1040060 K On-line + afssvr5.Stanford.EDU /vicepa + RWrite 2003828163 ROnly 2003828164 Backup 2003828165 + MaxQuota 3000000 K + Creation Mon Aug 6 16:40:55 2001 + Last Update Tue Jul 30 19:00:25 2002 + 86181 accesses in the past day (i.e., vnode references) + + RWrite: 2003828163 ROnly: 2003828164 Backup: 2003828165 + number of sites -> 3 + server afssvr5.Stanford.EDU partition /vicepa RW Site + server afssvr11.Stanford.EDU partition /vicepd RO Site + server afssvr5.Stanford.EDU partition /vicepa RO Site + +and from the Host information one can tell what system is accessing that +volume. + +Note that the output of L also includes the access count, so +once the problem has been identified, vos examine can be used to see if the +access count is still increasing. Also remember that you can run vos +examine on the read-only replica (e.g., pubsw.matlab61.readonly) to see the +access counts on the read-only replica on all of the servers that it's +located on. + =head1 PRIVILEGE REQUIRED The issuer must be logged in as the superuser C on a file server -machine to issue the command at a command shell prompt. It is conventional +machine to issue the command at a command shell prompt. It is conventional instead to create and start the process by issuing the B command. @@ -413,7 +572,8 @@ L, L, L, L, -L +L, +L =head1 COPYRIGHT diff --git a/doc/man-pages/pod8/fstrace_apropos.pod b/doc/man-pages/pod8/fstrace_apropos.pod index 777d94b464..f24c8c3785 100644 --- a/doc/man-pages/pod8/fstrace_apropos.pod +++ b/doc/man-pages/pod8/fstrace_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace apropos - Displays each help entry containing a keyword string +fstrace_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_clear.pod b/doc/man-pages/pod8/fstrace_clear.pod index b265d39f20..7de9e6bac2 100644 --- a/doc/man-pages/pod8/fstrace_clear.pod +++ b/doc/man-pages/pod8/fstrace_clear.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace clear - Clears the trace log +fstrace_clear - Clears the trace log =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_dump.pod b/doc/man-pages/pod8/fstrace_dump.pod index 59da7a3873..81d659d8b8 100644 --- a/doc/man-pages/pod8/fstrace_dump.pod +++ b/doc/man-pages/pod8/fstrace_dump.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace dump - Dumps a trace log +fstrace_dump - Dumps a trace log =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_help.pod b/doc/man-pages/pod8/fstrace_help.pod index 7c3732fcae..4a5912a373 100644 --- a/doc/man-pages/pod8/fstrace_help.pod +++ b/doc/man-pages/pod8/fstrace_help.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace help - Displays help for fstrace commands +fstrace_help - Displays help for fstrace commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_lslog.pod b/doc/man-pages/pod8/fstrace_lslog.pod index 108e01974d..41289cff89 100644 --- a/doc/man-pages/pod8/fstrace_lslog.pod +++ b/doc/man-pages/pod8/fstrace_lslog.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace lslog - Displays information about a log +fstrace_lslog - Displays information about a log =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_lsset.pod b/doc/man-pages/pod8/fstrace_lsset.pod index 34ed0be1a5..4d822acd14 100644 --- a/doc/man-pages/pod8/fstrace_lsset.pod +++ b/doc/man-pages/pod8/fstrace_lsset.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace lsset - Reports the status of an event set +fstrace_lsset - Reports the status of an event set =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_setlog.pod b/doc/man-pages/pod8/fstrace_setlog.pod index ccf9dce6d7..c82962d61f 100644 --- a/doc/man-pages/pod8/fstrace_setlog.pod +++ b/doc/man-pages/pod8/fstrace_setlog.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace setlog - Sets the size of a trace log +fstrace_setlog - Sets the size of a trace log =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/fstrace_setset.pod b/doc/man-pages/pod8/fstrace_setset.pod index dcb47df495..808e76693d 100644 --- a/doc/man-pages/pod8/fstrace_setset.pod +++ b/doc/man-pages/pod8/fstrace_setset.pod @@ -1,6 +1,6 @@ =head1 NAME -fstrace setset - Sets the status of an event set +fstrace_setset - Sets the status of an event set =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_apropos.pod b/doc/man-pages/pod8/kas_apropos.pod index 27ced0fe27..3a3a1600e8 100644 --- a/doc/man-pages/pod8/kas_apropos.pod +++ b/doc/man-pages/pod8/kas_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -kas apropos - Displays each help entry containing a keyword string +kas_apropos - Displays each help entry containing a keyword string =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_create.pod b/doc/man-pages/pod8/kas_create.pod index e567eb35d5..4f7491d515 100644 --- a/doc/man-pages/pod8/kas_create.pod +++ b/doc/man-pages/pod8/kas_create.pod @@ -1,6 +1,6 @@ =head1 NAME -kas create - Creates an entry in the Authentication Database +kas_create - Creates an entry in the Authentication Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_delete.pod b/doc/man-pages/pod8/kas_delete.pod index f4288005cf..9596d38605 100644 --- a/doc/man-pages/pod8/kas_delete.pod +++ b/doc/man-pages/pod8/kas_delete.pod @@ -1,6 +1,6 @@ =head1 NAME -kas delete - Deletes an entry from the Authentication Database +kas_delete - Deletes an entry from the Authentication Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_examine.pod b/doc/man-pages/pod8/kas_examine.pod index 1f09c7491b..ea62738c4b 100644 --- a/doc/man-pages/pod8/kas_examine.pod +++ b/doc/man-pages/pod8/kas_examine.pod @@ -1,6 +1,6 @@ =head1 NAME -kas examine - Displays information from an Authentication Database entry +kas_examine - Displays information from an Authentication Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_forgetticket.pod b/doc/man-pages/pod8/kas_forgetticket.pod index 6fe84065ec..d9851290fb 100644 --- a/doc/man-pages/pod8/kas_forgetticket.pod +++ b/doc/man-pages/pod8/kas_forgetticket.pod @@ -1,6 +1,6 @@ =head1 NAME -kas forgetticket - Discards all tickets for the issuer +kas_forgetticket - Discards all tickets for the issuer =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_help.pod b/doc/man-pages/pod8/kas_help.pod index 9e4f0cf0ca..a65a6694ea 100644 --- a/doc/man-pages/pod8/kas_help.pod +++ b/doc/man-pages/pod8/kas_help.pod @@ -1,6 +1,6 @@ =head1 NAME -kas help - Displays help for kas commands +kas_help - Displays help for kas commands =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_interactive.pod b/doc/man-pages/pod8/kas_interactive.pod index 8ea2031426..bf7371564f 100644 --- a/doc/man-pages/pod8/kas_interactive.pod +++ b/doc/man-pages/pod8/kas_interactive.pod @@ -1,6 +1,6 @@ =head1 NAME -kas interactive - Enters interactive mode +kas_interactive - Enters interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_list.pod b/doc/man-pages/pod8/kas_list.pod index 088993eb7e..59d21ff5bd 100644 --- a/doc/man-pages/pod8/kas_list.pod +++ b/doc/man-pages/pod8/kas_list.pod @@ -1,6 +1,6 @@ =head1 NAME -kas list - Displays all entries in the Authentication Database +kas_list - Displays all entries in the Authentication Database =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_listtickets.pod b/doc/man-pages/pod8/kas_listtickets.pod index 126b3d309e..8661c188f8 100644 --- a/doc/man-pages/pod8/kas_listtickets.pod +++ b/doc/man-pages/pod8/kas_listtickets.pod @@ -1,6 +1,6 @@ =head1 NAME -kas listtickets - Displays all of the issuer's tickets (tokens) +kas_listtickets - Displays all of the issuer's tickets (tokens) =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_noauthentication.pod b/doc/man-pages/pod8/kas_noauthentication.pod index f55f5f84b0..5b34d53b0d 100644 --- a/doc/man-pages/pod8/kas_noauthentication.pod +++ b/doc/man-pages/pod8/kas_noauthentication.pod @@ -1,6 +1,6 @@ =head1 NAME -kas noauthentication - Discards an authenticated identity in interactive mode +kas_noauthentication - Discards an authenticated identity in interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_quit.pod b/doc/man-pages/pod8/kas_quit.pod index 3ecd0cedff..ee8eec1137 100644 --- a/doc/man-pages/pod8/kas_quit.pod +++ b/doc/man-pages/pod8/kas_quit.pod @@ -1,6 +1,6 @@ =head1 NAME -kas quit - Leaves interactive mode +kas_quit - Leaves interactive mode =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_setfields.pod b/doc/man-pages/pod8/kas_setfields.pod index cb45b8c7b0..2171a7b569 100644 --- a/doc/man-pages/pod8/kas_setfields.pod +++ b/doc/man-pages/pod8/kas_setfields.pod @@ -1,6 +1,6 @@ =head1 NAME -kas setfields - Sets fields in an Authentication Database entry +kas_setfields - Sets fields in an Authentication Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_setpassword.pod b/doc/man-pages/pod8/kas_setpassword.pod index 897424dba1..62839d1127 100644 --- a/doc/man-pages/pod8/kas_setpassword.pod +++ b/doc/man-pages/pod8/kas_setpassword.pod @@ -1,6 +1,6 @@ =head1 NAME -kas setpassword - Changes the key field in an Authentication Database entry +kas_setpassword - Changes the key field in an Authentication Database entry =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_statistics.pod b/doc/man-pages/pod8/kas_statistics.pod index 389429c31f..fff0a6da63 100644 --- a/doc/man-pages/pod8/kas_statistics.pod +++ b/doc/man-pages/pod8/kas_statistics.pod @@ -1,6 +1,6 @@ =head1 NAME -kas statistics - Displays statistics from an Authentication Server process +kas_statistics - Displays statistics from an Authentication Server process =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_stringtokey.pod b/doc/man-pages/pod8/kas_stringtokey.pod index 0f5d00bbae..f9bb7fe2f1 100644 --- a/doc/man-pages/pod8/kas_stringtokey.pod +++ b/doc/man-pages/pod8/kas_stringtokey.pod @@ -1,6 +1,6 @@ =head1 NAME -kas stringtokey - Converts a character string into an octal key +kas_stringtokey - Converts a character string into an octal key =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/kas_unlock.pod b/doc/man-pages/pod8/kas_unlock.pod index df37e613c3..e7c22f54db 100644 --- a/doc/man-pages/pod8/kas_unlock.pod +++ b/doc/man-pages/pod8/kas_unlock.pod @@ -1,6 +1,6 @@ =head1 NAME -kas unlock - Unlocks a locked user account +kas_unlock - Unlocks a locked user account =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/read_tape.pod b/doc/man-pages/pod8/read_tape.pod new file mode 100644 index 0000000000..d3aa433ff6 --- /dev/null +++ b/doc/man-pages/pod8/read_tape.pod @@ -0,0 +1,106 @@ +=head1 NAME + +read_tape - Reads volume dumps from a backup tape to a file + +=head1 SYNOPSIS + +=for html +
+ +B S<<< B<-tape> > >>> + S<<< B<-restore> > >>> + S<<< B<-skip> > >>> + S<<< B<-file> > >>> [B<-scan>] [B<-noask>] [B<-label>] + [B<-vheaders>] [B<-verbose>] [B<-help>] + +=for html +
+ +=head1 DESCRIPTION + +B reads an OpenAFS backup tape and prompts for each dump file to +save. This command does not require any OpenAFS infrastructure. This +command does not need an OpenAFS client or server to be available, which is +not the case with the L command. + +The dump files will be named for the Read/Write name of the volume restored. +After saving each dump file, B or B can be used to +restore the volume into AFS and non-AFS space respectively. + +B reads the tape while skipping the specified number of volumes. +After that, it restores the specified number of volumes. B +doesn't rewind the tape so that it may be used multiple times in succession. + +=head1 OPTIONS + +=over 4 + +=item B<-tape> > + +Specifies the tape device from which to restore. + +=item B<-restore> > + +Specifies the number of volumes to restore from tape. + +=item B<-skip> > + +Specifies the number of volumes to skip before starting the restore. + +=item B<-file> > + +Specifies an alternate name for the restored volume dump file rather than +the default of the volume name. + +=item B<-scan> + +Scans the tape. + +=item B<-noask> + +Doesn't prompt for each volume. + +=item B<-label> + +Displays the full dump label. + +=item B<-vheaders> + +Displays the full volume headers. + +=item B<-verbose> + +Produces on the standard output stream a detailed trace of the command's +execution. If this argument is omitted, only warnings and error messages +appear. + +=item B<-help> + +Prints the online help for this command. All other valid options are +ignored. + +=back + +=head1 EXAMPLES + +The following command will read the third through fifth volumes from +the tape device /dev/tape without prompting: + + % read_tape -tape /dev/tape -skip 2 -restore 3 -noask + +=head1 PRIVILEGE REQUIRED + +The issuer must have access to read and write to the specified tape device. + +=head1 SEE ALSO + +L, +L, +L + +=head1 COPYRIGHT + +Copyright 2007 Jason Edgecombe + +This documentation is covered by the IBM Public License Version 1.0. This +man page was written by Jason Edgecombe for OpenAFS. diff --git a/doc/man-pages/pod8/uss_add.pod b/doc/man-pages/pod8/uss_add.pod index 3babd7b351..0724f95918 100644 --- a/doc/man-pages/pod8/uss_add.pod +++ b/doc/man-pages/pod8/uss_add.pod @@ -1,6 +1,6 @@ =head1 NAME -uss add - Creates a user account +uss_add - Creates a user account =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/uss_apropos.pod b/doc/man-pages/pod8/uss_apropos.pod index e0a8f8e938..1977669400 100644 --- a/doc/man-pages/pod8/uss_apropos.pod +++ b/doc/man-pages/pod8/uss_apropos.pod @@ -1,6 +1,6 @@ =head1 NAME -uss apropos - Displays each help entry containing a keyword string. +uss_apropos - Displays each help entry containing a keyword string. =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/uss_bulk.pod b/doc/man-pages/pod8/uss_bulk.pod index 9fbcbafc9c..6de7bbef4f 100644 --- a/doc/man-pages/pod8/uss_bulk.pod +++ b/doc/man-pages/pod8/uss_bulk.pod @@ -1,6 +1,6 @@ =head1 NAME -uss bulk - Executes multiple uss commands listed in a file +uss_bulk - Executes multiple uss commands listed in a file =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/uss_delete.pod b/doc/man-pages/pod8/uss_delete.pod index 0eb549d2c6..1828bc7186 100644 --- a/doc/man-pages/pod8/uss_delete.pod +++ b/doc/man-pages/pod8/uss_delete.pod @@ -1,6 +1,6 @@ =head1 NAME -uss delete - Deletes a user account +uss_delete - Deletes a user account =head1 SYNOPSIS diff --git a/doc/man-pages/pod8/uss_help.pod b/doc/man-pages/pod8/uss_help.pod index dc309c1eed..b33792667f 100644 --- a/doc/man-pages/pod8/uss_help.pod +++ b/doc/man-pages/pod8/uss_help.pod @@ -1,6 +1,6 @@ =head1 NAME -uss help - Displays help for uss commands +uss_help - Displays help for uss commands =head1 SYNOPSIS diff --git a/doc/txt/winnotes/afs-changes-since-1.2.txt b/doc/txt/winnotes/afs-changes-since-1.2.txt index 10a76cce76..14188796a3 100644 --- a/doc/txt/winnotes/afs-changes-since-1.2.txt +++ b/doc/txt/winnotes/afs-changes-since-1.2.txt @@ -1,3 +1,213 @@ +Since 1.5.27 + * The GiveUpAllCallBacks functionality that was added in 1.5.21 + has been disabled. It has been disabled because it turns out + that the RPC is improperly implemented in all file servers + previous to 1.4.6. The RPC is executed without the proper + locks being held resulting in data corruption and eventual file + server failure. The functionality will be re-enabled in a + a few months. + + * a couple of .readonly Volume Callback optimizations were + implemented: + - Apply most recent volume callback to all stat cache objects + in the volume. This avoids premature callback expirations + and unnecessary FetchStatus calls. + - Add option to permit attempts to renew .readonly Volume + Callbacks on a periodic basis to avoid invalidation of stat + cache data. [Requires daemonCheckVolCBInterval be set to + non-zero number of seconds. 1800 (30 minutes) is suggested.] + + * Adds support for 64-bit data version values. Previous releases + only supported 32-bit values. Larger values sent by the file server + would result in rollover. + + * aklog and asetkey no longer generate an exception if Kerberos for + Windows is not installed. + + * If the LSA authentication functions report a temporary out of memory + condition, fail the current authentication and do not cause the AFS + client service to terminate unexpectedly. + + * When the AFS client service is shutting down, prevent the daemon check + thread from executing additional checks which might attempt to access + discarded locks or unmapped memory. + + * Correct a double free condition in the NIM AFS credentials provider. + + * Add "FollowBackupPath" service parameter registry value. + This provides equivalent functionality to the UNIX afsd -backuptree + option. When set to a non-zero value, normal mount points originating + in a .backup volume will prefer a .backup volume. + +Since 1.5.26 + * Fix NSIS uninstall from the .MSI installer. + + * Add Stack Frame logging for AMD64 + + * Add support for EWOULDBLOCK to cm_Analyze. If the file + server returns EWOULDBLOCK, retry the request every two + seconds for up to the RDRtimeout. + + * Reorganize the order of the includes to ensure that EWOULDBLOCK + is not assigned the same value as EIO. + + * Update CellServDB to GCO Public 25 Oct 2007 + + * Add additional validation and error handling code after + each call to getSlot(). If an invalid slot is returned, + return NONODE. If the invalid slot is returned when + extracting a data node, invalidate the tree. + + * Modify compareKeys() to always perform a case-insensitive + comparison and only perform a case sensistive comparison + if the case-insensitive one matches. This ensures the + ordering is consistently reported. + + * Add lock assertions to ensure that all calls are being + performed with the correct locks being held. There have been + some crash reports that provide stack data that does not appear + to be possible unless there is a race. However, there are no + obvious locations where the race is taking place and the test + suite indicates that all of the correct locks are being held. + We shall see what happens in the field. + + * For consistency replace all calls to findKey in which the range i + s (1,numentries) with calls to getSlot(). + + * Optimize the depth search loop by testing the slot value in the + for statement instead of forcing the loop to be broken later. + + * Reorganize the locking for cm_BeginDirOp and cm_EndDirOp. + There are a number of locations where locks are obtained, dropped, + and reobtained. This reorganization attempts to accomplish several + things: + + (1) be optimistic for the most common case so it will be fast + + (2) add consistency checks after each location where locks are + dropped and re-obtained. If we lose a race in cm_BeginDirOp + and the bplus tree is out of date, retry until we get to a + consistent state that we can use. + + (3) Ensure that all operations take place with the correct locks. + + * One of the issues that has become a serious problem since the + addition of the local directory updates is that although cm_SyncOp + synchronizes operations, it does not preserve the order of requests. + This has always been a problem in that it has been possible for a + request to fail to complete due to its worker thread's bad luck. + When a request takes longer than the Windows SMB Redirector's timeout, + the SMB Redirector tears down the SMB virtual circuit. + + When using the local directory updates it is really important that + the directory update operations complete in the order that they were + sent to the file server. If they don't, then the local directory state + and the file server state will not match and the local directory state + must be discarded which in turn forces a new read of the entire + directory contents over the network. + + This patch adds a new cm_scache_waiter_t object that is used to store + the current thread, buffer, and syncop flags within a waiters queue + on each cm_scache_t object. If a thread is forced to sleep in + cm_SyncOp, upon waking it will check to see if there are any other + threads waiting that are attempting to perform a similar task ahead + of it in the queue. If yes, the thread goes back to sleep. If not, + it goes ahead and enters the cm_SyncOp conflict resolution block. + + This patch has the additional side effect of reducing the number of + competing threads that must obtain the cm_scache_t mutex and process + the cm_SyncOp conflict resolution block. As a result, the overall CPU + utilization of the service and the clock time associated with processing + requests will be reduced. + + * assert that the cm_scache_t mutex is held when calling + buf_ForceDataVersion(). + + * rename findNode to leafNode in bplus_Lookup + + * replace all OutputDebugString calls with osi_LogX calls + + * modify bestMatch to special case the return values for leaf nodes. + If an entry is above or below the values available in the leaf node + return BTLOWER or BTUPPER instead of BTERROR. + + * In insert and delete operations check for BTLOWER/BTUPPER and isleaf, + if true convert to either slot 0 or Max and perform the insertion. + This produces easier to read code when performing lookups. + + * modify lock_AssertXXX macros to call osi_assertx() and provide a + descriptive message. + + * the difference between osi_assert() and osi_assertx() is whether or not + a description is specified as part of the call. When no message is + specified afsd_notifier() is called with a NULL msgp parameter. This + results in a null pointer dereference during the EventLog() call. + + As a result, none of the information describing the assertion is written + to the log file. + + This commit sets a default message for use when no other message is + provided and it replaces all calls to osi_assert with osi_assertx and + adds descriptions. + + * Migrate B+ tree search key into thread local storage + +Since 1.5.25 + * Fix an uninitialized variable in lana_IsLoopback() which + could result in a random determination that a loopback + adapter is not a loopback adapter. This would result in + a computed Netbios service name of %MACHINE%-AFS instead + of AFS. This is a serious problem if the value computed + by the AFS Client Service and the client process pioctl + calls produce different results as it will result in a + communication failure. + + * Fix a crash in the B+ Tree code that results when a file + rename only results in a change of case. + + * Fix the pioctl path parsing. The previous algorithm + broke the current directory of the client into two parts, + the TIDpath which represented the device root and the + relative path. The problem is that this is not sufficient + from proper processing of symlinks and mount points. + + What is required is that the last component of the path + must not have the symlink or mount point be evaluated + whereas symlink and mount point evaluation must be performed + for the rest of the relative path. Therefore, the path is + now split into three parts: TIDpath, intermediate path, + and last component. + + "fs examine" now reports the data of the symlink or mount + point object instead of the target and "symlink list" and + "symlink remove" now works. The "Explorer Shell Extension" + menu now is displayed for symlink objects. + + * More informative symlink.exe error messages. + + * When the cmd.exe "del" command is used to remove a symlink, + not only was the link object removed, but the stat cache + object for the target was marked deleted. This resulted + in cache corruption which would require the destruction + of the cache to correct. + + * Add undocumented registry value, "OfflineReadOnlyIsValid" + which results in cached contents from read only volumes + to be treated as valid when there is no callback registered + and all servers are down or all instances are offline. + + HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters + + * Add documented registry value, "AcceptDottedPrincipalNames" + which is used to permit the acquisition of AFS tokens + using Kerberos v5 principal names which include a dot in + the first component. + + {HKLM\HKCU}\Software\OpenAFS\Client + + * "fs uuid" does not require "AFS Client Administrator" group + membership to display the current UUID value. + Since 1.5.24 * Update NSIS installer to version 2.30 diff --git a/doc/txt/winnotes/afs-issues.txt b/doc/txt/winnotes/afs-issues.txt index 97aa380682..095df49fe9 100644 --- a/doc/txt/winnotes/afs-issues.txt +++ b/doc/txt/winnotes/afs-issues.txt @@ -1,4 +1,4 @@ -This file is a rough list of known issues with the 1.5.23 release of OpenAFS +This file is a rough list of known issues with the 1.5.27 release of OpenAFS on Windows. This list is not complete. There are probably other issues which can be found in the RT database or on the mailing list. diff --git a/src/NTMake9x b/src/NTMake9x deleted file mode 100644 index 6be23b41fb..0000000000 --- a/src/NTMake9x +++ /dev/null @@ -1,332 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# Top level nmake NTMakefile driver for building AFS. -# -# This file simply imposes a reasonable total ordering on the set of -# directories to build; this ordering is of course more strict than the -# partial ordering established by the actual directory dependencies. -# -# When porting a new directory, simply add the directory into the -# dependence chain at the earliest point possible, updating its successor -# appropriately; if the new directory is the last in the chain, then -# update the 'finale' dependency to be the new directory. - - -CD = cd -NTMAKE = nmake /nologo /f ntmakefile install9x -NTMAKELANG = nmake /nologo /f ntmakefile en_install -NTMAKE_HEADERS = nmake /nologo /f ntmakefile install_headers -NTMAKE_LIBUTILS = nmake /nologo /f ntmakefile install_libutils -NTMAKE_OBJS = nmake /nologo /f ntmakefile install_objs -MKDIR = mkdir -OBJ = src - -# Standard install directory. -!IFDEF AFSDEV_DESTDIR -DESTDIR = $(AFSDEV_DESTDIR) -!ELSE -DESTDIR = $(AFSROOT)\DEST -!ENDIF - - -start: -! IF (!EXIST(src)) -! ERROR Execute nmake from directory above src, e.g., afs\3.5. -! ENDIF -! IF (!EXIST($(DESTDIR))) - $(MKDIR) $(DESTDIR) -! ENDIF - -config: start - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -procmgmt_headers: config - echo ***** $@ - $(CD) $(OBJ)\procmgmt - $(NTMAKE_HEADERS) - $(CD) ..\.. - -afsreg_headers: config - echo ***** $@ - $(CD) $(OBJ)\WINNT\afsreg - $(NTMAKE_HEADERS) - $(CD) ..\..\.. - -util: procmgmt_headers afsreg_headers - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -comerr: util - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -cmd: comerr - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -afsreg: cmd - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - -eventlog: afsreg - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - -lwp: eventlog - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -rxgen: lwp - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -des: rxgen - echo ***** $@ -! IF (EXIST($(OBJ)\des\NTMakefile)) - $(CD) $(OBJ)\des - $(NTMAKE) - $(CD) ..\.. -! ELSE - $(CD) $(OBJ)\des_stub - $(NTMAKE) - $(CD) ..\.. -! ENDIF - -rx: des - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -rxstat: rx - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -rxkad: rxstat - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -pthread: rxkad - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - -procmgmt: pthread - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -fsint: procmgmt - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -audit: fsint - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -osi_headers: audit - echo ***** $@ - $(CD) $(OBJ)\WINNT\client_osi - $(NTMAKE_HEADERS) - $(CD) ..\..\.. - -libacl_headers: osi_headers - echo ***** $@ - $(CD) $(OBJ)\libacl - $(NTMAKE_HEADERS) - $(CD) ..\.. - -cm_headers: libacl_headers - echo ***** $@ - $(CD) $(OBJ)\WINNT\afsd - $(NTMAKE_HEADERS) - $(CD) ..\..\.. - -sys: cm_headers - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -afsdobjs: sys - echo ***** $@ - $(CD) $(OBJ)\WINNT\afsd - $(NTMAKE_OBJS) - $(CD) ..\..\.. - -auth: afsdobjs - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -ubik: auth - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -ptserver: ubik - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE_LIBUTILS) - $(CD) ..\.. - -libacl: ptserver - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -kauth: libacl - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -vlserver: kauth - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE_LIBUTILS) - $(CD) ..\.. - -usd: vlserver - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -libafsrpc: usd - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -libafsauthent: libafsrpc - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -libadmin: libafsauthent - echo ***** $@ - $(CD) $(OBJ)\$@ - $(NTMAKE) - $(CD) ..\.. - -client_talocale: libadmin - echo ***** $@ - $(CD) $(OBJ)\WINNT\talocale - $(NTMAKE) - $(CD) ..\..\.. - -client_osi: client_talocale - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - -afsd: client_osi - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE_LIBUTILS) - $(CD) ..\..\.. - -client_cpa: afsd - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - -client_config: client_cpa - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - -client_exp: client_config - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - - -#Leave last echo in - it helps the build reconize the last $(CD) -win9xpanel : - echo ***** $@ - $(CD) $(OBJ)\WINNT\$@ - $(NTMAKE) - $(CD) ..\..\.. - echo ***** End of Build - -install: start client_exp win9xpanel - -install9x: install - -# InstallShield dependencies - -#Leave last echo in - it helps the build reconize the last $(CD) -Win9x:: - echo ***** afs_setup_utils - $(CD) $(OBJ)\WINNT\afs_setup_utils - nmake -f ntmakefile install - $(CD) ..\..\.. - echo ***** Win9x - $(CD) $(OBJ)\WINNT\install\Win9x - nmake /nologo /f NTMakefile isinstall - $(CD) ..\..\..\.. - echo **** End of Install Scripts - -media: Win9x - -# Clean target for obj tree -# Fake the version copy so clean will go through the complete cycle with undefines -clean: start - if not exist .\src\config\NTMakefile.version copy .\src\config\NTMakefile.version-NOCML .\src\config\NTMakefile.version - nmake /nologo /f ntmake9x "NTMAKE = nmake /nologo /f ntmakefile clean" "NTMAKE_HEADERS = nmake /nologo /f ntmakefile clean" "NTMAKE_LIBUTILS = nmake /nologo /f ntmakefile clean" "NTMAKE_OBJS = nmake /nologo /f ntmakefile clean" install - $(CD) $(OBJ)\WINNT\install\Win9x - nmake /nologo /f NTMakefile clean - $(CD) ..\..\..\.. - $(DESTDIR)\BIN\rmbat $(DESTDIR)\include\*.* $(DESTDIR)\include\afs\*.* $(DESTDIR)\include\WINNT\*.* $(DESTDIR)\include\rx\*.* - $(DESTDIR)\BIN\rmbat $(DESTDIR)\LIB\*.LIB $(DESTDIR)\LIB\*.DLL $(DESTDIR)\LIB\AFS\*.LIB - $(DESTDIR)\BIN\rmbat $(DESTDIR)\root.client\usr\vice\etc\*.* - $(CD) $(OBJ)\config - nmake /nologo /f ntmakefile clean_version - $(CD) ..\.. - echo **** End of Clean - -# Language-only build target -lang: - nmake /nologo /f ntmakefile "NTMAKE = nmake /nologo /f ntmakefile lang" "NTMAKE_HEADERS = nmake /nologo /f ntmakefile lang" install diff --git a/src/NTMakefile b/src/NTMakefile index ac8e0d4abc..e8d3af65cd 100644 --- a/src/NTMakefile +++ b/src/NTMakefile @@ -604,7 +604,14 @@ aklog: client_creds $(NTMAKE) $(CD) ..\..\.. -netidmgr_plugin: aklog +xstat: aklog + echo ***** $@ + $(DOCD) $(SRC)\$@ + $(CD) $(SRC)\$@ + $(NTMAKE) + $(CD) ..\.. + +netidmgr_plugin: xstat echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ @@ -627,10 +634,11 @@ finale: extra $(DOCD) $(SRC)\$@ $(CD) $(SRC)\$@ $(NTMAKE) - $(CD) ..\.. - echo Build Finished Successfully + $(CD) ..\.. install: finale + echo Build Finished Successfully + # Clean target for obj tree clean: @@ -685,4 +693,3 @@ install-nsis: install NSIS install-wix: install wix - diff --git a/src/TechNotes-WIN9X b/src/TechNotes-WIN9X deleted file mode 100644 index ced7f49e56..0000000000 --- a/src/TechNotes-WIN9X +++ /dev/null @@ -1,154 +0,0 @@ -Win9x AFS Client: Technical Notes ---------------------------------- - -This file gives a technical overview of the Win9x AFS client and describes -the main differences from the NT client. - - -Overview --------- - -The Windows 9x client is based on the Windows NT/2000 client. Like the -NT client, it exports AFS through an SMB interface. Programs access AFS -files by mounting AFS submounts as SMB shares and using the built-in -Windows SMB client to communicate with the AFS client. The AFS client -acts as an SMB server. It runs entirely at user level. - -DOS box implementation and VXD's --------------------------------- - -The main program of the Win9x client, afsd.exe, is implemented as a -32-bit DOS program. It is compiled using the DJGPP compiler and runs in -a Windows 9x DOS virtual machine. This approach was necessary to avoid -a well-known deadlock problem in Windows 9x when the kernel calls up -to a user-level Win32 daemon: the original requesting program grabs the -Win16Mutex before entering the kernel. The request is then passed up to -the daemon, who attempts to service it using network or file I/O calls. -These calls also attempt to obtain the Win16Mutex, which is still being -held by the original requester, so there is a deadlock. - -To avoid this problem, the daemon runs in a DOS box. I/O calls from -a DOS program do not attempt to obtain the Win16Mutex, so the deadlock -is avoided. This approach was discovered by the Coda team at Carnegie -Mellon University and used to implement a Win9x version of their client. -The Win9x AFS client uses the same approach. It also uses the Coda team's -SOCK.VXD which was written to provide network functions to a DOS program. -Sockets functions which call SOCK.VXD were added to the DJGPP library. - -For more information about the Coda team's approach to this problem, see -their paper from Usenix 1999: -http://www.cs.cmu.edu/afs/cs/project/coda/Web/docdir/freenix99.pdf - -Note that the AFS client also requires the Coda team's MMAP.VXD. We are -not actually calling this VXD, but afsd crashes if it is built without -it (i.e., by building with dos-gcc -bw95 instead of -bmmap). Solutions to -this problem welcomed.. - -Netbios functions ------------------ - -The Windows AFS clients communicate with user applications using the -SMB protocol, as described above. SMB communication is done using the -Netbios interface. In Win32, there is a built-in function Netbios() -which accomplishes this. In a DOS program, however, this function is -unavailable. However, Netbios functionality is available in the BIOS -by calling interrupt 0x5c. The NCB (Netbios Control Block) and data -buffer must be in conventional DOS memory, i.e., below 1 MB. This memory -can only be accessed in DJGPP by using the DOS memory access functions: -dosmemget(), dosmemput(), _farpeekX() and _farpokeX(). The Win9x client -uses a separately-allocated DOS memory buffer and copies data to and from -DOS memory for network communication. - -Functions were also added to LWP's iomgr.c to check for the completion -of Netbios requests. The IOMGR now checks for NCB completion in addition -to checking for timer expiration, signal delivery, and performing select() -on file descriptors. - -See the new files: netbios95.c, dosutils95.c, and the various changes -(marked by "#ifdef DJGPP") to smb.c in WINNT/afsd. Also see lwp/iomgr.c. - -Thread functions ----------------- - -Unlike the NT client which uses Win32 thread and locking functions, -the Win9x client uses the LWP package from the AFS source distribution. -An interface layer was added to allow NT and Win9x to make the same calls. -For example, thrd_Create() is now used to create a thread. In NT, this -is just a macro to the Win32 function CreateThread(). In Win9x, it is a -function which calls the LWP function LWP_CreateProcess(). See the new -files osithrd95.c, osithrd95.h, and osithrdnt.h in WINNT/client_osi. - -Configuration parameters ------------------------- - -In DJGPP, it is not feasible to access the system registry, which is -where the NT client stores its configuration info. For the Win9x client, -the Unix approach is followed instead: the local cell is in a file called -"ThisCell", cache configuration is in a file called "cache.info", and -the cell database is stored in "CellServDB" instead of "afsdcell.ini". -Many parameters are passed via the command line to afsd.exe and are -processed just like the Unix clients. - -See the new files afsd_init95.c and afsd95.c in WINNT/afsd. - -Authentication --------------- - -In the functions SetToken() and GetToken(), the NT client sends and -receives the session key using a separate RPC which should use encryption, -rather than including the session key in the pioctl packet. The Win9x -version avoids this RPC and puts the session key back into the pioctl. -This should not be a security issue on Win9x since it is a single-user -machine. (The pioctl packet will not be visible externally.) See files -WINNT/afsd/cm_ioctl.c and auth/ktc_nt.c. - -Persistent (disk) caching -------------------------- - -Disk caching support was added for the 9x client. This has barely been -tested and is still very experimental! In addition, there are numerous -performance issues. It relies on the fact that LWP is a non-preemptive -threads package, so no locking is done to protect shared data structures. -In addition, it uses synchronous I/O to read and write disk files. Since -LWP is a user-level threads package, any calls to normal I/O system calls -like read() or write() will block the entire process. One better approach -would be to add support for local disk file descriptors to the select() -call used by IOMGR, and then to use IOMGR_Select to enqueue I/O requests -to the disk. Currently, the select() function supports only sockets. - -It should be fairly easy to adapt this code for the NT client. See the -implementation in WINNT/afsd/cm_diskcache95.c. To enable this code, -define DISKCACHE95 in WINNT/afsd/Makefile.djgpp. - -Utility programs ----------------- - -The utility programs, such as klog.exe and fs.exe, are Win32 programs and -are built using the Microsoft compiler. Changes to the code for these -files are marked by "#ifdef AFS_WIN95_ENV". - -GUI interface -------------- - -The Win9x client does not use the NT configuration GUI programs in -client_creds and client_cpa (Control Panel Applet.) It uses a separate -GUI program called WinAfsLoad.exe in WINNT/win9xpanel. This program can -start afsd.exe and keep track of submounts and token expiration. - -The Explorer shell extension, which allows right clicking on a file -in Windows Explorer to get an AFS submenu, is supported in Win9x. -See WINNT/client_exp. - -Integrated logon ----------------- - -Integrated logon is not supported in the 9x client. - -Known issues ------------- - -1) The Microsoft linker LINK386.exe causes a deadlock when attempting to -create an executable on an AFS filesystem. Somehow, the linker appears -to be preempting the entire machine so afsd.exe cannot run to service -requests. Solutions to this problem eagerly sought! (This problem does -not seem to occur with the Win9x Coda client.) diff --git a/src/WINNT/afs_setup_utils/afsrm.c b/src/WINNT/afs_setup_utils/afsrm.c index 1761a76fa0..e20dedf9b6 100644 --- a/src/WINNT/afs_setup_utils/afsrm.c +++ b/src/WINNT/afs_setup_utils/afsrm.c @@ -23,7 +23,7 @@ #include "forceremove.h" -static int DoClient34(struct cmd_syndesc *as, char *arock) +static int DoClient34(struct cmd_syndesc *as, void *arock) { DWORD status = Client34Eradicate(FALSE); @@ -40,7 +40,7 @@ SetupCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("client34", DoClient34, 0, + ts = cmd_CreateSyntax("client34", DoClient34, NULL, "remove AFS 3.4a client"); } diff --git a/src/WINNT/afsd/afsd.h b/src/WINNT/afsd/afsd.h index 45b0b065eb..218777fc10 100644 --- a/src/WINNT/afsd/afsd.h +++ b/src/WINNT/afsd/afsd.h @@ -49,8 +49,8 @@ BOOL APIENTRY About(HWND, unsigned int, unsigned int, long); #include "cm_aclent.h" #include "cm_server.h" #include "cm_cell.h" -#include "cm_volume.h" #include "cm_volstat.h" +#include "cm_volume.h" #include "cm_dcache.h" #include "cm_access.h" #include "cm_utils.h" diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index 4b8b488d87..ca8f3148e0 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -23,6 +23,9 @@ #include #include "afsd.h" +#ifdef USE_BPLUS +#include "cm_btree.h" +#endif #include #include #include @@ -39,8 +42,13 @@ extern int RXSTATS_ExecuteRequest(struct rx_call *z_call); extern afs_int32 cryptall; extern int cm_enableServerLocks; +extern int cm_followBackupPath; extern int cm_deleteReadOnly; +#ifdef USE_BPLUS extern afs_int32 cm_BPlusTrees; +#endif +extern afs_int32 cm_OfflineROIsValid; +extern afs_int32 cm_giveUpAllCBs; extern const char **smb_ExecutableExtensions; osi_log_t *afsd_logp; @@ -1068,6 +1076,7 @@ int afsd_InitCM(char **reasonP) } afsi_log("CM DeleteReadOnly is %u", cm_deleteReadOnly); +#ifdef USE_BPLUS dummyLen = sizeof(DWORD); code = RegQueryValueEx(parmKey, "BPlusTrees", NULL, NULL, (BYTE *) &dwValue, &dummyLen); @@ -1076,6 +1085,14 @@ int afsd_InitCM(char **reasonP) } afsi_log("CM BPlusTrees is %u", cm_BPlusTrees); + if (cm_BPlusTrees && !cm_InitBPlusDir()) { + cm_BPlusTrees = 0; + afsi_log("CM BPlusTree initialization failure; disabled for this session"); + } +#else + afsi_log("CM BPlusTrees is not supported"); +#endif + if ((RegQueryValueEx( parmKey, "PrefetchExecutableExtensions", 0, ®Type, NULL, &dummyLen) == ERROR_SUCCESS) && (regType == REG_MULTI_SZ)) @@ -1108,6 +1125,30 @@ int afsd_InitCM(char **reasonP) if (!smb_ExecutableExtensions) afsi_log("No PrefetchExecutableExtensions"); + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "OfflineReadOnlyIsValid", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) { + cm_OfflineROIsValid = (unsigned short) dwValue; + } + afsi_log("CM OfflineReadOnlyIsValid is %u", cm_deleteReadOnly); + + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "GiveUpAllCallBacks", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) { + cm_giveUpAllCBs = (unsigned short) dwValue; + } + afsi_log("CM GiveUpAllCallBacks is %u", cm_giveUpAllCBs); + + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "FollowBackupPath", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) { + cm_followBackupPath = (unsigned short) dwValue; + } + afsi_log("CM FollowBackupPath is %u", cm_followBackupPath); + RegCloseKey (parmKey); cacheBlocks = ((afs_uint64)cacheSize * 1024) / blockSize; @@ -1155,7 +1196,7 @@ int afsd_InitCM(char **reasonP) smb_InitIoctl(); cm_InitCallback(); - + code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, cm_chunkSize, cacheBlocks, blockSize); afsi_log("cm_InitMappedMemory code %x", code); if (code != 0) { @@ -1360,7 +1401,6 @@ int afsd_InitSMB(char **reasonP, void *aMBfunc) void afsd_printStack(HANDLE hThread, CONTEXT *c) { -#if defined(_X86_) HANDLE hProcess = GetCurrentProcess(); int frameNum; #if defined(_AMD64_) @@ -1407,9 +1447,9 @@ void afsd_printStack(HANDLE hThread, CONTEXT *c) #error The STACKFRAME initialization in afsd_printStack() for this platform #error must be properly configured #elif defined(_AMD64_) - s.AddrPC.Offset = 0; + s.AddrPC.Offset = c->Rip; s.AddrPC.Mode = AddrModeFlat; - s.AddrFrame.Offset = 0; + s.AddrFrame.Offset = c->Rbp; s.AddrFrame.Mode = AddrModeFlat; #else s.AddrPC.Offset = c->Eip; @@ -1509,7 +1549,6 @@ void afsd_printStack(HANDLE hThread, CONTEXT *c) SymCleanup(hProcess); GlobalFree(pSym); -#endif /* _X86_ */ } #ifdef _DEBUG @@ -1658,6 +1697,9 @@ LONG __stdcall afsd_ExceptionFilter(EXCEPTION_POINTERS *ep) #endif #if defined(_X86) ep->ContextRecord->Eip++; +#endif +#if defined(_AMD64_) + ep->ContextRecord->Rip++; #endif return EXCEPTION_CONTINUE_EXECUTION; } diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index 30e81d8b21..328e16ece6 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -61,6 +61,8 @@ static void afsd_notifier(char *msgp, char *filep, long line) #ifdef AFSIFS int i; #endif + if (!msgp) + msgp = "unspecified assert"; if (filep) LogEvent(EVENTLOG_ERROR_TYPE, MSG_SERVICE_ERROR_STOP_WITH_MSG_AND_LOCATION, diff --git a/src/WINNT/afsd/afskfw.c b/src/WINNT/afsd/afskfw.c index c89585d32e..15548fa1ae 100644 --- a/src/WINNT/afsd/afskfw.c +++ b/src/WINNT/afsd/afskfw.c @@ -161,6 +161,36 @@ KFW_cleanup(void) KFW_cleanup_funcs(); } + +int +KFW_accept_dotted_usernames(void) +{ + HKEY parmKey; + DWORD code, len; + DWORD value = 1; + + code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, + 0, KEY_QUERY_VALUE, &parmKey); + if (code == ERROR_SUCCESS) { + len = sizeof(value); + code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL, + (BYTE *) &value, &len); + RegCloseKey(parmKey); + } + if (code != ERROR_SUCCESS) { + code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, + 0, KEY_QUERY_VALUE, &parmKey); + if (code == ERROR_SUCCESS) { + len = sizeof(value); + code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL, + (BYTE *) &value, &len); + RegCloseKey (parmKey); + } + } + return value; +} + + int KFW_use_krb524(void) { @@ -934,24 +964,27 @@ KFW_AFS_get_cred( char * username, userrealm = strchr(username,'@'); if ( userrealm ) { pname = strdup(username); - userrealm = strchr(pname, '@'); - *userrealm = '\0'; + if (!KFW_accept_dotted_usernames()) { + userrealm = strchr(pname, '@'); + *userrealm = '\0'; - /* handle kerberos iv notation */ - while ( dot = strchr(pname,'.') ) { - *dot = '/'; + /* handle kerberos iv notation */ + while ( dot = strchr(pname,'.') ) { + *dot = '/'; + } + *userrealm++ = '@'; } - *userrealm++ = '@'; } else { pname = malloc(strlen(username) + strlen(realm) + 2); strcpy(pname, username); - /* handle kerberos iv notation */ - while ( dot = strchr(pname,'.') ) { - *dot = '/'; + if (!KFW_accept_dotted_usernames()) { + /* handle kerberos iv notation */ + while ( dot = strchr(pname,'.') ) { + *dot = '/'; + } } - strcat(pname,"@"); strcat(pname,realm); } @@ -2414,19 +2447,21 @@ KFW_AFS_klog( goto skip_krb5_init; } - /* look for client principals which cannot be distinguished - * from Kerberos 4 multi-component principal names - */ - k5data = krb5_princ_component(ctx,client_principal,0); - for ( i=0; ilength; i++ ) { - if ( k5data->data[i] == '.' ) - break; - } - if (i != k5data->length) - { - OutputDebugString("Illegal Principal name contains dot in first component\n"); - rc = KRB5KRB_ERR_GENERIC; - goto cleanup; + if (!KFW_accept_dotted_usernames()) { + /* look for client principals which cannot be distinguished + * from Kerberos 4 multi-component principal names + */ + k5data = krb5_princ_component(ctx,client_principal,0); + for ( i=0; ilength; i++ ) { + if ( k5data->data[i] == '.' ) + break; + } + if (i != k5data->length) + { + OutputDebugString("Illegal Principal name contains dot in first component\n"); + rc = KRB5KRB_ERR_GENERIC; + goto cleanup; + } } i = krb5_princ_realm(ctx, client_principal)->length; diff --git a/src/WINNT/afsd/cklog.c b/src/WINNT/afsd/cklog.c index acbcf61c3f..d3a5177875 100644 --- a/src/WINNT/afsd/cklog.c +++ b/src/WINNT/afsd/cklog.c @@ -22,7 +22,7 @@ #define BAD_ARGUMENT 1 #define KLOGEXIT(code) exit(code) -int CommandProc(); +static int CommandProc(struct cmd_syndesc *, void *); static int zero_argc; static char **zero_argv; @@ -40,7 +40,7 @@ void main (argc, argv) /* Start up sockets */ WSAStartup(0x0101, &WSAjunk); - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "obtain Kerberos authentication"); + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "obtain Kerberos authentication"); #define aXFLAG 0 #define aPRINCIPAL 1 @@ -135,9 +135,8 @@ static int read_pw_string(char *s, int max) return !ok; } -CommandProc (as, arock) - char *arock; - struct cmd_syndesc *as; +static int +CommandProc (struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN]; char instance[MAXKTCNAMELEN]; diff --git a/src/WINNT/afsd/cm_aclent.c b/src/WINNT/afsd/cm_aclent.c index f7cb725a86..ad14a8abb0 100644 --- a/src/WINNT/afsd/cm_aclent.c +++ b/src/WINNT/afsd/cm_aclent.c @@ -92,9 +92,6 @@ long cm_FindACLCache(cm_scache_t *scp, cm_user_t *userp, afs_uint32 *rightsp) } else { *rightsp = aclp->randomAccess; if (cm_data.aclLRUp != aclp) { - if (cm_data.aclLRUEndp == aclp) - cm_data.aclLRUEndp = (cm_aclent_t *) osi_QPrev(&aclp->q); - /* move to the head of the LRU queue */ osi_QRemoveHT((osi_queue_t **) &cm_data.aclLRUp, (osi_queue_t **) &cm_data.aclLRUEndp, &aclp->q); osi_QAddH((osi_queue_t **) &cm_data.aclLRUp, @@ -123,8 +120,10 @@ static cm_aclent_t *GetFreeACLEnt(cm_scache_t * scp) if (cm_data.aclLRUp == NULL) osi_panic("empty aclent LRU", __FILE__, __LINE__); + if (cm_data.aclLRUEndp == NULL) + osi_panic("inconsistent aclent LRUEndp == NULL", __FILE__, __LINE__); + aclp = cm_data.aclLRUEndp; - cm_data.aclLRUEndp = (cm_aclent_t *) osi_QPrev(&aclp->q); osi_QRemoveHT((osi_queue_t **) &cm_data.aclLRUp, (osi_queue_t **) &cm_data.aclLRUEndp, &aclp->q); if (aclp->backp && scp != aclp->backp) { diff --git a/src/WINNT/afsd/cm_btree.c b/src/WINNT/afsd/cm_btree.c index 26128eb987..b3ad945a43 100644 --- a/src/WINNT/afsd/cm_btree.c +++ b/src/WINNT/afsd/cm_btree.c @@ -66,6 +66,14 @@ static void _pullentry(Nptr node, int entry, int offset); static void _xferentry(Nptr srcNode, int srcEntry, Nptr destNode, int destEntry); static void _setentry(Nptr node, int entry, keyT key, Nptr downNode); +/* access key and data values for B+tree methods */ +/* pass values to getSlot(), descend...() */ +static keyT getfunkey(Tree *B); +static dataT getfundata(Tree *B); +static void setfunkey(Tree *B, keyT v); +static void setfundata(Tree *B, dataT v); + + #ifdef DEBUG_BTREE static int _isRoot(Tree *B, Nptr n) { @@ -114,6 +122,19 @@ static int _isFull(Tree *B, Nptr n) /***********************************************************************\ | B+tree Initialization and Cleanup Routines | \***********************************************************************/ +static DWORD TlsKeyIndex; +static DWORD TlsDataIndex; + +long cm_InitBPlusDir(void) +{ + if ((TlsKeyIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) + return 0; + + if ((TlsDataIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) + return 0; + + return 1; +} /******************** Set up B+tree structure **********************/ Tree *initBtree(unsigned int poolsz, unsigned int fanout, KeyCmp keyCmp) @@ -168,14 +189,81 @@ void freeBtree(Tree *B) } +/* access key and data values for B+tree methods */ +/* pass values to getSlot(), descend...() */ +static keyT getfunkey(Tree *B) { + keyT *tlsKey; + + // Retrieve a data pointer for the current thread. + tlsKey = (keyT *) TlsGetValue(TlsKeyIndex); + if (tlsKey == NULL) { + if (GetLastError() != ERROR_SUCCESS) + osi_panic("TlsGetValue failed", __FILE__, __LINE__); + else + osi_panic("get before set", __FILE__, __LINE__); + } + + return *tlsKey; +} + +static dataT getfundata(Tree *B) { + dataT *tlsData; + + // Retrieve a data pointer for the current thread. + tlsData = (dataT *) TlsGetValue(TlsDataIndex); + if (tlsData == NULL) { + if (GetLastError() != ERROR_SUCCESS) + osi_panic("TlsGetValue failed", __FILE__, __LINE__); + else + osi_panic("get before set", __FILE__, __LINE__); + } + + return *tlsData; +} + +static void setfunkey(Tree *B, keyT theKey) { + keyT *tlsKey; + + tlsKey = (keyT *) TlsGetValue(TlsKeyIndex); + if (tlsKey == NULL) { + if (GetLastError() != ERROR_SUCCESS) + osi_panic("TlsGetValue failed", __FILE__, __LINE__); + + tlsKey = malloc(sizeof(keyT)); + + if (!TlsSetValue(TlsKeyIndex, tlsKey)) + osi_panic("TlsSetValue failed", __FILE__, __LINE__); + } + + *tlsKey = theKey; +} + +static void setfundata(Tree *B, dataT theData) { + dataT *tlsData; + + tlsData = (dataT *) TlsGetValue(TlsDataIndex); + if (tlsData == NULL) { + if (GetLastError() != ERROR_SUCCESS) + osi_panic("TlsGetValue failed", __FILE__, __LINE__); + + tlsData = malloc(sizeof(dataT)); + + if (!TlsSetValue(TlsDataIndex, tlsData)) + osi_panic("TlsSetValue failed", __FILE__, __LINE__); + } + + *tlsData = theData; +} + + /***********************************************************************\ -| Find location for data | +| Find leaf node in which data nodes can be found | \***********************************************************************/ /********************** top level lookup **********************/ Nptr bplus_Lookup(Tree *B, keyT key) { - Nptr findNode; + Nptr leafNode; #ifdef DEBUG_BTREE sprintf(B->message, "LOOKUP: key %s.\n", key.name); @@ -183,21 +271,24 @@ Nptr bplus_Lookup(Tree *B, keyT key) #endif setfunkey(B, key); /* set search key */ - findNode = descendToLeaf(B, getroot(B)); /* start search from root node */ + leafNode = descendToLeaf(B, getroot(B)); /* start search from root node */ #ifdef DEBUG_BTREE - if (findNode) { + if (leafNode) { int slot; Nptr dataNode; dataT data; - slot = findKey(B, findNode, 1, numentries(findNode)); - dataNode = getnode(findNode, slot); + slot = getSlot(B, leafNode); + if (slot <= BTERROR) + return NONODE; + + dataNode = getnode(leafNode, slot); data = getdatavalue(dataNode); sprintf(B->message, "LOOKUP: %s found on page %d value (%d.%d.%d).\n", key.name, - getnodenumber(B, findNode), + getnodenumber(B, leafNode), data.fid.volume, data.fid.vnode, data.fid.unique); @@ -206,7 +297,7 @@ Nptr bplus_Lookup(Tree *B, keyT key) OutputDebugString(B->message); #endif - return findNode; + return leafNode; } /********************** `recurse' down B+tree **********************/ @@ -219,12 +310,16 @@ static Nptr descendToLeaf(Tree *B, Nptr curr) memset(prev, 0, sizeof(prev)); - for (depth = 0, slot = getSlot(B, curr); isinternal(curr); depth++, slot = getSlot(B, curr)) { + for (depth = 0, slot = getSlot(B, curr); (slot >= 0) && isinternal(curr); depth++, slot = getSlot(B, curr)) { prev[depth] = curr; if (slot == 0) curr = getfirstnode(curr); - else + else if (slot > 0) curr = getnode(curr, slot); + else /* BTERROR, BTLOWER, BTUPPER */ { + curr = NONODE; + break; + } #ifdef DEBUG_BTREE if ( !isnode(curr) ) DebugBreak(); @@ -260,24 +355,35 @@ static int findKey(Tree *B, Nptr curr, int lo, int hi) #ifdef DEBUG_BTREE if (findslot == BTERROR) { - sprintf(B->message, "Bad key ordering on node %d\n", getnodenumber(B, curr)); - OutputDebugString(B->message); + sprintf(B->message, "FINDKEY: (lo %d hi %d) Bad key ordering on node %d (0x%p)\n", + lo, hi, getnodenumber(B, curr), curr); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); } #endif } else { mid = (lo + hi) >> 1; switch (findslot = bestMatch(B, curr, mid)) { case BTLOWER: /* check lower half of range */ - findslot = findKey(B, curr, lo, mid - 1); /* never in 2-3+trees */ + if (mid > 1) + findslot = findKey(B, curr, lo, mid - 1); /* never in 2-3+trees */ break; case BTUPPER: /* check upper half of range */ - findslot = findKey(B, curr, mid + 1, hi); + if (mid < getfanout(B)) + findslot = findKey(B, curr, mid + 1, hi); break; case BTERROR: - sprintf(B->message, "Bad key ordering on node %d\n", getnodenumber(B, curr)); - OutputDebugString(B->message); + sprintf(B->message, "FINDKEY: (lo %d hi %d) Bad key ordering on node %d (0x%p)\n", + lo, hi, getnodenumber(B, curr), curr); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); } } + + if (isleaf(curr) && findslot == 0) + { + sprintf(B->message, "FINDKEY: (lo %d hi %d) findslot %d is invalid for leaf nodes, bad key ordering on node %d (0x%p)\n", + lo, hi, findslot, getnodenumber(B, curr), curr); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); + } return findslot; } @@ -285,43 +391,54 @@ static int findKey(Tree *B, Nptr curr, int lo, int hi) /************ comparison of key with a target key slot *************/ static int bestMatch(Tree *B, Nptr curr, int slot) { - int diff, comp, findslot; + int diff, comp=2, findslot; diff = comparekeys(B)(getfunkey(B), getkey(curr, slot), 0); - if (diff < 0) { /* also check previous slot */ - if ((slot == 1) || - ((comp = comparekeys(B)(getfunkey(B), getkey(curr, slot - 1), 0)) >= 0)) - { + if (diff == 0) { + findslot = slot; + } else if (diff < 0) { /* also check previous slot */ + if (slot == 1) { + if (isleaf(curr)) + findslot = BTLOWER; /* not found in the tree */ + else + findslot = 0; + } + else if ((comp = comparekeys(B)(getfunkey(B), getkey(curr, slot - 1), 0)) >= 0) { findslot = slot - 1; - } - else if (comp < diff) { + } else if (comp < diff) { findslot = BTERROR; /* inconsistent ordering of keys */ #ifdef DEBUG_BTREE DebugBreak(); #endif - } - else { + } else { findslot = BTLOWER; /* key must be below in node ordering */ } } else { /* or check following slot */ - if ((slot == numentries(curr)) || - ((comp = comparekeys(B)(getfunkey(B), getkey(curr, slot + 1), 0)) < 0)) - { + if (slot == numentries(curr)) { + if (isleaf(curr) && numentries(curr) == getfanout(B)) + findslot = BTUPPER; + else + findslot = slot; + } else if ((comp = comparekeys(B)(getfunkey(B), getkey(curr, slot + 1), 0)) < 0) { findslot = slot; - } - else if (comp == 0) { + } else if (comp == 0) { findslot = slot + 1; - } - else if (comp > diff) { + } else if (comp > diff) { findslot = BTERROR; /* inconsistent ordering of keys */ #ifdef DEBUG_BTREE DebugBreak(); #endif - } - else { + } else { findslot = BTUPPER; /* key must be above in node ordering */ } } + + if (findslot == BTERROR || isleaf(curr) && findslot == 0) + { + sprintf(B->message, "BESTMATCH: node %d (0x%p) slot %d diff %d comp %d findslot %d\n", + getnodenumber(B, curr), curr, slot, diff, comp, findslot); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); + } return findslot; } @@ -338,7 +455,7 @@ void insert(Tree *B, keyT key, dataT data) #ifdef DEBUG_BTREE sprintf(B->message, "INSERT: key %s.\n", key.name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif setfunkey(B, key); /* set insertion key */ @@ -367,6 +484,16 @@ descendSplit(Tree *B, Nptr curr) setsplitpath(B, curr); /* indicates where nodes must split */ slot = getSlot(B, curr); /* is null only if the root is empty */ + if (slot == BTERROR) + return NONODE; + + if (isleaf(curr)) { + if (slot == BTLOWER) + slot = 0; + else if (slot == BTUPPER) + slot = getfanout(B); + } + if (isinternal(curr)) { /* continue recursion to leaves */ if (slot == 0) downNode = descendSplit(B, getfirstnode(curr)); @@ -402,7 +529,7 @@ insertEntry(Tree *B, Nptr currNode, int slot, Nptr sibling, Nptr downPtr) #ifdef DEBUG_BTREE sprintf(B->message, "INSERT: slot %d, down node %d.\n", slot, getnodenumber(B, downPtr)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif if (sibling == NONODE) { /* no split occurred */ @@ -606,7 +733,7 @@ void delete(Tree *B, keyT key) #ifdef DEBUG_BTREE sprintf(B->message, "DELETE: key %s.\n", key.name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif setfunkey(B, key); /* set deletion key */ @@ -615,7 +742,7 @@ void delete(Tree *B, keyT key) if (isnode(newNode)) { #ifdef DEBUG_BTREE sprintf(B->message, "DELETE: collapsing node %d", getnodenumber(B, newNode)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif collapseRoot(B, getroot(B), newNode); /* remove root when superfluous */ } @@ -629,7 +756,7 @@ collapseRoot(Tree *B, Nptr oldRoot, Nptr newRoot) #ifdef DEBUG_BTREE sprintf(B->message, "COLLAPSE: old %d, new %d.\n", getnodenumber(B, oldRoot), getnodenumber(B, newRoot)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); showNode(B, "collapseRoot oldRoot", oldRoot); showNode(B, "collapseRoot newRoot", newRoot); #endif @@ -657,7 +784,7 @@ descendBalance(Tree *B, Nptr curr, Nptr left, Nptr right, Nptr lAnc, Nptr rAnc, lAnc ? getnodenumber(B, lAnc) : -1, rAnc ? getnodenumber(B, rAnc) : -1, parent ? getnodenumber(B, parent) : -1); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif if (!isfew(curr)) @@ -666,6 +793,15 @@ descendBalance(Tree *B, Nptr curr, Nptr left, Nptr right, Nptr lAnc, Nptr rAnc, setmergepath(B, curr); /* mark which nodes may need rebalancing */ slot = getSlot(B, curr); + if (slot == BTERROR) + return NONODE; + + if (isleaf(curr)) { + if (slot == BTLOWER) + slot = 0; + else if (slot == BTUPPER) + slot = getfanout(B); + } if (isinternal(curr)) /* set up next recursion call's parameters */ { @@ -733,14 +869,17 @@ descendBalance(Tree *B, Nptr curr, Nptr left, Nptr right, Nptr lAnc, Nptr rAnc, * options. So we must determine if any of the next nodes * are the one we are looking for. */ - Nptr dataNode = newNode; + Nptr prev = newNode; while ( next ) { if (!comparekeys(B)(getfunkey(B), getdatakey(next), EXACT_MATCH)) { /* we found the one to delete */ - getdatanext(dataNode) = getdatanext(next); + getdatanext(prev) = getdatanext(next); putFreeNode(B, next); + break; } + prev = next; + next = getdatanext(next); } /* do not delete the key */ @@ -780,7 +919,7 @@ descendBalance(Tree *B, Nptr curr, Nptr left, Nptr right, Nptr lAnc, Nptr rAnc, if (newMe != NONODE) { /* this node removal doesn't consider duplicates */ #ifdef DEBUG_BTREE sprintf(B->message, "descendBalance DELETE: slot %d, node %d.\n", slot, getnodenumber(B, curr)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif removeEntry(B, curr, slot + (newMe != newNode)); /* removes one of two */ @@ -834,7 +973,7 @@ descendBalance(Tree *B, Nptr curr, Nptr left, Nptr right, Nptr lAnc, Nptr rAnc, #ifdef DEBUG_BTREE sprintf(B->message, "descendBalance returns %d\n", getnodenumber(B, newNode)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #endif return newNode; } @@ -866,7 +1005,7 @@ merge(Tree *B, Nptr left, Nptr right, Nptr anchor) #ifdef DEBUG_BTREE sprintf(B->message, "MERGE: left %d, right %d.\n", getnodenumber(B, left), getnodenumber(B, right)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); showNode(B, "pre-merge anchor", anchor); showNode(B, "pre-merge left", left); showNode(B, "pre-merge right", right); @@ -880,6 +1019,8 @@ merge(Tree *B, Nptr left, Nptr right, Nptr anchor) #endif setfunkey(B, getkey(right, 1)); /* defined but maybe just deleted */ z = getSlot(B, anchor); /* needs the just calculated key */ + if (z <= BTERROR) + return NONODE; setfunkey(B, getkey(anchor, z)); /* set slot to delete in anchor */ setentry(left, numentries(left), getfunkey(B), getfirstnode(right)); } @@ -924,7 +1065,7 @@ shift(Tree *B, Nptr left, Nptr right, Nptr anchor) getnodenumber(B, left), getnodenumber(B, right), getnodenumber(B, anchor)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); showNode(B, "pre-shift anchor", anchor); showNode(B, "pre-shift left", left); showNode(B, "pre-shift right", right); @@ -937,6 +1078,8 @@ shift(Tree *B, Nptr left, Nptr right, Nptr anchor) x = numentries(left) + y; setfunkey(B, getkey(right, y + 1 - i)); /* set new anchor key value */ z = getSlot(B, anchor); /* find slot in anchor node */ + if (z <= BTERROR) + return NONODE; #ifdef DEBUG_BTREE if (z == 0 && !isroot(anchor)) DebugBreak(); @@ -974,7 +1117,11 @@ shift(Tree *B, Nptr left, Nptr right, Nptr anchor) pushentry(right, z, y); setfunkey(B, getkey(left, x)); /* set new anchor key value */ - z = getSlot(B, anchor) + 1; + z = getSlot(B, anchor); + if (z <= BTERROR) + return NONODE; + z += 1; + if (i) { decentries(left); incentries(right); @@ -1016,7 +1163,7 @@ shift(Tree *B, Nptr left, Nptr right, Nptr anchor) #ifdef DEBUG_BTREE sprintf(B->message, "SHIFT: left %d, right %d.\n", getnodenumber(B, left), getnodenumber(B, right)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); showNode(B, "post-shift anchor", anchor); showNode(B, "post-shift left", left); showNode(B, "post-shift right", right); @@ -1234,61 +1381,61 @@ void showNode(Tree *B, const char * where, Nptr n) int x; sprintf(B->message, "- -- -- -- -- -- -- -- -- -- -- -- -\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| %-20s |\n", where); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| node %6d ", getnodenumber(B, n)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, " magic %4x |\n", getmagic(n)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "- -- -- -- -- -- -- -- -- -- -- -- -\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| flags %1d%1d%1d%1d ", isfew(n), isfull(n), isroot(n), isleaf(n)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| keys = %5d ", numentries(n)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| node = %6d |\n", getnodenumber(B, getfirstnode(n))); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); for (x = 1; x <= numentries(n); x++) { sprintf(B->message, "| entry %6d ", x); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| key = %6s ", getkey(n, x).name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| node = %6d |\n", getnodenumber(B, getnode(n, x))); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); } sprintf(B->message, "- -- -- -- -- -- -- -- -- -- -- -- -\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); } /****************** B+tree class variable printer ******************/ void showBtree(Tree *B) { sprintf(B->message, "- -- -- -- -- -- -\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| B+tree %10p |\n", (void *) B); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "- -- -- -- -- -- -\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| root %6d |\n", getnodenumber(B, getroot(B))); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| leaf %6d |\n", getnodenumber(B, getleaf(B))); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| fanout %3d |\n", getfanout(B) + 1); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| minfanout %3d |\n", getminfanout(B, getroot(B)) + 1); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| height %3d |\n", gettreeheight(B)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| freenode %6d |\n", getnodenumber(B, getfirstfreenode(B))); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| theKey %6s |\n", getfunkey(B).name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "| theData %d.%d.%d |\n", getfundata(B).volume, getfundata(B).vnode, getfundata(B).unique); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); sprintf(B->message, "- -- -- -- -- -- -\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); } void @@ -1300,7 +1447,7 @@ listBtreeNodes(Tree *B, const char * parent_desc, Nptr node) if (isntnode(node)) { sprintf(B->message, "%s - NoNode!!!\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); return; } @@ -1310,7 +1457,7 @@ listBtreeNodes(Tree *B, const char * parent_desc, Nptr node) sprintf(B->message, "%s - data node %d (%d.%d.%d)\n", parent_desc, getnodenumber(B, node), data.fid.volume, data.fid.vnode, data.fid.unique); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); return; } else showNode(B, parent_desc, node); @@ -1318,7 +1465,7 @@ listBtreeNodes(Tree *B, const char * parent_desc, Nptr node) if ( isinternal(node) || isroot(node) ) { sprintf(thisnode, "parent %6d", getnodenumber(B , node)); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); for ( i= isinternal(node) ? 0 : 1; i <= numentries(node); i++ ) { listBtreeNodes(B, thisnode, i == 0 ? getfirstnode(node) : getnode(node, i)); } @@ -1336,19 +1483,19 @@ listBtreeValues(Tree *B, Nptr n, int num) for (slot = 1; (n != NONODE) && num && numentries(n); num--) { if (comparekeys(B)(getkey(n, slot),prev, 0) < 0) { sprintf(B->message, "BOMB %8s\n", getkey(n, slot).name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); DebugBreak(); } prev = getkey(n, slot); data = getdatavalue(getnode(n, slot)); sprintf(B->message, "%8s (%d.%d.%d)\n", prev.name, data.fid.volume, data.fid.vnode, data.fid.unique); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); if (++slot > numentries(n)) n = getnextnode(n), slot = 1; } sprintf(B->message, "\n\n"); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); } /******************** entire B+tree data printer *******************/ @@ -1370,7 +1517,7 @@ findAllBtreeValues(Tree *B) for (slot = 1; (n != NONODE) && num && numentries(n); num--) { if (comparekeys(B)(getkey(n, slot),prev, 0) < 0) { sprintf(B->message,"BOMB %8s\n", getkey(n, slot).name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #ifdef DEBUG_BTREE DebugBreak(); #endif @@ -1382,7 +1529,7 @@ findAllBtreeValues(Tree *B) sprintf(B->message,"BOMB %8s cannot be found\n", prev.name); else sprintf(B->message,"BOMB lookup(%8s) finds wrong node\n", prev.name); - OutputDebugString(B->message); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, B->message)); #ifdef DEBUG_BTREE DebugBreak(); #endif @@ -1396,16 +1543,21 @@ findAllBtreeValues(Tree *B) /* * the return must be -1, 0, or 1. stricmp() in MSVC 8.0 * does not return only those values. + * + * the sorting of the tree is by case insensitive sort order + * therefore, unless the strings actually match via a case + * insensitive search do we want to perform the case sensitive + * match. Otherwise, the search order might be considered + * to be inconsistent when the EXACT_MATCH flag is set. */ static int compareKeys(keyT key1, keyT key2, int flags) { int comp; - if (flags & EXACT_MATCH) + comp = stricmp(key1.name, key2.name); + if (comp == 0 && (flags & EXACT_MATCH)) comp = strcmp(key1.name, key2.name); - else - comp = stricmp(key1.name, key2.name); return (comp < 0 ? -1 : (comp > 0 ? 1 : 0)); } @@ -1431,6 +1583,8 @@ cm_BPlusDirLookup(cm_dirOp_t * op, char *entry, cm_fid_t * cfid) goto done; } + lock_AssertAny(&op->scp->dirlock); + QueryPerformanceCounter(&start); leafNode = bplus_Lookup(op->scp->dirBplus, key); @@ -1446,7 +1600,12 @@ cm_BPlusDirLookup(cm_dirOp_t * op, char *entry, cm_fid_t * cfid) * If we have an ambiguous match, return an error. * If we have only one inexact match, return that. */ - slot = findKey(op->scp->dirBplus, leafNode, 1, numentries(leafNode)); + slot = getSlot(op->scp->dirBplus, leafNode); + if (slot <= BTERROR) { + op->scp->dirDataVersion = 0; + rc = (slot == BTERROR ? EINVAL : ENOENT); + goto done; + } firstDataNode = getnode(leafNode, slot); for ( dataNode = firstDataNode; dataNode; dataNode = nextDataNode) { @@ -1505,6 +1664,9 @@ long cm_BPlusDirCreateEntry(cm_dirOp_t * op, char *entry, cm_fid_t * cfid) goto done; } + + lock_AssertWrite(&op->scp->dirlock); + data.fid.cell = cfid->cell; data.fid.volume = cfid->volume; data.fid.vnode = cfid->vnode; @@ -1556,6 +1718,8 @@ int cm_BPlusDirDeleteEntry(cm_dirOp_t * op, char *entry) goto done; } + lock_AssertWrite(&op->scp->dirlock); + QueryPerformanceCounter(&start); bplus_remove_entry++; @@ -1579,7 +1743,12 @@ int cm_BPlusDirDeleteEntry(cm_dirOp_t * op, char *entry) * If we have an ambiguous match, return an error. * If we have only one inexact match, return that. */ - slot = findKey(op->scp->dirBplus, leafNode, 1, numentries(leafNode)); + slot = getSlot(op->scp->dirBplus, leafNode); + if (slot <= BTERROR) { + op->scp->dirDataVersion = 0; + rc = EINVAL; + goto done; + } firstDataNode = getnode(leafNode, slot); for ( dataNode = firstDataNode; dataNode; dataNode = nextDataNode) { @@ -1631,7 +1800,13 @@ int cm_BPlusDirDeleteEntry(cm_dirOp_t * op, char *entry) * If we have an ambiguous match, return an error. * If we have only one inexact match, return that. */ - slot = findKey(op->scp->dirBplus, leafNode, 1, numentries(leafNode)); + slot = getSlot(op->scp->dirBplus, leafNode); + if (slot <= BTERROR) { + op->scp->dirDataVersion = 0; + rc = EINVAL; + goto done; + + } firstDataNode = getnode(leafNode, slot); for ( dataNode = firstDataNode; dataNode; dataNode = nextDataNode) { @@ -1655,11 +1830,11 @@ int cm_BPlusDirDeleteEntry(cm_dirOp_t * op, char *entry) } if (rc != CM_ERROR_AMBIGUOUS_FILENAME) { - if (longname) { - key.name = longname; - delete(op->scp->dirBplus, key); - key.name = entry; - } + if (longname) { + key.name = longname; + delete(op->scp->dirBplus, key); + key.name = entry; + } delete(op->scp->dirBplus, key); } } @@ -1720,7 +1895,9 @@ long cm_BPlusDirBuildTree(cm_scache_t *scp, cm_user_t *userp, cm_req_t* reqp) osi_hyper_t thyper; LARGE_INTEGER start, end; - osi_assert(scp->dirBplus == NULL); + osi_assertx(scp->dirBplus == NULL, "cm_BPlusDirBuildTree called on non-empty tree"); + + lock_AssertWrite(&scp->dirlock); QueryPerformanceCounter(&start); bplus_build_tree++; @@ -1740,6 +1917,9 @@ long cm_BPlusDirBuildTree(cm_scache_t *scp, cm_user_t *userp, cm_req_t* reqp) bplus_build_time += (end.QuadPart - start.QuadPart); +#if 0 + cm_BPlusDirEnumTest(scp, 1); +#endif return rc; } @@ -1799,4 +1979,260 @@ void cm_BPlusDumpStats(void) afsi_log(" Build: %-16I64d", bplus_build_time); afsi_log(" Free: %-16I64d", bplus_free_time); } + +static cm_direnum_t * +cm_BPlusEnumAlloc(afs_uint32 entries) +{ + cm_direnum_t * enump; + size_t size; + + if (entries == 0) + return NULL; + + size = sizeof(cm_direnum_t)+(entries-1)*sizeof(cm_direnum_entry_t); + enump = (cm_direnum_t *)malloc(size); + memset(enump, 0, size); + enump->count = entries; + return enump; +} + +long +cm_BPlusDirEnumerate(cm_scache_t *scp, afs_uint32 locked, + char * maskp, cm_direnum_t **enumpp) +{ + afs_uint32 count = 0, slot, numentries; + Nptr leafNode = NONODE, nextLeafNode; + Nptr firstDataNode, dataNode, nextDataNode; + cm_direnum_t * enump; + long rc = 0; + char buffer[512]; + + osi_Log0(afsd_logp, "cm_BPlusDirEnumerate start"); + + /* Read lock the bplus tree so the data can't change */ + if (!locked) + lock_ObtainRead(&scp->dirlock); + + if (scp->dirBplus == NULL) { + osi_Log0(afsd_logp, "cm_BPlusDirEnumerate No BPlus Tree"); + goto done; + } + + /* Compute the number of entries */ + for (count = 0, leafNode = getleaf(scp->dirBplus); leafNode; leafNode = nextLeafNode) { + + for ( slot = 1, numentries = numentries(leafNode); slot <= numentries; slot++) { + firstDataNode = getnode(leafNode, slot); + + for ( dataNode = firstDataNode; dataNode; dataNode = nextDataNode) { + if (maskp == NULL) { + /* name is in getdatakey(dataNode) */ + if (getdatavalue(dataNode).longname != NULL || + cm_Is8Dot3(getdatakey(dataNode).name)) + count++; + } else { + if (cm_Is8Dot3(getdatakey(dataNode).name) && + smb_V3MatchMask(getdatakey(dataNode).name, maskp, CM_FLAG_CASEFOLD) || + getdatavalue(dataNode).longname == NULL && + smb_V3MatchMask(getdatavalue(dataNode).longname, maskp, CM_FLAG_CASEFOLD)) + count++; + } + nextDataNode = getdatanext(dataNode); + } + } + + nextLeafNode = getnextnode(leafNode); + } + + sprintf(buffer, "BPlusTreeEnumerate count = %d", count); + osi_Log1(afsd_logp, "BPlus: %s", osi_LogSaveString(afsd_logp, buffer)); + + /* Allocate the enumeration object */ + enump = cm_BPlusEnumAlloc(count); + if (enump == NULL) { + osi_Log0(afsd_logp, "cm_BPlusDirEnumerate Alloc failed"); + rc = ENOMEM; + goto done; + } + + /* Copy the name and fid for each longname entry into the enumeration */ + for (count = 0, leafNode = getleaf(scp->dirBplus); leafNode; leafNode = nextLeafNode) { + + for ( slot = 1, numentries = numentries(leafNode); slot <= numentries; slot++) { + firstDataNode = getnode(leafNode, slot); + + for ( dataNode = firstDataNode; dataNode; dataNode = nextDataNode) { + char * name; + int hasShortName; + int includeIt = 0; + + if (maskp == NULL) { + if (getdatavalue(dataNode).longname != NULL || + cm_Is8Dot3(getdatakey(dataNode).name)) + { + includeIt = 1; + } + } else { + if (cm_Is8Dot3(getdatakey(dataNode).name) && + smb_V3MatchMask(getdatakey(dataNode).name, maskp, CM_FLAG_CASEFOLD) || + getdatavalue(dataNode).longname == NULL && + smb_V3MatchMask(getdatavalue(dataNode).longname, maskp, CM_FLAG_CASEFOLD)) + { + includeIt = 1; + } + } + + if (includeIt) { + if (getdatavalue(dataNode).longname) { + name = strdup(getdatavalue(dataNode).longname); + hasShortName = 1; + } else { + name = strdup(getdatakey(dataNode).name); + hasShortName = 0; + } + + if (name == NULL) { + osi_Log0(afsd_logp, "cm_BPlusDirEnumerate strdup failed"); + rc = ENOMEM; + goto done; + } + enump->entry[count].name = name; + enump->entry[count].fid = getdatavalue(dataNode).fid; + if (hasShortName) + strncpy(enump->entry[count].shortName, getdatakey(dataNode).name, + sizeof(enump->entry[count].shortName)); + else + enump->entry[count].shortName[0] = '\0'; + count++; + } + nextDataNode = getdatanext(dataNode); + } + } + + nextLeafNode = getnextnode(leafNode); + } + + done: + if (!locked) + lock_ReleaseRead(&scp->dirlock); + + /* if we failed, cleanup any mess */ + if (rc != 0) { + osi_Log0(afsd_logp, "cm_BPlusDirEnumerate rc != 0"); + if (enump) { + for ( count = 0; count < enump->count && enump->entry[count].name; count++ ) { + free(enump->entry[count].name); + } + free(enump); + enump = NULL; + } + } + + osi_Log0(afsd_logp, "cm_BPlusDirEnumerate end"); + *enumpp = enump; + return rc; +} + +long +cm_BPlusDirNextEnumEntry(cm_direnum_t *enump, cm_direnum_entry_t **entrypp) +{ + if (enump == NULL || entrypp == NULL || enump->next > enump->count) { + if (entrypp) + *entrypp = NULL; + osi_Log0(afsd_logp, "cm_BPlusDirNextEnumEntry invalid input"); + return CM_ERROR_INVAL; \ + } + + *entrypp = &enump->entry[enump->next++]; + if ( enump->next == enump->count ) { + osi_Log0(afsd_logp, "cm_BPlusDirNextEnumEntry STOPNOW"); + return CM_ERROR_STOPNOW; + } + else { + osi_Log0(afsd_logp, "cm_BPlusDirNextEnumEntry SUCCESS"); + return 0; + } +} + +long +cm_BPlusDirFreeEnumeration(cm_direnum_t *enump) +{ + afs_uint32 count; + + osi_Log0(afsd_logp, "cm_BPlusDirFreeEnumeration"); + + if (enump) { + for ( count = 0; count < enump->count && enump->entry[count].name; count++ ) { + free(enump->entry[count].name); + } + free(enump); + } + return 0; +} + +long +cm_BPlusDirEnumTest(cm_scache_t * dscp, afs_uint32 locked) +{ + cm_direnum_t * enump = NULL; + cm_direnum_entry_t * entryp; + long code; + + osi_Log0(afsd_logp, "cm_BPlusDirEnumTest start"); + + for (code = cm_BPlusDirEnumerate(dscp, locked, NULL, &enump); code == 0; ) { + code = cm_BPlusDirNextEnumEntry(enump, &entryp); + if (code == 0 || code == CM_ERROR_STOPNOW) { + char buffer[1024]; + cm_scache_t *scp; + char * type = "ScpNotFound"; + afs_uint64 dv = -1; + + scp = cm_FindSCache(&entryp->fid); + if (scp) { + switch (scp->fileType) { + case CM_SCACHETYPE_FILE : + type = "File"; + break; + case CM_SCACHETYPE_DIRECTORY : + type = "Directory"; + break; + case CM_SCACHETYPE_SYMLINK : + type = "Symlink"; + break; + case CM_SCACHETYPE_MOUNTPOINT: + type = "MountPoint"; + break; + case CM_SCACHETYPE_DFSLINK : + type = "Dfs"; + break; + case CM_SCACHETYPE_INVALID : + type = "Invalid"; + break; + default: + type = "Unknown"; + break; + } + + dv = scp->dataVersion; + cm_ReleaseSCache(scp); + } + + sprintf(buffer, "'%s' Fid = (%d,%d,%d,%d) Short = '%s' Type %s DV %I64d", + entryp->name, + entryp->fid.cell, entryp->fid.volume, entryp->fid.vnode, entryp->fid.unique, + entryp->shortName, + type, + dv); + + osi_Log0(afsd_logp, osi_LogSaveString(afsd_logp, buffer)); + } + } + + if (enump) + cm_BPlusDirFreeEnumeration(enump); + + osi_Log0(afsd_logp, "cm_BPlusDirEnumTest end"); + + return 0; +} #endif /* USE_BPLUS */ diff --git a/src/WINNT/afsd/cm_btree.h b/src/WINNT/afsd/cm_btree.h index b157e58c1b..695ee3339f 100644 --- a/src/WINNT/afsd/cm_btree.h +++ b/src/WINNT/afsd/cm_btree.h @@ -107,10 +107,8 @@ typedef struct tree { unsigned int height; /* nodes traversed from root to leaves */ Nptr pool; /* list of all nodes */ Nptr empty; /* list of empty nodes */ - keyT theKey; /* the key value used in tree operations */ - dataT theData; /* data used for insertions/deletions */ union { /* nodes to change in insert and delete */ - Nptr split; + Nptr split; /* protected by scp->dirlock write-lock */ Nptr merge; } branch; KeyCmp keycmp; /* pointer to function comparing two keys */ @@ -145,10 +143,34 @@ long cm_BPlusDirBuildTree(cm_scache_t *scp, cm_user_t *userp, cm_req_t* reqp); void cm_BPlusDumpStats(void); int cm_MemDumpBPlusStats(FILE *outputFile, char *cookie, int lock); + +/******************* directory enumeration operations ****************/ +typedef struct cm_direnum_entry { + char * name; + cm_fid_t fid; + char shortName[13]; +} cm_direnum_entry_t; + +typedef struct cm_direnum { + afs_uint32 count; + afs_uint32 next; + cm_direnum_entry_t entry[1]; +} cm_direnum_t; + +long cm_BPlusDirEnumerate(cm_scache_t *scp, afs_uint32 locked, char *maskp, cm_direnum_t **enumpp); +long cm_BPlusDirNextEnumEntry(cm_direnum_t *enump, cm_direnum_entry_t **entrypp); +long cm_BPlusDirFreeEnumeration(cm_direnum_t *enump); +long cm_BPlusDirEnumTest(cm_scache_t * dscp, afs_uint32 locked); + +long cm_InitBPlusDir(void); + +/************ Statistic Counter ***************************************/ + extern afs_uint32 bplus_free_tree; extern afs_uint32 bplus_dv_error; extern afs_uint64 bplus_free_time; + /************ Accessor Macros *****************************************/ /* low level definition of Nptr value usage */ @@ -227,14 +249,6 @@ extern afs_uint64 bplus_free_time; #define xferentry(j, q, v, z) _xferentry(j, q, v, z) #define setentry(j, q, v, z) _setentry(j, q, v, z) - -/* access key and data values for B+tree methods */ -/* pass values to getSlot(), descend...() */ -#define getfunkey(B) ((B)->theKey) -#define getfundata(B) ((B)->theData) -#define setfunkey(B,v) ((B)->theKey = (v)) -#define setfundata(B,v) ((B)->theData = (v)) - /* define number of B+tree nodes for free node pool */ #define getpoolsize(B) ((B)->poolsize) #define setpoolsize(B,v) ((B)->poolsize = (v)) diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c index 84c216c0cd..52658f18e4 100644 --- a/src/WINNT/afsd/cm_buf.c +++ b/src/WINNT/afsd/cm_buf.c @@ -91,7 +91,7 @@ static int buf_ShutdownFlag = 0; void buf_HoldLocked(cm_buf_t *bp) { - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); bp->refCount++; } @@ -107,12 +107,12 @@ void buf_Hold(cm_buf_t *bp) void buf_ReleaseLocked(cm_buf_t *bp) { /* ensure that we're in the LRU queue if our ref count is 0 */ - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); #ifdef DEBUG if (bp->refCount == 0) osi_panic("buf refcount 0",__FILE__,__LINE__);; #else - osi_assert(bp->refCount > 0); + osi_assertx(bp->refCount > 0, "cm_buf_t refCount == 0"); #endif if (--bp->refCount == 0) { if (!(bp->flags & CM_BUF_INLRU)) { @@ -327,8 +327,10 @@ long buf_Init(int newFile, cm_buf_ops_t *opsp, afs_uint64 nbuffers) cm_data.buf_allp = NULL; for (i=0; i= cm_data.bufHeaderBaseAddress && bp < (cm_buf_t *)cm_data.bufDataBaseAddress); - osi_assert(data >= cm_data.bufDataBaseAddress && data < cm_data.bufEndOfData); + osi_assertx(bp >= cm_data.bufHeaderBaseAddress && bp < (cm_buf_t *)cm_data.bufDataBaseAddress, + "invalid cm_buf_t address"); + osi_assertx(data >= cm_data.bufDataBaseAddress && data < cm_data.bufEndOfData, + "invalid cm_buf_t data address"); /* allocate and zero some storage */ memset(bp, 0, sizeof(cm_buf_t)); @@ -482,8 +484,8 @@ void buf_WaitIO(cm_scache_t * scp, cm_buf_t *bp) int release = 0; if (scp) - osi_assert(scp->magic == CM_SCACHE_MAGIC); - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(scp->magic == CM_SCACHE_MAGIC, "invalid cm_scache_t magic"); + osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); while (1) { /* if no IO is happening, we're done */ @@ -595,7 +597,7 @@ long buf_CleanAsyncLocked(cm_buf_t *bp, cm_req_t *reqp) cm_scache_t * scp = NULL; osi_hyper_t offset; - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); while ((bp->flags & CM_BUF_DIRTY) == CM_BUF_DIRTY) { isdirty = 1; @@ -675,7 +677,7 @@ void buf_Recycle(cm_buf_t *bp) cm_buf_t *tbp; cm_buf_t *prevBp, *nextBp; - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); /* if we get here, we know that the buffer still has a 0 ref count, * and that it is clean and has no currently pending I/O. This is @@ -687,8 +689,9 @@ void buf_Recycle(cm_buf_t *bp) osi_Log3( buf_logp, "buf_Recycle recycles 0x%p, off 0x%x:%08x", bp, bp->offset.HighPart, bp->offset.LowPart); - osi_assert(bp->refCount == 0); - osi_assert(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING | CM_BUF_DIRTY))); + osi_assertx(bp->refCount == 0, "cm_buf_t refcount != 0"); + osi_assertx(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING | CM_BUF_DIRTY)), + "incorrect cm_buf_t flags"); lock_AssertWrite(&buf_globalLock); if (bp->flags & CM_BUF_INHASH) { @@ -1036,7 +1039,7 @@ long buf_Get(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) */ if (created) { /* load the page; freshly created pages should be idle */ - osi_assert(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING))); + osi_assertx(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING)), "incorrect cm_buf_t flags"); /* start the I/O; may drop lock */ bp->flags |= CM_BUF_READING; @@ -1146,7 +1149,7 @@ long buf_CountFreeList(void) long buf_CleanAsync(cm_buf_t *bp, cm_req_t *reqp) { long code; - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); lock_ObtainMutex(&bp->mx); code = buf_CleanAsyncLocked(bp, reqp); @@ -1158,7 +1161,7 @@ long buf_CleanAsync(cm_buf_t *bp, cm_req_t *reqp) /* wait for a buffer's cleaning to finish */ void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp) { - osi_assert(bp->magic == CM_BUF_MAGIC); + osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); lock_ObtainMutex(&bp->mx); if (bp->flags & CM_BUF_WRITING) { @@ -1174,8 +1177,8 @@ void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp) */ void buf_SetDirty(cm_buf_t *bp, afs_uint32 offset, afs_uint32 length) { - osi_assert(bp->magic == CM_BUF_MAGIC); - osi_assert(bp->refCount > 0); + osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); + osi_assertx(bp->refCount > 0, "cm_buf_t refcount 0"); lock_ObtainWrite(&buf_globalLock); if (bp->flags & CM_BUF_DIRTY) { @@ -1425,7 +1428,7 @@ long buf_Truncate(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, * visible again. */ bufferPos = sizep->LowPart & (cm_data.buf_blockSize - 1); - osi_assert(bufferPos != 0); + osi_assertx(bufferPos != 0, "non-zero bufferPos"); memset(bufp->datap + bufferPos, 0, cm_data.buf_blockSize - bufferPos); } @@ -1547,13 +1550,14 @@ long buf_FlushCleanPages(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) } /* Must be called with scp->mx held */ -long buf_ForceDataVersion(cm_scache_t * scp, afs_uint32 fromVersion, afs_uint32 toVersion) +long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion) { cm_buf_t * bp; - cm_buf_t * nbp; unsigned int i; int found = 0; + lock_AssertMutex(&scp->mx); + i = BUF_FILEHASH(&scp->fid); lock_ObtainWrite(&buf_globalLock); @@ -1689,7 +1693,7 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock) { StringCbPrintfA(output, sizeof(output), "%s bp=0x%08X, hash=%d, fid (cell=%d, volume=%d, " - "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, " + "vnode=%d, unique=%d), offset=%x:%08x, dv=%I64d, " "flags=0x%x, cmFlags=0x%x, refCount=%d\r\n", cookie, (void *)bp, i, bp->fid.cell, bp->fid.volume, bp->fid.vnode, bp->fid.unique, bp->offset.HighPart, @@ -1707,7 +1711,7 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock) for(bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) { StringCbPrintfA(output, sizeof(output), "%s bp=0x%08X, fid (cell=%d, volume=%d, " - "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, " + "vnode=%d, unique=%d), offset=%x:%08x, dv=%I64d, " "flags=0x%x, cmFlags=0x%x, refCount=%d\r\n", cookie, (void *)bp, bp->fid.cell, bp->fid.volume, bp->fid.vnode, bp->fid.unique, bp->offset.HighPart, @@ -1723,7 +1727,7 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock) for(bp = cm_data.buf_dirtyListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) { StringCbPrintfA(output, sizeof(output), "%s bp=0x%08X, fid (cell=%d, volume=%d, " - "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, " + "vnode=%d, unique=%d), offset=%x:%08x, dv=%I64d, " "flags=0x%x, cmFlags=0x%x, refCount=%d\r\n", cookie, (void *)bp, bp->fid.cell, bp->fid.volume, bp->fid.vnode, bp->fid.unique, bp->offset.HighPart, diff --git a/src/WINNT/afsd/cm_buf.h b/src/WINNT/afsd/cm_buf.h index f2536f3e3b..1c9b46f780 100644 --- a/src/WINNT/afsd/cm_buf.h +++ b/src/WINNT/afsd/cm_buf.h @@ -78,7 +78,7 @@ typedef struct cm_buf { cm_user_t *userp; /* user who wrote to the buffer last */ /* fields added for the CM; locked by scp->mx */ - afs_uint32 dataVersion; /* data version of this page */ + afs_uint64 dataVersion; /* data version of this page */ afs_uint32 cmFlags; /* flags for cm */ /* syncop state */ @@ -201,7 +201,7 @@ extern long buf_DirtyBuffersExist(cm_fid_t * fidp); extern long buf_CleanDirtyBuffers(cm_scache_t *scp); -extern long buf_ForceDataVersion(cm_scache_t * scp, afs_uint32 fromVersion, afs_uint32 toVersion); +extern long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion); /* error codes */ #define CM_BUF_EXISTS 1 /* buffer exists, and shouldn't */ diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index c296bd5128..a9689ffbd2 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -34,6 +34,10 @@ /* read/write lock for all global storage in this module */ osi_rwlock_t cm_callbackLock; +afs_int32 cm_OfflineROIsValid = 0; + +afs_int32 cm_giveUpAllCBs = 0; + #ifdef AFS_FREELANCE_CLIENT extern osi_mutex_t cm_Freelance_Lock; #endif @@ -265,6 +269,11 @@ void cm_RevokeVolumeCallback(struct rx_call *callp, cm_cell_t *cellp, AFSFid *fi cm_CallbackNotifyChange(scp); lock_ObtainWrite(&cm_scacheLock); cm_ReleaseSCacheNoLock(scp); + + if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) { + scp->volp->cbExpiresRO = 0; + } + } } /* search one hash bucket */ } /* search all hash buckets */ @@ -482,6 +491,10 @@ SRXAFSCB_InitCallBackState(struct rx_call *callp) cm_CallbackNotifyChange(scp); lock_ObtainWrite(&cm_scacheLock); cm_ReleaseSCacheNoLock(scp); + + if (discarded && (scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp && scp->volp->cbExpiresRO != 0) + scp->volp->cbExpiresRO = 0; + } /* search one hash bucket */ } /* search all hash buckets */ @@ -737,9 +750,12 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep) cep->lock.pid_writer = 0; cep->lock.src_indicator = 0; cep->Length = scp->length.LowPart; - cep->DataVersion = scp->dataVersion; + cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF); cep->callback = afs_data_pointer_to_int32(scp->cbServerp); - cep->cbExpires = scp->cbExpires; + if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) + cep->cbExpires = scp->volp->cbExpiresRO; + else + cep->cbExpires = scp->cbExpires; cep->refCount = scp->refCount; cep->opens = scp->openReads; cep->writers = scp->openWrites; @@ -848,9 +864,12 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep) #else cep->Length = (afs_int64) scp->length.QuadPart; #endif - cep->DataVersion = scp->dataVersion; + cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF); cep->callback = afs_data_pointer_to_int32(scp->cbServerp); - cep->cbExpires = scp->cbExpires; + if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) + cep->cbExpires = scp->volp->cbExpiresRO; + else + cep->cbExpires = scp->cbExpires; cep->refCount = scp->refCount; cep->opens = scp->openReads; cep->writers = scp->openWrites; @@ -1418,7 +1437,7 @@ int SRXAFSCB_GetCacheConfig(struct rx_call *callp, #ifndef SIZE_MAX #define SIZE_MAX UINT_MAX #endif - osi_assert(allocsize < SIZE_MAX); + osi_assertx(allocsize < SIZE_MAX, "allocsize >= SIZE_MAX"); #endif *configCount = (afs_uint32)allocsize; config->cacheConfig_val = t_config; @@ -1487,10 +1506,20 @@ int cm_HaveCallback(cm_scache_t *scp) } #endif - if (scp->cbServerp != NULL) + if (scp->cbServerp != NULL) { return 1; - else + } else if (cm_OfflineROIsValid) { + switch (cm_GetVolumeStatus(scp->volp, scp->fid.volume)) { + case vl_offline: + case vl_alldown: + case vl_unknown: + return 1; + default: + return 0; + } + } else { return 0; + } } /* need to detect a broken callback that races with our obtaining a callback. @@ -1517,7 +1546,7 @@ void cm_StartCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp) lock_ObtainWrite(&cm_callbackLock); cbrp->callbackCount = cm_callbackCount; cm_activeCallbackGrantingCalls++; - cbrp->startTime = osi_Time(); + cbrp->startTime = time(NULL); cbrp->serverp = NULL; lock_ReleaseWrite(&cm_callbackLock); } @@ -1535,14 +1564,16 @@ void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp, cm_racingRevokes_t *nrevp; /* where we'll be next */ int freeFlag; cm_server_t * serverp = NULL; - int discardScp = 0; + int discardScp = 0, discardVolCB = 0; lock_ObtainWrite(&cm_callbackLock); if (flags & CM_CALLBACK_MAINTAINCOUNT) { - osi_assert(cm_activeCallbackGrantingCalls > 0); + osi_assertx(cm_activeCallbackGrantingCalls > 0, + "CM_CALLBACK_MAINTAINCOUNT && cm_activeCallbackGrantingCalls == 0"); } else { - osi_assert(cm_activeCallbackGrantingCalls-- > 0); + osi_assertx(cm_activeCallbackGrantingCalls-- > 0, + "!CM_CALLBACK_MAINTAINCOUNT && cm_activeCallbackGrantingCalls == 0"); } if (cm_activeCallbackGrantingCalls == 0) freeFlag = 1; @@ -1562,6 +1593,8 @@ void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp, serverp = cbrp->serverp; } scp->cbExpires = cbrp->startTime + cbp->ExpirationTime; + if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) + scp->volp->cbExpiresRO = scp->cbExpires; } else { if (freeFlag) serverp = cbrp->serverp; @@ -1599,6 +1632,10 @@ void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp, cbrp->callbackCount, revp->callbackCount, cm_callbackCount); discardScp = 1; + + if ((scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp && + (revp->flags & (CM_RACINGFLAG_CANCELVOL | CM_RACINGFLAG_CANCELALL))) + scp->volp->cbExpiresRO = 0; } if (freeFlag) free(revp); @@ -1810,6 +1847,11 @@ void cm_CheckCBExpiration(void) for (i=0; inextp) { downTime = 0; + if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) { + if (scp->volp->cbExpiresRO > scp->cbExpires && scp->cbExpires > 0) + scp->cbExpires = scp->volp->cbExpiresRO; + } + if (scp->cbServerp && scp->cbExpires > 0 && now > scp->cbExpires && (cm_CBServersUp(scp, &downTime) || downTime == 0 || downTime >= scp->cbExpires)) { @@ -1891,6 +1933,9 @@ cm_GiveUpAllCallbacksAllServers(afs_int32 markDown) { cm_server_t *tsp; + if (!cm_giveUpAllCBs) + return; + lock_ObtainWrite(&cm_serverLock); for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { cm_GetServerNoLock(tsp); diff --git a/src/WINNT/afsd/cm_callback.h b/src/WINNT/afsd/cm_callback.h index 5f6653f245..eff1a47a1e 100644 --- a/src/WINNT/afsd/cm_callback.h +++ b/src/WINNT/afsd/cm_callback.h @@ -72,4 +72,7 @@ extern void cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown); extern void cm_GiveUpAllCallbacksAllServers(afs_int32 markDown); +extern afs_int32 cm_OfflineROIsValid; + +extern afs_int32 cm_giveUpAllCBs; #endif /* _CM_CALLBACK_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 1d93af048b..b22a07d4b5 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -359,6 +359,9 @@ void cm_InitCell(int newFile, long maxCells) cellp->cellID = AFS_FAKE_ROOT_CELL_ID; cellp->vlServersp = NULL; cellp->flags = CM_CELLFLAG_FREELANCE; + + cm_AddCellToNameHashTable(cellp); + cm_AddCellToIDHashTable(cellp); #endif } else { for (cellp = cm_data.allCellsp; cellp; cellp=cellp->allNextp) { diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 074bca09d0..52f0318acc 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -44,7 +44,7 @@ afs_int32 cryptall = 0; void cm_PutConn(cm_conn_t *connp) { lock_ObtainWrite(&cm_connLock); - osi_assert(connp->refCount-- > 0); + osi_assertx(connp->refCount-- > 0, "cm_conn_t refcount 0"); lock_ReleaseWrite(&cm_connLock); } @@ -244,7 +244,16 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, cellp); retry = 1; } - } + } + + else if (errorCode == UAEWOULDBLOCK || errorCode == EWOULDBLOCK || + errorCode == UAEAGAIN || errorCode == EAGAIN) { + osi_Log0(afsd_logp, "cm_Analyze passed EWOULDBLOCK or EAGAIN."); + if (timeLeft > 5 ) { + thrd_Sleep(1000); + retry = 1; + } + } /* if there is nosuchvolume, then we have a situation in which a * previously known volume no longer has a set of servers @@ -639,6 +648,8 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, case UAENOENT : s = "UAENOENT"; break; case VICECONNBAD : s = "VICECONNBAD"; break; case VICETOKENDEAD : s = "VICETOKENDEAD"; break; + case WSAEWOULDBLOCK : s = "WSAEWOULDBLOCK"; break; + case UAEWOULDBLOCK : s = "UAEWOULDBLOCK"; break; case CM_ERROR_NOSUCHCELL : s = "CM_ERROR_NOSUCHCELL"; break; case CM_ERROR_NOSUCHVOLUME : s = "CM_ERROR_NOSUCHVOLUME"; break; case CM_ERROR_TIMEDOUT : s = "CM_ERROR_TIMEDOUT"; break; @@ -846,7 +857,7 @@ static void cm_NewRXConnection(cm_conn_t *tcp, cm_ucell_t *ucellp, serviceID = 52; } else { - osi_assert(serverp->type == CM_SERVER_FILE); + osi_assertx(serverp->type == CM_SERVER_FILE, "incorrect server type"); port = htons(7000); serviceID = 1; } @@ -894,7 +905,7 @@ static void cm_NewRXConnection(cm_conn_t *tcp, cm_ucell_t *ucellp, tcp->cryptlevel = rxkad_clear; secObjp = rxnull_NewClientSecurityObject(); } - osi_assert(secObjp != NULL); + osi_assertx(secObjp != NULL, "null rx_securityClass"); tcp->callp = rx_NewConnection(serverp->addr.sin_addr.s_addr, port, serviceID, diff --git a/src/WINNT/afsd/cm_daemon.c b/src/WINNT/afsd/cm_daemon.c index 647a5eac75..45cff1c59a 100644 --- a/src/WINNT/afsd/cm_daemon.c +++ b/src/WINNT/afsd/cm_daemon.c @@ -34,6 +34,7 @@ long cm_daemonCheckDownInterval = 180; long cm_daemonCheckUpInterval = 240; long cm_daemonCheckVolInterval = 3600; long cm_daemonCheckCBInterval = 60; +long cm_daemonCheckVolCBInterval = 0; long cm_daemonCheckLockInterval = 60; long cm_daemonTokenCheckInterval = 180; long cm_daemonCheckOfflineVolInterval = 600; @@ -101,7 +102,7 @@ void cm_BkgDaemon(long parm) } osi_QRemoveHT((osi_queue_t **) &cm_bkgListp, (osi_queue_t **) &cm_bkgListEndp, &rp->q); - osi_assert(cm_bkgQueueCount-- > 0); + osi_assertx(cm_bkgQueueCount-- > 0, "cm_bkgQueueCount 0"); lock_ReleaseWrite(&cm_daemonLock); osi_Log1(afsd_logp,"cm_BkgDaemon processing request 0x%p", rp); @@ -274,6 +275,13 @@ cm_DaemonCheckInit(void) cm_daemonCheckCBInterval = dummy; afsi_log("daemonCheckCBInterval is %d", cm_daemonCheckCBInterval); + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "daemonCheckVolCBInterval", NULL, NULL, + (BYTE *) &dummy, &dummyLen); + if (code == ERROR_SUCCESS) + cm_daemonCheckVolCBInterval = dummy; + afsi_log("daemonCheckVolCBInterval is %d", cm_daemonCheckVolCBInterval); + dummyLen = sizeof(DWORD); code = RegQueryValueEx(parmKey, "daemonCheckLockInterval", NULL, NULL, (BYTE *) &dummy, &dummyLen); @@ -305,6 +313,7 @@ void cm_Daemon(long parm) time_t lastLockCheck; time_t lastVolCheck; time_t lastCBExpirationCheck; + time_t lastVolCBRenewalCheck; time_t lastDownServerCheck; time_t lastUpServerCheck; time_t lastTokenCacheCheck; @@ -344,6 +353,8 @@ void cm_Daemon(long parm) now = osi_Time(); lastVolCheck = now - cm_daemonCheckVolInterval/2 + (rand() % cm_daemonCheckVolInterval); lastCBExpirationCheck = now - cm_daemonCheckCBInterval/2 + (rand() % cm_daemonCheckCBInterval); + if (cm_daemonCheckVolCBInterval) + lastVolCBRenewalCheck = now - cm_daemonCheckVolCBInterval/2 + (rand() % cm_daemonCheckVolCBInterval); lastLockCheck = now - cm_daemonCheckLockInterval/2 + (rand() % cm_daemonCheckLockInterval); lastDownServerCheck = now - cm_daemonCheckDownInterval/2 + (rand() % cm_daemonCheckDownInterval); lastUpServerCheck = now - cm_daemonCheckUpInterval/2 + (rand() % cm_daemonCheckUpInterval); @@ -356,7 +367,10 @@ void cm_Daemon(long parm) */ smb_RestartListeners(); - if (configureFirewall) { + if (daemon_ShutdownFlag == 1) + return; + + if (configureFirewall) { /* Open Microsoft Firewall to allow in port 7001 */ switch (icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT)) { case 0: @@ -381,48 +395,79 @@ void cm_Daemon(long parm) now = osi_Time(); /* check down servers */ - if (now > lastDownServerCheck + cm_daemonCheckDownInterval) { + if (now > lastDownServerCheck + cm_daemonCheckDownInterval && + daemon_ShutdownFlag == 0) { lastDownServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckDownServers"); cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } /* check up servers */ - if (now > lastUpServerCheck + cm_daemonCheckUpInterval) { + if (now > lastUpServerCheck + cm_daemonCheckUpInterval && + daemon_ShutdownFlag == 0) { lastUpServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckUpServers"); cm_CheckServers(CM_FLAG_CHECKUPSERVERS, NULL); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastVolCheck + cm_daemonCheckVolInterval) { + if (now > lastVolCheck + cm_daemonCheckVolInterval && + daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_RefreshVolumes(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval) { + if (cm_daemonCheckVolCBInterval && + now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval && + daemon_ShutdownFlag == 0) { + lastVolCBRenewalCheck = now; + cm_VolumeRenewROCallbacks(); + if (daemon_ShutdownFlag == 1) + return; + now = osi_Time(); + } + + if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval && + daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_CheckOfflineVolumes(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval) { + if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval && + daemon_ShutdownFlag == 0) { lastCBExpirationCheck = now; cm_CheckCBExpiration(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastLockCheck + cm_daemonCheckLockInterval) { + if (now > lastLockCheck + cm_daemonCheckLockInterval && + daemon_ShutdownFlag == 0) { lastLockCheck = now; cm_CheckLocks(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval) { + if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval && + daemon_ShutdownFlag == 0) { lastTokenCacheCheck = now; cm_CheckTokenCache(now); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } @@ -445,9 +490,9 @@ void cm_Daemon(long parm) } } - thrd_Sleep(30 * 1000); /* sleep 30 seconds */ if (daemon_ShutdownFlag == 1) return; + thrd_Sleep(30 * 1000); /* sleep 30 seconds */ } } @@ -471,21 +516,21 @@ void cm_InitDaemon(int nDaemons) /* creating IP Address Change monitor daemon */ phandle = thrd_Create((SecurityAttrib) 0, 0, (ThreadFunc) cm_IpAddrDaemon, 0, 0, &pid, "cm_IpAddrDaemon"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "cm_IpAddrDaemon thread creation failure"); thrd_CloseHandle(phandle); #endif /* DJGPP */ /* creating pinging daemon */ phandle = thrd_Create((SecurityAttrib) 0, 0, (ThreadFunc) cm_Daemon, 0, 0, &pid, "cm_Daemon"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "cm_Daemon thread creation failure"); thrd_CloseHandle(phandle); for(i=0; i < nDaemons; i++) { phandle = thrd_Create((SecurityAttrib) 0, 0, (ThreadFunc) cm_BkgDaemon, 0, 0, &pid, "cm_BkgDaemon"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "cm_BkgDaemon thread creation failure"); thrd_CloseHandle(phandle); } } diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index d551bd557b..cc08c91f65 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -75,8 +75,8 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags, cm_bulkIO_t biod; /* bulk IO descriptor */ int require_64bit_ops = 0; - osi_assert(userp != NULL); - osi_assert(scp != NULL); + osi_assertx(userp != NULL, "null cm_user_t"); + osi_assertx(scp != NULL, "null cm_scache_t"); /* now, the buffer may or may not be filled with good data (buf_GetNew * drops lots of locks, and may indeed return a properly initialized @@ -207,7 +207,7 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags, qdp = biod.bufListEndp; else qdp = (osi_queueData_t *) osi_QPrev(&qdp->q); - osi_assert(qdp != NULL); + osi_assertx(qdp != NULL, "null osi_queueData_t"); bufp = osi_GetQData(qdp); bufferp = bufp->datap; wbytes = nbytes; @@ -1376,7 +1376,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp if ((bufp->dataVersion == -1 || bufp->dataVersion < scp->dataVersion) && LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->serverLength)) { - osi_Log3(afsd_logp, "Bad DVs %d, %d or length 0x%x", + osi_Log3(afsd_logp, "Bad DVs %I64d, %I64d or length 0x%x", bufp->dataVersion, scp->dataVersion, biod.length); if (bufp->dataVersion == -1) @@ -1398,7 +1398,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp } #ifdef DISKCACHE95 - DPRINTF("cm_GetBuffer: fetching data scpDV=%d bufDV=%d scp=%x bp=%x dcp=%x\n", + DPRINTF("cm_GetBuffer: fetching data scpDV=%I64d bufDV=%I64d scp=%x bp=%x dcp=%x\n", scp->dataVersion, bufp->dataVersion, scp, bufp, bufp->dcp); #endif /* DISKCACHE95 */ @@ -1414,7 +1414,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp afsStatus.FileType = 0x2; afsStatus.LinkCount = scp->linkCount; afsStatus.Length = cm_fakeDirSize; - afsStatus.DataVersion = cm_data.fakeDirVersion; + afsStatus.DataVersion = (afs_uint32)(cm_data.fakeDirVersion & 0xFFFFFFFF); afsStatus.Author = 0x1; afsStatus.Owner = 0x0; afsStatus.CallerAccess = 0x9; @@ -1427,7 +1427,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp afsStatus.ServerModTime = (afs_uint32)FakeFreelanceModTime; afsStatus.Group = 0; afsStatus.SyncCounter = 0; - afsStatus.dataVersionHigh = 0; + afsStatus.dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32); afsStatus.lockCount = 0; afsStatus.Length_hi = 0; afsStatus.errorCode = 0; @@ -1573,7 +1573,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp * our check above for nbytes being less than * biod.length should ensure this. */ - osi_assert(bufferp != NULL); + osi_assertx(bufferp != NULL, "null cm_buf_t"); /* read rbytes of data */ rbytes = (nbytes > cm_data.buf_blockSize? cm_data.buf_blockSize : nbytes); @@ -1624,7 +1624,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp * all of the rest of the pages. */ /* bytes fetched */ - osi_assert((bufferp - tbufp->datap) < LONG_MAX); + osi_assertx((bufferp - tbufp->datap) < LONG_MAX, "data >= LONG_MAX"); rbytes = (long) (bufferp - tbufp->datap); /* bytes left to zero */ @@ -1681,7 +1681,9 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { tbufp = osi_GetQData(qdp); - tbufp->dataVersion = afsStatus.DataVersion; + tbufp->dataVersion = afsStatus.dataVersionHigh; + tbufp->dataVersion <<= 32; + tbufp->dataVersion |= afsStatus.DataVersion; #ifdef DISKCACHE95 /* write buffer out to disk cache */ diff --git a/src/WINNT/afsd/cm_dir.c b/src/WINNT/afsd/cm_dir.c index fa05827dee..bf41ab4b8d 100644 --- a/src/WINNT/afsd/cm_dir.c +++ b/src/WINNT/afsd/cm_dir.c @@ -100,7 +100,7 @@ static int cm_DirOpDelBuffer(cm_dirOp_t * op, cm_buf_t * buffer, int flags); static long -cm_DirCheckStatus(cm_dirOp_t * op); +cm_DirCheckStatus(cm_dirOp_t * op, afs_uint32 locked); static long cm_DirReleasePage(cm_dirOp_t * op, cm_buf_t ** bufferpp, int modified); @@ -958,15 +958,15 @@ cm_DirFindItem(cm_dirOp_t * op, } } -/* Begin a sequence of directory operations. scp->mx should be - locked. -*/ +/* Begin a sequence of directory operations. + * Called with scp->mx unlocked. + */ long cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp, afs_uint32 lockType, cm_dirOp_t * op) { long code; - int i, mxheld = 0; + int i, mxheld = 0, haveWrite = 0; osi_Log3(afsd_logp, "Beginning dirOp[0x%p] for scp[0x%p], userp[0x%p]", op, scp, userp); @@ -986,8 +986,16 @@ cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp, op->buffers[i].flags = 0; } - code = cm_DirCheckStatus(op); - + if (lockType == CM_DIRLOCK_WRITE) { + lock_ObtainWrite(&scp->dirlock); + haveWrite = 1; + } else { + lock_ObtainRead(&scp->dirlock); + haveWrite = 0; + } + lock_ObtainMutex(&scp->mx); + mxheld = 1; + code = cm_DirCheckStatus(op, 1); if (code == 0) { op->length = scp->length; op->newLength = op->length; @@ -995,42 +1003,77 @@ cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp, op->newDataVersion = op->dataVersion; #ifdef USE_BPLUS - lock_ObtainRead(&scp->dirlock); if (!cm_BPlusTrees || (scp->dirBplus && scp->dirDataVersion == scp->dataVersion)) { - int mxheld = 0; - + /* we know that haveWrite matches lockType at this point */ switch (lockType) { case CM_DIRLOCK_NONE: - lock_ReleaseRead(&scp->dirlock); + if (haveWrite) + lock_ReleaseWrite(&scp->dirlock); + else + lock_ReleaseRead(&scp->dirlock); break; case CM_DIRLOCK_READ: - /* got it already */ + osi_assert(!haveWrite); break; case CM_DIRLOCK_WRITE: default: - lock_ReleaseRead(&scp->dirlock); - lock_ObtainWrite(&scp->dirlock); + osi_assert(haveWrite); } } else { - lock_ReleaseRead(&scp->dirlock); - lock_ObtainWrite(&scp->dirlock); - if (scp->dirBplus && - scp->dirDataVersion != scp->dataVersion) + if (!(scp->dirBplus && + scp->dirDataVersion == scp->dataVersion)) { - bplus_dv_error++; - bplus_free_tree++; - freeBtree(scp->dirBplus); - scp->dirBplus = NULL; - scp->dirDataVersion = -1; - } + repeat: + if (!haveWrite) { + if (mxheld) { + lock_ReleaseMutex(&scp->mx); + mxheld = 0; + } + lock_ReleaseRead(&scp->dirlock); + lock_ObtainWrite(&scp->dirlock); + haveWrite = 1; + } + if (!mxheld) { + lock_ObtainMutex(&scp->mx); + mxheld = 1; + } + if (scp->dirBplus && + scp->dirDataVersion != scp->dataVersion) + { + bplus_dv_error++; + bplus_free_tree++; + freeBtree(scp->dirBplus); + scp->dirBplus = NULL; + scp->dirDataVersion = -1; + } - if (!scp->dirBplus) { - cm_BPlusDirBuildTree(scp, userp, reqp); - if (scp->dirBplus) - scp->dirDataVersion = scp->dataVersion; + if (!scp->dirBplus) { + if (mxheld) { + lock_ReleaseMutex(&scp->mx); + mxheld = 0; + } + cm_BPlusDirBuildTree(scp, userp, reqp); + if (!mxheld) { + lock_ObtainMutex(&scp->mx); + mxheld = 1; + } + if (op->dataVersion != scp->dataVersion) { + /* We lost the race, therefore we must update the + * dirop state and retry to build the tree. + */ + op->length = scp->length; + op->newLength = op->length; + op->dataVersion = scp->dataVersion; + op->newDataVersion = op->dataVersion; + goto repeat; + } + + if (scp->dirBplus) + scp->dirDataVersion = scp->dataVersion; + } } switch (lockType) { @@ -1044,22 +1087,35 @@ cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp, default: /* got it already */; } + haveWrite = 0; } #else + /* we know that haveWrite matches lockType at this point */ switch (lockType) { case CM_DIRLOCK_NONE: + if (haveWrite) + lock_ReleaseWrite(&scp->dirlock); + else + lock_ReleaseRead(&scp->dirlock); break; case CM_DIRLOCK_READ: - lock_ObtainRead(&scp->dirlock); + osi_assert(!haveWrite); break; case CM_DIRLOCK_WRITE: default: - lock_ObtainWrite(&scp->dirlock); + osi_assert(haveWrite); } #endif op->lockType = lockType; + if (mxheld) + lock_ReleaseMutex(&scp->mx); } else { - + if (haveWrite) + lock_ReleaseWrite(&scp->dirlock); + else + lock_ReleaseRead(&scp->dirlock); + if (mxheld) + lock_ReleaseMutex(&scp->mx); cm_EndDirOp(op); } @@ -1072,11 +1128,13 @@ int cm_CheckDirOpForSingleChange(cm_dirOp_t * op) { long code; + int rc = 0; if (op->scp == NULL) return 0; - code = cm_DirCheckStatus(op); + lock_ObtainMutex(&op->scp->mx); + code = cm_DirCheckStatus(op, 1); if (code == 0 && op->dataVersion == op->scp->dataVersion - 1) { @@ -1086,19 +1144,21 @@ cm_CheckDirOpForSingleChange(cm_dirOp_t * op) op->newDataVersion = op->scp->dataVersion; op->newLength = op->scp->serverLength; - osi_Log0(afsd_logp, "cm_CheckDirOpForSingleChange succeeded"); - - return 1; + rc = 1; } - - osi_Log3(afsd_logp, - "cm_CheckDirOpForSingleChange failed. code=0x%x, old dv=%d, new dv=%d", - code, op->dataVersion, op->scp->dataVersion); - return 0; + lock_ReleaseMutex(&op->scp->mx); + + if (rc) + osi_Log0(afsd_logp, "cm_CheckDirOpForSingleChange succeeded"); + else + osi_Log3(afsd_logp, + "cm_CheckDirOpForSingleChange failed. code=0x%x, old dv=%I64d, new dv=%I64d", + code, op->dataVersion, op->scp->dataVersion); + return rc; } -/* End a sequence of directory operations. Called with op->scp->mx - unlocked.*/ +/* End a sequence of directory operations. + * Called with op->scp->mx unlocked.*/ long cm_EndDirOp(cm_dirOp_t * op) { @@ -1111,14 +1171,10 @@ cm_EndDirOp(cm_dirOp_t * op) op, op->dirtyBufCount); if (op->dirtyBufCount > 0) { - /* we made changes. We should go through the list of buffers - and update the dataVersion for each. */ - code = buf_ForceDataVersion(op->scp, op->dataVersion, op->newDataVersion); - #ifdef USE_BPLUS - /* and update the data version on the B+ tree */ + /* update the data version on the B+ tree */ if (op->scp->dirBplus && - op->scp->dirDataVersion == op->dataVersion) { + op->scp->dirDataVersion == op->dataVersion) { switch (op->lockType) { case CM_DIRLOCK_READ: @@ -1135,6 +1191,12 @@ cm_EndDirOp(cm_dirOp_t * op) op->scp->dirDataVersion = op->newDataVersion; } #endif + + /* we made changes. We should go through the list of buffers + * and update the dataVersion for each. */ + lock_ObtainMutex(&op->scp->mx); + code = buf_ForceDataVersion(op->scp, op->dataVersion, op->newDataVersion); + lock_ReleaseMutex(&op->scp->mx); } switch (op->lockType) { @@ -1203,19 +1265,20 @@ cm_DirOpAddBuffer(cm_dirOp_t * op, cm_buf_t * bufferp) lock_ObtainMutex(&op->scp->mx); /* Make sure we are synchronized. */ + osi_assert(op->lockType != CM_DIRLOCK_NONE); + code = cm_SyncOp(op->scp, bufferp, op->userp, &op->req, PRSFS_LOOKUP, CM_SCACHESYNC_NEEDCALLBACK | - CM_SCACHESYNC_WRITE | + (op->lockType == CM_DIRLOCK_WRITE ? CM_SCACHESYNC_WRITE : CM_SCACHESYNC_READ) | CM_SCACHESYNC_BUFLOCKED); - if (code == 0 && - bufferp->dataVersion != op->dataVersion) { - - osi_Log2(afsd_logp, "cm_DirOpAddBuffer: buffer version mismatch. buf ver = %d. want %d", bufferp->dataVersion, op->dataVersion); + if (code == 0 && bufferp->dataVersion != op->dataVersion) { + osi_Log2(afsd_logp, "cm_DirOpAddBuffer: buffer data version mismatch. buf dv = %I64d. needs %I64d", + bufferp->dataVersion, op->dataVersion); cm_SyncOpDone(op->scp, bufferp, CM_SCACHESYNC_NEEDCALLBACK | - CM_SCACHESYNC_WRITE | + (op->lockType == CM_DIRLOCK_WRITE ? CM_SCACHESYNC_WRITE : CM_SCACHESYNC_READ) | CM_SCACHESYNC_BUFLOCKED); code = CM_ERROR_INVAL; @@ -1315,7 +1378,7 @@ cm_DirOpDelBuffer(cm_dirOp_t * op, cm_buf_t * bufferp, int flags) cm_SyncOpDone(op->scp, bufferp, CM_SCACHESYNC_NEEDCALLBACK | - CM_SCACHESYNC_WRITE); + (op->lockType == CM_DIRLOCK_WRITE ? CM_SCACHESYNC_WRITE : CM_SCACHESYNC_READ)); #ifdef DEBUG osi_assert(bufferp->dataVersion == op->dataVersion); @@ -1371,23 +1434,25 @@ cm_DirOpDelBuffer(cm_dirOp_t * op, cm_buf_t * bufferp, int flags) This should be called before cm_DirGetPage() is called per scp. On entry: - scp->mx unlocked + scp->mx locked state indicated by parameter On exit: - scp->mx unlocked + scp->mx same state as upon entry During: scp->mx may be released */ static long -cm_DirCheckStatus(cm_dirOp_t * op) +cm_DirCheckStatus(cm_dirOp_t * op, afs_uint32 locked) { long code; - lock_ObtainMutex(&op->scp->mx); + if (!locked) + lock_ObtainMutex(&op->scp->mx); code = cm_SyncOp(op->scp, NULL, op->userp, &op->req, PRSFS_LOOKUP, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - lock_ReleaseMutex(&op->scp->mx); + if (!locked) + lock_ReleaseMutex(&op->scp->mx); osi_Log2(afsd_logp, "cm_DirCheckStatus for op 0x%p returning code 0x%x", op, code); diff --git a/src/WINNT/afsd/cm_dir.h b/src/WINNT/afsd/cm_dir.h index 37fe27f98f..febebb6f78 100644 --- a/src/WINNT/afsd/cm_dir.h +++ b/src/WINNT/afsd/cm_dir.h @@ -116,15 +116,15 @@ typedef struct cm_dirOp { osi_hyper_t length; /* scp->length at the time cm_BeginDirOp() was called.*/ osi_hyper_t newLength; /* adjusted scp->length */ - afs_uint32 dataVersion; /* scp->dataVersion when + afs_uint64 dataVersion; /* scp->dataVersion when cm_BeginDirOp() was called.*/ - afs_uint32 newDataVersion; /* scp->dataVersion when + afs_uint64 newDataVersion; /* scp->dataVersion when cm_CheckDirOpForSingleChange() was called. */ - afs_uint32 dirtyBufCount; + afs_uint64 dirtyBufCount; - afs_uint32 nBuffers; /* number of buffers below */ + afs_uint64 nBuffers; /* number of buffers below */ cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS]; } cm_dirOp_t; @@ -186,5 +186,5 @@ cm_DirDumpStats(void); extern int cm_MemDumpDirStats(FILE *outputFile, char *cookie, int lock); -extern afs_int64 dir_enums; +extern afs_uint64 dir_enums; #endif /* __CM_DIR_ENV__ */ diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c index 78d6568a62..3b2651cba2 100644 --- a/src/WINNT/afsd/cm_freelance.c +++ b/src/WINNT/afsd/cm_freelance.c @@ -169,12 +169,12 @@ void cm_InitFreelance() { /* Start the registry monitor */ phandle = thrd_Create(NULL, 65536, (ThreadFunc) cm_FreelanceChangeNotifier, NULL, 0, &lpid, "cm_FreelanceChangeNotifier"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "cm_FreelanceChangeNotifier thread create failure"); thrd_CloseHandle(phandle); phandle = thrd_Create(NULL, 65536, (ThreadFunc) cm_FreelanceSymlinkChangeNotifier, NULL, 0, &lpid, "cm_FreelanceSymlinkChangeNotifier"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "cm_FreelanceSymlinkChangeNotifier thread create failure"); thrd_CloseHandle(phandle); #endif } @@ -1232,23 +1232,23 @@ long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp) osi_LogSaveString(afsd_logp,destination)); if ( filename[0] == '\0' || destination[0] == '\0' ) - return -1; + return CM_ERROR_INVAL; fullname[0] = '\0'; if (filename[0] == '.') { cm_GetCell_Gen(&filename[1], fullname, CM_FLAG_CREATE); if (stricmp(&filename[1],fullname) == 0) - return -1; + return CM_ERROR_EXISTS; } else { cm_GetCell_Gen(filename, fullname, CM_FLAG_CREATE); if (stricmp(filename,fullname) == 0) - return -1; + return CM_ERROR_EXISTS; } #if !defined(DJGPP) if ( cm_FreelanceMountPointExists(filename) || cm_FreelanceSymlinkExists(filename) ) - return -1; + return CM_ERROR_EXISTS; #endif lock_ObtainMutex(&cm_Freelance_Lock); diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index dd973efe9a..05800b6c19 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -228,8 +228,15 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, long code; #ifndef AFSIFS cm_scache_t *substRootp = NULL; + cm_scache_t *iscp = NULL; #endif - char * relativePath = ioctlp->inDatap; + char * relativePath; + char * lastComponent = NULL; + afs_uint32 follow = 0; + + relativePath = ioctlp->inDatap; + /* setup the next data value for the caller to use */ + ioctlp->inDatap += (long)strlen(ioctlp->inDatap) + 1;; osi_Log1(afsd_logp, "cm_ParseIoctlPath %s", osi_LogSaveString(afsd_logp,relativePath)); @@ -242,13 +249,16 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, */ TranslateExtendedChars(relativePath); + /* This is usually nothing, but for StatMountPoint it is the file name. */ + TranslateExtendedChars(ioctlp->inDatap); + #ifdef AFSIFS /* we have passed the whole path, including the afs prefix. when the pioctl call is made, we perform an ioctl to afsrdr and it returns the correct (full) path. therefore, there is no drive letter, and the path is absolute. */ code = cm_NameI(cm_data.rootSCachep, relativePath, - CM_FLAG_CASEFOLD, + CM_FLAG_CASEFOLD | follow, userp, "", reqp, scpp); if (code) { @@ -256,6 +266,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, return code; } #else /* AFSIFS */ + if (relativePath[0] == relativePath[1] && relativePath[1] == '\\' && !_strnicmp(cm_NetbiosName,relativePath+2,strlen(cm_NetbiosName))) @@ -292,8 +303,22 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, return code; } - code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); + lastComponent = strrchr(p, '\\'); + if (lastComponent && (lastComponent - p) > 1 &&strlen(lastComponent) > 1) { + *lastComponent = '\0'; + lastComponent++; + + code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, + userp, NULL, reqp, &iscp); + if (code == 0) + code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE, + userp, NULL, reqp, scpp); + if (iscp) + cm_ReleaseSCache(iscp); + } else { + code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD, + userp, NULL, reqp, scpp); + } cm_ReleaseSCache(substRootp); if (code) { osi_Log1(afsd_logp,"cm_ParseIoctlPath [2] code 0x%x", code); @@ -325,9 +350,24 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, return code; } - code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) { + lastComponent = strrchr(p, '\\'); + if (lastComponent && (lastComponent - p) > 1 &&strlen(lastComponent) > 1) { + *lastComponent = '\0'; + lastComponent++; + + code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, + userp, NULL, reqp, &iscp); + if (code == 0) + code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE, + userp, NULL, reqp, scpp); + if (iscp) + cm_ReleaseSCache(iscp); + } else { + code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD, + userp, NULL, reqp, scpp); + } + + if (code) { cm_ReleaseSCache(substRootp); osi_Log1(afsd_logp,"cm_ParseIoctlPath code [4] 0x%x", code); return code; @@ -342,9 +382,22 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, return code; } - code = cm_NameI(substRootp, relativePath, - CM_FLAG_CASEFOLD, - userp, NULL, reqp, scpp); + lastComponent = strrchr(relativePath, '\\'); + if (lastComponent && (lastComponent - relativePath) > 1 && strlen(lastComponent) > 1) { + *lastComponent = '\0'; + lastComponent++; + + code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, + userp, NULL, reqp, &iscp); + if (code == 0) + code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE, + userp, NULL, reqp, scpp); + if (iscp) + cm_ReleaseSCache(iscp); + } else { + code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD, + userp, NULL, reqp, scpp); + } if (code) { cm_ReleaseSCache(substRootp); osi_Log1(afsd_logp,"cm_ParseIoctlPath [7] code 0x%x", code); @@ -353,13 +406,6 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, } #endif /* AFSIFS */ - /* # of bytes of path */ - code = (long)strlen(ioctlp->inDatap) + 1; - ioctlp->inDatap += code; - - /* This is usually nothing, but for StatMountPoint it is the file name. */ - TranslateExtendedChars(ioctlp->inDatap); - if (substRootp) cm_ReleaseSCache(substRootp); @@ -548,25 +594,32 @@ long cm_IoctlGetACL(smb_ioctl_t *ioctlp, cm_user_t *userp) if (code) return code; /* now make the get acl call */ - fid.Volume = scp->fid.volume; - fid.Vnode = scp->fid.vnode; - fid.Unique = scp->fid.unique; - do { - acl.AFSOpaque_val = ioctlp->outDatap; - acl.AFSOpaque_len = 0; - code = cm_ConnFromFID(&scp->fid, userp, &req, &connp); - if (code) continue; +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = 0; + ioctlp->outDatap[0] ='\0'; + } else +#endif + { + fid.Volume = scp->fid.volume; + fid.Vnode = scp->fid.vnode; + fid.Unique = scp->fid.unique; + do { + acl.AFSOpaque_val = ioctlp->outDatap; + acl.AFSOpaque_len = 0; + code = cm_ConnFromFID(&scp->fid, userp, &req, &connp); + if (code) continue; - callp = cm_GetRxConn(connp); - code = RXAFS_FetchACL(callp, &fid, &acl, &fileStatus, &volSync); - rx_PutConnection(callp); + callp = cm_GetRxConn(connp); + code = RXAFS_FetchACL(callp, &fid, &acl, &fileStatus, &volSync); + rx_PutConnection(callp); - } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - cm_ReleaseSCache(scp); - - if (code) return code; + } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); + code = cm_MapRPCError(code, &req); + cm_ReleaseSCache(scp); + if (code) return code; + } /* skip over return data */ tlen = (int)strlen(ioctlp->outDatap) + 1; ioctlp->outDatap += tlen; @@ -629,28 +682,34 @@ long cm_IoctlSetACL(struct smb_ioctl *ioctlp, struct cm_user *userp) code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; - /* now make the get acl call */ - fid.Volume = scp->fid.volume; - fid.Vnode = scp->fid.vnode; - fid.Unique = scp->fid.unique; - do { - acl.AFSOpaque_val = ioctlp->inDatap; - acl.AFSOpaque_len = (u_int)strlen(ioctlp->inDatap)+1; - code = cm_ConnFromFID(&scp->fid, userp, &req, &connp); - if (code) continue; +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = CM_ERROR_NOACCESS; + } else +#endif + { + /* now make the get acl call */ + fid.Volume = scp->fid.volume; + fid.Vnode = scp->fid.vnode; + fid.Unique = scp->fid.unique; + do { + acl.AFSOpaque_val = ioctlp->inDatap; + acl.AFSOpaque_len = (u_int)strlen(ioctlp->inDatap)+1; + code = cm_ConnFromFID(&scp->fid, userp, &req, &connp); + if (code) continue; - callp = cm_GetRxConn(connp); - code = RXAFS_StoreACL(callp, &fid, &acl, &fileStatus, &volSync); - rx_PutConnection(callp); + callp = cm_GetRxConn(connp); + code = RXAFS_StoreACL(callp, &fid, &acl, &fileStatus, &volSync); + rx_PutConnection(callp); - } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - - /* invalidate cache info, since we just trashed the ACL cache */ - lock_ObtainMutex(&scp->mx); - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); + } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); + code = cm_MapRPCError(code, &req); + /* invalidate cache info, since we just trashed the ACL cache */ + lock_ObtainMutex(&scp->mx); + cm_DiscardSCache(scp); + lock_ReleaseMutex(&scp->mx); + } cm_ReleaseSCache(scp); return code; @@ -697,12 +756,18 @@ long cm_IoctlFlushVolume(struct smb_ioctl *ioctlp, struct cm_user *userp) code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; - volume = scp->fid.volume; - cell = scp->fid.cell; - cm_ReleaseSCache(scp); - - code = cm_FlushVolume(userp, &req, cell, volume); +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = CM_ERROR_NOACCESS; + } else +#endif + { + volume = scp->fid.volume; + cell = scp->fid.cell; + cm_ReleaseSCache(scp); + code = cm_FlushVolume(userp, &req, cell, volume); + } return code; } @@ -717,7 +782,14 @@ long cm_IoctlFlushFile(struct smb_ioctl *ioctlp, struct cm_user *userp) code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; - cm_FlushFile(scp, userp, &req); +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = CM_ERROR_NOACCESS; + } else +#endif + { + cm_FlushFile(scp, userp, &req); + } cm_ReleaseSCache(scp); return 0; @@ -744,53 +816,60 @@ long cm_IoctlSetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; - cellp = cm_FindCellByID(scp->fid.cell); - osi_assert(cellp); +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = CM_ERROR_NOACCESS; + } else +#endif + { + cellp = cm_FindCellByID(scp->fid.cell); + osi_assertx(cellp, "null cm_cell_t"); - if (scp->flags & CM_SCACHEFLAG_RO) { - cm_ReleaseSCache(scp); - return CM_ERROR_READONLY; + if (scp->flags & CM_SCACHEFLAG_RO) { + cm_ReleaseSCache(scp); + return CM_ERROR_READONLY; + } + + code = cm_GetVolumeByID(cellp, scp->fid.volume, userp, &req, + CM_GETVOL_FLAG_CREATE, &tvp); + if (code) { + cm_ReleaseSCache(scp); + return code; + } + cm_PutVolume(tvp); + + /* Copy the junk out, using cp as a roving pointer. */ + cp = ioctlp->inDatap; + memcpy((char *)&volStat, cp, sizeof(AFSFetchVolumeStatus)); + cp += sizeof(AFSFetchVolumeStatus); + StringCbCopyA(volName, sizeof(volName), cp); + cp += strlen(volName)+1; + StringCbCopyA(offLineMsg, sizeof(offLineMsg), cp); + cp += strlen(offLineMsg)+1; + StringCbCopyA(motd, sizeof(motd), cp); + storeStat.Mask = 0; + if (volStat.MinQuota != -1) { + storeStat.MinQuota = volStat.MinQuota; + storeStat.Mask |= AFS_SETMINQUOTA; + } + if (volStat.MaxQuota != -1) { + storeStat.MaxQuota = volStat.MaxQuota; + storeStat.Mask |= AFS_SETMAXQUOTA; + } + + do { + code = cm_ConnFromFID(&scp->fid, userp, &req, &tcp); + if (code) continue; + + callp = cm_GetRxConn(tcp); + code = RXAFS_SetVolumeStatus(callp, scp->fid.volume, + &storeStat, volName, offLineMsg, motd); + rx_PutConnection(callp); + + } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); + code = cm_MapRPCError(code, &req); } - - code = cm_GetVolumeByID(cellp, scp->fid.volume, userp, &req, - CM_GETVOL_FLAG_CREATE, &tvp); - if (code) { - cm_ReleaseSCache(scp); - return code; - } - cm_PutVolume(tvp); - - /* Copy the junk out, using cp as a roving pointer. */ - cp = ioctlp->inDatap; - memcpy((char *)&volStat, cp, sizeof(AFSFetchVolumeStatus)); - cp += sizeof(AFSFetchVolumeStatus); - StringCbCopyA(volName, sizeof(volName), cp); - cp += strlen(volName)+1; - StringCbCopyA(offLineMsg, sizeof(offLineMsg), cp); - cp += strlen(offLineMsg)+1; - StringCbCopyA(motd, sizeof(motd), cp); - storeStat.Mask = 0; - if (volStat.MinQuota != -1) { - storeStat.MinQuota = volStat.MinQuota; - storeStat.Mask |= AFS_SETMINQUOTA; - } - if (volStat.MaxQuota != -1) { - storeStat.MaxQuota = volStat.MaxQuota; - storeStat.Mask |= AFS_SETMAXQUOTA; - } - - do { - code = cm_ConnFromFID(&scp->fid, userp, &req, &tcp); - if (code) continue; - - callp = cm_GetRxConn(tcp); - code = RXAFS_SetVolumeStatus(callp, scp->fid.volume, - &storeStat, volName, offLineMsg, motd); - rx_PutConnection(callp); - - } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - + /* return on failure */ cm_ReleaseSCache(scp); if (code) { @@ -838,20 +917,35 @@ long cm_IoctlGetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; - Name = volName; - OfflineMsg = offLineMsg; - MOTD = motd; - do { - code = cm_ConnFromFID(&scp->fid, userp, &req, &connp); - if (code) continue; +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = 0; + strncpy(volName, "Freelance.Local.Root", sizeof(volName)); + offLineMsg[0] = '\0'; + strncpy(motd, "Freelance mode in use.", sizeof(motd)); + volStat.Vid = scp->fid.volume; + volStat.MaxQuota = 0; + volStat.BlocksInUse = 100; + volStat.PartBlocksAvail = 0; + volStat.PartMaxBlocks = 100; + } else +#endif + { + Name = volName; + OfflineMsg = offLineMsg; + MOTD = motd; + do { + code = cm_ConnFromFID(&scp->fid, userp, &req, &connp); + if (code) continue; - callp = cm_GetRxConn(connp); - code = RXAFS_GetVolumeStatus(callp, scp->fid.volume, - &volStat, &Name, &OfflineMsg, &MOTD); - rx_PutConnection(callp); + callp = cm_GetRxConn(connp); + code = RXAFS_GetVolumeStatus(callp, scp->fid.volume, + &volStat, &Name, &OfflineMsg, &MOTD); + rx_PutConnection(callp); - } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); + } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); + code = cm_MapRPCError(code, &req); + } cm_ReleaseSCache(scp); if (code) return code; @@ -958,7 +1052,8 @@ long cm_IoctlWhereIs(struct smb_ioctl *ioctlp, struct cm_user *userp) return CM_ERROR_NOSUCHCELL; code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp); - if (code) return code; + if (code) + return code; cp = ioctlp->outDatap; @@ -1131,7 +1226,8 @@ long cm_IoctlCheckServers(struct smb_ioctl *ioctlp, struct cm_user *userp) if (haveCell) { /* have cell name, too */ cellp = cm_GetCell(cp, 0); - if (!cellp) return CM_ERROR_NOSUCHCELL; + if (!cellp) + return CM_ERROR_NOSUCHCELL; } else cellp = (cm_cell_t *) 0; if (!cellp && (temp & 2)) { @@ -1663,7 +1759,8 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) cm_InitReq(&req); code = cm_ParseIoctlParent(ioctlp, userp, &req, &dscp, leaf); - if (code) return code; + if (code) + return code; /* Translate chars for the mount point name */ TranslateExtendedChars(leaf); @@ -1688,8 +1785,10 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) if (code && cm_dnsEnabled) code = cm_SearchCellByDNS(cell, fullCell, &ttl, 0, 0); #endif - if (code) + if (code) { + cm_ReleaseSCache(dscp); return CM_ERROR_NOSUCHCELL; + } StringCbPrintfA(mpInfo, sizeof(mpInfo), "%c%s:%s", *ioctlp->inDatap, fullCell, volume); } else { @@ -2107,7 +2206,8 @@ long cm_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp) /* cell name */ cellp = cm_GetCell(tp, CM_FLAG_CREATE); - if (!cellp) return CM_ERROR_NOSUCHCELL; + if (!cellp) + return CM_ERROR_NOSUCHCELL; tp += strlen(tp) + 1; /* user name */ @@ -2759,7 +2859,8 @@ long cm_IoctlDelToken(struct smb_ioctl *ioctlp, struct cm_user *userp) /* cell name is right here */ cellp = cm_GetCell(ioctlp->inDatap, 0); - if (!cellp) return CM_ERROR_NOSUCHCELL; + if (!cellp) + return CM_ERROR_NOSUCHCELL; lock_ObtainMutex(&userp->mx); @@ -3270,42 +3371,50 @@ long cm_IoctlPathAvailability(struct smb_ioctl *ioctlp, struct cm_user *userp) if (code) return code; - volume = scp->fid.volume; +#ifdef AFS_FREELANCE_CLIENT + if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { + code = 0; + cm_ReleaseSCache(scp); + } else +#endif + { + volume = scp->fid.volume; - cellp = cm_FindCellByID(scp->fid.cell); + cellp = cm_FindCellByID(scp->fid.cell); - cm_ReleaseSCache(scp); + cm_ReleaseSCache(scp); - if (!cellp) - return CM_ERROR_NOSUCHCELL; + if (!cellp) + return CM_ERROR_NOSUCHCELL; - code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp); - if (code) - return code; + code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp); + if (code) + return code; - if (volume == tvp->rw.ID) - statep = &tvp->rw; - else if (volume == tvp->ro.ID) - statep = &tvp->ro; - else - statep = &tvp->bk; + if (volume == tvp->rw.ID) + statep = &tvp->rw; + else if (volume == tvp->ro.ID) + statep = &tvp->ro; + else + statep = &tvp->bk; - switch (statep->state) { - case vl_online: - case vl_unknown: - code = 0; - break; - case vl_busy: - code = CM_ERROR_ALLBUSY; - break; - case vl_offline: - code = CM_ERROR_ALLOFFLINE; - break; - case vl_alldown: - code = CM_ERROR_ALLDOWN; - break; + switch (statep->state) { + case vl_online: + case vl_unknown: + code = 0; + break; + case vl_busy: + code = CM_ERROR_ALLBUSY; + break; + case vl_offline: + code = CM_ERROR_ALLOFFLINE; + break; + case vl_alldown: + code = CM_ERROR_ALLDOWN; + break; + } + cm_PutVolume(tvp); } - cm_PutVolume(tvp); return code; } diff --git a/src/WINNT/afsd/cm_memmap.h b/src/WINNT/afsd/cm_memmap.h index fc48e8105d..21c9a571ba 100644 --- a/src/WINNT/afsd/cm_memmap.h +++ b/src/WINNT/afsd/cm_memmap.h @@ -46,7 +46,7 @@ typedef struct cm_config_data { cm_fid_t rootFid; cm_scache_t * rootSCachep; cm_scache_t fakeSCache; - afs_uint32 fakeDirVersion; + afs_uint64 fakeDirVersion; cm_aclent_t * aclLRUp; cm_aclent_t * aclLRUEndp; diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index f4138b45c9..8fca3278f5 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -38,6 +38,8 @@ osi_rwlock_t cm_scacheLock; /* Dummy scache entry for use with pioctl fids */ cm_scache_t cm_fakeSCache; +osi_queue_t * cm_allFreeWaiters; /* protected by cm_scacheLock */ + #ifdef AFS_FREELANCE_CLIENT extern osi_mutex_t cm_Freelance_Lock; #endif @@ -147,8 +149,8 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) buf_CleanDirtyBuffers(scp); } else { /* look for things that shouldn't still be set */ - osi_assert(scp->bufWritesp == NULL); - osi_assert(scp->bufReadsp == NULL); + osi_assertx(scp->bufWritesp == NULL, "non-null cm_scache_t bufWritesp"); + osi_assertx(scp->bufReadsp == NULL, "non-null cm_scache_t bufReadsp"); } #endif @@ -166,6 +168,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) scp->dataVersion = 0; scp->bulkStatProgress = hzero; scp->waitCount = 0; + scp->waitQueueT = NULL; if (scp->cbServerp) { cm_PutServer(scp->cbServerp); @@ -203,6 +206,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) scp->serverLock = (-1); scp->exclusiveLocks = 0; scp->sharedLocks = 0; + scp->lockDataVersion = -1; /* not locked, but there can be no references to this guy * while we hold the global refcount lock. @@ -240,7 +244,8 @@ cm_scache_t *cm_GetNewSCache(void) scp; scp = (cm_scache_t *) osi_QPrev(&scp->q)) { - osi_assert(scp >= cm_data.scacheBaseAddress && scp < (cm_scache_t *)cm_data.scacheHashTablep); + osi_assertx(scp >= cm_data.scacheBaseAddress && scp < (cm_scache_t *)cm_data.scacheHashTablep, + "invalid cm_scache_t address"); if (scp->refCount == 0) { if (scp->flags & CM_SCACHEFLAG_DELETED) { @@ -309,7 +314,8 @@ cm_scache_t *cm_GetNewSCache(void) * quota or we have a leak and need to allocate a new one to avoid panicing. */ scp = cm_data.scacheBaseAddress + cm_data.currentSCaches; - osi_assert(scp >= cm_data.scacheBaseAddress && scp < (cm_scache_t *)cm_data.scacheHashTablep); + osi_assertx(scp >= cm_data.scacheBaseAddress && scp < (cm_scache_t *)cm_data.scacheHashTablep, + "invalid cm_scache_t address"); memset(scp, 0, sizeof(cm_scache_t)); scp->magic = CM_SCACHE_MAGIC; lock_InitializeMutex(&scp->mx, "cm_scache_t mutex"); @@ -492,8 +498,14 @@ cm_SuspendSCache(void) lock_ObtainWrite(&cm_scacheLock); for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) { - if (scp->cbServerp) + if (scp->cbServerp) { + if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) { + if (scp->volp->cbExpiresRO == scp->cbExpires) { + scp->volp->cbExpiresRO = now+1; + } + } scp->cbExpires = now+1; + } } lock_ReleaseWrite(&cm_scacheLock); } @@ -576,6 +588,7 @@ void cm_InitSCache(int newFile, long maxSCaches) scp->dirBplus = NULL; scp->dirDataVersion = -1; #endif + scp->waitQueueT = NULL; scp->flags &= ~CM_SCACHEFLAG_WAITING; } } @@ -583,6 +596,7 @@ void cm_InitSCache(int newFile, long maxSCaches) cm_freeFileLocks = NULL; cm_lockRefreshCycle = 0; cm_fakeSCacheInit(newFile); + cm_allFreeWaiters = NULL; cm_dnlcInit(newFile); osi_EndOnce(&once); } @@ -633,7 +647,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, hash = CM_SCACHE_HASH(fidp); - osi_assert(fidp->cell != 0); + osi_assertx(fidp->cell != 0, "unassigned cell value"); if (fidp->cell== cm_data.rootFid.cell && fidp->volume==cm_data.rootFid.volume && @@ -779,7 +793,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, osi_Log1(afsd_logp,"cm_GetSCache (3) outScpp 0x%p", scp); #endif cm_HoldSCacheNoLock(scp); - osi_assert(scp->volp == volp); + osi_assertx(scp->volp == volp, "cm_scache_t volume has unexpected value"); cm_AdjustScacheLRU(scp); lock_ReleaseWrite(&cm_scacheLock); if (volp) @@ -800,7 +814,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, } osi_Log2(afsd_logp,"cm_GetNewSCache returns scp 0x%x flags 0x%x", scp, scp->flags); - osi_assert(!(scp->flags & CM_SCACHEFLAG_INHASH)); + osi_assertx(!(scp->flags & CM_SCACHEFLAG_INHASH), "CM_SCACHEFLAG_INHASH set"); #if not_too_dangerous /* dropping the cm_scacheLock allows more than one thread @@ -884,6 +898,69 @@ cm_scache_t * cm_FindSCacheParent(cm_scache_t * scp) return pscp; } +void cm_SyncOpAddToWaitQueue(cm_scache_t * scp, afs_int32 flags, cm_buf_t * bufp) +{ + cm_scache_waiter_t * w; + + lock_ObtainWrite(&cm_scacheLock); + if (cm_allFreeWaiters == NULL) { + w = malloc(sizeof(*w)); + memset(w, 0, sizeof(*w)); + } else { + w = (cm_scache_waiter_t *) cm_allFreeWaiters; + osi_QRemove(&cm_allFreeWaiters, (osi_queue_t *) w); + } + + w->threadId = thrd_Current(); + w->scp = scp; + cm_HoldSCacheNoLock(scp); + w->flags = flags; + w->bufp = bufp; + + osi_QAddT(&scp->waitQueueH, &scp->waitQueueT, (osi_queue_t *) w); + lock_ReleaseWrite(&cm_scacheLock); + + osi_Log2(afsd_logp, "cm_SyncOpAddToWaitQueue : Adding thread to wait queue scp 0x%p w 0x%p", scp, w); +} + +int cm_SyncOpCheckContinue(cm_scache_t * scp, afs_int32 flags, cm_buf_t * bufp) +{ + cm_scache_waiter_t * w; + int this_is_me; + + osi_Log0(afsd_logp, "cm_SyncOpCheckContinue checking for continuation"); + + lock_ObtainRead(&cm_scacheLock); + for (w = (cm_scache_waiter_t *)scp->waitQueueH; + w; + w = (cm_scache_waiter_t *)osi_QNext((osi_queue_t *) w)) { + if (w->flags == flags && w->bufp == bufp) { + break; + } + } + + osi_assertx(w != NULL, "null cm_scache_waiter_t"); + this_is_me = (w->threadId == thrd_Current()); + lock_ReleaseRead(&cm_scacheLock); + + if (!this_is_me) { + osi_Log1(afsd_logp, "cm_SyncOpCheckContinue MISS: Waiter 0x%p", w); + return 0; + } + + osi_Log1(afsd_logp, "cm_SyncOpCheckContinue HIT: Waiter 0x%p", w); + + lock_ObtainWrite(&cm_scacheLock); + osi_QRemoveHT(&scp->waitQueueH, &scp->waitQueueT, (osi_queue_t *) w); + cm_ReleaseSCacheNoLock(scp); + memset(w, 0, sizeof(*w)); + osi_QAdd(&cm_allFreeWaiters, (osi_queue_t *) w); + lock_ReleaseWrite(&cm_scacheLock); + + return 1; +} + + /* synchronize a fetch, store, read, write, fetch status or store status. * Called with scache mutex held, and returns with it held, but temporarily * drops it during the fetch. @@ -950,12 +1027,13 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req afs_uint32 sleep_scp_flags = 0; afs_uint32 sleep_buf_cmflags = 0; afs_uint32 sleep_scp_bufs = 0; + int wakeupCycle; /* lookup this first */ bufLocked = flags & CM_SCACHESYNC_BUFLOCKED; - if (bufp) - osi_assert(bufp->refCount > 0); + if (bufp) + osi_assertx(bufp->refCount > 0, "cm_buf_t refCount 0"); /* Do the access check. Now we don't really do the access check @@ -1147,7 +1225,7 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req if (rights) { /* can't check access rights without a callback */ - osi_assert(flags & CM_SCACHESYNC_NEEDCALLBACK); + osi_assertx(flags & CM_SCACHESYNC_NEEDCALLBACK, "!CM_SCACHESYNC_NEEDCALLBACK"); if ((rights & PRSFS_WRITE) && (scp->flags & CM_SCACHEFLAG_RO)) return CM_ERROR_READONLY; @@ -1181,6 +1259,7 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req if (flags & CM_SCACHESYNC_NOWAIT) return CM_ERROR_WOULDBLOCK; + /* These are used for minidump debugging */ sleep_scp_flags = scp->flags; /* so we know why we slept */ sleep_buf_cmflags = bufp ? bufp->cmFlags : 0; sleep_scp_bufs = (scp->bufReadsp ? 1 : 0) | (scp->bufWritesp ? 2 : 0); @@ -1197,9 +1276,17 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req scp->flags |= CM_SCACHEFLAG_WAITING; scp->waitCount = scp->waitRequests = 1; } + if (bufLocked) lock_ReleaseMutex(&bufp->mx); - osi_SleepM((LONG_PTR) &scp->flags, &scp->mx); + + cm_SyncOpAddToWaitQueue(scp, flags, bufp); + wakeupCycle = 0; + do { + if (wakeupCycle++ != 0) + lock_ObtainMutex(&scp->mx); + osi_SleepM((LONG_PTR) &scp->flags, &scp->mx); + } while (!cm_SyncOpCheckContinue(scp, flags, bufp)); smb_UpdateServerPriority(); @@ -1238,7 +1325,7 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req if (bufp) { for(qdp = scp->bufReadsp; qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { tbufp = osi_GetQData(qdp); - osi_assert(tbufp != bufp); + osi_assertx(tbufp != bufp, "unexpected cm_buf_t value"); } } @@ -1257,7 +1344,7 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req if (bufp) { for(qdp = scp->bufWritesp; qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { tbufp = osi_GetQData(qdp); - osi_assert(tbufp != bufp); + osi_assertx(tbufp != bufp, "unexpected cm_buf_t value"); } } @@ -1360,7 +1447,7 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, afs_uint32 flags) if (flags & CM_SCACHESYNC_WRITE) { if (bufp) { - osi_assert(bufp->cmFlags & CM_BUF_CMWRITING); + osi_assertx(bufp->cmFlags & CM_BUF_CMWRITING, "!CM_BUF_CMWRITING"); bufp->cmFlags &= ~CM_BUF_CMWRITING; } @@ -1391,6 +1478,8 @@ void cm_MergeStatus(cm_scache_t *dscp, AFSVolSync *volsyncp, cm_user_t *userp, afs_uint32 flags) { + afs_uint64 dataVersion; + // yj: i want to create some fake status for the /afs directory and the // entries under that directory #ifdef AFS_FREELANCE_CLIENT @@ -1401,7 +1490,7 @@ void cm_MergeStatus(cm_scache_t *dscp, statusp->LinkCount = scp->linkCount; statusp->Length = cm_fakeDirSize; statusp->Length_hi = 0; - statusp->DataVersion = cm_data.fakeDirVersion; + statusp->DataVersion = (afs_uint32)(cm_data.fakeDirVersion & 0xFFFFFFFF); statusp->Author = 0x1; statusp->Owner = 0x0; statusp->CallerAccess = 0x9; @@ -1414,7 +1503,7 @@ void cm_MergeStatus(cm_scache_t *dscp, statusp->ServerModTime = FakeFreelanceModTime; statusp->Group = 0; statusp->SyncCounter = 0; - statusp->dataVersionHigh = 0; + statusp->dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32); statusp->errorCode = 0; } #endif /* AFS_FREELANCE_CLIENT */ @@ -1450,8 +1539,11 @@ void cm_MergeStatus(cm_scache_t *dscp, scp->flags &= ~CM_SCACHEFLAG_EACCESS; } - if (!(flags & CM_MERGEFLAG_FORCE) - && statusp->DataVersion < (unsigned long) scp->dataVersion) { + dataVersion = statusp->dataVersionHigh; + dataVersion <<= 32; + dataVersion |= statusp->DataVersion; + + if (!(flags & CM_MERGEFLAG_FORCE) && dataVersion < scp->dataVersion) { struct cm_cell *cellp; cellp = cm_FindCellByID(scp->fid.cell); @@ -1466,8 +1558,8 @@ void cm_MergeStatus(cm_scache_t *dscp, if (volp) cm_PutVolume(volp); } - osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %d, RPC dv %d", - scp, scp->dataVersion, statusp->DataVersion); + osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %I64d, RPC dv %I64d", + scp, scp->dataVersion, dataVersion); /* we have a number of data fetch/store operations running * concurrently, and we can tell which one executed last at the * server by its mtime. @@ -1544,19 +1636,18 @@ void cm_MergeStatus(cm_scache_t *dscp, cm_AddACLCache(scp, userp, statusp->CallerAccess); } - if ((flags & CM_MERGEFLAG_STOREDATA) && - statusp->DataVersion - scp->dataVersion == 1) { + if ((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion == 1) { cm_buf_t *bp; for (bp = cm_data.buf_fileHashTablepp[BUF_FILEHASH(&scp->fid)]; bp; bp=bp->fileHashp) { if (cm_FidCmp(&scp->fid, &bp->fid) == 0 && bp->dataVersion == scp->dataVersion) - bp->dataVersion = statusp->DataVersion; + bp->dataVersion = dataVersion; } } - scp->dataVersion = statusp->DataVersion; + scp->dataVersion = dataVersion; } /* note that our stat cache info is incorrect, so force us eventually @@ -1597,7 +1688,7 @@ void cm_HoldSCacheNoLockDbg(cm_scache_t *scp, char * file, long line) void cm_HoldSCacheNoLock(cm_scache_t *scp) #endif { - osi_assert(scp != 0); + osi_assertx(scp != NULL, "null cm_scache_t"); scp->refCount++; #ifdef DEBUG_REFCOUNT osi_Log2(afsd_logp,"cm_HoldSCacheNoLock scp 0x%p ref %d",scp, scp->refCount); @@ -1611,7 +1702,7 @@ void cm_HoldSCacheDbg(cm_scache_t *scp, char * file, long line) void cm_HoldSCache(cm_scache_t *scp) #endif { - osi_assert(scp != 0); + osi_assertx(scp != NULL, "null cm_scache_t"); lock_ObtainWrite(&cm_scacheLock); scp->refCount++; #ifdef DEBUG_REFCOUNT @@ -1627,10 +1718,10 @@ void cm_ReleaseSCacheNoLockDbg(cm_scache_t *scp, char * file, long line) void cm_ReleaseSCacheNoLock(cm_scache_t *scp) #endif { - osi_assert(scp != NULL); + osi_assertx(scp != NULL, "null cm_scache_t"); if (scp->refCount == 0) osi_Log1(afsd_logp,"cm_ReleaseSCacheNoLock about to panic scp 0x%x",scp); - osi_assert(scp->refCount-- >= 0); + osi_assertx(scp->refCount-- >= 0, "cm_scache_t refCount 0"); #ifdef DEBUG_REFCOUNT osi_Log2(afsd_logp,"cm_ReleaseSCacheNoLock scp 0x%p ref %d",scp,scp->refCount); afsi_log("%s:%d cm_ReleaseSCacheNoLock scp 0x%p ref %d", file, line, scp, scp->refCount); @@ -1643,11 +1734,11 @@ void cm_ReleaseSCacheDbg(cm_scache_t *scp, char * file, long line) void cm_ReleaseSCache(cm_scache_t *scp) #endif { - osi_assert(scp != NULL); + osi_assertx(scp != NULL, "null cm_scache_t"); lock_ObtainWrite(&cm_scacheLock); if (scp->refCount == 0) osi_Log1(afsd_logp,"cm_ReleaseSCache about to panic scp 0x%x",scp); - osi_assert(scp->refCount != 0); + osi_assertx(scp->refCount != 0, "cm_scache_t refCount 0"); scp->refCount--; #ifdef DEBUG_REFCOUNT osi_Log2(afsd_logp,"cm_ReleaseSCache scp 0x%p ref %d",scp,scp->refCount); @@ -1665,7 +1756,7 @@ int cm_FindFileType(cm_fid_t *fidp) hash = CM_SCACHE_HASH(fidp); - osi_assert(fidp->cell != 0); + osi_assertx(fidp->cell != 0, "unassigned cell value"); lock_ObtainWrite(&cm_scacheLock); for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) { @@ -1697,7 +1788,7 @@ int cm_DumpSCache(FILE *outputFile, char *cookie, int lock) for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp) { - sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p type=%d dv=%d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n", + sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p type=%d dv=%I64d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n", cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, scp->volp, scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, scp->flags, (unsigned long)scp->cbExpires, scp->refCount); diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 01b07dbbc7..8bc373912b 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -120,7 +120,7 @@ typedef struct cm_scache { cm_prefetch_t prefetch; /* prefetch info structure */ afs_uint32 unixModeBits; /* unix protection mode bits */ afs_uint32 linkCount; /* link count */ - afs_uint32 dataVersion; /* data version */ + afs_uint64 dataVersion; /* data version */ afs_uint32 owner; /* file owner */ afs_uint32 group; /* file owning group */ cm_user_t *creator; /* user, if new file */ @@ -165,7 +165,7 @@ typedef struct cm_scache { */ unsigned long lastRefreshCycle; /* protected with cm_scacheLock * for all scaches. */ - afs_uint32 lockDataVersion; /* dataVersion of the scp at the time + afs_uint64 lockDataVersion; /* dataVersion of the scp at the time the server lock for the scp was asserted for this lock the last time. */ @@ -196,7 +196,7 @@ typedef struct cm_scache { #ifdef USE_BPLUS /* directory B+ tree */ /* only allocated if is directory */ osi_rwlock_t dirlock; /* controls access to dirBplus */ - afs_uint32 dirDataVersion; /* data version represented by dirBplus */ + afs_uint64 dirDataVersion; /* data version represented by dirBplus */ struct tree *dirBplus; /* dirBplus */ #endif @@ -209,6 +209,12 @@ typedef struct cm_scache { /* syncop state */ afs_uint32 waitCount; /* number of threads waiting */ afs_uint32 waitRequests; /* num of thread wait requests */ + osi_queue_t * waitQueueH; /* Queue of waiting threads. + Holds queue of + cm_scache_waiter_t + objects. Protected by + cm_cacheLock. */ + osi_queue_t * waitQueueT; /* locked by cm_scacheLock */ } cm_scache_t; /* mask field - tell what has been modified */ @@ -312,6 +318,15 @@ typedef struct cm_scache { (fidp)->unique)) \ % cm_data.scacheHashTableSize) +typedef struct cm_scache_waiter { + osi_queue_t q; + afs_int32 threadId; + + cm_scache_t *scp; + afs_int32 flags; + void *bufp; +} cm_scache_waiter_t; + #include "cm_conn.h" #include "cm_buf.h" diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 870631cf18..24aab7fdff 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -277,13 +277,13 @@ void cm_GetServerNoLock(cm_server_t *serverp) void cm_PutServer(cm_server_t *serverp) { lock_ObtainWrite(&cm_serverLock); - osi_assert(serverp->refCount-- > 0); + osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0"); lock_ReleaseWrite(&cm_serverLock); } void cm_PutServerNoLock(cm_server_t *serverp) { - osi_assert(serverp->refCount-- > 0); + osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0"); } void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit) @@ -368,7 +368,7 @@ void cm_SetServerPrefs(cm_server_t * serverp) cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) { cm_server_t *tsp; - osi_assert(socketp->sin_family == AF_INET); + osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family"); tsp = malloc(sizeof(*tsp)); if (tsp) { @@ -413,7 +413,7 @@ cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type) { cm_server_t *tsp; - osi_assert(addrp->sin_family == AF_INET); + osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value"); lock_ObtainWrite(&cm_serverLock); for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) { diff --git a/src/WINNT/afsd/cm_user.c b/src/WINNT/afsd/cm_user.c index 8102465428..0aff8f6d3c 100644 --- a/src/WINNT/afsd/cm_user.c +++ b/src/WINNT/afsd/cm_user.c @@ -114,7 +114,7 @@ void cm_ReleaseUser(cm_user_t *userp) return; lock_ObtainWrite(&cm_userLock); - osi_assert(userp->refCount-- > 0); + osi_assertx(userp->refCount-- > 0, "cm_user_t refCount 0"); if (userp->refCount == 0) { lock_FinalizeMutex(&userp->mx); for (ucp = userp->cellInfop; ucp; ucp = ncp) { @@ -145,7 +145,7 @@ void cm_HoldUserVCRef(cm_user_t *userp) void cm_ReleaseUserVCRef(cm_user_t *userp) { lock_ObtainMutex(&userp->mx); - osi_assert(userp->vcRefs-- > 0); + osi_assertx(userp->vcRefs-- > 0, "cm_user_t refCount 0"); lock_ReleaseMutex(&userp->mx); } @@ -222,3 +222,20 @@ void cm_CheckTokenCache(time_t now) } lock_ReleaseWrite(&smb_rctLock); } + +#ifdef USE_ROOT_TOKENS +/* + * Service/Parameters/RootTokens// + * -> UseLSA + * -> Keytab (required if UseLSA is 0) + * -> Principal (required if there is more than one principal in the keytab) + * -> Realm (required if realm is not upper-case of + * -> RequireEncryption + */ + +void +cm_RefreshRootTokens(void) +{ + +} +#endif diff --git a/src/WINNT/afsd/cm_utils.c b/src/WINNT/afsd/cm_utils.c index 338f5badaa..1c7de6191b 100644 --- a/src/WINNT/afsd/cm_utils.c +++ b/src/WINNT/afsd/cm_utils.c @@ -14,7 +14,6 @@ #ifndef DJGPP #include #include -#include #ifndef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #define EINPROGRESS WSAEINPROGRESS @@ -64,6 +63,7 @@ #define EREMOTE WSAEREMOTE #endif /* EWOULDBLOCK */ #endif /* !DJGPP */ +#include #include #include @@ -251,8 +251,9 @@ long cm_MapRPCError(long error, cm_req_t *reqp) error = CM_ERROR_NOTDIR; else if (error == 2) /* ENOENT */ error = CM_ERROR_NOSUCHFILE; - else if (error == 11 /* EAGAIN, most servers */ - || error == 35) /* EAGAIN, Digital UNIX */ + else if (error == 11 /* EAGAIN, most servers */ + || error == 35 /* EAGAIN, Digital UNIX */ + || error == WSAEWOULDBLOCK) error = CM_ERROR_WOULDBLOCK; else if (error == VDISKFULL || error == 28) /* ENOSPC */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index a0ef4b4f1c..814aa96a13 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -31,6 +31,8 @@ extern void afsi_log(char *pattern, ...); int cm_enableServerLocks = 1; +int cm_followBackupPath = 0; + /* * Case-folding array. This was constructed by inspecting of SMBtrace output. * I do not know anything more about it. @@ -337,7 +339,7 @@ long cm_CheckNTOpen(cm_scache_t *scp, unsigned int desiredAccess, long rights; long code; - osi_assert(ldpp != NULL); + osi_assertx(ldpp != NULL, "null cm_lock_data_t"); *ldpp = NULL; /* Always allow delete; the RPC will tell us if it's OK */ @@ -1050,7 +1052,7 @@ long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp, char mtType; cm_fid_t tfid; size_t vnLength; - int type; + int targetType; if (scp->mountRootFid.cell != 0 && scp->mountRootGen >= cm_data.mountRootGen) { tfid = scp->mountRootFid; @@ -1094,15 +1096,15 @@ long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp, vnLength = strlen(volNamep); if (vnLength >= 8 && strcmp(volNamep + vnLength - 7, ".backup") == 0) - type = BACKVOL; + targetType = BACKVOL; else if (vnLength >= 10 && strcmp(volNamep + vnLength - 9, ".readonly") == 0) - type = ROVOL; + targetType = ROVOL; else - type = RWVOL; + targetType = RWVOL; /* check for backups within backups */ - if (type == BACKVOL + if (targetType == BACKVOL && (scp->flags & (CM_SCACHEFLAG_RO | CM_SCACHEFLAG_PURERO)) == CM_SCACHEFLAG_RO) { code = CM_ERROR_NOSUCHVOLUME; @@ -1132,17 +1134,30 @@ long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp, lock_ReleaseMutex(&volp->mx); scp->mountRootFid.cell = cellp->cellID; + + /* if the mt pt originates in a .backup volume (not a .readonly) + * and FollowBackupPath is active, and if there is a .backup + * volume for the target, then use the .backup of the target + * instead of the read-write. + */ + if (cm_followBackupPath && targetType == RWVOL && + (scp->flags & CM_SCACHEFLAG_RO|CM_SCACHEFLAG_PURERO) == CM_SCACHEFLAG_RO && + volp->bk.ID != 0) { + targetType = BACKVOL; + } /* if the mt pt is in a read-only volume (not just a * backup), and if there is a read-only volume for the - * target, and if this is a type '#' mount point, use + * target, and if this is a targetType '#' mount point, use * the read-only, otherwise use the one specified. */ - if (mtType == '#' && (scp->flags & CM_SCACHEFLAG_PURERO) - && volp->ro.ID != 0 && type == RWVOL) - type = ROVOL; - if (type == ROVOL) + else if (mtType == '#' && targetType == RWVOL && + (scp->flags & CM_SCACHEFLAG_PURERO) && + volp->ro.ID != 0) { + targetType = ROVOL; + } + if (targetType == ROVOL) scp->mountRootFid.volume = volp->ro.ID; - else if (type == BACKVOL) + else if (targetType == BACKVOL) scp->mountRootFid.volume = volp->bk.ID; else scp->mountRootFid.volume = volp->rw.ID; @@ -2286,7 +2301,7 @@ cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp, cm_user_t *userp, osi_Log1(afsd_logp, "cm_TryBulkStat dir 0x%p", dscp); /* should be on a buffer boundary */ - osi_assert((offsetp->LowPart & (cm_data.buf_blockSize - 1)) == 0); + osi_assertx((offsetp->LowPart & (cm_data.buf_blockSize - 1)) == 0, "invalid offset"); memset(&bb, 0, sizeof(bb)); bb.bufOffset = *offsetp; @@ -3905,7 +3920,7 @@ static cm_file_lock_t * cm_GetFileLock(void) { osi_QRemove(&cm_freeFileLocks, &l->q); } else { l = malloc(sizeof(cm_file_lock_t)); - osi_assert(l); + osi_assertx(l, "null cm_file_lock_t"); } memset(l, 0, sizeof(cm_file_lock_t)); @@ -4048,7 +4063,7 @@ long cm_LockCheckPerms(cm_scache_t * scp, rights |= PRSFS_WRITE | PRSFS_LOCK; else { /* hmmkay */ - osi_assert(FALSE); + osi_assertx(FALSE, "invalid lock type"); return 0; } @@ -4257,7 +4272,7 @@ long cm_Lock(cm_scache_t *scp, unsigned char sLockType, osi_Log0(afsd_logp, " attempting to UPGRADE from LockRead to LockWrite."); osi_Log1(afsd_logp, - " dataVersion on scp: %d", scp->dataVersion); + " dataVersion on scp: %I64d", scp->dataVersion); /* we assume at this point (because scp->serverLock was valid) that we had a valid server lock. */ @@ -4292,7 +4307,7 @@ long cm_Lock(cm_scache_t *scp, unsigned char sLockType, newLock = Which; /* am I sane? */ - osi_assert(newLock == LockRead); + osi_assertx(newLock == LockRead, "lock type not read"); code = cm_IntSetLock(scp, userp, newLock, reqp); } @@ -4348,7 +4363,7 @@ long cm_Lock(cm_scache_t *scp, unsigned char sLockType, osi_Log0(afsd_logp, " Data version mismatch while upgrading lock."); osi_Log2(afsd_logp, - " Data versions before=%d, after=%d", + " Data versions before=%I64d, after=%I64d", scp->lockDataVersion, scp->dataVersion); osi_Log1(afsd_logp, @@ -4508,7 +4523,7 @@ long cm_UnlockByKey(cm_scache_t * scp, fileLock->scp->fid.volume, fileLock->scp->fid.vnode, fileLock->scp->fid.unique); - osi_assert(FALSE); + osi_assertx(FALSE, "invalid fid value"); } #endif @@ -4582,7 +4597,7 @@ long cm_UnlockByKey(cm_scache_t * scp, /* since scp->serverLock looked sane, we are going to assume that we have a valid server lock. */ scp->lockDataVersion = scp->dataVersion; - osi_Log1(afsd_logp, " dataVersion on scp = %d", scp->dataVersion); + osi_Log1(afsd_logp, " dataVersion on scp = %I64d", scp->dataVersion); code = cm_IntReleaseLock(scp, userp, reqp); @@ -4604,7 +4619,7 @@ long cm_UnlockByKey(cm_scache_t * scp, we have lost the lock we had during the transition. */ osi_Log0(afsd_logp, "Data version mismatch during lock downgrade"); - osi_Log2(afsd_logp, " Data versions before=%d, after=%d", + osi_Log2(afsd_logp, " Data versions before=%I64d, after=%I64d", scp->lockDataVersion, scp->dataVersion); @@ -4683,7 +4698,7 @@ long cm_Unlock(cm_scache_t *scp, fileLock->scp->fid.volume, fileLock->scp->fid.vnode, fileLock->scp->fid.unique); - osi_assert(FALSE); + osi_assertx(FALSE, "invalid fid value"); } #endif if (!IS_LOCK_DELETED(fileLock) && @@ -4759,7 +4774,7 @@ long cm_Unlock(cm_scache_t *scp, /* Since we already had a lock, we assume that there is a valid server lock. */ scp->lockDataVersion = scp->dataVersion; - osi_Log1(afsd_logp, " dataVersion on scp is %d", scp->dataVersion); + osi_Log1(afsd_logp, " dataVersion on scp is %I64d", scp->dataVersion); /* before we downgrade, make sure that we have enough permissions to get the read lock. */ @@ -4794,7 +4809,7 @@ long cm_Unlock(cm_scache_t *scp, osi_Log0(afsd_logp, "Data version mismatch while downgrading lock"); osi_Log2(afsd_logp, - " Data versions before=%d, after=%d", + " Data versions before=%I64d, after=%I64d", scp->lockDataVersion, scp->dataVersion); @@ -4850,7 +4865,7 @@ static void cm_LockMarkSCacheLost(cm_scache_t * scp) #ifdef DEBUG /* With the current code, we can't lose a lock on a RO scp */ - osi_assert(!(scp->flags & CM_SCACHEFLAG_RO)); + osi_assertx(!(scp->flags & CM_SCACHEFLAG_RO), "CM_SCACHEFLAG_RO unexpected"); #endif /* cm_scacheLock needed because we are modifying fileLock->flags */ @@ -4911,10 +4926,10 @@ void cm_CheckLocks() /* Server locks must have been enabled for us to have received an active non-client-only lock. */ - osi_assert(cm_enableServerLocks); + osi_assertx(cm_enableServerLocks, "!cm_enableServerLocks"); scp = fileLock->scp; - osi_assert(scp != NULL); + osi_assertx(scp != NULL, "null cm_scache_t"); cm_HoldSCacheNoLock(scp); @@ -4931,7 +4946,7 @@ void cm_CheckLocks() fileLock->scp->fid.volume, fileLock->scp->fid.vnode, fileLock->scp->fid.unique); - osi_assert(FALSE); + osi_assertx(FALSE, "invalid fid"); } #endif /* Server locks are extended once per scp per refresh @@ -5032,7 +5047,7 @@ void cm_CheckLocks() "Data version mismatch on scp 0x%p", scp); osi_Log2(afsd_logp, - " Data versions: before=%d, after=%d", + " Data versions: before=%I64d, after=%I64d", scp->lockDataVersion, scp->dataVersion); @@ -5137,7 +5152,7 @@ long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead) scp = oldFileLock->scp; - osi_assert(scp != NULL); + osi_assertx(scp != NULL, "null cm_scache_t"); lock_ReleaseRead(&cm_scacheLock); lock_ObtainMutex(&scp->mx); @@ -5243,7 +5258,7 @@ long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead) oldFileLock->flags |= CM_FILELOCK_FLAG_WAITLOCK; } - osi_assert(IS_LOCK_WAITLOCK(oldFileLock)); + osi_assertx(IS_LOCK_WAITLOCK(oldFileLock), "!IS_LOCK_WAITLOCK"); if (force_client_lock || !SERVERLOCKS_ENABLED(scp) || @@ -5315,7 +5330,7 @@ long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead) if (scp->serverLock == LockRead) { - osi_assert(newLock == LockWrite); + osi_assertx(newLock == LockWrite, "!LockWrite"); osi_Log0(afsd_logp, " Attempting to UPGRADE from LockRead to LockWrite"); @@ -5339,7 +5354,7 @@ long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead) osi_Log0(afsd_logp, " Data version mismatch while upgrading lock."); osi_Log2(afsd_logp, - " Data versions before=%d, after=%d", + " Data versions before=%I64d, after=%I64d", scp->lockDataVersion, scp->dataVersion); osi_Log1(afsd_logp, @@ -5394,9 +5409,9 @@ long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead) cm_key_t cm_GenerateKey(unsigned int session_id, unsigned long process_id, unsigned int file_id) { #ifdef DEBUG - osi_assert((process_id & 0xffffffff) == process_id); - osi_assert((session_id & 0xffff) == session_id); - osi_assert((file_id & 0xffff) == file_id); + osi_assertx((process_id & 0xffffffff) == process_id, "unexpected process_id"); + osi_assertx((session_id & 0xffff) == session_id, "unexpected session_id"); + osi_assertx((file_id & 0xffff) == file_id, "unexpected file_id"); #endif return diff --git a/src/WINNT/afsd/cm_vnodeops.h b/src/WINNT/afsd/cm_vnodeops.h index 96c41dee0d..ac9d59f3f4 100644 --- a/src/WINNT/afsd/cm_vnodeops.h +++ b/src/WINNT/afsd/cm_vnodeops.h @@ -14,6 +14,8 @@ extern unsigned int cm_mountRootGen; extern int cm_enableServerLocks; +extern int cm_followBackupPath; + /* parms for attribute setting call */ typedef struct cm_attr { int mask; diff --git a/src/WINNT/afsd/cm_volstat.c b/src/WINNT/afsd/cm_volstat.c index 9cb6cbf79a..25af0c96ec 100644 --- a/src/WINNT/afsd/cm_volstat.c +++ b/src/WINNT/afsd/cm_volstat.c @@ -1,6 +1,29 @@ -/* Copyright 2007 Secure Endpoints Inc. +/* + * Copyright (c) 2007 Secure Endpoints Inc. * - * BSD 2-part License + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of the Secure Endpoints Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This source file provides the declarations diff --git a/src/WINNT/afsd/cm_volstat.h b/src/WINNT/afsd/cm_volstat.h index 69b30adaed..877d37c702 100644 --- a/src/WINNT/afsd/cm_volstat.h +++ b/src/WINNT/afsd/cm_volstat.h @@ -1,6 +1,29 @@ -/* Copyright 2007 Secure Endpoints Inc. +/* + * Copyright (c) 2007 Secure Endpoints Inc. * - * BSD 2-part License + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of the Secure Endpoints Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This header file provides the definitions and prototypes @@ -8,6 +31,7 @@ * Notification API */ +enum volstatus {vl_online, vl_busy, vl_offline, vl_alldown, vl_unknown}; extern long cm_VolStatus_Initialization(void); diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 847510cc72..cafae60f44 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -77,7 +77,7 @@ cm_ShutdownVolume(void) cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown); if (volp->bk.ID) cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown); - + volp->cbExpiresRO = 0; lock_FinalizeMutex(&volp->mx); } @@ -118,6 +118,7 @@ void cm_InitVolume(int newFile, long maxVols) cm_VolumeStatusNotification(volp, volp->ro.ID, vl_alldown, volp->ro.state); if (volp->bk.ID) cm_VolumeStatusNotification(volp, volp->bk.ID, vl_alldown, volp->bk.state); + volp->cbExpiresRO = 0; } } osi_EndOnce(&once); @@ -188,6 +189,9 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, enum volstatus rwNewstate = vl_online; enum volstatus roNewstate = vl_online; enum volstatus bkNewstate = vl_online; +#ifdef AFS_FREELANCE_CLIENT + int freelance = 0; +#endif /* clear out old bindings */ if (volp->rw.serversp) @@ -198,8 +202,9 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, cm_FreeServerList(&volp->bk.serversp, CM_FREESERVERLIST_DELETE); #ifdef AFS_FREELANCE_CLIENT - if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && atoi(volp->namep)==AFS_FAKE_ROOT_VOL_ID ) + if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && volp->rw.ID == AFS_FAKE_ROOT_VOL_ID ) { + freelance = 1; memset(&vldbEntry, 0, sizeof(vldbEntry)); vldbEntry.flags |= VLF_RWEXISTS; vldbEntry.volumeId[0] = AFS_FAKE_ROOT_VOL_ID; @@ -289,6 +294,11 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, afs_int32 bkServers_alldown = 1; char name[VL_MAXNAMELEN]; +#ifdef AFS_FREELANCE_CLIENT + if (freelance) + rwServers_alldown = 0; +#endif + switch ( method ) { case 0: flags = vldbEntry.flags; @@ -447,7 +457,7 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, if ( !tsp->cellp ) tsp->cellp = cellp; - osi_assert(tsp != NULL); + osi_assertx(tsp != NULL, "null cm_server_t"); /* and add it to the list(s). */ /* @@ -596,7 +606,7 @@ long cm_GetVolumeByID(cm_cell_t *cellp, afs_uint32 volumeID, cm_user_t *userp, } #ifdef SEARCH_ALL_VOLUMES - osi_assert(volp == volp2); + osi_assertx(volp == volp2, "unexpected cm_vol_t"); #endif lock_ReleaseRead(&cm_volumeLock); @@ -631,7 +641,7 @@ long cm_GetVolumeByID(cm_cell_t *cellp, afs_uint32 volumeID, cm_user_t *userp, /* otherwise, we didn't find it so consult the VLDB */ sprintf(volNameString, "%u", volumeID); code = cm_GetVolumeByName(cellp, volNameString, userp, reqp, - flags, outVolpp); + flags, outVolpp); return code; } @@ -681,7 +691,7 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep, } #ifdef SEARCH_ALL_VOLUMES - osi_assert(volp2 == volp); + osi_assertx(volp2 == volp, "unexpected cm_vol_t"); #endif if (!volp && (flags & CM_GETVOL_FLAG_CREATE)) { @@ -759,6 +769,7 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep, volp->rw.state = volp->ro.state = volp->bk.state = vl_unknown; volp->rw.nextp = volp->ro.nextp = volp->bk.nextp = NULL; volp->rw.flags = volp->ro.flags = volp->bk.flags = 0; + volp->cbExpiresRO = 0; cm_AddVolumeToNameHashTable(volp); lock_ReleaseWrite(&cm_volumeLock); } @@ -847,7 +858,7 @@ void cm_ForceUpdateVolume(cm_fid_t *fidp, cm_user_t *userp, cm_req_t *reqp) } #ifdef SEARCH_ALL_VOLUMES - osi_assert(volp == volp2); + osi_assertx(volp == volp2, "unexpected cm_vol_t"); #endif lock_ReleaseRead(&cm_volumeLock); @@ -908,7 +919,7 @@ cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume) void cm_PutVolume(cm_volume_t *volp) { lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); + osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0"); lock_ReleaseWrite(&cm_volumeLock); } @@ -947,7 +958,7 @@ void cm_RefreshVolumes(void) lock_ReleaseMutex(&volp->mx); lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); + osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0"); } lock_ReleaseWrite(&cm_volumeLock); @@ -1103,7 +1114,7 @@ void cm_CheckOfflineVolumes(void) cm_CheckOfflineVolume(volp, 0); lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); + osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0"); } lock_ReleaseWrite(&cm_volumeLock); } @@ -1196,7 +1207,7 @@ void cm_ChangeRankVolume(cm_server_t *tsp) lock_ReleaseMutex(&volp->mx); lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); + osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0"); } lock_ReleaseWrite(&cm_volumeLock); } @@ -1475,3 +1486,52 @@ void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum vols cm_VolStatus_Change_Notification(volp->cellp->cellID, volID, new); } + +enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID) +{ + if (volp->rw.ID == volID) { + return volp->rw.state; + } else if (volp->ro.ID == volID) { + return volp->ro.state; + } else if (volp->bk.ID == volID) { + return volp->bk.state; + } else { + return vl_unknown; + } +} + +/* Renew .readonly volume callbacks that are more than + * 30 minutes old. (A volume callback is issued for 2 hours.) + */ +void +cm_VolumeRenewROCallbacks(void) +{ + cm_volume_t * volp; + time_t minexp = time(NULL) + 90 * 60; + + lock_ObtainRead(&cm_volumeLock); + for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) { + if ( volp->cbExpiresRO > 0 && volp->cbExpiresRO < minexp) { + cm_req_t req; + cm_fid_t fid; + cm_scache_t * scp; + + fid.cell = volp->cellp->cellID; + fid.volume = volp->ro.ID; + fid.vnode = 1; + fid.unique = 1; + + cm_InitReq(&req); + + lock_ReleaseRead(&cm_volumeLock); + if (cm_GetSCache(&fid, &scp, cm_rootUserp, &req) == 0) { + lock_ObtainMutex(&scp->mx); + cm_GetCallback(scp, cm_rootUserp, &req, 1); + lock_ReleaseMutex(&scp->mx); + cm_ReleaseSCache(scp); + } + lock_ObtainRead(&cm_volumeLock); + } + } + lock_ReleaseRead(&cm_volumeLock); +} diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index 791fb267b1..61b84d551d 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -14,8 +14,6 @@ #define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24) -enum volstatus {vl_online, vl_busy, vl_offline, vl_alldown, vl_unknown}; - typedef struct cm_vol_state { afs_uint32 ID; /* by mx */ struct cm_volume *nextp; /* volumeIDHashTable; by cm_volumeLock */ @@ -39,6 +37,7 @@ typedef struct cm_volume { osi_mutex_t mx; afs_uint32 flags; /* by mx */ afs_uint32 refCount; /* by cm_volumeLock */ + time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */ } cm_volume_t; #define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */ @@ -118,4 +117,7 @@ extern void cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID); extern void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum volstatus old, enum volstatus new); +extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID); + +extern void cm_VolumeRenewROCallbacks(void); #endif /* __CM_VOLUME_H_ENV__ */ diff --git a/src/WINNT/afsd/cunlog.c b/src/WINNT/afsd/cunlog.c index fb40184431..49a82f861b 100644 --- a/src/WINNT/afsd/cunlog.c +++ b/src/WINNT/afsd/cunlog.c @@ -15,9 +15,8 @@ #include #include -CommandProc (as, arock) - char *arock; - struct cmd_syndesc *as; +static int +CommandProc (struct cmd_syndesc *as, void *arock) { afs_int32 code, ecode=0; struct ktc_principal server; @@ -55,7 +54,7 @@ main(argc, argv) WSAStartup(0x0101, &WSAjunk); - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "Release Kerberos authentication"); + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "Release Kerberos authentication"); cmd_AddParm(ts, "-cell", CMD_LIST, CMD_OPTIONAL, "cell name"); code = cmd_Dispatch(argc, argv); diff --git a/src/WINNT/afsd/fs.c b/src/WINNT/afsd/fs.c index 5302eb1f8a..9ca8b7dacb 100644 --- a/src/WINNT/afsd/fs.c +++ b/src/WINNT/afsd/fs.c @@ -50,17 +50,17 @@ static char tspace[1024]; static struct ubik_client *uclient; -static int GetClientAddrsCmd(struct cmd_syndesc *asp, char *arock); -static int SetClientAddrsCmd(struct cmd_syndesc *asp, char *arock); -static int FlushMountCmd(struct cmd_syndesc *asp, char *arock); -static int RxStatProcCmd(struct cmd_syndesc *asp, char *arock); -static int RxStatPeerCmd(struct cmd_syndesc *asp, char *arock); +static int GetClientAddrsCmd(struct cmd_syndesc *asp, void *arock); +static int SetClientAddrsCmd(struct cmd_syndesc *asp, void *arock); +static int FlushMountCmd(struct cmd_syndesc *asp, void *arock); +static int RxStatProcCmd(struct cmd_syndesc *asp, void *arock); +static int RxStatPeerCmd(struct cmd_syndesc *asp, void *arock); extern struct cmd_syndesc *cmd_CreateSyntax(); -static int MemDumpCmd(struct cmd_syndesc *asp, char *arock); -static int CSCPolicyCmd(struct cmd_syndesc *asp, char *arock); -static int MiniDumpCmd(struct cmd_syndesc *asp, char *arock); +static int MemDumpCmd(struct cmd_syndesc *asp, void *arock); +static int CSCPolicyCmd(struct cmd_syndesc *asp, void *arock); +static int MiniDumpCmd(struct cmd_syndesc *asp, void *arock); static char pn[] = "fs"; static int rxInitDone = 0; @@ -873,7 +873,7 @@ static BOOL IsAdmin (void) } static int -SetACLCmd(struct cmd_syndesc *as, char *arock) +SetACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1003,7 +1003,7 @@ SetACLCmd(struct cmd_syndesc *as, char *arock) } static int -CopyACLCmd(struct cmd_syndesc *as, char *arock) +CopyACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1179,7 +1179,7 @@ CleanAcl(struct Acl *aa, char *fname) /* clean up an acl to not have bogus entries */ static int -CleanACLCmd(struct cmd_syndesc *as, char *arock) +CleanACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct Acl *ta = 0; @@ -1266,7 +1266,7 @@ CleanACLCmd(struct cmd_syndesc *as, char *arock) } static int -ListACLCmd(struct cmd_syndesc *as, char *arock) +ListACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct Acl *ta = 0; @@ -1332,7 +1332,7 @@ ListACLCmd(struct cmd_syndesc *as, char *arock) } static int -FlushAllCmd(struct cmd_syndesc *as, char *arock) +FlushAllCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1347,7 +1347,7 @@ FlushAllCmd(struct cmd_syndesc *as, char *arock) } static int -FlushVolumeCmd(struct cmd_syndesc *as, char *arock) +FlushVolumeCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1369,7 +1369,7 @@ FlushVolumeCmd(struct cmd_syndesc *as, char *arock) } static int -FlushCmd(struct cmd_syndesc *as, char *arock) +FlushCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1397,7 +1397,7 @@ FlushCmd(struct cmd_syndesc *as, char *arock) /* all this command does is repackage its args and call SetVolCmd */ static int -SetQuotaCmd(struct cmd_syndesc *as, char *arock) { +SetQuotaCmd(struct cmd_syndesc *as, void *arock) { struct cmd_syndesc ts; /* copy useful stuff from our command slot; we may later have to reorder */ @@ -1406,7 +1406,7 @@ SetQuotaCmd(struct cmd_syndesc *as, char *arock) { } static int -SetVolCmd(struct cmd_syndesc *as, char *arock) { +SetVolCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; struct cmd_item *ti; @@ -1482,7 +1482,7 @@ struct VenusFid { #endif /* WIN32 */ static int -ExamineCmd(struct cmd_syndesc *as, char *arock) +ExamineCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1563,7 +1563,7 @@ ExamineCmd(struct cmd_syndesc *as, char *arock) } static int -ListQuotaCmd(struct cmd_syndesc *as, char *arock) +ListQuotaCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1595,7 +1595,7 @@ ListQuotaCmd(struct cmd_syndesc *as, char *arock) } static int -WhereIsCmd(struct cmd_syndesc *as, char *arock) +WhereIsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1634,7 +1634,7 @@ WhereIsCmd(struct cmd_syndesc *as, char *arock) static int -DiskFreeCmd(struct cmd_syndesc *as, char *arock) +DiskFreeCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1665,7 +1665,7 @@ DiskFreeCmd(struct cmd_syndesc *as, char *arock) } static int -QuotaCmd(struct cmd_syndesc *as, char *arock) +QuotaCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1697,7 +1697,7 @@ QuotaCmd(struct cmd_syndesc *as, char *arock) } static int -ListMountCmd(struct cmd_syndesc *as, char *arock) +ListMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1849,7 +1849,7 @@ ListMountCmd(struct cmd_syndesc *as, char *arock) } static int -MakeMountCmd(struct cmd_syndesc *as, char *arock) +MakeMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; char *cellName, *volName, *tmpName; @@ -1994,7 +1994,7 @@ MakeMountCmd(struct cmd_syndesc *as, char *arock) * tp: Set to point to the actual name of the mount point to nuke. */ static int -RemoveMountCmd(struct cmd_syndesc *as, char *arock) { +RemoveMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code=0; struct ViceIoctl blob; struct cmd_item *ti; @@ -2070,7 +2070,7 @@ RemoveMountCmd(struct cmd_syndesc *as, char *arock) { */ static int -CheckServersCmd(struct cmd_syndesc *as, char *arock) +CheckServersCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2176,7 +2176,7 @@ CheckServersCmd(struct cmd_syndesc *as, char *arock) } static int -MessagesCmd(struct cmd_syndesc *as, char *arock) +MessagesCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code=0; struct ViceIoctl blob; @@ -2219,7 +2219,7 @@ MessagesCmd(struct cmd_syndesc *as, char *arock) } static int -CheckVolumesCmd(struct cmd_syndesc *as, char *arock) +CheckVolumesCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2237,7 +2237,7 @@ CheckVolumesCmd(struct cmd_syndesc *as, char *arock) } static int -SetCacheSizeCmd(struct cmd_syndesc *as, char *arock) +SetCacheSizeCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2281,7 +2281,7 @@ SetCacheSizeCmd(struct cmd_syndesc *as, char *arock) } static int -GetCacheParmsCmd(struct cmd_syndesc *as, char *arock) +GetCacheParmsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2306,7 +2306,7 @@ GetCacheParmsCmd(struct cmd_syndesc *as, char *arock) } static int -ListCellsCmd(struct cmd_syndesc *as, char *arock) +ListCellsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 i, j, *lp, magic, size; @@ -2366,7 +2366,7 @@ ListCellsCmd(struct cmd_syndesc *as, char *arock) #ifndef WIN32 static int -ListAliasesCmd(struct cmd_syndesc *as, char *arock) +ListAliasesCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code, i; char *tp, *aliasName, *realName; @@ -2396,7 +2396,7 @@ ListAliasesCmd(struct cmd_syndesc *as, char *arock) } static int -CallBackRxConnCmd(struct cmd_syndesc *as, char *arock) +CallBackRxConnCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2436,7 +2436,7 @@ CallBackRxConnCmd(struct cmd_syndesc *as, char *arock) #endif /* WIN32 */ static int -NewCellCmd(struct cmd_syndesc *as, char *arock) +NewCellCmd(struct cmd_syndesc *as, void *arock) { #ifndef WIN32 afs_int32 code, linkedstate=0, size=0, *lp; @@ -2533,7 +2533,7 @@ NewCellCmd(struct cmd_syndesc *as, char *arock) #ifndef WIN32 static int -NewAliasCmd(struct cmd_syndesc *as, char *arock) +NewAliasCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2569,7 +2569,7 @@ NewAliasCmd(struct cmd_syndesc *as, char *arock) #endif /* WIN32 */ static int -WhichCellCmd(struct cmd_syndesc *as, char *arock) +WhichCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -2593,7 +2593,7 @@ WhichCellCmd(struct cmd_syndesc *as, char *arock) } static int -WSCellCmd(struct cmd_syndesc *as, char *arock) +WSCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2616,7 +2616,7 @@ WSCellCmd(struct cmd_syndesc *as, char *arock) /* static int -PrimaryCellCmd(struct cmd_syndesc *as, char *arock) +PrimaryCellCmd(struct cmd_syndesc *as, void *arock) { fprintf(stderr,"This command is obsolete, as is the concept of a primary token.\n"); return 0; @@ -2624,7 +2624,7 @@ PrimaryCellCmd(struct cmd_syndesc *as, char *arock) */ static int -MonitorCmd(struct cmd_syndesc *as, char *arock) +MonitorCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2684,7 +2684,7 @@ MonitorCmd(struct cmd_syndesc *as, char *arock) } static int -SysNameCmd(struct cmd_syndesc *as, char *arock) +SysNameCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2754,7 +2754,7 @@ SysNameCmd(struct cmd_syndesc *as, char *arock) } static char *exported_types[] = {"null", "nfs", ""}; -static int ExportAfsCmd(struct cmd_syndesc *as, char *arock) +static int ExportAfsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2857,7 +2857,7 @@ static int ExportAfsCmd(struct cmd_syndesc *as, char *arock) static int -GetCellCmd(struct cmd_syndesc *as, char *arock) +GetCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2906,7 +2906,7 @@ GetCellCmd(struct cmd_syndesc *as, char *arock) return error; } -static int SetCellCmd(struct cmd_syndesc *as, char *arock) +static int SetCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -3193,7 +3193,7 @@ static BOOL IsWindowsNT (void) #ifdef WIN32 static int -SetPrefCmd(struct cmd_syndesc *as, char * arock) +SetPrefCmd(struct cmd_syndesc *as, void * arock) { FILE *infd; afs_int32 code; @@ -3283,7 +3283,7 @@ SetPrefCmd(struct cmd_syndesc *as, char * arock) } #else static int -SetPrefCmd(struct cmd_syndesc *as, char *arock) +SetPrefCmd(struct cmd_syndesc *as, void *arock) { FILE *infd; afs_int32 code; @@ -3389,7 +3389,7 @@ SetPrefCmd(struct cmd_syndesc *as, char *arock) #ifdef WIN32 static int -GetPrefCmd(struct cmd_syndesc *as, char *arock) +GetPrefCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -3460,7 +3460,7 @@ GetPrefCmd(struct cmd_syndesc *as, char *arock) } #else static int -GetPrefCmd(struct cmd_syndesc *as, char *arock) +GetPrefCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -3531,7 +3531,7 @@ GetPrefCmd(struct cmd_syndesc *as, char *arock) #endif /* WIN32 */ static int -UuidCmd(struct cmd_syndesc *asp, char *arock) +UuidCmd(struct cmd_syndesc *asp, void *arock) { long code; long inValue; @@ -3539,19 +3539,18 @@ UuidCmd(struct cmd_syndesc *asp, char *arock) struct ViceIoctl blob; char * uuidstring = NULL; -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else - if (geteuid()) { - fprintf (stderr, "Permission denied: requires root access.\n"); - return EACCES; - } -#endif - if (asp->parms[0].items) { +#ifdef WIN32 + if ( !IsAdmin() ) { + fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); + return EACCES; + } +#else + if (geteuid()) { + fprintf (stderr, "Permission denied: requires root access.\n"); + return EACCES; + } +#endif inValue = 1; /* generate new UUID */ } else { inValue = 0; /* just show the current UUID */ @@ -3581,7 +3580,7 @@ UuidCmd(struct cmd_syndesc *asp, char *arock) } static int -TraceCmd(struct cmd_syndesc *asp, char *arock) +TraceCmd(struct cmd_syndesc *asp, void *arock) { long code; struct ViceIoctl blob; @@ -3643,7 +3642,7 @@ static void sbusage(void) /* fs sb -kbytes 9999 -files *.o -default 64 */ static int -StoreBehindCmd(struct cmd_syndesc *as, char *arock) +StoreBehindCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; struct ViceIoctl blob; @@ -3750,7 +3749,7 @@ StoreBehindCmd(struct cmd_syndesc *as, char *arock) } static afs_int32 -SetCryptCmd(struct cmd_syndesc *as, char *arock) +SetCryptCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0, flag; struct ViceIoctl blob; @@ -3783,7 +3782,7 @@ SetCryptCmd(struct cmd_syndesc *as, char *arock) } static afs_int32 -GetCryptCmd(struct cmd_syndesc *as, char *arock) +GetCryptCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0, flag; struct ViceIoctl blob; @@ -3811,7 +3810,7 @@ GetCryptCmd(struct cmd_syndesc *as, char *arock) } static int -MemDumpCmd(struct cmd_syndesc *asp, char *arock) +MemDumpCmd(struct cmd_syndesc *asp, void *arock) { long code; struct ViceIoctl blob; @@ -3856,7 +3855,7 @@ MemDumpCmd(struct cmd_syndesc *asp, char *arock) } static int -MiniDumpCmd(struct cmd_syndesc *asp, char *arock) +MiniDumpCmd(struct cmd_syndesc *asp, void *arock) { BOOL success = 0; SERVICE_STATUS status; @@ -3897,7 +3896,7 @@ MiniDumpCmd(struct cmd_syndesc *asp, char *arock) } static int -CSCPolicyCmd(struct cmd_syndesc *asp, char *arock) +CSCPolicyCmd(struct cmd_syndesc *asp, void *arock) { struct cmd_item *ti; char *share = NULL; @@ -4011,7 +4010,7 @@ CSCPolicyCmd(struct cmd_syndesc *asp, char *arock) #ifndef WIN32 /* get clients interface addresses */ static int -GetClientAddrsCmd(struct cmd_syndesc *as, char *arock) +GetClientAddrsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -4057,7 +4056,7 @@ GetClientAddrsCmd(struct cmd_syndesc *as, char *arock) } static int -SetClientAddrsCmd(struct cmd_syndesc *as, char *arock) +SetClientAddrsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code, addr; struct cmd_item *ti; @@ -4131,7 +4130,7 @@ SetClientAddrsCmd(struct cmd_syndesc *as, char *arock) } static int -FlushMountCmd(struct cmd_syndesc *as, char *arock) +FlushMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -4248,7 +4247,7 @@ FlushMountCmd(struct cmd_syndesc *as, char *arock) #endif /* WIN32 */ static int -RxStatProcCmd(struct cmd_syndesc *as, char *arock) +RxStatProcCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 flags = 0; @@ -4282,7 +4281,7 @@ RxStatProcCmd(struct cmd_syndesc *as, char *arock) } static int -RxStatPeerCmd(struct cmd_syndesc *as, char *arock) +RxStatPeerCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 flags = 0; @@ -4348,32 +4347,32 @@ main(int argc, char **argv) osi_Init(); #ifndef WIN32 - ts = cmd_CreateSyntax("getclientaddrs", GetClientAddrsCmd, 0, + ts = cmd_CreateSyntax("getclientaddrs", GetClientAddrsCmd, NULL, "get client network interface addresses"); cmd_CreateAlias(ts, "gc"); - ts = cmd_CreateSyntax("setclientaddrs", SetClientAddrsCmd, 0, + ts = cmd_CreateSyntax("setclientaddrs", SetClientAddrsCmd, NULL, "set client network interface addresses"); cmd_AddParm(ts, "-address", CMD_LIST, CMD_OPTIONAL | CMD_EXPANDS, "client network interfaces"); cmd_CreateAlias(ts, "sc"); #endif /* WIN32 */ - ts = cmd_CreateSyntax("setserverprefs", SetPrefCmd, 0, "set server ranks"); + ts = cmd_CreateSyntax("setserverprefs", SetPrefCmd, NULL, "set server ranks"); cmd_AddParm(ts, "-servers", CMD_LIST, CMD_OPTIONAL|CMD_EXPANDS, "fileserver names and ranks"); cmd_AddParm(ts, "-vlservers", CMD_LIST, CMD_OPTIONAL|CMD_EXPANDS, "VL server names and ranks"); cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "input from named file"); cmd_AddParm(ts, "-stdin", CMD_FLAG, CMD_OPTIONAL, "input from stdin"); cmd_CreateAlias(ts, "sp"); - ts = cmd_CreateSyntax("getserverprefs", GetPrefCmd, 0, "get server ranks"); + ts = cmd_CreateSyntax("getserverprefs", GetPrefCmd, NULL, "get server ranks"); cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "output to named file"); cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only"); cmd_AddParm(ts, "-vlservers", CMD_FLAG, CMD_OPTIONAL, "VL servers"); /* cmd_AddParm(ts, "-cell", CMD_FLAG, CMD_OPTIONAL, "cellname"); */ cmd_CreateAlias(ts, "gp"); - ts = cmd_CreateSyntax("setacl", SetACLCmd, 0, "set access control list"); + ts = cmd_CreateSyntax("setacl", SetACLCmd, NULL, "set access control list"); cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); cmd_AddParm(ts, "-acl", CMD_LIST, 0, "access list entries"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "clear access list"); @@ -4383,17 +4382,17 @@ main(int argc, char **argv) cmd_AddParm(ts, "-if", CMD_FLAG, CMD_OPTIONAL, "initial file acl (DFS only)"); cmd_CreateAlias(ts, "sa"); - ts = cmd_CreateSyntax("listacl", ListACLCmd, 0, "list access control list"); + ts = cmd_CreateSyntax("listacl", ListACLCmd, NULL, "list access control list"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); parm_listacl_id = ts->nParms; cmd_AddParm(ts, "-id", CMD_FLAG, CMD_OPTIONAL, "initial directory acl"); cmd_AddParm(ts, "-if", CMD_FLAG, CMD_OPTIONAL, "initial file acl"); cmd_CreateAlias(ts, "la"); - ts = cmd_CreateSyntax("cleanacl", CleanACLCmd, 0, "clean up access control list"); + ts = cmd_CreateSyntax("cleanacl", CleanACLCmd, NULL, "clean up access control list"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("copyacl", CopyACLCmd, 0, "copy access control list"); + ts = cmd_CreateSyntax("copyacl", CopyACLCmd, NULL, "copy access control list"); cmd_AddParm(ts, "-fromdir", CMD_SINGLE, 0, "source directory (or DFS file)"); cmd_AddParm(ts, "-todir", CMD_LIST, 0, "destination directory (or DFS file)"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "first clear dest access list"); @@ -4403,16 +4402,16 @@ main(int argc, char **argv) cmd_CreateAlias(ts, "ca"); - ts = cmd_CreateSyntax("flush", FlushCmd, 0, "flush file from cache"); + ts = cmd_CreateSyntax("flush", FlushCmd, NULL, "flush file from cache"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); #ifndef WIN32 - ts = cmd_CreateSyntax("flushmount", FlushMountCmd, 0, + ts = cmd_CreateSyntax("flushmount", FlushMountCmd, NULL, "flush mount symlink from cache"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); #endif - ts = cmd_CreateSyntax("setvol", SetVolCmd, 0, "set volume status"); + ts = cmd_CreateSyntax("setvol", SetVolCmd, NULL, "set volume status"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_AddParm(ts, "-max", CMD_SINGLE, CMD_OPTIONAL, "disk space quota in 1K units"); #ifdef notdef @@ -4422,29 +4421,29 @@ main(int argc, char **argv) cmd_AddParm(ts, "-offlinemsg", CMD_SINGLE, CMD_OPTIONAL, "offline message"); cmd_CreateAlias(ts, "sv"); - ts = cmd_CreateSyntax("messages", MessagesCmd, 0, "control Cache Manager messages"); + ts = cmd_CreateSyntax("messages", MessagesCmd, NULL, "control Cache Manager messages"); cmd_AddParm(ts, "-show", CMD_SINGLE, CMD_OPTIONAL, "[user|console|all|none]"); - ts = cmd_CreateSyntax("examine", ExamineCmd, 0, "display file/volume status"); + ts = cmd_CreateSyntax("examine", ExamineCmd, NULL, "display file/volume status"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "lv"); cmd_CreateAlias(ts, "listvol"); - ts = cmd_CreateSyntax("listquota", ListQuotaCmd, 0, "list volume quota"); + ts = cmd_CreateSyntax("listquota", ListQuotaCmd, NULL, "list volume quota"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "lq"); - ts = cmd_CreateSyntax("diskfree", DiskFreeCmd, 0, "show server disk space usage"); + ts = cmd_CreateSyntax("diskfree", DiskFreeCmd, NULL, "show server disk space usage"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "df"); - ts = cmd_CreateSyntax("quota", QuotaCmd, 0, "show volume quota usage"); + ts = cmd_CreateSyntax("quota", QuotaCmd, NULL, "show volume quota usage"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("lsmount", ListMountCmd, 0, "list mount point"); + ts = cmd_CreateSyntax("lsmount", ListMountCmd, NULL, "list mount point"); cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - ts = cmd_CreateSyntax("mkmount", MakeMountCmd, 0, "make mount point"); + ts = cmd_CreateSyntax("mkmount", MakeMountCmd, NULL, "make mount point"); cmd_AddParm(ts, "-dir", CMD_SINGLE, 0, "directory"); cmd_AddParm(ts, "-vol", CMD_SINGLE, 0, "volume name"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); @@ -4459,31 +4458,31 @@ main(int argc, char **argv) */ - ts = cmd_CreateSyntax("rmmount", RemoveMountCmd, 0, "remove mount point"); + ts = cmd_CreateSyntax("rmmount", RemoveMountCmd, NULL, "remove mount point"); cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - ts = cmd_CreateSyntax("checkservers", CheckServersCmd, 0, "check local cell's servers"); + ts = cmd_CreateSyntax("checkservers", CheckServersCmd, NULL, "check local cell's servers"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell to check"); cmd_AddParm(ts, "-all", CMD_FLAG, CMD_OPTIONAL, "check all cells"); cmd_AddParm(ts, "-fast", CMD_FLAG, CMD_OPTIONAL, "just list, don't check"); cmd_AddParm(ts,"-interval",CMD_SINGLE,CMD_OPTIONAL,"seconds between probes"); - ts = cmd_CreateSyntax("checkvolumes", CheckVolumesCmd,0, "check volumeID/name mappings"); + ts = cmd_CreateSyntax("checkvolumes", CheckVolumesCmd, NULL, "check volumeID/name mappings"); cmd_CreateAlias(ts, "checkbackups"); - ts = cmd_CreateSyntax("setcachesize", SetCacheSizeCmd, 0, "set cache size"); + ts = cmd_CreateSyntax("setcachesize", SetCacheSizeCmd, NULL, "set cache size"); cmd_AddParm(ts, "-blocks", CMD_SINGLE, CMD_OPTIONAL, "size in 1K byte blocks (0 => reset)"); cmd_CreateAlias(ts, "cachesize"); cmd_AddParm(ts, "-reset", CMD_FLAG, CMD_OPTIONAL, "reset size back to boot value"); - ts = cmd_CreateSyntax("getcacheparms", GetCacheParmsCmd, 0, "get cache usage info"); + ts = cmd_CreateSyntax("getcacheparms", GetCacheParmsCmd, NULL, "get cache usage info"); - ts = cmd_CreateSyntax("listcells", ListCellsCmd, 0, "list configured cells"); + ts = cmd_CreateSyntax("listcells", ListCellsCmd, NULL, "list configured cells"); cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only"); - ts = cmd_CreateSyntax("setquota", SetQuotaCmd, 0, "set volume quota"); + ts = cmd_CreateSyntax("setquota", SetQuotaCmd, NULL, "set volume quota"); cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_OPTIONAL, "dir/file path"); cmd_AddParm(ts, "-max", CMD_SINGLE, 0, "max quota in kbytes"); #ifdef notdef @@ -4491,7 +4490,7 @@ main(int argc, char **argv) #endif cmd_CreateAlias(ts, "sq"); - ts = cmd_CreateSyntax("newcell", NewCellCmd, 0, "configure new cell"); + ts = cmd_CreateSyntax("newcell", NewCellCmd, NULL, "configure new cell"); #ifndef WIN32 cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "cell name"); cmd_AddParm(ts, "-servers", CMD_LIST, CMD_REQUIRED, "primary servers"); @@ -4508,46 +4507,46 @@ main(int argc, char **argv) cmd_AddParm(ts, "-vlport", CMD_SINGLE, CMD_OPTIONAL, "cell's vldb server port"); #endif - ts = cmd_CreateSyntax("newalias", NewAliasCmd, 0, + ts = cmd_CreateSyntax("newalias", NewAliasCmd, NULL, "configure new cell alias"); cmd_AddParm(ts, "-alias", CMD_SINGLE, 0, "alias name"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "real name of cell"); #endif - ts = cmd_CreateSyntax("whichcell", WhichCellCmd, 0, "list file's cell"); + ts = cmd_CreateSyntax("whichcell", WhichCellCmd, NULL, "list file's cell"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("whereis", WhereIsCmd, 0, "list file's location"); + ts = cmd_CreateSyntax("whereis", WhereIsCmd, NULL, "list file's location"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("wscell", WSCellCmd, 0, "list workstation's cell"); + ts = cmd_CreateSyntax("wscell", WSCellCmd, NULL, "list workstation's cell"); /* ts = cmd_CreateSyntax("primarycell", PrimaryCellCmd, 0, "obsolete (listed primary cell)"); */ - ts = cmd_CreateSyntax("monitor", MonitorCmd, 0, "set cache monitor host address"); + ts = cmd_CreateSyntax("monitor", MonitorCmd, NULL, "set cache monitor host address"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "host name or 'off'"); cmd_CreateAlias(ts, "mariner"); - ts = cmd_CreateSyntax("getcellstatus", GetCellCmd, 0, "get cell status"); + ts = cmd_CreateSyntax("getcellstatus", GetCellCmd, NULL, "get cell status"); cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name"); - ts = cmd_CreateSyntax("setcell", SetCellCmd, 0, "set cell status"); + ts = cmd_CreateSyntax("setcell", SetCellCmd, NULL, "set cell status"); cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name"); cmd_AddParm(ts, "-suid", CMD_FLAG, CMD_OPTIONAL, "allow setuid programs"); cmd_AddParm(ts, "-nosuid", CMD_FLAG, CMD_OPTIONAL, "disallow setuid programs"); - ts = cmd_CreateSyntax("flushall", FlushAllCmd, 0, "flush all data"); + ts = cmd_CreateSyntax("flushall", FlushAllCmd, NULL, "flush all data"); - ts = cmd_CreateSyntax("flushvolume", FlushVolumeCmd, 0, "flush all data in volume"); + ts = cmd_CreateSyntax("flushvolume", FlushVolumeCmd, NULL, "flush all data in volume"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("sysname", SysNameCmd, 0, "get/set sysname (i.e. @sys) value"); + ts = cmd_CreateSyntax("sysname", SysNameCmd, NULL, "get/set sysname (i.e. @sys) value"); cmd_AddParm(ts, "-newsys", CMD_LIST, CMD_OPTIONAL, "new sysname"); - ts = cmd_CreateSyntax("exportafs", ExportAfsCmd, 0, "enable/disable translators to AFS"); + ts = cmd_CreateSyntax("exportafs", ExportAfsCmd, NULL, "enable/disable translators to AFS"); cmd_AddParm(ts, "-type", CMD_SINGLE, 0, "exporter name"); cmd_AddParm(ts, "-start", CMD_SINGLE, CMD_OPTIONAL, "start/stop translator ('on' or 'off')"); cmd_AddParm(ts, "-convert", CMD_SINGLE, CMD_OPTIONAL, "convert from afs to unix mode ('on or 'off')"); @@ -4555,57 +4554,57 @@ main(int argc, char **argv) cmd_AddParm(ts, "-submounts", CMD_SINGLE, CMD_OPTIONAL, "allow nfs mounts to subdirs of /afs/.. ('on' or 'off')"); - ts = cmd_CreateSyntax("storebehind", StoreBehindCmd, 0, + ts = cmd_CreateSyntax("storebehind", StoreBehindCmd, NULL, "store to server after file close"); cmd_AddParm(ts, "-kbytes", CMD_SINGLE, CMD_OPTIONAL, "asynchrony for specified names"); cmd_AddParm(ts, "-files", CMD_LIST, CMD_OPTIONAL, "specific pathnames"); cmd_AddParm(ts, "-allfiles", CMD_SINGLE, CMD_OPTIONAL, "new default (KB)"); cmd_CreateAlias(ts, "sb"); - ts = cmd_CreateSyntax("setcrypt", SetCryptCmd, 0, "set cache manager encryption flag"); + ts = cmd_CreateSyntax("setcrypt", SetCryptCmd, NULL, "set cache manager encryption flag"); cmd_AddParm(ts, "-crypt", CMD_SINGLE, 0, "on or off"); - ts = cmd_CreateSyntax("getcrypt", GetCryptCmd, 0, "get cache manager encryption flag"); + ts = cmd_CreateSyntax("getcrypt", GetCryptCmd, NULL, "get cache manager encryption flag"); - ts = cmd_CreateSyntax("rxstatproc", RxStatProcCmd, 0, + ts = cmd_CreateSyntax("rxstatproc", RxStatProcCmd, NULL, "Manage per process RX statistics"); cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats"); cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "Disable RX stats"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "Clear RX stats"); - ts = cmd_CreateSyntax("rxstatpeer", RxStatPeerCmd, 0, + ts = cmd_CreateSyntax("rxstatpeer", RxStatPeerCmd, NULL, "Manage per peer RX statistics"); cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats"); cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "Disable RX stats"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "Clear RX stats"); #ifndef WIN32 - ts = cmd_CreateSyntax("setcbaddr", CallBackRxConnCmd, 0, "configure callback connection address"); + ts = cmd_CreateSyntax("setcbaddr", CallBackRxConnCmd, NULL, "configure callback connection address"); cmd_AddParm(ts, "-addr", CMD_SINGLE, CMD_OPTIONAL, "host name or address"); #endif - ts = cmd_CreateSyntax("trace", TraceCmd, 0, "enable or disable CM tracing"); + ts = cmd_CreateSyntax("trace", TraceCmd, NULL, "enable or disable CM tracing"); cmd_AddParm(ts, "-on", CMD_FLAG, CMD_OPTIONAL, "enable tracing"); cmd_AddParm(ts, "-off", CMD_FLAG, CMD_OPTIONAL, "disable tracing"); cmd_AddParm(ts, "-reset", CMD_FLAG, CMD_OPTIONAL, "reset log contents"); cmd_AddParm(ts, "-dump", CMD_FLAG, CMD_OPTIONAL, "dump log contents"); cmd_CreateAlias(ts, "tr"); - ts = cmd_CreateSyntax("uuid", UuidCmd, 0, "manage the UUID for the cache manager"); + ts = cmd_CreateSyntax("uuid", UuidCmd, NULL, "manage the UUID for the cache manager"); cmd_AddParm(ts, "-generate", CMD_FLAG, CMD_OPTIONAL, "generate a new UUID"); - ts = cmd_CreateSyntax("memdump", MemDumpCmd, 0, "dump memory allocs in debug builds"); + ts = cmd_CreateSyntax("memdump", MemDumpCmd, NULL, "dump memory allocs in debug builds"); cmd_AddParm(ts, "-begin", CMD_FLAG, CMD_OPTIONAL, "set a memory checkpoint"); cmd_AddParm(ts, "-end", CMD_FLAG, CMD_OPTIONAL, "dump memory allocs"); - ts = cmd_CreateSyntax("cscpolicy", CSCPolicyCmd, 0, "change client side caching policy for AFS shares"); + ts = cmd_CreateSyntax("cscpolicy", CSCPolicyCmd, NULL, "change client side caching policy for AFS shares"); cmd_AddParm(ts, "-share", CMD_SINGLE, CMD_OPTIONAL, "AFS share"); cmd_AddParm(ts, "-manual", CMD_FLAG, CMD_OPTIONAL, "manual caching of documents"); cmd_AddParm(ts, "-programs", CMD_FLAG, CMD_OPTIONAL, "automatic caching of programs and documents"); cmd_AddParm(ts, "-documents", CMD_FLAG, CMD_OPTIONAL, "automatic caching of documents"); cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "disable caching"); - ts = cmd_CreateSyntax("minidump", MiniDumpCmd, 0, "Generate MiniDump of current service state"); + ts = cmd_CreateSyntax("minidump", MiniDumpCmd, NULL, "Generate MiniDump of current service state"); code = cmd_Dispatch(argc, argv); diff --git a/src/WINNT/afsd/lanahelper.cpp b/src/WINNT/afsd/lanahelper.cpp index 8610b1d415..f99f11d29b 100644 --- a/src/WINNT/afsd/lanahelper.cpp +++ b/src/WINNT/afsd/lanahelper.cpp @@ -450,6 +450,7 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana, BOOL reset) rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,AFSREG_CLT_SVC_PARAM_SUBKEY,0,KEY_READ,&hkConfig); if (rv == ERROR_SUCCESS) { + dummyLen = sizeof(regLana); rv = RegQueryValueEx(hkConfig, szForceLanaLoopback, NULL, NULL, (LPBYTE) ®Lana, &dummyLen); RegCloseKey(hkConfig); diff --git a/src/WINNT/afsd/sample/token.c b/src/WINNT/afsd/sample/token.c index ae384ca053..305c0e8a1a 100644 --- a/src/WINNT/afsd/sample/token.c +++ b/src/WINNT/afsd/sample/token.c @@ -18,7 +18,7 @@ #define KABADARGUMENT 1 #define KLOGEXIT(code) exit(code) -int CommandProc(); +int CommandProc(struct cmd_syndesc *, void *); static int zero_argc; static char **zero_argv; @@ -36,7 +36,7 @@ void main (argc, argv) /* Start up sockets */ WSAStartup(0x0101, &WSAjunk); - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "obtain Kerberos authentication"); + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "obtain Kerberos authentication"); #define aXFLAG 0 #define aPRINCIPAL 1 @@ -131,9 +131,8 @@ static int read_pw_string(char *s, int max) return !ok; } -CommandProc (as, arock) - char *arock; - struct cmd_syndesc *as; +int +CommandProc (struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN]; char defaultCell[256]; diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 77f40de55b..8597476fd8 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -12,7 +12,10 @@ #ifndef DJGPP #include +#pragma warning(push) +#pragma warning(disable: 4005) #include +#pragma warning(pop) #else #include #include @@ -879,7 +882,7 @@ void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime) { time_t diff_t = unixTime - smb_localZero; #if defined(DEBUG) && !defined(_USE_32BIT_TIME_T) - osi_assert(diff_t < _UI32_MAX); + osi_assertx(diff_t < _UI32_MAX, "time_t > _UI32_MAX"); #endif *dosUTimep = (afs_uint32)diff_t; } @@ -933,7 +936,7 @@ smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana) */ NTSTATUS nts = STATUS_UNSUCCESSFUL, ntsEx = STATUS_UNSUCCESSFUL; MSV1_0_LM20_CHALLENGE_REQUEST lsaReq; - PMSV1_0_LM20_CHALLENGE_RESPONSE lsaResp; + PMSV1_0_LM20_CHALLENGE_RESPONSE lsaResp = NULL; ULONG lsaRespSize = 0; lsaReq.MessageType = MsV1_0Lm20ChallengeRequest; @@ -945,13 +948,25 @@ smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana) &lsaResp, &lsaRespSize, &ntsEx); - if (nts != STATUS_SUCCESS) + if (nts != STATUS_SUCCESS || ntsEx != STATUS_SUCCESS) { osi_Log4(smb_logp,"MsV1_0Lm20ChallengeRequest failure: nts 0x%x ntsEx 0x%x respSize is %u needs %u", nts, ntsEx, sizeof(lsaReq), lsaRespSize); - osi_assert(nts == STATUS_SUCCESS); /* this had better work! */ + afsi_log("MsV1_0Lm20ChallengeRequest failure: nts 0x%x ntsEx 0x%x respSize %u", + nts, ntsEx, lsaRespSize); + } + osi_assertx(nts == STATUS_SUCCESS, "LsaCallAuthenticationPackage failed"); /* this had better work! */ - memcpy(vcp->encKey, lsaResp->ChallengeToClient, MSV1_0_CHALLENGE_LENGTH); - LsaFreeReturnBuffer(lsaResp); + if (ntsEx == STATUS_SUCCESS) { + memcpy(vcp->encKey, lsaResp->ChallengeToClient, MSV1_0_CHALLENGE_LENGTH); + LsaFreeReturnBuffer(lsaResp); + } else { + /* + * This will cause the subsequent authentication to fail but + * that is better than us dereferencing a NULL pointer and + * crashing. + */ + memset(vcp->encKey, 0, MSV1_0_CHALLENGE_LENGTH); + } } else memset(vcp->encKey, 0, MSV1_0_CHALLENGE_LENGTH); @@ -1194,14 +1209,14 @@ void smb_ReleaseTID(smb_tid_t *tidp) userp = NULL; lock_ObtainWrite(&smb_rctLock); - osi_assert(tidp->refCount-- > 0); + osi_assertx(tidp->refCount-- > 0, "smb_tid_t refCount 0"); if (tidp->refCount == 0 && (tidp->delete)) { ltpp = &tidp->vcp->tidsp; for(tp = *ltpp; tp; ltpp = &tp->nextp, tp = *ltpp) { if (tp == tidp) break; } - osi_assert(tp != NULL); + osi_assertx(tp != NULL, "null smb_tid_t"); *ltpp = tp->nextp; lock_FinalizeMutex(&tidp->mx); userp = tidp->userp; /* remember to drop ref later */ @@ -1303,7 +1318,7 @@ void smb_ReleaseUsername(smb_username_t *unp) time_t now = osi_Time(); lock_ObtainWrite(&smb_rctLock); - osi_assert(unp->refCount-- > 0); + osi_assertx(unp->refCount-- > 0, "smb_username_t refCount 0"); if (unp->refCount == 0 && !(unp->flags & SMB_USERNAMEFLAG_AFSLOGON) && (unp->flags & SMB_USERNAMEFLAG_LOGOFF)) { lupp = &usernamesp; @@ -1311,7 +1326,7 @@ void smb_ReleaseUsername(smb_username_t *unp) if (up == unp) break; } - osi_assert(up != NULL); + osi_assertx(up != NULL, "null smb_username_t"); *lupp = up->nextp; up->nextp = NULL; /* do not remove this */ lock_FinalizeMutex(&unp->mx); @@ -1339,14 +1354,14 @@ void smb_ReleaseUID(smb_user_t *uidp) smb_username_t *unp = NULL; lock_ObtainWrite(&smb_rctLock); - osi_assert(uidp->refCount-- > 0); + osi_assertx(uidp->refCount-- > 0, "smb_user_t refCount 0"); if (uidp->refCount == 0) { lupp = &uidp->vcp->usersp; for(up = *lupp; up; lupp = &up->nextp, up = *lupp) { if (up == uidp) break; } - osi_assert(up != NULL); + osi_assertx(up != NULL, "null smb_user_t"); *lupp = up->nextp; lock_FinalizeMutex(&uidp->mx); unp = uidp->unp; @@ -1563,7 +1578,7 @@ void smb_ReleaseFID(smb_fid_t *fidp) lock_ObtainMutex(&fidp->mx); lock_ObtainWrite(&smb_rctLock); - osi_assert(fidp->refCount-- > 0); + osi_assertx(fidp->refCount-- > 0, "smb_fid_t refCount 0"); if (fidp->refCount == 0 && (fidp->delete)) { vcp = fidp->vcp; fidp->vcp = NULL; @@ -2060,7 +2075,7 @@ void smb_ReleaseDirSearchNoLock(smb_dirSearch_t *dsp) cm_scache_t *scp = NULL; lock_ObtainMutex(&dsp->mx); - osi_assert(dsp->refCount-- > 0); + osi_assertx(dsp->refCount-- > 0, "cm_scache_t refCount 0"); if (dsp->refCount == 0 && (dsp->flags & SMB_DIRSEARCH_DELETE)) { if (&dsp->q == (osi_queue_t *) smb_lastDirSearchp) smb_lastDirSearchp = (smb_dirSearch_t *) osi_QPrev(&smb_lastDirSearchp->q); @@ -2262,7 +2277,7 @@ static smb_packet_t *GetPacket(void) tbp->dos_pkt_sel = tb_sel; #endif /* DJGPP */ } - osi_assert(tbp->magic == SMB_PACKETMAGIC); + osi_assertx(tbp->magic == SMB_PACKETMAGIC, "invalid smb_packet_t magic"); return tbp; } @@ -2316,7 +2331,7 @@ static NCB *GetNCB(void) tbp->magic = SMB_NCBMAGIC; } - osi_assert(tbp->magic == SMB_NCBMAGIC); + osi_assertx(tbp->magic == SMB_NCBMAGIC, "invalid smb_packet_t magic"); memset(&tbp->ncb, 0, sizeof(NCB)); ncbp = &tbp->ncb; @@ -2329,7 +2344,7 @@ static NCB *GetNCB(void) void smb_FreePacket(smb_packet_t *tbp) { smb_vc_t * vcp = NULL; - osi_assert(tbp->magic == SMB_PACKETMAGIC); + osi_assertx(tbp->magic == SMB_PACKETMAGIC, "invalid smb_packet_t magic"); lock_ObtainWrite(&smb_globalLock); tbp->nextp = smb_packetFreeListp; @@ -2357,7 +2372,7 @@ static void FreeNCB(NCB *bufferp) smb_ncb_t *tbp; tbp = (smb_ncb_t *) bufferp; - osi_assert(tbp->magic == SMB_NCBMAGIC); + osi_assertx(tbp->magic == SMB_NCBMAGIC, "invalid smb_packet_t magic"); lock_ObtainWrite(&smb_globalLock); tbp->nextp = smb_ncbFreeListp; @@ -3674,7 +3689,7 @@ void smb_WaitingLocksDaemon() if (wl->state == SMB_WAITINGLOCKSTATE_DONE) continue; - osi_assert(wl->state != SMB_WAITINGLOCKSTATE_ERROR); + osi_assertx(wl->state != SMB_WAITINGLOCKSTATE_ERROR, "!SMB_WAITINGLOCKSTATE_ERROR"); /* wl->state is either _DONE or _WAITING. _ERROR would no longer be on the queue. */ @@ -3981,11 +3996,11 @@ long smb_ReceiveCoreSearchVolume(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t /* pull pathname and stat block out of request */ tp = smb_GetSMBData(inp, NULL); pathp = smb_ParseASCIIBlock(tp, (char **) &tp); - osi_assert(pathp != NULL); + osi_assertx(pathp != NULL, "null path"); if (smb_StoreAnsiFilenames) OemToChar(pathp,pathp); statBlockp = smb_ParseVblBlock(tp, (char **) &tp, &statLen); - osi_assert(statBlockp != NULL); + osi_assertx(statBlockp != NULL, "null statBlock"); if (statLen == 0) { statBlockp = initStatBlock; statBlockp[0] = 8; @@ -4645,7 +4660,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou * Deduct for them and fill in the length field. */ temp -= 3; /* deduct vbl block info */ - osi_assert(temp == (43 * returnedNames)); + osi_assertx(temp == (43 * returnedNames), "unexpected data length"); origOp[1] = (char)(temp & 0xff); origOp[2] = (char)((temp>>8) & 0xff); if (returnedNames == 0) @@ -5141,7 +5156,7 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); + osi_assertx(fidp, "null smb_fid_t"); /* save a pointer to the vnode */ fidp->scp = scp; @@ -6046,6 +6061,7 @@ long smb_CloseFID(smb_vc_t *vcp, smb_fid_t *fidp, cm_user_t *userp, cm_scache_t *dscp = NULL; char *pathp = NULL; cm_scache_t * scp = NULL; + cm_scache_t *delscp = NULL; int deleted = 0; int nullcreator = 0; @@ -6153,8 +6169,14 @@ long smb_CloseFID(smb_vc_t *vcp, smb_fid_t *fidp, cm_user_t *userp, char *fullPathp; lock_ReleaseMutex(&fidp->mx); - smb_FullName(dscp, scp, pathp, &fullPathp, userp, &req); - if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { + + code = cm_Lookup(dscp, pathp, CM_FLAG_NOMOUNTCHASE, userp, &req, &delscp); + if (code) { + cm_HoldSCache(scp); + delscp = scp; + } + smb_FullName(dscp, delscp, pathp, &fullPathp, userp, &req); + if (delscp->fileType == CM_SCACHETYPE_DIRECTORY) { code = cm_RemoveDir(dscp, fullPathp, userp, &req); if (code == 0) { deleted = 1; @@ -6192,8 +6214,8 @@ long smb_CloseFID(smb_vc_t *vcp, smb_fid_t *fidp, cm_user_t *userp, fidp->NTopen_pathp = NULL; fidp->flags &= ~SMB_FID_NTOPEN; } else { - osi_assert(fidp->NTopen_dscp == NULL); - osi_assert(fidp->NTopen_pathp == NULL); + osi_assertx(fidp->NTopen_dscp == NULL, "null NTopen_dsc"); + osi_assertx(fidp->NTopen_pathp == NULL, "null NTopen_path"); } if (fidp->NTopen_wholepathp) { @@ -6210,16 +6232,20 @@ long smb_CloseFID(smb_vc_t *vcp, smb_fid_t *fidp, cm_user_t *userp, if (dscp) cm_ReleaseSCache(dscp); - if (scp) { - if (deleted || nullcreator) { - lock_ObtainMutex(&scp->mx); - if (nullcreator && scp->creator == userp) - scp->creator = NULL; + if (delscp) { + if (deleted) { + lock_ObtainMutex(&delscp->mx); if (deleted) - scp->flags |= CM_SCACHEFLAG_DELETED; - lock_ReleaseMutex(&scp->mx); + delscp->flags |= CM_SCACHEFLAG_DELETED; + lock_ReleaseMutex(&delscp->mx); } + cm_ReleaseSCache(delscp); + } + + if (scp) { lock_ObtainMutex(&scp->mx); + if (nullcreator && scp->creator == userp) + scp->creator = NULL; scp->flags &= ~CM_SCACHEFLAG_SMB_FID; lock_ReleaseMutex(&scp->mx); cm_ReleaseSCache(scp); @@ -7481,7 +7507,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) /* now all we have to do is open the file itself */ fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); + osi_assertx(fidp, "null smb_fid_t"); cm_HoldUser(userp); @@ -7893,7 +7919,7 @@ void smb_ClientWaiter(void *parmp) { /* this is fatal - log as much as possible */ osi_Log1(smb_logp, "Fatal: NCBevents idx [ %d ] out of range.\n", idx); - osi_assert(0); + osi_assertx(0, "invalid index"); } thrd_ResetEvent(NCBevents[idx]); @@ -7951,7 +7977,7 @@ void smb_ServerWaiter(void *parmp) { /* this is fatal - log as much as possible */ osi_Log1(smb_logp, "Fatal: session idx [ %d ] out of range.\n", idx_session); - osi_assert(0); + osi_assertx(0, "invalid index"); } /* Get an NCB */ @@ -7995,7 +8021,7 @@ void smb_ServerWaiter(void *parmp) { /* this is fatal - log as much as possible */ osi_Log1(smb_logp, "Fatal: idx_NCB [ %d ] out of range.\n", idx_NCB); - osi_assert(0); + osi_assertx(0, "invalid index"); } /* Link them together */ @@ -8104,7 +8130,7 @@ void smb_Server(VOID *parmp) { /* this is fatal - log as much as possible */ osi_Log1(smb_logp, "Fatal: idx_NCB %d out of range.\n", idx_NCB); - osi_assert(0); + osi_assertx(0, "invalid index"); } ncbp = NCBs[idx_NCB]; @@ -8360,7 +8386,7 @@ void InitNCBslot(int idx) int i; char eventName[MAX_PATH]; - osi_assert( idx < (sizeof(NCBs) / sizeof(NCBs[0])) ); + osi_assertx( idx < (sizeof(NCBs) / sizeof(NCBs[0])), "invalid index" ); NCBs[idx] = GetNCB(); sprintf(eventName,"NCBavails[%d]", idx); @@ -8657,8 +8683,8 @@ void smb_Listener(void *parmp) * we should probably want to wait for a session to be freed in case * we run out. */ - osi_assert(session < SESSION_MAX - 1); - osi_assert(numNCBs < NCB_MAX - 1); /* if we pass this test we can allocate one more */ + osi_assertx(session < SESSION_MAX - 1, "invalid session"); + osi_assertx(numNCBs < NCB_MAX - 1, "invalid numNCBs"); /* if we pass this test we can allocate one more */ lock_ObtainMutex(&vcp->mx); vcp->session = session; @@ -8888,7 +8914,7 @@ int smb_NetbiosInit(void) } } - osi_assert(lana_list.length >= 0); + osi_assertx(lana_list.length >= 0, "empty lana list"); if (!lana_found) { afsi_log("No valid LANA numbers found!"); lana_list.length = 0; @@ -8928,7 +8954,7 @@ void smb_StartListeners() continue; phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_Listener, (void*)lana_list.lana[i], 0, &lpid, "smb_Listener"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "smb_Listener thread creation failure"); thrd_CloseHandle(phandle); } } @@ -9383,30 +9409,30 @@ void smb_Init(osi_log_t *logp, int useV3, #ifndef DJGPP phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_ClientWaiter, NULL, 0, &lpid, "smb_ClientWaiter"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "smb_ClientWaiter thread creation failure"); thrd_CloseHandle(phandle); #endif /* !DJGPP */ phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_ServerWaiter, NULL, 0, &lpid, "smb_ServerWaiter"); - osi_assert(phandle != NULL); + osi_assertx(phandle != NULL, "smb_ServerWaiter thread creation failure"); thrd_CloseHandle(phandle); for (i=0; i +#pragma warning(push) +#pragma warning(disable: 4005) #include #define SECURITY_WIN32 #include #include +#pragma warning(pop) #endif /* !DJGPP */ #include #include @@ -2300,13 +2303,13 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) /* don't create if not found */ if (dscp) cm_ReleaseSCache(dscp); - osi_assert(scp == NULL); + osi_assertx(scp == NULL, "null cm_scache_t"); cm_ReleaseUser(userp); smb_FreeTran2Packet(outp); return CM_ERROR_NOSUCHFILE; } else { - osi_assert(dscp != NULL && scp == NULL); + osi_assertx(dscp != NULL && scp == NULL, "null dsc || non-null sc"); openAction = 2; /* created file */ setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; smb_UnixTimeFromSearchTime(&setAttr.clientModTime, dosTime); @@ -2379,7 +2382,7 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) /* now all we have to do is open the file itself */ fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); + osi_assertx(fidp, "null smb_fid_t"); cm_HoldUser(userp); lock_ObtainMutex(&fidp->mx); @@ -3967,7 +3970,6 @@ smb_ApplyV3DirListPatches(cm_scache_t *dscp, return code; } -#ifndef USE_OLD_MATCHING // char table for case insensitive comparison char mapCaseTable[256]; @@ -4091,145 +4093,6 @@ int smb_V3MatchMask(char *namep, char *maskp, int flags) return retval; } -#else /* USE_OLD_MATCHING */ -/* do a case-folding search of the star name mask with the name in namep. - * Return 1 if we match, otherwise 0. - */ -int smb_V3MatchMask(char *namep, char *maskp, int flags) -{ - unsigned char tcp1, tcp2; /* Pattern characters */ - unsigned char tcn1; /* Name characters */ - int sawDot = 0, sawStar = 0, req8dot3 = 0; - char *starNamep, *starMaskp; - static char nullCharp[] = {0}; - int casefold = flags & CM_FLAG_CASEFOLD; - - /* make sure we only match 8.3 names, if requested */ - req8dot3 = (flags & CM_FLAG_8DOT3); - if (req8dot3 && !cm_Is8Dot3(namep)) - return 0; - - /* loop */ - while (1) { - /* Next pattern character */ - tcp1 = *maskp++; - - /* Next name character */ - tcn1 = *namep; - - if (tcp1 == 0) { - /* 0 - end of pattern */ - if (tcn1 == 0) - return 1; - else - return 0; - } - else if (tcp1 == '.' || tcp1 == '"') { - if (sawDot) { - if (tcn1 == '.') { - namep++; - continue; - } else - return 0; - } - else { - /* - * first dot in pattern; - * must match dot or end of name - */ - sawDot = 1; - if (tcn1 == 0) - continue; - else if (tcn1 == '.') { - sawStar = 0; - namep++; - continue; - } - else - return 0; - } - } - else if (tcp1 == '?') { - if (tcn1 == 0 || tcn1 == '.') - return 0; - namep++; - continue; - } - else if (tcp1 == '>') { - if (tcn1 != 0 && tcn1 != '.') - namep++; - continue; - } - else if (tcp1 == '*' || tcp1 == '<') { - tcp2 = *maskp++; - if (tcp2 == 0) - return 1; - else if ((req8dot3 && tcp2 == '.') || tcp2 == '"') { - while (req8dot3 && tcn1 != '.' && tcn1 != 0) - tcn1 = *++namep; - if (tcn1 == 0) { - if (sawDot) - return 0; - else - continue; - } - else { - namep++; - continue; - } - } - else { - /* - * pattern character after '*' is not null or - * period. If it is '?' or '>', we are not - * going to understand it. If it is '*' or - * '<', we are going to skip over it. None of - * these are likely, I hope. - */ - /* skip over '*' and '<' */ - while (tcp2 == '*' || tcp2 == '<') - tcp2 = *maskp++; - - /* skip over characters that don't match tcp2 */ - while (req8dot3 && tcn1 != '.' && tcn1 != 0 && - ((casefold && cm_foldUpper[tcn1] != cm_foldUpper[tcp2]) || - (!casefold && tcn1 != tcp2))) - tcn1 = *++namep; - - /* No match */ - if ((req8dot3 && tcn1 == '.') || tcn1 == 0) - return 0; - - /* Remember where we are */ - sawStar = 1; - starMaskp = maskp; - starNamep = namep; - - namep++; - continue; - } - } - else { - /* tcp1 is not a wildcard */ - if ((casefold && cm_foldUpper[tcn1] == cm_foldUpper[tcp1]) || - (!casefold && tcn1 == tcp1)) { - /* they match */ - namep++; - continue; - } - /* if trying to match a star pattern, go back */ - if (sawStar) { - maskp = starMaskp - 2; - namep = starNamep + 1; - sawStar = 0; - continue; - } - /* that's all */ - return 0; - } - } -} -#endif /* USE_OLD_MATCHING */ /* smb_ReceiveTran2SearchDir implements both * Tran2_Find_First and Tran2_Find_Next @@ -4286,7 +4149,7 @@ long smb_T2SearchDirSingle(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op cm_InitReq(&req); eos = 0; - osi_assert(p->opcode == 1); + osi_assertx(p->opcode == 1, "invalid opcode"); /* find first; obtain basic parameters from request */ @@ -4734,9 +4597,10 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t /* we only failover if we see a CM_ERROR_NOSUCHFILE */ if (code != CM_ERROR_NOSUCHFILE) { #ifdef USE_BPLUS + /* unless we are using the BPlusTree */ if (code == CM_ERROR_BPLUS_NOMATCH) code = CM_ERROR_NOSUCHFILE; -#endif +#endif /* USE_BPLUS */ return code; } } @@ -4748,7 +4612,7 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t strcpy(dsp->mask, maskp); /* and save mask */ } else { - osi_assert(p->opcode == 2); + osi_assertx(p->opcode == 2, "invalid opcode"); /* find next; obtain basic parameters from request or open dir file */ dsp = smb_FindDirSearch(p->parmsp[0]); maxCount = p->parmsp[1]; @@ -5115,34 +4979,35 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t /* compute offset of cookie representing next entry */ nextEntryCookie = curOffset.LowPart + (CM_DIR_CHUNKSIZE * numDirChunks); + if (dep->fid.vnode == 0) + goto nextEntry; /* This entry is not in use */ + /* Need 8.3 name? */ NeedShortName = 0; - if (infoLevel == SMB_FIND_FILE_BOTH_DIRECTORY_INFO - && dep->fid.vnode != 0 - && !cm_Is8Dot3(dep->name)) { + if (infoLevel == SMB_FIND_FILE_BOTH_DIRECTORY_INFO && + !cm_Is8Dot3(dep->name)) { cm_Gen8Dot3Name(dep, shortName, &shortNameEnd); NeedShortName = 1; } osi_Log4(smb_logp, "T2 search dir vn %u uniq %u name %s (%s)", dep->fid.vnode, dep->fid.unique, - osi_LogSaveString(smb_logp, dep->name), + osi_LogSaveString(smb_logp, dep->name), NeedShortName ? osi_LogSaveString(smb_logp, shortName) : ""); /* When matching, we are using doing a case fold if we have a wildcard mask. * If we get a non-wildcard match, it's a lookup for a specific file. */ - if (dep->fid.vnode != 0 && - (smb_V3MatchMask(dep->name, maskp, (starPattern? CM_FLAG_CASEFOLD : 0)) || - (NeedShortName && - smb_V3MatchMask(shortName, maskp, CM_FLAG_CASEFOLD)))) { - + if (smb_V3MatchMask(dep->name, maskp, (starPattern? CM_FLAG_CASEFOLD : 0)) || + (NeedShortName && smb_V3MatchMask(shortName, maskp, CM_FLAG_CASEFOLD))) + { /* Eliminate entries that don't match requested attributes */ if (smb_hideDotFiles && !(dsp->attribute & SMB_ATTR_HIDDEN) && smb_IsDotFile(dep->name)) { osi_Log0(smb_logp, "T2 search dir skipping hidden"); goto nextEntry; /* no hidden files */ } + if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ { /* We have already done the cm_TryBulkStat above */ @@ -5151,15 +5016,15 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t fid.vnode = ntohl(dep->fid.vnode); fid.unique = ntohl(dep->fid.unique); fileType = cm_FindFileType(&fid); - /*osi_Log2(smb_logp, "smb_ReceiveTran2SearchDir: file %s " - "has filetype %d", dep->name, - fileType);*/ - if (fileType == CM_SCACHETYPE_DIRECTORY || - fileType == CM_SCACHETYPE_MOUNTPOINT || - fileType == CM_SCACHETYPE_DFSLINK || - fileType == CM_SCACHETYPE_INVALID) + /* osi_Log2(smb_logp, "smb_ReceiveTran2SearchDir: file %s " + * "has filetype %d", dep->name, fileType); + */ + if ( fileType == CM_SCACHETYPE_DIRECTORY || + fileType == CM_SCACHETYPE_MOUNTPOINT || + fileType == CM_SCACHETYPE_DFSLINK || + fileType == CM_SCACHETYPE_INVALID) osi_Log0(smb_logp, "T2 search dir skipping directory or bad link"); - goto nextEntry; + goto nextEntry; } /* finally check if this name will fit */ @@ -5179,9 +5044,9 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t ohbytes += 4; /* if resume key required */ } - if (infoLevel != SMB_INFO_STANDARD - && infoLevel != SMB_FIND_FILE_DIRECTORY_INFO - && infoLevel != SMB_FIND_FILE_NAMES_INFO) + if ( infoLevel != SMB_INFO_STANDARD && + infoLevel != SMB_FIND_FILE_DIRECTORY_INFO && + infoLevel != SMB_FIND_FILE_NAMES_INFO) ohbytes += 4; /* EASIZE */ /* add header to name & term. null */ @@ -5190,7 +5055,7 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t /* now, we round up the record to a 4 byte alignment, * and we make sure that we have enough room here for * even the aligned version (so we don't have to worry - * about an * overflow when we pad things out below). + * about an overflow when we pad things out below). * That's the reason for the alignment arithmetic below. */ if (infoLevel >= SMB_FIND_FILE_DIRECTORY_INFO) @@ -5200,8 +5065,8 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t if (orbytes + bytesInBuffer + align > maxReturnData) { osi_Log1(smb_logp, "T2 dir search exceed max return data %d", maxReturnData); - break; - } + break; + } /* this is one of the entries to use: it is not deleted * and it matches the star pattern we're looking for. @@ -5255,8 +5120,7 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t */ if (infoLevel != SMB_FIND_FILE_NAMES_INFO) { curPatchp = malloc(sizeof(*curPatchp)); - osi_QAdd((osi_queue_t **) &dirListPatchesp, - &curPatchp->q); + osi_QAdd((osi_queue_t **) &dirListPatchesp, &curPatchp->q); curPatchp->dptr = op; if (infoLevel >= SMB_FIND_FILE_DIRECTORY_INFO) curPatchp->dptr += 8; @@ -5291,13 +5155,12 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t } } /* if we're including this name */ else if (!starPattern && - !foundInexact && - dep->fid.vnode != 0 && - smb_V3MatchMask(dep->name, maskp, CM_FLAG_CASEFOLD)) { + !foundInexact && + smb_V3MatchMask(dep->name, maskp, CM_FLAG_CASEFOLD)) { /* We were looking for exact matches, but here's an inexact one*/ foundInexact = 1; } - + nextEntry: /* and adjust curOffset to be where the new cookie is */ thyper.HighPart = 0; @@ -5326,8 +5189,7 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t /* apply and free last set of patches; if not doing a star match, this * will be empty, but better safe (and freeing everything) than sorry. */ - code2 = smb_ApplyV3DirListPatches(scp, &dirListPatchesp, infoLevel, userp, - &req); + code2 = smb_ApplyV3DirListPatches(scp, &dirListPatchesp, infoLevel, userp, &req); /* now put out the final parameters */ if (returnedNames == 0) @@ -5615,7 +5477,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return CM_ERROR_NOSUCHFILE; } else { - osi_assert(dscp != NULL); + osi_assertx(dscp != NULL, "null cm_scache_t"); osi_Log1(smb_logp, "smb_ReceiveV3OpenX creating file %s", osi_LogSaveString(smb_logp, lastNamep)); openAction = 2; /* created file */ @@ -5670,7 +5532,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) /* now all we have to do is open the file itself */ fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); + osi_assertx(fidp, "null smb_fid_t"); cm_HoldUser(userp); lock_ObtainMutex(&fidp->mx); @@ -5893,7 +5755,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) wlRequest = malloc(sizeof(smb_waitingLockRequest_t)); - osi_assert(wlRequest != NULL); + osi_assertx(wlRequest != NULL, "null wlRequest"); wlRequest->vcp = vcp; smb_HoldVC(vcp); @@ -5924,7 +5786,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) wLock = malloc(sizeof(smb_waitingLock_t)); - osi_assert(wLock != NULL); + osi_assertx(wLock != NULL, "null smb_waitingLock_t"); wLock->key = tkey; wLock->LOffset = tOffset; @@ -5938,7 +5800,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) wLock = malloc(sizeof(smb_waitingLock_t)); - osi_assert(wLock != NULL); + osi_assertx(wLock != NULL, "null smb_waitingLock_t"); wLock->key = key; wLock->LOffset = LOffset; @@ -6930,7 +6792,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) code = 0; while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { targetScp = 0; - osi_assert(dscp != NULL); + osi_assertx(dscp != NULL, "null cm_scache_t"); code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); if (code == 0) { /* we have a more accurate file to use (the @@ -6970,7 +6832,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) free(realPathp); return CM_ERROR_NOSUCHFILE; } else if (realDirFlag == 0 || realDirFlag == -1) { - osi_assert(dscp != NULL); + osi_assertx(dscp != NULL, "null cm_scache_t"); osi_Log1(smb_logp, "smb_ReceiveNTCreateX creating file %s", osi_LogSaveString(smb_logp, lastNamep)); openAction = 2; /* created file */ @@ -7028,7 +6890,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) /* create directory */ if ( !treeCreate ) treeStartp = lastNamep; - osi_assert(dscp != NULL); + osi_assertx(dscp != NULL, "null cm_scache_t"); osi_Log1(smb_logp, "smb_ReceiveNTCreateX creating directory [%s]", osi_LogSaveString(smb_logp, treeStartp)); openAction = 2; /* created directory */ @@ -7164,7 +7026,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) /* open the file itself */ fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); + osi_assertx(fidp, "null smb_fid_t"); /* save a reference to the user */ cm_HoldUser(userp); @@ -7702,7 +7564,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out return CM_ERROR_NOSUCHFILE; } else if (realDirFlag == 0 || realDirFlag == -1) { - osi_assert(dscp != NULL); + osi_assertx(dscp != NULL, "null cm_scache_t"); osi_Log1(smb_logp, "smb_ReceiveNTTranCreate creating file %s", osi_LogSaveString(smb_logp, lastNamep)); openAction = 2; /* created file */ @@ -7753,7 +7615,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out } } else { /* create directory */ - osi_assert(dscp != NULL); + osi_assertx(dscp != NULL, "null cm_scache_t"); osi_Log1(smb_logp, "smb_ReceiveNTTranCreate creating directory %s", osi_LogSaveString(smb_logp, lastNamep)); @@ -7831,7 +7693,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out /* open the file itself */ fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); + osi_assertx(fidp, "null smb_fid_t"); /* save a reference to the user */ cm_HoldUser(userp); diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index de4c0cfd70..115ece27b8 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -343,7 +343,7 @@ long smb_IoctlV3Read(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_pack uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); userp = smb_GetUserFromUID(uidp); - osi_assert(userp != 0); + osi_assertx(userp != NULL, "null cm_user_t"); iop->uidp = uidp; if (uidp && uidp->unp) { osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", diff --git a/src/WINNT/afsd/symlink.c b/src/WINNT/afsd/symlink.c index ebe6ca2710..9917e959ad 100644 --- a/src/WINNT/afsd/symlink.c +++ b/src/WINNT/afsd/symlink.c @@ -269,8 +269,8 @@ char *apath; { } -static ListLinkCmd(as) -register struct cmd_syndesc *as; { +static ListLinkCmd(register struct cmd_syndesc *as, void *arock) +{ register afs_int32 code; struct ViceIoctl blob; int error; @@ -420,8 +420,8 @@ register struct cmd_syndesc *as; { return error; } -static MakeLinkCmd(as) -register struct cmd_syndesc *as; { +static MakeLinkCmd(register struct cmd_syndesc *as, void *arock) +{ register afs_int32 code; struct ViceIoctl blob; char * parent; @@ -484,8 +484,8 @@ register struct cmd_syndesc *as; { * symlink (or ``.'' if none is provided) * tp: Set to point to the actual name of the symlink to nuke. */ -static RemoveLinkCmd(as) -register struct cmd_syndesc *as; { +static RemoveLinkCmd(register struct cmd_syndesc *as, void *arock) +{ register afs_int32 code=0; struct ViceIoctl blob; register struct cmd_item *ti; @@ -589,14 +589,14 @@ char **argv; { osi_Init(); - ts = cmd_CreateSyntax("list", ListLinkCmd, 0, "list symlink"); + ts = cmd_CreateSyntax("list", ListLinkCmd, NULL, "list symlink"); cmd_AddParm(ts, "-name", CMD_LIST, 0, "name"); - ts = cmd_CreateSyntax("make", MakeLinkCmd, 0, "make symlink"); + ts = cmd_CreateSyntax("make", MakeLinkCmd, NULL, "make symlink"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name"); cmd_AddParm(ts, "-to", CMD_SINGLE, 0, "target"); - ts = cmd_CreateSyntax("remove", RemoveLinkCmd, 0, "remove symlink"); + ts = cmd_CreateSyntax("remove", RemoveLinkCmd, NULL, "remove symlink"); cmd_AddParm(ts, "-name", CMD_LIST, 0, "name"); cmd_CreateAlias(ts, "rm"); @@ -620,8 +620,12 @@ void Die(code, filename) else fprintf(stderr,"%s: Invalid argument.\n", pn); } else if (code == ENOENT) { - if (filename) fprintf(stderr,"%s: File '%s' doesn't exist\n", pn, filename); - else fprintf(stderr,"%s: no such file returned\n", pn); + if (filename) fprintf(stderr,"%s: File '%s' doesn't exist.\n", pn, filename); + else fprintf(stderr,"%s: no such file returned.\n", pn); + } + else if (code == EEXIST) { + if (filename) fprintf(stderr,"%s: File '%s' already exists.\n", pn, filename); + else fprintf(stderr,"%s: the specified file already exists.\n", pn); } else if (code == EROFS) fprintf(stderr,"%s: You can not change a backup or readonly volume\n", pn); else if (code == EACCES || code == EPERM) { diff --git a/src/WINNT/afsreg/test/regman.c b/src/WINNT/afsreg/test/regman.c index 454128885a..b97c709aee 100644 --- a/src/WINNT/afsreg/test/regman.c +++ b/src/WINNT/afsreg/test/regman.c @@ -35,7 +35,7 @@ static char* whoami; -static int DoVptList(struct cmd_syndesc *as, char *arock) +static int DoVptList(struct cmd_syndesc *as, void *arock) { struct vpt_iter vpiter; struct vptab vpentry; @@ -51,7 +51,7 @@ static int DoVptList(struct cmd_syndesc *as, char *arock) return 0; } -static int DoVptAdd(struct cmd_syndesc *as, char *arock) +static int DoVptAdd(struct cmd_syndesc *as, void *arock) { char *vpName, *vpDev; struct vptab vpentry; @@ -79,7 +79,7 @@ static int DoVptAdd(struct cmd_syndesc *as, char *arock) return 0; } -static int DoVptDel(struct cmd_syndesc *as, char *arock) +static int DoVptDel(struct cmd_syndesc *as, void *arock) { char *vpName; @@ -98,7 +98,7 @@ static int DoVptDel(struct cmd_syndesc *as, char *arock) } -static int DoDirGet(struct cmd_syndesc *as, char *arock) +static int DoDirGet(struct cmd_syndesc *as, void *arock) { char *buf; @@ -115,7 +115,7 @@ static int DoDirGet(struct cmd_syndesc *as, char *arock) } -static int DoDirSet(struct cmd_syndesc *as, char *arock) +static int DoDirSet(struct cmd_syndesc *as, void *arock) { long status; HKEY key; @@ -143,7 +143,7 @@ static int DoDirSet(struct cmd_syndesc *as, char *arock) } -static int DoBosCfg(struct cmd_syndesc *as, char *arock) +static int DoBosCfg(struct cmd_syndesc *as, void *arock) { char bosSvcPath[AFSDIR_PATH_MAX]; SC_HANDLE scmHandle, svcHandle; @@ -213,7 +213,7 @@ static int DoBosCfg(struct cmd_syndesc *as, char *arock) } -static int DoBosDel(struct cmd_syndesc *as, char *arock) +static int DoBosDel(struct cmd_syndesc *as, void *arock) { int rc = 0; SC_HANDLE scmHandle, svcHandle; @@ -258,7 +258,7 @@ static int DoBosDel(struct cmd_syndesc *as, char *arock) return (rc); } -static int DoVersionGet(struct cmd_syndesc *as, char *arock) +static int DoVersionGet(struct cmd_syndesc *as, void *arock) { unsigned major, minor, patch; @@ -286,15 +286,15 @@ SetupVptCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("vptlist", DoVptList, 0, + ts = cmd_CreateSyntax("vptlist", DoVptList, NULL, "list vice partition table"); - ts = cmd_CreateSyntax("vptadd", DoVptAdd, 0, + ts = cmd_CreateSyntax("vptadd", DoVptAdd, NULL, "add entry to vice partition table"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED, "partition name"); cmd_AddParm(ts, "-dev", CMD_SINGLE, CMD_REQUIRED, "device name"); - ts = cmd_CreateSyntax("vptdel", DoVptDel, 0, + ts = cmd_CreateSyntax("vptdel", DoVptDel, NULL, "remove entry from vice partition table"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED, "partition name"); } @@ -304,10 +304,10 @@ SetupDirCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("dirget", DoDirGet, 0, + ts = cmd_CreateSyntax("dirget", DoDirGet, NULL, "display the AFS server installation directory"); - ts = cmd_CreateSyntax("dirset", DoDirSet, 0, + ts = cmd_CreateSyntax("dirset", DoDirSet, NULL, "set the AFS server installation directory"); cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_REQUIRED, "directory path"); } @@ -317,11 +317,11 @@ SetupBosCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("boscfg", DoBosCfg, 0, + ts = cmd_CreateSyntax("boscfg", DoBosCfg, NULL, "configure the AFS BOS control service"); cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_OPTIONAL, "service binary path"); - ts = cmd_CreateSyntax("bosdel", DoBosDel, 0, + ts = cmd_CreateSyntax("bosdel", DoBosDel, NULL, "delete (unconfigure) the AFS BOS control service"); } @@ -330,7 +330,7 @@ SetupVersionCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("version", DoVersionGet, 0, + ts = cmd_CreateSyntax("version", DoVersionGet, NULL, "display AFS version information"); } diff --git a/src/WINNT/aklog/NTMakefile b/src/WINNT/aklog/NTMakefile index 337f974a1a..bf0be13be3 100644 --- a/src/WINNT/aklog/NTMakefile +++ b/src/WINNT/aklog/NTMakefile @@ -49,13 +49,15 @@ EXELIBS = \ OTHERLIBS = \ ..\kfw\lib\$(CPU)\krb5_64.lib \ ..\kfw\lib\$(CPU)\comerr64.lib \ - dnsapi.lib mpr.lib + dnsapi.lib mpr.lib delayimp.lib +LINKOPTS = /DELAYLOAD:krb5_64.dll /DELAYLOAD:comerr64.dll !else OTHERLIBS = \ ..\kfw\lib\$(CPU)\krbv4w32.lib \ ..\kfw\lib\$(CPU)\krb5_32.lib \ ..\kfw\lib\$(CPU)\comerr32.lib \ - dnsapi.lib mpr.lib + dnsapi.lib mpr.lib delayimp.lib +LINKOPTS = /DELAYLOAD:krbv4w32.dll /DELAYLOAD:krb5_32.dll /DELAYLOAD:comerr32.dll !endif afscflags = -I..\kfw\inc\krb5 -I..\kfw\inc\krb4 $(afscflags) @@ -68,12 +70,12 @@ $(ASETKEYOBJS): $$(@B).c ############################################################################ $(AKLOG) : $(AKLOGOBJS) $(EXELIBS) $(OUT)\aklog.res - $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) + $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) $(LINKOPTS) $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) $(ASETKEY) : $(ASETKEYOBJS) $(EXELIBS) $(OUT)\asetkey.res - $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) + $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) $(LINKOPTS) $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) diff --git a/src/WINNT/aklog/aklog.c b/src/WINNT/aklog/aklog.c index ded352f99b..d57b962641 100644 --- a/src/WINNT/aklog/aklog.c +++ b/src/WINNT/aklog/aklog.c @@ -13,6 +13,34 @@ * or implied warranty. */ +/* + * Copyright (c) 2007 Secure Endpoints Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of the Secure Endpoints Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #ifndef _WIN64 #define HAVE_KRB4 #endif @@ -145,6 +173,7 @@ get_cellconfig_callback(void *cellconfig, struct sockaddr_in *addrp, char *namep #define AKLOG_TOKEN 5 #define AKLOG_BADPATH 6 #define AKLOG_MISC 7 +#define AKLOG_KFW_NOT_INSTALLED 8 #ifndef NULL #define NULL 0 @@ -1369,6 +1398,40 @@ static void usage(void) exit(AKLOG_USAGE); } +void +validate_krb5_availability(void) +{ +#ifndef _WIN64 +#define KRB5LIB "krb5_32.dll" +#else +#define KRB5LIB "krb5_64.dll" +#endif + HINSTANCE h = LoadLibrary(KRB5LIB); + if (h) + FreeLibrary(h); + else { + fprintf(stderr, "Kerberos for Windows library %s is not available.\n", KRB5LIB); + exit(AKLOG_KFW_NOT_INSTALLED); + } +} + +void +validate_krb4_availability(void) +{ +#ifdef HAVE_KRB4 + HINSTANCE h = LoadLibrary("krbv4w32.dll"); + if (h) + FreeLibrary(h); + else { + fprintf(stderr, "Kerberos for Windows library krbv4w32.dll is not available.\n"); + exit(AKLOG_KFW_NOT_INSTALLED); + } +#else + fprintf(stderr, "Kerberos v4 is not available in this build of aklog.\n"); + exit(AKLOG_USAGE); +#endif +} + int main(int argc, char *argv[]) { int status = AKLOG_SUCCESS; @@ -1542,6 +1605,11 @@ int main(int argc, char *argv[]) } } + if (usev5) + validate_krb5_availability(); + else + validate_krb4_availability(); + if(usev5) krb5_init_context(&context); diff --git a/src/WINNT/aklog/aklog.rc b/src/WINNT/aklog/aklog.rc index 720ed3b318..7c1833a2b0 100644 --- a/src/WINNT/aklog/aklog.rc +++ b/src/WINNT/aklog/aklog.rc @@ -9,7 +9,7 @@ /* Define VERSIONINFO resource */ -#define AFS_VERINFO_FILE_DESCRIPTION "AFS File Server Command" +#define AFS_VERINFO_FILE_DESCRIPTION "AFS Token from Kerberos Ticket Granting Ticket" #define AFS_VERINFO_NAME "aklog" #define AFS_VERINFO_FILENAME "aklog.exe" diff --git a/src/WINNT/aklog/asetkey.c b/src/WINNT/aklog/asetkey.c index 7f99770ef6..63449558a7 100644 --- a/src/WINNT/aklog/asetkey.c +++ b/src/WINNT/aklog/asetkey.c @@ -5,9 +5,37 @@ * * Updated for Kerberos 5 */ +/* + * Copyright (c) 2007 Secure Endpoints Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of the Secure Endpoints Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ #include +#include #include #include @@ -19,6 +47,23 @@ #endif /* !PRE_AFS35 */ #include +void +validate_krb5_availability(void) +{ +#ifndef _WIN64 +#define KRB5LIB "krb5_32.dll" +#else +#define KRB5LIB "krb5_64.dll" +#endif + HINSTANCE h = LoadLibrary(KRB5LIB); + if (h) + FreeLibrary(h); + else { + fprintf(stderr, "Kerberos for Windows library %s is not available.\n", KRB5LIB); + exit(2); + } +} + int main(int argc, char **argv) { @@ -26,6 +71,8 @@ main(int argc, char **argv) register long code; const char *confdir; + validate_krb5_availability(); + if (argc == 1) { printf("asetkey: usage is 'setkey options, e.g.\n"); printf(" asetkey add \n"); diff --git a/src/WINNT/client_osi/osibasel.h b/src/WINNT/client_osi/osibasel.h index 633ee84c9e..5fd2d73a81 100644 --- a/src/WINNT/client_osi/osibasel.h +++ b/src/WINNT/client_osi/osibasel.h @@ -121,12 +121,12 @@ extern void osi_BaseInit(void); /* and friendly macros */ -#define lock_AssertRead(x) osi_assert(lock_GetRWLockState(x) & OSI_RWLOCK_READHELD) +#define lock_AssertRead(x) osi_assertx(lock_GetRWLockState(x) & OSI_RWLOCK_READHELD, "!OSI_RWLOCK_READHELD") -#define lock_AssertWrite(x) osi_assert(lock_GetRWLockState(x) & OSI_RWLOCK_WRITEHELD) +#define lock_AssertWrite(x) osi_assertx(lock_GetRWLockState(x) & OSI_RWLOCK_WRITEHELD, "!OSI_RWLOCK_WRITEHELD") -#define lock_AssertAny(x) osi_assert(lock_GetRWLockState(x) != 0) +#define lock_AssertAny(x) osi_assertx(lock_GetRWLockState(x) != 0, "!(OSI_RWLOCK_READHELD | OSI_RWLOCK_WRITEHELD)") -#define lock_AssertMutex(x) osi_assert(lock_GetMutexState(x) & OSI_MUTEX_HELD) +#define lock_AssertMutex(x) osi_assertx(lock_GetMutexState(x) & OSI_MUTEX_HELD, "!OSI_MUTEX_HELD") #endif /*_OSIBASEL_H_ENV_ */ diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm index 274fcc49e7..104ee7101d 100644 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm +++ b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm @@ -18,7 +18,7 @@ w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} -OpenAFS for Windows 1.5.25 Release Notes +OpenAFS for Windows 1.5.28 Release Notes -OpenAFS for Windows 1.5.25 Release Notes +OpenAFS for Windows 1.5.28 Release Notes Jeffrey Altman 3 - 802 + 930 2006-11-29T17:26:00Z 2007-06-22T13:42:00Z 1 - 17762 - 101245 + 18300 + 104312 Secure Endpoints Inc. - 843 - 237 - 118770 - 11.8132 + 869 + 244 + 122368 + 11.9999  

diff --git a/src/WINNT/doc/install/Documentation/en_US/html/index.htm b/src/WINNT/doc/install/Documentation/en_US/html/index.htm index dd230e0a1b..6023e3a2e3 100755 --- a/src/WINNT/doc/install/Documentation/en_US/html/index.htm +++ b/src/WINNT/doc/install/Documentation/en_US/html/index.htm @@ -57,7 +57,7 @@ p

OpenAFS for Windows

-

Version 1.5.25

+

Version 1.5.28

 

@@ -80,7 +80,7 @@ revised documentation to replace it at the current time.

·         OpenAFS for Windows 1.5.25 +href="ReleaseNotes/relnotes-frames.htm">OpenAFS for Windows 1.5.28 Release Notes

diff --git a/src/WINNT/eventlog/NTMakefile b/src/WINNT/eventlog/NTMakefile index 87c81774e7..fc6bb22221 100644 --- a/src/WINNT/eventlog/NTMakefile +++ b/src/WINNT/eventlog/NTMakefile @@ -72,6 +72,7 @@ de_DE: clean:: $(DEL) $(LIBFILE) $(CD) lang + $(DEL) AFS_component_version_number.h if exist $(NTLANG) $(NTLANG) en_US $(MAKECMD) /nologo /f NTMakefile clean if exist $(NTLANG) $(NTLANG) ja_JP $(MAKECMD) /nologo /f NTMakefile clean if exist $(NTLANG) $(NTLANG) ko_KR $(MAKECMD) /nologo /f NTMakefile clean @@ -85,5 +86,5 @@ clean:: mkdir: -mkdir $(OUT)\lang cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir + $(MAKECMD) /nologo /f NTMakefile SRC=$(SRC) OBJ=$(OBJ) mkdir cd .. diff --git a/src/WINNT/eventlog/lang/NTMakefile b/src/WINNT/eventlog/lang/NTMakefile index 7bfda80d2b..e711a3ef2d 100644 --- a/src/WINNT/eventlog/lang/NTMakefile +++ b/src/WINNT/eventlog/lang/NTMakefile @@ -75,3 +75,4 @@ clean:: $(DEL) $(LANGNAME)\event.h $(DEL) $(LANGNAME)\event.rc $(DEL) $(LANGNAME)\MSG*.bin + $(DEL) AFS_component_version_number.h diff --git a/src/WINNT/eventlog/lang/de_DE/event.rc b/src/WINNT/eventlog/lang/de_DE/event.rc deleted file mode 100644 index 5c78f913ff..0000000000 --- a/src/WINNT/eventlog/lang/de_DE/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x1,0x0 -1 11 MSG000001.bin diff --git a/src/WINNT/eventlog/lang/en_US/event.rc b/src/WINNT/eventlog/lang/en_US/event.rc deleted file mode 100644 index 116522b7d4..0000000000 --- a/src/WINNT/eventlog/lang/en_US/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x9,0x1 -1 11 MSG00001.bin diff --git a/src/WINNT/eventlog/lang/es_ES/event.rc b/src/WINNT/eventlog/lang/es_ES/event.rc deleted file mode 100644 index 116522b7d4..0000000000 --- a/src/WINNT/eventlog/lang/es_ES/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x9,0x1 -1 11 MSG00001.bin diff --git a/src/WINNT/eventlog/lang/ja_JP/event.rc b/src/WINNT/eventlog/lang/ja_JP/event.rc deleted file mode 100644 index 5c78f913ff..0000000000 --- a/src/WINNT/eventlog/lang/ja_JP/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x1,0x0 -1 11 MSG000001.bin diff --git a/src/WINNT/eventlog/lang/ko_KR/event.rc b/src/WINNT/eventlog/lang/ko_KR/event.rc deleted file mode 100644 index 5c78f913ff..0000000000 --- a/src/WINNT/eventlog/lang/ko_KR/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x1,0x0 -1 11 MSG000001.bin diff --git a/src/WINNT/eventlog/lang/pt_BR/event.rc b/src/WINNT/eventlog/lang/pt_BR/event.rc deleted file mode 100644 index 116522b7d4..0000000000 --- a/src/WINNT/eventlog/lang/pt_BR/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x9,0x1 -1 11 MSG00001.bin diff --git a/src/WINNT/eventlog/lang/zh_CN/event.rc b/src/WINNT/eventlog/lang/zh_CN/event.rc deleted file mode 100644 index 116522b7d4..0000000000 --- a/src/WINNT/eventlog/lang/zh_CN/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x9,0x1 -1 11 MSG00001.bin diff --git a/src/WINNT/eventlog/lang/zh_TW/event.rc b/src/WINNT/eventlog/lang/zh_TW/event.rc deleted file mode 100644 index 5c78f913ff..0000000000 --- a/src/WINNT/eventlog/lang/zh_TW/event.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x1,0x0 -1 11 MSG000001.bin diff --git a/src/WINNT/install/InstallShield5/Build.tsb b/src/WINNT/install/InstallShield5/Build.tsb deleted file mode 100644 index ff9fe01226..0000000000 --- a/src/WINNT/install/InstallShield5/Build.tsb +++ /dev/null @@ -1,66 +0,0 @@ -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[Data] -Key0= -Key1= -Key2= -Key3= -Key4= -Key5= -Key10= -Key6= -Key11= -Key7= -Key8= -Key9= - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[General] -Type=TEXTSUB -Version=1.10.000 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - -[] -Value= -KeyType=4 - diff --git a/src/WINNT/install/InstallShield5/BuildSetup.bat b/src/WINNT/install/InstallShield5/BuildSetup.bat deleted file mode 100644 index 330df822ea..0000000000 --- a/src/WINNT/install/InstallShield5/BuildSetup.bat +++ /dev/null @@ -1,37 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file runs the IS5 command line tools to create the OpenAFS setup media. - -echo Building the setup media... - -Set SavePath=%Path% - -Path %IS5ROOT%\Program;%PATH% - -ISbuild -p"%AFSROOT%\src\WINNT\install\InstallShield5" -m"OpenAFS" - -if not exist "Media\OpenAFS\Disk Images\disk1" goto nocopylicense -mkdir "Media\OpenAFS\Disk Images\disk1\License" -copy ..\..\license\lang\*.rtf "Media\OpenAFS\Disk Images\disk1\License" -:nocopylicense - -If errorlevel 1 goto BuildErrorOccurred - -rem Skip over the error handling and exit - Goto Done - -rem Report the build error; then exit -:BuildErrorOccurred - Echo Error on build; media not built. - -:Done -rem Restore the search path - Path=%SavePath% - Set SavePath= - diff --git a/src/WINNT/install/InstallShield5/CompileScript.bat b/src/WINNT/install/InstallShield5/CompileScript.bat deleted file mode 100644 index 33baf9f2a2..0000000000 --- a/src/WINNT/install/InstallShield5/CompileScript.bat +++ /dev/null @@ -1,37 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file runs the IS5 command line compiler to compile the setup script. - -echo. -echo Compiling the setup script... -echo. -echo NOTE: Ignore "Function defined but never called" warnings -echo. - -Set SavePath=%Path% - -Path %IS5ROOT%\Program;%PATH% - -Compile -I%IS5ROOT%\Include "Script Files\setup.rul" - -If errorlevel 1 goto CompilerErrorOccurred - -rem Skip over the error handling and exit - Goto Done - -rem Report the compiler error then exit -:CompilerErrorOccurred - Echo Error on compile; media not built. - Goto Done - -:Done -rem Restore the search path - Path=%SavePath% - Set SavePath= - diff --git a/src/WINNT/install/InstallShield5/CreateGeneratedFiles.bat b/src/WINNT/install/InstallShield5/CreateGeneratedFiles.bat deleted file mode 100644 index 25df3c728d..0000000000 --- a/src/WINNT/install/InstallShield5/CreateGeneratedFiles.bat +++ /dev/null @@ -1,20 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file generates IS5 files that contain hard coded paths. We must -rem generate these so the paths are correct for each person doing a build. - -echo Generating IS files that contain paths... - -call GenIS5.ipr.bat -cd File Groups -rem This next file must run using cmd.exe -cmd /c GenFileGroups.bat -cd ..\Media\OpenAFS -call GenDefault.mda.bat -cd ..\.. diff --git a/src/WINNT/install/InstallShield5/CreateISDirTree.bat b/src/WINNT/install/InstallShield5/CreateISDirTree.bat deleted file mode 100644 index d5cbb7e63b..0000000000 --- a/src/WINNT/install/InstallShield5/CreateISDirTree.bat +++ /dev/null @@ -1,74 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file creates the IS5 directory tree. We couldn't check it into cml -rem because the directory names contain spaces. - -echo Creating the IS dir tree... - -if not exist "Component Definitions" mkdir "Component Definitions" -if not exist "File Groups" mkdir "File Groups" -if not exist Media mkdir Media -if not exist "Media\OpenAFS" mkdir "Media\OpenAFS" -if not exist "Registry Entries" mkdir "Registry Entries" -if not exist "Script Files" mkdir "Script Files" -if not exist "Setup Files" mkdir "Setup Files" - -if not exist "Registry Entries" mkdir "Registry Entries" -if not exist "Script Files" mkdir "Script Files" -if not exist "Setup Files" mkdir "Setup Files" - -set sub1=Uncompressed Files -call :gencomp -set sub1=Compressed Files -call :gencomp -goto shell - -:gencomp -if not exist "Setup Files\%sub1%" mkdir "Setup Files\%sub1%" -set sub2=Language Independent -call :gencomp2 -set sub2=0009-English -call :gencomp2 -set sub2=0007-German -call :gencomp2 -set sub2=0011-Japanese -call :gencomp2 -set sub2=0012-Korean -call :gencomp2 -set sub2=0416-Portuguese (Brazilian) -call :gencomp2 -set sub2=0404-Chinese (Taiwan) -call :gencomp2 -set sub2=000a-Spanish -call :gencomp2 -set sub2=0804-Chinese (PRC) -call :gencomp2 -goto :eof - -:gencomp2 -rem echo ]%sub1%] ]%sub2%] -if not exist "Setup Files\%sub1%\%sub2%" mkdir "Setup Files\%sub1%\%sub2%" -if not exist "Setup Files\%sub1%\%sub2%\OS Independent" mkdir "Setup Files\%sub1%\%sub2%\OS Independent" -if not exist "Setup Files\%sub1%\%sub2%\Intel 32" mkdir "Setup Files\%sub1%\%sub2%\Intel 32" -goto :eof - -:shell -if not exist "Shell Objects" mkdir "Shell Objects" -if not exist "String Tables" mkdir "String Tables" -if not exist "String Tables\0009-English" mkdir "String Tables\0009-English" -if not exist "String Tables\0011-Japanese" mkdir "String Tables\0011-Japanese" -if not exist "String Tables\0012-Korean" mkdir "String Tables\0012-Korean" -if not exist "String Tables\0404-Chinese (Taiwan)" mkdir "String Tables\0404-Chinese (Taiwan)" -if not exist "String Tables\0804-Chinese (PRC)" mkdir "String Tables\0804-Chinese (PRC)" -if not exist "String Tables\0007-German" mkdir "String Tables\0007-German" -if not exist "String Tables\0416-Portuguese (Brazilian)" mkdir "String Tables\0416-Portuguese (Brazilian)" -if not exist "String Tables\000a-Spanish" mkdir "String Tables\000a-Spanish" -if not exist "Text Substitutions" mkdir "Text Substitutions" - -:eof \ No newline at end of file diff --git a/src/WINNT/install/InstallShield5/Default.cdf b/src/WINNT/install/InstallShield5/Default.cdf deleted file mode 100644 index fa6800896e..0000000000 --- a/src/WINNT/install/InstallShield5/Default.cdf +++ /dev/null @@ -1,2920 +0,0 @@ -[Documentation\Simp_Chinese] -COMMENT= -COMPRESSIFSEPARATE=No -DEFSELECTION=Yes -DESCRIPTION= -DISK=ANYDISK -DISPLAYTEXT= -ENCRYPT=No -FILENEED=STANDARD -FTPLOCATION= -HTTPLOCATION= -IMAGE= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -member0=Documentation\Simp_Chinese\Cmd_Ref -member1=Documentation\Simp_Chinese\Sys_Admin_Guide -member2=Documentation\Simp_Chinese\Doc_Misc -MISC= -PASSWORD= -required0=Readme\Simp_Chinese -SELECTED=Yes -STATUS= -TARGET= -TARGETDIRCDROM= -TARGETHIDDEN=General Application Destination -UNINSTALLABLE=Yes -VISIBLE=No - -[Documentation\Japanese\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_Japanese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\Simp_Chinese\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_Simp_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Readme\Japanese\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_Japanese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Readme\English\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_English_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Client\Client_WinDir] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CLIENT -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_WinDir_Files -requiredby0=Client -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Documentation\English\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_English_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Server] -required0=Readme -SELECTED=Yes -FILENEED=STANDARD -required1=Server\Server_Program -HTTPLOCATION= -STATUS=SERVER -required2=Server\Server_Common -UNINSTALLABLE=Yes -TARGET= -required3=Server\Server_WinDir -required4=Server\Server_System32 -member0=Server\Server_Program -FTPLOCATION= -member1=Server\Server_Common -VISIBLE=Yes -DESCRIPTION= -member2=Server\Server_WinDir -member3=Server\Server_System32 -DISPLAYTEXT=AFS Server -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Control_Center\Control_Center_System32] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CCENTER -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Control_Center_System32_Files -requiredby0=Control_Center -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System\Windows System Folder - -[Readme\Korean\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Korean_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Components] -component0=Client\Client_WinDir -component1=Readme\English\Release_Notes -component2=Readme\Japanese\Release_Notes -component3=Readme\Simp_Chinese\Install_Guide -component4=Documentation\Japanese\Cmd_Ref -component5=Documentation\Simp_Chinese -component6=Readme\Korean\Doc_Misc -component7=Control_Center\Control_Center_System32 -component8=Server -component9=Documentation\English\Sys_Admin_Guide -component10=Documentation\English\Doc_Misc -component11=Readme\Japanese\Doc_Misc -component12=Control_Center -component13=Client\Client_System32 -component14=Server\Server_Program -component15=Light_Client\Win98\Light_Client_Common -component16=Control_Center\Control_Center_Program -component17=Documentation\English\Cmd_Ref -component18=Documentation\Japanese\Sys_Admin_Guide -component19=Documentation\Trad_Chinese -component20=Light_Client\Win95\Light95_Client_Common -component21=Client\Client_Program\Client_Headers -component22=Languages\Lang_Japanese -component23=Control_Center\Control_Center_Common -component24=Readme\English\Install_Guide -component25=Readme\Japanese\Install_Guide -component26=Readme\Simp_Chinese -component27=Documentation\Japanese -component28=Documentation\Simp_Chinese\Doc_Misc -component29=Documentation\Trad_Chinese\Doc_Misc -component30=Light_Client -component31=Server\Server_WinDir -component32=Readme\English -component33=Readme\Japanese -component34=Documentation\Korean\Cmd_Ref -component35=Light_Client\Win95 -component36=Client\Client_Program\Client_Sample -component37=Documentation\Korean\Doc_Misc -component38=Readme\Simp_Chinese\Doc_Misc -component39=Readme\Trad_Chinese\Doc_Misc -component40=Client\Client_Common -component41=Client\Client_Program -component42=Light_Client\Win95\Light95_Client_System32 -component43=Languages\Lang_Simp_Chinese -component44=Client -component45=Readme\Korean\Release_Notes -component46=Documentation\Simp_Chinese\Cmd_Ref -component47=Documentation\Simp_Chinese\Sys_Admin_Guide -component48=Light_Client\Win98 -component49=Readme\Trad_Chinese -component50=Readme\Trad_Chinese\Release_Notes -component51=Documentation\Trad_Chinese\Cmd_Ref -component52=Readme\English\Doc_Misc -component53=Languages\Lang_English -component54=Readme\Korean -component55=Client\Client_Program\Client_Headers\Client_Main_Headers -component56=Documentation\Japanese\Doc_Misc -component57=Languages -component58=Readme\Simp_Chinese\Release_Notes -component59=Server\Server_System32 -component60=Server\Server_Common -component61=Documentation\Trad_Chinese\Sys_Admin_Guide -component62=Light_Client\Win98\Light_Client_System32 -component63=Light_Client\Win98\Light_Client_WinDir -component64=Readme -component65=Readme\Korean\Install_Guide -component66=Documentation\Korean -component67=Languages\Lang_Trad_Chinese -component68=Light_Client\Win98\Light_Client_Program -component69=Light_Client\Win95\Light95_Client_WinDir -component70=Light_Client\Win95\Light95_Client_Program -component71=Client\Client_Program\Client_Headers\Client_Rx_Headers -component72=Control_Center\Control_Center_WinDir -component73=Readme\Trad_Chinese\Install_Guide -component74=Documentation\English -component75=Documentation\Korean\Sys_Admin_Guide -component76=Client\Client_Program\Client_Headers\Client_Afs_Headers -component77=Documentation -component78=Languages\Lang_Korean -component79=Readme\German\Release_Notes -component80=Documentation\German\Cmd_Ref -component81=Readme\German\Doc_Misc -component82=Documentation\German\Sys_Admin_Guide -component83=Languages\Lang_German -component84=Readme\German\Install_Guide -component85=Documentation\German -component86=Readme\German -component87=Documentation\German\Doc_Misc -component88=Readme\Spanish\Release_Notes -component89=Documentation\Spanish\Cmd_Ref -component90=Readme\Spanish\Doc_Misc -component91=Documentation\Spanish\Sys_Admin_Guide -component92=Languages\Lang_Spanish -component93=Readme\Spanish\Install_Guide -component94=Documentation\Spanish -component95=Readme\Spanish -component96=Documentation\Spanish\Doc_Misc -component97=Readme\Portuguese\Release_Notes -component98=Documentation\Portuguese\Cmd_Ref -component99=Readme\Portuguese\Doc_Misc -component100=Documentation\Portuguese\Sys_Admin_Guide -component101=Languages\Lang_Portuguese -component102=Readme\Portuguese\Install_Guide -component103=Documentation\Portuguese -component104=Readme\Portuguese -component105=Documentation\Portuguese\Doc_Misc - -[SetupTypeItem-AFS Control Center] -Comment= -item0=Control_Center\Control_Center_System32 -item1=Control_Center\Control_Center_Common -item2=Control_Center\Control_Center_WinDir -Descrip=Allows easy administration of the AFS Distributed File System. -DisplayText=AFS Control Center - -[Server\Server_Program] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=SERVER -UNINSTALLABLE=Yes -TARGET=\Server\usr\afs\bin -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Server_Program_Files -requiredby0=Server -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Server\usr\afs\bin - -[Client\Client_System32] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CLIENT -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_System32_Files -requiredby0=Client -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System\Windows System Folder - -[Control_Center] -required0=Readme -SELECTED=Yes -FILENEED=STANDARD -required1=Control_Center\Control_Center_Program -HTTPLOCATION= -STATUS=CCENTER -required2=Control_Center\Control_Center_Common -UNINSTALLABLE=Yes -TARGET= -required3=Control_Center\Control_Center_WinDir -required4=Control_Center\Control_Center_System32 -member0=Control_Center\Control_Center_Program -FTPLOCATION= -member1=Control_Center\Control_Center_Common -VISIBLE=Yes -DESCRIPTION= -member2=Control_Center\Control_Center_WinDir -member3=Control_Center\Control_Center_System32 -DISPLAYTEXT=AFS Control Center -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Japanese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Japanese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\English\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_English_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[TopComponents] -component0=Server -component1=Client -component2=Light_Client -component3=Control_Center -component4=Readme -component5=Languages -component6=Documentation - -[SetupTypeItem-AFS Server] -Comment= -item0=Server\Server_System32 -Descrip=Allows this computer to host files that will be shared via the AFS file space. This product automatically includes both the AFS Client and the AFS Server. -DisplayText=AFS Server (includes Client and Control Center) - -[SetupType] -setuptype0=AFS Control Center -setuptype1=AFS Server -setuptype2=AFS Client - -[Documentation\Trad_Chinese] -COMMENT= -COMPRESSIFSEPARATE=No -DEFSELECTION=Yes -DESCRIPTION= -DISK=ANYDISK -DISPLAYTEXT= -ENCRYPT=No -FILENEED=STANDARD -FTPLOCATION= -HTTPLOCATION= -IMAGE= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -member0=Documentation\Trad_Chinese\Cmd_Ref -member1=Documentation\Trad_Chinese\Sys_Admin_Guide -member2=Documentation\Trad_Chinese\Doc_Misc -MISC= -PASSWORD= -required0=Readme\Trad_Chinese -SELECTED=Yes -STATUS= -TARGET= -TARGETDIRCDROM= -TARGETHIDDEN=General Application Destination -UNINSTALLABLE=Yes -VISIBLE=No - -[Documentation\Japanese\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_Japanese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Documentation\English\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_English_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Control_Center\Control_Center_Program] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CCENTER -UNINSTALLABLE=Yes -TARGET=\Control Center -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Control_Center_Program_Files -requiredby0=Control_Center -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Control Center - -[Light_Client\Win98\Light_Client_Common] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light_Client_Common_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Documentation\Japanese] -required0=Readme\Japanese -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -member0=Documentation\Japanese\Cmd_Ref -VISIBLE=No -DESCRIPTION= -member1=Documentation\Japanese\Sys_Admin_Guide -member2=Documentation\Japanese\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Simp_Chinese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\Simp_Chinese\Release_Notes -FTPLOCATION= -member1=Readme\Simp_Chinese\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\Simp_Chinese\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\Simp_Chinese -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Japanese\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_Japanese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Readme\English\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_English_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Control_Center\Control_Center_Common] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CCENTER -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Control_Center_Common_Files -requiredby0=Control_Center -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Languages\Lang_Japanese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_Japanese_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Client\Client_Program\Client_Headers] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=HEADERS -UNINSTALLABLE=Yes -TARGET=\Client\Program\Include -member0=Client\Client_Program\Client_Headers\Client_Afs_Headers -FTPLOCATION= -member1=Client\Client_Program\Client_Headers\Client_Rx_Headers -VISIBLE=No -DESCRIPTION= -member2=Client\Client_Program\Client_Headers\Client_Main_Headers -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program\Include - -[Light_Client\Win95\Light95_Client_Common] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light95_Client_Common_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Documentation\Korean\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_Korean_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\Japanese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\Japanese\Release_Notes -FTPLOCATION= -member1=Readme\Japanese\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\Japanese\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\Japanese -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\English] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\English\Release_Notes -FTPLOCATION= -member1=Readme\English\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\English\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\English -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Server\Server_WinDir] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=SERVER -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Server_WinDir_Files -requiredby0=Server -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System - -[Light_Client] -required0=Readme -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET= -member0=Light_Client\Win95 -FTPLOCATION= -member1=Light_Client\Win98 -VISIBLE=Yes -DESCRIPTION= -DISPLAYTEXT=AFS Light -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Documentation\Trad_Chinese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Trad_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\Simp_Chinese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Simp_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Client\Client_Program] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CLIENT -UNINSTALLABLE=Yes -TARGET=\Client\Program -member0=Client\Client_Program\Client_Headers -FTPLOCATION= -member1=Client\Client_Program\Client_Sample -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_Program_Files -requiredby0=Client -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program - -[Client\Client_Common] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CLIENT -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_Common_Files -requiredby0=Client -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Readme\Trad_Chinese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Trad_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Readme\Simp_Chinese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Simp_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\Korean\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Korean_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Client\Client_Program\Client_Sample] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Client\Program\Sample -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_Sample_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program\Sample - -[Light_Client\Win95] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Light_Client\Win95\Light95_Client_Program -FTPLOCATION= -member1=Light_Client\Win95\Light95_Client_Common -VISIBLE=Yes -DESCRIPTION= -member2=Light_Client\Win95\Light95_Client_WinDir -member3=Light_Client\Win95\Light95_Client_System32 -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=ALWAYSOVERWRITE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Light_Client\Win95\Light95_Client_System32] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT=Installing AFS Light... -IMAGE= -DEFSELECTION=Yes -filegroup0=Light95_Client_System32_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System\Windows System Folder - -[Documentation\Simp_Chinese\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_Simp_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Documentation\Simp_Chinese\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_Simp_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\Korean\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_Korean_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Client] -required0=Readme -SELECTED=Yes -FILENEED=STANDARD -required1=Client\Client_Common -HTTPLOCATION= -STATUS=CLIENT -required2=Client\Client_WinDir -UNINSTALLABLE=Yes -TARGET= -required3=Client\Client_System32 -required4=Client\Client_Program -member0=Client\Client_Program -FTPLOCATION= -member1=Client\Client_Common -VISIBLE=Yes -DESCRIPTION= -member2=Client\Client_WinDir -member3=Client\Client_System32 -DISPLAYTEXT=AFS Client -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Languages\Lang_Simp_Chinese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_Simp_Chinese_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Documentation\Trad_Chinese\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_Trad_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\Trad_Chinese\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_Trad_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Readme\Trad_Chinese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\Trad_Chinese\Release_Notes -FTPLOCATION= -member1=Readme\Trad_Chinese\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\Trad_Chinese\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\Trad_Chinese -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Light_Client\Win98] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Light_Client\Win98\Light_Client_Program -FTPLOCATION= -member1=Light_Client\Win98\Light_Client_Common -VISIBLE=Yes -DESCRIPTION= -member2=Light_Client\Win98\Light_Client_WinDir -member3=Light_Client\Win98\Light_Client_System32 -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=ALWAYSOVERWRITE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Korean] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\Korean\Release_Notes -FTPLOCATION= -member1=Readme\Korean\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\Korean\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\Korean -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Languages\Lang_English] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_English_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Readme\English\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_English_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[SetupTypeItem-AFS Client] -Comment= -Descrip=Allows access to the AFS file space. -DisplayText=AFS Client - -[Readme\Simp_Chinese\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_Simp_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Languages] -COMMENT= -COMPRESSIFSEPARATE=No -DEFSELECTION=Yes -DESCRIPTION= -DISK=ANYDISK -DISPLAYTEXT= -ENCRYPT=No -FILENEED=STANDARD -FTPLOCATION= -HTTPLOCATION= -IMAGE= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -member0=Languages\Lang_English -member1=Languages\Lang_Simp_Chinese -member2=Languages\Lang_Trad_Chinese -member3=Languages\Lang_Korean -member4=Languages\Lang_Japanese -member5=Languages\Lang_German -member6=Languages\Lang_Spanish -member7=Languages\Lang_Portuguese -MISC= -PASSWORD= -SELECTED=Yes -STATUS= -TARGET=\Common -TARGETDIRCDROM= -TARGETHIDDEN=General Application Destination\Common -UNINSTALLABLE=Yes -VISIBLE=No - -[Documentation\Japanese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Japanese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Client\Client_Program\Client_Headers\Client_Main_Headers] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Client\Program\Include -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_Main_Header_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program\Include - -[Info] -Type=CompDef -Version=1.00.000 -Name= - -[Documentation\Trad_Chinese\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_Trad_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Server\Server_Common] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=SERVER -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Server_Common_Files -requiredby0=Server -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Server\Server_System32] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=SERVER -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Server_System32_Files -requiredby0=Server -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System\Windows System Folder - -[Languages\Lang_Trad_Chinese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_Trad_Chinese_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Documentation\Korean] -required0=Readme\Korean -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -member0=Documentation\Korean\Cmd_Ref -VISIBLE=No -DESCRIPTION= -member1=Documentation\Korean\Sys_Admin_Guide -member2=Documentation\Korean\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Korean\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_Korean_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Readme] -COMMENT= -COMPRESSIFSEPARATE=No -DEFSELECTION=Yes -DESCRIPTION= -DISK=ANYDISK -DISPLAYTEXT= -ENCRYPT=No -FILENEED=STANDARD -FTPLOCATION= -HTTPLOCATION= -IMAGE= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -member0=Readme\English -member1=Readme\Japanese -member2=Readme\Korean -member3=Readme\Trad_Chinese -member4=Readme\Simp_Chinese -member5=Readme\German -member6=Readme\Spanish -member7=Readme\Portuguese -MISC= -PASSWORD= -requiredby0=Server -requiredby1=Client -requiredby2=Light_Client -requiredby3=Control_Center -requiredby4=Documentation -SELECTED=Yes -STATUS= -TARGET=\Documentation -TARGETDIRCDROM= -TARGETHIDDEN=General Application Destination\Documentation -UNINSTALLABLE=Yes -VISIBLE=No - -[Light_Client\Win98\Light_Client_WinDir] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light_Client_WinDir_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Light_Client\Win98\Light_Client_System32] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light_Client_System32_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System\Windows System Folder - -[Documentation\Korean\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_Korean_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Documentation\English] -required0=Readme\English -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -member0=Documentation\English\Cmd_Ref -VISIBLE=No -DESCRIPTION= -member1=Documentation\English\Sys_Admin_Guide -member2=Documentation\English\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Trad_Chinese\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_Trad_Chinese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Control_Center\Control_Center_WinDir] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=CCENTER -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Control_Center_WinDir_Files -requiredby0=Control_Center -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Client\Client_Program\Client_Headers\Client_Rx_Headers] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Client\Program\Include\rx -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_Rx_Header_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program\Include\rx - -[Light_Client\Win95\Light95_Client_Program] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET=\Client\Program -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light95_Client_Program_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program - -[Light_Client\Win95\Light95_Client_WinDir] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light95_Client_WinDir_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=Windows Operating System - -[Light_Client\Win98\Light_Client_Program] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LIGHT -UNINSTALLABLE=Yes -TARGET=\Client\Program -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Light_Client_Program_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program - -[Languages\Lang_Korean] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_Korean_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Documentation] -COMMENT= -COMPRESSIFSEPARATE=No -DEFSELECTION=Yes -DESCRIPTION= -DISK=ANYDISK -DISPLAYTEXT=AFS Supplemental Documentation -ENCRYPT=No -filegroup0=Doc_Files -FILENEED=STANDARD -FTPLOCATION= -HTTPLOCATION= -IMAGE= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -member0=Documentation\English -member1=Documentation\Japanese -member2=Documentation\Korean -member3=Documentation\Trad_Chinese -member4=Documentation\Simp_Chinese -member5=Documentation\German -member6=Documentation\Spanish -member7=Documentation\Portuguese -MISC= -PASSWORD= -required0=Readme -SELECTED=Yes -STATUS=DOCS -TARGET=\Documentation -TARGETDIRCDROM= -TARGETHIDDEN=General Application Destination\Documentation -UNINSTALLABLE=Yes -VISIBLE=Yes - -[Client\Client_Program\Client_Headers\Client_Afs_Headers] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Client\Program\Include\afs -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Client_Afs_Header_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Client\Program\Include\afs - -[Documentation\German\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_German_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\German\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_German_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Readme\German\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_German_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\German\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_German_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Documentation\German] -required0=Readme\German -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -member0=Documentation\German\Cmd_Ref -VISIBLE=No -DESCRIPTION= -member1=Documentation\German\Sys_Admin_Guide -member2=Documentation\German\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\German\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_German_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Languages\Lang_German] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_German_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Readme\German] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\German\Release_Notes -FTPLOCATION= -member1=Readme\German\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\German\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\German -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Documentation\German\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_German_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\Spanish\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_Spanish_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\Spanish\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_Spanish_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Readme\Spanish\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Spanish_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\Spanish\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_Spanish_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Documentation\Spanish] -required0=Readme\Spanish -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -member0=Documentation\Spanish\Cmd_Ref -VISIBLE=No -DESCRIPTION= -member1=Documentation\Spanish\Sys_Admin_Guide -member2=Documentation\Spanish\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Spanish\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_Spanish_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Languages\Lang_Spanish] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_Spanish_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Readme\Spanish] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\Spanish\Release_Notes -FTPLOCATION= -member1=Readme\Spanish\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\Spanish\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\Spanish -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Documentation\Spanish\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Spanish_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\Portuguese\Cmd_Ref] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\CmdRef -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Cmd_Ref_Portuguese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\CmdRef - -[Readme\Portuguese\Release_Notes] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\ReleaseNotes -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Release_Notes_Portuguese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation - -[Readme\Portuguese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Portuguese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - -[Documentation\Portuguese\Sys_Admin_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\SysAdminGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Sys_Admin_Guide_Portuguese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\SysAdminGd - -[Documentation\Portuguese] -required0=Readme\Portuguese -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -FTPLOCATION= -member0=Documentation\Portuguese\Cmd_Ref -VISIBLE=No -DESCRIPTION= -member1=Documentation\Portuguese\Sys_Admin_Guide -member2=Documentation\Portuguese\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Readme\Portuguese\Install_Guide] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html\InstallGd -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Install_Guide_Portuguese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html\InstallGd - -[Languages\Lang_Portuguese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS=LANGUAGE -UNINSTALLABLE=Yes -TARGET=\Common -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Lang_Portuguese_files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Common - -[Readme\Portuguese] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET= -member0=Readme\Portuguese\Release_Notes -FTPLOCATION= -member1=Readme\Portuguese\Install_Guide -VISIBLE=No -DESCRIPTION= -member2=Readme\Portuguese\Doc_Misc -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -requiredby0=Documentation\Portuguese -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination - -[Documentation\Portuguese\Doc_Misc] -SELECTED=Yes -FILENEED=STANDARD -HTTPLOCATION= -STATUS= -UNINSTALLABLE=Yes -TARGET=\Documentation\Html -FTPLOCATION= -VISIBLE=No -DESCRIPTION= -DISPLAYTEXT= -IMAGE= -DEFSELECTION=Yes -filegroup0=Doc_Misc_Portuguese_Files -COMMENT= -INCLUDEINBUILD=Yes -INSTALLATION=NEWERVERSION\NEWERDATE -COMPRESSIFSEPARATE=No -MISC= -ENCRYPT=No -DISK=ANYDISK -TARGETDIRCDROM= -PASSWORD= -TARGETHIDDEN=General Application Destination\Documentation\Html - diff --git a/src/WINNT/install/InstallShield5/Default.fdf b/src/WINNT/install/InstallShield5/Default.fdf deleted file mode 100644 index 7aec33570e..0000000000 --- a/src/WINNT/install/InstallShield5/Default.fdf +++ /dev/null @@ -1,1102 +0,0 @@ -[Lang_Trad_Chinese_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Control_Center_WinDir_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Control_Center_Program_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Server_Common_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Server_Program_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[FileGroups] -group0=Light95_Client_Common_Files -group1=Server_Program_Files -group2=Server_Common_Files -group3=Control_Center_Program_Files -group4=Control_Center_WinDir_Files -group5=Lang_Trad_Chinese_files -group6=Sys_Admin_Guide_Trad_Chinese_Files -group7=Sys_Admin_Guide_English_Files -group8=Release_Notes_Trad_Chinese_Files -group9=Client_System32_Files -group10=Light_Client_System32_Files -group11=Client_Main_Header_Files -group12=Install_Guide_Japanese_Files -group13=Light95_Client_WinDir_Files -group14=Light95_Client_Program_Files -group15=Release_Notes_English_Files -group16=Server_WinDir_Files -group17=Client_Program_Files -group18=Release_Notes_Japanese_Files -group19=Lang_English_files -group20=Sys_Admin_Guide_Japanese_Files -group21=Cmd_Ref_Simp_Chinese_Files -group22=Doc_Files -group23=Client_Common_Files -group24=Control_Center_System32_Files -group25=Lang_Japanese_files -group26=Doc_Misc_Trad_Chinese_Files -group27=Client_Sample_Files -group28=Release_Notes_Korean_Files -group29=Install_Guide_Trad_Chinese_Files -group30=Lang_Simp_Chinese_files -group31=Light95_Client_System32_Files -group32=Sys_Admin_Guide_Simp_Chinese_Files -group33=Cmd_Ref_Korean_Files -group34=Release_Notes_Simp_Chinese_Files -group35=Install_Guide_English_Files -group36=Cmd_Ref_Japanese_Files -group37=Doc_Misc_English_Files -group38=Doc_Misc_Japanese_Files -group39=Server_System32_Files -group40=Client_WinDir_Files -group41=Light_Client_Common_Files -group42=Client_Rx_Header_Files -group43=Sys_Admin_Guide_Korean_Files -group44=Install_Guide_Korean_Files -group45=Light_Client_Program_Files -group46=Control_Center_Common_Files -group47=Doc_Misc_Korean_Files -group48=Lang_Korean_files -group49=Cmd_Ref_Trad_Chinese_Files -group50=Doc_Misc_Simp_Chinese_Files -group51=Client_Afs_Header_Files -group52=Install_Guide_Simp_Chinese_Files -group53=Cmd_Ref_English_Files -group54=Light_Client_WinDir_Files -group55=Doc_Misc_German_Files -group56=Cmd_Ref_German_Files -group57=Lang_German_files -group58=Sys_Admin_Guide_German_Files -group59=Release_Notes_German_Files -group60=Install_Guide_German_Files -group61=Doc_Misc_Spanish_Files -group62=Cmd_Ref_Spanish_Files -group63=Lang_Spanish_files -group64=Sys_Admin_Guide_Spanish_Files -group65=Release_Notes_Spanish_Files -group66=Install_Guide_Spanish_Files -group67=Doc_Misc_Portuguese_Files -group68=Cmd_Ref_Portuguese_Files -group69=Lang_Portuguese_files -group70=Sys_Admin_Guide_Portuguese_Files -group71=Release_Notes_Portuguese_Files -group72=Install_Guide_Portuguese_Files - -[Light95_Client_Common_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Sys_Admin_Guide_English_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Sys_Admin_Guide_Trad_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Light_Client_System32_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Client_System32_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_Trad_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Install_Guide_Japanese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Client_Main_Header_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Client_Program_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Server_WinDir_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Release_Notes_English_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Light95_Client_Program_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Light95_Client_WinDir_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Lang_English_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_Japanese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_Simp_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Sys_Admin_Guide_Japanese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Client_Sample_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Doc_Misc_Trad_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Lang_Japanese_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Control_Center_System32_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Client_Common_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Doc_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Lang_Simp_Chinese_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Install_Guide_Trad_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_Korean_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_Korean_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Sys_Admin_Guide_Simp_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Light95_Client_System32_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Doc_Misc_Japanese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Doc_Misc_English_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_Japanese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Install_Guide_English_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_Simp_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Light_Client_Common_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Client_WinDir_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Server_System32_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Install_Guide_Korean_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Sys_Admin_Guide_Korean_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Client_Rx_Header_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Info] -Type=FileGrp -Version=1.00.000 -Name= - -[Doc_Misc_Korean_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Control_Center_Common_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Light_Client_Program_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Lang_Korean_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Doc_Misc_Simp_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_Trad_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Light_Client_WinDir_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM=0000000000000000 -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Cmd_Ref_English_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Install_Guide_Simp_Chinese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Client_Afs_Header_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Install_Guide_German_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_German_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Sys_Admin_Guide_German_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Lang_German_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Doc_Misc_German_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_German_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Install_Guide_Spanish_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_Spanish_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Sys_Admin_Guide_Spanish_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Lang_Spanish_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Doc_Misc_Spanish_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_Spanish_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Install_Guide_Portuguese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Release_Notes_Portuguese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Sys_Admin_Guide_Portuguese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - -[Lang_Portuguese_files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Doc_Misc_Portuguese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=Yes -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=Yes -MISC= - -[Cmd_Ref_Portuguese_Files] -SELFREGISTERING=No -HTTPLOCATION= -LANGUAGE= -OPERATINGSYSTEM= -FTPLOCATION= -FILETYPE=No -INFOTYPE=Standard -COMMENT= -COMPRESS=Yes -COMPRESSDLL= -POTENTIALLY=No -MISC= - diff --git a/src/WINNT/install/InstallShield5/Default.fgl b/src/WINNT/install/InstallShield5/Default.fgl deleted file mode 100644 index e434a5a102..0000000000 --- a/src/WINNT/install/InstallShield5/Default.fgl +++ /dev/null @@ -1,156 +0,0 @@ -[\] -DISPLAYTEXT=Common Files Folder -TYPE=TEXTSUBFIXED -fulldirectory= - -[\Client\Program\Sample] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\] -DISPLAYTEXT=Windows System Folder -TYPE=TEXTSUBFIXED -fulldirectory= - -[USERDEFINED] -DISPLAYTEXT=Script-defined Folders -TYPE=USERSTART -fulldirectory= - -[] -DISPLAYTEXT=Program Files Folder -SubDir0=\ -TYPE=TEXTSUBFIXED -fulldirectory= - -[] -DISPLAYTEXT=General Application Destination -SubDir0=\Client -SubDir1=\Server -TYPE=TEXTSUBFIXED -SubDir2=\Control Center -SubDir3=\Common -fulldirectory= -SubDir4=\Documentation - -[\Documentation\Html\BackupCmdRef] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Documentation] -DISPLAYTEXT= -SubDir0=\Documentation\Html -TYPE=FOLDER -fulldirectory= - -[\Documentation\Html\InstallGd] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Client\Program\Include] -DISPLAYTEXT= -SubDir0=\Client\Program\Include\afs -SubDir1=\Client\Program\Include\rx -TYPE=FOLDER -fulldirectory= - -[\Client\Program\Include\afs] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Client\Program\Include\rx] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Client\Program] -DISPLAYTEXT= -SubDir0=\Client\Program\Include -SubDir1=\Client\Program\Sample -TYPE=FOLDER -fulldirectory= - -[] -DISPLAYTEXT=Windows Operating System -SubDir0=\ -TYPE=TEXTSUBFIXED -fulldirectory= - -[\Server] -DISPLAYTEXT= -SubDir0=\Server\usr -TYPE=FOLDER -fulldirectory= - -[TopDir] -SubDir0= -SubDir1= -SubDir2= -SubDir3=USERDEFINED - -[\Documentation\Html\CmdRef] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Server\usr] -DISPLAYTEXT= -SubDir0=\Server\usr\afs -TYPE=FOLDER -fulldirectory= - -[\Client\Help] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Server\usr\afs\bin] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Documentation\Html\SysAdminGd] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Documentation\Html] -DISPLAYTEXT= -SubDir0=\Documentation\Html\InstallGd -SubDir1=\Documentation\Html\BackupCmdRef -TYPE=FOLDER -SubDir2=\Documentation\Html\CmdRef -SubDir3=\Documentation\Html\SysAdminGd -fulldirectory= - -[General] -Type=FILELIST -Version=1.00.000 - -[\Control Center] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Common] -DISPLAYTEXT= -TYPE=FOLDER -fulldirectory= - -[\Server\usr\afs] -DISPLAYTEXT= -SubDir0=\Server\usr\afs\bin -TYPE=FOLDER -fulldirectory= - -[\Client] -DISPLAYTEXT= -SubDir0=\Client\Program -SubDir1=\Client\Help -TYPE=FOLDER -fulldirectory= - diff --git a/src/WINNT/install/InstallShield5/Default.shell b/src/WINNT/install/InstallShield5/Default.shell deleted file mode 100644 index a3035620b0..0000000000 --- a/src/WINNT/install/InstallShield5/Default.shell +++ /dev/null @@ -1,154 +0,0 @@ -[Shortcut0] -Target=\Client\Program\afscreds.exe -Parameters=/show -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -FileGroup=Client_Program_Files -Replace=Yes -IconIndex= -StartIn= -InternetShortcut=No -IconFile=\Client\Program\afscreds.exe -Comments= -DisplayText=Authentication - -[Shortcut1] -Target=\Control Center\TaAfsServerManager.exe -Parameters= -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -FileGroup=Control_Center_Program_Files -Replace=Yes -IconIndex= -StartIn= -InternetShortcut=No -IconFile=\Control Center\TaAfsServerManager.exe -Comments= -DisplayText=Server Manager - -[Folder4] -Type=Common -Comments= -DisplayText= - -[Shortcut2] -Target=\Server\usr\afs\bin\afssvrcfg.exe -Parameters=/wizard -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -FileGroup=Server_Program_Files -Replace=Yes -IconIndex= -StartIn= -InternetShortcut=No -IconFile=\Server\usr\afs\bin\afssvrcfg.exe -Comments= -DisplayText=Configuration Wizard - -[Folder5] -Type=Common -Comments= -DisplayText=Client - -[Folder6] -Type=Common -Comments= -DisplayText=Server - -[Shortcut3] -Target=\Control Center\TaAfsAccountManager.exe -Parameters= -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -FileGroup=Control_Center_Program_Files -Replace=Yes -IconIndex= -StartIn= -InternetShortcut=No -IconFile=\Control Center\TaAfsAccountManager.exe -Comments= -DisplayText=Account Manager - -[Folder7] -Type=Common -Comments= -DisplayText=Control Center - -[Shortcut4] -Target= -Parameters= -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -IconIndex= -Replace=Yes -FileGroup=Client_Program_Files -StartIn= -IconFile= -InternetShortcut=No -DisplayText=AFS Client Help -Comments= - -[Folder8] -Type=Common -Comments= -DisplayText=Light - -[Shortcut5] -Target=\Client\Program\afscreds.exe -Parameters=/show -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -IconIndex= -Replace=Yes -FileGroup=Light_Client_Program_Files -StartIn= -IconFile=\Client\Program\afscreds.exe -InternetShortcut=No -DisplayText=Authentication -Comments= - -[Shortcut6] -Target= -Parameters= -ShortcutKey= -SeparateMemorySpace=No -Run=Normal Window -IconIndex= -Replace=Yes -FileGroup=Light_Client_Program_Files -StartIn= -IconFile= -InternetShortcut=No -DisplayText=AFS Light Help -Comments= - -[Data] -Shortcut0=Folder5\Authentication -Folder3= -Shortcut1=Folder7\Server Manager -Folder4=Folder2\User Specified - default is Transarc AFS -Shortcut2=Folder6\Config Wizard -Folder5=Folder4\Client -Group0=Main -Folder6=Folder4\Server -Group1=Startup -Shortcut3=Folder7\Account Manager -Folder7=Folder4\Control_Center -Shortcut4=Folder5\AFS Client Help -Folder8=Folder4\Light -Shortcut5=Folder8\Authentication -Shortcut6=Folder8\AFS Light Help -Folder0= -Folder1= -Folder2= - -[Info] -Type=ShellObject -Version=1.00.000 - diff --git a/src/WINNT/install/InstallShield5/Default.shl b/src/WINNT/install/InstallShield5/Default.shl deleted file mode 100644 index 310191c804..0000000000 --- a/src/WINNT/install/InstallShield5/Default.shl +++ /dev/null @@ -1,454 +0,0 @@ -[DEFAULT_INSTALL_DIR] -Comment= - -[NOTHING_SELECTED_MSG] -Comment= - -[DOWNGRADE_LIGHT_CLIENT_MSG] -Comment= - -[SETUP_FINISHED_MSG] -Comment= - -[TITLE_MAIN] -Comment= - -[SEVERE_DIALOG_TITLE] -Comment= - -[UPGRADE_CLIENT_MSG] -Comment= - -[PRODUCT_VERSION_MINOR] -Comment= - -[CONFIGURING_AFS_CLIENT_SERVICE] -Comment= - -[PRODUCT_NAME_CC] -Comment= - -[PRODUCT_NAME_SERVER] -Comment= - -[UPGRADE_CC_MSG] -Comment= - -[DOWNGRADE_SERVER_MSG] -Comment= - -[UNINST_DISPLAY_NAME_LIGHT_CLIENT] -Comment= - -[PRODUCT_NAME_LIGHT_CLIENT] -Comment= - -[ERROR_COMPONENT] -Comment= - -[COMPANY_NAME] -Comment= - -[REINSTALL_CLIENT_MSG] -Comment= - -[DOWNGRADE_CC_MSG] -Comment= - -[UNINST_DISPLAY_NAME_DOCS] -Comment= - -[UNINST_KEY_SERVER] -Comment= - -[VIEW_README_PROMPT_MSG] -Comment= - -[INSTALL_LIGHT_CLIENT_MSG] -Comment= - -[PRODUCT_VERSION_TITLE] -Comment= - -[UNINST_DISPLAY_NAME_CC] -Comment= - -[ERROR_FILEGROUP] -Comment= - -[ERROR_MOVEDATA] -Comment= - -[CONFIGURING_AFS_SERVER_SERVICE] -Comment= - -[CLIENT_DESC] -Comment= - -[SET_NETWORK_PROVIDER_ERROR] -Comment= - -[PRODUCT_VERSION_MAJOR] -Comment= - -[UNINST_DISPLAY_NAME_SERVER] -Comment= - -[SETUPUTILS_NOT_FOUND] -Comment= - -[LIGHT_CLIENT_ALREADY_INSTALLED_MSG] -Comment= - -[SETUP_TYPE_MSG] -Comment= - -[PRODUCT_KEY_SERVER] -Comment= - -[Language] -Lang0=0009 -CurrentLang=0 - -[INSTALL_SERVER_MSG] -Comment= - -[REINSTALL_LIGHT_CLIENT_MSG] -Comment= - -[PRODUCT_NAME_DOCS] -Comment= - -[PRODUCT_KEY_DOCS] -Comment= - -[TITLE_CAPTIONBAR] -Comment= - -[CONFIG_FILE_MAN_EXT_ERROR] -Comment= - -[CONFIGURING_AFS_CREDS_ERROR] -Comment= - -[UPGRADE_SERVER_MSG] -Comment= - -[PRODUCT_VERSION_RELEASE_TYPE] -Comment= - -[AFS_CLIENT_SERVICE_INSTALL_ERROR] -Comment= - -[CLIENT_TITLE] -Comment= - -[PRODUCT_KEY_CC] -Comment= - -[AFS_SERVER_SERVICE_INSTALL_ERROR] -Comment= - -[LIGHT_CLIENT_DESC] -Comment= - -[CLIENT_FILE_MAN_EXT_ENTRY_NAME] -Comment= - -[INSTALL_CC_MSG] -Comment= - -[REINSTALL_CC_MSG] -Comment= - -[PRODUCT_NAME_CLIENT] -Comment= - -[Data] -Entry0=ERROR_VGARESOLUTION -Entry1=TITLE_MAIN -Entry2=TITLE_CAPTIONBAR -Entry3=UNINST_KEY_SERVER -Entry4=UNINST_DISPLAY_NAME_SERVER -Entry5=COMPANY_NAME -Entry6=PRODUCT_NAME_SERVER -Entry7=PRODUCT_VERSION_MAJOR -Entry8=PRODUCT_KEY_SERVER -Entry9=ERROR_MOVEDATA -Entry10=ERROR_UNINSTSETUP -Entry11=ERROR_COMPONENT -Entry12=ERROR_FILEGROUP -Entry13=ERROR_FILE -Entry14=FOLDER_NAME -Entry15=DEFAULT_INSTALL_DIR -Entry16=PRODUCT_NAME_CLIENT -Entry17=PRODUCT_NAME_CC -Entry18=PRODUCT_VERSION_TITLE -Entry19=PRODUCT_VERSION_MINOR -Entry20=PRODUCT_KEY_CLIENT -Entry21=PRODUCT_KEY_CC -Entry22=UNINST_KEY_CLIENT -Entry23=UNINST_KEY_CC -Entry24=UNINST_DISPLAY_NAME_CLIENT -Entry25=UNINST_DISPLAY_NAME_CC -Entry26=PRODUCT_NAME -Entry27=SETUP_TYPE_MSG -Entry28=NOTHING_SELECTED_MSG -Entry29=SEVERE_DIALOG_TITLE -Entry30=VIEW_README_PROMPT_MSG -Entry31=SERVER_NEEDS_CLIENT_MSG -Entry32=AFS_SERVER_SERVICE_INSTALL_ERROR -Entry33=CONFIGURING_AFS_SERVER_SERVICE -Entry34=SETUPUTILS_NOT_FOUND -Entry35=ADD_PATH_ERROR -Entry36=CLIENT_DESC -Entry37=LIGHT_CLIENT_DESC -Entry38=PRODUCT_NAME_LIGHT_CLIENT -Entry39=PRODUCT_VERSION_PATCH_LEVEL -Entry40=PRODUCT_KEY_LIGHT_CLIENT -Entry41=UNINST_KEY_LIGHT_CLIENT -Entry42=UNINST_DISPLAY_NAME_LIGHT_CLIENT -Entry43=CLIENT_TITLE -Entry44=LIGHT_CLIENT_TITLE -Entry45=SET_NETWORK_PROVIDER_ERROR -Entry46=CONFIGURING_AFS_CLIENT_SERVICE -Entry47=AFS_CLIENT_SERVICE_INSTALL_ERROR -Entry48=CONFIG_FILE_MAN_EXT_ERROR -Entry49=CLIENT_FILE_MAN_EXT_ENTRY_NAME -Entry50=CONFIGURING_AFS_CREDS -Entry51=CONFIGURING_AFS_CREDS_ERROR -Entry52=CANT_INSTALL_BOTH_CLIENTS_MSG -Entry53=MUST_BE_AN_ADMIN_MSG -Entry54=PRODUCT_NAME_DOCS -Entry55=PRODUCT_VERSION_RELEASE_TYPE -Entry56=UNINST_DISPLAY_NAME_DOCS -Entry57=UNINST_KEY_DOCS -Entry58=INSTALL_CLIENT_MSG -Entry59=INSTALL_SERVER_MSG -Entry60=INSTALL_CC_MSG -Entry61=INSTALL_LIGHT_CLIENT_MSG -Entry62=UPGRADE_CLIENT_MSG -Entry63=UPGRADE_SERVER_MSG -Entry64=UPGRADE_CC_MSG -Entry65=UPGRADE_LIGHT_CLIENT_MSG -Entry66=REINSTALL_CLIENT_MSG -Entry67=REINSTALL_SERVER_MSG -Entry68=REINSTALL_CC_MSG -Entry69=REINSTALL_LIGHT_CLIENT_MSG -Entry70=DOWNGRADE_CLIENT_MSG -Entry71=DOWNGRADE_SERVER_MSG -Entry72=DOWNGRADE_CC_MSG -Entry73=DOWNGRADE_LIGHT_CLIENT_MSG -Entry74=WSPP_FOLDER_NAME -Entry75=DOWNGRADE_DOCS_MSG -Entry76=INSTALL_DOCS_MSG -Entry77=REINSTALL_DOCS_MSG -Entry78=UPGRADE_DOCS_MSG -Entry79=PRODUCT_KEY_DOCS -Entry80=SETUP_FINISHED_MSG -Entry81=LIGHT_CLIENT_ALREADY_INSTALLED_MSG -Entry82=REINSTALL_PREP_MSG -Entry83=UPGRADE_PREP_MSG -Entry84=DOWNGRADE_PREP_MSG -Entry85=NON_UPGRADABLE_SOFTWARE_INSTALLED_ERROR_MSG -Entry86=APPS_NOT_SAME_VERSION -Entry87=PRODUCT_VERSION_BETA_LEVEL -Entry88=STATUS_INSTALLING_CLIENT -Entry89=STATUS_INSTALLING_SERVER -Entry90=STATUS_INSTALLING_CCENTER -Entry91=STATUS_INSTALLING_LIGHT -Entry92=STATUS_INSTALLING_HEADERS -Entry93=STATUS_INSTALLING_DOCS -Entry94=STATUS_INSTALLING_LANGUAGE -Entry95=DOCUMENTATION_ITEM_NAME -Entry96=CFG_WIZARD_ITEM_NAME -Entry97=CREDS_TOOL_ITEM_NAME -Entry98=CLIENT_HELP_ITEM_NAME -Entry99=LIGHT_CLIENT_HELP_ITEM_NAME -Entry100=SERVER_MANAGER_ITEM_NAME -Entry101=ACCT_MANAGER_ITEM_NAME -Entry102=SERVER_GROUP_NAME -Entry103=CLIENT_GROUP_NAME -Entry104=CCENTER_GROUP_NAME -Entry105=LIGHT_GROUP_NAME -Entry106=CELLNAME_DEFAULT -Entry107=WELCOME_MESSAGE -Entry108=CELLSERVDB_WEB -Entry109=CELLSERVDB_INSTALL -Entry110=CELLSERVDB_CONFIGNAME - -[CONFIGURING_AFS_CREDS] -Comment= - -[DOWNGRADE_DOCS_MSG] -Comment= - -[INSTALL_DOCS_MSG] -Comment= - -[PRODUCT_KEY_LIGHT_CLIENT] -Comment= - -[FOLDER_NAME] -Comment= - -[ERROR_FILE] -Comment= - -[ERROR_VGARESOLUTION] -Comment= - -[REINSTALL_SERVER_MSG] -Comment= - -[DOWNGRADE_CLIENT_MSG] -Comment= - -[PRODUCT_VERSION_BETA_LEVEL] -Comment= - -[UNINST_KEY_CC] -Comment= - -[UNINST_KEY_CLIENT] -Comment= - -[UPGRADE_DOCS_MSG] -Comment= - -[DOWNGRADE_PREP_MSG] -Comment= - -[PRODUCT_VERSION_PATCH_LEVEL] -Comment= - -[NON_UPGRADABLE_SOFTWARE_INSTALLED_ERROR_MSG] -Comment= - -[UNINST_KEY_LIGHT_CLIENT] -Comment= - -[CANT_INSTALL_BOTH_CLIENTS_MSG] -Comment= - -[UPGRADE_LIGHT_CLIENT_MSG] -Comment= - -[UNINST_KEY_DOCS] -Comment= - -[UNINST_DISPLAY_NAME_CLIENT] -Comment= - -[General] -Type=STRINGTABLE -Version=1.00.000 - -[REINSTALL_DOCS_MSG] -Comment= - -[UPGRADE_PREP_MSG] -Comment= - -[MUST_BE_AN_ADMIN_MSG] -Comment= - -[LIGHT_CLIENT_TITLE] -Comment= - -[PRODUCT_NAME] -Comment= - -[PRODUCT_KEY_CLIENT] -Comment= - -[ERROR_UNINSTSETUP] -Comment= - -[ADD_PATH_ERROR] -Comment= - -[SERVER_NEEDS_CLIENT_MSG] -Comment= - -[INSTALL_CLIENT_MSG] -Comment= - -[WSPP_FOLDER_NAME] -Comment= - -[REINSTALL_PREP_MSG] -Comment= - -[APPS_NOT_SAME_VERSION] -Comment= - -[STATUS_INSTALLING_CLIENT] -Comment= - -[STATUS_INSTALLING_SERVER] -Comment= - -[STATUS_INSTALLING_CCENTER] -Comment= - -[STATUS_INSTALLING_LIGHT] -Comment= - -[STATUS_INSTALLING_HEADERS] -Comment= - -[STATUS_INSTALLING_DOCS] -Comment= - -[STATUS_INSTALLING_LANGUAGE] -Comment= - -[DOCUMENTATION_ITEM_NAME] -Comment= - -[CFG_WIZARD_ITEM_NAME] -Comment= - -[CREDS_TOOL_ITEM_NAME] -Comment= - -[CLIENT_HELP_ITEM_NAME] -Comment= - -[LIGHT_CLIENT_HELP_ITEM_NAME] -Comment= - -[SERVER_MANAGER_ITEM_NAME] -Comment= - -[ACCT_MANAGER_ITEM_NAME] -Comment= - -[SERVER_GROUP_NAME] -Comment= - -[CLIENT_GROUP_NAME] -Comment= - -[CCENTER_GROUP_NAME] -Comment= - -[LIGHT_GROUP_NAME] -Comment= - -[CELLNAME_DEFAULT] -Comment=Default Cell name - -[WELCOME_MESSAGE] -Comment=Display in Welcome Box - -[CELLSERVDB_WEB] -Comment=Web address to load cellservdb - -[CELLSERVDB_INSTALL] -Comment=Source file for installable Cellservdb - -[CELLSERVDB_CONFIGNAME] -Comment=Cellservdb file name - diff --git a/src/WINNT/install/InstallShield5/Default.txt b/src/WINNT/install/InstallShield5/Default.txt deleted file mode 100644 index 0ae6a45936..0000000000 --- a/src/WINNT/install/InstallShield5/Default.txt +++ /dev/null @@ -1,269 +0,0 @@ -[Client:HKCR:CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}\InprocServer32] -(Default)=S,\Client\Program\afs_shl_ext.dll ----Comment---= -ThreadingModel=S,Apartment - -[Client:HKCR:*\shellex\ContextMenuHandlers\AFS Client Shell Extension] -(Default)=S,{DC515C27-6CAC-11D1-BAE7-00C04FD140D2} ----Comment---= - -[WinNT_Client_NoUninstall:HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\File Manager\AddOns] -(Default)=S, ----Comment---= -AFS Client FME=S,\Client\Program\afs_fme.dll - -[Server] ----Comment---= ----FileGroup---= -HKLM0=Software\TransarcCorporation\AFS Server\CurrentVersion -HKLM1=System\CurrentControlSet\Services\EventLog\Application\AFS Service -HKLM2=Software\TransarcCorporation\AFS Server -HKLM3=Software\TransarcCorporation\AFS Server\%1.%2 %3.%4 - -[Server:HKLM:System\CurrentControlSet\Services\EventLog\Application\AFS Service] ----Comment---= -(Default)=S, -EventMessageFile=S, -TypesSupported=N,7 - -[Control_Center] ----Comment---= ----FileGroup---= -HKLM0=Software\TransarcCorporation\AFS Control Center\CurrentVersion -HKLM1=Software\TransarcCorporation\AFS Control Center -HKLM2=Software\TransarcCorporation\AFS Control Center\%1.%2 %3.%4 - -[Light_Client:HKLM:SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters] -(Default)=S, ----Comment---= -Gateway=S, - -[Client:HKLM:SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon] ----Comment---= -(Default)=S, - -[Client_NoUninstall] ----Comment---= ----FileGroup---= -HKLM0=SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved - -[Control_Center:HKLM:Software\TransarcCorporation\AFS Control Center] -(Default)=S, ----Comment---= - -[Client_NoUninstall:HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved] ----Comment---= -(Default)=S, -{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}=S,AFS Client Shell Extension - -[Server:HKLM:Software\TransarcCorporation\AFS Server\%1.%2 %3.%4] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Server -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S,AFS Server for Windows NT - -[Light_Client] ----Comment---= ----FileGroup---= -HKLM0=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters - -[Control_Center:HKLM:Software\TransarcCorporation\AFS Control Center\CurrentVersion] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Control Center -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S,AFS Control Center for Windows NT - -[Docs:HKLM:Software\TransarcCorporation\AFS Supplemental Documentation\%1.%2 %3.%4] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Documentation -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S,AFS System Administration Documentation - -[Full_Client:HKLM:SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters] -(Default)=S, ----Comment---= -IsGateway=N,0 - -[Docs] ----Comment---= ----FileGroup---= -HKLM0=Software\TransarcCorporation\AFS Supplemental Documentation\CurrentVersion -HKLM1=Software\TransarcCorporation\AFS Supplemental Documentation -HKLM2=Software\TransarcCorporation\AFS Supplemental Documentation\%1.%2 %3.%4 - -[Server:HKLM:Software\TransarcCorporation\AFS Server] -(Default)=S, ----Comment---= - -[Client] ----Comment---= ----FileGroup---= -HKLM0=Software\TransarcCorporation\AFS Client\CurrentVersion -HKLM1=Software\TransarcCorporation\AFS Client -HKLM2=Software\TransarcCorporation\AFS Client\%1.%2 %3.%4 -HKCR0=CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2} -HKLM3=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon -HKCR1=CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}\InprocServer32 -HKLM4=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters -HKCR2=*\shellex\ContextMenuHandlers\AFS Client Shell Extension -HKLM5=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider -HKCR3=FOLDER\shellex\ContextMenuHandlers\AFS Client Shell Extension - -[Data] -Set0=Server -Set1=Client -Set2=Control_Center -Set3=Client_NoUninstall -Set4=WinNT_Client_NoUninstall -Set5=Light_Client -Set6=Full_Client -Set7=Docs - -[Docs:HKLM:Software\TransarcCorporation\AFS Supplemental Documentation\CurrentVersion] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Documentation -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S,AFS System Administration Documentation - -[Full_Client] ----Comment---= ----FileGroup---= -HKLM0=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters - -[Client:HKLM:Software\TransarcCorporation\AFS Client\CurrentVersion] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -Title=S, -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Client -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S, - -[Client:HKLM:Software\TransarcCorporation\AFS Client] -(Default)=S, ----Comment---= - -[WinNT_Client_NoUninstall:HKLM:SOFTWARE\Microsoft\Windows NT\Current Version\File Manager\AddOns] ----Comment---= -(Default)=S, -AFS Client FME=S,\Client\Program\afs_fme.dll - -[Client:HKLM:SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider] ----Comment---= -(Default)=S, -Class=N,2 -LogonOptions=N,0 -Name=S,TransarcAFSDaemon -LogonScript=S,\Client\Program\afscreds.exe -:%s -x -ProviderPath=S, -AuthentProviderPath=S, - -[WinNT_Client_NoUninstall] ----Comment---= ----FileGroup---= -HKLM0=SOFTWARE\Microsoft\Windows NT\CurrentVersion\File Manager\AddOns - -[Client:HKCR:FOLDER\shellex\ContextMenuHandlers\AFS Client Shell Extension] -(Default)=S,{DC515C27-6CAC-11D1-BAE7-00C04FD140D2} ----Comment---= - -[General] -Type=REGISTRYDATA -Version=1.00.000 - -[Client:HKLM:Software\TransarcCorporation\AFS Client\%1.%2 %3.%4] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -Title=S, -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Client -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S, - -[Server:HKLM:Software\TransarcCorporation\AFS Server\CurrentVersion] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Server -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S,AFS Server for Windows NT - -[Control_Center:HKLM:Software\TransarcCorporation\AFS Control Center\%1.%2 %3.%4] -Revision=N,0 -PatchLevel=N,%3%4 -(Default)=S, ----Comment---= -MajorVersion=N,%1 -InstallDateString=S, -PathName=S,\Control Center -BetaLevel=N,1 -Software Type=S,File System -MinorVersion=N,%2 -ReleaseType=S, -VersionString=S,%5 -Description=S,AFS Control Center for Windows NT - -[Docs:HKLM:Software\TransarcCorporation\AFS Supplemental Documentation] -(Default)=S, ----Comment---= - -[Client:HKCR:CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}] -(Default)=S,AFS Client Shell Extension ----Comment---= diff --git a/src/WINNT/install/InstallShield5/DelISDirTree.bat b/src/WINNT/install/InstallShield5/DelISDirTree.bat deleted file mode 100644 index e282466007..0000000000 --- a/src/WINNT/install/InstallShield5/DelISDirTree.bat +++ /dev/null @@ -1,162 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file deletes the IS5 dir tree. First it will delete all the files we -rem know about. Then it will delete the IS5 dirs. For dirs that contain -rem output files that we don't care about, we deltree them. For all other dirs -rem we use rmdir, and if IS5 added some file to one of those dirs, it will fail -rem to delete. We can then look at the dir and see if the file needs to be added -rem to CML. - -rem First delete all the files we know about. - -del "Component Definitions\Default.cdf" -del "Component Definitions\Default.fgl" -del "File Groups\Default.fdf" -del "File Groups\GenFileGroups.bat" -del "File Groups\Server_Program_Files.fgl" -del "File Groups\Server_Common_Files.fgl" -del "File Groups\Server_WinDir_Files.fgl" -del "File Groups\Server_System32_Files.fgl" -del "File Groups\Client_Program_Files.fgl" -del "File Groups\Client_Common_Files.fgl" -del "File Groups\Client_WinDir_Files.fgl" -del "File Groups\Client_System32_Files.fgl" -del "File Groups\Client_Afs_Header_Files.fgl" -del "File Groups\Client_Rx_Header_Files.fgl" -del "File Groups\Client_Main_Header_Files.fgl" -del "File Groups\Client_Sample_Files.fgl" -del "File Groups\Light_Client_Program_Files.fgl" -del "File Groups\Light_Client_Common_Files.fgl" -del "File Groups\Light_Client_WinDir_Files.fgl" -del "File Groups\Light_Client_System32_Files.fgl" -del "File Groups\Light95_Client_Program_Files.fgl" -del "File Groups\Light95_Client_Common_Files.fgl" -del "File Groups\Light95_Client_WinDir_Files.fgl" -del "File Groups\Light95_Client_System32_Files.fgl" -del "File Groups\Control_Center_Program_Files.fgl" -del "File Groups\Control_Center_Common_Files.fgl" -del "File Groups\Control_Center_WinDir_Files.fgl" -del "File Groups\Control_Center_System32_Files.fgl" -del "File Groups\Cmd_Ref_English_Files.fgl" -del "File Groups\Install_Guide_English_Files.fgl" -del "File Groups\Release_Notes_English_Files.fgl" -del "File Groups\Sys_Admin_Guide_English_Files.fgl" -del "File Groups\Cmd_Ref_Japanese_Files.fgl" -del "File Groups\Install_Guide_Japanese_Files.fgl" -del "File Groups\Release_Notes_Japanese_Files.fgl" -del "File Groups\Sys_Admin_Guide_Japanese_Files.fgl" -del "File Groups\Cmd_Ref_Korean_Files.fgl" -del "File Groups\Install_Guide_Korean_Files.fgl" -del "File Groups\Release_Notes_Korean_Files.fgl" -del "File Groups\Sys_Admin_Guide_Korean_Files.fgl" -del "File Groups\Cmd_Ref_Trad_Chinese_Files.fgl" -del "File Groups\Install_Guide_Trad_Chinese_Files.fgl" -del "File Groups\Release_Notes_Trad_Chinese_Files.fgl" -del "File Groups\Sys_Admin_Guide_Trad_Chinese_Files.fgl" -del "File Groups\Cmd_Ref_Simp_Chinese_Files.fgl" -del "File Groups\Install_Guide_Simp_Chinese_Files.fgl" -del "File Groups\Release_Notes_Simp_Chinese_Files.fgl" -del "File Groups\Sys_Admin_Guide_Simp_Chinese_Files.fgl" -del "File Groups\Doc_Misc_English_Files.fgl" -del "File Groups\Doc_Misc_Japanese_Files.fgl" -del "File Groups\Doc_Misc_Korean_Files.fgl" -del "File Groups\Doc_Misc_Trad_Chinese_Files.fgl" -del "File Groups\Doc_Misc_Simp_Chinese_Files.fgl" -del "File Groups\Doc_Files.fgl" -del "File Groups\Lang_English_Files.fgl" -del "File Groups\Lang_Simp_Chinese_Files.fgl" -del "File Groups\Lang_Trad_Chinese_Files.fgl" -del "File Groups\Lang_Korean_Files.fgl" -del "File Groups\Lang_Japanese_Files.fgl" -del "Media\Transarc AFS\GenDefault.mda.bat" -del "Registry Entries\Default.rge" -del "Script Files\setup.rul" -del "Setup Files\Uncompressed Files\Language Independent\OS Independent\setup.bmp" -del "Setup Files\Compressed Files\Language Independent\OS Independent\InstallUtils.dll" -del "Setup Files\Compressed Files\Language Independent\OS Independent\afs_setup_utils_*.dll" -del "Shell Objects\Default.shl" -del "String Tables\Default.shl" -del "String Tables\0009-English\value.shl" -del "String Tables\0011-Japanese\value.shl" -del "String Tables\0012-Korean\value.shl" -del "String Tables\0404-Chinese (Taiwan)\value.shl" -del "String Tables\0804-Chinese (PRC)\value.shl" -del "String Tables\0007-German\value.shl" -del "String Tables\0416-Portuguese (Brazilian)\value.shl" -del "String Tables\000a-Spanish\value.shl" -del "Text Substitutions\Build.tsb" -del "Text Substitutions\Setup.tsb" -del "File Groups\Cmd_Ref_German_Files.fgl" -del "File Groups\Install_Guide_German_Files.fgl" -del "File Groups\Release_Notes_German_Files.fgl" -del "File Groups\Sys_Admin_Guide_German_Files.fgl" -del "File Groups\Doc_Misc_German_Files.fgl" -del "File Groups\Lang_German_Files.fgl" -del "File Groups\Cmd_Ref_Spanish_Files.fgl" -del "File Groups\Install_Guide_Spanish_Files.fgl" -del "File Groups\Release_Notes_Spanish_Files.fgl" -del "File Groups\Sys_Admin_Guide_Spanish_Files.fgl" -del "File Groups\Doc_Misc_Spanish_Files.fgl" -del "File Groups\Lang_Spanish_Files.fgl" -del "File Groups\Cmd_Ref_Portuguese_Files.fgl" -del "File Groups\Install_Guide_Portuguese_Files.fgl" -del "File Groups\Release_Notes_Portuguese_Files.fgl" -del "File Groups\Sys_Admin_Guide_Portuguese_Files.fgl" -del "File Groups\Doc_Misc_Portuguese_Files.fgl" -del "File Groups\Lang_Portuguese_Files.fgl" -del InstallShield5.ipr - - -rem Now delete the directories. - -rmdir /s /q "Setup Files\Compressed Files\0009-English" -rmdir /s /q "Setup Files\Compressed Files\0011-Japanese" -rmdir /s /q "Setup Files\Compressed Files\0012-Korean" -rmdir /s /q "Setup Files\Compressed Files\0404-Chinese (Taiwan)" -rmdir /s /q "Setup Files\Compressed Files\0804-Chinese (PRC)" -rmdir /s /q "Setup Files\Compressed Files\0007-German" -rmdir /s /q "Setup Files\Compressed Files\0416-Portuguese (Brazilian)" -rmdir /s /q "Setup Files\Compressed Files\000a-Spanish" - -rmdir /s /q "Setup Files\Uncompressed Files\0009-English" -rmdir /s /q "Setup Files\Uncompressed Files\0011-Japanese" -rmdir /s /q "Setup Files\Uncompressed Files\0012-Korean" -rmdir /s /q "Setup Files\Uncompressed Files\0404-Chinese (Taiwan)" -rmdir /s /q "Setup Files\Uncompressed Files\0804-Chinese (PRC)" -rmdir /s /q "Setup Files\Uncompressed Files\0007-German" -rmdir /s /q "Setup Files\Uncompressed Files\0416-Portuguese (Brazilian)" -rmdir /s /q "Setup Files\Uncompressed Files\000a-Spanish" - -rmdir "Component Definitions" -rmdir "File Groups" -rmdir /s /q "Media\Transarc AFS" -rmdir Media -rmdir "Registry Entries" -rmdir /s /q "Script Files" -rmdir "Setup Files\Uncompressed Files\Language Independent\OS Independent" -rmdir "Setup Files\Uncompressed Files\Language Independent" -rmdir "Setup Files\Uncompressed Files" -rmdir "Setup Files\Compressed Files\Language Independent\OS Independent" -rmdir "Setup Files\Compressed Files\Language Independent" -rmdir "Setup Files\Compressed Files" -rmdir "Setup Files" -rmdir "Shell Objects" -rmdir "String Tables\0009-English" -rmdir "String Tables\0011-Japanese" -rmdir "String Tables\0012-Korean" -rmdir "String Tables\0404-Chinese (Taiwan)" -rmdir "String Tables\0804-Chinese (PRC)" -rmdir "String Tables\0007-German" -rmdir "String Tables\0416-Portuguese (Brazilian)" -rmdir "String Tables\000a-Spanish" -rmdir "String Tables" -rmdir "Text Substitutions" - - - diff --git a/src/WINNT/install/InstallShield5/GatherFiles.bat b/src/WINNT/install/InstallShield5/GatherFiles.bat deleted file mode 100644 index 1c3bd5634b..0000000000 --- a/src/WINNT/install/InstallShield5/GatherFiles.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file copies the IS5 files from the IS5 dirs to the CMl dir. - - -copy "Component Definitions\Default.cdf" . -copy "Component Definitions\Default.fgl" . - -copy "File Groups\Default.fdf" . -copy "File Groups\GenFileGroups.bat" . - -copy "Media\OpenAFS\GenDefault.mda.bat" . - -copy "Registry Entries\Default.rge" . - -copy "Script Files\setup.rul" . - -copy "Setup Files\Uncompressed Files\Language Independent\OS Independent\setup.bmp" . - - -copy "Setup Files\Uncompressed Files\Language Independent\OS Independent\_isuser.dll" . - -copy "Shell Objects\Default.shl" .\Default.shell - -copy "String Tables\Default.shl" . - -copy "String Tables\0009-English\value.shl" lang\en_US -copy "String Tables\0011-Japanese\value.shl" lang\ja_JP -copy "String Tables\0012-Korean\value.shl" lang\ko_KR -copy "String Tables\0404-Chinese (Taiwan)\value.shl" lang\zh_TW -copy "String Tables\0804-Chinese (PRC)\value.shl" lang\zh_CN -copy "String Tables\0007-German\value.shl" lang\de_DE -copy "String Tables\0416-Portuguese (Brazilian)\value.shl" lang\pt_BR -copy "String Tables\000a-Spanish\value.shl" lang\es_ES - -copy "Text Substitutions\Build.tsb" . -copy "Text Substitutions\Setup.tsb" . - diff --git a/src/WINNT/install/InstallShield5/GenDefault.mda.bat b/src/WINNT/install/InstallShield5/GenDefault.mda.bat deleted file mode 100644 index 9f4db547b3..0000000000 --- a/src/WINNT/install/InstallShield5/GenDefault.mda.bat +++ /dev/null @@ -1,66 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem -------------- default.mda -------------------------------------------- - -echo [Platforms] > default.mda -echo key0=0000000000010000 >> default.mda -echo count=1 >> default.mda -echo. >> default.mda -echo [Filter] >> default.mda -echo LANGUAGEDEFAULT=0009 >> default.mda -echo. >> default.mda -echo [GeneralInfo] >> default.mda -echo MEDIATYPE=CDROM >> default.mda -echo DATAASFILES=No >> default.mda -echo BUILDTYPE=Full >> default.mda -echo BuildLocation=Media\OpenAFS >> default.mda -echo BREAKBYTOPCOMPONENT=No >> default.mda -echo REFRESH_DATAFILES=Yes >> default.mda -echo REFRESH_SPLASH=Yes >> default.mda -echo BUILDSIZE= >> default.mda -echo Name=OpenAFS for Windows >> default.mda -echo REVIEWREPORT=No >> default.mda -echo REFRESH_IFILES=Yes >> default.mda -echo PASSWORD= >> default.mda -echo. >> default.mda -echo [SetupInfo] >> default.mda -echo ENABLELANGDLG=Yes >> default.mda -echo ALTERNATEISDELETENAME= >> default.mda -echo APPLICATIONNAME=OpenAFS for Windows >> default.mda -echo HIDESTATUSBAR=No >> default.mda -echo WIN32SENABLE=No >> default.mda -echo. >> default.mda -echo [InstallDateInfo] >> default.mda -echo TYPE=BUILDTIME >> default.mda -echo TIME= >> default.mda -echo DATE= >> default.mda -echo. >> default.mda -echo [FileInstallDateInfo] >> default.mda -echo TYPE=ORIGINAL >> default.mda -echo TIME= >> default.mda -echo DATE= >> default.mda -echo. >> default.mda -echo [Languages] >> default.mda -echo key0=0009 >> default.mda -echo key1=0416 >> default.mda -echo key2=0804 >> default.mda -echo key3=0404 >> default.mda -echo key4=0007 >> default.mda -echo key5=0011 >> default.mda -echo key6=0012 >> default.mda -echo key7=000a >> default.mda -echo count=8 >> default.mda -echo. >> default.mda -echo [TagFileInfo] >> default.mda -echo PRODUCTCATEGORY=System Tool >> default.mda -echo APPLICATIONNAME=OpenAFS for Windows >> default.mda -echo COMPANYNAME=OpenAFS >> default.mda -echo VERSION=1.00.000 >> default.mda -echo INFO=http://www.openafs.org >> default.mda - diff --git a/src/WINNT/install/InstallShield5/GenFileGroups.bat b/src/WINNT/install/InstallShield5/GenFileGroups.bat deleted file mode 100644 index 59d6a648ed..0000000000 --- a/src/WINNT/install/InstallShield5/GenFileGroups.bat +++ /dev/null @@ -1,1418 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -set IS5_DEST=%AFSROOT%\DEST -set IS5_WINNT=%AFSROOT%\src\WINNT -set IS5_HELP=%AFSROOT%\src\WINNT\doc\help -set IS5_INCL=%AFSROOT%\DEST\include -set IS5_DOCROOT=%AFSROOT%\src\WINNT\doc - -rem -------------- Client_Program_Files.fgl ---------------------------- - -echo [TopDir] > Client_Program_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afsshare.exe >> Client_Program_Files.fgl -echo file1=%IS5_DEST%\include\afs\cm_config.h >> Client_Program_Files.fgl -echo file2=%IS5_DEST%\root.client\usr\vice\etc\libosi.dll >> Client_Program_Files.fgl -echo file3=%IS5_DEST%\include\afs\kautils.h >> Client_Program_Files.fgl -echo file4=%IS5_DEST%\root.client\usr\vice\etc\libafsconf.dll >> Client_Program_Files.fgl -echo file5=%IS5_DEST%\root.client\usr\vice\etc\klog.exe >> Client_Program_Files.fgl -echo file6=%IS5_DEST%\root.client\usr\vice\etc\tokens.exe >> Client_Program_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\unlog.exe >> Client_Program_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\fs.exe >> Client_Program_Files.fgl -echo file9=%IS5_DEST%\lib\libafsconf.lib >> Client_Program_Files.fgl -echo file10=%IS5_DEST%\lib\afsauthent.lib >> Client_Program_Files.fgl -echo file11=%IS5_DEST%\root.client\usr\vice\etc\afscreds.exe >> Client_Program_Files.fgl -echo file12=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext.dll >> Client_Program_Files.fgl -echo file13=%IS5_DEST%\include\afs\auth.h >> Client_Program_Files.fgl -echo file14=%IS5_DEST%\root.client\usr\vice\etc\afsd_service.exe >> Client_Program_Files.fgl -echo file15=%IS5_DEST%\root.client\usr\vice\etc\afslogon.dll >> Client_Program_Files.fgl -echo file16=%IS5_DEST%\root.client\usr\vice\etc\symlink.exe >> Client_Program_Files.fgl -echo file17=%IS5_DEST%\bin\kpasswd.exe >> Client_Program_Files.fgl -echo file18=%IS5_DEST%\root.server\usr\afs\bin\pts.exe >> Client_Program_Files.fgl -echo file19=%IS5_DEST%\root.server\usr\afs\bin\bos.exe >> Client_Program_Files.fgl -echo file20=%IS5_DEST%\root.server\usr\afs\bin\kas.exe >> Client_Program_Files.fgl -echo file21=%IS5_DEST%\root.server\usr\afs\bin\vos.exe >> Client_Program_Files.fgl -echo file22=%IS5_DEST%\root.server\usr\afs\bin\udebug.exe >> Client_Program_Files.fgl -echo file23=%IS5_DEST%\bin\translate_et.exe >> Client_Program_Files.fgl -echo file24=%IS5_DEST%\etc\rxdebug.exe >> Client_Program_Files.fgl -echo file25=%IS5_DEST%\etc\backup.exe >> Client_Program_Files.fgl -echo file26=%IS5_DEST%\root.server\usr\afs\bin\ClientUninst.dll >> Client_Program_Files.fgl -echo. >> Client_Program_Files.fgl -echo [General] >> Client_Program_Files.fgl -echo Type=FILELIST >> Client_Program_Files.fgl -echo Version=1.00.000 >> Client_Program_Files.fgl - - -rem -------------- Client_Common_Files.fgl ----------------------------- - -echo [TopDir] > Client_Common_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_config.exe >> Client_Common_Files.fgl -echo file1=%IS5_DEST%\lib\afsrpc.dll >> Client_Common_Files.fgl -echo file2=%IS5_DEST%\lib\afsauthent.dll >> Client_Common_Files.fgl -echo file3=%IS5_DEST%\lib\afspthread.dll >> Client_Common_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\afsprocmgmt.dll >> Client_Common_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib.dll >> Client_Common_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\afsadminutil.dll >> Client_Common_Files.fgl -echo file7=%IS5_DEST%\root.server\usr\afs\bin\afsclientadmin.dll >> Client_Common_Files.fgl -echo file8=%IS5_DEST%\root.server\usr\afs\bin\afsvosadmin.dll >> Client_Common_Files.fgl -echo. >> Client_Common_Files.fgl -echo [General] >> Client_Common_Files.fgl -echo Type=FILELIST >> Client_Common_Files.fgl -echo Version=1.00.000 >> Client_Common_Files.fgl - - -rem -------------- Client_WinDir_Files.fgl ----------------------------- - -echo [TopDir] > Client_WinDir_Files.fgl -rem echo file0=%IS5_DEST%\root.client\usr\vice\etc\afsdcell.ini >> Client_WinDir_Files.fgl -echo. >> Client_WinDir_Files.fgl -echo [General] >> Client_WinDir_Files.fgl -echo Type=FILELIST >> Client_WinDir_Files.fgl -echo Version=1.00.000 >> Client_WinDir_Files.fgl - - -rem -------------- Client_System32_Files.fgl --------------------------- - -echo [TopDir] > Client_System32_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Client_System32_Files.fgl -echo file1=%MSVCDIR%\REDIST\Msvcrt.dll >> Client_System32_Files.fgl -echo file2=%MSVCDIR%\REDIST\Mfc42.dll >> Client_System32_Files.fgl -echo. >> Client_System32_Files.fgl -echo [General] >> Client_System32_Files.fgl -echo Type=FILELIST >> Client_System32_Files.fgl -echo Version=1.00.000 >> Client_System32_Files.fgl - - -rem -------------- Light_Client_Program_Files.fgl ---------------------- - -echo [TopDir] > Light_Client_Program_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afsshare.exe >> Light_Client_Program_Files.fgl -echo file1=%IS5_DEST%\include\afs\cm_config.h >> Light_Client_Program_Files.fgl -echo file2=%IS5_DEST%\root.client\usr\vice\etc\libosi.dll >> Light_Client_Program_Files.fgl -echo file3=%IS5_DEST%\include\afs\kautils.h >> Light_Client_Program_Files.fgl -echo file4=%IS5_DEST%\root.client\usr\vice\etc\libafsconf.dll >> Light_Client_Program_Files.fgl -echo file5=%IS5_DEST%\root.client\usr\vice\etc\klog.exe >> Light_Client_Program_Files.fgl -echo file6=%IS5_DEST%\root.client\usr\vice\etc\tokens.exe >> Light_Client_Program_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\unlog.exe >> Light_Client_Program_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\fs.exe >> Light_Client_Program_Files.fgl -echo file9=%IS5_DEST%\lib\libafsconf.lib >> Light_Client_Program_Files.fgl -echo file10=%IS5_DEST%\lib\afsauthent.lib >> Light_Client_Program_Files.fgl -echo file11=%IS5_DEST%\root.client\usr\vice\etc\afscreds.exe >> Light_Client_Program_Files.fgl -echo file12=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext.dll >> Light_Client_Program_Files.fgl -echo file13=%IS5_DEST%\root.client\usr\vice\etc\unlog.exe >> Light_Client_Program_Files.fgl -echo file14=%IS5_DEST%\include\afs\auth.h >> Light_Client_Program_Files.fgl -echo file15=%IS5_DEST%\root.client\usr\vice\etc\afslog95.dll >> Light_Client_Program_Files.fgl -echo file16=%IS5_DEST%\root.client\usr\vice\etc\symlink.exe >> Light_Client_Program_Files.fgl -echo file17=%IS5_DEST%\bin\kpasswd.exe >> Light_Client_Program_Files.fgl -echo file18=%IS5_DEST%\root.server\usr\afs\bin\pts.exe >> Light_Client_Program_Files.fgl -echo file19=%IS5_DEST%\root.server\usr\afs\bin\bos.exe >> Light_Client_Program_Files.fgl -echo file20=%IS5_DEST%\root.server\usr\afs\bin\kas.exe >> Light_Client_Program_Files.fgl -echo file21=%IS5_DEST%\root.server\usr\afs\bin\vos.exe >> Light_Client_Program_Files.fgl -echo file22=%IS5_DEST%\root.server\usr\afs\bin\udebug.exe >> Light_Client_Program_Files.fgl -echo file23=%IS5_DEST%\bin\translate_et.exe >> Light_Client_Program_Files.fgl -echo file24=%IS5_DEST%\etc\rxdebug.exe >> Light_Client_Program_Files.fgl -echo file25=%IS5_DEST%\etc\backup.exe >> Light_Client_Program_Files.fgl -echo file26=%IS5_DEST%\root.server\usr\afs\bin\LightClientUninst.dll >> Light_Client_Program_Files.fgl -echo. >> Light_Client_Program_Files.fgl -echo [General] >> Light_Client_Program_Files.fgl -echo Type=FILELIST >> Light_Client_Program_Files.fgl -echo Version=1.00.000 >> Light_Client_Program_Files.fgl - - -rem -------------- Light_Client_Common_Files.fgl ----------------------- - -echo [TopDir] > Light_Client_Common_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_config.exe >> Light_Client_Common_Files.fgl -echo file1=%IS5_DEST%\lib\afsrpc.dll >> Light_Client_Common_Files.fgl -echo file2=%IS5_DEST%\lib\afsauthent.dll >> Light_Client_Common_Files.fgl -echo file3=%IS5_DEST%\lib\afspthread.dll >> Light_Client_Common_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\afsprocmgmt.dll >> Light_Client_Common_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib.dll >> Light_Client_Common_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\afsadminutil.dll >> Light_Client_Common_Files.fgl -echo file7=%IS5_DEST%\root.server\usr\afs\bin\afsclientadmin.dll >> Light_Client_Common_Files.fgl -echo file8=%IS5_DEST%\root.server\usr\afs\bin\afsvosadmin.dll >> Light_Client_Common_Files.fgl -echo. >> Light_Client_Common_Files.fgl -echo [General] >> Light_Client_Common_Files.fgl -echo Type=FILELIST >> Light_Client_Common_Files.fgl -echo Version=1.00.000 >> Light_Client_Common_Files.fgl - - -rem -------------- Light_Client_WinDir_Files.fgl ----------------------- - -echo [TopDir] > Light_Client_WinDir_Files.fgl -rem echo file0=%IS5_DEST%\root.client\usr\vice\etc\afsdcell.ini >> Light_Client_WinDir_Files.fgl -echo. >> Light_Client_WinDir_Files.fgl -echo [General] >> Light_Client_WinDir_Files.fgl -echo Type=FILELIST >> Light_Client_WinDir_Files.fgl -echo Version=1.00.000 >> Light_Client_WinDir_Files.fgl - - -rem -------------- Light_Client_System32_Files.fgl --------------------- - -echo [TopDir] > Light_Client_System32_Files.fgl -echo file0=%MSVCDIR%\REDIST\Msvcrt.dll >> Light_Client_System32_Files.fgl -echo file1=%MSVCDIR%\REDIST\Mfc42.dll >> Light_Client_System32_Files.fgl -echo file2=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Light_Client_System32_Files.fgl -echo. >> Light_Client_System32_Files.fgl -echo [General] >> Light_Client_System32_Files.fgl -echo Type=FILELIST >> Light_Client_System32_Files.fgl -echo Version=1.00.000 >> Light_Client_System32_Files.fgl - - -rem -------------- Light95_Client_Program_Files.fgl ---------------------- - -echo [TopDir] > Light95_Client_Program_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\libosi.dll >> Light95_Client_Program_Files.fgl -echo file1=%IS5_DEST%\root.client\usr\vice\etc\libafsconf.dll >> Light95_Client_Program_Files.fgl -echo file2=%IS5_DEST%\root.client\usr\vice\etc\fs.exe >> Light95_Client_Program_Files.fgl -echo file3=%IS5_DEST%\root.client\usr\vice\etc\afscreds.exe >> Light95_Client_Program_Files.fgl -echo file4=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext.dll >> Light95_Client_Program_Files.fgl -echo file5=%IS5_DEST%\root.client\usr\vice\etc\afslog95.dll >> Light95_Client_Program_Files.fgl -echo file6=%IS5_DEST%\root.client\usr\vice\etc\symlink.exe >> Light95_Client_Program_Files.fgl -echo file7=%IS5_DEST%\root.server\usr\afs\bin\LightClientUninst.dll >> Light95_Client_Program_Files.fgl -echo file8=%IS5_DEST%\bin\kpasswd.exe >> Light95_Client_Program_Files.fgl -echo. >> Light95_Client_Program_Files.fgl -echo [General] >> Light95_Client_Program_Files.fgl -echo Type=FILELIST >> Light95_Client_Program_Files.fgl -echo Version=1.00.000 >> Light95_Client_Program_Files.fgl - - -rem -------------- Light95_Client_Common_Files.fgl ----------------------- - -echo [TopDir] > Light95_Client_Common_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_config.exe >> Light95_Client_Common_Files.fgl -echo file1=%IS5_DEST%\lib\afsrpc.dll >> Light95_Client_Common_Files.fgl -echo file2=%IS5_DEST%\lib\afsauthent.dll >> Light95_Client_Common_Files.fgl -echo file3=%IS5_DEST%\lib\win95\afspthread.dll >> Light95_Client_Common_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib.dll >> Light95_Client_Common_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\afsadminutil.dll >> Light95_Client_Common_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\afsclientadmin.dll >> Light95_Client_Common_Files.fgl -echo. >> Light95_Client_Common_Files.fgl -echo [General] >> Light95_Client_Common_Files.fgl -echo Type=FILELIST >> Light95_Client_Common_Files.fgl -echo Version=1.00.000 >> Light95_Client_Common_Files.fgl - - -rem -------------- Light95_Client_WinDir_Files.fgl ----------------------- - -echo [TopDir] > Light95_Client_WinDir_Files.fgl -rem echo file0=%IS5_DEST%\root.client\usr\vice\etc\afsdcell.ini >> Light95_Client_WinDir_Files.fgl -echo. >> Light95_Client_WinDir_Files.fgl -echo [General] >> Light95_Client_WinDir_Files.fgl -echo Type=FILELIST >> Light95_Client_WinDir_Files.fgl -echo Version=1.00.000 >> Light95_Client_WinDir_Files.fgl - - -rem -------------- Light95_Client_System32_Files.fgl --------------------- - -echo [TopDir] > Light95_Client_System32_Files.fgl -echo file0=%MSVCDIR%\REDIST\Msvcrt.dll >> Light95_Client_System32_Files.fgl -echo file1=%MSVCDIR%\REDIST\Mfc42.dll >> Light95_Client_System32_Files.fgl -echo file2=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Light95_Client_System32_Files.fgl -echo. >> Light95_Client_System32_Files.fgl -echo [General] >> Light95_Client_System32_Files.fgl -echo Type=FILELIST >> Light95_Client_System32_Files.fgl -echo Version=1.00.000 >> Light95_Client_System32_Files.fgl - - -rem -------------- Server_Program_Files.fgl ---------------------------- - -echo [TopDir] > Server_Program_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\vlserver.exe >> Server_Program_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\volinfo.exe >> Server_Program_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\volserver.exe >> Server_Program_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afskill.exe >> Server_Program_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg.exe >> Server_Program_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\bosctlsvc.exe >> Server_Program_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\bosserver.exe >> Server_Program_Files.fgl -echo file7=%IS5_DEST%\root.server\usr\afs\bin\buserver.exe >> Server_Program_Files.fgl -echo file8=%IS5_DEST%\root.server\usr\afs\bin\fileserver.exe >> Server_Program_Files.fgl -echo file9=%IS5_DEST%\etc\fms.exe >> Server_Program_Files.fgl -echo file10=%IS5_DEST%\etc\butc.exe >> Server_Program_Files.fgl -echo file11=%IS5_DEST%\root.server\usr\afs\bin\kaserver.exe >> Server_Program_Files.fgl -echo file12=%IS5_DEST%\root.server\usr\afs\bin\ptserver.exe >> Server_Program_Files.fgl -echo file13=%IS5_DEST%\root.server\usr\afs\bin\salvager.exe >> Server_Program_Files.fgl -echo file14=%IS5_DEST%\root.server\usr\afs\bin\upclient.exe >> Server_Program_Files.fgl -echo file15=%IS5_DEST%\root.server\usr\afs\bin\upserver.exe >> Server_Program_Files.fgl -echo file16=%IS5_DEST%\root.server\usr\afs\bin\ServerUninst.dll >> Server_Program_Files.fgl -echo. >> Server_Program_Files.fgl -echo [General] >> Server_Program_Files.fgl -echo Type=FILELIST >> Server_Program_Files.fgl -echo Version=1.00.000 >> Server_Program_Files.fgl - - -rem -------------- Server_Common_Files.fgl ----------------------------- - -echo [TopDir] > Server_Common_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afsbosadmin.dll >> Server_Common_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afscfgadmin.dll >> Server_Common_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsclientadmin.dll >> Server_Common_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afskasadmin.dll >> Server_Common_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\afsptsadmin.dll >> Server_Common_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\afsvosadmin.dll >> Server_Common_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\afsadminutil.dll >> Server_Common_Files.fgl -echo file7=%IS5_DEST%\lib\afsrpc.dll >> Server_Common_Files.fgl -echo file8=%IS5_DEST%\lib\afsauthent.dll >> Server_Common_Files.fgl -echo file9=%IS5_DEST%\lib\afspthread.dll >> Server_Common_Files.fgl -echo file10=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib.dll >> Server_Common_Files.fgl -echo file11=%IS5_DEST%\root.server\usr\afs\bin\afsprocmgmt.dll >> Server_Common_Files.fgl -echo. >> Server_Common_Files.fgl -echo [General] >> Server_Common_Files.fgl -echo Type=FILELIST >> Server_Common_Files.fgl -echo Version=1.00.000 >> Server_Common_Files.fgl - - -rem -------------- Server_WinDir_Files.fgl ----------------------------- - -echo [TopDir] > Server_WinDir_Files.fgl -echo. >> Server_WinDir_Files.fgl -echo [General] >> Server_WinDir_Files.fgl -echo Type=FILELIST >> Server_WinDir_Files.fgl -echo Version=1.00.000 >> Server_WinDir_Files.fgl - - -rem -------------- Server_System32_Files.fgl --------------------------- - -echo [TopDir] > Server_System32_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afsserver.cpl >> Server_System32_Files.fgl -echo file1=%MSVCDIR%\REDIST\Msvcrt.dll >> Server_System32_Files.fgl -echo. >> Server_System32_Files.fgl -echo [General] >> Server_System32_Files.fgl -echo Type=FILELIST >> Server_System32_Files.fgl -echo Version=1.00.000 >> Server_System32_Files.fgl - - -rem -------------- Control_Center_Program_Files.fgl -------------------- - -echo [TopDir] > Control_Center_Program_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager.exe >> Control_Center_Program_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAdmSvr.exe >> Control_Center_Program_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager.exe >> Control_Center_Program_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\CCUninst.dll >> Control_Center_Program_Files.fgl -echo. >> Control_Center_Program_Files.fgl -echo [General] >> Control_Center_Program_Files.fgl -echo Type=FILELIST >> Control_Center_Program_Files.fgl -echo Version=1.00.000 >> Control_Center_Program_Files.fgl - - -rem -------------- Control_Center_Common_Files.fgl --------------------- - -echo [TopDir] > Control_Center_Common_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afsbosadmin.dll >> Control_Center_Common_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afscfgadmin.dll >> Control_Center_Common_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsclientadmin.dll >> Control_Center_Common_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afskasadmin.dll >> Control_Center_Common_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\afsptsadmin.dll >> Control_Center_Common_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\afsvosadmin.dll >> Control_Center_Common_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\afsadminutil.dll >> Control_Center_Common_Files.fgl -echo file7=%IS5_DEST%\lib\afsrpc.dll >> Control_Center_Common_Files.fgl -echo file8=%IS5_DEST%\lib\afsauthent.dll >> Control_Center_Common_Files.fgl -echo file9=%IS5_DEST%\lib\afspthread.dll >> Control_Center_Common_Files.fgl -echo file10=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib.dll >> Control_Center_Common_Files.fgl -echo file11=%IS5_DEST%\root.client\usr\vice\etc\afs_config.exe >> Control_Center_Common_Files.fgl -echo. >> Control_Center_Common_Files.fgl -echo [General] >> Control_Center_Common_Files.fgl -echo Type=FILELIST >> Control_Center_Common_Files.fgl -echo Version=1.00.000 >> Control_Center_Common_Files.fgl - - -rem -------------- Control_Center_WinDir_Files.fgl --------------------- - -echo [TopDir] > Control_Center_WinDir_Files.fgl -rem echo file0=%IS5_DEST%\root.client\usr\vice\etc\afsdcell.ini >> Control_Center_Windir_Files.fgl -echo. >> Control_Center_WinDir_Files.fgl -echo [General] >> Control_Center_WinDir_Files.fgl -echo Type=FILELIST >> Control_Center_WinDir_Files.fgl -echo Version=1.00.000 >> Control_Center_WinDir_Files.fgl - - -rem -------------- Control_Center_System32_Files.fgl-------------------- - -echo [TopDir] > Control_Center_System32_Files.fgl -echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Control_Center_System32_Files.fgl -echo file1=%MSVCDIR%\REDIST\Msvcrt.dll >> Control_Center_System32_Files.fgl -echo. >> Control_Center_System32_Files.fgl -echo [General] >> Control_Center_System32_Files.fgl -echo Type=FILELIST >> Control_Center_System32_Files.fgl -echo Version=1.00.000 >> Control_Center_System32_Files.fgl - - -rem -------------- Generate the Release Notes file groups --------------- - -rem English -set FILEGROUP=Release_Notes_English_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US -call :Generate_Release_Notes_File_Group - -rem Japanese -set FILEGROUP=Release_Notes_Japanese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ja_JP -call :Generate_Release_Notes_File_Group - -rem Korean -set FILEGROUP=Release_Notes_Korean_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ko_KR -call :Generate_Release_Notes_File_Group - -rem Trad_Chinese -set FILEGROUP=Release_Notes_Trad_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW -call :Generate_Release_Notes_File_Group - -rem Simp_Chinese -set FILEGROUP=Release_Notes_Simp_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN -call :Generate_Release_Notes_File_Group - -rem German -set FILEGROUP=Release_Notes_German_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\de_DE -call :Generate_Empty_File_Group - -rem Spanish -set FILEGROUP=Release_Notes_Spanish_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\es_ES -call :Generate_Empty_File_Group - -rem Portuguese -set FILEGROUP=Release_Notes_Portuguese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\pt_BR -call :Generate_Release_Notes_File_Group - -goto Install_Guide_Files - -:Generate_Release_Notes_File_Group -echo [TopDir] > %FILEGROUP% -echo file0=%IS5_DOC%\README.txt >> %FILEGROUP% -echo file1=%IS5_DOC%\html\ReleaseNotes\awrns000.htm >> %FILEGROUP% -echo file2=%IS5_DOC%\html\ReleaseNotes\awrns002.htm >> %FILEGROUP% -echo file3=%IS5_DOC%\html\ReleaseNotes\awrns003.htm >> %FILEGROUP% -echo file4=%IS5_DOC%\html\ReleaseNotes\awrns004.htm >> %FILEGROUP% -echo file5=%IS5_DOC%\html\ReleaseNotes\awrns005.htm >> %FILEGROUP% -echo file6=%IS5_DOC%\html\ReleaseNotes\awrns006.htm >> %FILEGROUP% -echo file7=%IS5_DOC%\html\ReleaseNotes\awrns007.htm >> %FILEGROUP% -echo. >> %FILEGROUP% -echo [General] >> %FILEGROUP% -echo Type=FILELIST >> %FILEGROUP% -echo Version=1.00.000 >> %FILEGROUP% -goto :EOF - -:Generate_Empty_File_Group -echo [TopDir] > %FILEGROUP% -echo. >> %FILEGROUP% -echo [General] >> %FILEGROUP% -echo Type=FILELIST >> %FILEGROUP% -echo Version=1.00.000 >> %FILEGROUP% -goto :EOF - - -rem -------------- Generate the Install Guide file groups --------------- - -:Install_Guide_Files - -rem English -set FILEGROUP=Install_Guide_English_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US\Html -call :Generate_Install_Guide_File_Group - -rem Japanese -set FILEGROUP=Install_Guide_Japanese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ja_JP\Html -call :Generate_Install_Guide_File_Group - -rem Korean -set FILEGROUP=Install_Guide_Korean_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ko_KR\Html -call :Generate_Install_Guide_File_Group - -rem Trad_Chinese -set FILEGROUP=Install_Guide_Trad_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW\Html -call :Generate_Install_Guide_File_Group - -rem Simp_Chinese -set FILEGROUP=Install_Guide_Simp_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html -call :Generate_Install_Guide_File_Group - -rem German -set FILEGROUP=Install_Guide_German_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\de_DE\Html -call :Generate_Install_Guide_File_Group - -rem Spanish -set FILEGROUP=Install_Guide_Spanish_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\es_ES\Html -call :Generate_Install_Guide_File_Group - -rem Portuguese -set FILEGROUP=Install_Guide_Portuguese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\pt_BR\Html -call :Generate_Install_Guide_File_Group - -goto Sys_Admin_Guide_Files - -:Generate_Install_Guide_File_Group -echo [TopDir] > %FILEGROUP% -echo file0=%IS5_DOC%\InstallGd\awqbg000.htm >> %FILEGROUP% -echo file1=%IS5_DOC%\InstallGd\awqbg002.htm >> %FILEGROUP% -echo file2=%IS5_DOC%\InstallGd\awqbg003.htm >> %FILEGROUP% -echo file3=%IS5_DOC%\InstallGd\awqbg004.htm >> %FILEGROUP% -echo. >> %FILEGROUP% -echo [General] >> %FILEGROUP% -echo Type=FILELIST >> %FILEGROUP% -echo Version=1.00.000 >> %FILEGROUP% -goto :EOF - - -rem -------------- Generate the Sys Admin Guide file groups ------------- - -:Sys_Admin_Guide_Files - -rem English -set FILEGROUP=Sys_Admin_Guide_English_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US\Html -call :Generate_Sys_Admin_Guide_File_Group - -rem Japanese -set FILEGROUP=Sys_Admin_Guide_Japanese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ja_JP\Html -call :Generate_Sys_Admin_Guide_File_Group - -rem Korean -set FILEGROUP=Sys_Admin_Guide_Korean_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ko_KR\Html -call :Generate_Sys_Admin_Guide_File_Group - -rem Trad_Chinese -set FILEGROUP=Sys_Admin_Guide_Trad_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW\Html -call :Generate_Empty_File_Group - -rem Simp_Chinese -set FILEGROUP=Sys_Admin_Guide_Simp_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html -call :Generate_Empty_File_Group - -rem German -set FILEGROUP=Sys_Admin_Guide_German_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\de_DE\Html -call :Generate_Empty_File_Group - -rem Spanish -set FILEGROUP=Sys_Admin_Guide_Spanish_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\es_ES\Html -call :Generate_Empty_File_Group - -rem Portuguese -set FILEGROUP=Sys_Admin_Guide_Portuguese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\pt_BR\Html -call :Generate_Empty_File_Group - -goto Cmd_Ref_Files - -:Generate_Sys_Admin_Guide_File_Group -echo [TopDir] > %FILEGROUP% -echo file0=%IS5_DOC%\SysAdminGd\auagd000.htm >> %FILEGROUP% -echo file1=%IS5_DOC%\SysAdminGd\auagd002.htm >> %FILEGROUP% -echo file2=%IS5_DOC%\SysAdminGd\auagd003.htm >> %FILEGROUP% -echo file3=%IS5_DOC%\SysAdminGd\auagd004.htm >> %FILEGROUP% -echo file4=%IS5_DOC%\SysAdminGd\auagd005.htm >> %FILEGROUP% -echo file5=%IS5_DOC%\SysAdminGd\auagd006.htm >> %FILEGROUP% -echo file6=%IS5_DOC%\SysAdminGd\auagd007.htm >> %FILEGROUP% -echo file7=%IS5_DOC%\SysAdminGd\auagd008.htm >> %FILEGROUP% -echo file8=%IS5_DOC%\SysAdminGd\auagd009.htm >> %FILEGROUP% -echo file9=%IS5_DOC%\SysAdminGd\auagd010.htm >> %FILEGROUP% -echo file10=%IS5_DOC%\SysAdminGd\auagd011.htm >> %FILEGROUP% -echo file11=%IS5_DOC%\SysAdminGd\auagd012.htm >> %FILEGROUP% -echo file12=%IS5_DOC%\SysAdminGd\auagd013.htm >> %FILEGROUP% -echo file13=%IS5_DOC%\SysAdminGd\auagd014.htm >> %FILEGROUP% -echo file14=%IS5_DOC%\SysAdminGd\auagd015.htm >> %FILEGROUP% -echo file15=%IS5_DOC%\SysAdminGd\auagd016.htm >> %FILEGROUP% -echo file16=%IS5_DOC%\SysAdminGd\auagd017.htm >> %FILEGROUP% -echo file17=%IS5_DOC%\SysAdminGd\auagd018.htm >> %FILEGROUP% -echo file18=%IS5_DOC%\SysAdminGd\auagd019.htm >> %FILEGROUP% -echo file19=%IS5_DOC%\SysAdminGd\auagd020.htm >> %FILEGROUP% -echo file20=%IS5_DOC%\SysAdminGd\auagd021.htm >> %FILEGROUP% -echo file21=%IS5_DOC%\SysAdminGd\auagd022.htm >> %FILEGROUP% -echo file22=%IS5_DOC%\SysAdminGd\auagd023.htm >> %FILEGROUP% -echo file23=%IS5_DOC%\SysAdminGd\auagd024.htm >> %FILEGROUP% -echo file24=%IS5_DOC%\SysAdminGd\auagd025.htm >> %FILEGROUP% -echo file25=%IS5_DOC%\SysAdminGd\auagd026.htm >> %FILEGROUP% -echo file26=%IS5_DOC%\SysAdminGd\vnode.gif >> %FILEGROUP% -echo file27=%IS5_DOC%\SysAdminGd\fserver1.gif >> %FILEGROUP% -echo file28=%IS5_DOC%\SysAdminGd\fserver2.gif >> %FILEGROUP% -echo file29=%IS5_DOC%\SysAdminGd\overview.gif >> %FILEGROUP% -echo file30=%IS5_DOC%\SysAdminGd\scout1.gif >> %FILEGROUP% -echo file31=%IS5_DOC%\SysAdminGd\scout2.gif >> %FILEGROUP% -echo file32=%IS5_DOC%\SysAdminGd\scout3.gif >> %FILEGROUP% -echo file33=%IS5_DOC%\SysAdminGd\scout4.gif >> %FILEGROUP% -echo file34=%IS5_DOC%\SysAdminGd\cachmgr.gif >> %FILEGROUP% -echo. >> %FILEGROUP% -echo [General] >> %FILEGROUP% -echo Type=FILELIST >> %FILEGROUP% -echo Version=1.00.000 >> %FILEGROUP% -goto :EOF - -rem -------------- Generate the Cmd Ref file groups --------------------- - -:Cmd_Ref_Files - -rem English -set FILEGROUP=Cmd_Ref_English_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US\Html -call :Generate_Cmd_Ref_File_Group - -rem Japanese -set FILEGROUP=Cmd_Ref_Japanese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ja_JP\Html -call :Generate_Cmd_Ref_File_Group - -rem Korean -set FILEGROUP=Cmd_Ref_Korean_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ko_KR\Html -call :Generate_Empty_File_Group - -rem Trad_Chinese -set FILEGROUP=Cmd_Ref_Trad_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW\Html -call :Generate_Empty_File_Group - -rem Simp_Chinese -set FILEGROUP=Cmd_Ref_Simp_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html -call :Generate_Empty_File_Group - -rem German -set FILEGROUP=Cmd_Ref_German_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\de_DE\Html -call :Generate_Empty_File_Group - -rem Spanish -set FILEGROUP=Cmd_Ref_Spanish_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\es_ES\Html -call :Generate_Empty_File_Group - -rem Portuguese -set FILEGROUP=Cmd_Ref_Portuguese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\pt_BR\Html -call :Generate_Empty_File_Group - -goto Doc_Misc_Files - -:Generate_Cmd_Ref_File_Group -echo [TopDir] > %FILEGROUP% -echo file0=%IS5_DOC%\CmdRef\auarf000.htm >> %FILEGROUP% -echo file1=%IS5_DOC%\CmdRef\auarf002.htm >> %FILEGROUP% -echo file2=%IS5_DOC%\CmdRef\auarf003.htm >> %FILEGROUP% -echo file3=%IS5_DOC%\CmdRef\auarf004.htm >> %FILEGROUP% -echo file4=%IS5_DOC%\CmdRef\auarf005.htm >> %FILEGROUP% -echo file5=%IS5_DOC%\CmdRef\auarf006.htm >> %FILEGROUP% -echo file6=%IS5_DOC%\CmdRef\auarf007.htm >> %FILEGROUP% -echo file7=%IS5_DOC%\CmdRef\auarf008.htm >> %FILEGROUP% -echo file8=%IS5_DOC%\CmdRef\auarf009.htm >> %FILEGROUP% -echo file9=%IS5_DOC%\CmdRef\auarf010.htm >> %FILEGROUP% -echo file10=%IS5_DOC%\CmdRef\auarf011.htm >> %FILEGROUP% -echo file11=%IS5_DOC%\CmdRef\auarf012.htm >> %FILEGROUP% -echo file12=%IS5_DOC%\CmdRef\auarf013.htm >> %FILEGROUP% -echo file13=%IS5_DOC%\CmdRef\auarf014.htm >> %FILEGROUP% -echo file14=%IS5_DOC%\CmdRef\auarf015.htm >> %FILEGROUP% -echo file15=%IS5_DOC%\CmdRef\auarf016.htm >> %FILEGROUP% -echo file16=%IS5_DOC%\CmdRef\auarf017.htm >> %FILEGROUP% -echo file17=%IS5_DOC%\CmdRef\auarf018.htm >> %FILEGROUP% -echo file18=%IS5_DOC%\CmdRef\auarf019.htm >> %FILEGROUP% -echo file19=%IS5_DOC%\CmdRef\auarf020.htm >> %FILEGROUP% -echo file20=%IS5_DOC%\CmdRef\auarf021.htm >> %FILEGROUP% -echo file21=%IS5_DOC%\CmdRef\auarf022.htm >> %FILEGROUP% -echo file22=%IS5_DOC%\CmdRef\auarf023.htm >> %FILEGROUP% -echo file23=%IS5_DOC%\CmdRef\auarf024.htm >> %FILEGROUP% -echo file24=%IS5_DOC%\CmdRef\auarf025.htm >> %FILEGROUP% -echo file25=%IS5_DOC%\CmdRef\auarf026.htm >> %FILEGROUP% -echo file26=%IS5_DOC%\CmdRef\auarf027.htm >> %FILEGROUP% -echo file27=%IS5_DOC%\CmdRef\auarf028.htm >> %FILEGROUP% -echo file28=%IS5_DOC%\CmdRef\auarf029.htm >> %FILEGROUP% -echo file29=%IS5_DOC%\CmdRef\auarf030.htm >> %FILEGROUP% -echo file30=%IS5_DOC%\CmdRef\auarf031.htm >> %FILEGROUP% -echo file31=%IS5_DOC%\CmdRef\auarf032.htm >> %FILEGROUP% -echo file32=%IS5_DOC%\CmdRef\auarf033.htm >> %FILEGROUP% -echo file33=%IS5_DOC%\CmdRef\auarf034.htm >> %FILEGROUP% -echo file34=%IS5_DOC%\CmdRef\auarf035.htm >> %FILEGROUP% -echo file35=%IS5_DOC%\CmdRef\auarf036.htm >> %FILEGROUP% -echo file36=%IS5_DOC%\CmdRef\auarf037.htm >> %FILEGROUP% -echo file37=%IS5_DOC%\CmdRef\auarf038.htm >> %FILEGROUP% -echo file38=%IS5_DOC%\CmdRef\auarf039.htm >> %FILEGROUP% -echo file39=%IS5_DOC%\CmdRef\auarf040.htm >> %FILEGROUP% -echo file40=%IS5_DOC%\CmdRef\auarf041.htm >> %FILEGROUP% -echo file41=%IS5_DOC%\CmdRef\auarf042.htm >> %FILEGROUP% -echo file42=%IS5_DOC%\CmdRef\auarf043.htm >> %FILEGROUP% -echo file43=%IS5_DOC%\CmdRef\auarf044.htm >> %FILEGROUP% -echo file44=%IS5_DOC%\CmdRef\auarf045.htm >> %FILEGROUP% -echo file45=%IS5_DOC%\CmdRef\auarf046.htm >> %FILEGROUP% -echo file46=%IS5_DOC%\CmdRef\auarf047.htm >> %FILEGROUP% -echo file47=%IS5_DOC%\CmdRef\auarf048.htm >> %FILEGROUP% -echo file48=%IS5_DOC%\CmdRef\auarf049.htm >> %FILEGROUP% -echo file49=%IS5_DOC%\CmdRef\auarf050.htm >> %FILEGROUP% -echo file50=%IS5_DOC%\CmdRef\auarf051.htm >> %FILEGROUP% -echo file51=%IS5_DOC%\CmdRef\auarf052.htm >> %FILEGROUP% -echo file52=%IS5_DOC%\CmdRef\auarf053.htm >> %FILEGROUP% -echo file53=%IS5_DOC%\CmdRef\auarf054.htm >> %FILEGROUP% -echo file54=%IS5_DOC%\CmdRef\auarf055.htm >> %FILEGROUP% -echo file55=%IS5_DOC%\CmdRef\auarf056.htm >> %FILEGROUP% -echo file56=%IS5_DOC%\CmdRef\auarf057.htm >> %FILEGROUP% -echo file57=%IS5_DOC%\CmdRef\auarf058.htm >> %FILEGROUP% -echo file58=%IS5_DOC%\CmdRef\auarf059.htm >> %FILEGROUP% -echo file59=%IS5_DOC%\CmdRef\auarf060.htm >> %FILEGROUP% -echo file60=%IS5_DOC%\CmdRef\auarf061.htm >> %FILEGROUP% -echo file61=%IS5_DOC%\CmdRef\auarf062.htm >> %FILEGROUP% -echo file62=%IS5_DOC%\CmdRef\auarf063.htm >> %FILEGROUP% -echo file63=%IS5_DOC%\CmdRef\auarf064.htm >> %FILEGROUP% -echo file64=%IS5_DOC%\CmdRef\auarf065.htm >> %FILEGROUP% -echo file65=%IS5_DOC%\CmdRef\auarf066.htm >> %FILEGROUP% -echo file66=%IS5_DOC%\CmdRef\auarf067.htm >> %FILEGROUP% -echo file67=%IS5_DOC%\CmdRef\auarf068.htm >> %FILEGROUP% -echo file68=%IS5_DOC%\CmdRef\auarf069.htm >> %FILEGROUP% -echo file69=%IS5_DOC%\CmdRef\auarf070.htm >> %FILEGROUP% -echo file70=%IS5_DOC%\CmdRef\auarf071.htm >> %FILEGROUP% -echo file71=%IS5_DOC%\CmdRef\auarf072.htm >> %FILEGROUP% -echo file72=%IS5_DOC%\CmdRef\auarf073.htm >> %FILEGROUP% -echo file73=%IS5_DOC%\CmdRef\auarf074.htm >> %FILEGROUP% -echo file74=%IS5_DOC%\CmdRef\auarf075.htm >> %FILEGROUP% -echo file75=%IS5_DOC%\CmdRef\auarf076.htm >> %FILEGROUP% -echo file76=%IS5_DOC%\CmdRef\auarf077.htm >> %FILEGROUP% -echo file77=%IS5_DOC%\CmdRef\auarf078.htm >> %FILEGROUP% -echo file78=%IS5_DOC%\CmdRef\auarf079.htm >> %FILEGROUP% -echo file79=%IS5_DOC%\CmdRef\auarf080.htm >> %FILEGROUP% -echo file80=%IS5_DOC%\CmdRef\auarf081.htm >> %FILEGROUP% -echo file81=%IS5_DOC%\CmdRef\auarf082.htm >> %FILEGROUP% -echo file82=%IS5_DOC%\CmdRef\auarf083.htm >> %FILEGROUP% -echo file83=%IS5_DOC%\CmdRef\auarf084.htm >> %FILEGROUP% -echo file84=%IS5_DOC%\CmdRef\auarf085.htm >> %FILEGROUP% -echo file85=%IS5_DOC%\CmdRef\auarf086.htm >> %FILEGROUP% -echo file86=%IS5_DOC%\CmdRef\auarf087.htm >> %FILEGROUP% -echo file87=%IS5_DOC%\CmdRef\auarf088.htm >> %FILEGROUP% -echo file88=%IS5_DOC%\CmdRef\auarf089.htm >> %FILEGROUP% -echo file89=%IS5_DOC%\CmdRef\auarf090.htm >> %FILEGROUP% -echo file90=%IS5_DOC%\CmdRef\auarf091.htm >> %FILEGROUP% -echo file91=%IS5_DOC%\CmdRef\auarf092.htm >> %FILEGROUP% -echo file92=%IS5_DOC%\CmdRef\auarf093.htm >> %FILEGROUP% -echo file93=%IS5_DOC%\CmdRef\auarf094.htm >> %FILEGROUP% -echo file94=%IS5_DOC%\CmdRef\auarf095.htm >> %FILEGROUP% -echo file95=%IS5_DOC%\CmdRef\auarf096.htm >> %FILEGROUP% -echo file96=%IS5_DOC%\CmdRef\auarf097.htm >> %FILEGROUP% -echo file97=%IS5_DOC%\CmdRef\auarf098.htm >> %FILEGROUP% -echo file98=%IS5_DOC%\CmdRef\auarf099.htm >> %FILEGROUP% -echo file99=%IS5_DOC%\CmdRef\auarf100.htm >> %FILEGROUP% -echo file100=%IS5_DOC%\CmdRef\auarf101.htm >> %FILEGROUP% -echo file101=%IS5_DOC%\CmdRef\auarf102.htm >> %FILEGROUP% -echo file102=%IS5_DOC%\CmdRef\auarf103.htm >> %FILEGROUP% -echo file103=%IS5_DOC%\CmdRef\auarf104.htm >> %FILEGROUP% -echo file104=%IS5_DOC%\CmdRef\auarf105.htm >> %FILEGROUP% -echo file105=%IS5_DOC%\CmdRef\auarf106.htm >> %FILEGROUP% -echo file106=%IS5_DOC%\CmdRef\auarf107.htm >> %FILEGROUP% -echo file107=%IS5_DOC%\CmdRef\auarf108.htm >> %FILEGROUP% -echo file108=%IS5_DOC%\CmdRef\auarf109.htm >> %FILEGROUP% -echo file109=%IS5_DOC%\CmdRef\auarf110.htm >> %FILEGROUP% -echo file110=%IS5_DOC%\CmdRef\auarf111.htm >> %FILEGROUP% -echo file111=%IS5_DOC%\CmdRef\auarf112.htm >> %FILEGROUP% -echo file112=%IS5_DOC%\CmdRef\auarf113.htm >> %FILEGROUP% -echo file113=%IS5_DOC%\CmdRef\auarf114.htm >> %FILEGROUP% -echo file114=%IS5_DOC%\CmdRef\auarf115.htm >> %FILEGROUP% -echo file115=%IS5_DOC%\CmdRef\auarf116.htm >> %FILEGROUP% -echo file116=%IS5_DOC%\CmdRef\auarf117.htm >> %FILEGROUP% -echo file117=%IS5_DOC%\CmdRef\auarf118.htm >> %FILEGROUP% -echo file118=%IS5_DOC%\CmdRef\auarf119.htm >> %FILEGROUP% -echo file119=%IS5_DOC%\CmdRef\auarf120.htm >> %FILEGROUP% -echo file120=%IS5_DOC%\CmdRef\auarf121.htm >> %FILEGROUP% -echo file121=%IS5_DOC%\CmdRef\auarf122.htm >> %FILEGROUP% -echo file122=%IS5_DOC%\CmdRef\auarf123.htm >> %FILEGROUP% -echo file123=%IS5_DOC%\CmdRef\auarf124.htm >> %FILEGROUP% -echo file124=%IS5_DOC%\CmdRef\auarf125.htm >> %FILEGROUP% -echo file125=%IS5_DOC%\CmdRef\auarf126.htm >> %FILEGROUP% -echo file126=%IS5_DOC%\CmdRef\auarf127.htm >> %FILEGROUP% -echo file127=%IS5_DOC%\CmdRef\auarf128.htm >> %FILEGROUP% -echo file128=%IS5_DOC%\CmdRef\auarf129.htm >> %FILEGROUP% -echo file129=%IS5_DOC%\CmdRef\auarf130.htm >> %FILEGROUP% -echo file130=%IS5_DOC%\CmdRef\auarf131.htm >> %FILEGROUP% -echo file131=%IS5_DOC%\CmdRef\auarf132.htm >> %FILEGROUP% -echo file132=%IS5_DOC%\CmdRef\auarf133.htm >> %FILEGROUP% -echo file133=%IS5_DOC%\CmdRef\auarf134.htm >> %FILEGROUP% -echo file134=%IS5_DOC%\CmdRef\auarf135.htm >> %FILEGROUP% -echo file135=%IS5_DOC%\CmdRef\auarf136.htm >> %FILEGROUP% -echo file136=%IS5_DOC%\CmdRef\auarf137.htm >> %FILEGROUP% -echo file137=%IS5_DOC%\CmdRef\auarf138.htm >> %FILEGROUP% -echo file138=%IS5_DOC%\CmdRef\auarf139.htm >> %FILEGROUP% -echo file139=%IS5_DOC%\CmdRef\auarf140.htm >> %FILEGROUP% -echo file140=%IS5_DOC%\CmdRef\auarf141.htm >> %FILEGROUP% -echo file141=%IS5_DOC%\CmdRef\auarf142.htm >> %FILEGROUP% -echo file142=%IS5_DOC%\CmdRef\auarf143.htm >> %FILEGROUP% -echo file143=%IS5_DOC%\CmdRef\auarf144.htm >> %FILEGROUP% -echo file144=%IS5_DOC%\CmdRef\auarf145.htm >> %FILEGROUP% -echo file145=%IS5_DOC%\CmdRef\auarf146.htm >> %FILEGROUP% -echo file146=%IS5_DOC%\CmdRef\auarf147.htm >> %FILEGROUP% -echo file147=%IS5_DOC%\CmdRef\auarf148.htm >> %FILEGROUP% -echo file148=%IS5_DOC%\CmdRef\auarf149.htm >> %FILEGROUP% -echo file149=%IS5_DOC%\CmdRef\auarf150.htm >> %FILEGROUP% -echo file150=%IS5_DOC%\CmdRef\auarf151.htm >> %FILEGROUP% -echo file151=%IS5_DOC%\CmdRef\auarf152.htm >> %FILEGROUP% -echo file152=%IS5_DOC%\CmdRef\auarf153.htm >> %FILEGROUP% -echo file153=%IS5_DOC%\CmdRef\auarf154.htm >> %FILEGROUP% -echo file154=%IS5_DOC%\CmdRef\auarf155.htm >> %FILEGROUP% -echo file155=%IS5_DOC%\CmdRef\auarf156.htm >> %FILEGROUP% -echo file156=%IS5_DOC%\CmdRef\auarf157.htm >> %FILEGROUP% -echo file157=%IS5_DOC%\CmdRef\auarf158.htm >> %FILEGROUP% -echo file158=%IS5_DOC%\CmdRef\auarf159.htm >> %FILEGROUP% -echo file159=%IS5_DOC%\CmdRef\auarf160.htm >> %FILEGROUP% -echo file160=%IS5_DOC%\CmdRef\auarf161.htm >> %FILEGROUP% -echo file161=%IS5_DOC%\CmdRef\auarf162.htm >> %FILEGROUP% -echo file162=%IS5_DOC%\CmdRef\auarf163.htm >> %FILEGROUP% -echo file163=%IS5_DOC%\CmdRef\auarf164.htm >> %FILEGROUP% -echo file164=%IS5_DOC%\CmdRef\auarf165.htm >> %FILEGROUP% -echo file165=%IS5_DOC%\CmdRef\auarf166.htm >> %FILEGROUP% -echo file166=%IS5_DOC%\CmdRef\auarf167.htm >> %FILEGROUP% -echo file167=%IS5_DOC%\CmdRef\auarf168.htm >> %FILEGROUP% -echo file168=%IS5_DOC%\CmdRef\auarf169.htm >> %FILEGROUP% -echo file169=%IS5_DOC%\CmdRef\auarf170.htm >> %FILEGROUP% -echo file170=%IS5_DOC%\CmdRef\auarf171.htm >> %FILEGROUP% -echo file171=%IS5_DOC%\CmdRef\auarf172.htm >> %FILEGROUP% -echo file172=%IS5_DOC%\CmdRef\auarf173.htm >> %FILEGROUP% -echo file173=%IS5_DOC%\CmdRef\auarf174.htm >> %FILEGROUP% -echo file174=%IS5_DOC%\CmdRef\auarf175.htm >> %FILEGROUP% -echo file175=%IS5_DOC%\CmdRef\auarf176.htm >> %FILEGROUP% -echo file176=%IS5_DOC%\CmdRef\auarf177.htm >> %FILEGROUP% -echo file177=%IS5_DOC%\CmdRef\auarf178.htm >> %FILEGROUP% -echo file178=%IS5_DOC%\CmdRef\auarf179.htm >> %FILEGROUP% -echo file179=%IS5_DOC%\CmdRef\auarf180.htm >> %FILEGROUP% -echo file180=%IS5_DOC%\CmdRef\auarf181.htm >> %FILEGROUP% -echo file181=%IS5_DOC%\CmdRef\auarf182.htm >> %FILEGROUP% -echo file182=%IS5_DOC%\CmdRef\auarf183.htm >> %FILEGROUP% -echo file183=%IS5_DOC%\CmdRef\auarf184.htm >> %FILEGROUP% -echo file184=%IS5_DOC%\CmdRef\auarf185.htm >> %FILEGROUP% -echo file185=%IS5_DOC%\CmdRef\auarf186.htm >> %FILEGROUP% -echo file186=%IS5_DOC%\CmdRef\auarf187.htm >> %FILEGROUP% -echo file187=%IS5_DOC%\CmdRef\auarf188.htm >> %FILEGROUP% -echo file188=%IS5_DOC%\CmdRef\auarf189.htm >> %FILEGROUP% -echo file189=%IS5_DOC%\CmdRef\auarf190.htm >> %FILEGROUP% -echo file190=%IS5_DOC%\CmdRef\auarf191.htm >> %FILEGROUP% -echo file191=%IS5_DOC%\CmdRef\auarf192.htm >> %FILEGROUP% -echo file192=%IS5_DOC%\CmdRef\auarf193.htm >> %FILEGROUP% -echo file193=%IS5_DOC%\CmdRef\auarf194.htm >> %FILEGROUP% -echo file194=%IS5_DOC%\CmdRef\auarf195.htm >> %FILEGROUP% -echo file195=%IS5_DOC%\CmdRef\auarf196.htm >> %FILEGROUP% -echo file196=%IS5_DOC%\CmdRef\auarf197.htm >> %FILEGROUP% -echo file197=%IS5_DOC%\CmdRef\auarf198.htm >> %FILEGROUP% -echo file198=%IS5_DOC%\CmdRef\auarf199.htm >> %FILEGROUP% -echo file199=%IS5_DOC%\CmdRef\auarf200.htm >> %FILEGROUP% -echo file200=%IS5_DOC%\CmdRef\auarf201.htm >> %FILEGROUP% -echo file201=%IS5_DOC%\CmdRef\auarf202.htm >> %FILEGROUP% -echo file202=%IS5_DOC%\CmdRef\auarf203.htm >> %FILEGROUP% -echo file203=%IS5_DOC%\CmdRef\auarf204.htm >> %FILEGROUP% -echo file204=%IS5_DOC%\CmdRef\auarf205.htm >> %FILEGROUP% -echo file205=%IS5_DOC%\CmdRef\auarf206.htm >> %FILEGROUP% -echo file206=%IS5_DOC%\CmdRef\auarf207.htm >> %FILEGROUP% -echo file207=%IS5_DOC%\CmdRef\auarf208.htm >> %FILEGROUP% -echo file208=%IS5_DOC%\CmdRef\auarf209.htm >> %FILEGROUP% -echo file209=%IS5_DOC%\CmdRef\auarf210.htm >> %FILEGROUP% -echo file210=%IS5_DOC%\CmdRef\auarf211.htm >> %FILEGROUP% -echo file211=%IS5_DOC%\CmdRef\auarf212.htm >> %FILEGROUP% -echo file212=%IS5_DOC%\CmdRef\auarf213.htm >> %FILEGROUP% -echo file213=%IS5_DOC%\CmdRef\auarf214.htm >> %FILEGROUP% -echo file214=%IS5_DOC%\CmdRef\auarf215.htm >> %FILEGROUP% -echo file215=%IS5_DOC%\CmdRef\auarf216.htm >> %FILEGROUP% -echo file216=%IS5_DOC%\CmdRef\auarf217.htm >> %FILEGROUP% -echo file217=%IS5_DOC%\CmdRef\auarf218.htm >> %FILEGROUP% -echo file218=%IS5_DOC%\CmdRef\auarf219.htm >> %FILEGROUP% -echo file219=%IS5_DOC%\CmdRef\auarf220.htm >> %FILEGROUP% -echo file220=%IS5_DOC%\CmdRef\auarf221.htm >> %FILEGROUP% -echo file221=%IS5_DOC%\CmdRef\auarf222.htm >> %FILEGROUP% -echo file222=%IS5_DOC%\CmdRef\auarf223.htm >> %FILEGROUP% -echo file223=%IS5_DOC%\CmdRef\auarf224.htm >> %FILEGROUP% -echo file224=%IS5_DOC%\CmdRef\auarf225.htm >> %FILEGROUP% -echo file225=%IS5_DOC%\CmdRef\auarf226.htm >> %FILEGROUP% -echo file226=%IS5_DOC%\CmdRef\auarf227.htm >> %FILEGROUP% -echo file227=%IS5_DOC%\CmdRef\auarf228.htm >> %FILEGROUP% -echo file228=%IS5_DOC%\CmdRef\auarf229.htm >> %FILEGROUP% -echo file229=%IS5_DOC%\CmdRef\auarf230.htm >> %FILEGROUP% -echo file230=%IS5_DOC%\CmdRef\auarf231.htm >> %FILEGROUP% -echo file231=%IS5_DOC%\CmdRef\auarf232.htm >> %FILEGROUP% -echo file232=%IS5_DOC%\CmdRef\auarf233.htm >> %FILEGROUP% -echo file233=%IS5_DOC%\CmdRef\auarf234.htm >> %FILEGROUP% -echo file234=%IS5_DOC%\CmdRef\auarf235.htm >> %FILEGROUP% -echo file235=%IS5_DOC%\CmdRef\auarf236.htm >> %FILEGROUP% -echo file236=%IS5_DOC%\CmdRef\auarf237.htm >> %FILEGROUP% -echo file237=%IS5_DOC%\CmdRef\auarf238.htm >> %FILEGROUP% -echo file238=%IS5_DOC%\CmdRef\auarf239.htm >> %FILEGROUP% -echo file239=%IS5_DOC%\CmdRef\auarf240.htm >> %FILEGROUP% -echo file240=%IS5_DOC%\CmdRef\auarf241.htm >> %FILEGROUP% -echo file241=%IS5_DOC%\CmdRef\auarf242.htm >> %FILEGROUP% -echo file242=%IS5_DOC%\CmdRef\auarf243.htm >> %FILEGROUP% -echo file243=%IS5_DOC%\CmdRef\auarf244.htm >> %FILEGROUP% -echo file244=%IS5_DOC%\CmdRef\auarf245.htm >> %FILEGROUP% -echo file245=%IS5_DOC%\CmdRef\auarf246.htm >> %FILEGROUP% -echo file246=%IS5_DOC%\CmdRef\auarf247.htm >> %FILEGROUP% -echo file247=%IS5_DOC%\CmdRef\auarf248.htm >> %FILEGROUP% -echo file248=%IS5_DOC%\CmdRef\auarf249.htm >> %FILEGROUP% -echo file249=%IS5_DOC%\CmdRef\auarf250.htm >> %FILEGROUP% -echo file250=%IS5_DOC%\CmdRef\auarf251.htm >> %FILEGROUP% -echo file251=%IS5_DOC%\CmdRef\auarf252.htm >> %FILEGROUP% -echo file252=%IS5_DOC%\CmdRef\auarf253.htm >> %FILEGROUP% -echo file253=%IS5_DOC%\CmdRef\auarf254.htm >> %FILEGROUP% -echo file254=%IS5_DOC%\CmdRef\auarf255.htm >> %FILEGROUP% -echo file255=%IS5_DOC%\CmdRef\auarf256.htm >> %FILEGROUP% -echo file256=%IS5_DOC%\CmdRef\auarf257.htm >> %FILEGROUP% -echo file257=%IS5_DOC%\CmdRef\auarf258.htm >> %FILEGROUP% -echo file258=%IS5_DOC%\CmdRef\auarf259.htm >> %FILEGROUP% -echo file259=%IS5_DOC%\CmdRef\auarf260.htm >> %FILEGROUP% -echo file260=%IS5_DOC%\CmdRef\auarf261.htm >> %FILEGROUP% -echo file261=%IS5_DOC%\CmdRef\auarf262.htm >> %FILEGROUP% -echo file262=%IS5_DOC%\CmdRef\auarf263.htm >> %FILEGROUP% -echo file263=%IS5_DOC%\CmdRef\auarf264.htm >> %FILEGROUP% -echo file264=%IS5_DOC%\CmdRef\auarf265.htm >> %FILEGROUP% -echo file265=%IS5_DOC%\CmdRef\auarf266.htm >> %FILEGROUP% -echo file266=%IS5_DOC%\CmdRef\auarf267.htm >> %FILEGROUP% -echo file267=%IS5_DOC%\CmdRef\auarf268.htm >> %FILEGROUP% -echo file268=%IS5_DOC%\CmdRef\auarf269.htm >> %FILEGROUP% -echo file269=%IS5_DOC%\CmdRef\auarf270.htm >> %FILEGROUP% -echo file270=%IS5_DOC%\CmdRef\auarf271.htm >> %FILEGROUP% -echo file271=%IS5_DOC%\CmdRef\auarf272.htm >> %FILEGROUP% -echo file272=%IS5_DOC%\CmdRef\auarf273.htm >> %FILEGROUP% -echo file273=%IS5_DOC%\CmdRef\auarf274.htm >> %FILEGROUP% -echo file274=%IS5_DOC%\CmdRef\auarf275.htm >> %FILEGROUP% -echo file275=%IS5_DOC%\CmdRef\auarf276.htm >> %FILEGROUP% -echo file276=%IS5_DOC%\CmdRef\auarf277.htm >> %FILEGROUP% -echo file277=%IS5_DOC%\CmdRef\auarf278.htm >> %FILEGROUP% -echo file278=%IS5_DOC%\CmdRef\auarf279.htm >> %FILEGROUP% -echo file279=%IS5_DOC%\CmdRef\auarf280.htm >> %FILEGROUP% -echo file280=%IS5_DOC%\CmdRef\auarf281.htm >> %FILEGROUP% -echo file281=%IS5_DOC%\CmdRef\auarf282.htm >> %FILEGROUP% -echo file282=%IS5_DOC%\CmdRef\auarf283.htm >> %FILEGROUP% -echo file283=%IS5_DOC%\CmdRef\auarf284.htm >> %FILEGROUP% -echo. >> %FILEGROUP% -echo [General] >> %FILEGROUP% -echo Type=FILELIST >> %FILEGROUP% -echo Version=1.00.000 >> %FILEGROUP% -goto :EOF - -rem -------------- Generate the Doc Misc file groups -------------------- - -:Doc_Misc_Files - -rem English -set FILEGROUP=Doc_Misc_English_Files.fgl -set IS5_LANG=en_US -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem Japanese -set FILEGROUP=Doc_Misc_Japanese_Files.fgl -set IS5_LANG=ja_JP -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ja_JP\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem Korean -set FILEGROUP=Doc_Misc_Korean_Files.fgl -set IS5_LANG=ko_KR -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ko_KR\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem Trad_Chinese -set FILEGROUP=Doc_Misc_Trad_Chinese_Files.fgl -set IS5_LANG=zh_TW -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem Simp_Chinese -set FILEGROUP=Doc_Misc_Simp_Chinese_Files.fgl -set IS5_LANG=zh_CN -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem German -set FILEGROUP=Doc_Misc_German_Files.fgl -set IS5_LANG=de_DE -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\de_DE\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem Spanish -set FILEGROUP=Doc_Misc_Spanish_Files.fgl -set IS5_LANG=es_ES -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\es_ES\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -rem Portuguese -set FILEGROUP=Doc_Misc_Portuguese_Files.fgl -set IS5_LANG=pt_BR -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\pt_BR\Html -call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - -goto Doc_Files - -:Generate_Doc_Misc_File_Group -echo [TopDir] > %FILEGROUP% -echo file0=%IS5_DOC%\banner.gif >> %FILEGROUP% -echo file1=%IS5_DOC%\books.gif >> %FILEGROUP% -echo file2=%IS5_DOC%\bot.gif >> %FILEGROUP% -echo file3=%IS5_DOC%\index.gif >> %FILEGROUP% -echo file4=%IS5_DOC%\index.htm >> %FILEGROUP% -echo file5=%IS5_DOC%\next.gif >> %FILEGROUP% -echo file6=%IS5_DOC%\prev.gif >> %FILEGROUP% -echo file7=%IS5_DOC%\toc.gif >> %FILEGROUP% -echo file8=%IS5_DOC%\top.gif >> %FILEGROUP% -echo file9=%AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf >> %FILEGROUP% -echo. >> %FILEGROUP% -echo [General] >> %FILEGROUP% -echo Type=FILELIST >> %FILEGROUP% -echo Version=1.00.000 >> %FILEGROUP% -goto :EOF - -rem -------------- Doc_Files.fgl ------------------------------ - -:Doc_Files -echo [TopDir] > Doc_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\DocsUninst.dll >> Doc_Files.fgl -echo. >> Doc_Files.fgl -echo [General] >> Doc_Files.fgl -echo Type=FILELIST >> Doc_Files.fgl -echo Version=1.00.000 >> Doc_Files.fgl - - -rem -------------- Lang_English_Files.fgl ------------------------------ - -echo [TopDir] > Lang_English_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1033.dll >> Lang_English_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1033.dll >> Lang_English_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1033.dll >> Lang_English_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1033.dll >> Lang_English_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1033.dll >> Lang_English_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1033.dll >> Lang_English_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1033.dll >> Lang_English_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1033.dll >> Lang_English_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1033.dll >> Lang_English_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1033.dll >> Lang_English_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1033.dll >> Lang_English_Files.fgl -echo file11=%IS5_HELP%\en_US\afs-nt.hlp >> Lang_English_Files.fgl -echo file12=%IS5_HELP%\en_US\afs-nt.cnt >> Lang_English_Files.fgl -echo file13=%IS5_HELP%\en_US\taafssvrmgr.cnt >> Lang_English_Files.fgl -echo file14=%IS5_HELP%\en_US\taafssvrmgr.hlp >> Lang_English_Files.fgl -echo file15=%IS5_HELP%\en_US\taafsusrmgr.cnt >> Lang_English_Files.fgl -echo file16=%IS5_HELP%\en_US\taafsusrmgr.hlp >> Lang_English_Files.fgl -echo file17=%IS5_HELP%\en_US\afs-cc.cnt >> Lang_English_Files.fgl -echo file18=%IS5_HELP%\en_US\afs-cc.hlp >> Lang_English_Files.fgl -echo file19=%IS5_HELP%\en_US\afs-light.cnt >> Lang_English_Files.fgl -echo file20=%IS5_HELP%\en_US\afs-light.hlp >> Lang_English_Files.fgl -echo file21=%IS5_HELP%\en_US\taafscfg.cnt >> Lang_English_Files.fgl -echo file22=%IS5_HELP%\en_US\taafscfg.hlp >> Lang_English_Files.fgl -echo. >> Lang_English_Files.fgl -echo [General] >> Lang_English_Files.fgl -echo Type=FILELIST >> Lang_English_Files.fgl -echo Version=1.00.000 >> Lang_English_Files.fgl - - -rem -------------- Lang_Simp_Chinese_Files.fgl ------------------------- - -echo [TopDir] > Lang_Simp_Chinese_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_2052.dll >> Lang_Simp_Chinese_Files.fgl -echo file11=%IS5_HELP%\zh_CN\afs-nt.hlp >> Lang_Simp_Chinese_Files.fgl -echo file12=%IS5_HELP%\zh_CN\afs-nt.cnt >> Lang_Simp_Chinese_Files.fgl -echo file13=%IS5_HELP%\zh_CN\taafssvrmgr.cnt >> Lang_Simp_Chinese_Files.fgl -echo file14=%IS5_HELP%\zh_CN\taafssvrmgr.hlp >> Lang_Simp_Chinese_Files.fgl -echo file15=%IS5_HELP%\zh_CN\taafsusrmgr.cnt >> Lang_Simp_Chinese_Files.fgl -echo file16=%IS5_HELP%\zh_CN\taafsusrmgr.hlp >> Lang_Simp_Chinese_Files.fgl -echo file17=%IS5_HELP%\zh_CN\afs-cc.cnt >> Lang_Simp_Chinese_Files.fgl -echo file18=%IS5_HELP%\zh_CN\afs-cc.hlp >> Lang_Simp_Chinese_Files.fgl -echo file19=%IS5_HELP%\zh_CN\afs-light.cnt >> Lang_Simp_Chinese_Files.fgl -echo file20=%IS5_HELP%\zh_CN\afs-light.hlp >> Lang_Simp_Chinese_Files.fgl -echo file21=%IS5_HELP%\zh_CN\taafscfg.cnt >> Lang_Simp_Chinese_Files.fgl -echo file22=%IS5_HELP%\zh_CN\taafscfg.hlp >> Lang_Simp_Chinese_Files.fgl -echo. >> Lang_Simp_Chinese_Files.fgl -echo [General] >> Lang_Simp_Chinese_Files.fgl -echo Type=FILELIST >> Lang_Simp_Chinese_Files.fgl -echo Version=1.00.000 >> Lang_Simp_Chinese_Files.fgl - - -rem -------------- Lang_Trad_Chinese_Files.fgl ------------------------- - -echo [TopDir] > Lang_Trad_Chinese_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1028.dll >> Lang_Trad_Chinese_Files.fgl -echo file11=%IS5_HELP%\zh_TW\afs-nt.hlp >> Lang_Trad_Chinese_Files.fgl -echo file12=%IS5_HELP%\zh_TW\afs-nt.cnt >> Lang_Trad_Chinese_Files.fgl -echo file13=%IS5_HELP%\zh_TW\taafssvrmgr.cnt >> Lang_Trad_Chinese_Files.fgl -echo file14=%IS5_HELP%\zh_TW\taafssvrmgr.hlp >> Lang_Trad_Chinese_Files.fgl -echo file15=%IS5_HELP%\zh_TW\taafsusrmgr.cnt >> Lang_Trad_Chinese_Files.fgl -echo file16=%IS5_HELP%\zh_TW\taafsusrmgr.hlp >> Lang_Trad_Chinese_Files.fgl -echo file17=%IS5_HELP%\zh_TW\afs-cc.cnt >> Lang_Trad_Chinese_Files.fgl -echo file18=%IS5_HELP%\zh_TW\afs-cc.hlp >> Lang_Trad_Chinese_Files.fgl -echo file19=%IS5_HELP%\zh_TW\afs-light.cnt >> Lang_Trad_Chinese_Files.fgl -echo file20=%IS5_HELP%\zh_TW\afs-light.hlp >> Lang_Trad_Chinese_Files.fgl -echo file21=%IS5_HELP%\zh_TW\taafscfg.cnt >> Lang_Trad_Chinese_Files.fgl -echo file22=%IS5_HELP%\zh_TW\taafscfg.hlp >> Lang_Trad_Chinese_Files.fgl -echo. >> Lang_Trad_Chinese_Files.fgl -echo [General] >> Lang_Trad_Chinese_Files.fgl -echo Type=FILELIST >> Lang_Trad_Chinese_Files.fgl -echo Version=1.00.000 >> Lang_Trad_Chinese_Files.fgl - - -rem -------------- Lang_Korean_Files.fgl ------------------------------- - -echo [TopDir] > Lang_Korean_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1042.dll >> Lang_Korean_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1042.dll >> Lang_Korean_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1042.dll >> Lang_Korean_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1042.dll >> Lang_Korean_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1042.dll >> Lang_Korean_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1042.dll >> Lang_Korean_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1042.dll >> Lang_Korean_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1042.dll >> Lang_Korean_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1042.dll >> Lang_Korean_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1042.dll >> Lang_Korean_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1042.dll >> Lang_Korean_Files.fgl -echo file11=%IS5_HELP%\ko_KR\afs-nt.hlp >> Lang_Korean_Files.fgl -echo file12=%IS5_HELP%\ko_KR\afs-nt.cnt >> Lang_Korean_Files.fgl -echo file13=%IS5_HELP%\ko_KR\taafssvrmgr.cnt >> Lang_Korean_Files.fgl -echo file14=%IS5_HELP%\ko_KR\taafssvrmgr.hlp >> Lang_Korean_Files.fgl -echo file15=%IS5_HELP%\ko_KR\taafsusrmgr.cnt >> Lang_Korean_Files.fgl -echo file16=%IS5_HELP%\ko_KR\taafsusrmgr.hlp >> Lang_Korean_Files.fgl -echo file17=%IS5_HELP%\ko_KR\afs-cc.cnt >> Lang_Korean_Files.fgl -echo file18=%IS5_HELP%\ko_KR\afs-cc.hlp >> Lang_Korean_Files.fgl -echo file19=%IS5_HELP%\ko_KR\afs-light.cnt >> Lang_Korean_Files.fgl -echo file20=%IS5_HELP%\ko_KR\afs-light.hlp >> Lang_Korean_Files.fgl -echo file21=%IS5_HELP%\ko_KR\taafscfg.cnt >> Lang_Korean_Files.fgl -echo file22=%IS5_HELP%\ko_KR\taafscfg.hlp >> Lang_Korean_Files.fgl -echo. >> Lang_Korean_Files.fgl -echo [General] >> Lang_Korean_Files.fgl -echo Type=FILELIST >> Lang_Korean_Files.fgl -echo Version=1.00.000 >> Lang_Korean_Files.fgl - - -rem -------------- Lang_Japanese_Files.fgl ----------------------------- - -echo [TopDir] > Lang_Japanese_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1041.dll >> Lang_Japanese_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1041.dll >> Lang_Japanese_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1041.dll >> Lang_Japanese_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1041.dll >> Lang_Japanese_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1041.dll >> Lang_Japanese_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1041.dll >> Lang_Japanese_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1041.dll >> Lang_Japanese_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1041.dll >> Lang_Japanese_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1041.dll >> Lang_Japanese_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1041.dll >> Lang_Japanese_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1041.dll >> Lang_Japanese_Files.fgl -echo file11=%IS5_HELP%\ja_JP\afs-nt.hlp >> Lang_Japanese_Files.fgl -echo file12=%IS5_HELP%\ja_JP\afs-nt.cnt >> Lang_Japanese_Files.fgl -echo file13=%IS5_HELP%\ja_JP\taafssvrmgr.cnt >> Lang_Japanese_Files.fgl -echo file14=%IS5_HELP%\ja_JP\taafssvrmgr.hlp >> Lang_Japanese_Files.fgl -echo file15=%IS5_HELP%\ja_JP\taafsusrmgr.cnt >> Lang_Japanese_Files.fgl -echo file16=%IS5_HELP%\ja_JP\taafsusrmgr.hlp >> Lang_Japanese_Files.fgl -echo file17=%IS5_HELP%\ja_JP\afs-cc.cnt >> Lang_Japanese_Files.fgl -echo file18=%IS5_HELP%\ja_JP\afs-cc.hlp >> Lang_Japanese_Files.fgl -echo file19=%IS5_HELP%\ja_JP\afs-light.cnt >> Lang_Japanese_Files.fgl -echo file20=%IS5_HELP%\ja_JP\afs-light.hlp >> Lang_Japanese_Files.fgl -echo file21=%IS5_HELP%\ja_JP\taafscfg.cnt >> Lang_Japanese_Files.fgl -echo file22=%IS5_HELP%\ja_JP\taafscfg.hlp >> Lang_Japanese_Files.fgl -echo. >> Lang_Japanese_Files.fgl -echo [General] >> Lang_Japanese_Files.fgl -echo Type=FILELIST >> Lang_Japanese_Files.fgl -echo Version=1.00.000 >> Lang_Japanese_Files.fgl - - -rem -------------- Lang_German_Files.fgl ----------------------------- - -echo [TopDir] > Lang_German_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1032.dll >> Lang_German_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1032.dll >> Lang_German_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1032.dll >> Lang_German_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1032.dll >> Lang_German_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1032.dll >> Lang_German_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1032.dll >> Lang_German_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1032.dll >> Lang_German_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1032.dll >> Lang_German_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1032.dll >> Lang_German_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1032.dll >> Lang_German_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1032.dll >> Lang_German_Files.fgl -echo file11=%IS5_HELP%\de_DE\afs-nt.hlp >> Lang_German_Files.fgl -echo file12=%IS5_HELP%\de_DE\afs-nt.cnt >> Lang_German_Files.fgl -echo file13=%IS5_HELP%\de_DE\taafssvrmgr.cnt >> Lang_German_Files.fgl -echo file14=%IS5_HELP%\de_DE\taafssvrmgr.hlp >> Lang_German_Files.fgl -echo file15=%IS5_HELP%\de_DE\taafsusrmgr.cnt >> Lang_German_Files.fgl -echo file16=%IS5_HELP%\de_DE\taafsusrmgr.hlp >> Lang_German_Files.fgl -echo file17=%IS5_HELP%\de_DE\afs-cc.cnt >> Lang_German_Files.fgl -echo file18=%IS5_HELP%\de_DE\afs-cc.hlp >> Lang_German_Files.fgl -echo file19=%IS5_HELP%\de_DE\afs-light.cnt >> Lang_German_Files.fgl -echo file20=%IS5_HELP%\de_DE\afs-light.hlp >> Lang_German_Files.fgl -echo file21=%IS5_HELP%\de_DE\taafscfg.cnt >> Lang_German_Files.fgl -echo file22=%IS5_HELP%\de_DE\taafscfg.hlp >> Lang_German_Files.fgl -echo. >> Lang_German_Files.fgl -echo [General] >> Lang_German_Files.fgl -echo Type=FILELIST >> Lang_German_Files.fgl -echo Version=1.00.000 >> Lang_German_Files.fgl - - -rem -------------- Lang_Spanish_Files.fgl ----------------------------- - -echo [TopDir] > Lang_Spanish_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1034.dll >> Lang_Spanish_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1034.dll >> Lang_Spanish_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1034.dll >> Lang_Spanish_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1034.dll >> Lang_Spanish_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1034.dll >> Lang_Spanish_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1034.dll >> Lang_Spanish_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1034.dll >> Lang_Spanish_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1034.dll >> Lang_Spanish_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1034.dll >> Lang_Spanish_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1034.dll >> Lang_Spanish_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1034.dll >> Lang_Spanish_Files.fgl -echo file11=%IS5_HELP%\es_ES\afs-nt.hlp >> Lang_Spanish_Files.fgl -echo file12=%IS5_HELP%\es_ES\afs-nt.cnt >> Lang_Spanish_Files.fgl -echo file13=%IS5_HELP%\es_ES\taafssvrmgr.cnt >> Lang_Spanish_Files.fgl -echo file14=%IS5_HELP%\es_ES\taafssvrmgr.hlp >> Lang_Spanish_Files.fgl -echo file15=%IS5_HELP%\es_ES\taafsusrmgr.cnt >> Lang_Spanish_Files.fgl -echo file16=%IS5_HELP%\es_ES\taafsusrmgr.hlp >> Lang_Spanish_Files.fgl -echo file17=%IS5_HELP%\es_ES\afs-cc.cnt >> Lang_Spanish_Files.fgl -echo file18=%IS5_HELP%\es_ES\afs-cc.hlp >> Lang_Spanish_Files.fgl -echo file19=%IS5_HELP%\es_ES\afs-light.cnt >> Lang_Spanish_Files.fgl -echo file20=%IS5_HELP%\es_ES\afs-light.hlp >> Lang_Spanish_Files.fgl -echo file21=%IS5_HELP%\es_ES\taafscfg.cnt >> Lang_Spanish_Files.fgl -echo file22=%IS5_HELP%\es_ES\taafscfg.hlp >> Lang_Spanish_Files.fgl -echo. >> Lang_Spanish_Files.fgl -echo [General] >> Lang_Spanish_Files.fgl -echo Type=FILELIST >> Lang_Spanish_Files.fgl -echo Version=1.00.000 >> Lang_Spanish_Files.fgl - - -rem -------------- Lang_Portuguese_Files.fgl ----------------------------- - -echo [TopDir] > Lang_Portuguese_Files.fgl -echo file0=%IS5_DEST%\root.server\usr\afs\bin\afseventmsg_1046.dll >> Lang_Portuguese_Files.fgl -echo file1=%IS5_DEST%\root.server\usr\afs\bin\afs_setup_utils_1046.dll >> Lang_Portuguese_Files.fgl -echo file2=%IS5_DEST%\root.server\usr\afs\bin\afsserver_1046.dll >> Lang_Portuguese_Files.fgl -echo file3=%IS5_DEST%\root.server\usr\afs\bin\afssvrcfg_1046.dll >> Lang_Portuguese_Files.fgl -echo file4=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAccountManager_1046.dll >> Lang_Portuguese_Files.fgl -echo file5=%IS5_DEST%\root.server\usr\afs\bin\TaAfsAppLib_1046.dll >> Lang_Portuguese_Files.fgl -echo file6=%IS5_DEST%\root.server\usr\afs\bin\TaAfsServerManager_1046.dll >> Lang_Portuguese_Files.fgl -echo file7=%IS5_DEST%\root.client\usr\vice\etc\afscreds_1046.dll >> Lang_Portuguese_Files.fgl -echo file8=%IS5_DEST%\root.client\usr\vice\etc\afs_config_1046.dll >> Lang_Portuguese_Files.fgl -echo file9=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa_1046.dll >> Lang_Portuguese_Files.fgl -echo file10=%IS5_DEST%\root.client\usr\vice\etc\afs_shl_ext_1046.dll >> Lang_Portuguese_Files.fgl -echo file11=%IS5_HELP%\pt_BR\afs-nt.hlp >> Lang_Portuguese_Files.fgl -echo file12=%IS5_HELP%\pt_BR\afs-nt.cnt >> Lang_Portuguese_Files.fgl -echo file13=%IS5_HELP%\pt_BR\taafssvrmgr.cnt >> Lang_Portuguese_Files.fgl -echo file14=%IS5_HELP%\pt_BR\taafssvrmgr.hlp >> Lang_Portuguese_Files.fgl -echo file15=%IS5_HELP%\pt_BR\taafsusrmgr.cnt >> Lang_Portuguese_Files.fgl -echo file16=%IS5_HELP%\pt_BR\taafsusrmgr.hlp >> Lang_Portuguese_Files.fgl -echo file17=%IS5_HELP%\pt_BR\afs-cc.cnt >> Lang_Portuguese_Files.fgl -echo file18=%IS5_HELP%\pt_BR\afs-cc.hlp >> Lang_Portuguese_Files.fgl -echo file19=%IS5_HELP%\pt_BR\afs-light.cnt >> Lang_Portuguese_Files.fgl -echo file20=%IS5_HELP%\pt_BR\afs-light.hlp >> Lang_Portuguese_Files.fgl -echo file21=%IS5_HELP%\pt_BR\taafscfg.cnt >> Lang_Portuguese_Files.fgl -echo file22=%IS5_HELP%\pt_BR\taafscfg.hlp >> Lang_Portuguese_Files.fgl -echo. >> Lang_Portuguese_Files.fgl -echo [General] >> Lang_Portuguese_Files.fgl -echo Type=FILELIST >> Lang_Portuguese_Files.fgl -echo Version=1.00.000 >> Lang_Portuguese_Files.fgl - - -rem -------------- Client_Afs_Header_Files.fgl -------------------------- - -echo [TopDir] > Client_Afs_Header_Files.fgl -echo file0=%IS5_INCL%\afs\afs_args.h >> Client_Afs_Header_Files.fgl -echo file1=%IS5_INCL%\afs\debug.h >> Client_Afs_Header_Files.fgl -echo file2=%IS5_INCL%\afs\param.h >> Client_Afs_Header_Files.fgl -echo file3=%IS5_INCL%\afs\afs_sysnames.h >> Client_Afs_Header_Files.fgl -echo file4=%IS5_INCL%\afs\permit_xprt.h >> Client_Afs_Header_Files.fgl -echo file5=%IS5_INCL%\afs\stds.h >> Client_Afs_Header_Files.fgl -echo file6=%IS5_INCL%\afs\icl.h >> Client_Afs_Header_Files.fgl -echo file7=%IS5_INCL%\afs\procmgmt.h >> Client_Afs_Header_Files.fgl -echo file8=%IS5_INCL%\afs\afsutil.h >> Client_Afs_Header_Files.fgl -echo file9=%IS5_INCL%\afs\assert.h >> Client_Afs_Header_Files.fgl -echo file10=%IS5_INCL%\afs\dirent.h >> Client_Afs_Header_Files.fgl -echo file11=%IS5_INCL%\afs\errors.h >> Client_Afs_Header_Files.fgl -echo file12=%IS5_INCL%\afs\itc.h >> Client_Afs_Header_Files.fgl -echo file13=%IS5_INCL%\afs\vice.h >> Client_Afs_Header_Files.fgl -echo file14=%IS5_INCL%\afs\pthread_glock.h >> Client_Afs_Header_Files.fgl -echo file15=%IS5_INCL%\afs\errmap_nt.h >> Client_Afs_Header_Files.fgl -echo file16=%IS5_INCL%\afs\dirpath.h >> Client_Afs_Header_Files.fgl -echo file17=%IS5_INCL%\afs\ktime.h >> Client_Afs_Header_Files.fgl -echo file18=%IS5_INCL%\afs\fileutil.h >> Client_Afs_Header_Files.fgl -echo file19=%IS5_INCL%\afs\secutil_nt.h >> Client_Afs_Header_Files.fgl -echo file20=%IS5_INCL%\afs\com_err.h >> Client_Afs_Header_Files.fgl -echo file21=%IS5_INCL%\afs\error_table.h >> Client_Afs_Header_Files.fgl -echo file22=%IS5_INCL%\afs\mit-sipb-cr.h >> Client_Afs_Header_Files.fgl -echo file23=%IS5_INCL%\afs\cmd.h >> Client_Afs_Header_Files.fgl -echo file24=%IS5_INCL%\afs\rxgen_consts.h >> Client_Afs_Header_Files.fgl -echo file25=%IS5_INCL%\afs\afsint.h >> Client_Afs_Header_Files.fgl -echo file26=%IS5_INCL%\afs\afscbint.h >> Client_Afs_Header_Files.fgl -echo file27=%IS5_INCL%\afs\audit.h >> Client_Afs_Header_Files.fgl -echo file28=%IS5_INCL%\afs\acl.h >> Client_Afs_Header_Files.fgl -echo file29=%IS5_INCL%\afs\prs_fs.h >> Client_Afs_Header_Files.fgl -echo file30=%IS5_INCL%\afs\afsd.h >> Client_Afs_Header_Files.fgl -echo file31=%IS5_INCL%\afs\cm.h >> Client_Afs_Header_Files.fgl -echo file32=%IS5_INCL%\afs\cm_buf.h >> Client_Afs_Header_Files.fgl -echo file33=%IS5_INCL%\afs\cm_cell.h >> Client_Afs_Header_Files.fgl -echo file34=%IS5_INCL%\afs\cm_config.h >> Client_Afs_Header_Files.fgl -echo file35=%IS5_INCL%\afs\cm_conn.h >> Client_Afs_Header_Files.fgl -echo file36=%IS5_INCL%\afs\cm_ioctl.h >> Client_Afs_Header_Files.fgl -echo file37=%IS5_INCL%\afs\cm_scache.h >> Client_Afs_Header_Files.fgl -echo file38=%IS5_INCL%\afs\cm_server.h >> Client_Afs_Header_Files.fgl -echo file39=%IS5_INCL%\afs\cm_user.h >> Client_Afs_Header_Files.fgl -echo file40=%IS5_INCL%\afs\cm_utils.h >> Client_Afs_Header_Files.fgl -echo file41=%IS5_INCL%\afs\fs_utils.h >> Client_Afs_Header_Files.fgl -echo file42=%IS5_INCL%\afs\krb.h >> Client_Afs_Header_Files.fgl -echo file43=%IS5_INCL%\afs\krb_prot.h >> Client_Afs_Header_Files.fgl -echo file44=%IS5_INCL%\afs\smb.h >> Client_Afs_Header_Files.fgl -echo file45=%IS5_INCL%\afs\smb3.h >> Client_Afs_Header_Files.fgl -echo file46=%IS5_INCL%\afs\smb_iocons.h >> Client_Afs_Header_Files.fgl -echo file47=%IS5_INCL%\afs\smb_ioctl.h >> Client_Afs_Header_Files.fgl -echo file48=%IS5_INCL%\afs\afsrpc.h >> Client_Afs_Header_Files.fgl -echo file49=%IS5_INCL%\afs\afssyscalls.h >> Client_Afs_Header_Files.fgl -echo file50=%IS5_INCL%\afs\pioctl_nt.h >> Client_Afs_Header_Files.fgl -echo file51=%IS5_INCL%\afs\auth.h >> Client_Afs_Header_Files.fgl -echo file52=%IS5_INCL%\afs\cellconfig.h >> Client_Afs_Header_Files.fgl -echo file53=%IS5_INCL%\afs\keys.h >> Client_Afs_Header_Files.fgl -echo file54=%IS5_INCL%\afs\ptserver.h >> Client_Afs_Header_Files.fgl -echo file55=%IS5_INCL%\afs\ptint.h >> Client_Afs_Header_Files.fgl -echo file56=%IS5_INCL%\afs\pterror.h >> Client_Afs_Header_Files.fgl -echo file57=%IS5_INCL%\afs\ptclient.h >> Client_Afs_Header_Files.fgl -echo file58=%IS5_INCL%\afs\prserver.h >> Client_Afs_Header_Files.fgl -echo file59=%IS5_INCL%\afs\print.h >> Client_Afs_Header_Files.fgl -echo file60=%IS5_INCL%\afs\prerror.h >> Client_Afs_Header_Files.fgl -echo file61=%IS5_INCL%\afs\prclient.h >> Client_Afs_Header_Files.fgl -echo file62=%IS5_INCL%\afs\kautils.h >> Client_Afs_Header_Files.fgl -echo file63=%IS5_INCL%\afs\kauth.h >> Client_Afs_Header_Files.fgl -echo file64=%IS5_INCL%\afs\kaport.h >> Client_Afs_Header_Files.fgl -echo file65=%IS5_INCL%\afs\vl_opcodes.h >> Client_Afs_Header_Files.fgl -echo file66=%IS5_INCL%\afs\vlserver.h >> Client_Afs_Header_Files.fgl -echo file67=%IS5_INCL%\afs\vldbint.h >> Client_Afs_Header_Files.fgl -echo file68=%IS5_INCL%\afs\usd.h >> Client_Afs_Header_Files.fgl -echo file69=%IS5_INCL%\afs\bubasics.h >> Client_Afs_Header_Files.fgl -echo file70=%IS5_INCL%\afs\butc.h >> Client_Afs_Header_Files.fgl -echo file71=%IS5_INCL%\afs\bumon.h >> Client_Afs_Header_Files.fgl -echo file72=%IS5_INCL%\afs\butm.h >> Client_Afs_Header_Files.fgl -echo file73=%IS5_INCL%\afs\tcdata.h >> Client_Afs_Header_Files.fgl -echo file74=%IS5_INCL%\afs\budb.h >> Client_Afs_Header_Files.fgl -echo file75=%IS5_INCL%\afs\budb_errs.h >> Client_Afs_Header_Files.fgl -echo file76=%IS5_INCL%\afs\budb_client.h >> Client_Afs_Header_Files.fgl -echo file77=%IS5_INCL%\afs\dir.h >> Client_Afs_Header_Files.fgl -echo file78=%IS5_INCL%\afs\fssync.h >> Client_Afs_Header_Files.fgl -echo file79=%IS5_INCL%\afs\ihandle.h >> Client_Afs_Header_Files.fgl -echo file80=%IS5_INCL%\afs\nfs.h >> Client_Afs_Header_Files.fgl -echo file81=%IS5_INCL%\afs\ntops.h >> Client_Afs_Header_Files.fgl -echo file82=%IS5_INCL%\afs\partition.h >> Client_Afs_Header_Files.fgl -echo file83=%IS5_INCL%\afs\viceinode.h >> Client_Afs_Header_Files.fgl -echo file84=%IS5_INCL%\afs\vnode.h >> Client_Afs_Header_Files.fgl -echo file85=%IS5_INCL%\afs\volume.h >> Client_Afs_Header_Files.fgl -echo file86=%IS5_INCL%\afs\voldefs.h >> Client_Afs_Header_Files.fgl -echo file87=%IS5_INCL%\afs\volser.h >> Client_Afs_Header_Files.fgl -echo file88=%IS5_INCL%\afs\volint.h >> Client_Afs_Header_Files.fgl -echo file89=%IS5_INCL%\afs\fs_stats.h >> Client_Afs_Header_Files.fgl -echo file90=%IS5_INCL%\afs\bosint.h >> Client_Afs_Header_Files.fgl -echo file91=%IS5_INCL%\afs\bnode.h >> Client_Afs_Header_Files.fgl -echo. >> Client_Afs_Header_Files.fgl -echo [General] >> Client_Afs_Header_Files.fgl -echo Type=FILELIST >> Client_Afs_Header_Files.fgl -echo Version=1.00.000 >> Client_Afs_Header_Files.fgl - - -rem -------------- Client_Rx_Header_Files.fgl --------------------------- - -echo [TopDir] > Client_Rx_Header_Files.fgl -echo file0=%IS5_INCL%\rx\rx.h >> Client_Rx_Header_Files.fgl -echo file1=%IS5_INCL%\rx\rx_packet.h >> Client_Rx_Header_Files.fgl -echo file2=%IS5_INCL%\rx\rx_user.h >> Client_Rx_Header_Files.fgl -echo file3=%IS5_INCL%\rx\rx_event.h >> Client_Rx_Header_Files.fgl -echo file4=%IS5_INCL%\rx\rx_queue.h >> Client_Rx_Header_Files.fgl -echo file5=%IS5_INCL%\rx\rx_globals.h >> Client_Rx_Header_Files.fgl -echo file6=%IS5_INCL%\rx\rx_clock.h >> Client_Rx_Header_Files.fgl -echo file7=%IS5_INCL%\rx\rx_misc.h >> Client_Rx_Header_Files.fgl -echo file8=%IS5_INCL%\rx\rx_multi.h >> Client_Rx_Header_Files.fgl -echo file9=%IS5_INCL%\rx\rx_null.h >> Client_Rx_Header_Files.fgl -echo file10=%IS5_INCL%\rx\rx_lwp.h >> Client_Rx_Header_Files.fgl -echo file11=%IS5_INCL%\rx\rx_pthread.h >> Client_Rx_Header_Files.fgl -echo file12=%IS5_INCL%\rx\rx_xmit_nt.h >> Client_Rx_Header_Files.fgl -echo file13=%IS5_INCL%\rx\xdr.h >> Client_Rx_Header_Files.fgl -echo file14=%IS5_INCL%\rx\rxkad.h >> Client_Rx_Header_Files.fgl -echo. >> Client_Rx_Header_Files.fgl -echo [General] >> Client_Rx_Header_Files.fgl -echo Type=FILELIST >> Client_Rx_Header_Files.fgl -echo Version=1.00.000 >> Client_Rx_Header_Files.fgl - - -rem -------------- Client_Main_Header_Files.fgl ------------------------- - -echo [TopDir] > Client_Main_Header_Files.fgl -echo file0=%IS5_INCL%\lock.h >> Client_Main_Header_Files.fgl -echo file1=%IS5_INCL%\lwp.h >> Client_Main_Header_Files.fgl -echo file2=%IS5_INCL%\preempt.h >> Client_Main_Header_Files.fgl -echo file3=%IS5_INCL%\timer.h >> Client_Main_Header_Files.fgl -echo file4=%IS5_INCL%\des.h >> Client_Main_Header_Files.fgl -echo file5=%IS5_INCL%\des_conf.h >> Client_Main_Header_Files.fgl -echo file6=%IS5_INCL%\mit-cpyright.h >> Client_Main_Header_Files.fgl -echo file7=%IS5_INCL%\des_odd.h >> Client_Main_Header_Files.fgl -echo file8=%IS5_INCL%\crypt.h >> Client_Main_Header_Files.fgl -echo file9=%IS5_INCL%\pthread.h >> Client_Main_Header_Files.fgl -echo file10=%IS5_INCL%\dbrpc.h >> Client_Main_Header_Files.fgl -echo file11=%IS5_INCL%\basic.h >> Client_Main_Header_Files.fgl -echo file12=%IS5_INCL%\osidebug.h >> Client_Main_Header_Files.fgl -echo file13=%IS5_INCL%\osiltype.h >> Client_Main_Header_Files.fgl -echo file14=%IS5_INCL%\osistatl.h >> Client_Main_Header_Files.fgl -echo file15=%IS5_INCL%\trylock.h >> Client_Main_Header_Files.fgl -echo file16=%IS5_INCL%\main.h >> Client_Main_Header_Files.fgl -echo file17=%IS5_INCL%\osibasel.h >> Client_Main_Header_Files.fgl -echo file18=%IS5_INCL%\osifd.h >> Client_Main_Header_Files.fgl -echo file19=%IS5_INCL%\osiqueue.h >> Client_Main_Header_Files.fgl -echo file20=%IS5_INCL%\osiutils.h >> Client_Main_Header_Files.fgl -echo file21=%IS5_INCL%\osi.h >> Client_Main_Header_Files.fgl -echo file22=%IS5_INCL%\osidb.h >> Client_Main_Header_Files.fgl -echo file23=%IS5_INCL%\osilog.h >> Client_Main_Header_Files.fgl -echo file24=%IS5_INCL%\osisleep.h >> Client_Main_Header_Files.fgl -echo file25=%IS5_INCL%\perf.h >> Client_Main_Header_Files.fgl -echo file26=%IS5_INCL%\ubik.h >> Client_Main_Header_Files.fgl -echo file27=%IS5_INCL%\ubik_int.h >> Client_Main_Header_Files.fgl -echo. >> Client_Main_Header_Files.fgl -echo [General] >> Client_Main_Header_Files.fgl -echo Type=FILELIST >> Client_Main_Header_Files.fgl -echo Version=1.00.000 >> Client_Main_Header_Files.fgl - - -rem -------------- Client_Sample_Files.fgl ------------------------------ - -echo [TopDir] > Client_Sample_Files.fgl -echo file0=%IS5_WINNT%\afsd\sample\token.c >> Client_Sample_Files.fgl -echo. >> Client_Sample_Files.fgl -echo [General] >> Client_Sample_Files.fgl -echo Type=FILELIST >> Client_Sample_Files.fgl -echo Version=1.00.000 >> Client_Sample_Files.fgl - -:EOF diff --git a/src/WINNT/install/InstallShield5/GenIS5.ipr.bat b/src/WINNT/install/InstallShield5/GenIS5.ipr.bat deleted file mode 100644 index 312e22a0a7..0000000000 --- a/src/WINNT/install/InstallShield5/GenIS5.ipr.bat +++ /dev/null @@ -1,67 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -echo [Language] > InstallShield5.ipr -echo LanguageSupport0=0009 >> InstallShield5.ipr -echo LanguageSupport1=0416 >> InstallShield5.ipr -echo LanguageSupport2=0804 >> InstallShield5.ipr -echo LanguageSupport3=0404 >> InstallShield5.ipr -echo LanguageSupport4=0007 >> InstallShield5.ipr -echo LanguageSupport5=0011 >> InstallShield5.ipr -echo LanguageSupport6=0012 >> InstallShield5.ipr -echo LanguageSupport7=000a >> InstallShield5.ipr -echo. >> InstallShield5.ipr -echo [OperatingSystem] >> InstallShield5.ipr -echo OSSupport=0000000000010000 >> InstallShield5.ipr -echo. >> InstallShield5.ipr -echo [Data] >> InstallShield5.ipr -echo CurrentMedia=OpenAFS >> InstallShield5.ipr -echo set_mifserial= >> InstallShield5.ipr -echo ProductName=OpenAFS for Windows >> InstallShield5.ipr -echo CurrentComponentDef=Default.cdf >> InstallShield5.ipr -echo set_dlldebug=No >> InstallShield5.ipr -echo AppExe= >> InstallShield5.ipr -echo DevEnvironment=Microsoft Visual C++ >> InstallShield5.ipr -echo set_mif=No >> InstallShield5.ipr -echo set_testmode=No >> InstallShield5.ipr -echo Instructions=Instructions.txt >> InstallShield5.ipr -echo EmailAddresss= >> InstallShield5.ipr -echo SummaryText= >> InstallShield5.ipr -echo Department= >> InstallShield5.ipr -echo Type=Generic Application >> InstallShield5.ipr -echo Author= >> InstallShield5.ipr -echo HomeURL= >> InstallShield5.ipr -echo InstallRoot=. >> InstallShield5.ipr -echo set_level=Level 3 >> InstallShield5.ipr -echo InstallationGUID=c982a6e4-4252-11d2-852e-0000b459dea3 >> InstallShield5.ipr -echo Version=1.00.000 >> InstallShield5.ipr -echo set_miffile=Status.mif >> InstallShield5.ipr -echo set_args= >> InstallShield5.ipr -echo set_maxerr=50 >> InstallShield5.ipr -echo Notes=Notes.txt >> InstallShield5.ipr -echo CurrentFileGroupDef=Default.fdf >> InstallShield5.ipr -echo set_dllcmdline= >> InstallShield5.ipr -echo set_warnaserr=No >> InstallShield5.ipr -echo Copyright= >> InstallShield5.ipr -echo set_preproc= >> InstallShield5.ipr -echo Category= >> InstallShield5.ipr -echo CurrentPlatform= >> InstallShield5.ipr -echo set_compileb4build=No >> InstallShield5.ipr -echo set_crc=Yes >> InstallShield5.ipr -echo set_maxwarn=50 >> InstallShield5.ipr -echo Description=Description.txt >> InstallShield5.ipr -echo CompanyName=OpenAFS >> InstallShield5.ipr -echo CurrentLanguage=English >> InstallShield5.ipr -echo. >> InstallShield5.ipr -echo [MediaInfo] >> InstallShield5.ipr -echo mediadata0=OpenAFS/Media\OpenAFS >> InstallShield5.ipr -echo. >> InstallShield5.ipr -echo [General] >> InstallShield5.ipr -echo Type=INSTALLMAIN >> InstallShield5.ipr -echo Version=1.20.000 >> InstallShield5.ipr - diff --git a/src/WINNT/install/InstallShield5/HowToSetTheVersion.txt b/src/WINNT/install/InstallShield5/HowToSetTheVersion.txt deleted file mode 100755 index 70537ce794..0000000000 --- a/src/WINNT/install/InstallShield5/HowToSetTheVersion.txt +++ /dev/null @@ -1,30 +0,0 @@ -Copyright 2000, International Business Machines Corporation and others. -All Rights Reserved. -This software has been released under the terms of the IBM Public -License. For details, see the LICENSE file in the top-level source -directory or online at http://www.openafs.org/dl/license10.html -HOW TO SET THE AFS FOR WINDOWS VERSION INFORMATION - -Set AFSPRODUCT_VERSION in the following files: -src\config\NTMakefile.i386_win95 -src\config\NTMakefile.i386_nt40 - -The format of this variable should be -x.y.z.p or x.y.z p - -x= major verson (1-9) -y= minor verson (1-9) -z.p= patch level z=(1-9) p=(1-99 or a-z) - -For example: -AFSPRODUCT_VERSION=1.1.1 a -AFSPRODUCT_VERSION=1.1.1.1 -AFSPRODUCT_VERSION=1.1.101 -AFSPRODUCT_VERSION=1.1.1a - -These examples represent different forms of the same version. -However the version will be displayed to the user as they are shown! - - - - diff --git a/src/WINNT/install/InstallShield5/NTMakefile b/src/WINNT/install/InstallShield5/NTMakefile deleted file mode 100644 index 1323794028..0000000000 --- a/src/WINNT/install/InstallShield5/NTMakefile +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -RELDIR=WINNT\install\InstallShield5 -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -# Install comments -# Don't use '=' in the following strings! -# WELCOMEMESSAGE=Display during installation process -# AFSBUILDCOMMENTS=Displayed in properity page for install file -# CELLSERVDB_CONFIGNAME = name of configuration file (ThisCell) - -CELLSERVDB_CONFIGNAME=afsdcell.ini -WELCOMEMESSAGE=Default Configuration Information:\nBuild:*DatE* *TimE* Ver:$(AFSPRODUCT_VERSION)\nCellname:$(CELLNAME_DEFAULT)\nCellSrvDB:$(CELLSERVDB_INSTALL) -AFSBUILDCOMMENTS=Build:*DatE* *TimE* CellServDB:$(CELLSERVDB_INSTALL) - -#CHECK which OS we are using to avoid using the wrong options -!IF (([$(DESTDIR)\bin\util_cr.exe _ xp w2])==1) -XCOPY= xcopy /s/e/y -!ELSE -XCOPY= xcopy /s/e -!ENDIF - -############################################################################ - -prep: AFS_component_version_number.txt - $(DESTDIR)\bin\util_cr.exe } "$(AFSPRODUCT_VERSION)" ".\lang\en_US\value.txt" "$(OUT)\lang\en_US\value.shl" - $(DESTDIR)\bin\util_cr.exe } "$(AFSPRODUCT_VERSION)" "default.txt" "default.rge" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\lang\en_US\value.shl" "[DATA] CELLSERVDB_CONFIGNAME=$(CELLSERVDB_CONFIGNAME)" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\lang\en_US\value.shl" "[DATA] CELLNAME_DEFAULT=$(CELLNAME_DEFAULT)" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\lang\en_US\value.shl" "[DATA] CELLSERVDB_INSTALL=$(CELLSERVDB_INSTALL)" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\lang\en_US\value.shl" "[DATA] CELLSERVDB_WEB=$(CELLSERVDB_WEB)" -!IF "$(WELCOMEMESSAGE)" != "" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\lang\en_US\value.shl" "[DATA] WELCOME_MESSAGE=$(WELCOMEMESSAGE)" -!ENDIF -! IF ((EXIST("$(ISWEB)")) &&("$(ISWEB)"!="")) - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\packageweb.pfw" "[Options] Version=$(AFSPRODUCT_VERSION)" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\packageweb.pfw" "[Options] Comments=$(AFSBUILDCOMMENTS)" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\packageweb.pfw" "[Options] ApplicationName=AFSforWindows" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\packageweb.pfw" "[Options] Company=Open AFS" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\packageweb.pfw" "[Options] Title=Open AFS for Windows" - $(DESTDIR)\bin\util_cr.exe @ "$(OUT)\packageweb.pfw" "[Options] OutputSpec="$(DESTDIR)\WinInstall\PackageWeb\AFSforWindows.exe" -! ENDIF - CreateISDirTree.bat - ScatterFiles.bat - CreateGeneratedFiles.bat - CompileScript.bat - $(COPY) $(SYSTEMROOT)\SYSTEM32\wininet.dll ".\Setup Files\Compressed Files\0009-English\Intel 32\." - $(COPY) $(SYSTEMROOT)\SYSTEM32\shlwapi.dll ".\Setup Files\Compressed Files\0009-English\Intel 32\." - $(COPY) $(DESTDIR)\WinInstall\Config\_isuser.dll ".\Setup Files\Compressed Files\0009-English\Intel 32\." - $(COPY) $(DESTDIR)\WinInstall\Config\getwebdll.dll ".\Setup Files\Compressed Files\0009-English\Intel 32\." - $(COPY) $(DESTDIR)\WinInstall\Config\$(CELLSERVDB_INSTALL) ".\Setup Files\Compressed Files\0009-English\Intel 32\$(CELLSERVDB_CONFIGNAME)" - $(DESTDIR)\bin\util_cr.exe ~ ".\Setup Files\Compressed Files\0009-English\Intel 32\$(CELLSERVDB_CONFIGNAME)" - $(DESTDIR)\bin\util_cr.exe ~ ".\Setup Files\Compressed Files\0009-English\Intel 32\_ISUSER.DLL" - $(DESTDIR)\bin\util_cr.exe ~ ".\Setup Files\Compressed Files\0009-English\Intel 32\shlwapi.DLL" - $(DESTDIR)\bin\util_cr.exe ~ ".\Setup Files\Compressed Files\0009-English\Intel 32\wininet.DLL" - $(DESTDIR)\bin\util_cr.exe ~ ".\Setup Files\Compressed Files\0009-English\Intel 32\GETWEBDLL.DLL" - -build: - BuildSetup.bat -!IF ((EXIST("$(ISWEB)")) &&("$(ISWEB)"!="")) -! IF (!EXIST($(DESTDIR)\Wininstall\PackageWeb)) - $(MKDIR) $(DESTDIR)\Wininstall\PackageWeb -! ENDIF - $(DEL) /q $(DESTDIR)\Wininstall\PackageWeb\*.* - $(ISWEB)\Pftwwiz.exe $(SRT)PackageWeb.pfw -s -a -!ENDIF - $(XCOPY) Media\OpenAFS\DiskIm~1\disk1\*.* $(DESTDIR)\WinInstall - copy AFS_component_version_number.txt $(DESTDIR)\WinInstall\Version.txt - $(DEL) /q "Media\OpenAFS\Disk Images\disk1\*.*" -install: prep build - -mkdir: diff --git a/src/WINNT/install/InstallShield5/PackageWeb.pfw b/src/WINNT/install/InstallShield5/PackageWeb.pfw deleted file mode 100644 index ca9a7a5f7e..0000000000 --- a/src/WINNT/install/InstallShield5/PackageWeb.pfw +++ /dev/null @@ -1,267 +0,0 @@ -[PackageForTheWeb] -Version=2.0 - -[Options] -Title=OpenAFS for Windows -Company=OpenAFS -CompanyEMail=openafs-info@openafs.org -BasePath=.\Media\OpenAFS\Disk Images -ImportPath=.\Media\OpenAFS -UseRTF=0 -SaveFiles=0 -SubFolders=1 -ApplicationName=AFSforWindows -Description= -Comments=Build:11/07/01 10:26 CellServDB: -Notice= -Version=1.2.2 a -OutputSpec=Y:\DEST\WinInstall\PackageWeb\AFSforWindows.exe -GUIDs=0 -Type=2 -Compress=1 -Sign=0 -Transfer=0 -Files=33 - -[Engine] -Setup=Disk1\Setup.exe - -[Web Page] -Generate=1 -Template= -MSClient= -NClient= - -[Runtime] -Welcome= -License= -Prompt= -Password= -DefaultPath= -Language=English -WindowStyle=0 -Options=19 -Execute=Disk1\Setup.exe -CmdLine=/SMS - -[Extension] -Server= -Calls=0 - -[Code Signing] -CompanyURL= -SpecFile= -KeyFile= -Method=0 - -; ~~~~~~~~~~ File Section ~~~~~~~~~~~ -[SubFolders] -Count=10 -Folder1=Disk1 -Folder2=Disk1\setupdir\0009 -Folder3=Disk1\setupdir\0416 -Folder4=Disk1\setupdir\0804 -Folder5=Disk1\setupdir\0404 -Folder6=Disk1\setupdir\0007 -Folder7=Disk1\setupdir\0011 -Folder8=Disk1\setupdir\0012 -Folder9=Disk1\setupdir\000a -Folder10=Disk1\License - -[File 1] -Name=_ISDel.exe -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=589825 -Disk=0 - -[File 2] -Name=Setup.exe -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=589825 -Disk=0 - -[File 3] -Name=_inst32i.ex_ -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=524289 -Disk=0 - -[File 4] -Name=os.dat -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 5] -Name=lang.dat -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 6] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0009\ -Flags=655377 -Disk=0 - -[File 7] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0416\ -Flags=655377 -Disk=0 - -[File 8] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0804\ -Flags=655377 -Disk=0 - -[File 9] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0404\ -Flags=655377 -Disk=0 - -[File 10] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0007\ -Flags=655377 -Disk=0 - -[File 11] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0011\ -Flags=655377 -Disk=0 - -[File 12] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\0012\ -Flags=655377 -Disk=0 - -[File 13] -Name=_Setup.dll -Path=.\Media\OpenAFS\Disk Images\Disk1\setupdir\000a\ -Flags=655377 -Disk=0 - -[File 14] -Name=setup.ins -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 15] -Name=_sys1.hdr -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=2097153 -Disk=0 - -[File 16] -Name=_sys1.cab -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=2097153 -Disk=0 - -[File 17] -Name=_user1.hdr -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=2097153 -Disk=0 - -[File 18] -Name=_user1.cab -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=2097153 -Disk=0 - -[File 19] -Name=DATA.TAG -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 20] -Name=SETUP.INI -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 21] -Name=setup.lid -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 22] -Name=setup.bmp -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 23] -Name=data1.hdr -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=2097153 -Disk=0 - -[File 24] -Name=data1.cab -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=2097153 -Disk=0 - -[File 25] -Name=layout.bin -Path=.\Media\OpenAFS\Disk Images\Disk1\ -Flags=1 -Disk=0 - -[File 26] -Name=en_US.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 27] -Name=ja_JP.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 28] -Name=ko_KR.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 29] -Name=zh_CN.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 30] -Name=zh_TW.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 31] -Name=pt_BR.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 32] -Name=es_ES.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 - -[File 33] -Name=de_DE.rtf -Path=.\Media\OpenAFS\Disk Images\Disk1\License\ -Flags=1 -Disk=0 diff --git a/src/WINNT/install/InstallShield5/README.TXT b/src/WINNT/install/InstallShield5/README.TXT deleted file mode 100755 index fd223405fd..0000000000 --- a/src/WINNT/install/InstallShield5/README.TXT +++ /dev/null @@ -1,94 +0,0 @@ -Copyright 2000, International Business Machines Corporation and others. -All Rights Reserved. - -This software has been released under the terms of the IBM Public -License. For details, see the LICENSE file in the top-level source -directory or online at http://www.openafs.org/dl/license10.html - -HOW TO USE THIS MESS - -TO EDIT THE IS5 FILES - -If you need to modify the InstallShield project files, follow these steps: - -0) Go to the src dir version of the install files. - -1) Run the batch file CreateISDirs.bat - This will create the directories that IS needs. We can't store these - dirs in CML because the directory names contain spaces. - -2) Run the batch file ScatterFiles.bat - This will copy the IS files that are in the main install dir to the - appropriate IS dirs. - -3) Run the batch file CreateGeneratedFiles.bat - This will run other batch files that will generate certain IS files that - we can't use directly. This is because the IS IDE puts paths in those - files that are relative to the machine the IDE is running on. If some - other person doing a build used a different drive mapping to get at the - build tree, the IS build would fail. These batch files will generate the - IS files such that the paths will be relative to the person doing the - build. - -4) Run InstallShield and load the InstallShield5.ipr project file. - It is called InstallShield5.ipr, and not something more appropriate like - TransarcAFS.ipr, because IS requires that the project name match the - name of the directory in which the project lives. - -5) Do whatever it is you need to do to the IS5 project. - -6) CML edit the files in the main install dir. - -7) If you changed the file groups, you must go into the File Groups dir and - modify the GenFileGroups.bat file. If you changed an existing file group, - then you must make the change again in the batch file. If you have deleted - a file group, then you must delete it from the batch file. If you added a - group, then add it to the batch file. - -7) Run the batch file GatherFiles.bat. - This will get all the IS5 files out of their IS5 dirs and copy them into - the main install dir. - -8) If you have added or deleted file groups, edit the batch file DelISDirTree.bat. - It removes the file group files, so modify its list to match what currently - is in use. - -9) Run the batch file DelISDirTree.bat. - This will delete all of the IS dirs. Some of the dirs, like the media build - report dirs, are always removed. Most other dirs are removed only if they - are empty. Any dirs not removed after running the batch file contain files - that we previously didn't know about, so IS had some reason to create them - for the first time. You will have to determine if the file should be added - to cml. If it should be added, then check to see if it contains path names. - If it does, then you must create a batch file to generate this new file. - Look at GenFileGroups.bat for an example of how to do that. In either case - you have a new file to add to the build tree, either the new file IS made or - your batch file that generates the IS file. Copy this file to the main - install dir (rename it if it clashes with a file already there), and modify - ScatterFiles.bat, GatherFiles.bat, and DelISDirTree.bat to include the new - file. - - Also, if you had to create a batch file to generate the IS file, then modify - CreateGeneratedFiles.bat to include a call to your batch file. - -10) Do a cml close. If you want to diff the IS5 files, do so only on the setup.rul - file. IS5 reoriganizes most other files more or less randomly each time - they are saved. It's easist to just edit all the files and then check in all - of them. However, if you know IS well and you know which files your changes - have affected, then only check in those files. - - - -HOW TO BUILD THE SETUP PROJECT - -0) Go to the obj dir version of the install files. - -1) To build the distribution type: - nmake /f NTMakfile install - - If the build fails, you may not have the environment variable IS5ROOT - defined. Define it and try again. - - If it still fails, then you're on your own. Use your excellent debugging - skills to fix the problem. - diff --git a/src/WINNT/install/InstallShield5/ScatterFiles.bat b/src/WINNT/install/InstallShield5/ScatterFiles.bat deleted file mode 100644 index 4f2ae6e657..0000000000 --- a/src/WINNT/install/InstallShield5/ScatterFiles.bat +++ /dev/null @@ -1,47 +0,0 @@ -@echo off -rem Copyright 2000, International Business Machines Corporation and others. -rem All Rights Reserved. -rem -rem This software has been released under the terms of the IBM Public -rem License. For details, see the LICENSE file in the top-level source -rem directory or online at http://www.openafs.org/dl/license10.html - -rem This file copies the IS5 files from the CML dir to the IS5 dirs. - -echo Populating the IS dir tree... - -copy Default.cdf "Component Definitions" -copy Default.fgl "Component Definitions" - -copy Default.fdf "File Groups" -copy GenFileGroups.bat "File Groups" - -copy GenDefault.mda.bat "Media\OpenAFS" - -copy Default.rge "Registry Entries" - -copy setup.rul "Script Files" - -rem Only copy this file when NOT doing a WSPP build -if not defined AFSBLD_IS_WSPP copy setup.bmp "Setup Files\Uncompressed Files\Language Independent\OS Independent" -if not defined AFSBLD_IS_WSPP copy _isuser.dll "Setup Files\Uncompressed Files\Language Independent\OS Independent" - -copy %AFSROOT%\DEST\root.server\usr\afs\bin\InstallUtils.dll "Setup Files\Compressed Files\Language Independent\OS Independent" -copy %AFSROOT%\DEST\root.server\usr\afs\bin\afs_setup_utils_*.dll "Setup Files\Compressed Files\Language Independent\OS Independent" - -copy Default.shell "Shell Objects\Default.shl" - -copy Default.shl "String Tables" - -copy lang\en_US\value.shl "String Tables\0009-English" -copy lang\ja_JP\value.shl "String Tables\0011-Japanese" -copy lang\ko_KR\value.shl "String Tables\0012-Korean" -copy lang\zh_TW\value.shl "String Tables\0404-Chinese (Taiwan)" -copy lang\zh_CN\value.shl "String Tables\0804-Chinese (PRC)" -copy lang\de_DE\value.shl "String Tables\0007-German" -copy lang\pt_BR\value.shl "String Tables\0416-Portuguese (Brazilian)" -copy lang\es_ES\value.shl "String Tables\000a-Spanish" - -copy Build.tsb "Text Substitutions" -copy Setup.tsb "Text Substitutions" - diff --git a/src/WINNT/install/InstallShield5/Setup.tsb b/src/WINNT/install/InstallShield5/Setup.tsb deleted file mode 100644 index e5a3252493..0000000000 --- a/src/WINNT/install/InstallShield5/Setup.tsb +++ /dev/null @@ -1,131 +0,0 @@ -[] -KeyType=3 -Value= - -[] -KeyType=3 -Value= - -[] -KeyType=3 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[] -Value= -KeyType=3 - -[] -KeyType=3 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[] -Value= -KeyType=3 - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[Data] -Key18= -Key19= -Key0= -Key1= -Key2= -Key3= -Key4= -Key20= -Key10= -Key5= -Key21= -Key22= -Key11= -Key6= -Key12= -Key7= -Key23= -Key24= -Key13= -Key8= -Key14= -Key9= -Key15= -Key16= -Key17= - -[] -KeyType=4 -Value= - -[] -KeyType=3 -Value= - -[] -KeyType=3 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[General] -Type=TEXTSUB -Version=1.10.000 - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=3 -Value= - -[] -KeyType=4 -Value= - -[] -KeyType=4 -Value= - -[] -Value= -KeyType=3 - diff --git a/src/WINNT/install/InstallShield5/afsdcell.ini b/src/WINNT/install/InstallShield5/afsdcell.ini deleted file mode 100644 index 6d43dc846f..0000000000 --- a/src/WINNT/install/InstallShield5/afsdcell.ini +++ /dev/null @@ -1,483 +0,0 @@ ->grand.central.org #GCO Public CellServDB 11 May 2004 -18.7.14.88 #grand-opening.mit.edu -128.2.191.224 #penn.central.org ->wu-wien.ac.at #University of Economics, Vienna, Austria -137.208.3.33 #afsdb1.wu-wien.ac.at -137.208.7.4 #afsdb2.wu-wien.ac.at -137.208.7.7 #afsdb3.wu-wien.ac.at ->hephy.at #hephy-vienna -193.170.243.10 #mowgli.oeaw.ac.at -193.170.243.12 #baloo.oeaw.ac.at -193.170.243.14 #akela.oeaw.ac.at ->itp.tugraz.at #Institute for Theoretical Physics, TU Graz, Austria -129.27.157.6 #fubphsv2.tu-graz.ac.at -129.27.161.7 #faepsv01.tu-graz.ac.at -129.27.161.15 #faepsv02.tu-graz.ac.at ->cern.ch #European Laboratory for Particle Physics, Geneva -137.138.128.148 #afsdb1.cern.ch -137.138.246.50 #afsdb3.cern.ch -137.138.246.51 #afsdb2.cern.ch ->ams.cern.ch #AMS Experiment -137.138.206.77 #pcamsf2.cern.ch -137.138.206.123 #pcamsf4.cern.ch ->ethz.ch #Swiss Federal Inst. of Tech. - Zurich, Switzerland -129.132.97.19 #amalthea.ethz.ch -129.132.97.27 #nethzafs-001.ethz.ch -129.132.115.3 #himalia.ethz.ch -129.132.115.37 #nethzafs-005.ethz.ch -129.132.115.38 #nethzafs-006.ethz.ch ->psi.ch #Paul Scherrer Institut - Villigen, Switzerland -129.129.16.10 #afs1.psi.ch -129.129.16.11 #afs2.psi.ch ->extundo.com #Simon Josefsson's cell -195.42.214.241 #slipsten.extundo.com ->mekinok.com #Mekinok, Inc. -4.36.43.98 #loggerhead.mekinok.com ->membrain.com #membrain.com -66.93.118.125 #stormy -130.85.24.11 #weasel -130.85.24.13 #straykitten ->midnightlinux.com #Midnight Linux, Pittsburgh PA -66.93.62.18 #romulus.midnihtlinux.com -66.93.62.20 #yar.midnightlinux.com ->setfilepointer.com #SetFilePointer.com -63.224.10.2 #hamlet.SetFilePointer.com -63.224.10.4 #troilus.SetFilePointer.com ->sodre.cx #Sodre.cx -128.8.140.165 #greed.sodre.cx ->desy.de #Deutsches Elektronen-Synchrotron -131.169.40.62 #vayu.desy.de -131.169.244.60 #solar00.desy.de ->gppc.de #GPP Chemnitz mbH -213.187.92.33 #gpp1.gppc.de -213.187.92.34 #paulchen.gppc.de -213.187.92.35 #lotus.gppc.de ->ifh.de #DESY Zeuthen -141.34.22.10 #romulus.ifh.de -141.34.22.11 #remus.ifh.de -141.34.22.29 #hekate.ifh.de ->lrz-muenchen.de #Leibniz Computing Centre, Germany -129.187.10.36 #afs1.lrz-muenchen.de -129.187.10.56 #afs3.lrz-muenchen.de -129.187.10.57 #afs2.lrz-muenchen.de ->ipp-garching.mpg.de #Institut fuer Plasmaphysik -130.183.9.5 #afs-db1.rzg.mpg.de -130.183.100.10 #afs-db2.aug.ipp-garching.mpg.de -130.183.100.23 #afs-db3.aug.ipp-garching.mpg.de ->mpe.mpg.de #MPE cell -130.183.130.7 #irafs1.mpe-garching.mpg.de -130.183.134.20 #irafs2.mpe-garching.mpg.de ->i1.informatik.rwth-aachen.de #Informatik I, RWTH Aachen -137.226.244.79 #remus.informatik.rwth-aachen.de ->tu-chemnitz.de #Technische Universitaet Chemnitz, Germany -134.109.2.1 #zuse.hrz.tu-chemnitz.de -134.109.2.15 #phoenix.hrz.tu-chemnitz.de -134.109.200.7 #aetius.hrz.tu-chemnitz.de ->e18.ph.tum.de #Experimental Physics, TU Munich, Germany -129.187.154.223 #hamlet.e18.physik.tu-muenchen.de ->uni-bonn.de #Cell name -131.220.14.198 #work15-eth.rhrz.uni-bonn.de -131.220.14.203 #node03-en2.rhrz.uni-bonn.de -131.220.14.205 #node05.rhrz.uni-bonn.de ->uni-freiburg.de #Albert-Ludwigs-Universitat Freiburg -132.230.6.235 #sv6.ruf.uni-freiburg.de -132.230.6.236 #sv7.ruf.uni-freiburg.de -132.230.6.237 #sv8.ruf.uni-freiburg.de ->physik.uni-freiburg.de #institute of physics, university Freiburg, Germany -132.230.77.16 #hepafs.physik.uni-freiburg.de ->urz.uni-heidelberg.de #Uni Heidelberg (Rechenzentrum) -129.206.119.10 #afsdb.urz.uni-heidelberg.de -129.206.119.16 #afsdb1.urz.uni-heidelberg.de -129.206.119.17 #afsdb2.urz.uni-heidelberg.de ->uni-hohenheim.de #University of Hohenheim -144.41.2.2 #rs13.serv.uni-hohenheim.de -144.41.2.3 #rs14.serv.uni-hohenheim.de -144.41.2.4 #rs15.serv.uni-hohenheim.de ->rz.uni-jena.de #Rechenzentrum University of Jena, Germany -141.35.2.160 #lc00.rz.uni-jena.de -141.35.7.9 #fsuj01.rz.uni-jena.de -141.35.7.10 #zaphod.rz.uni-jena ->meteo.uni-koeln.de #Univ. of Cologne - Inst. for Geophysics & Meteorology -134.95.144.22 #afs1.meteo.uni-koeln.de -134.95.144.24 #afs2.meteo.uni-koeln.de ->rrz.uni-koeln.de #University of Cologne - Reg Comp Center -134.95.19.3 #afsdb1.rrz.uni-koeln.de -134.95.19.30 #fileserv3.rrz.uni-koeln.de -134.95.67.97 #afs.thp.uni-koeln.de -134.95.140.190 #rzkbserv.rrz.uni-koeln.de ->physik.uni-mainz.de #institute of physics, university Mainz, Germany -134.93.130.93 #hardy.physik.uni-mainz.de ->uni-mannheim.de #Uni Mannheim (Rechenzentrum) -134.155.50.165 #afsdbx.uni-mannheim.de -134.155.50.166 #afsdby.uni-mannheim.de -134.155.50.167 #afsdbz.uni-mannheim.de ->physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal -132.195.104.3 #afs1.physik.uni-wuppertal.de -132.195.104.230 #afs2.physik.uni-wuppertal.de ->ies.auc.dk #Aalborg Univ., Inst. of Electronic Systems, Denmark -130.225.51.73 #afsdb1.kom.auc.dk -130.225.51.74 #afsdb2.kom.auc.dk -130.225.51.85 #afsdb3.kom.auc.dk ->hep.caltech.edu #CalTech High Energy Physics -131.215.126.150 #afs.hep.caltech.edu ->andrew.cmu.edu #Carnegie Mellon University - Computing Services Cell -128.2.10.2 #vice2.fs.andrew.cmu.edu -128.2.10.7 #vice7.fs.andrew.cmu.edu -128.2.10.11 #vice11.fs.andrew.cmu.edu -128.2.10.28 #vice28.fs.andrew.cmu.edu -128.2.32.44 #new-vice12.fs.andrew.cmu.edu ->club.cc.cmu.edu #Carnegie Mellon University Computer Club -128.2.4.131 #yttrium.club.cc.cmu.edu -128.2.4.132 #zirconium.club.cc.cmu.edu ->chem.cmu.edu #Carnegie Mellon University - Chemistry Dept. -128.2.40.134 #afs.chem.cmu.edu -128.2.40.140 #afs2.chem.cmu.edu ->cs.cmu.edu #Carnegie Mellon University - School of Comp. Sci. -128.2.194.178 #cherry.srv.cs.cmu.edu -128.2.194.179 #pumpkin.srv.cs.cmu.edu -128.2.194.180 #strawberry.srv.cs.cmu.edu ->ece.cmu.edu #Carnegie Mellon University - Elec. Comp. Eng. Dept. -128.2.129.7 #porok.ece.cmu.edu -128.2.129.8 #vicio.ece.cmu.edu -128.2.129.9 #e-xing.ece.cmu.edu ->scotch.ece.cmu.edu #CMU ECE CALCM research group -128.2.134.82 #lagavulin.ece.cmu.edu ->msc.cornell.edu #Cornell University Materials Science Center -128.84.231.242 #miranda.ccmr.cornell.edu -128.84.241.35 #co.ccmr.cornell.edu -128.84.249.78 #dax.ccmr.cornell.edu ->dbic.dartmouth.edu #Dartmouth Brain Imaging Center -129.170.30.143 #dbicafs1.dartmouth.edu -129.170.30.144 #dbicafs2.dartmouth.edu -129.170.30.145 #dbicafs3.dartmouth.edu ->northstar.dartmouth.edu #Dartmouth College Research Computing -129.170.16.22 #halley.dartmouth.edu -129.170.16.42 #oort.dartmouth.edu -129.170.16.43 #cygnusx1.dartmouth.edu ->iastate.edu #Iowa State University -129.186.1.243 #afsdb-1.iastate.edu -129.186.6.243 #afsdb-2.iastate.edu -129.186.142.243 #afsdb-3.iastate.edu ->athena.mit.edu #MIT/Athena cell -18.7.1.66 #paris.mit.edu. -18.7.1.74 #chimera.mit.edu. -18.158.0.37 #prill.mit.edu. ->dev.mit.edu #MIT/IS Development cell -18.7.1.70 #wham.mit.edu. -18.7.15.89 #rattle.mit.edu. -18.7.15.93 #hum.mit.edu. ->net.mit.edu #MIT/Network Group cell -18.7.7.73 #gracie.mit.edu -18.7.21.95 #george.mit.edu ->sipb.mit.edu #MIT/SIPB cell -18.181.0.19 #reynelda.mit.edu. -18.181.0.22 #rosebud.mit.edu. -18.181.0.23 #ronald-ann.mit.edu. ->msu.edu #Michigan State University Main Cell -35.9.7.10 #afsdb0.cl.msu.edu ->nd.edu #University of Notre Dame -129.74.223.17 #john.helios.nd.edu -129.74.223.33 #lizardo.helios.nd.edu -129.74.223.65 #buckaroo.helios.nd.edu ->pitt.edu #University of Pittsburgh -136.142.8.15 #afs09.srv.cis.pitt.edu -136.142.8.20 #afs10.srv.cis.pitt.edu -136.142.8.21 #afs11.srv.cis.pitt.edu ->cs.pitt.edu #University of Pittsburgh - Computer Science -130.49.220.11 #afs01.cs.pitt.edu -130.49.220.12 #afs02.cs.pitt.edu -130.49.220.13 #afs03.cs.pitt.edu ->psc.edu #PSC (Pittsburgh Supercomputing Center) -128.182.59.182 #shaggy.psc.edu -128.182.66.184 #velma.psc.edu -128.182.66.185 #daphne.psc.edu ->scoobydoo.psc.edu #PSC Test Cell -128.182.59.181 #scooby.psc.edu ->cede.psu.edu #Penn State - Center for Engr. Design & Entrepeneurship -146.186.218.10 #greenly.cede.psu.edu -146.186.218.60 #b50.cede.psu.edu -146.186.218.246 #stalin.cede.psu.edu ->rose-hulman.edu #Rose-Hulman Institute of Technology -137.112.7.11 #afs1.rose-hulman.edu -137.112.7.12 #afs2.rose-hulman.edu -137.112.7.13 #afs3.rose-hulman.edu ->cs.rose-hulman.edu #Rose-Hulman CS Department -137.112.40.10 #galaxy.cs.rose-hulman.edu ->rpi.edu #Rensselaer Polytechnic Institute -128.113.22.11 #saul.server.rpi.edu -128.113.22.12 #joab.server.rpi.edu -128.113.22.13 #korah.server.rpi.edu -128.113.22.14 #achan.server.rpi.edu ->hep.sc.edu #University of South Carolina, Dept. of Physics -129.252.78.77 #cpeven.physics.sc.edu ->cs.stanford.edu #Stanford University Computer Science Department -171.64.64.10 #cs-afs-1.Stanford.EDU -171.64.64.66 #cs-afs-2.stanford.edu -171.64.64.69 #cs-afs-3.stanford.edu ->ir.stanford.edu #Stanford University -171.64.7.222 #afsdb1.stanford.edu -171.64.7.234 #afsdb2.stanford.edu -171.64.7.246 #afsdb3.stanford.edu ->slac.stanford.edu #Stanford Linear Accelerator Center -134.79.18.25 #afsdb1.slac.stanford.edu -134.79.18.26 #afsdb2.slac.stanford.edu -134.79.18.27 #afsdb3.slac.stanford.edu ->cats.ucsc.edu #UC Santa Cruz, Comm. and Tech. Services, California U.S.A -128.114.129.14 #elan.ucsc.edu -128.114.129.15 #ichabod.ucsc.edu -128.114.129.18 #maneki.ucsc.edu ->acm.uiuc.edu #ACM at the University of Illinois -128.174.251.8 #alnitak.acm.uiuc.edu -128.174.251.9 #alnilam.acm.uiuc.edu -128.174.251.10 #mintaka.acm.uiuc.edu ->ncsa.uiuc.edu #University of Illinois -141.142.3.5 #congo.ncsa.uiuc.edu -141.142.3.8 #nile.ncsa.uiuc.edu -141.142.230.19 #jinx.ncsa.uiuc.edu ->umbc.edu #University of Maryland, Baltimore County -130.85.24.23 #db2.afs.umbc.edu -130.85.24.87 #db3.afs.umbc.edu -130.85.24.101 #db1.afs.umbc.edu ->glue.umd.edu #University of Maryland - Project Glue -128.8.70.11 #olmec.umd.edu -128.8.73.3 #babylon.umd.edu -129.2.128.53 #egypt.umd.edu ->wam.umd.edu #University of Maryland Network WAM Project -128.8.70.9 #csc-srv.wam.umd.edu -128.8.73.9 #pg2-srv.wam.umd.edu -129.2.128.54 #avw-srv.wam.umd.edu ->umich.edu #University of Michigan - Campus -141.211.1.32 #fear.ifs.umich.edu -141.211.1.33 #surprise.ifs.umich.edu -141.211.1.34 #ruthless.ifs.umich.edu ->atlas.umich.edu #ATLAS group cell in physics at University of Michigan -141.211.43.102 #linat02.grid.umich.edu -141.211.43.106 #linat06.grid.umich.edu -141.211.43.109 #atgrid.grid.umich.edu ->citi.umich.edu #Center for Information Technology Integration -141.211.133.5 #babylon.citi.umich.edu ->lsa.umich.edu #University of Michigan - College of LS&A -141.211.54.132 #curtis.admin.lsa.umich.edu -141.211.61.23 #zee.admin.lsa.umich.edu -141.211.68.15 #marshall.lsa.umich.edu ->math.lsa.umich.edu #University of Michigan - Math Department -141.211.61.40 #ike.math.lsa.umich.edu -141.211.61.41 #clark.math.lsa.umich.edu -141.211.61.42 #nimitz.math.lsa.umich.edu ->umr.edu #University of Missouri - Rolla -131.151.1.59 #afsdb1.umr.edu -131.151.1.70 #afsdb3.umr.edu -131.151.1.146 #afsdb2.umr.edu ->physics.unc.edu #Univ. of NC at Chapel Hill, Dept. of Physics -152.2.5.2 #valerian.physics.unc.edu -152.2.5.3 #augustus.physics.unc.edu -152.2.7.67 #nerva.astro.unc.edu ->uncc.edu #University of NC at Charlotte Mosaic AFS Cell -152.15.10.70 #as-sm1.uncc.edu -152.15.13.7 #as-sm2.uncc.edu -152.15.30.27 #fs-kenn3.uncc.edu ->eng.utah.edu #University of Utah - Engineering -155.99.222.9 #lenny.eng.utah.edu -155.99.222.10 #carl.eng.utah.edu ->cs.uwm.edu #University of Wisconsin--Milwaukee -129.89.38.124 #solomons.cs.uwm.edu ->cs.wisc.edu #Univ. of Wisconsin-Madison, Computer Sciences Dept. -128.105.132.14 #timon.cs.wisc.edu -128.105.132.15 #pumbaa.cs.wisc.edu -128.105.132.16 #zazu.cs.wisc.edu ->engr.wisc.edu #University of Wisconsin-Madison, College of Engineering -144.92.13.14 #larry.cae.wisc.edu -144.92.13.15 #curly.cae.wisc.edu -144.92.13.16 #moe.cae.wisc.edu ->hep.wisc.edu #University of Wisconsin -- High Energy Physics -128.104.28.219 #anise.physics.wisc.edu ->physics.wisc.edu #Univ. of Wisconsin-Madison, Physics Department -128.104.220.51 #bubbles.physics.wisc.edu -128.104.220.52 #buttercup.physics.wisc.edu -128.104.220.53 #blossom.physics.wisc.edu ->ifca.unican.es #Instituto de Fisica de Cantabria (IFCA), Santander, Spain -193.144.209.20 #gridwall.ifca.unican.es ->ific.uv.es #Instituto de Fisica Corpuscular, Valencia, Spain -147.156.163.11 #alpha.ific.uv.es ->biocenter.helsinki.fi #University of Helsinki, Institute of Biotechnology -128.214.58.174 #afsdb1.biocenter.helsinki.fi -128.214.88.114 #afsdb2.biocenter.helsinki.fi ->dapnia.saclay.cea.fr #CEA DAPNIA -132.166.32.7 #dphrsg.saclay.cea.fr -132.166.32.12 #dphrsl.saclay.cea.fr ->in2p3.fr #IN2P3 production cell -134.158.232.11 #ccafsdb1.in2p3.fr -134.158.232.12 #ccafsdb2.in2p3.fr -134.158.232.13 #ccafsdb3.in2p3.fr ->anl.gov #Argonne National Laboratory -146.137.96.33 #arteus.ctd.anl.gov -146.137.162.88 #agamemnon.ctd.anl.gov -146.137.194.80 #antenor.ctd.anl.gov ->rhic.bnl.gov #Relativistic Heavy Ion Collider -130.199.6.51 #rafs03.rcf.bnl.gov -130.199.6.52 #rafs02.rcf.bnl.gov -130.199.6.69 #rafs01.rcf.bnl.gov ->usatlas.bnl.gov #US Atlas Tier 1 Facility at BNL -130.199.48.32 #aafs01.usatlas.bnl.gov -130.199.48.33 #aafs02.usatlas.bnl.gov -130.199.48.34 #aafs03.usatlas.bnl.gov ->fnal.gov #Fermi National Acclerator Laboratory -131.225.68.1 #fsus01.fnal.gov -131.225.68.4 #fsus03.fnal.gov -131.225.68.14 #fsus04.fnal.gov ->ic-afs.arc.nasa.gov #Code IC, Ames Research Center -128.102.105.62 #udanax.arc.nasa.gov ->nersc.gov #National Energy Research Supercomputer Center -128.55.128.250 #mars.nersc.gov -128.55.128.252 #alfred.nersc.gov -128.55.128.254 #lurch.nersc.gov ->caspur.it #CASPUR Inter-University Computing Consortium, Rome -193.204.5.45 #pomodoro.caspur.it -193.204.5.46 #banana.caspur.it -193.204.5.50 #maslo.caspur.it ->fusione.it #Assoz. FUSIONE/Euratom, ENEA, Frascati-Italy -192.107.90.2 #fusafs1.frascati.enea.it -192.107.90.3 #fusafs2.frascati.enea.it -192.107.90.4 #fusafs3.frascati.enea.it ->icemb.it #ICEMB, Universita' La Sapienza - Rome - Italy -193.204.6.130 #icembfs.caspur.it ->infn.it #Istituto Nazionale di Fisica Nucleare (INFN), Italia -131.154.1.7 #afs3.infn.it -141.108.3.252 #afs1.infn.it -192.84.134.75 #afs2.infn.it ->kloe.infn.it #INFN, KLOE experiment at Laboratori di Frascati -192.135.25.111 #kloeafs1.lnf.infn.it -192.135.25.112 #kloeafs2.lnf.infn.it ->le.infn.it #INFN, Sezione di Lecce -192.84.152.40 #afs01.le.infn.it -192.84.152.148 #afs02.le.infn.it ->lnf.infn.it #INFN, Laboratori Nazionali di Frascati -193.206.84.121 #afs1.lnf.infn.it -193.206.84.122 #afs2.lnf.infn.it -193.206.84.123 #afs3.lnf.infn.it ->lngs.infn.it #INFN, Laboratori Nazionali di Gran Sasso -192.84.135.21 #rsgs05.lngs.infn.it ->pi.infn.it #INFN, Sezione di Pisa -131.114.134.26 #unknownhost.pi.infn.it -192.84.133.50 #aix1.pi.infn.it ->psm.it #Progetto San Marco, Universita' di Roma-1 -151.100.1.65 #atlante.psm.uniroma1.it ->tgrid.it #CASPUR-CILEA-CINECA Grid Cell -193.204.5.33 #cccgrid.caspur.it ->ictp.trieste.it #The Abdus Salam International Centre for Theoretical Physics (IC -140.105.16.8 #fs1.ictp.trieste.it -140.105.16.9 #fs2.ictp.trieste.it ->ing.uniroma1.it #Universita' La Sapienza, Fac. Ingeneria -151.100.85.253 #alfa.ing.uniroma1.it ->vn.uniroma3.it #University of Rome 3, Area Vasca Navale -193.204.161.136 #alfa.dia.uniroma3.it -193.204.161.137 #beta.dia.uniroma3.it -193.204.161.138 #gamma.dia.uniroma3.it ->italia #Italian public AFS cell -193.204.5.9 #afs.caspur.it ->cmf.nrl.navy.mil #Naval Research Lab - CCS -134.207.10.68 #picard.cmf.nrl.navy.mil -134.207.10.69 #riker.cmf.nrl.navy.mil -134.207.10.70 #kirk.cmf.nrl.navy.mil ->lcp.nrl.navy.mil #Naval Research Lab - Lab for Computational Physics -132.250.114.2 #afs1.lcp.nrl.navy.mil -132.250.114.4 #afs2.lcp.nrl.navy.mil -132.250.114.6 #afs3.lcp.nrl.navy.mil ->es.net #Energy Sciences Net -198.128.3.21 #fs1.es.net -198.128.3.22 #fs2.es.net -198.128.3.23 #fs3.es.net ->laroia.net #Laroia Networks -66.66.102.254 #supercore.laroia.net ->sinenomine.net #Sine Nomine Associates -66.92.236.139 #afs.sinenomine.net ->slackers.net #The Slackers' Network -63.201.48.27 #alexandria.slackers.net ->nikhef.nl #The Dutch National Institute for High Energy Physics -192.16.185.26 #afs1.nikhef.nl -192.16.185.27 #afs2.nikhef.nl ->1ts.org #KCR/private Karl Ramm, Cambridge, MA -4.36.43.102 #dol-guldur.1ts.org ->bazquux.org #Baz Quux Organization -66.207.142.196 #baxquux.org ->coed.org #Adam Pennington's Cell -66.93.61.184 #vice1.coed.org -128.2.4.163 #vice3.coed.org ->dementia.org #Dementia Unlimited -128.2.12.45 #alycia.dementia.org -128.2.120.216 #meredith.dementia.org ->idahofuturetruck.org #University of Idaho hybrid vehicle development -12.18.238.210 #dsle210.fsr.net ->nimlabs.org #Nimlabs, Ink. Cell. -18.238.1.103 #olfin.nimlabs.org -18.238.1.105 #caerbanog.nimlabs.org ->nomh.org #nomh.org -204.29.154.12 #iota.nomh.org ->oc7.org #The OC7 Project -128.2.6.107 #vice3.oc7.org -128.2.122.140 #vice2.oc7.org ->openafs.org #OpenAFS Project -128.2.13.199 #new-virtue.openafs.org -128.2.121.218 #virtue.openafs.org -130.237.48.87 #andrew.e.kth.se -130.237.48.107 #onyx.e.kth.se ->e.kth.se #Royal Institute of Technology, Elektro -130.237.32.145 #sonen.e.kth.se -130.237.48.7 #anden.e.kth.se -130.237.48.244 #fadern.e.kth.se ->hallf.kth.se #Royal Institute of Technology, HALLF -130.237.24.141 #rasmus13.hallf.kth.se -130.237.24.152 #rasmus3.hallf.kth.se -130.237.24.177 #rasmus29.hallf.kth.se ->isk.kth.se #Royal Institute of Technology, ISK -130.237.202.12 #afsdb2.isk.kth.se -130.237.206.13 #afsdb1.isk.kth.se -130.237.209.141 #afsdb3.isk.kth.se ->it.kth.se #Royal Institute of Technology, IT -130.237.212.15 #ptah.it.kth.se -130.237.212.16 #toth.it.kth.se -130.237.215.7 #isis.it.kth.se ->md.kth.se #Royal Institute of Technology, MMK -130.237.57.68 #trinity.md.kth.se -130.237.57.72 #morpheus.md.kth.se -130.237.67.230 #neo.speech.kth.se ->mech.kth.se #Royal Institute of Technology, MECH -130.237.233.142 #matterhorn.mech.kth.se -130.237.233.143 #castor.mech.kth.se -130.237.233.144 #pollux.mech.kth.se ->nada.kth.se #Royal Institute of Technology, NADA -130.237.222.20 #kosmos.nada.kth.se -130.237.223.12 #sputnik.nada.kth.se -130.237.224.78 #mir.nada.kth.se -130.237.227.23 #gagarin.nada.kth.se -130.237.228.28 #laika.nada.kth.se ->pdc.kth.se #Royal Institute of Technology, PDC -130.237.232.29 #crab.pdc.kth.se -130.237.232.112 #anna.pdc.kth.se -130.237.232.114 #hokkigai.pdc.kth.se ->stacken.kth.se #Stacken Computer Club -130.237.234.3 #milko.stacken.kth.se -130.237.234.43 #hot.stacken.kth.se -130.237.237.230 #fishburger.stacken.kth.se ->syd.kth.se #Royal Institute of Technology, KTH-Syd -130.237.83.23 #afs.haninge.kth.se ->physto.se #Physics department Stockholm University -130.237.205.36 #sysafs1.physto.se -130.237.205.72 #sysafs2.physto.se ->sanchin.se #Sanchin Consulting AB, Sweden -192.195.148.10 #sesan.sanchin.se ->su.se #Stockholm University -130.237.162.81 #afsdb1.su.se -130.237.162.82 #afsdb2.su.se ->f9.ijs.si #F9, Jozef Stefan Institue -194.249.156.1 #brenta.ijs.si ->p-ng.si #Nova Gorica Polytechnic -193.2.120.2 #solkan.p-ng.si ->phy.bris.ac.uk #Bristol University - phyics -137.222.58.9 #afs1.phy.bris.ac.uk ->hep.man.ac.uk #Manchester HEP -194.36.2.3 #afs1.hep.man.ac.uk -194.36.2.4 #afs2.hep.man.ac.uk -194.36.2.5 #afs3.hep.man.ac.uk ->rl.ac.uk #Rutherford Appleton Lab, England -130.246.183.164 #wallace.cc.rl.ac.uk diff --git a/src/WINNT/install/InstallShield5/setup.rul b/src/WINNT/install/InstallShield5/setup.rul deleted file mode 100644 index 0cb572c8a3..0000000000 --- a/src/WINNT/install/InstallShield5/setup.rul +++ /dev/null @@ -1,3578 +0,0 @@ - -// -// Copyright 2000, International Business Machines Corporation and others. -// All Rights Reserved. -// -// This software has been released under the terms of the IBM Public -// License. For details, see the LICENSE file in the top-level source -// directory or online at http://www.openafs.org/dl/license10.html -// - - -// Include header files - - #include "sdlang.h" - #include "sddialog.h" - - -////////////////////// string defines //////////////////////////// - - // If the user places a file with this name in the same directory as - // the setup files, only the client component will be available for - // install. The contents of this file are not used. - #define ALLOW_ONLY_CLIENT_FLAG_FILENAME "setup.co" - - // The release types - #define RELEASE_TYPE_GA "GA" - #define RELEASE_TYPE_BETA "Beta" - - // Client logon dll names - #define FULL_CLIENT_LOGON_DLL "Client\\PROGRAM\\afslogon.dll" - #define LIGHT_CLIENT_LOGON_DLL "Client\\PROGRAM\\afslog95.dll" - - // Uninstall log file names for each component - #define SERVER_UNINST_LOGFILE_NAME "Server_Uninst.isu" - #define CLIENT_UNINST_LOGFILE_NAME "Client_Uninst.isu" - #define LIGHT_CLIENT_UNINST_LOGFILE_NAME "Light_Client_Uninst.isu" - #define CC_UNINST_LOGFILE_NAME "CC_Uninst.isu" - #define DOCS_UNINST_LOGFILE_NAME "Docs_Uninst.isu" - - // Uninstall dll names for each component - #define SERVER_UNINST_DLL_NAME "ServerUninst.dll" - #define CLIENT_UNINST_DLL_NAME "ClientUninst.dll" - #define CC_UNINST_DLL_NAME "CCUninst.dll" - #define LIGHT_CLIENT_UNINST_DLL_NAME "LightClientUninst.dll" - #define DOCS_UNINST_DLL_NAME "DocsUninst.dll" - - // These are the components the user sees - #define CLIENT_COMP_NAME "Client" - #define LIGHT_CLIENT_COMP_NAME "Light_Client" - #define SERVER_COMP_NAME "Server" - #define CC_COMP_NAME "Control_Center" - - // Light Client platform components - #define LIGHT95_CLIENT_COMP_NAME "Light_Client\\Win95" - #define LIGHT98_CLIENT_COMP_NAME "Light_Client\\Win98" - - // This is added to autoexec.bat on Win95 systems - #define LIGHT95_CLIENT_PROTSEQ "AFS_RPC_PROTSEQ=ncacn_ip_tcp" - - // Language components - #define LANG_COMP_NAME "Languages" - #define LANG_ENGLISH_COMP_NAME "Languages\\Lang_English" - #define LANG_SIMP_CHINESE_COMP_NAME "Languages\\Lang_Simp_Chinese" - #define LANG_TRAD_CHINESE_COMP_NAME "Languages\\Lang_Trad_Chinese" - #define LANG_KOREAN_COMP_NAME "Languages\\Lang_Korean" - #define LANG_JAPANESE_COMP_NAME "Languages\\Lang_Japanese" - #define LANG_GERMAN_COMP_NAME "Languages\\Lang_German" - #define LANG_SPANISH_COMP_NAME "Languages\\Lang_Spanish" - #define LANG_PORTUGUESE_COMP_NAME "Languages\\Lang_Portuguese" - - // Documentation components - #define DOCS_COMP_NAME "Documentation" - #define DOCS_ENGLISH_COMP_NAME "Documentation\\English" - #define DOCS_JAPANESE_COMP_NAME "Documentation\\Japanese" - #define DOCS_KOREAN_COMP_NAME "Documentation\\Korean" - #define DOCS_SIMP_CHINESE_COMP_NAME "Documentation\\Simp_Chinese" - #define DOCS_TRAD_CHINESE_COMP_NAME "Documentation\\Trad_Chinese" - #define DOCS_GERMAN_COMP_NAME "Documentation\\German" - #define DOCS_SPANISH_COMP_NAME "Documentation\\Spanish" - #define DOCS_PORTUGUESE_COMP_NAME "Documentation\\Portuguese" - - // Readme files components - #define README_COMP_NAME "Readme" - #define README_ENGLISH_COMP_NAME "Readme\\English" - #define README_JAPANESE_COMP_NAME "Readme\\Japanese" - #define README_KOREAN_COMP_NAME "Readme\\Korean" - #define README_SIMP_CHINESE_COMP_NAME "Readme\\Simp_Chinese" - #define README_TRAD_CHINESE_COMP_NAME "Readme\\Trad_Chinese" - #define README_GERMAN_COMP_NAME "Readme\\German" - #define README_SPANISH_COMP_NAME "Readme\\Spanish" - #define README_PORTUGUESE_COMP_NAME "Readme\\Portuguese" - - // License filenames - #define LICENSE_ENGLISH_FILENAME "License\\en_US.rtf" - #define LICENSE_JAPANESE_FILENAME "License\\ja_JP.rtf" - #define LICENSE_KOREAN_FILENAME "License\\ko_KR.rtf" - #define LICENSE_SIMP_CHINESE_FILENAME "License\\zh_CN.rtf" - #define LICENSE_TRAD_CHINESE_FILENAME "License\\zh_TW.rtf" - #define LICENSE_GERMAN_FILENAME "License\\de_DE.rtf" - #define LICENSE_SPANISH_FILENAME "License\\es_ES.rtf" - #define LICENSE_PORTUGUESE_FILENAME "License\\pt_BR.rtf" - - #define SETUP_UTILS_DLL_PATH "InstallUtils.dll" - - // Some registry keys - #define MSUNINSTALL_KEY "\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" - #define COMPANY_REG_KEY "Software\\TransarcCorporation\\" - #define CONFIG_INFO_KEY "Software\\AfsPreservedConfigInfo" - - #define CLIENT_SERVICE_NAME "TransarcAFSDaemon" - - // Client help file names - #define CLIENT_HELP_FILE_NAME "Common\\afs-nt.hlp" - #define LIGHT_CLIENT_HELP_FILE_NAME "Common\\afs-light.hlp" - - #define MAX_STRING_LEN 512 - - // Install actions - #define ACTION_NONE 0 - #define ACTION_INSTALL 1 - #define ACTION_REINSTALL 2 - #define ACTION_UPGRADE 3 - #define ACTION_DOWNGRADE 4 - - // Documenation start menu info - #define DOCUMENTATION_CMD_PATH "Documentation\\Html\\index.htm" - #define DOCUMENTATION_ARGS "" - - #define DOCUMENTATION_LICENSE_PATH "Documentation\\Html\\license.rtf" - - // Application start menu info - #define CFG_WIZARD_CMD_PATH "Server\\usr\\afs\\bin\\afssvrcfg.exe" - #define CFG_WIZARD_ARGS "/wizard" - #define CREDS_TOOL_CMD_PATH "Client\\Program\\afscreds.exe" - #define CREDS_TOOL_ARGS "/show" - #define CLIENT_HELP_CMD_PATH "Common\\afs-nt.hlp" - #define CLIENT_HELP_ARGS "" - #define LIGHT_CLIENT_HELP_CMD_PATH "Common\\afs-light.hlp" - #define LIGHT_CLIENT_HELP_ARGS "" - #define SERVER_MANAGER_CMD_PATH "Control Center\\TaAfsServerManager.exe" - #define SERVER_MANAGER_ARGS "" - #define ACCT_MANAGER_CMD_PATH "Control Center\\TaAfsAccountManager.exe" - #define ACCT_MANAGER_ARGS "" - - #define CELLSERVDB_FILENAME "afsdcell.ini" - - #define SERVER 1 - #define CLIENT 2 - #define LCLIENT 4 - #define CC 8 - #define DOCS 16 - - - -//////////////////// installation declarations /////////////////// - -typedef VERINFO -begin - int nMajorVersion; - int nMinorVersion; - int nPatchLevel; - int nBetaLevel; - string szReleaseType[32]; - string szTitle[32]; -end; - - -// NOTE: There is a problem with the IS registry set functionality in that if -// you specify to write a value under an existing key, at uninstall time -// not just the value will be removed, but the KEY AND ALL ITS SUBKEYS -// will also be removed. So the registry sets can only be used to -// create entries in the registry that are for values under keys that -// we create. -// -// There are some values that we need to create that live under existing -// NT keys, so when we create them we must turn off logging. The -// szNoLogRegistrySets tell us which to create without logging. - -typedef APPINFO -begin - string szCompName[64]; - string szCompanyName[64]; - string szProductName[128]; - VERINFO Ver; // Version of this product - VERINFO iVer; // Verison of this product that is already installed - string szProductKey[128]; - BOOL bUseUninstDLL; - string szUninstDllName[64]; - string szUninstLogfileName[64]; - string szUninstKey[128]; - string szAppPath[256]; // Below TARGETDIR - string szBinPath[256]; // Path to binaries and uninstall dll - BOOL bAddToPath; // TRUE if bin path should be added to path env var - string szUninstDisplayName[128]; - string szRegistrySets[256]; // Comma separated list of registry sets to install - string szNoLogRegistrySets[256]; // Comma separated list of registry sets to install without logging - int nInstallAction; - BOOL bInstallSucceeded; -end; - - - -// ----- DLL function prototypes ----- - - -// ----- DLL prototypes ----- - - // your DLL prototypes - prototype int InstallUtils.InstallServerService(string); - prototype int InstallUtils.InstallClientService(string); - prototype int InstallUtils.AddToPath(string); - prototype int InstallUtils.AddToNetworkProviderOrder(string); - prototype int InstallUtils.CheckIfAdmin(); - prototype int InstallUtils.SetSilentMode(); - prototype int InstallUtils.WriteToInstallErrorLog(string); - prototype int InstallUtils.RestoreConfigInfo(int); - prototype int InstallUtils.Eradicate34Client(); - prototype int InstallUtils.Upgrade34ClientConfigInfo(); - prototype int InstallUtils.IsWin98(); - prototype int InstallUtils.ShowLicense(string,string); - - -// ---- script function prototypes ----- - - // generated by the Project Wizard - prototype ShowDialogs(); - prototype MoveFileData(); - prototype HandleMoveDataError( NUMBER ); - prototype ProcessBeforeDataMove(APPINFO POINTER); - prototype ProcessAfterDataMove(); - prototype SetupRegistry(); - prototype CleanUpInstall(); - prototype SetupInstall(); - prototype SetupScreen(); - prototype CheckRequirements(); - prototype DialogShowSdWelcome(); - prototype DialogShowSdAskDestPath(); - prototype DialogShowSdSetupType(); - prototype DialogShowSdSelectFolder(); - prototype DialogShowSdFinishReboot(); - - // your script function prototypes - prototype FixTargetPaths(); - prototype SetupAppInfo(); - prototype LocalizeComponents(); - prototype LocalizeComponentStatusText (STRING); - prototype InstallApp(APPINFO POINTER); - prototype DialogShowSdAskComponentDialog(); - prototype ShowIsSelected(string); - prototype ShowSelectedComponents(); - prototype ConfigClientService(); - prototype ConfigServerService(); - prototype AddPath(string); - prototype AddBinPaths(); - prototype ConfigUninstallDLL(APPINFO POINTER); - prototype CreateServerDirs(); - prototype SetUserVars(); - prototype SetNetworkProviderOrder(); - prototype CreateRegistrySets(string); - prototype ConfigAfsCreds(); - prototype GetLicenseFilename(BYREF string); - prototype GetNlsComps(BYREF string, BYREF string, BYREF string, BYREF string); - prototype DetectInstalledComponents(); - prototype IsAppInstalled(APPINFO POINTER); - prototype ProcessCompsOnCmdLn(string); - prototype ParseCommandLine(); - prototype GetVersionNumber(string); - prototype GetInstallAction(string, BOOL, string, string, string, string, APPINFO POINTER); - prototype GetInstallActions(); - prototype ClientSelectedOrInstalled(); - prototype RenameUninstDll(APPINFO POINTER); - prototype RemoveInstalledBits(string); - prototype PrepareForWSPPInstall(); - prototype CreateStartMenuEntries(); - prototype ShowError(string, int); - prototype GetDateTimeString(BYREF string); - prototype OnlyInstallingDocs(); - prototype CreateDirs(); - prototype AddShortCut(string, string, string, string); - prototype CheckCopyCellServDB(); - prototype RestorePreviousConfigs(); - prototype RemoveCurrentVersion(APPINFO POINTER); - prototype DoesConfigInfoExist(APPINFO POINTER); - prototype UnselectComps(); - prototype AnyNonUpgradableSoftwareInstalled(); - prototype RemoveAllCurrentVersions(); - prototype AppVersionOk(BOOL, BOOL, APPINFO POINTER); - prototype SetupVerInfo(APPINFO POINTER, string, string, string, string, string, string, BOOL); - prototype NotUpgradable(APPINFO POINTER); - prototype CompareVersions(APPINFO POINTER); - - // ----- global variables ------ - - // generated by the Project Wizard - BOOL bWin95, bWin98, bWinNT, bIsShellExplorer, bInstallAborted, bIs32BitSetup; - STRING svDir; - STRING svName, svCompany, svSerial; - STRING svDefGroup; - STRING szAppPath; - STRING svSetupType; - NUMBER nResult; - - // your global variables - APPINFO appFullClient; - APPINFO appLightClient; - APPINFO appServer; - APPINFO appControlCenter; - APPINFO appDocs; - APPINFO POINTER pApp; - - BOOL bFullClientSel, bServerSel, bCcSel, bLightClientSel, bDocsSel; - string szCommonBinPath; - string szCodePage; - BOOL bClientInstalled, bServerInstalled, bCcInstalled, bLightClientInstalled, bDocsInstalled; - string szLangComp, szReadmeComp, szDocsComp; - - // WSPP support vars - BOOL bWSPPInstall; - BOOL bPreinstallReplace; - - -//////////////////////////////////////////////////////////////////////////////// -// -// Function Name: Template -// -// Description: This dialog will show a dialog template which can be -// used for creating any user-defined dialog with the -// Windows 95 look and feel. -// Comments: -// -//////////////////////////////////////////////////////////////////////////////// - -number nvSection,nFileIsLocked; -STRING szTemp,szCellName; - -#define IDC_HOMEPATH 301 -#define IDC_ROOTPATH 302 -#define IDC_HOMEDRIVELIST 1007 -#define IDC_ROOTDRIVELIST 1008 -#define IDC_ENABLEROOT 1010 -#define IDC_ENABLEHOME 1011 -#define IDC_INSTALL 1011 -#define IDC_WEB 1016 -#define IDC_CHECK_INSTALL 1018 -#define IDC_CHECK_WEB 1019 -#define IDC_CHECK_BROWSEFILE 1020 -#define IDC_CHECK_PREVIOUSFILE 1021 -#define IDC_PREVIOUSFILE 1024 -#define IDC_BROWSE 1025 -#define IDC_BROWSEFILE 1026 -#define DLG_TEMPLATE 13029 -#define DLG_DRIVEPATH 13030 -#define DLG_CELLSERVDB 13031 -#define IDC_PATH 13032 - -prototype Logit(STRING); -function Logit(szMsg) -HWND handle; -begin - return; - OpenFileMode(FILE_MODE_APPEND); - if (OpenFile (handle, "y:\\dest", "silent.log") < 0) then - CreateFile(handle,"y:\\dest", "silent.log"); - endif; - WriteLine(handle,szMsg); - CloseFile(handle); -end; - -prototype Logitn(STRING,NUMBER); -function Logitn(szMsg,i) -HWND handle; -STRING sz; -begin - Sprintf(sz,szMsg,i); - Logit(sz); -end; -prototype INT GetWebDll.BrowseFile(NUMBER,BYREF STRING,BYREF STRING,NUMBER); -prototype INT GetWebDll.GetWebPage(BYREF STRING,BYREF STRING,BYREF STRING); -prototype INT GetWebDll.GetUserLogon(BYREF STRING); -prototype SetCellServDB(STRING,BYREF NUMBER,BYREF STRING,BYREF STRING,BYREF STRING,BYREF STRING); -prototype FormErrorMessage(NUMBER,BYREF STRING); -prototype SetHomeRoot( STRING,BYREF STRING,BYREF STRING,BYREF STRING,BYREF STRING ); -prototype BOOL getWebCellSrvDB(STRING,STRING); - -prototype BOOL GetDefaultDrive(BYREF NUMBER); -function GetDefaultDrive(listAv) - NUMBER listAc; - NUMBER I,nResult; - STRING item,iitem; -begin - listAc = ListCreate (STRINGLIST); - Enable (STATUS); - SetStatusWindow (50, "Scaning for available Drives..."); - nResult=GetValidDrivesList (listAc, -1,-1); - SetStatusWindow (100, "Completed."); - Delay (2); - if (nResult<0) then - SetStatusWindow(0, ""); - MessageBox ("Scan Drive Error" , SEVERE); - abort; - endif; - SetStatusWindow(0, ""); - listAv = ListCreate (STRINGLIST); - ListAddString(listAv,"None:",AFTER); - ListGetFirstString(listAc, iitem); - for I=67 to 90 - Sprintf(item,"%c",I); - nResult=ListFindString(listAc,item); - if nResult==END_OF_LIST then - ListAddString(listAv,item+":",AFTER); - endif; - ListGetNextString(listAc,iitem); - endfor; - ListDestroy(listAc); - return TRUE; -end; - -function FormErrorMessage(nResult,szResult) -begin - switch(nResult) - case COPY_ERR_CREATEDIR: - szResult=TARGETDIR+ "could not be created. Make sure that you have access rights to the target drive."; - case COPY_ERR_MEMORY: - szResult="The function was unable to allocate the memory required to complete the copy file process. Terminate as many running applications as possible to free memory."; - case COPY_ERR_NODISKSPACE: - szResult="The function could not find enough disk space on "+TARGETDIR+" to copy the files. Free disk space on the target drive."; - case COPY_ERR_OPENINPUT: - szResult="The function was unable to open the input file in "+SRCDIR+". Make sure the source file is a valid filename and that both the source file and target directory exist."; - case COPY_ERR_OPENOUTPUT: - szResult="The function was unable to copy the requested file."; - case COPY_ERR_TARGETREADONLY: - szResult="The file in "+TARGETDIR+" is read-only. Remove the read-only attribute from the target file and try again."; - default: - szResult="Unknown error"; - endswitch; -end; - -function getWebCellSrvDB(szDefaultWeb,szDestFile) - NUMBER nResult; - STRING szFile,szErrMsg,szURL; -begin - szErrMsg=" "; - Enable (STATUS); - SetStatusWindow (50, "Now Downloading CellServDB file..."); - CreateDir(TARGETDIR); - nResult=GetWebPage(szErrMsg,szDestFile,szDefaultWeb); - SetStatusWindow (100, "Downloading completed."); - Delay (2); - if (nResult!=0) then - SetStatusWindow(0, ""); - MessageBox (szErrMsg, INFORMATION); - return FALSE; - endif; - // setup default status - SetStatusWindow(0, ""); - return TRUE; -end; - -// Transfer file to CELLSERVDB -prototype BOOL InstallCellServDB(NUMBER,STRING,STRING); -function InstallCellServDB(DefaultItem,szDefaultWeb,szDefaultBrowse) -STRING szFile,svErrorMessage; -begin - switch (DefaultItem) - case IDC_CHECK_WEB: - nResult=getWebCellSrvDB(szDefaultWeb,TARGETDIR^@CELLSERVDB_CONFIGNAME); - case IDC_CHECK_BROWSEFILE: - // open file and copy to area - ParsePath(szFile,szDefaultBrowse,PATH); - SRCDIR=szFile; - ParsePath(szFile,szDefaultBrowse,FILENAME); - nResult=CopyFile ( szFile ,@CELLSERVDB_CONFIGNAME ); - if nResult < 0 then - if nResult = -1 then - MessageBox ( "CopyFile failed with error code -1!", WARNING ); - else - FormErrorMessage(nResult,svErrorMessage); - SprintfBox ( WARNING, "", - "CopyFile failed!\n\nError code: %ld\nMessage text: %s", - nResult, svErrorMessage ); - endif; - nResult=FALSE; - else - nResult=TRUE; - endif; - case IDC_CHECK_INSTALL: //need to delete because install will never overwrite - SRCDIR=SUPPORTDIR; - nResult=CopyFile (@CELLSERVDB_CONFIGNAME,@CELLSERVDB_CONFIGNAME ); - if nResult < 0 then - if nResult = -1 then - MessageBox ( "CopyFile failed with error code -1!", WARNING ); - else - FormErrorMessage(nResult,svErrorMessage); - SprintfBox ( WARNING, "", - "CopyFile failed!\n\nError code: %ld\nMessage text: %s", - nResult, svErrorMessage ); - endif; - nResult=FALSE; - else - nResult=TRUE; - endif; - case IDC_CHECK_PREVIOUSFILE: - nResult=TRUE;// work is done, it will use previous file - default: - nResult=TRUE; - ; - endswitch; - return nResult; -end; - -// Return TRUE if silent mode active -prototype BOOL SilentSetCellServDB(STRING,NUMBER,NUMBER,NUMBER,BYREF STRING,BYREF STRING); -function SilentSetCellServDB(szDlg,option,nResult,DefaultItem,szDefaultWeb,szDefaultBrowse) -STRING svSection,szTemp; -NUMBER nTemp; -begin - switch (option) - case 0: //READ function - if (MODE!=SILENTMODE) then - return FALSE; - endif; - SdMakeName( svSection, szDlg, "", nvSection ); - SilentReadData( svSection, "Result", DATA_NUMBER,szTemp,nResult); - if (nResult!=NEXT) then - return TRUE; - endif; - SilentReadData( svSection, "DefaultItem", DATA_NUMBER,szTemp,DefaultItem); - SilentReadData( svSection, "szDefaultWeb", DATA_STRING, szDefaultWeb,nTemp); - SilentReadData( svSection, "szDefaultBrowse", DATA_STRING,szDefaultBrowse,nTemp ); - if (InstallCellServDB(DefaultItem,szDefaultWeb,szDefaultBrowse)==FALSE) then - nResult=CANCEL; - else - nResult=NEXT; - endif; - return TRUE; - default: //write - SdMakeName( svSection, szDlg, "", nvSection ); - SilentWriteData( svSection, "Result", DATA_NUMBER,szTemp, nResult ); - SilentWriteData( svSection, "DefaultItem", DATA_NUMBER,szTemp, DefaultItem ); - SilentWriteData( svSection, "szDefaultWeb", DATA_STRING, szDefaultWeb,nTemp ); - SilentWriteData( svSection, "szDefaultBrowse", DATA_STRING, szDefaultBrowse,nTemp ); - return TRUE; - endswitch; -end; - -function SetCellServDB( szTitle,DefaultItem,szPreviousInstall,szDefaultWeb,szDefaultBrowse,szDefaultInstall) -STRING szDlg, szTemp,szResult[256],svErrorMessage,szFile,svSection; -NUMBER bDone, nId, nMessage, nTemp,AvailableDrives,nResult; -INT hwndDlg,hwndItem; - -begin - szDlg = "DLG_CELLSERVDB"; - // record data produced by this dialog - if SilentSetCellServDB(szDlg,0,nResult,DefaultItem,szDefaultWeb,szDefaultBrowse) then - return nResult; - endif; - - // ensure general initialization is complete - if (!bSdInit) then - SdInit(); - endif; - - if (EzDefineDialog( szDlg, "", "", - DLG_CELLSERVDB ) = DLG_ERR) then - return -1; - endif; - - // Loop in dialog until the user selects a standard button - Disable(LOGGING); - VarSave(SRCTARGETDIR); - TARGETDIR=WINDIR; - doagain: - bDone = FALSE; - - while (!bDone) - - nId = WaitOnDialog( szDlg ); - hwndDlg = CmdGetHwndDlg( szDlg ); - - switch(nId) - - case DLG_INIT: - // Initialize List Control - // set file - CtrlSetState (szDlg, DefaultItem,BUTTON_CHECKED); - if !Is(FILE_EXISTS,szPreviousInstall) then - hwndItem = GetDlgItem( hwndDlg, IDC_CHECK_PREVIOUSFILE ); - EnableWindow( hwndItem, FALSE); - endif; - hwndItem = GetDlgItem( hwndDlg, IDC_PREVIOUSFILE ); - EnableWindow( hwndItem, DefaultItem==IDC_CHECK_PREVIOUSFILE); - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSEFILE ); - EnableWindow( hwndItem, DefaultItem==IDC_CHECK_BROWSEFILE); - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSE ); - EnableWindow( hwndItem, DefaultItem==IDC_CHECK_BROWSEFILE); - hwndItem = GetDlgItem( hwndDlg, IDC_WEB ); - EnableWindow( hwndItem, DefaultItem==IDC_CHECK_WEB); - hwndItem = GetDlgItem( hwndDlg, IDC_INSTALL ); - EnableWindow( hwndItem, DefaultItem==IDC_CHECK_INSTALL); - CtrlSetText (szDlg, IDC_PREVIOUSFILE, szPreviousInstall); - CtrlSetText (szDlg, IDC_BROWSEFILE, szDefaultBrowse); - CtrlSetText (szDlg, IDC_WEB, szDefaultWeb); - CtrlSetText (szDlg, IDC_INSTALL, szDefaultInstall); - - SdGeneralInit( szDlg, hwndDlg, STYLE_NORMAL, szSdProduct ); - - //This function sets the caption for old style dialogs or - //sets the text in the top banner area of win2k style dialogs -// SdSetDlgTitle(szDlg, hwndDlg, szTitle); //Version 6.0 only - - case OK: - nId = NEXT; - bDone = TRUE; - - case BACK: - nId = BACK; - bDone = TRUE; - - case DLG_ERR: - SdError( -1, "DLG_CELLSERVDB" ); - nId = -1; - bDone = TRUE; - - case DLG_CLOSE: - SdCloseDlg( hwndDlg, nId, bDone ); - - case IDC_BROWSE: - szResult=szDefaultBrowse; - szTitle="Select file to be used for CellServDB"; - nResult=BrowseFile(hwndDlg,szTitle,szResult,256); - CtrlSetText (szDlg, IDC_BROWSEFILE, szResult); - szDefaultBrowse=szResult; - - case IDC_CHECK_BROWSEFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSEFILE ); - EnableWindow( hwndItem, TRUE); - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSE ); - EnableWindow( hwndItem, TRUE); - CtrlSetState (szDlg, DefaultItem,BUTTON_UNCHECKED); - CtrlSetState (szDlg, nId,BUTTON_CHECKED); - switch (DefaultItem) - case IDC_CHECK_WEB: - hwndItem = GetDlgItem( hwndDlg, IDC_WEB ); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_PREVIOUSFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_PREVIOUSFILE ); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_INSTALL: - hwndItem = GetDlgItem( hwndDlg, IDC_INSTALL); - EnableWindow( hwndItem, FALSE); - default: - ; - endswitch; - DefaultItem=nId; - case IDC_CHECK_INSTALL: - hwndItem = GetDlgItem( hwndDlg, IDC_INSTALL ); - EnableWindow( hwndItem, TRUE); - CtrlSetState (szDlg, DefaultItem,BUTTON_UNCHECKED); - CtrlSetState (szDlg, nId,BUTTON_CHECKED); - switch (DefaultItem) - case IDC_CHECK_BROWSEFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSE ); - EnableWindow( hwndItem, FALSE); - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSEFILE ); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_WEB: - hwndItem = GetDlgItem( hwndDlg, IDC_WEB ); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_PREVIOUSFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_PREVIOUSFILE ); - EnableWindow( hwndItem, FALSE); - default: - ; - endswitch; - DefaultItem=nId; - case IDC_CHECK_WEB: - hwndItem = GetDlgItem( hwndDlg, IDC_WEB ); - EnableWindow( hwndItem, TRUE); - CtrlSetState (szDlg, DefaultItem,BUTTON_UNCHECKED); - CtrlSetState (szDlg, nId,BUTTON_CHECKED); - switch (DefaultItem) - case IDC_CHECK_BROWSEFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSE ); - EnableWindow( hwndItem, FALSE); - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSEFILE ); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_INSTALL: - hwndItem = GetDlgItem( hwndDlg, IDC_INSTALL); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_PREVIOUSFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_PREVIOUSFILE ); - EnableWindow( hwndItem, FALSE); - default: - ; - endswitch; - DefaultItem=nId; - case IDC_CHECK_PREVIOUSFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_PREVIOUSFILE ); - EnableWindow( hwndItem, TRUE); - CtrlSetState (szDlg, DefaultItem,BUTTON_UNCHECKED); - CtrlSetState (szDlg, nId,BUTTON_CHECKED); - switch (DefaultItem) - case IDC_CHECK_BROWSEFILE: - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSE ); - EnableWindow( hwndItem, FALSE); - hwndItem = GetDlgItem( hwndDlg, IDC_BROWSEFILE ); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_INSTALL: - hwndItem = GetDlgItem( hwndDlg, IDC_INSTALL); - EnableWindow( hwndItem, FALSE); - case IDC_CHECK_WEB: - hwndItem = GetDlgItem( hwndDlg, IDC_WEB ); - EnableWindow( hwndItem, FALSE); - default: - ; - endswitch; - DefaultItem=nId; - default: - // check standard handling - if (SdIsStdButton( nId ) && SdDoStdButton( nId )) then - bDone = TRUE; - endif; - endswitch; - - endwhile; - - CtrlGetText (szDlg, IDC_BROWSEFILE, szDefaultBrowse); - CtrlGetText (szDlg, IDC_WEB, szDefaultWeb); - if (nId != NEXT) then - return nId; - endif; - if InstallCellServDB(DefaultItem,szDefaultWeb,szDefaultBrowse)==FALSE then - goto doagain; - endif; - EndDialog( szDlg ); - ReleaseDialog( szDlg ); - VarRestore(SRCTARGETDIR); - Enable(LOGGING); - SdUnInit( ); - // record data produced by this dialog - SilentSetCellServDB(szDlg,1,nId,DefaultItem,szDefaultWeb,szDefaultBrowse); - return nId; -end; - -//////////////////////////////////////////////////////////////////////////////// -// -// Function Name: Template -// -// Description: This dialog will show a dialog template which can be -// used for creating any user-defined dialog with the -// Windows 95 look and feel. -// Comments: -// -//////////////////////////////////////////////////////////////////////////////// - -prototype BOOL GetUser(BYREF STRING); - -function GetUser(sUser) - NUMBER nResult; -begin - sUser=" "; - nResult=GetUserLogon(sUser); - if (nResult!=1) then - sUser=""; - endif; - return (nResult==1); -end; - - -prototype BOOL SetDriveMaps(STRING,STRING,STRING,STRING,STRING); -function SetDriveMaps(szPath,szRootDrive,szRootPath,szHomeDrive,szHomePath) -HWND handle; -begin - VarSave(SRCTARGETDIR); - DeleteFile("afsdsbmt.ini"); - VarRestore(SRCTARGETDIR); - CreateFile(handle, szPath, "afsdsbmt.ini"); - WriteLine(handle, "[AFS Submounts]"); - if (StrLength(szRootDrive)==2) then - WriteLine(handle, "all="+szRootPath); - endif; - if (StrLength(szHomeDrive)==2) then - WriteLine(handle, "home=" + szHomePath); - endif; - WriteLine(handle, "[AFS Mappings]"); - if (StrLength(szRootDrive)>0) then - WriteLine(handle, szRootDrive+"="+szRootPath); - endif; - if (StrLength(szHomeDrive)>0) then - WriteLine(handle, szHomeDrive+"="+szHomePath); - endif; - CloseFile(handle); -end; - -// Return TRUE if silent mode active -prototype BOOL SilentSetHomeRoot(STRING,NUMBER,NUMBER,BYREF STRING,BYREF STRING,BYREF STRING,BYREF STRING); -function SilentSetHomeRoot(szDlg,option,nResult,szRootDrive,szRootPath,szHomeDrive,szHomePath) -STRING svSection,szTemp,szTPath,szTShare,szTDrive,szLogname; -NUMBER nTemp,nCount,I; -HWND handle; -begin - Logitn("SilentSetHomeRoot option=%i",option); - switch (option) - case 0: //READ function - if (MODE!=SILENTMODE) then - return FALSE; - endif; // this section is a little more complicated, allowing installation of n mappings - SdMakeName( svSection, szDlg, "", nvSection ); - Logit("SdMakeName="+svSection); - SilentReadData( svSection, "Result", DATA_NUMBER,szTemp,nResult); - Logitn("nResult=%i",nResult); - if (nResult!=NEXT) then - return TRUE; - endif; - Logit("Do count"); - SilentReadData( svSection, "Count", DATA_NUMBER, szTemp,nCount); - Logitn("nCount=%i",nCount); - if nCount==0 then - return TRUE; - endif; - VarSave(SRCTARGETDIR); - TARGETDIR=WINDIR; - DeleteFile("afsdsbmt.ini"); - VarRestore(SRCTARGETDIR); - CreateFile(handle, WINDIR, "afsdsbmt.ini"); - WriteLine(handle, "[AFS Submounts]"); - for I=0 to nCount-1 - Logitn("I=%i",I); - Sprintf(szTemp,"Path_%i",I); - Logit("Path="+szTemp); - SilentReadData( svSection, szTemp, DATA_STRING, szTPath,nTemp); - Logit("TPath="+szTPath); - if (szTPath % "%LOGINNAME%") then - //Replace loginname with actual loging name - nTemp=StrFind(szTPath,"%LOGINNAME%"); - StrSub(szTemp,szTPath,nTemp+11,StrLength(szTPath)); - StrSub(szTPath,szTPath,0,nTemp); - if (GetUser(szLogname)) then - szTPath=szTPath+szLogname+szTemp; - endif; - endif; - Sprintf(szTemp,"Share_%i",I); - SilentReadData( svSection, szTemp, DATA_STRING, szTShare,nTemp); - WriteLine(handle, szTShare+"="+szTPath); - endfor; - WriteLine(handle, "[AFS Mappings]"); - for I=0 to nCount-1 - Sprintf(szTemp,"Drive_%i",I); - SilentReadData( svSection, szTemp, DATA_STRING, szTDrive,nTemp); - Sprintf(szTemp,"Path_%i",I); - SilentReadData( svSection, szTemp, DATA_STRING, szTPath,nTemp); - if (szTPath % "%LOGINNAME%") then - //Replace loginname with actual loging name - nTemp=StrFind(szTPath,"%LOGINNAME%"); - StrSub(szTemp,szTPath,nTemp+11,StrLength(szTPath)); - StrSub(szTPath,szTPath,0,nTemp); - if (GetUser(szLogname)) then - szTPath=szTPath+szLogname+szTemp; - endif; - endif; - WriteLine(handle, szTDrive+"="+szTPath); - endfor; - CloseFile(handle); - nResult=NEXT; - return TRUE; - default: //write - SdMakeName( svSection, szDlg, "", nvSection ); - nCount=0; - SilentWriteData( svSection, "Result", DATA_NUMBER,szTemp, nResult ); - if (StrLength(szRootDrive)==2) then - Sprintf(szTemp,"Drive_%i",nCount); - SilentWriteData( svSection,szTemp, DATA_STRING,szRootDrive, nTemp );//root drive - Sprintf(szTemp,"Path_%i",nCount); - SilentWriteData( svSection,szTemp, DATA_STRING,szRootPath, nTemp );//root drive - Sprintf(szTemp,"Share_%i",nCount); - SilentWriteData( svSection,szTemp, DATA_STRING,"all", nTemp );//root drive - nCount++; - endif; - if (StrLength(szHomeDrive)==2) then - Sprintf(szTemp,"Drive_%i",nCount); - SilentWriteData( svSection,szTemp, DATA_STRING,szHomeDrive, nTemp );//root drive - Sprintf(szTemp,"Path_%i",nCount); - SilentWriteData( svSection,szTemp, DATA_STRING,szHomePath, nTemp );//root drive - Sprintf(szTemp,"Share_%i",nCount); - SilentWriteData( svSection,szTemp, DATA_STRING,"home", nTemp );//root drive - nCount++; - endif; - SilentWriteData( svSection, "Count", DATA_NUMBER,szTemp, nCount ); // only two can be defined through Dialog box - SetDriveMaps(WINDIR,szRootDrive,szRootPath,szHomeDrive,szHomePath); - return TRUE; - endswitch; -end; - -function SetHomeRoot( szTitle,szRootDrive,szRootPath,szHomeDrive,szHomePath ) - -STRING szDlg, szTemp,svSection; -NUMBER bDone, nId, nMessage, nTemp,AvailableDrives,nResult; -INT hwndDlg,hwndItem,hwndItem2; - -begin - szDlg = "DLG_DRIVEPATH"; - - // record data produced by this dialog - Logit("SetHomeRoot"); - if SilentSetHomeRoot(szDlg,0,nResult,szRootDrive,szRootPath,szHomeDrive,szHomePath ) then - return nResult; - endif; - - GetDefaultDrive(AvailableDrives); - // ensure general initialization is complete - if (!bSdInit) then - SdInit(); - endif; - - if (EzDefineDialog( szDlg, "", "", - DLG_DRIVEPATH ) = DLG_ERR) then - return -1; - endif; - - // Loop in dialog until the user selects a standard button - bDone = FALSE; - - while (!bDone) - - nId = WaitOnDialog( szDlg ); - - switch(nId) - - case DLG_INIT: - hwndDlg = CmdGetHwndDlg( szDlg ); - // Initialize List Control - nResult=CtrlSetList( szDlg, IDC_HOMEDRIVELIST, AvailableDrives ); - if (nResult != 0) then - // Handle error from CtrlSetList. - MessageBox ("Unable to create folder name list.", SEVERE); - bDone = TRUE; - endif; - if (CtrlSetCurSel(szDlg,IDC_HOMEDRIVELIST,szHomeDrive)!=0) then - szHomeDrive="None:"; - CtrlSetCurSel(szDlg,IDC_HOMEDRIVELIST,szHomeDrive); - endif; - - nResult=CtrlSetList( szDlg, IDC_ROOTDRIVELIST, AvailableDrives ); - if (nResult != 0) then - // Handle error from CtrlSetList. - MessageBox ("Unable to create folder name list.", SEVERE); - bDone = TRUE; - endif; - if (CtrlSetCurSel(szDlg,IDC_ROOTDRIVELIST,szRootDrive)!=0) then - szRootDrive="None:"; - CtrlSetCurSel(szDlg,IDC_ROOTDRIVELIST,szRootDrive); - endif; - - nResult=CtrlSetText( szDlg, IDC_ROOTPATH,szRootPath ); - if (nResult != 0) then - MessageBox ("Unable to create szRootPath.", SEVERE); - bDone = TRUE; - endif; - nResult=CtrlSetText( szDlg, IDC_HOMEPATH,szHomePath ); - if (nResult != 0) then - MessageBox ("Unable to create szHomePath.", SEVERE); - bDone = TRUE; - endif; - - CtrlSetState (szDlg, IDC_ENABLEHOME,BUTTON_CHECKED); - CtrlSetState (szDlg, IDC_ENABLEROOT,BUTTON_CHECKED); - SdGeneralInit( szDlg, hwndDlg, STYLE_NORMAL, szSdProduct ); - - //This function sets the caption for old style dialogs or - //sets the text in the top banner area of win2k style dialogs - case OK: - if (szRootDrive!=szHomeDrive) then - nId = NEXT; - bDone = TRUE; - else - MessageBox("Home and Root drives cannot be the same",WARNING); - endif; - - case BACK: - nId = BACK; - bDone = TRUE; - - case DLG_ERR: - SdError( -1, "DLG_DRIVEPATH" ); - nId = -1; - bDone = TRUE; - - case DLG_CLOSE: - SdCloseDlg( hwndDlg, nId, bDone ); - - case IDC_ENABLEROOT: - - hwndItem = GetDlgItem( hwndDlg, IDC_ROOTDRIVELIST );//get handle of control in custom dialog box - hwndItem2 = GetDlgItem( hwndDlg, IDC_ROOTPATH );//get handle of control in custom dialog box - if (CtrlGetState (szDlg, nId)==BUTTON_CHECKED) then - EnableWindow( hwndItem2, TRUE); - EnableWindow( hwndItem, TRUE); - else - EnableWindow( hwndItem2, FALSE); - EnableWindow( hwndItem, FALSE); - endif; - case IDC_ENABLEHOME: - hwndItem = GetDlgItem( hwndDlg, IDC_HOMEDRIVELIST );//get handle of control in custom dialog box - hwndItem2 = GetDlgItem( hwndDlg, IDC_HOMEPATH );//get handle of control in custom dialog box - if (CtrlGetState (szDlg, nId)==BUTTON_CHECKED) then - EnableWindow( hwndItem2, TRUE); - EnableWindow( hwndItem, TRUE); - else - EnableWindow( hwndItem2, FALSE); - EnableWindow( hwndItem, FALSE); - endif; - - case IDC_HOMEDRIVELIST: - ; - case IDC_ROOTDRIVELIST: - ; - case IDC_HOMEPATH: - CtrlGetText (szDlg, nId,szHomePath); - - case IDC_ROOTPATH: - CtrlGetText (szDlg, nId,szRootPath); - - default: - // check standard handling - if (SdIsStdButton( nId ) && SdDoStdButton( nId )) then - bDone = TRUE; - endif; - endswitch; - - endwhile; - - CtrlGetCurSel (szDlg, nId, szRootDrive); - if (CtrlGetState (szDlg, IDC_ENABLEROOT)==BUTTON_UNCHECKED) then - szRootDrive="None:"; - endif; - CtrlGetCurSel (szDlg, nId, szHomeDrive); - if (CtrlGetState (szDlg, IDC_ENABLEHOME)==BUTTON_UNCHECKED) then - szHomeDrive="None:"; - endif; - EndDialog( szDlg ); - ReleaseDialog( szDlg ); - - SdUnInit( ); - - // record data produced by this dialog - if (nId==NEXT) then - SilentSetHomeRoot(szDlg,1,nId,szRootDrive,szRootPath,szHomeDrive,szHomePath ); - endif; - ListDestroy (AvailableDrives); - return nId; - -end; - - -// ---- script function prototypes ----- - - - // your script function prototypes - - - -/////////////////////////////////////////////////////////////////////////////// -// -// MAIN PROGRAM -// -// The setup begins here by hiding the visible setup -// window. This is done to allow all the titles, images, etc. to -// be established before showing the main window. The setup is -// then performed in a series of calls to script defined functions, -// with error checking at each step. -// -/////////////////////////////////////////////////////////////////////////////// -program - Logit("Begin"); - nvSection=0; - Disable( BACKGROUND ); - if (UseDLL(SUPPORTDIR ^ SETUP_UTILS_DLL_PATH) < 0) then - ShowError(@SETUPUTILS_NOT_FOUND, SEVERE); - bInstallAborted = TRUE; - goto end_install; - endif; - Logit("UseDLL1"); - ChangeDirectory (SUPPORTDIR); - if (UseDLL("GetWebDLL.dll") != 0) then - MessageBox ("DLL failed.\n\nCouldn't load"+SUPPORTDIR^"GetWebDLL.dll", INFORMATION); - abort; - endif; - Logit("UseDLL2"); - - SetupInstall(); - Logit("SetupInstall"); - - CheckRequirements(); - Logit("CheckRequirements"); - - ParseCommandLine(); - Logit("ParseCommandLine"); - - SetupAppInfo(); - Logit("SetupAppInfo"); - - LocalizeComponents(); - Logit("LocalizeComponents"); - - DetectInstalledComponents(); - Logit("DetectInstalledComponents"); - - // Can't upgrade, downgrade, or reinstall the light client, so if it is - // already installed, we must abort. This is because on Win9x, we can't - // move in-use files, and so we can't silently uninstall the light client, - // which upgrade, downgrade, and reinstall require. - if (bLightClientInstalled && !bWinNT) then - ShowError(@LIGHT_CLIENT_ALREADY_INSTALLED_MSG, SEVERE); - bInstallAborted = TRUE; - goto end_install; - endif; - - if (AnyNonUpgradableSoftwareInstalled()) then - ShowError(@NON_UPGRADABLE_SOFTWARE_INSTALLED_ERROR_MSG, SEVERE); - bInstallAborted = TRUE; - goto end_install; - endif; - - GetInstallActions(); - - if (bWSPPInstall) then - SetSilentMode(); // Tells the InstallUtils dll to run silently - PrepareForWSPPInstall(); - else - // Ask user what to install - SetupScreen(); - if (ShowDialogs()<0) goto end_install; - endif; - - // The AFS path must not contain spaces. AFS code will break if it does. - LongPathToShortPath(TARGETDIR); - - // Determine which comps to install to get the proper NLS files. - GetNlsComps(szLangComp, szReadmeComp, szDocsComp, szCodePage); - - SetUserVars(); - - CreateDirs(); - - // Uninstall current versions before we install - RemoveAllCurrentVersions(); - - // Install the Client - if (bFullClientSel) then - RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE); - Enable(LOGGING); - if RegDBSetKeyValueEx ("SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters" - ,"SmbDeviceEnabled", REGDB_NUMBER, "0", 8) < 0 then - MessageBox ("RegDBCreateKeyEx failed.", SEVERE); - abort; - endif; - pApp = &appFullClient; - if (InstallApp(pApp) < 0) goto end_install; - endif; - if RegDBSetKeyValueEx("SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters","Cell", REGDB_STRING, szCellName, -1) < 0 then - MessageBox ("RegDBCreateKeyEx failed.", SEVERE); - abort; - endif; - // Install the Light Client - if (bLightClientSel) then - pApp = &appLightClient; - if (InstallApp(pApp) < 0) goto end_install; - if (bWin95) then - EzBatchAddString(LIGHT95_CLIENT_PROTSEQ, "", AFTER | REPLACE); - endif; - endif; - - // Install the Server - if (bServerSel) then - pApp = &appServer; - if (InstallApp(pApp) < 0) goto end_install; - CreateServerDirs(); - endif; - - // Install the Control Center - if (bCcSel) then - pApp = &appControlCenter; - if (InstallApp(pApp) < 0) goto end_install; - endif; - - // Install the Docs - if (bDocsSel) then - appDocs.szCompName = szDocsComp; - pApp = &appDocs; - if (InstallApp(pApp) < 0) goto end_install; - endif; - - // If we installed the server, then configure the bos service - if (bServerSel) then - if (ConfigServerService() < 0) goto end_install; - endif; - - // If we installed the full client, then configure the client service - // and add the NetworkProviderOrder value. - if (bFullClientSel) then - if (ConfigClientService() < 0) goto end_install; - // I'm commenting out the line below. This will result in integrated - // login being off after an install. If you want it to be on after an - // install, then uncomment the line. - // if (SetNetworkProviderOrder() < 0) goto end_install; - endif; - - if (bFullClientSel || bLightClientSel) then - ConfigAfsCreds(); - endif; - - RestorePreviousConfigs(); - - AddPath(szCommonBinPath); - - // If not only installing docs, then set BATCH_INSTALL to true, - // which will cause setup to want to reboot the computer. - if (OnlyInstallingDocs() == FALSE) then - BATCH_INSTALL = TRUE; - endif; - - CreateStartMenuEntries(); - -// if (bFullClientSel || bLightClientSel || bCcSel) then -// CheckCopyCellServDB(); -// endif; - - end_install: - - UnUseDLL(SUPPORTDIR^"GetWebDLL.dll"); - UnUseDLL(SUPPORTDIR ^ SETUP_UTILS_DLL_PATH); - - CleanUpInstall(); - - // If an unrecoverable error occurred, clean up - // the partial installation. Otherwise, exit normally. - if (bInstallAborted) then - abort; - endif; - -endprogram - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ShowDialogs -// -// Purpose: This function manages the display and navigation of -// the standard dialogs that exist in a setup. -// -/////////////////////////////////////////////////////////////////////////////// -function ShowDialogs() - NUMBER nResult,handle; - STRING szTargetLicense; - STRING szSourceLicense; - STRING sRootDrive,sHomeDrive,userID,rootPath,homePath; - NUMBER DefaultItem; - STRING szDefaultWeb,szDefaultBrowse,szDefaultInstall,szPreviousInstall; - STRING szResult[256],svResult; -begin - Dlg_Start: - // beginning of dialogs label - Dlg_SdWelcome: - nResult = DialogShowSdWelcome(); - if (nResult = BACK) goto Dlg_Start; - - Dlg_License: -// szTargetLicense = DOCUMENTATION_LICENSE_PATH; -// GetLicenseFilename (szSourceLicense); -// Logit("ShowLicense"); -// Disable( DIALOGCACHE ); -// if (MODE!=SILENTMODE) then -// nResult = ShowLicense(szTargetLicense,szSourceLicense); -// if (nResult = 0) then -// abort; -// endif; -// Enable( DIALOGCACHE ); -// endif; - if (nResult = BACK) goto Dlg_Start; - Dlg_SdCompDlg: - nResult = DialogShowSdAskComponentDialog(); - Logit("DialogShowSdAskComponentDialog"); - if (nResult = BACK) goto Dlg_License; - - Dlg_SdSelectFolder: - nResult = DialogShowSdSelectFolder(); - Logit("DialogShowSdSelectFolder"); - if (nResult = BACK) goto Dlg_SdCompDlg; - if (bFullClientSel || bLightClientSel) then - szDefaultWeb=@CELLSERVDB_WEB; - szDefaultBrowse=TARGETDIR^"*"; - szDefaultInstall=@CELLSERVDB_INSTALL; - szPreviousInstall=WINDIR^@CELLSERVDB_CONFIGNAME; - if (Is(FILE_EXISTS,szPreviousInstall)) then - DefaultItem=IDC_CHECK_PREVIOUSFILE; - else - DefaultItem=IDC_CHECK_INSTALL; - endif; - Dlg_SdSelectCellServDB: - Logit("SetCellServDB-next"); - nResult =SetCellServDB("Select AFS Cell Data base (afsdcell.ini)" - ,DefaultItem - ,szPreviousInstall - ,szDefaultWeb - ,szDefaultBrowse - ,szDefaultInstall); - Logit("SetCellServDB"); - if (nResult=BACK) goto Dlg_SdSelectFolder; - Dlg_SdSelectCellName: - nResult=SdShowDlgEdit1 ("Select AFS Cell Name","A valid cell name should be entered here.\nIf you don't know your cell name, you may enter one after installation using the AFS Control Center.","Enter Cell Name:", szCellName); - if (nResult = BACK) goto Dlg_SdSelectCellName; - if (Is(FILE_EXISTS, WINDIR^"afsdsbmt.ini")) then - Logit("AskYesNo next"); - if (AskYesNo("Previous Drive Mapping Configuration already exist.\n\nPress Yes to keep previous configuration\nPress No to change previous configuration.",YES)=YES) then - return 0; - endif; - endif; - userID=" "; - GetUser(userID); - sRootDrive="Z:"; - sHomeDrive="U:"; - rootPath="/"; - homePath = "/afs/" + szCellName + "/u/" + userID; - nResult=SetHomeRoot( "Home and Root Drive Assignment\nThese drives will be mapped each time AFS is connected!",sRootDrive,rootPath,sHomeDrive,homePath ); - Logit("SetHomeRoot"); - if (nResult = BACK) goto Dlg_SdSelectCellServDB; - endif; - Logit("ShowDialogs-done"); - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: NotUpgradable -// -// Purpose: This function will return TRUE if the passed in version is not -// upgradable. -// -/////////////////////////////////////////////////////////////////////////////// -function NotUpgradable(pApp) -begin - // The 3.5 beta is not upgradable -// if ((pApp->iVer.nMajorVersion = 3) && (pApp->iVer.nMinorVersion = 5) && (pApp->iVer.nPatchLevel = 0) && (pApp->iVer.szReleaseType = RELEASE_TYPE_BETA)) then -// return TRUE; -// endif; - - return FALSE; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: AnyNonUpgradableSoftwareInstalled -// -// Purpose: This function will return TRUE if any non-upgradable software is -// installed. -// -/////////////////////////////////////////////////////////////////////////////// -function AnyNonUpgradableSoftwareInstalled() -begin - if (NotUpgradable(&appFullClient) || - NotUpgradable(&appServer) || - NotUpgradable(&appControlCenter) || - NotUpgradable(&appLightClient) || - NotUpgradable(&appDocs)) - then - return TRUE; - endif; - - return FALSE; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: UnselectComps -// -// Purpose: This function unselects all of the componenets so that we can -// completely control what gets installed. We will select each -// component at the time when we want to install it. -// -/////////////////////////////////////////////////////////////////////////////// -function UnselectComps() -begin - ComponentSelectItem(MEDIA, SERVER_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, CLIENT_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LIGHT_CLIENT_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, CC_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_ENGLISH_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_SIMP_CHINESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_TRAD_CHINESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_KOREAN_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_JAPANESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_GERMAN_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_SPANISH_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, LANG_PORTUGUESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_ENGLISH_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_JAPANESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_KOREAN_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_SIMP_CHINESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_TRAD_CHINESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_GERMAN_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_SPANISH_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, README_PORTUGUESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_ENGLISH_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_JAPANESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_KOREAN_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_SIMP_CHINESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_TRAD_CHINESE_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_GERMAN_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_SPANISH_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_PORTUGUESE_COMP_NAME, FALSE); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DoesConfigInfoExist -// -// Purpose: This function determines if config info exists for an app. -// -/////////////////////////////////////////////////////////////////////////////// -function DoesConfigInfoExist(pApp) -begin - RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); - - if (RegDBKeyExist(CONFIG_INFO_KEY ^ pApp->szProductName) = 1) then - return TRUE; - endif; - - return FALSE; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: RestorePreviousConfigs -// -// Purpose: This function restores config info for the apps we just installed. -// -/////////////////////////////////////////////////////////////////////////////// -function RestorePreviousConfigs() -begin - if (appServer.bInstallSucceeded && DoesConfigInfoExist(&appServer)) then - RestoreConfigInfo(SERVER); - endif; - - if (appFullClient.bInstallSucceeded) then - if (appFullClient.iVer.szTitle = "3.4a") then - Upgrade34ClientConfigInfo(); - elseif (DoesConfigInfoExist(&appFullClient) = TRUE) then - RestoreConfigInfo(CLIENT); - endif; - endif; - - if (appLightClient.bInstallSucceeded && DoesConfigInfoExist(&appLightClient)) then - RestoreConfigInfo(LCLIENT); - endif; - - // Only restore control center info if client not installed - if (appControlCenter.bInstallSucceeded && !bClientInstalled && !appFullClient.bInstallSucceeded - && DoesConfigInfoExist(&appControlCenter)) - then - RestoreConfigInfo(CC); - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: OnlyInstallingDocs -// -// Purpose: This function determines if only the doc files are being installed. -// -/////////////////////////////////////////////////////////////////////////////// -function OnlyInstallingDocs() -begin - if (!bServerSel && !bFullClientSel && !bLightClientSel && !bCcSel && bDocsSel) then - return TRUE; - endif; - - return FALSE; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CreateDirs -// -// Purpose: This function creates directories that we don't want IS to make. -// -/////////////////////////////////////////////////////////////////////////////// -function CreateDirs() -begin - // Turn off logging. It shouldn't be on when this func is called, but we - // turn it off anyway just to make sure. We turn it off so that IS won't - // try to delete the dirs we are about to make during an uninstall. If - // we don't do this, then the first app installed that uses one of these - // dirs will think that it owns that dir and won't know that other apps - // are sharing it. - Disable(LOGGING); - - // Create the target dir and the shared dirs - CreateDir(TARGETDIR); - CreateDir(TARGETDIR ^ "Documentation"); - CreateDir(TARGETDIR ^ "Documentation\\Html"); - CreateDir(TARGETDIR ^ "Documentation\\Html\\InstallGd"); - CreateDir(TARGETDIR ^ "Documentation\\Html\\ReleaseNotes"); - - // We need to manually create the Server dir so that if we have to leave - // it behind during an uninstall (so that config info is preserved), IS - // won't complain that it can't be deleted. - if (bServerSel) then - CreateDir(TARGETDIR ^ "Server\\usr\\afs\\bin"); - endif; - - // Docs don't use the common dir - if (OnlyInstallingDocs() = FALSE) then - CreateDir(TARGETDIR ^ "Common"); - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: PrepareForWSPPInstall -// -// Purpose: This function decides what to install when doing a WSPP install. -// -/////////////////////////////////////////////////////////////////////////////// -function PrepareForWSPPInstall() -begin - SHELL_OBJECT_FOLDER = @WSPP_FOLDER_NAME; - - // Never install the Docs during a WSPP install - appDocs.nInstallAction = ACTION_NONE; - - // If we have been told to replace any preinstalled software, then set - // our reinstall mechanism in motion. - if (bPreinstallReplace) then - if (bCcInstalled && bCcSel) then - appControlCenter.nInstallAction = ACTION_REINSTALL; - endif; - if (bClientInstalled && bFullClientSel) then - appFullClient.nInstallAction = ACTION_REINSTALL; - endif; - if (bServerInstalled && bServerSel) then - appServer.nInstallAction = ACTION_REINSTALL; - endif; - if (bLightClientInstalled && bLightClientSel) then - appLightClient.nInstallAction = ACTION_REINSTALL; - endif; - else - // If we have been told to not install something that is already - // installed, then do just that. - if (bCcInstalled && bCcSel) then - bCcSel = FALSE; - endif; - if (bClientInstalled && bFullClientSel) then - bFullClientSel = FALSE; - endif; - if (bServerInstalled && bServerSel) then - bServerSel = FALSE; - endif; - if (bLightClientInstalled && bLightClientSel) then - bLightClientSel = FALSE; - endif; - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: RemoveCurrentVersion -// -// Purpose: This function removes the currently installed version of the app. -// It provides a message to the user so they know what is going on. -// -/////////////////////////////////////////////////////////////////////////////// -function RemoveCurrentVersion(pApp) - string szMsg; - string szFormat; -begin - szFormat = ""; - - switch(pApp->nInstallAction) - case ACTION_REINSTALL: szFormat = @REINSTALL_PREP_MSG; - case ACTION_UPGRADE: szFormat = @UPGRADE_PREP_MSG; - case ACTION_DOWNGRADE: szFormat = @DOWNGRADE_PREP_MSG; - endswitch; - - if (szFormat == "") then - return; - endif; - - Sprintf(szMsg, szFormat, pApp->szProductName); - - if (!bWSPPInstall) then - SdShowMsg(szMsg, TRUE); - endif; - - RemoveInstalledBits(pApp->szProductName); - - if (!bWSPPInstall) then - SdShowMsg(szMsg, FALSE); - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: RemoveAllCurrentVersions -// -// Purpose: This function removes the current install of all apps that are -// begin reinstalled, upgraded, or downgraded. -// -/////////////////////////////////////////////////////////////////////////////// -function RemoveAllCurrentVersions() -begin - if (bFullClientSel) then - RemoveCurrentVersion(&appFullClient); - endif; - - if (bServerSel) then - RemoveCurrentVersion(&appServer); - endif; - - if (bCcSel) then - RemoveCurrentVersion(&appControlCenter); - endif; - - if (bLightClientSel) then - RemoveCurrentVersion(&appLightClient); - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: InstallApp -// -// Purpose: This function installs an application that is part of a suite. -// -/////////////////////////////////////////////////////////////////////////////// -function InstallApp(pApp) - NUMBER nResult; -begin - if (pApp->nInstallAction = ACTION_NONE) then - return 0; - endif; - - // Start fresh with nothing selected - UnselectComps(); - - // Select the comps we want to install. We will install the passed in app - // as well as the comps that are shared by all the apps. Because of weird - // IS stuff, the app comp must be selected last else IS will autoselect - // things we don't want. - ComponentSelectItem(MEDIA, szReadmeComp, TRUE); - - // Lang comps are shared by all apps except the docs app - if (pApp != &appDocs) then - ComponentSelectItem(MEDIA, szLangComp, TRUE); - endif; - - // Select the app's component - ComponentSelectItem(MEDIA, pApp->szCompName, TRUE); - -// MessageBox("Install app: " + pApp->szCompName, INFORMATION); - - nResult = ProcessBeforeDataMove(pApp); - if (nResult < 0) goto error; - - nResult = MoveFileData(); - if (nResult < 0) goto error; - - nResult = ProcessAfterDataMove(); - if (nResult < 0) goto error; - - nResult = CreateRegistrySets(pApp->szRegistrySets); - if (nResult < 0) goto error; - - Disable(LOGGING); - - nResult = CreateRegistrySets(pApp->szNoLogRegistrySets); - if (nResult < 0) goto error; - - nResult = ConfigUninstallDLL(pApp); - if (nResult < 0) goto error; - - AddPath(pApp->szBinPath); - - // Now unselect it again - ComponentSelectItem(MEDIA, pApp->szCompName, FALSE); - - pApp->bInstallSucceeded = TRUE; - - return 0; - -error: - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ProcessBeforeDataMove -// -// Purpose: This function performs any necessary operations prior to the -// actual file transfer. -// -/////////////////////////////////////////////////////////////////////////////// -function ProcessBeforeDataMove(pApp) - STRING svLogFile; - NUMBER nResult; -begin - // Create app information and App Paths registry keys. - InstallationInfo(pApp->szCompanyName, pApp->szProductName, pApp->Ver.szTitle, pApp->szProductKey); - - svLogFile = pApp->szUninstLogfileName; - - // Create the uninstall reg key and open the log file - nResult = DeinstallStart(TARGETDIR, svLogFile, pApp->szUninstKey, 0 ); - if (nResult < 0) then - ShowError( @ERROR_UNINSTSETUP, WARNING ); - endif; - - szAppPath = pApp->szAppPath; - - // Fill in reg values for this apps reg key and uninstall reg key - RegDBSetItem( REGDB_APPPATH, szAppPath ); - RegDBSetItem( REGDB_APPPATH_DEFAULT, szAppPath ^ pApp->szProductKey); - RegDBSetItem( REGDB_UNINSTALL_NAME, pApp->szUninstDisplayName); - - return 0; -end; - - -/* -function ShowIsSelected(comp) - number nSel; - string str; -begin - nSel = ComponentIsItemSelected(MEDIA , comp); - if (nSel) then - str = comp + " is selected."; - MessageBox(str, INFORMATION); - else - str = comp + " is not selected."; - endif; -end; - - -function ShowSelectedComponents() -begin - // Visible components - ShowIsSelected(CLIENT_COMP_NAME); - ShowIsSelected(LIGHT_CLIENT_COMP_NAME); - ShowIsSelected(SERVER_COMP_NAME); - ShowIsSelected(CC_COMP_NAME); - ShowIsSelected(DOCS_COMP_NAME); - - // Language components - ShowIsSelected(LANG_COMP_NAME); - ShowIsSelected(LANG_ENGLISH_COMP_NAME); - ShowIsSelected(LANG_SIMP_CHINESE_COMP_NAME); - ShowIsSelected(LANG_TRAD_CHINESE_COMP_NAME); - ShowIsSelected(LANG_KOREAN_COMP_NAME); - ShowIsSelected(LANG_JAPANESE_COMP_NAME); - ShowIsSelected(LANG_GERMAN_COMP_NAME); - ShowIsSelected(LANG_SPANISH_COMP_NAME); - ShowIsSelected(LANG_PORTUGUESE_COMP_NAME); - - // Documentation components - ShowIsSelected(DOCS_ENGLISH_COMP_NAME); - ShowIsSelected(DOCS_JAPANESE_COMP_NAME); - ShowIsSelected(DOCS_KOREAN_COMP_NAME); - ShowIsSelected(DOCS_SIMP_CHINESE_COMP_NAME); - ShowIsSelected(DOCS_TRAD_CHINESE_COMP_NAME); - ShowIsSelected(DOCS_GERMAN_COMP_NAME); - ShowIsSelected(DOCS_SPANISH_COMP_NAME); - ShowIsSelected(DOCS_PORTUGUESE_COMP_NAME); - - // Readme files components - ShowIsSelected(README_COMP_NAME); - ShowIsSelected(README_ENGLISH_COMP_NAME); - ShowIsSelected(README_JAPANESE_COMP_NAME); - ShowIsSelected(README_KOREAN_COMP_NAME); - ShowIsSelected(README_SIMP_CHINESE_COMP_NAME); - ShowIsSelected(README_TRAD_CHINESE_COMP_NAME); - ShowIsSelected(README_GERMAN_COMP_NAME); - ShowIsSelected(README_SPANISH_COMP_NAME); - ShowIsSelected(README_PORTUGUESE_COMP_NAME); -end; -*/ - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: MoveFileData -// -// Purpose: This function handles the file transfer for -// the setup. -// -/////////////////////////////////////////////////////////////////////////////// -function MoveFileData() - NUMBER nResult, nDisk; - -begin - if (!bWSPPInstall) then - Enable( INDVFILESTATUS ); - SetStatusWindow( 0, "" ); - Disable( DIALOGCACHE ); - Enable( STATUS ); - StatusUpdate( ON, 100 ); - endif; - - nResult = ComponentMoveData( MEDIA, nDisk, 0 ); - - // Reinit this call so the progress indicator resets - ComponentMoveData("", nDisk, 0); - - HandleMoveDataError( nResult ); - - Disable( STATUS ); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: HandleMoveDataError -// -// Purpose: This function handles the error (if any) during the file transfer -// operation. -// -/////////////////////////////////////////////////////////////////////////////// -function HandleMoveDataError( nResult ) - STRING szErrMsg, svComponent , svFileGroup , svFile; - string szMsg; -begin - svComponent = ""; - svFileGroup = ""; - svFile = ""; - - switch (nResult) - case 0: - return 0; - default: - ComponentError ( MEDIA , svComponent , svFileGroup , svFile , nResult ); - szErrMsg = @ERROR_MOVEDATA + "\n\n" + - @ERROR_COMPONENT + " " + svComponent + "\n" + - @ERROR_FILEGROUP + " " + svFileGroup + "\n" + - @ERROR_FILE + " " + svFile; - Sprintf(szMsg, szErrMsg, nResult); - ShowError(szMsg, SEVERE); - bInstallAborted = TRUE; - return nResult; - endswitch; - -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ProcessAfterDataMove -// -// Purpose: This function performs any necessary operations needed after -// all files have been transferred. -// -/////////////////////////////////////////////////////////////////////////////// -function ProcessAfterDataMove() - STRING szReferenceFile; - -begin - - // TO DO : update self-registered files and other processes that - // should be performed after the files have been transferred. - - // DeinstallSetReference specifies a file to be checked before - // uninstallation. If the file is in use, uninstallation will not proceed. - -// szReferenceFile = svDir ^ pApp->szProductKey; // TO DO : If your file is in a - // subfolder of svDir add that here - -// DeinstallSetReference( szReferenceFile ); - - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CleanUpInstall -// -// Purpose: This cleans up the setup. Anything that should -// be released or deleted at the end of the setup should -// be done here. -// -/////////////////////////////////////////////////////////////////////////////// -function CleanUpInstall() - -begin - if (bInstallAborted) then - return 0; - endif; - - if (!bWSPPInstall) then - DialogShowSdFinishReboot(); - endif; - - if (BATCH_INSTALL) then // ensure locked files are properly transferred - CommitSharedFiles(0); - endif; - - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: GetLicenseFilename -// -// Purpose: This will determine the full path to the appropriate-language -// license on the CD. Will default to English if the locale cannot -// be determined. -// -/////////////////////////////////////////////////////////////////////////////// -function GetLicenseFilename(szLicense) - number MajorLanguage; -begin - MajorLanguage = SELECTED_LANGUAGE & 255; - - switch(MajorLanguage) - case ISLANG_CHINESE: - if (SELECTED_LANGUAGE == ISLANG_CHINESE_TAIWAN) then - szLicense = SRCDIR ^ LICENSE_TRAD_CHINESE_FILENAME; - else - szLicense = SRCDIR ^ LICENSE_SIMP_CHINESE_FILENAME; - endif; - - case ISLANG_KOREAN: - szLicense = SRCDIR ^ LICENSE_KOREAN_FILENAME; - - case ISLANG_JAPANESE: - szLicense = SRCDIR ^ LICENSE_JAPANESE_FILENAME; - - case ISLANG_GERMAN: - szLicense = SRCDIR ^ LICENSE_GERMAN_FILENAME; - - case ISLANG_PORTUGUESE: - szLicense = SRCDIR ^ LICENSE_PORTUGUESE_FILENAME; - - case ISLANG_SPANISH: - szLicense = SRCDIR ^ LICENSE_SPANISH_FILENAME; - - default: - szLicense = SRCDIR ^ LICENSE_ENGLISH_FILENAME; - - endswitch; - - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: GetLanguageComp -// -// Purpose: This will determine which language the locale is set to. Uses -// this info to determine which lang, readme, and doc comps to -// install. Will default to English if the locale cannot be -// determined. -// -/////////////////////////////////////////////////////////////////////////////// -function GetNlsComps(szLangComp, szReadmeComp, szDocsComp, szCodePage) - number MajorLanguage; -begin - MajorLanguage = SELECTED_LANGUAGE & 255; - - switch(MajorLanguage) - case ISLANG_CHINESE: - if (SELECTED_LANGUAGE == ISLANG_CHINESE_TAIWAN) then - szLangComp = LANG_TRAD_CHINESE_COMP_NAME; - szReadmeComp = README_TRAD_CHINESE_COMP_NAME; - szDocsComp = DOCS_TRAD_CHINESE_COMP_NAME; - szCodePage = "1028"; - else - szLangComp = LANG_SIMP_CHINESE_COMP_NAME; - szReadmeComp = README_SIMP_CHINESE_COMP_NAME; - szDocsComp = DOCS_SIMP_CHINESE_COMP_NAME; - szCodePage = "2052"; - endif; - - case ISLANG_KOREAN: - szLangComp = LANG_KOREAN_COMP_NAME; - szReadmeComp = README_KOREAN_COMP_NAME; - szDocsComp = DOCS_KOREAN_COMP_NAME; - szCodePage = "1042"; - - case ISLANG_JAPANESE: - szLangComp = LANG_JAPANESE_COMP_NAME; - szReadmeComp = README_JAPANESE_COMP_NAME; - szDocsComp = DOCS_JAPANESE_COMP_NAME; - szCodePage = "1041"; - - case ISLANG_GERMAN: - szLangComp = LANG_GERMAN_COMP_NAME; - szReadmeComp = README_GERMAN_COMP_NAME; - szDocsComp = DOCS_GERMAN_COMP_NAME; - szCodePage = "1032"; - - case ISLANG_PORTUGUESE: - szLangComp = LANG_PORTUGUESE_COMP_NAME; - szReadmeComp = README_PORTUGUESE_COMP_NAME; - szDocsComp = DOCS_PORTUGUESE_COMP_NAME; - szCodePage = "1046"; - - case ISLANG_SPANISH: - szLangComp = LANG_SPANISH_COMP_NAME; - szReadmeComp = README_SPANISH_COMP_NAME; - szDocsComp = DOCS_SPANISH_COMP_NAME; - szCodePage = "1034"; - - default: - szLangComp = LANG_ENGLISH_COMP_NAME; - szReadmeComp = README_ENGLISH_COMP_NAME; - szDocsComp = DOCS_ENGLISH_COMP_NAME; - szCodePage = "1033"; - - endswitch; - - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: SetupVerInfo -// -// Purpose: This will initialize the VERINFO structures for a product. -// -/////////////////////////////////////////////////////////////////////////////// -function SetupVerInfo(pApp, szMajor, szMinor, szPatchLevel, szBetaLevel, szReleaseType, szTitle, bInstalledVerInfo) - int nMajor; - int nMinor; - int nPatchLevel; - int nBetaLevel; -begin - StrToNum(nMajor, szMajor); - StrToNum(nMinor, szMinor); - StrToNum(nPatchLevel, szPatchLevel); - StrToNum(nBetaLevel, szBetaLevel); - - if (bInstalledVerInfo) then - pApp->iVer.nMajorVersion = nMajor; - pApp->iVer.nMinorVersion = nMinor; - pApp->iVer.nPatchLevel = nPatchLevel; - pApp->iVer.nBetaLevel = nBetaLevel; - pApp->iVer.szReleaseType = szReleaseType; - pApp->iVer.szTitle = szTitle; - else - pApp->Ver.nMajorVersion = nMajor; - pApp->Ver.nMinorVersion = nMinor; - pApp->Ver.nPatchLevel = nPatchLevel; - pApp->Ver.nBetaLevel = nBetaLevel; - pApp->Ver.szReleaseType = szReleaseType; - pApp->Ver.szTitle = szTitle; - endif; -end; - - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: FixTargetPaths -// -// Purpose: This function updates the CommonBinPath and app paths if you -// choose to install to a different directory -// -/////////////////////////////////////////////////////////////////////////////// -function FixTargetPaths() -begin - // The AFS path must not contain spaces. AFS code will break if it does. - LongPathToShortPath(TARGETDIR); - - szCommonBinPath = TARGETDIR ^ "Common"; - - // Full Client - appFullClient.szAppPath = TARGETDIR ^ "Client"; - appFullClient.szBinPath = TARGETDIR ^ "Client\\Program"; - - // Light Client - appLightClient.szAppPath = TARGETDIR ^ "Client"; - appLightClient.szBinPath = TARGETDIR ^ "Client\\Program"; - - // Server - appServer.szAppPath = TARGETDIR ^ "Server"; - appServer.szBinPath = TARGETDIR ^ "Server\\usr\\afs\\bin"; - - // Control Center - appControlCenter.szAppPath = TARGETDIR ^ "Control Center"; - appControlCenter.szBinPath = TARGETDIR ^ "Control Center"; - - // Docs - appDocs.szAppPath = TARGETDIR ^ "Documentation"; - appDocs.szBinPath = TARGETDIR ^ "Documentation"; -end; - - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: SetupAppInfo -// -// Purpose: This will initialize the APPINFO structures for each product -// that we can install. -// -/////////////////////////////////////////////////////////////////////////////// -function SetupAppInfo() -int n; -begin - szCommonBinPath = TARGETDIR ^ "Common"; - - // Full Client - appFullClient.szCompName = CLIENT_COMP_NAME; // Component name - appFullClient.szCompanyName = @COMPANY_NAME; - appFullClient.szProductName = @PRODUCT_NAME_CLIENT; - appFullClient.szProductKey = @PRODUCT_KEY_CLIENT; - appFullClient.bUseUninstDLL = TRUE; - appFullClient.szUninstDllName = CLIENT_UNINST_DLL_NAME; - appFullClient.szUninstLogfileName = CLIENT_UNINST_LOGFILE_NAME; - appFullClient.szUninstKey = @UNINST_KEY_CLIENT; - appFullClient.szAppPath = TARGETDIR ^ "Client"; - appFullClient.szBinPath = TARGETDIR ^ "Client\\Program"; - appFullClient.bAddToPath = TRUE; - appFullClient.szUninstDisplayName = @UNINST_DISPLAY_NAME_CLIENT; - appFullClient.szRegistrySets = "Client,Full_Client"; - appFullClient.szNoLogRegistrySets = "Client_NoUninstall,WinNT_Client_NoUninstall"; - appFullClient.bInstallSucceeded = FALSE; - SetupVerInfo(&appFullClient, @PRODUCT_VERSION_MAJOR, @PRODUCT_VERSION_MINOR, @PRODUCT_VERSION_PATCH_LEVEL, @PRODUCT_VERSION_BETA_LEVEL, @PRODUCT_VERSION_RELEASE_TYPE, @PRODUCT_VERSION_TITLE, FALSE); - - // Light Client - if (bWin95) then - appLightClient.szCompName = LIGHT95_CLIENT_COMP_NAME; - elseif (bWin98) then - appLightClient.szCompName = LIGHT98_CLIENT_COMP_NAME; - endif; - appLightClient.szCompanyName = @COMPANY_NAME; - appLightClient.szProductName = @PRODUCT_NAME_LIGHT_CLIENT; - appLightClient.szProductKey = @PRODUCT_KEY_LIGHT_CLIENT; - appLightClient.bUseUninstDLL = TRUE; - appLightClient.szUninstDllName = LIGHT_CLIENT_UNINST_DLL_NAME; - appLightClient.szUninstLogfileName = LIGHT_CLIENT_UNINST_LOGFILE_NAME; - appLightClient.szUninstKey = @UNINST_KEY_LIGHT_CLIENT; - appLightClient.szAppPath = TARGETDIR ^ "Client"; - appLightClient.szBinPath = TARGETDIR ^ "Client\\Program"; - appLightClient.bAddToPath = TRUE; - appLightClient.szUninstDisplayName = @UNINST_DISPLAY_NAME_LIGHT_CLIENT; - appLightClient.szRegistrySets = "Client,LightClient"; - appLightClient.szNoLogRegistrySets = "Client_NoUninstall"; - appLightClient.bInstallSucceeded = FALSE; - SetupVerInfo(&appLightClient, @PRODUCT_VERSION_MAJOR, @PRODUCT_VERSION_MINOR, @PRODUCT_VERSION_PATCH_LEVEL, @PRODUCT_VERSION_BETA_LEVEL, @PRODUCT_VERSION_RELEASE_TYPE, @PRODUCT_VERSION_TITLE, FALSE); - - // Server - appServer.szCompName = SERVER_COMP_NAME; - appServer.szCompanyName = @COMPANY_NAME; - appServer.szProductName = @PRODUCT_NAME_SERVER; - appServer.szProductKey = @PRODUCT_KEY_SERVER; - appServer.bUseUninstDLL = TRUE; - appServer.szUninstDllName = SERVER_UNINST_DLL_NAME; - appServer.szUninstLogfileName = SERVER_UNINST_LOGFILE_NAME; - appServer.szUninstKey = @UNINST_KEY_SERVER; - appServer.szAppPath = TARGETDIR ^ "Server"; - appServer.szBinPath = TARGETDIR ^ "Server\\usr\\afs\\bin"; - appServer.bAddToPath = TRUE; - appServer.szUninstDisplayName = @UNINST_DISPLAY_NAME_SERVER; - appServer.szRegistrySets = "Server"; - appServer.szNoLogRegistrySets = ""; - appServer.bInstallSucceeded = FALSE; - SetupVerInfo(&appServer, @PRODUCT_VERSION_MAJOR, @PRODUCT_VERSION_MINOR, @PRODUCT_VERSION_PATCH_LEVEL, @PRODUCT_VERSION_BETA_LEVEL, @PRODUCT_VERSION_RELEASE_TYPE, @PRODUCT_VERSION_TITLE, FALSE); - - // Control Center - appControlCenter.szCompName = CC_COMP_NAME; - appControlCenter.szCompanyName = @COMPANY_NAME; - appControlCenter.szProductName = @PRODUCT_NAME_CC; - appControlCenter.szProductKey = @PRODUCT_KEY_CC; - appControlCenter.bUseUninstDLL = TRUE; - appControlCenter.szUninstDllName = CC_UNINST_DLL_NAME; - appControlCenter.szUninstLogfileName = CC_UNINST_LOGFILE_NAME; - appControlCenter.szUninstKey = @UNINST_KEY_CC; - appControlCenter.szAppPath = TARGETDIR ^ "Control Center"; - appControlCenter.szBinPath = TARGETDIR ^ "Control Center"; - appControlCenter.bAddToPath = TRUE; - appControlCenter.szUninstDisplayName = @UNINST_DISPLAY_NAME_CC; - appControlCenter.szRegistrySets = "Control_Center"; - appControlCenter.szNoLogRegistrySets = ""; - appControlCenter.bInstallSucceeded = FALSE; - SetupVerInfo(&appControlCenter, @PRODUCT_VERSION_MAJOR, @PRODUCT_VERSION_MINOR, @PRODUCT_VERSION_PATCH_LEVEL, @PRODUCT_VERSION_BETA_LEVEL, @PRODUCT_VERSION_RELEASE_TYPE, @PRODUCT_VERSION_TITLE, FALSE); - - // Docs - appDocs.szCompName = DOCS_COMP_NAME; - appDocs.szCompanyName = @COMPANY_NAME; - appDocs.szProductName = @PRODUCT_NAME_DOCS; - appDocs.szProductKey = @PRODUCT_KEY_DOCS; - appDocs.bUseUninstDLL = TRUE; - appDocs.szUninstDllName = DOCS_UNINST_DLL_NAME; - appDocs.szUninstLogfileName = DOCS_UNINST_LOGFILE_NAME; - appDocs.szUninstKey = @UNINST_KEY_DOCS; - appDocs.szAppPath = TARGETDIR ^ "Documentation"; - appDocs.szBinPath = TARGETDIR ^ "Documentation"; - appDocs.bAddToPath = FALSE; - appDocs.szUninstDisplayName = @UNINST_DISPLAY_NAME_DOCS; - appDocs.szRegistrySets = "Docs"; - appDocs.szNoLogRegistrySets = ""; - appDocs.bInstallSucceeded = FALSE; - SetupVerInfo(&appDocs, @PRODUCT_VERSION_MAJOR, @PRODUCT_VERSION_MINOR, @PRODUCT_VERSION_PATCH_LEVEL, @PRODUCT_VERSION_BETA_LEVEL, @PRODUCT_VERSION_RELEASE_TYPE, @PRODUCT_VERSION_TITLE, FALSE); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: SetupInstall -// -// Purpose: This will initialize the setup. Any general initialization -// needed for the installation should be performed here. -// -/////////////////////////////////////////////////////////////////////////////// -function SetupInstall() -begin - Enable( CORECOMPONENTHANDLING ); - - szCellName=@CELLNAME_DEFAULT; - bInstallAborted = FALSE; - - // Create list of end user selections to be displayed by DialogShowSdStartCopy() - - svDir = PROGRAMFILES ^ @DEFAULT_INSTALL_DIR; - - TARGETDIR = svDir; - - SdProductName( @PRODUCT_NAME ); - - Enable( DIALOGCACHE ); - - SetDialogTitle(DLG_ASK_YESNO, @TITLE_CAPTIONBAR); - SetDialogTitle(DLG_MSG_INFORMATION, @TITLE_CAPTIONBAR); - SetDialogTitle(DLG_MSG_WARNING, @TITLE_CAPTIONBAR); - SetDialogTitle(DLG_MSG_SEVERE, @TITLE_CAPTIONBAR); - SetDialogTitle(DLG_USER_CAPTION, @TITLE_CAPTIONBAR); -end; - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: SetupScreen -// -// Purpose: This function establishes the screen look. This includes -// colors, fonts, and text to be displayed. -// -/////////////////////////////////////////////////////////////////////////////// -function SetupScreen() -begin - Enable( FULLWINDOWMODE ); - SetTitle( @TITLE_MAIN, 24, WHITE ); - - SetTitle( @TITLE_CAPTIONBAR, 0, BACKGROUNDCAPTION ); // Caption bar text. - - Enable( BACKGROUND ); - - Delay( 1 ); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CheckRequirements -// -// Purpose: This function checks all minimum requirements for the -// application being installed. If any fail, then the user -// is informed and the setup is terminated. -// -/////////////////////////////////////////////////////////////////////////////// -function CheckRequirements() - NUMBER nvDx, nvDy, nvResult; - STRING svResult; -begin - bWinNT = FALSE; - bWin95 = FALSE; - bWin98 = FALSE; - bIsShellExplorer = FALSE; - - // Check screen resolution. - GetExtents( nvDx, nvDy ); - - if (nvDy < 480) then - ShowError( @ERROR_VGARESOLUTION, WARNING ); - abort; - endif; - - // set 'setup' operation mode - bIs32BitSetup = TRUE; - GetSystemInfo( ISTYPE, nvResult, svResult ); - if (nvResult = 16) then - bIs32BitSetup = FALSE; // running 16-bit setup - return 0; // no additional information required - endif; - - // --- 32-bit testing after this point --- - - // Determine the target system's operating system. - GetSystemInfo( OS, nvResult, svResult ); - - if (nvResult = IS_WINDOWSNT) then - // Running Windows NT. - bWinNT = TRUE; - - // If the user is not an admin, then abort - if (CheckIfAdmin() = -1) then - ShowError(@MUST_BE_AN_ADMIN_MSG, SEVERE); - abort; - endif; - - // Check to see if the shell being used is EXPLORER shell. - if (GetSystemInfo( OSMAJOR, nvResult, svResult ) = 0) then - if (nvResult >= 4) then - bIsShellExplorer = TRUE; - endif; - endif; - - elseif (nvResult = IS_WINDOWS95) then - // IS puts us here even for Win98 - if (IsWin98() = 0) then - bWin98 = TRUE; - else - bWin95 = TRUE; - endif; - - bIsShellExplorer = TRUE; - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DialogShowSdWelcome -// -// Purpose: This function handles the standard welcome dialog. -// -// -/////////////////////////////////////////////////////////////////////////////// -function DialogShowSdWelcome() - NUMBER nResult; - STRING szTitle, szMsg; - -begin - - szTitle = ""; - szMsg = @WELCOME_MESSAGE; - nResult = SdWelcome( szTitle, szMsg ); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DialogShowSdAskDestPath -// -// Purpose: This function asks the user for the destination folder. -// -/////////////////////////////////////////////////////////////////////////////// -function DialogShowSdAskDestPath() - NUMBER nResult; - STRING szTitle, szMsg; - -begin - - szTitle = ""; - szMsg = ""; - nResult = SdAskDestPath( szTitle, szMsg, svDir, 0 ); - - TARGETDIR = svDir; - FixTargetPaths(); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: GetVersionNumber -// -// Purpose: This function converts a version number string into an integer. -// -/////////////////////////////////////////////////////////////////////////////// -function GetVersionNumber(szVerion) - int nVersion; - int nMajorVersion; - int nMinorVersion; - string szVer[64]; -begin - // This code assumes a majorversion.minorversion format. - szVer = szVerion; - - // This will get everything up to the '.' - StrToNum(nMajorVersion, szVer); - - // Delete the part of the string we just converted - StrSub(szVer, szVer, StrFind(szVer, ".") + 1, 64); - - // Now convert the part after the '.' - StrToNum(nMinorVersion, szVer); - - // Turn in into a single number - nVersion = (nMajorVersion * 10) + nMinorVersion; - - return nVersion; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CompareVersions -// -// Purpose: This function compares an apps two version info structures and -// determines if one is greater than the other, or if they are equal. -// -/////////////////////////////////////////////////////////////////////////////// -function CompareVersions(pApp) - int nResult; -begin - // Compare major versions - nResult = pApp->Ver.nMajorVersion - pApp->iVer.nMajorVersion; - if (nResult > 0) then return 1; endif; - if (nResult < 0) then return -1; endif; - - // Major versions are equal, move on to minor versions - nResult = pApp->Ver.nMinorVersion - pApp->iVer.nMinorVersion; - if (nResult > 0) then return 1; endif; - if (nResult < 0) then return -1; endif; - - // Minor versions are equal, move on to patch level. - nResult = pApp->Ver.nPatchLevel - pApp->iVer.nPatchLevel; - if (nResult > 0) then return 1; endif; - if (nResult < 0) then return -1; endif; - - // Patch levels are equal, move on to release type. - if ((pApp->Ver.szReleaseType = RELEASE_TYPE_GA) && (pApp->iVer.szReleaseType = RELEASE_TYPE_BETA)) then return 1; endif; - if ((pApp->Ver.szReleaseType = RELEASE_TYPE_BETA) && (pApp->iVer.szReleaseType = RELEASE_TYPE_GA)) then return -1; endif; - - // Release types are equal. Special handling now required: - - // If this is a GA release, then there is no more info to look at, and the versions are equal. - if (pApp->Ver.szReleaseType = RELEASE_TYPE_GA) then return 0; endif; - - // We have a Beta release, so we still have some info to check. Compare the beta release levels. - nResult = pApp->Ver.nBetaLevel - pApp->iVer.nBetaLevel; - if (nResult > 0) then return 1; endif; - if (nResult < 0) then return -1; endif; - - // Beta versions are equal. - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: GetInstallAction -// -// Purpose: This function decides what install action to perform for a -// component and sets the display name accordingly. -// -/////////////////////////////////////////////////////////////////////////////// -function GetInstallAction(szCompName, bInstalled, szInstallMsg, szUpgradeMsg, szDowngradeMsg, szReinstallMsg, pApp) - string szDisplayName; - string szVerMsg; - int nResult; -begin - szVerMsg = ""; - - if (bInstalled) then - nResult = CompareVersions(pApp); - - if (nResult = 0) then - szDisplayName = szReinstallMsg; - pApp->nInstallAction = ACTION_REINSTALL; - - elseif (nResult > 0) then - szDisplayName = szUpgradeMsg; - pApp->nInstallAction = ACTION_UPGRADE; - Sprintf(szVerMsg, " %s", pApp->iVer.szTitle); - - else // Trying to install old version on top of new version - szDisplayName = szDowngradeMsg; - pApp->nInstallAction = ACTION_DOWNGRADE; - Sprintf(szVerMsg, " %s", pApp->iVer.szTitle); - endif; - else - szDisplayName = szInstallMsg; - pApp->nInstallAction = ACTION_INSTALL; - endif; - - szDisplayName = szDisplayName + szVerMsg; - - ComponentSetData(MEDIA, szCompName, COMPONENT_FIELD_DISPLAYNAME, 0, szDisplayName); - - return TRUE; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: GetInstallActions -// -// Purpose: This function decides what install action to perform for each -// component and sets the display name accordingly. -// -/////////////////////////////////////////////////////////////////////////////// -function GetInstallActions() -begin - // Decide what to do for each component and then set the display names appropriately - GetInstallAction(CLIENT_COMP_NAME, bClientInstalled, @INSTALL_CLIENT_MSG, @UPGRADE_CLIENT_MSG, @DOWNGRADE_CLIENT_MSG, @REINSTALL_CLIENT_MSG, &appFullClient); - GetInstallAction(SERVER_COMP_NAME, bServerInstalled, @INSTALL_SERVER_MSG, @UPGRADE_SERVER_MSG, @DOWNGRADE_SERVER_MSG, @REINSTALL_SERVER_MSG, &appServer); - GetInstallAction(CC_COMP_NAME, bCcInstalled, @INSTALL_CC_MSG, @UPGRADE_CC_MSG, @DOWNGRADE_CC_MSG, @REINSTALL_CC_MSG, &appControlCenter); - GetInstallAction(LIGHT_CLIENT_COMP_NAME, bLightClientInstalled, @INSTALL_LIGHT_CLIENT_MSG, @UPGRADE_LIGHT_CLIENT_MSG, @DOWNGRADE_LIGHT_CLIENT_MSG, @REINSTALL_LIGHT_CLIENT_MSG, &appLightClient); - GetInstallAction(DOCS_COMP_NAME, bDocsInstalled, @INSTALL_DOCS_MSG, @UPGRADE_DOCS_MSG, @DOWNGRADE_DOCS_MSG, @REINSTALL_DOCS_MSG, &appDocs); -end; - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ClientSelectedOrInstalled -// -// Purpose: This function checks whether or not the client is selected or if -// it is already installed. -// -/////////////////////////////////////////////////////////////////////////////// -function ClientSelectedOrInstalled() -begin - if (bFullClientSel || bClientInstalled) then - return TRUE; - endif; - - return FALSE; -end; - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: AppVersionOk -// -// Purpose: This function determines if a given app will have the correct -// version after installation. -// -/////////////////////////////////////////////////////////////////////////////// -function AppVersionOk(bInstalled, bSel, pApp) - BOOL bOk; -begin - // Here's the logic of this: - // - // 1) If the app is not installed and - // a) it's not being installed, then this app doesn't affect the version - // restrictions, so return true - // b) it will be installed, then it will get the version which this - // installer installs, so the version will be ok - // - // 2) If the app is installed and - // a) the app is selected for reinstall, upgrade, or downgrade, then the - // newly installed version will be the version this installer installs, - // and so the version will be ok - // b) the app is not selected for reinstall, upgrade, or downgrade, then - // the version is ok only if the app's current version matches the - // the version of this installer - - bOk = !bInstalled || bSel || (CompareVersions(pApp) = 0); - - return bOk; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DialogShowSdAskComponentDialog -// -// Purpose: This function asks the user which components to install -// and what the destination folder should be. -// -/////////////////////////////////////////////////////////////////////////////// -function DialogShowSdAskComponentDialog() - NUMBER nResult; - STRING szTitle, szMsg, szComponent, szFilename; - BOOL bClient, bServer, bCc, bDocs, bVersionsOK; -begin - - szTitle = ""; - szMsg = ""; - szComponent = ""; - - // If running WinNT hide the Light Client component. If the user wants to only - // allow client installs, then hide all but the Client component as well. If not - // running on NT, then hide all but the Light Client component. - if (bWinNT) then - ComponentSetData(MEDIA, LIGHT_CLIENT_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSelectItem(MEDIA, LIGHT_CLIENT_COMP_NAME, FALSE); - - if (FindFile(SRCDIR, ALLOW_ONLY_CLIENT_FLAG_FILENAME, szFilename) = 0) then - ComponentSetData(MEDIA, SERVER_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSetData(MEDIA, CC_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSetData(MEDIA, DOCS_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSelectItem(MEDIA, DOCS_COMP_NAME, FALSE); - endif; - ComponentSelectItem(MEDIA, SERVER_COMP_NAME, FALSE); - if (@CELLNAME_DEFAULT % ".") then - ComponentSelectItem(MEDIA, CC_COMP_NAME, FALSE); - else - ComponentSelectItem(MEDIA, CC_COMP_NAME, TRUE); - endif; -else - ComponentSetData(MEDIA, CLIENT_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSetData(MEDIA, SERVER_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSetData(MEDIA, CC_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - ComponentSetData(MEDIA, DOCS_COMP_NAME, COMPONENT_FIELD_VISIBLE, FALSE, ""); - - ComponentSelectItem(MEDIA, SERVER_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, CLIENT_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, CC_COMP_NAME, FALSE); - ComponentSelectItem(MEDIA, DOCS_COMP_NAME, FALSE); - endif; - -retry: - nResult = SdComponentDialog(szTitle, szMsg, svDir, szComponent); - - // Enforce selection rules - something must be selected and - // the client must be selected if the server is. However, take into - // account if it is already installed. - bFullClientSel = ComponentIsItemSelected(MEDIA , CLIENT_COMP_NAME); - bLightClientSel = ComponentIsItemSelected(MEDIA , LIGHT_CLIENT_COMP_NAME); - bServerSel = ComponentIsItemSelected(MEDIA , SERVER_COMP_NAME); - bCcSel = ComponentIsItemSelected(MEDIA , CC_COMP_NAME); - bDocsSel = ComponentIsItemSelected(MEDIA , DOCS_COMP_NAME); - - if (!bFullClientSel && !bLightClientSel && !bServerSel && !bCcSel && !bDocsSel) then - ShowError(@NOTHING_SELECTED_MSG, SEVERE); - goto retry; - endif; - - if (bServerSel && !ClientSelectedOrInstalled()) then - ShowError(@SERVER_NEEDS_CLIENT_MSG, SEVERE); - goto retry; - endif; - - // Also, if upgrading or downgrading, all apps must be at the same version level. - // We won't upgrade one app to a higer version than another, and we won't downgrade - // one app to a lowel version than another. All must be at the same level when the - // install program is done. This is necessary because the apps share some files. - if (!bWinNT) then - bVersionsOK = TRUE; - else - bClient = AppVersionOk(bClientInstalled, bFullClientSel, &appFullClient); - bServer = AppVersionOk(bServerInstalled, bServerSel, &appServer); - bCc = AppVersionOk(bCcInstalled, bCcSel, &appControlCenter); - bDocs = AppVersionOk(bDocsInstalled, bDocsSel, &appDocs); - bVersionsOK = bClient && bServer && bCc && bDocs; - endif; - - if (!bVersionsOK) then - ShowError(@APPS_NOT_SAME_VERSION, SEVERE); - goto retry; - endif; - - TARGETDIR = svDir; - FixTargetPaths(); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DialogShowSdSetupType -// -// Purpose: This function displays the standard setup type dialog. -// -/////////////////////////////////////////////////////////////////////////////// -function DialogShowSdSetupType() - NUMBER nResult, nType; - STRING szTitle, szMsg, szReserved; - -begin - - if (svSetupType == "") then - svSetupType = "AFS Server"; - endif; - - szTitle = ""; - szMsg = @SETUP_TYPE_MSG; - szReserved = ""; - - nResult = SdSetupTypeEx(szTitle, szMsg, szReserved, svSetupType, 0); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DialogShowSdSelectFolder -// -// Purpose: This function displays the standard folder selection dialog. -// -// -/////////////////////////////////////////////////////////////////////////////// -function DialogShowSdSelectFolder() - NUMBER nResult; - STRING szTitle, szMsg; -begin - if (SHELL_OBJECT_FOLDER = "") then - SHELL_OBJECT_FOLDER = @FOLDER_NAME; - endif; - - // We are going to force the user to use the default folder name. This is - // because we create the folder unlogged, and must therefore remove it - // ourselves in our uninstall dll (which we do because IS doesn't handle - // removing them correctly). Therefore, we must know the name of the - // folder so we can remove it during uninstall. Also, the user can install - // the AFS components during several executions of the install program, - // and we don't want to allow them to pick a different folder each time. - // We could solve these problems in code but we don't have time, so we - // are going to force them to use our default folder name. - return 0; - - szTitle = ""; - szMsg = ""; - nResult = SdSelectFolder( szTitle, szMsg, SHELL_OBJECT_FOLDER); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DialogShowSdFinishReboot -// -// Purpose: This function will show the last dialog of the product. -// It will allow the user to reboot and/or show some readme text. -// -/////////////////////////////////////////////////////////////////////////////// -function DialogShowSdFinishReboot() - NUMBER nResult, nDefOptions; - STRING szTitle, szMsg1, szMsg2, szOption1, szOption2; - NUMBER bOpt1, bOpt2; -begin - if (!BATCH_INSTALL) then - bOpt1 = FALSE; - bOpt2 = FALSE; - szMsg1 = @SETUP_FINISHED_MSG; - szMsg2 = ""; - szOption1 = ""; - szOption2 = ""; - szTitle = ""; - nResult = SdFinish(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2 ); - return 0; - endif; - - nDefOptions = SYS_BOOTMACHINE; - szTitle = ""; - szMsg1 = ""; - szMsg2 = ""; - nResult = SdFinishReboot( szTitle, szMsg1, nDefOptions, szMsg2, 0 ); - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ConfigServerService -// -// Purpose: This function will configure the AFS Server bos service via the -// SCM. -// -/////////////////////////////////////////////////////////////////////////////// -function ConfigServerService() - STRING szMsg; - BOOL bError; - number nStatus; -begin - bError = TRUE; - - if (!bWSPPInstall) then - szMsg = @CONFIGURING_AFS_SERVER_SERVICE; - SdShowMsg(szMsg, TRUE); - endif; - - nStatus = RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); - if (nStatus < 0) goto error; - - nStatus = InstallServerService(TARGETDIR ^ "\\Server\\usr\\afs\\bin\\bosctlsvc.exe"); - if (nStatus < 0) goto error; - - bError = FALSE; - -error: - if (!bWSPPInstall) then - SdShowMsg(szMsg, FALSE); - endif; - - if (bError) then - Sprintf(szMsg, @AFS_SERVER_SERVICE_INSTALL_ERROR, nStatus); - ShowError(szMsg, SEVERE); - bInstallAborted = TRUE; - return -1; - endif; - - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ConfigClientService -// -// Purpose: This function will configure the AFS Client service via the SCM. -// -/////////////////////////////////////////////////////////////////////////////// -function ConfigClientService() - STRING szMsg; - BOOL bError; - number nStatus; -begin - bError = TRUE; - - if (!bWSPPInstall) then - szMsg = @CONFIGURING_AFS_CLIENT_SERVICE; - SdShowMsg(szMsg, TRUE); - endif; - - nStatus = RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); - if (nStatus < 0) goto error; - - nStatus = InstallClientService(TARGETDIR ^ "\\Client\\Program\\afsd_service.exe"); - if (nStatus < 0) goto error; - - bError = FALSE; - -error: - if (!bWSPPInstall) then - SdShowMsg(szMsg, FALSE); - endif; - - if (bError) then - Sprintf(szMsg, @AFS_CLIENT_SERVICE_INSTALL_ERROR, nStatus); - ShowError(szMsg, SEVERE); - bInstallAborted = TRUE; - return -1; - endif; - - return 0; -end; - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: AddPath -// -// Purpose: This function will add the specified path to the system PATH -// environment variable. -// -/////////////////////////////////////////////////////////////////////////////// -function AddPath(szPath) -begin - LongPathToShortPath(szPath); - if (bWin98 || bWin95) then - if (EzBatchAddPath ("Path", szPath, "", AFTER) < 0) then - ShowError(@ADD_PATH_ERROR, WARNING); - endif; - else - if (AddToPath(szPath) < 0) then - ShowError(@ADD_PATH_ERROR, WARNING); - endif; - endif; - return 0; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ConfigUninstallDLL -// -// Purpose: This function will modify the uninstall entry for these products -// to use an uninstall dll. -// -/////////////////////////////////////////////////////////////////////////////// -function ConfigUninstallDLL(pApp) - string svValue; - NUMBER nStatus; -begin - if (!pApp->bUseUninstDLL) then - return 0; - endif; - - nStatus = RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); - if (nStatus < 0) goto error; - - svValue = UNINST + " -c\"" + pApp->szBinPath ^ pApp->szUninstDllName + "\" -f\"" + TARGETDIR ^ pApp->szUninstLogfileName + "\""; - - nStatus = RegDBSetKeyValueEx(MSUNINSTALL_KEY ^ pApp->szProductName, "UninstallString", REGDB_STRING, svValue, -1); - if (nStatus < 0) goto error; - - return 0; - -error: - return nStatus; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CreateServerDirs -// -// Purpose: This function will create directories that the server programs -// need. The creation of these is not logged, and so they will be -// deleted by the uninstall dll. -// -/////////////////////////////////////////////////////////////////////////////// -function CreateServerDirs() -begin - CreateDir(TARGETDIR ^ "\\Server\\usr\\afs\\logs"); - CreateDir(TARGETDIR ^ "\\Server\\usr\\afs\\etc"); - CreateDir(TARGETDIR ^ "\\Server\\usr\\afs\\local"); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: GetDateTimeString() -// -// Purpose: This function will return a string containing the current date -// and time. -// -/////////////////////////////////////////////////////////////////////////////// -function GetDateTimeString(szDateTime) - STRING szDate, szTime; - NUMBER nDate, nTime; -begin - GetSystemInfo(DATE, nDate, szDate); - GetSystemInfo(TIME, nTime, szTime); - - szDateTime = szDate + " " + szTime; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: SetUserVars() -// -// Purpose: This function will set at runtime values for user defined variables -// we set up in the Registry Entries GUI tool. -// -/////////////////////////////////////////////////////////////////////////////// -function SetUserVars() - number nStatus; - string szInstallDate; - string szDesc; - string szTitle; - string szReleaseType; -begin - // Set the install date variable's value - GetDateTimeString(szInstallDate); - - ComponentSetTarget(MEDIA, "", szInstallDate); - - // Set the proper client logon dll - if (bFullClientSel) then - ComponentSetTarget(MEDIA, "", TARGETDIR ^ FULL_CLIENT_LOGON_DLL); - elseif (bLightClientSel) then - ComponentSetTarget(MEDIA, "", TARGETDIR ^ LIGHT_CLIENT_LOGON_DLL); - endif; - - // Set the client description and title values - if (bFullClientSel || bLightClientSel) then - - if (bFullClientSel) then - szDesc = @CLIENT_DESC; - szTitle = @CLIENT_TITLE; - else - szDesc = @LIGHT_CLIENT_DESC; - szTitle = @LIGHT_CLIENT_TITLE; - endif; - - ComponentSetTarget(MEDIA, "", szDesc); - ComponentSetTarget(MEDIA, "", szTitle); - endif; - - if (bServerSel) then - ComponentSetTarget(MEDIA, "", TARGETDIR ^ "Common\\afseventmsg_" + szCodePage + ".dll"); - endif; - - szReleaseType = @PRODUCT_VERSION_RELEASE_TYPE; - ComponentSetTarget(MEDIA, "", szReleaseType); - -done: - return nStatus; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: SetNetworkProviderOrder() -// -// Purpose: This function will add the AFS Client service name to the -// ProviderOrder value of the -// HKLM\SYSTEM\CurrentControlSet\ControlNetworkProvider\Order key. -// It makes a call to the setup dll to do this. -/////////////////////////////////////////////////////////////////////////////// -function SetNetworkProviderOrder() - int nStatus; -begin - nStatus = AddToNetworkProviderOrder(CLIENT_SERVICE_NAME); - if (nStatus < 0) then - ShowError(@SET_NETWORK_PROVIDER_ERROR, SEVERE); - endif; - - return nStatus; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CreateRegistrySets() -// -// Purpose: This function will create the registry entries for each resgistry -// set in the passed in string. The string must be a comma separated -// list of registry sets created using the IS Registry Entries GUI. -// -/////////////////////////////////////////////////////////////////////////////// -function CreateRegistrySets(szRegistrySets) - int nRegSetListID; - int nResult; - string szRegSet; -begin - nRegSetListID = ListCreate(STRINGLIST); - - StrGetTokens(nRegSetListID, szRegistrySets, ","); - - nResult = ListGetFirstString(nRegSetListID, szRegSet); - while (nResult != END_OF_LIST) -// MessageBox(szRegSet, INFORMATION); - CreateRegistrySet(szRegSet); - nResult = ListGetNextString(nRegSetListID, szRegSet); - endwhile; - - ListDestroy(nRegSetListID); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ConfigAfsCreds() -// -// Purpose: This function will config the AFS Client Credentials tool. -// -/////////////////////////////////////////////////////////////////////////////// -function ConfigAfsCreds() -int nResult; -begin - nResult = LaunchAppAndWait(TARGETDIR ^ "Client\\Program\\afscreds.exe", "/install", WAIT); - if (nResult < 0) then - ShowError(@CONFIGURING_AFS_CREDS_ERROR, INFORMATION); - endif; - - return nResult; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: IsAppInstalled -// -// Purpose: This function will determine if an app is installed, and if it is, -// will set its iVer info. -// -/////////////////////////////////////////////////////////////////////////////// -function IsAppInstalled(pApp) -int nResult; -int nSize; -int nType; -string szKey; -string szMajorVersion, szMinorVersion, szPatchLevel, szBetaLevel, szReleaseType, szTitle; -begin - nResult = RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); - if (nResult < 0) goto error; - - szKey = COMPANY_REG_KEY ^ pApp->szProductName ^ "CurrentVersion"; - - nResult = RegDBGetKeyValueEx(szKey, "MajorVersion", nType, szMajorVersion, nSize); - if (nResult < 0) goto error; - - nResult = RegDBGetKeyValueEx(szKey, "MinorVersion", nType, szMinorVersion, nSize); - if (nResult < 0) goto error; - - nResult = RegDBGetKeyValueEx(szKey, "PatchLevel", nType, szPatchLevel, nSize); - if (nResult < 0) goto error; - - nResult = RegDBGetKeyValueEx(szKey, "BetaLevel", nType, szBetaLevel, nSize); - // It's ok for this to fail. Pre-3.5 3.32 releases did not use this. - - nResult = RegDBGetKeyValueEx(szKey, "VersionString", nType, szTitle, nSize); - if (nResult < 0) goto error; - - nResult = RegDBGetKeyValueEx(szKey, "ReleaseType", nType, szReleaseType, nSize); - if (nResult < 0) then - if ((pApp->szProductName = "AFS Client") && (szTitle = "3.4a")) then - // This value won't exist for 3.4a clients - szReleaseType = RELEASE_TYPE_GA; - else - // This value won't exist for any 3.5 beta versions - szReleaseType = RELEASE_TYPE_BETA; - endif; - endif; - - SetupVerInfo(pApp, szMajorVersion, szMinorVersion, szPatchLevel, szBetaLevel, szReleaseType, szTitle, TRUE); - - return TRUE; - -error: - return FALSE; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: LocalizeComponents() -// -// Purpose: This function updates all components to use localized text -// in their status fields as appropriate -// -/////////////////////////////////////////////////////////////////////////////// -function LocalizeComponents() -begin - LocalizeComponentStatusText ("Client\\Client_Common"); - LocalizeComponentStatusText ("Client\\Client_Program\\Client_Headers\\Client_Afs_Headers"); - LocalizeComponentStatusText ("Client\\Client_Program\\Client_Headers\\Client_Main_Headers"); - LocalizeComponentStatusText ("Client\\Client_Program\\Client_Headers\\Client_Rx_Headers"); - LocalizeComponentStatusText ("Client\\Client_Program\\Client_Headers"); - LocalizeComponentStatusText ("Client\\Client_Program\\Client_Sample"); - LocalizeComponentStatusText ("Client\\Client_Program"); - LocalizeComponentStatusText ("Client\\Client_System32"); - LocalizeComponentStatusText ("Client\\Client_WinDir"); - LocalizeComponentStatusText ("Client"); - LocalizeComponentStatusText ("Components"); - LocalizeComponentStatusText ("Control_Center\\Control_Center_Common"); - LocalizeComponentStatusText ("Control_Center\\Control_Center_Program"); - LocalizeComponentStatusText ("Control_Center\\Control_Center_System32"); - LocalizeComponentStatusText ("Control_Center\\Control_Center_WinDir"); - LocalizeComponentStatusText ("Control_Center"); - LocalizeComponentStatusText ("Documentation\\English\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\English\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\English\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\English"); - LocalizeComponentStatusText ("Documentation\\German\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\German\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\German\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\German"); - LocalizeComponentStatusText ("Documentation\\Japanese\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\Japanese\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\Japanese\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\Japanese"); - LocalizeComponentStatusText ("Documentation\\Korean\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\Korean\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\Korean\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\Korean"); - LocalizeComponentStatusText ("Documentation\\Portuguese\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\Portuguese\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\Portuguese\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\Portuguese"); - LocalizeComponentStatusText ("Documentation\\Simp_Chinese\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\Simp_Chinese\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\Simp_Chinese\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\Simp_Chinese"); - LocalizeComponentStatusText ("Documentation\\Spanish\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\Spanish\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\Spanish\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\Spanish"); - LocalizeComponentStatusText ("Documentation\\Trad_Chinese\\Cmd_Ref"); - LocalizeComponentStatusText ("Documentation\\Trad_Chinese\\Doc_Misc"); - LocalizeComponentStatusText ("Documentation\\Trad_Chinese\\Sys_Admin_Guide"); - LocalizeComponentStatusText ("Documentation\\Trad_Chinese"); - LocalizeComponentStatusText ("Documentation"); - LocalizeComponentStatusText ("Info"); - LocalizeComponentStatusText ("Languages\\Lang_English"); - LocalizeComponentStatusText ("Languages\\Lang_German"); - LocalizeComponentStatusText ("Languages\\Lang_Japanese"); - LocalizeComponentStatusText ("Languages\\Lang_Korean"); - LocalizeComponentStatusText ("Languages\\Lang_Portuguese"); - LocalizeComponentStatusText ("Languages\\Lang_Simp_Chinese"); - LocalizeComponentStatusText ("Languages\\Lang_Spanish"); - LocalizeComponentStatusText ("Languages\\Lang_Trad_Chinese"); - LocalizeComponentStatusText ("Languages"); - LocalizeComponentStatusText ("Light_Client\\Win95\\Light95_Client_Common"); - LocalizeComponentStatusText ("Light_Client\\Win95\\Light95_Client_Program"); - LocalizeComponentStatusText ("Light_Client\\Win95\\Light95_Client_System32"); - LocalizeComponentStatusText ("Light_Client\\Win95\\Light95_Client_WinDir"); - LocalizeComponentStatusText ("Light_Client\\Win95"); - LocalizeComponentStatusText ("Light_Client\\Win98\\Light_Client_Common"); - LocalizeComponentStatusText ("Light_Client\\Win98\\Light_Client_Program"); - LocalizeComponentStatusText ("Light_Client\\Win98\\Light_Client_System32"); - LocalizeComponentStatusText ("Light_Client\\Win98\\Light_Client_WinDir"); - LocalizeComponentStatusText ("Light_Client\\Win98"); - LocalizeComponentStatusText ("Light_Client"); - LocalizeComponentStatusText ("Readme\\English\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\English\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\English\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\English"); - LocalizeComponentStatusText ("Readme\\German\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\German\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\German\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\German"); - LocalizeComponentStatusText ("Readme\\Japanese\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\Japanese\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\Japanese\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\Japanese"); - LocalizeComponentStatusText ("Readme\\Korean\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\Korean\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\Korean\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\Korean"); - LocalizeComponentStatusText ("Readme\\Portuguese\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\Portuguese\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\Portuguese\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\Portuguese"); - LocalizeComponentStatusText ("Readme\\Simp_Chinese\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\Simp_Chinese\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\Simp_Chinese\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\Simp_Chinese"); - LocalizeComponentStatusText ("Readme\\Spanish\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\Spanish\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\Spanish\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\Spanish"); - LocalizeComponentStatusText ("Readme\\Trad_Chinese\\Doc_Misc"); - LocalizeComponentStatusText ("Readme\\Trad_Chinese\\Install_Guide"); - LocalizeComponentStatusText ("Readme\\Trad_Chinese\\Release_Notes"); - LocalizeComponentStatusText ("Readme\\Trad_Chinese"); - LocalizeComponentStatusText ("Readme"); - LocalizeComponentStatusText ("Server\\Server_Common"); - LocalizeComponentStatusText ("Server\\Server_Program"); - LocalizeComponentStatusText ("Server\\Server_System32"); - LocalizeComponentStatusText ("Server\\Server_WinDir"); - LocalizeComponentStatusText ("Server"); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: LocalizeComponentStatusText() -// -// Purpose: This function updates one component to use localized text -// in its status fields as appropriate -// -/////////////////////////////////////////////////////////////////////////////// -function LocalizeComponentStatusText (svComponent) - NUMBER dwResult; - STRING svOriginal; - STRING svLocalized; -begin - ComponentGetData (MEDIA, svComponent, COMPONENT_FIELD_STATUS, dwResult, svOriginal); - - if (svOriginal == "CLIENT") then - svLocalized = @STATUS_INSTALLING_CLIENT; - elseif (svOriginal == "SERVER") then - svLocalized = @STATUS_INSTALLING_SERVER; - elseif (svOriginal == "CCENTER") then - svLocalized = @STATUS_INSTALLING_CCENTER; - elseif (svOriginal == "LIGHT") then - svLocalized = @STATUS_INSTALLING_LIGHT; - elseif (svOriginal == "HEADERS") then - svLocalized = @STATUS_INSTALLING_HEADERS; - elseif (svOriginal == "DOCS") then - svLocalized = @STATUS_INSTALLING_DOCS; - elseif (svOriginal == "LANGUAGE") then - svLocalized = @STATUS_INSTALLING_LANGUAGE; - else - svLocalized = ""; - endif; - - ComponentSetData(MEDIA, svComponent, COMPONENT_FIELD_STATUS, 0, svLocalized); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: DetectInstalledComponents() -// -// Purpose: This function will detect if any of our components is already -// installed. -// -/////////////////////////////////////////////////////////////////////////////// -function DetectInstalledComponents() -begin - if (bWinNT) then - bClientInstalled = IsAppInstalled(&appFullClient); - bServerInstalled = IsAppInstalled(&appServer); - bCcInstalled = IsAppInstalled(&appControlCenter); - bDocsInstalled = IsAppInstalled(&appDocs); - else - // The light client uses the client's registry entries. There is a light - // client entry, but it contains nothing under it. IS makes it but we - // don't use it. - bLightClientInstalled = IsAppInstalled(&appLightClient); - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ParseCommandLine -// -// Purpose: This function parses the command line to set up a silent install -// -/////////////////////////////////////////////////////////////////////////////// -function ParseCommandLine() - NUMBER nResult; - STRING szTemp, szResult[MAX_STRING_LEN], szParms; - LIST listParms; -begin - bWSPPInstall = FALSE; - bPreinstallReplace = FALSE; - - szParms = CMDLINE; - - // Need a list to hold the parms - listParms = ListCreate(STRINGLIST); - - // Break parms into semicolon separated tokens and put into list - if (StrGetTokens(listParms, szParms, ";") = 0 ) then - nResult = ListGetFirstString(listParms, szResult); - - // Do until the end of the list - while (nResult != END_OF_LIST) - if (StrFind(szResult, "DIR=") > -1 ) then - nResult = StrSub(szTemp, szResult, 4, MAX_STRING_LEN); - TARGETDIR = szTemp + "\\AFS"; - - elseif (StrFind(szResult, "P=") > -1 ) then - nResult = StrSub(szTemp, szResult, StrFind(szResult, "P=") + 2, 1); - if (StrFind(szTemp, "Y") > -1 ) then - bPreinstallReplace = TRUE; - endif; - - elseif (StrFind(szResult, "C=") > -1 ) then - ProcessCompsOnCmdLn(szResult); - endif; - - nResult = ListGetNextString(listParms, szResult); - endwhile; - endif; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ProcessCompsOnCmdLn -// -// Purpose: This function puts the components in a list and -// checks for setup types on the command line. -// -// -/////////////////////////////////////////////////////////////////////////////// -function ProcessCompsOnCmdLn(szParms) - NUMBER nResult, nIndex; - STRING szComp; -begin - bWSPPInstall = TRUE; - - // Strip c= off cmdln string - nResult = StrSub(szParms, szParms, StrFind(szParms, "C=") + 2, StrLength(szParms) - 2); - - // Get each component from the cmd line - while (StrLength(szParms)) - nIndex = StrSub(szComp, szParms, 0, StrFind(szParms, ",")); - if (!nIndex) then // if comma not found then last item in list - szComp = szParms; - nIndex = StrLength(szComp); // for extracting this string - endif; - - if (StrFind(szComp, "Client") > -1) then - bFullClientSel = TRUE; - elseif (StrFind(szComp, "Server") > -1) then - bServerSel = TRUE; - elseif (StrFind(szComp, "ControlCtr") > -1) then - bCcSel = TRUE; - endif; - - // Delete component from the command line string - StrSub(szParms, szParms, nIndex + 1, StrLength(szParms)); - endwhile; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: RemoveInstalledBits -// -// Purpose: This function silently uninstalls a product. -// -/////////////////////////////////////////////////////////////////////////////// -function RemoveInstalledBits(szProductName) - int nStatus; - int nType; - string szValue[MAX_STRING_LEN]; - string szProgram[256]; - string szCmdLine[128]; - int nSize; - int nIndex; -begin - // Check for a special case - version 3.4a of the AFS Client - if ((szProductName = "AFS Client") && (appFullClient.iVer.szTitle = "3.4a")) then - return Eradicate34Client(); - endif; - - nStatus = RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); - if (nStatus < 0) goto error; - - nStatus = RegDBGetKeyValueEx(MSUNINSTALL_KEY ^ szProductName, "UninstallString", nType, szValue, nSize); - if (nStatus < 0) goto error; - - nIndex = StrFind(szValue, " "); - if (nIndex < 0) goto error; - - StrSub(szProgram, szValue, 0, nIndex); - StrSub(szCmdLine, szValue, nIndex + 1, 128); - - // Make the uninstall run silently - szCmdLine = szCmdLine + " -a"; - - nStatus = LaunchAppAndWait(szProgram, szCmdLine, WAIT); - if (nStatus < 0) goto error; - - return 0; - -error: - return nStatus; -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: AddShortCut -// -// Purpose: Adds a short cut to the start menu. -// -/////////////////////////////////////////////////////////////////////////////// -function AddShortCut(szFolder, szName, szCmdPath, szArgs) - int result; - string szCmd; -begin - szCmdPath = TARGETDIR ^ szCmdPath; - LongPathToQuote(szCmdPath, TRUE); - - szCmd = szCmdPath + " " + szArgs; - - nResult = AddFolderIcon(SHELL_OBJECT_FOLDER ^ szFolder, szName, szCmd, "", "", 0, "", REPLACE); - - return nResult; -end; - - - - - - - - - - - - - - - - - - - - - - - - - - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CreateStartMenuEntries -// -// Purpose: This function creates start menu entries for our apps. -// -/////////////////////////////////////////////////////////////////////////////// -function CreateStartMenuEntries() -begin - if (bServerSel) then - AddShortCut(@SERVER_GROUP_NAME, @CFG_WIZARD_ITEM_NAME, CFG_WIZARD_CMD_PATH, CFG_WIZARD_ARGS); - endif; - - if (bFullClientSel) then - AddShortCut(@CLIENT_GROUP_NAME, @CREDS_TOOL_ITEM_NAME, CREDS_TOOL_CMD_PATH, CREDS_TOOL_ARGS); - AddShortCut(@CLIENT_GROUP_NAME, @CLIENT_HELP_ITEM_NAME, CLIENT_HELP_CMD_PATH, CLIENT_HELP_ARGS); - endif; - - if (bCcSel) then - AddShortCut(@CCENTER_GROUP_NAME, @SERVER_MANAGER_ITEM_NAME, SERVER_MANAGER_CMD_PATH, SERVER_MANAGER_ARGS); - AddShortCut(@CCENTER_GROUP_NAME, @ACCT_MANAGER_ITEM_NAME, ACCT_MANAGER_CMD_PATH, ACCT_MANAGER_ARGS); - endif; - - if (bLightClientSel) then - AddShortCut(@LIGHT_GROUP_NAME, @CREDS_TOOL_ITEM_NAME, CREDS_TOOL_CMD_PATH, CREDS_TOOL_ARGS); - AddShortCut(@LIGHT_GROUP_NAME, @LIGHT_CLIENT_HELP_ITEM_NAME, LIGHT_CLIENT_HELP_CMD_PATH, LIGHT_CLIENT_HELP_ARGS); - endif; - - AddShortCut("", @DOCUMENTATION_ITEM_NAME, DOCUMENTATION_CMD_PATH, DOCUMENTATION_ARGS); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: ShowError -// -// Purpose: This function shows an error to the user when not in silent mode, -// and will log an error to a file when in silent mode. -// -/////////////////////////////////////////////////////////////////////////////// -function ShowError(szMsg, nType) - string szType; - int nFileID; -begin - if (!bWSPPInstall) then - MessageBox(szMsg, nType); - return; - endif; - - switch (nType) - case WARNING: szType = "Warning: "; - case SEVERE: szType = "Error: "; - case INFORMATION: szType = "Note: "; - default: szType = "Unknown error type: "; - endswitch; - - WriteToInstallErrorLog(szType + szMsg); -end; - - -/////////////////////////////////////////////////////////////////////////////// -// -// Function: CheckCopyCellServDB -// -// Purpose: During install the CellServDB file is copied into the Common dir. -// If the user does not already have this file, we will copy it for -// them into the windows directory. If they already do have the -// file, then we will do nothing. -/////////////////////////////////////////////////////////////////////////////// -function CheckCopyCellServDB() - int nResult; - string szResult; -begin - nResult = FindFile(WINDIR, CELLSERVDB_FILENAME, szResult); - if (nResult < 0) then - VarSave(SRCTARGETDIR); - SRCDIR = TARGETDIR ^ "Common"; - TARGETDIR = WINDIR; - CopyFile(CELLSERVDB_FILENAME, CELLSERVDB_FILENAME); - VarRestore(SRCTARGETDIR); - endif; -end; - - -// --- include script file section --- -#include "sddialog.rul" diff --git a/src/WINNT/install/NSIS/CellServDB b/src/WINNT/install/NSIS/CellServDB index 882d0904ea..79a2c23ffa 100644 --- a/src/WINNT/install/NSIS/CellServDB +++ b/src/WINNT/install/NSIS/CellServDB @@ -1,4 +1,4 @@ ->grand.central.org #GCO Public CellServDB 05 Jul 2007 +>grand.central.org #GCO Public CellServDB 25 Oct 2007 18.92.0.108 #grand-opening.mit.edu 128.2.203.61 #penn.central.org 130.237.48.87 #andrew.e.kth.se @@ -48,8 +48,6 @@ 66.93.118.125 #stormy 130.85.24.11 #weasel 130.85.24.13 #straykitten ->midnightlinux.com #Midnight Linux, Pittsburgh PA -208.10.142.82 #outpost.midnightlinux.com >setfilepointer.com #SetFilePointer.com 63.224.10.2 #hamlet.SetFilePointer.com 63.224.10.4 #troilus.SetFilePointer.com @@ -62,6 +60,10 @@ 213.187.92.33 #gpp1.gppc.de 213.187.92.34 #paulchen.gppc.de 213.187.92.35 #lotus.gppc.de +>cms.hu-berlin.de #Humboldt University Berlin +141.20.1.65 #commodus.cms.hu-berlin.de +141.20.1.66 #faustinus.cms.hu-berlin.de +141.20.1.67 #marcellus.cms.hu-berlin.de >ifh.de #DESY Zeuthen 141.34.22.10 #romulus.ifh.de 141.34.22.11 #remus.ifh.de @@ -147,8 +149,12 @@ 129.219.10.70 #authen1.asu.edu 129.219.10.72 #authen3.asu.edu 129.219.100.16 #authen4.asu.edu ->hep.caltech.edu #CalTech High Energy Physics -131.215.126.150 #afs.hep.caltech.edu +>eecs.berkeley.edu #University of California, Berkeley - EECS Dept. +128.32.139.34 #greed.eecs.berkeley.edu +128.32.139.35 #gluttony.eecs.berkeley.edu +169.229.60.112 #envy.eecs.berkeley.edu +>hep.caltech.edu #Caltech High Energy Physics +131.215.116.20 #afs.hep.caltech.edu >clarkson.edu #Clarkson University, Potsdam, New York USA 128.153.1.111 #arthur.clarkson.edu 128.153.9.111 #lancelot.clarkson.edu @@ -160,14 +166,15 @@ 128.2.10.28 #vice28.fs.andrew.cmu.edu 128.2.32.44 #new-vice12.fs.andrew.cmu.edu >club.cc.cmu.edu #Carnegie Mellon University Computer Club +128.2.204.149 #barium.club.cc.cmu.edu 128.237.157.11 #sodium.club.cc.cmu.edu 128.237.157.13 #potassium.club.cc.cmu.edu >chem.cmu.edu #Carnegie Mellon University - Chemistry Dept. 128.2.40.134 #afs.chem.cmu.edu 128.2.40.140 #afs2.chem.cmu.edu >cs.cmu.edu #Carnegie Mellon University - School of Comp. Sci. +128.2.184.215 #pumpkin.srv.cs.cmu.edu 128.2.201.46 #strawberry.srv.cs.cmu.edu -128.2.201.47 #pumpkin.srv.cs.cmu.edu 128.2.201.48 #cherry.srv.cs.cmu.edu >ece.cmu.edu #Carnegie Mellon University - Elec. Comp. Eng. Dept. 128.2.129.7 #porok.ece.cmu.edu @@ -199,7 +206,7 @@ >cs.fhm.edu #Department Computer Science Munich University Of Applied Science 129.187.208.2 #srv1.informatik.fh-muenchen.de >eecs.harvard.edu #Harvard - EECS -140.247.60.61 #zermelo.eecs.harvard.edu +140.247.60.64 #lefkada.eecs.harvard.edu 140.247.60.83 #corfu.eecs.harvard.edu >iastate.edu #Iowa State University 129.186.1.243 #afsdb-1.iastate.edu @@ -380,10 +387,14 @@ 134.158.232.11 #ccafsdb1.in2p3.fr 134.158.232.12 #ccafsdb2.in2p3.fr 134.158.232.13 #ccafsdb3.in2p3.fr +>mcc.ac.gb #University of Manchester +130.88.203.41 #nevis.mc.man.ac.uk +130.88.203.144 #eryri.mc.man.ac.uk +130.88.203.145 #scafell.mc.man.ac.uk >anl.gov #Argonne National Laboratory -146.137.96.33 #arteus.ctd.anl.gov -146.137.162.88 #agamemnon.ctd.anl.gov -146.137.194.80 #antenor.ctd.anl.gov +146.137.96.33 #arteus.it.anl.gov +146.137.162.88 #agamemnon.it.anl.gov +146.137.194.80 #antenor.it.anl.gov >rhic.bnl.gov #Relativistic Heavy Ion Collider 130.199.6.51 #rafs03.rcf.bnl.gov 130.199.6.52 #rafs02.rcf.bnl.gov @@ -484,9 +495,10 @@ >laroia.net #Laroia Networks 66.66.102.254 #supercore.laroia.net >sinenomine.net #Sine Nomine Associates -192.204.203.218 #va.sinenomine.net +66.135.48.108 #tx2srv03.sinenomine.net +72.73.30.42 #va.sinenomine.net >slackers.net #The Slackers' Network -63.201.48.27 #alexandria.slackers.net +199.4.150.159 #alexandria.slackers.net >tproa.net #The People's Republic of Ames 72.13.4.23 #service-3.tproa.net 72.13.4.24 #service-4.tproa.net @@ -506,6 +518,10 @@ >dementia.org #Dementia Unlimited 128.2.12.45 #alycia.dementia.org 128.2.120.216 #meredith.dementia.org +>dsrw.org #The DSRW +65.103.82.83 #straylight.dsrw.org +65.103.82.84 #chiba.dsrw.org +65.103.82.85 #freeside.dsrw.org >hackish.org #Hackish.org 24.167.65.213 #avatar.sys.hackish.org 128.2.120.138 #kurma.sys.hackish.org @@ -572,6 +588,8 @@ 194.249.156.1 #brenta.ijs.si >p-ng.si #Nova Gorica Polytechnic 193.2.120.2 #solkan.p-ng.si +>hep-ex.physics.metu.edu.tr #METU Department of Physics, Experimental HEP group, Ankara/Turke +144.122.31.131 #neutrino.physics.metu.edu.tr >phy.bris.ac.uk #Bristol University - phyics 137.222.58.9 #afs1.phy.bris.ac.uk >inf.ed.ac.uk #School of Informatics, University of Edinburgh diff --git a/src/WINNT/install/wix/CellServDB b/src/WINNT/install/wix/CellServDB index 882d0904ea..79a2c23ffa 100644 --- a/src/WINNT/install/wix/CellServDB +++ b/src/WINNT/install/wix/CellServDB @@ -1,4 +1,4 @@ ->grand.central.org #GCO Public CellServDB 05 Jul 2007 +>grand.central.org #GCO Public CellServDB 25 Oct 2007 18.92.0.108 #grand-opening.mit.edu 128.2.203.61 #penn.central.org 130.237.48.87 #andrew.e.kth.se @@ -48,8 +48,6 @@ 66.93.118.125 #stormy 130.85.24.11 #weasel 130.85.24.13 #straykitten ->midnightlinux.com #Midnight Linux, Pittsburgh PA -208.10.142.82 #outpost.midnightlinux.com >setfilepointer.com #SetFilePointer.com 63.224.10.2 #hamlet.SetFilePointer.com 63.224.10.4 #troilus.SetFilePointer.com @@ -62,6 +60,10 @@ 213.187.92.33 #gpp1.gppc.de 213.187.92.34 #paulchen.gppc.de 213.187.92.35 #lotus.gppc.de +>cms.hu-berlin.de #Humboldt University Berlin +141.20.1.65 #commodus.cms.hu-berlin.de +141.20.1.66 #faustinus.cms.hu-berlin.de +141.20.1.67 #marcellus.cms.hu-berlin.de >ifh.de #DESY Zeuthen 141.34.22.10 #romulus.ifh.de 141.34.22.11 #remus.ifh.de @@ -147,8 +149,12 @@ 129.219.10.70 #authen1.asu.edu 129.219.10.72 #authen3.asu.edu 129.219.100.16 #authen4.asu.edu ->hep.caltech.edu #CalTech High Energy Physics -131.215.126.150 #afs.hep.caltech.edu +>eecs.berkeley.edu #University of California, Berkeley - EECS Dept. +128.32.139.34 #greed.eecs.berkeley.edu +128.32.139.35 #gluttony.eecs.berkeley.edu +169.229.60.112 #envy.eecs.berkeley.edu +>hep.caltech.edu #Caltech High Energy Physics +131.215.116.20 #afs.hep.caltech.edu >clarkson.edu #Clarkson University, Potsdam, New York USA 128.153.1.111 #arthur.clarkson.edu 128.153.9.111 #lancelot.clarkson.edu @@ -160,14 +166,15 @@ 128.2.10.28 #vice28.fs.andrew.cmu.edu 128.2.32.44 #new-vice12.fs.andrew.cmu.edu >club.cc.cmu.edu #Carnegie Mellon University Computer Club +128.2.204.149 #barium.club.cc.cmu.edu 128.237.157.11 #sodium.club.cc.cmu.edu 128.237.157.13 #potassium.club.cc.cmu.edu >chem.cmu.edu #Carnegie Mellon University - Chemistry Dept. 128.2.40.134 #afs.chem.cmu.edu 128.2.40.140 #afs2.chem.cmu.edu >cs.cmu.edu #Carnegie Mellon University - School of Comp. Sci. +128.2.184.215 #pumpkin.srv.cs.cmu.edu 128.2.201.46 #strawberry.srv.cs.cmu.edu -128.2.201.47 #pumpkin.srv.cs.cmu.edu 128.2.201.48 #cherry.srv.cs.cmu.edu >ece.cmu.edu #Carnegie Mellon University - Elec. Comp. Eng. Dept. 128.2.129.7 #porok.ece.cmu.edu @@ -199,7 +206,7 @@ >cs.fhm.edu #Department Computer Science Munich University Of Applied Science 129.187.208.2 #srv1.informatik.fh-muenchen.de >eecs.harvard.edu #Harvard - EECS -140.247.60.61 #zermelo.eecs.harvard.edu +140.247.60.64 #lefkada.eecs.harvard.edu 140.247.60.83 #corfu.eecs.harvard.edu >iastate.edu #Iowa State University 129.186.1.243 #afsdb-1.iastate.edu @@ -380,10 +387,14 @@ 134.158.232.11 #ccafsdb1.in2p3.fr 134.158.232.12 #ccafsdb2.in2p3.fr 134.158.232.13 #ccafsdb3.in2p3.fr +>mcc.ac.gb #University of Manchester +130.88.203.41 #nevis.mc.man.ac.uk +130.88.203.144 #eryri.mc.man.ac.uk +130.88.203.145 #scafell.mc.man.ac.uk >anl.gov #Argonne National Laboratory -146.137.96.33 #arteus.ctd.anl.gov -146.137.162.88 #agamemnon.ctd.anl.gov -146.137.194.80 #antenor.ctd.anl.gov +146.137.96.33 #arteus.it.anl.gov +146.137.162.88 #agamemnon.it.anl.gov +146.137.194.80 #antenor.it.anl.gov >rhic.bnl.gov #Relativistic Heavy Ion Collider 130.199.6.51 #rafs03.rcf.bnl.gov 130.199.6.52 #rafs02.rcf.bnl.gov @@ -484,9 +495,10 @@ >laroia.net #Laroia Networks 66.66.102.254 #supercore.laroia.net >sinenomine.net #Sine Nomine Associates -192.204.203.218 #va.sinenomine.net +66.135.48.108 #tx2srv03.sinenomine.net +72.73.30.42 #va.sinenomine.net >slackers.net #The Slackers' Network -63.201.48.27 #alexandria.slackers.net +199.4.150.159 #alexandria.slackers.net >tproa.net #The People's Republic of Ames 72.13.4.23 #service-3.tproa.net 72.13.4.24 #service-4.tproa.net @@ -506,6 +518,10 @@ >dementia.org #Dementia Unlimited 128.2.12.45 #alycia.dementia.org 128.2.120.216 #meredith.dementia.org +>dsrw.org #The DSRW +65.103.82.83 #straylight.dsrw.org +65.103.82.84 #chiba.dsrw.org +65.103.82.85 #freeside.dsrw.org >hackish.org #Hackish.org 24.167.65.213 #avatar.sys.hackish.org 128.2.120.138 #kurma.sys.hackish.org @@ -572,6 +588,8 @@ 194.249.156.1 #brenta.ijs.si >p-ng.si #Nova Gorica Polytechnic 193.2.120.2 #solkan.p-ng.si +>hep-ex.physics.metu.edu.tr #METU Department of Physics, Experimental HEP group, Ankara/Turke +144.122.31.131 #neutrino.physics.metu.edu.tr >phy.bris.ac.uk #Bristol University - phyics 137.222.58.9 #afs1.phy.bris.ac.uk >inf.ed.ac.uk #School of Informatics, University of Edinburgh diff --git a/src/WINNT/install/wix/config.wxi b/src/WINNT/install/wix/config.wxi index 84c3a7744e..94d9ed8069 100644 --- a/src/WINNT/install/wix/config.wxi +++ b/src/WINNT/install/wix/config.wxi @@ -93,7 +93,7 @@ - + @@ -102,7 +102,7 @@ - + @@ -134,7 +134,7 @@ - + diff --git a/src/WINNT/install/wix/files.wxi b/src/WINNT/install/wix/files.wxi index 9abac1db55..a1a2760f09 100644 --- a/src/WINNT/install/wix/files.wxi +++ b/src/WINNT/install/wix/files.wxi @@ -1,35 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -922,6 +892,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/WINNT/install/wix/property.wxi b/src/WINNT/install/wix/property.wxi index 6861b61181..a32eb949cb 100644 --- a/src/WINNT/install/wix/property.wxi +++ b/src/WINNT/install/wix/property.wxi @@ -117,7 +117,7 @@ - + diff --git a/src/WINNT/install/wix/registry.wxi b/src/WINNT/install/wix/registry.wxi index 2f7aa00145..98dc9a8d02 100644 --- a/src/WINNT/install/wix/registry.wxi +++ b/src/WINNT/install/wix/registry.wxi @@ -92,12 +92,12 @@ - + - - + + diff --git a/src/WINNT/netidmgr_plugin/afsfuncs.c b/src/WINNT/netidmgr_plugin/afsfuncs.c index 8b807329b7..471ed98f25 100644 --- a/src/WINNT/netidmgr_plugin/afsfuncs.c +++ b/src/WINNT/netidmgr_plugin/afsfuncs.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005,2006 Secure Endpoints Inc. + * Copyright (c) 2005,2006,2007 Secure Endpoints Inc. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -900,6 +900,7 @@ afs_klog(khm_handle identity, if (r) { _reportf(L"Code %d while getting credentials", r); + k5creds = NULL; goto end_krb5; } diff --git a/src/afs/DARWIN/osi_file.c b/src/afs/DARWIN/osi_file.c index 279187befd..eddbb5c479 100644 --- a/src/afs/DARWIN/osi_file.c +++ b/src/afs/DARWIN/osi_file.c @@ -141,6 +141,9 @@ osi_UFSOpen(afs_int32 ainode) extern int cacheDiskType; afs_int32 code = 0; int dummy; + char fname[1024]; + struct osi_stat tstat; + AFS_STATCNT(osi_UFSOpen); if (cacheDiskType != AFS_FCACHE_TYPE_UFS) { osi_Panic("UFSOpen called for non-UFS cache\n"); @@ -154,6 +157,28 @@ osi_UFSOpen(afs_int32 ainode) } afile = (struct osi_file *)osi_AllocSmallSpace(sizeof(struct osi_file)); AFS_GUNLOCK(); +#ifdef AFS_CACHE_VNODE_PATH + if (ainode < 0) { + switch (ainode) { + case AFS_CACHE_CELLS_INODE: + snprintf(fname, 1024, "%s/%s", afs_cachebasedir, "CellItems"); + break; + case AFS_CACHE_ITEMS_INODE: + snprintf(fname, 1024, "%s/%s", afs_cachebasedir, "CacheItems"); + break; + case AFS_CACHE_VOLUME_INODE: + snprintf(fname, 1024, "%s/%s", afs_cachebasedir, "VolumeItems"); + break; + default: + osi_Panic("Invalid negative inode"); + } + } else { + dummy = ainode / afs_numfilesperdir; + snprintf(fname, 1024, "%s/D%d/V%d", afs_cachebasedir, dummy, ainode); + } + + code = vnode_open(fname, O_RDWR, 0, 0, &vp, afs_osi_ctxtp); +#else #ifndef AFS_DARWIN80_ENV if (afs_CacheFSType == AFS_APPL_HFS_CACHE) code = igetinode(afs_cacheVfsp, (dev_t) cacheDev.dev, &ainode, &vp, &va, &dummy); /* XXX hfs is broken */ @@ -165,6 +190,7 @@ osi_UFSOpen(afs_int32 ainode) #ifndef AFS_DARWIN80_ENV else panic("osi_UFSOpen called before cacheops initialized\n"); +#endif #endif AFS_GLOCK(); if (code) { @@ -172,10 +198,15 @@ osi_UFSOpen(afs_int32 ainode) osi_Panic("UFSOpen: igetinode failed"); } afile->vnode = vp; - afile->size = va.va_size; afile->offset = 0; afile->proc = (int (*)())0; afile->inum = ainode; /* for hint validity checking */ +#ifndef AFS_CACHE_VNODE_PATH + afile->size = va.va_size; +#else + code = afs_osi_Stat(afile, &tstat); + afile->size = tstat.size; +#endif return (void *)afile; } diff --git a/src/afs/DARWIN/osi_misc.c b/src/afs/DARWIN/osi_misc.c index 5ac8daa9e3..776571a052 100644 --- a/src/afs/DARWIN/osi_misc.c +++ b/src/afs/DARWIN/osi_misc.c @@ -102,10 +102,15 @@ uio_t afsio_darwin_partialcopy(uio_t auio, int size) { user_addr_t iovaddr; user_size_t iovsize; - /* XXX 64 bit userspaace? */ - res = uio_create(uio_iovcnt(auio), uio_offset(auio), - uio_isuserspace(auio) ? UIO_USERSPACE32 : UIO_SYSSPACE32, - uio_rw(auio)); + if (proc_is64bit(current_proc())) { + res = uio_create(uio_iovcnt(auio), uio_offset(auio), + uio_isuserspace(auio) ? UIO_USERSPACE64 : UIO_SYSSPACE32, + uio_rw(auio)); + } else { + res = uio_create(uio_iovcnt(auio), uio_offset(auio), + uio_isuserspace(auio) ? UIO_USERSPACE32 : UIO_SYSSPACE32, + uio_rw(auio)); + } for (i = 0;i < uio_iovcnt(auio) && size > 0;i++) { if (uio_getiov(auio, i, &iovaddr, &iovsize)) diff --git a/src/afs/DARWIN/osi_vnodeops.c b/src/afs/DARWIN/osi_vnodeops.c index 494a11ecca..ba7197f0e8 100644 --- a/src/afs/DARWIN/osi_vnodeops.c +++ b/src/afs/DARWIN/osi_vnodeops.c @@ -542,6 +542,8 @@ afs_vop_close(ap) else code = afs_close(avc, ap->a_fflag, &afs_osi_cred, vop_proc); osi_FlushPages(avc, vop_cred); /* hold bozon lock, but not basic vnode lock */ + /* This is legit; it just forces the fstrace event to happen */ + code = afs_CheckCode(code, NULL, 60); AFS_GUNLOCK(); return code; @@ -634,16 +636,22 @@ afs_vop_access(ap) /* we can't check for KAUTH_VNODE_TAKE_OWNERSHIP, so we always permit it */ code = afs_AccessOK(tvc, bits, &treq, cmb); - +#if defined(AFS_DARWIN80_ENV) + /* In a dropbox, cp on 10.4 behaves badly, looping on EACCES */ + /* In a dropbox, Finder may reopen the file. Let it. */ + if (code == 0 && ((bits &~(PRSFS_READ|PRSFS_WRITE)) == 0)) { + code = afs_AccessOK(tvc, PRSFS_ADMINISTER|PRSFS_INSERT|bits, &treq, cmb); + } +#endif if (code == 1 && vnode_vtype(ap->a_vp) == VREG && ap->a_action & KAUTH_VNODE_EXECUTE && (tvc->m.Mode & 0100) != 0100) { code = 0; - } + } if (code) { code= 0; /* if access is ok */ } else { - code = afs_CheckCode(EACCES, &treq, 57); /* failure code */ + code = afs_CheckCode(EACCES, &treq, 57); /* failure code */ } out: afs_PutFakeStat(&fakestate); @@ -682,12 +690,15 @@ afs_vop_getattr(ap) AFS_GLOCK(); code = afs_getattr(VTOAFS(ap->a_vp), ap->a_vap, vop_cred); + /* This is legit; it just forces the fstrace event to happen */ + code = afs_CheckCode(code, NULL, 58); AFS_GUNLOCK(); #ifdef AFS_DARWIN80_ENV VATTR_SET_SUPPORTED(ap->a_vap, va_type); VATTR_SET_SUPPORTED(ap->a_vap, va_mode); VATTR_SET_SUPPORTED(ap->a_vap, va_uid); VATTR_SET_SUPPORTED(ap->a_vap, va_gid); + VATTR_SET_SUPPORTED(ap->a_vap, va_fsid); VATTR_SET_SUPPORTED(ap->a_vap, va_fileid); VATTR_SET_SUPPORTED(ap->a_vap, va_nlink); VATTR_SET_SUPPORTED(ap->a_vap, va_data_size); @@ -714,6 +725,8 @@ afs_vop_setattr(ap) int code; AFS_GLOCK(); code = afs_setattr(VTOAFS(ap->a_vp), ap->a_vap, vop_cred); + /* This is legit; it just forces the fstrace event to happen */ + code = afs_CheckCode(code, NULL, 59); AFS_GUNLOCK(); return code; } @@ -730,6 +743,9 @@ afs_vop_read(ap) int code; struct vnode *vp = ap->a_vp; struct vcache *avc = VTOAFS(vp); + + if (vnode_isdir(ap->a_vp)) + return EISDIR; #ifdef AFS_DARWIN80_ENV ubc_sync_range(ap->a_vp, AFS_UIO_OFFSET(ap->a_uio), AFS_UIO_OFFSET(ap->a_uio) + AFS_UIO_RESID(ap->a_uio), UBC_PUSHDIRTY); #else @@ -1190,6 +1206,7 @@ afs_vop_remove(ap) GETNAME(); AFS_GLOCK(); error = afs_remove(VTOAFS(dvp), name, vop_cn_cred); + error = afs_CheckCode(error, NULL, 61); AFS_GUNLOCK(); cache_purge(vp); if (!error) { @@ -1207,6 +1224,12 @@ afs_vop_remove(ap) /* If crashes continue in ubc_hold, comment this out */ (void)ubc_uncache(vp); #endif + } else { + /* should check for PRSFS_INSERT and not PRSFS_DELETE, but the + goal here is to deal with Finder's unhappiness with resource + forks that have no resources in a dropbox setting */ + if (name[0] == '.' && name[1] == '_' && error == EACCES) + error = 0; } #ifndef AFS_DARWIN80_ENV @@ -2060,14 +2083,14 @@ afs_darwin_getnewvnode(struct vcache *avc) Don't touch! */ int afs_darwin_finalizevnode(struct vcache *avc, struct vnode *dvp, struct componentname *cnp, int isroot) { - vnode_t ovp = AFSTOV(avc); + vnode_t ovp; vnode_t nvp; int error; struct vnode_fsparam par; AFS_GLOCK(); ObtainWriteLock(&avc->lock,325); + ovp = AFSTOV(avc); if (!(avc->states & CDeadVnode) && vnode_vtype(ovp) != VNON) { - ReleaseWriteLock(&avc->lock); AFS_GUNLOCK(); #if 0 /* unsupported */ if (dvp && cnp) @@ -2075,7 +2098,11 @@ afs_darwin_finalizevnode(struct vcache *avc, struct vnode *dvp, struct component cnp->cn_hash, VNODE_UPDATE_PARENT|VNODE_UPDATE_NAME); #endif + /* Can end up in reclaim... drop GLOCK */ vnode_rele(ovp); + AFS_GLOCK(); + ReleaseWriteLock(&avc->lock); + AFS_GUNLOCK(); return 0; } if ((avc->states & CDeadVnode) && vnode_vtype(ovp) != VNON) @@ -2097,20 +2124,24 @@ afs_darwin_finalizevnode(struct vcache *avc, struct vnode *dvp, struct component error = vnode_create(VNCREATE_FLAVOR, VCREATESIZE, &par, &nvp); if (!error) { vnode_addfsref(nvp); + if ((avc->states & CDeadVnode) && vnode_vtype(ovp) != VNON) + printf("vcache %p should not be CDeadVnode", avc); + if (avc->v == ovp) { + if (!(avc->states & CVInit)) { + vnode_clearfsnode(ovp); + vnode_removefsref(ovp); + } + } avc->v = nvp; avc->states &=~ CDeadVnode; - if (!(avc->states & CVInit)) { - vnode_clearfsnode(ovp); - vnode_removefsref(ovp); - } } + vnode_put(ovp); + vnode_rele(ovp); AFS_GLOCK(); ReleaseWriteLock(&avc->lock); if (!error) afs_osi_Wakeup(&avc->states); AFS_GUNLOCK(); - vnode_put(ovp); - vnode_rele(ovp); return error; } #endif diff --git a/src/afs/LINUX/osi_export.c b/src/afs/LINUX/osi_export.c index 5de06a1a92..24d5063247 100644 --- a/src/afs/LINUX/osi_export.c +++ b/src/afs/LINUX/osi_export.c @@ -18,6 +18,10 @@ RCSID ("$Header$"); #include /* early to avoid printf->printk mapping */ +#include +#ifdef EXPORTFS_H_EXISTS +#include +#endif #include "afs/sysincludes.h" #include "afsincludes.h" #include "afs/afs_dynroot.h" diff --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h index 836a98df11..d398c7e859 100644 --- a/src/afs/LINUX/osi_machdep.h +++ b/src/afs/LINUX/osi_machdep.h @@ -76,7 +76,18 @@ #define afs_hz HZ #include "h/sched.h" +#if defined(HAVE_CURRENT_KERNEL_TIME) +static inline time_t osi_Time(void) { + struct timespec xtime; + xtime = current_kernel_time(); + return xtime.tv_sec; +} +#else #define osi_Time() (xtime.tv_sec) +#endif + + + #ifdef AFS_LINUX_64BIT_KERNEL #define osi_GetTime(V) \ do { \ diff --git a/src/afs/LINUX/osi_module.c b/src/afs/LINUX/osi_module.c index 0c196406ac..b56c3b2784 100644 --- a/src/afs/LINUX/osi_module.c +++ b/src/afs/LINUX/osi_module.c @@ -88,24 +88,18 @@ init_module(void) #endif #endif -#ifndef LINUX_KEYRING_SUPPORT err = osi_syscall_init(); if (err) return err; -#endif err = afs_init_inodecache(); if (err) { -#ifndef LINUX_KEYRING_SUPPORT osi_syscall_clean(); -#endif return err; } err = register_filesystem(&afs_fs_type); if (err) { afs_destroy_inodecache(); -#ifndef LINUX_KEYRING_SUPPORT osi_syscall_clean(); -#endif return err; } @@ -133,9 +127,7 @@ cleanup_module(void) osi_keyring_shutdown(); #endif osi_sysctl_clean(); -#ifndef LINUX_KEYRING_SUPPORT osi_syscall_clean(); -#endif unregister_filesystem(&afs_fs_type); afs_destroy_inodecache(); diff --git a/src/afs/LINUX/osi_nfssrv.c b/src/afs/LINUX/osi_nfssrv.c index 1ae6c9c8d1..a2c2e05b4e 100644 --- a/src/afs/LINUX/osi_nfssrv.c +++ b/src/afs/LINUX/osi_nfssrv.c @@ -19,6 +19,7 @@ RCSID #if !defined(AFS_NONFSTRANS) || defined(AFS_AIX_IAUTH_ENV) #include /* early to avoid printf->printk mapping */ +#include #include "afs/sysincludes.h" #include "afsincludes.h" #include "nfsclient.h" @@ -96,6 +97,7 @@ svcauth_afs_accept(struct svc_rqst *rqstp, u32 *authp) struct nfs_server_thread *ns; struct afs_exporter *outexp; struct AFS_UCRED *credp; + struct sockaddr_in *addr; int code; code = afs_orig_authtab[rqstp->rq_authop->flavour]->accept(rqstp, authp); @@ -109,11 +111,16 @@ svcauth_afs_accept(struct svc_rqst *rqstp, u32 *authp) /* XXX maybe we should fail this with rpc_system_err? */ return SVC_OK; } +#if HAVE_SVC_ADDR_IN + addr = svc_addr_in(rqstp); +#else + addr = &rqstp->rq_addr; +#endif ns->active = 1; ns->flavor = rqstp->rq_authop->flavour; ns->code = EACCES; - ns->client_addr = rqstp->rq_addr; + ns->client_addr = *addr; ns->client_addrlen = rqstp->rq_addrlen; ns->client_uid = rqstp->rq_cred.cr_uid; ns->client_gid = rqstp->rq_cred.cr_gid; @@ -126,10 +133,9 @@ svcauth_afs_accept(struct svc_rqst *rqstp, u32 *authp) else ns->client_g1 = -1; - /* NB: Don't check the length; it's not always filled in! */ - if (rqstp->rq_addr.sin_family != AF_INET) { + if (addr->sin_family != AF_INET) { printk("afs: NFS request from non-IPv4 client (family %d len %d)\n", - rqstp->rq_addr.sin_family, rqstp->rq_addrlen); + addr->sin_family, rqstp->rq_addrlen); goto done; } @@ -143,7 +149,7 @@ svcauth_afs_accept(struct svc_rqst *rqstp, u32 *authp) * clients to afs_nobody */ if (credp->cr_uid == -1) credp->cr_uid = -2; - code = afs_nfsclient_reqhandler(0, &credp, rqstp->rq_addr.sin_addr.s_addr, + code = afs_nfsclient_reqhandler(0, &credp, addr->sin_addr.s_addr, &ns->uid, &outexp); if (!code && outexp) EXP_RELE(outexp); if (!code) ns->code = 0; diff --git a/src/afs/LINUX/osi_sysctl.c b/src/afs/LINUX/osi_sysctl.c index d6c2d2f038..e0b3f5e0dd 100644 --- a/src/afs/LINUX/osi_sysctl.c +++ b/src/afs/LINUX/osi_sysctl.c @@ -36,7 +36,11 @@ static struct ctl_table_header *afs_sysctl = NULL; static ctl_table afs_sysctl_table[] = { { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 1, +#endif .procname = "hm_retry_RO", .data = &hm_retry_RO, .maxlen = sizeof(afs_int32), @@ -44,7 +48,11 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 2, +#endif .procname = "hm_retry_RW", .data = &hm_retry_RW, .maxlen = sizeof(afs_int32), @@ -52,7 +60,11 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 3, +#endif .procname = "hm_retry_int", .data = &hm_retry_int, .maxlen = sizeof(afs_int32), @@ -60,7 +72,11 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 4, +#endif .procname = "GCPAGs", .data = &afs_gcpags, .maxlen = sizeof(afs_int32), @@ -68,7 +84,11 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 5, +#endif .procname = "rx_deadtime", .data = &afs_rx_deadtime, .maxlen = sizeof(afs_int32), @@ -76,7 +96,11 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 6, +#endif .procname = "bkVolPref", .data = &afs_bkvolpref, .maxlen = sizeof(afs_int32), @@ -152,7 +176,11 @@ static ctl_table afs_sysctl_table[] = { static ctl_table fs_sysctl_table[] = { { +#if defined(SYSCTL_TABLE_CHECKING) + .ctl_name = CTL_UNNUMBERED, +#else .ctl_name = 1, +#endif .procname = "afs", .mode = 0555, .child = afs_sysctl_table diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c index d18e3ad647..fe9224d351 100644 --- a/src/afs/LINUX/osi_vfsops.c +++ b/src/afs/LINUX/osi_vfsops.c @@ -269,7 +269,11 @@ afs_notify_change(struct dentry *dp, struct iattr *iattrp) #if defined(STRUCT_SUPER_HAS_ALLOC_INODE) +#if defined(HAVE_KMEM_CACHE_T) static kmem_cache_t *afs_inode_cachep; +#else +struct kmem_cache *afs_inode_cachep; +#endif static struct inode * afs_alloc_inode(struct super_block *sb) @@ -294,7 +298,15 @@ afs_destroy_inode(struct inode *inode) } static void +#if defined(HAVE_KMEM_CACHE_T) init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) +#else +#if defined(KMEM_CACHE_INIT) +init_once(struct kmem_cache * cachep, void * foo) +#else +init_once(void * foo, struct kmem_cache * cachep, unsigned long flags) +#endif +#endif { struct vcache *vcp = (struct vcache *) foo; @@ -312,10 +324,17 @@ afs_init_inodecache(void) #define SLAB_RECLAIM_ACCOUNT 0 #endif +#if defined(KMEM_CACHE_TAKES_DTOR) afs_inode_cachep = kmem_cache_create("afs_inode_cache", sizeof(struct vcache), 0, SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT, init_once, NULL); +#else + afs_inode_cachep = kmem_cache_create("afs_inode_cache", + sizeof(struct vcache), + 0, SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT, + init_once); +#endif if (afs_inode_cachep == NULL) return -ENOMEM; return 0; @@ -523,6 +542,7 @@ vattr2inode(struct inode *ip, struct vattr *vp) ip->i_size = vp->va_size; #if defined(AFS_LINUX26_ENV) ip->i_atime.tv_sec = vp->va_atime.tv_sec; + ip->i_atime.tv_nsec = 0; ip->i_mtime.tv_sec = vp->va_mtime.tv_sec; /* Set the mtime nanoseconds to the sysname generation number. * This convinces NFS clients that all directories have changed @@ -530,6 +550,7 @@ vattr2inode(struct inode *ip, struct vattr *vp) */ ip->i_mtime.tv_nsec = afs_sysnamegen; ip->i_ctime.tv_sec = vp->va_ctime.tv_sec; + ip->i_ctime.tv_nsec = 0; #else ip->i_atime = vp->va_atime.tv_sec; ip->i_mtime = vp->va_mtime.tv_sec; diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 61f7bbf10e..4a6b8c0a1b 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -658,8 +658,12 @@ struct file_operations afs_file_fops = { .mmap = afs_linux_mmap, .open = afs_linux_open, .flush = afs_linux_flush, -#ifdef AFS_LINUX26_ENV +#if defined(AFS_LINUX26_ENV) && defined(STRUCT_FILE_OPERATIONS_HAS_SENDFILE) .sendfile = generic_file_sendfile, +#endif +#if defined(AFS_LINUX26_ENV) && defined(STRUCT_FILE_OPERATIONS_HAS_SPLICE) + .splice_write = generic_file_splice_write, + .splice_read = generic_file_splice_read, #endif .release = afs_linux_release, .fsync = afs_linux_fsync, @@ -896,6 +900,15 @@ afs_dentry_iput(struct dentry *dp, struct inode *ip) AFS_GLOCK(); (void) afs_InactiveVCache(vcp, NULL); AFS_GUNLOCK(); +#ifdef DCACHE_NFSFS_RENAMED +#ifdef AFS_LINUX26_ENV + spin_lock(&dp->d_lock); +#endif + dp->d_flags &= ~DCACHE_NFSFS_RENAMED; +#ifdef AFS_LINUX26_ENV + spin_unlock(&dp->d_lock); +#endif +#endif iput(ip); } @@ -957,6 +970,7 @@ afs_linux_create(struct inode *dip, struct dentry *dp, int mode) afs_getattr(vcp, &vattr, credp); afs_fill_inode(ip, &vattr); + insert_inode_hash(ip); dp->d_op = &afs_dentry_operations; dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion); d_instantiate(dp, ip); @@ -1005,6 +1019,11 @@ afs_linux_lookup(struct inode *dip, struct dentry *dp) ip = AFSTOV(vcp); afs_getattr(vcp, &vattr, credp); afs_fill_inode(ip, &vattr); +#if defined(AFS_LINUX24_ENV) +#define hlist_unhashed(x) list_empty(x) +#endif + if (hlist_unhashed(&ip->i_hash)) + insert_inode_hash(ip); } dp->d_op = &afs_dentry_operations; dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion); @@ -1131,6 +1150,15 @@ afs_linux_unlink(struct inode *dip, struct dentry *dp) } tvc->uncred = credp; tvc->states |= CUnlinked; +#ifdef DCACHE_NFSFS_RENAMED +#ifdef AFS_LINUX26_ENV + spin_lock(&dp->d_lock); +#endif + dp->d_flags |= DCACHE_NFSFS_RENAMED; +#ifdef AFS_LINUX26_ENV + spin_unlock(&dp->d_lock); +#endif +#endif } else { osi_FreeSmallSpace(__name); } @@ -1858,5 +1886,4 @@ afs_fill_inode(struct inode *ip, struct vattr *vattr) #endif } - /* insert_inode_hash(ip); -- this would make iget() work (if we used it) */ } diff --git a/src/afs/Makefile.in b/src/afs/Makefile.in index c03c8b90ca..9293c1185a 100644 --- a/src/afs/Makefile.in +++ b/src/afs/Makefile.in @@ -137,7 +137,7 @@ dest: ${DEST}/include/afs/afs.h ${DEST}/include/afs/osi_inode.h ${DEST}/includ ${INSTALL} longc_procs.h ${DEST}/include/afs ;; \ esac case ${SYS_NAME} in \ - next_mach30 | vax_ul43 | *_darwin* | i386_fbsd* ) \ + i386_fbsd* ) \ echo skipping afszcm.cat install for ${SYS_NAME} ;; \ * ) \ ${INSTALL} afszcm.cat ${DEST}/root.client/usr/vice/etc/C ;; \ diff --git a/src/afs/SOLARIS/osi_machdep.h b/src/afs/SOLARIS/osi_machdep.h index 744dbab0bc..fe50f501cb 100644 --- a/src/afs/SOLARIS/osi_machdep.h +++ b/src/afs/SOLARIS/osi_machdep.h @@ -104,4 +104,23 @@ extern kmutex_t afs_global_lock; #define AfsLargeFileSize(pos, off) ( ((offset_t)(pos)+(offset_t)(off) > (offset_t)0x7fffffff)?1:0) #endif +#if defined(AFS_SUN510_ENV) +#include "h/sunddi.h" +extern ddi_taskq_t *afs_taskq; +extern krwlock_t afsifinfo_lock; + +/* this should be in rx/SOLARIS/rx_knet.c accessed via accessor functions, + eventually */ +#include "net/if.h" +/* Global interface info struct */ +struct afs_ifinfo { + char ifname[LIFNAMSIZ]; + ipaddr_t ipaddr; + ipaddr_t netmask; + uint_t mtu; + uint64_t flags; + int metric; + ipaddr_t dstaddr; +}; +#endif #endif /* _OSI_MACHDEP_H_ */ diff --git a/src/afs/SOLARIS/osi_vfsops.c b/src/afs/SOLARIS/osi_vfsops.c index e17d6d6c51..482e210c35 100644 --- a/src/afs/SOLARIS/osi_vfsops.c +++ b/src/afs/SOLARIS/osi_vfsops.c @@ -21,6 +21,9 @@ RCSID #include "afs/afs_stats.h" /* statistics stuff */ #include "h/modctl.h" #include "h/syscall.h" +#if defined(AFS_SUN511_ENV) +#include +#endif #include @@ -245,7 +248,21 @@ afs_swapvp(struct vfs *afsp, struct vnode **avpp, char *nm) } -#ifdef AFS_SUN510_ENV +#if defined(AFS_SUN511_ENV) +/* The following list must always be NULL-terminated */ +static const fs_operation_def_t afs_vfsops_template[] = { + VFSNAME_MOUNT, { .vfs_mount = afs_mount }, + VFSNAME_UNMOUNT, { .vfs_unmount = afs_unmount }, + VFSNAME_ROOT, { .vfs_root = afs_root }, + VFSNAME_STATVFS, { .vfs_statvfs = afs_statvfs }, + VFSNAME_SYNC, { .vfs_sync = afs_sync }, + VFSNAME_VGET, { .vfs_vget = afs_vget }, + VFSNAME_MOUNTROOT, { .vfs_mountroot = afs_mountroot }, + VFSNAME_FREEVFS, { .vfs_freevfs = fs_freevfs }, + NULL, NULL +}; +struct vfsops *afs_vfsopsp; +#elif defined(AFS_SUN510_ENV) /* The following list must always be NULL-terminated */ const fs_operation_def_t afs_vfsops_template[] = { VFSNAME_MOUNT, afs_mount, @@ -256,7 +273,7 @@ const fs_operation_def_t afs_vfsops_template[] = { VFSNAME_VGET, afs_vget, VFSNAME_MOUNTROOT, afs_mountroot, VFSNAME_FREEVFS, fs_freevfs, - NULL, NULL + NULL, NULL }; struct vfsops *afs_vfsopsp; #else diff --git a/src/afs/SOLARIS/osi_vnodeops.c b/src/afs/SOLARIS/osi_vnodeops.c index 05b0273856..2c636c204a 100644 --- a/src/afs/SOLARIS/osi_vnodeops.c +++ b/src/afs/SOLARIS/osi_vnodeops.c @@ -47,6 +47,9 @@ RCSID #include #include #include +#if defined(AFS_SUN511_ENV) +#include +#endif #include #include #include @@ -1441,7 +1444,56 @@ extern int gafs_fid(), gafs_readlink(), fs_setfl(), afs_pathconf(); extern int afs_lockctl(); extern void gafs_inactive(); -#ifdef AFS_SUN510_ENV +#if defined(AFS_SUN511_ENV) +/* The following list must always be NULL-terminated */ +const fs_operation_def_t afs_vnodeops_template[] = { + VOPNAME_OPEN, { .vop_open = gafs_open }, + VOPNAME_CLOSE, { .vop_close = gafs_close }, + VOPNAME_READ, { .vop_read = afs_vmread }, + VOPNAME_WRITE, { .vop_write = afs_vmwrite }, + VOPNAME_IOCTL, { .vop_ioctl = afs_ioctl }, + VOPNAME_SETFL, { .vop_setfl = fs_setfl }, + VOPNAME_GETATTR, { .vop_getattr = gafs_getattr }, + VOPNAME_SETATTR, { .vop_setattr = gafs_setattr }, + VOPNAME_ACCESS, { .vop_access = gafs_access }, + VOPNAME_LOOKUP, { .vop_lookup = gafs_lookup }, + VOPNAME_CREATE, { .vop_create = gafs_create }, + VOPNAME_REMOVE, { .vop_remove = gafs_remove }, + VOPNAME_LINK, { .vop_link = gafs_link }, + VOPNAME_RENAME, { .vop_rename = gafs_rename }, + VOPNAME_MKDIR, { .vop_mkdir = gafs_mkdir }, + VOPNAME_RMDIR, { .vop_rmdir = gafs_rmdir }, + VOPNAME_READDIR, { .vop_readdir = gafs_readdir }, + VOPNAME_SYMLINK, { .vop_symlink = gafs_symlink }, + VOPNAME_READLINK, { .vop_readlink = gafs_readlink }, + VOPNAME_FSYNC, { .vop_fsync = gafs_fsync }, + VOPNAME_INACTIVE, { .vop_inactive = gafs_inactive }, + VOPNAME_FID, { .vop_fid = gafs_fid }, + VOPNAME_RWLOCK, { .vop_rwlock = afs_rwlock }, + VOPNAME_RWUNLOCK, { .vop_rwunlock = afs_rwunlock }, + VOPNAME_SEEK, { .vop_seek = afs_seek }, + VOPNAME_CMP, { .vop_cmp = afs_cmp }, + VOPNAME_FRLOCK, { .vop_frlock = afs_frlock }, + VOPNAME_SPACE, { .vop_space = afs_space }, + VOPNAME_REALVP, { .vop_realvp = afs_realvp }, + VOPNAME_GETPAGE, { .vop_getpage = afs_getpage }, + VOPNAME_PUTPAGE, { .vop_putpage = afs_putpage }, + VOPNAME_MAP, { .vop_map = afs_map }, + VOPNAME_ADDMAP, { .vop_addmap = afs_addmap }, + VOPNAME_DELMAP, { .vop_delmap = afs_delmap }, + VOPNAME_POLL, { .vop_poll = fs_poll }, + VOPNAME_PATHCONF, { .vop_pathconf = afs_pathconf }, + VOPNAME_PAGEIO, { .vop_pageio = afs_pageio }, + VOPNAME_DUMP, { .vop_dump = afs_dump }, + VOPNAME_DUMPCTL, { .vop_dumpctl = afs_dumpctl }, + VOPNAME_DISPOSE, { .vop_dispose = afs_dispose }, + VOPNAME_GETSECATTR, { .vop_getsecattr = afs_getsecattr }, + VOPNAME_SETSECATTR, { .vop_setsecattr = afs_setsecattr }, + VOPNAME_SHRLOCK, { .vop_shrlock = fs_shrlock }, + NULL, NULL +}; +vnodeops_t *afs_ops; +#elif defined(AFS_SUN510_ENV) /* The following list must always be NULL-terminated */ const fs_operation_def_t afs_vnodeops_template[] = { VOPNAME_OPEN, gafs_open, diff --git a/src/afs/UKERNEL/afs_usrops.c b/src/afs/UKERNEL/afs_usrops.c index 74dcbca08a..094c141930 100644 --- a/src/afs/UKERNEL/afs_usrops.c +++ b/src/afs/UKERNEL/afs_usrops.c @@ -183,6 +183,7 @@ int ufs_brelse(struct usr_vnode *vp, struct usr_buf *bp) { usr_assert(0); + return 0; } /* @@ -192,12 +193,14 @@ int iodone(struct usr_buf *bp) { usr_assert(0); + return 0; } struct usr_file * getf(int fd) { usr_assert(0); + return 0; } /* @@ -233,6 +236,7 @@ int usr_flock(void) { usr_assert(0); + return 0; } /* @@ -243,6 +247,7 @@ int usr_ioctl(void) { usr_assert(0); + return 0; } /* @@ -252,24 +257,28 @@ int afs_syscall_icreate(void) { usr_assert(0); + return 0; } int afs_syscall_iincdec(void) { usr_assert(0); + return 0; } int afs_syscall_iopen(void) { usr_assert(0); + return 0; } int afs_syscall_ireadwrite(void) { usr_assert(0); + return 0; } /* @@ -280,24 +289,28 @@ int vno_close(void) { usr_assert(0); + return 0; } int vno_ioctl(void) { usr_assert(0); + return 0; } int vno_rw(void) { usr_assert(0); + return 0; } int vno_select(void) { usr_assert(0); + return 0; } /* @@ -374,12 +387,14 @@ usr_crfree(struct usr_ucred *credp) if (credp->cr_ref == 0) { afs_osi_Free((char *)credp, sizeof(struct usr_ucred)); } + return 0; } int usr_crhold(struct usr_ucred *credp) { credp->cr_ref++; + return 0; } void @@ -517,6 +532,7 @@ afs_osi_Wakeup(void *x) waitp = waitp->next; } usr_mutex_unlock(&osi_waitq_lock); + return 0; } int @@ -608,6 +624,7 @@ afs_osi_CheckTimedWaits(void) waitp = waitp->timedNext; } usr_mutex_unlock(&osi_waitq_lock); + return 0; } /* @@ -1389,8 +1406,8 @@ SweepAFSCache(int *vFilesFound) return (0); } -static -ConfigCell(register struct afsconf_cell *aci, char *arock, +static int +ConfigCell(register struct afsconf_cell *aci, void *arock, struct afsconf_dir *adir) { register int isHomeCell; @@ -1420,10 +1437,7 @@ ConfigCell(register struct afsconf_cell *aci, char *arock, } static int -ConfigCellAlias(aca, arock, adir) - struct afsconf_cellalias *aca; - char *arock; - struct afsconf_dir *adir; +ConfigCellAlias(struct afsconf_cellalias *aca, void *arock, struct afsconf_dir *adir) { call_syscall(AFSOP_ADDCELLALIAS, (long)aca->aliasName, (long)aca->realName, 0, 0, 0); @@ -1980,6 +1994,7 @@ syscallThread(void *argp) sysArgsP->param2, sysArgsP->param3, sysArgsP->param4); afs_osi_Free(argp, -1); + return 0; } fork_syscall(syscall, afscall, param1, param2, param3, param4) @@ -2000,6 +2015,7 @@ fork_syscall(syscall, afscall, param1, param2, param3, param4) usr_thread_create(&tid, syscallThread, sysArgsP); usr_thread_detach(tid); + return 0; } call_syscall(syscall, afscall, param1, param2, param3, param4) @@ -2186,7 +2202,7 @@ uafs_LookupName(char *path, struct usr_vnode *parentVp, struct usr_vnode *linkVp; char *tmpPath; char *pathP; - char *nextPathP; + char *nextPathP = NULL; AFS_ASSERT_GLOCK(); diff --git a/src/afs/UKERNEL/osi_groups.c b/src/afs/UKERNEL/osi_groups.c index 849dbdde79..248627d54e 100644 --- a/src/afs/UKERNEL/osi_groups.c +++ b/src/afs/UKERNEL/osi_groups.c @@ -26,6 +26,7 @@ int afs_xsetgroups() { usr_assert(0); + return 0; } static int diff --git a/src/afs/VNOPS/afs_vnop_create.c b/src/afs/VNOPS/afs_vnop_create.c index fbb33fc273..bdf35a9b43 100644 --- a/src/afs/VNOPS/afs_vnop_create.c +++ b/src/afs/VNOPS/afs_vnop_create.c @@ -353,7 +353,9 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, UpgradeSToWLock(&tdc->lock, 631); if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { /* we can do it locally */ + ObtainWriteLock(&afs_xdcache, 291); code = afs_dir_Create(tdc, aname, &newFid.Fid); + ReleaseWriteLock(&afs_xdcache); if (code) { ZapDCE(tdc); DZap(tdc); diff --git a/src/afs/VNOPS/afs_vnop_dirops.c b/src/afs/VNOPS/afs_vnop_dirops.c index 0079acfe74..5e73dd0d64 100644 --- a/src/afs/VNOPS/afs_vnop_dirops.c +++ b/src/afs/VNOPS/afs_vnop_dirops.c @@ -132,7 +132,9 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, ObtainWriteLock(&tdc->lock, 632); if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { /* we can do it locally */ + ObtainWriteLock(&afs_xdcache, 294); code = afs_dir_Create(tdc, aname, &newFid.Fid); + ReleaseWriteLock(&afs_xdcache); if (code) { ZapDCE(tdc); /* surprise error -- use invalid value */ DZap(tdc); diff --git a/src/afs/VNOPS/afs_vnop_link.c b/src/afs/VNOPS/afs_vnop_link.c index cbd59aabf4..04c08a6dc4 100644 --- a/src/afs/VNOPS/afs_vnop_link.c +++ b/src/afs/VNOPS/afs_vnop_link.c @@ -127,7 +127,9 @@ afs_link(avc, OSI_VC_ARG(adp), aname, acred) ObtainWriteLock(&tdc->lock, 635); if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { /* we can do it locally */ + ObtainWriteLock(&afs_xdcache, 290); code = afs_dir_Create(tdc, aname, &avc->fid.Fid); + ReleaseWriteLock(&afs_xdcache); if (code) { ZapDCE(tdc); /* surprise error -- invalid value */ DZap(tdc); diff --git a/src/afs/VNOPS/afs_vnop_read.c b/src/afs/VNOPS/afs_vnop_read.c index 9a104e1683..8089e68364 100644 --- a/src/afs/VNOPS/afs_vnop_read.c +++ b/src/afs/VNOPS/afs_vnop_read.c @@ -117,7 +117,21 @@ afs_MemRead(register struct vcache *avc, struct uio *auio, * Locks held: * avc->lock(R) */ - while (totalLength > 0) { + if (filePos >= avc->m.Length) { + if (len > AFS_ZEROS) + len = sizeof(afs_zeros); /* and in 0 buffer */ +#ifdef AFS_DARWIN80_ENV + trimlen = len; + tuiop = afsio_darwin_partialcopy(auio, trimlen); +#else + afsio_copy(auio, &tuio, tvec); + trimlen = len; + afsio_trim(&tuio, trimlen); +#endif + AFS_UIOMOVE(afs_zeros, trimlen, UIO_READ, tuiop, code); + } + + while (avc->m.Length > 0 && totalLength > 0) { /* read all of the cached info */ if (filePos >= avc->m.Length) break; /* all done */ @@ -536,7 +550,22 @@ afs_UFSRead(register struct vcache *avc, struct uio *auio, } #endif - while (totalLength > 0) { + if (filePos >= avc->m.Length) { + if (len > AFS_ZEROS) + len = sizeof(afs_zeros); /* and in 0 buffer */ + len = 0; +#ifdef AFS_DARWIN80_ENV + trimlen = len; + tuiop = afsio_darwin_partialcopy(auio, trimlen); +#else + afsio_copy(auio, &tuio, tvec); + trimlen = len; + afsio_trim(&tuio, trimlen); +#endif + AFS_UIOMOVE(afs_zeros, trimlen, UIO_READ, tuiop, code); + } + + while (avc->m.Length > 0 && totalLength > 0) { /* read all of the cached info */ if (filePos >= avc->m.Length) break; /* all done */ diff --git a/src/afs/VNOPS/afs_vnop_rename.c b/src/afs/VNOPS/afs_vnop_rename.c index 1af38a21c4..02c67f99c0 100644 --- a/src/afs/VNOPS/afs_vnop_rename.c +++ b/src/afs/VNOPS/afs_vnop_rename.c @@ -227,7 +227,9 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, code = afs_dir_Delete(tdc2, aname2); } if (code == 0) { + ObtainWriteLock(&afs_xdcache, 292); code = afs_dir_Create(tdc2, aname2, &fileFid.Fid); + ReleaseWriteLock(&afs_xdcache); } if (code != 0) { ZapDCE(tdc1); diff --git a/src/afs/VNOPS/afs_vnop_symlink.c b/src/afs/VNOPS/afs_vnop_symlink.c index fa5a8f4b98..22aa636abc 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -177,7 +177,9 @@ int afs_symlink /* otherwise, we should see if we can make the change to the dir locally */ if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { /* we can do it locally */ + ObtainWriteLock(&afs_xdcache, 293); code = afs_dir_Create(tdc, aname, &newFid.Fid); + ReleaseWriteLock(&afs_xdcache); if (code) { ZapDCE(tdc); /* surprise error -- use invalid value */ DZap(tdc); diff --git a/src/afs/VNOPS/afs_vnop_write.c b/src/afs/VNOPS/afs_vnop_write.c index e40e41ab9e..5971871cae 100644 --- a/src/afs/VNOPS/afs_vnop_write.c +++ b/src/afs/VNOPS/afs_vnop_write.c @@ -905,7 +905,7 @@ afs_close(OSI_VC_ARG(avc), aflags, acred) } #endif /* AFS_SGI_ENV */ if (aflags & (FWRITE | FTRUNC)) { - if (afs_BBusy()) { + if (afs_BBusy() || (AFS_NFSXLATORREQ(acred))) { /* do it yourself if daemons are all busy */ ObtainWriteLock(&avc->lock, 124); code = afs_StoreOnLastReference(avc, &treq); diff --git a/src/afs/afs.h b/src/afs/afs.h index 5924022b46..005a1c4860 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -273,6 +273,9 @@ enum { AFS_GCPAGS_NOTCOMPILED = 0, AFS_GCPAGS_OK = extern afs_int32 afs_gcpags; extern afs_int32 afs_gcpags_procsize; extern afs_int32 afs_bkvolpref; +extern char afs_cachebasedir[1024]; +extern afs_int32 afs_numcachefiles; +extern afs_int32 afs_numfilesperdir; struct unixuser { struct unixuser *next; /* next hash pointer */ @@ -926,6 +929,9 @@ struct afs_fheader { #endif #endif + +#ifdef KERNEL +/* it does not compile outside kernel */ struct buffer { afs_int32 fid; /* is adc->index, the cache file number */ afs_inode_t inode; /* is adc->f.inode, the inode number of the cac\ @@ -953,6 +959,7 @@ struct fcache { afs_int32 chunkBytes; /* Num bytes in this chunk */ char states; /* Has this chunk been modified? */ }; +#endif /* magic numbers to specify the cache type */ @@ -1231,5 +1238,4 @@ struct afs_fakestat_state { }; extern int afs_fakestat_enable; - #endif /* _AFS_H_ */ diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 5365babb08..c223dd3a9e 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -29,7 +29,10 @@ RCSID #ifdef AFS_LINUX22_ENV #include "h/smp_lock.h" #endif - +#ifdef AFS_SUN510_ENV +#include "h/ksynch.h" +#include "h/sunddi.h" +#endif #if defined(AFS_SUN5_ENV) || defined(AFS_AIX_ENV) || defined(AFS_SGI_ENV) || defined(AFS_HPUX_ENV) #define AFS_MINBUFFERS 100 @@ -46,6 +49,11 @@ char afs_zeros[AFS_ZEROS]; char afs_rootVolumeName[64] = ""; afs_uint32 rx_bindhost; +#ifdef AFS_SUN510_ENV +ddi_taskq_t *afs_taskq; +krwlock_t afsifinfo_lock; +#endif + afs_int32 afs_initState = 0; afs_int32 afs_termState = 0; afs_int32 afs_setTime = 0; @@ -58,6 +66,9 @@ static int afs_Go_Done = 0; extern struct interfaceAddr afs_cb_interface; static int afs_RX_Running = 0; static int afs_InitSetup_done = 0; +afs_int32 afs_numcachefiles = -1; +afs_int32 afs_numfilesperdir = -1; +char afs_cachebasedir[1024]; afs_int32 afs_rx_deadtime = AFS_RXDEADTIME; afs_int32 afs_rx_harddead = AFS_HARDDEADTIME; @@ -80,6 +91,16 @@ afs_InitSetup(int preallocs) if (afs_InitSetup_done) return EAGAIN; +#ifdef AFS_SUN510_ENV + /* Initialize a RW lock for the ifinfo global array */ + rw_init(&afsifinfo_lock, NULL, RW_DRIVER, NULL); + + /* Create a taskq */ + afs_taskq = ddi_taskq_create(NULL, "afs_taskq", 2, TASKQ_DEFAULTPRI, 0); + + osi_StartNetIfPoller(); +#endif + #ifndef AFS_NOSTATS /* * Set up all the AFS statistics variables. This should be done @@ -443,6 +464,18 @@ afs_DaemonOp(long parm, long parm2, long parm3, long parm4, long parm5, } #endif +static void +wait_for_cachedefs(void) { +#ifdef AFS_CACHE_VNODE_PATH + if (cacheDiskType != AFS_FCACHE_TYPE_MEM) + while ((afs_numcachefiles < 1) || (afs_numfilesperdir < 1) || + (afs_cachebasedir[0] != '/')) { + printf("afs: waiting for cache parameter definitions\n"); + afs_osi_Sleep(&afs_initState); + } +#endif +} + /* leaving as is, probably will barf if we add prototypes here since it's likely being called with partial list */ int @@ -774,6 +807,12 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6) #ifdef AFS_DARWIN80_ENV put_vfs_context(); #endif + } else if (parm == AFSOP_CACHEDIRS) { + afs_numfilesperdir = parm2; + afs_osi_Wakeup(&afs_initState); + } else if (parm == AFSOP_CACHEFILES) { + afs_numcachefiles = parm2; + afs_osi_Wakeup(&afs_initState); } else if (parm == AFSOP_ROOTVOLUME) { /* wait for basic init */ while (afs_initState < AFSOP_START_BKG) @@ -787,7 +826,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6) code = 0; } else if (parm == AFSOP_CACHEFILE || parm == AFSOP_CACHEINFO || parm == AFSOP_VOLUMEINFO || parm == AFSOP_AFSLOG - || parm == AFSOP_CELLINFO) { + || parm == AFSOP_CELLINFO || parm == AFSOP_CACHEBASEDIR) { char *tbuffer = osi_AllocSmallSpace(AFS_SMALLOCSIZ); code = 0; @@ -803,20 +842,49 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6) #ifdef AFS_DARWIN80_ENV get_vfs_context(); #endif - if (parm == AFSOP_CACHEFILE) + if (parm == AFSOP_CACHEBASEDIR) { + strncpy(afs_cachebasedir, tbuffer, 1024); + afs_cachebasedir[1023] = '\0'; + afs_osi_Wakeup(&afs_initState); + } else if (parm == AFSOP_CACHEFILE) { + wait_for_cachedefs(); code = afs_InitCacheFile(tbuffer, 0); - else if (parm == AFSOP_CACHEINFO) + } else if (parm == AFSOP_CACHEINFO) { + wait_for_cachedefs(); code = afs_InitCacheInfo(tbuffer); - else if (parm == AFSOP_VOLUMEINFO) + } else if (parm == AFSOP_VOLUMEINFO) { + wait_for_cachedefs(); code = afs_InitVolumeInfo(tbuffer); - else if (parm == AFSOP_CELLINFO) + } else if (parm == AFSOP_CELLINFO) { + wait_for_cachedefs(); code = afs_InitCellInfo(tbuffer); + } #ifdef AFS_DARWIN80_ENV put_vfs_context(); #endif } osi_FreeSmallSpace(tbuffer); } else if (parm == AFSOP_GO) { +#ifdef AFS_CACHE_VNODE_PATH + if (cacheDiskType != AFS_FCACHE_TYPE_MEM) { + afs_int32 dummy; + + wait_for_cachedefs(); + +#ifdef AFS_DARWIN80_ENV + get_vfs_context(); +#endif + if ((afs_numcachefiles > 0) && (afs_numfilesperdir > 0) && + (afs_cachebasedir[0] == '/')) { + for (dummy = 0; dummy < afs_numcachefiles; dummy++) { + code = afs_InitCacheFile(NULL, dummy); + } + } +#ifdef AFS_DARWIN80_ENV + put_vfs_context(); +#endif + } +#endif /* the generic initialization calls come here. One parameter: should we do the * set-time operation on this workstation */ if (afs_Go_Done) @@ -1187,12 +1255,15 @@ afs_shutdown(void) #endif afs_warn("\n"); +#ifdef AFS_AIX51_ENV + shutdown_daemons(); +#endif + /* Close file only after daemons which can write to it are stopped. */ if (afs_cacheInodep) { /* memcache won't set this */ osi_UFSClose(afs_cacheInodep); /* Since we always leave it open */ afs_cacheInodep = 0; } - return; /* Just kill daemons for now */ #ifdef notdef shutdown_CB(); shutdown_AFS(); @@ -1200,21 +1271,17 @@ afs_shutdown(void) shutdown_rxevent(); shutdown_rx(); afs_shutdown_BKG(); +#endif + return; shutdown_bufferpackage(); -#endif -#ifdef AFS_AIX51_ENV - shutdown_daemons(); -#endif -#ifdef notdef shutdown_cache(); shutdown_osi(); shutdown_osinet(); shutdown_osifile(); shutdown_vnodeops(); - shutdown_vfsops(); - shutdown_exporter(); shutdown_memcache(); #if (!defined(AFS_NONFSTRANS) || defined(AFS_AIX_IAUTH_ENV)) && !defined(AFS_OSF_ENV) + shutdown_exporter(); shutdown_nfsclnt(); #endif shutdown_afstest(); @@ -1226,7 +1293,8 @@ afs_shutdown(void) */ afs_warn(" ALL allocated tables\n"); afs_shuttingdown = 0; -#endif + + return; /* Just kill daemons for now */ } void diff --git a/src/afs/afs_callback.c b/src/afs/afs_callback.c index 7b1f276476..439fb7c461 100644 --- a/src/afs/afs_callback.c +++ b/src/afs/afs_callback.c @@ -61,7 +61,11 @@ static struct ltable { { "afs_xsrvAddr", (char *)&afs_xsrvAddr}, { - "afs_xvreclaim", (char *)&afs_xvreclaim} + "afs_xvreclaim", (char *)&afs_xvreclaim}, +#ifdef AFS_AFSDB_ENV + { "afsdb_client_lock", (char *)&afsdb_client_lock}, + { "afsdb_req_lock", (char *)&afsdb_req_lock}, +#endif }; unsigned long lastCallBack_vnode; unsigned int lastCallBack_dv; @@ -307,11 +311,35 @@ SRXAFSCB_GetLock(struct rx_call *a_call, afs_int32 a_index, AFS_STATCNT(SRXAFSCB_GetLock); nentries = sizeof(ltable) / sizeof(struct ltable); - if (a_index < 0 || a_index >= nentries) { + if (a_index < 0 || a_index >= nentries+afs_cellindex) { /* * Past EOF */ code = 1; + } else if (a_index >= nentries) { + struct cell *tc = afs_GetCellByIndex(a_index-nentries, 0); + strcpy(a_result->name, tc->cellName); + a_result->lock.waitStates = + ((struct afs_lock *)&(tc->lock))->wait_states; + a_result->lock.exclLocked = + ((struct afs_lock *)&(tc->lock))->excl_locked; + a_result->lock.readersReading = + ((struct afs_lock *)&(tc->lock))->readers_reading; + a_result->lock.numWaiting = + ((struct afs_lock *)&(tc->lock))->num_waiting; +#ifdef INSTRUMENT_LOCKS + a_result->lock.pid_last_reader = + MyPidxx2Pid(((struct afs_lock *)&(tc->lock))->pid_last_reader); + a_result->lock.pid_writer = + MyPidxx2Pid(((struct afs_lock *)&(tc->lock))->pid_writer); + a_result->lock.src_indicator = + ((struct afs_lock *)&(tc->lock))->src_indicator; +#else + a_result->lock.pid_last_reader = 0; + a_result->lock.pid_writer = 0; + a_result->lock.src_indicator = 0; +#endif + code = 0; } else { /* * Found it - copy out its contents. diff --git a/src/afs/afs_cell.c b/src/afs/afs_cell.c index 33ddfb6722..754d12f1df 100644 --- a/src/afs/afs_cell.c +++ b/src/afs/afs_cell.c @@ -36,18 +36,18 @@ afs_rwlock_t afs_xcell; /* Export for cmdebug peeking at locks */ */ #ifdef AFS_AFSDB_ENV -static afs_rwlock_t afsdb_client_lock; /* Serializes client requests */ +afs_rwlock_t afsdb_client_lock; /* Serializes client requests */ +afs_rwlock_t afsdb_req_lock; /* Serializes client requests */ static char afsdb_handler_running; /* Protected by GLOCK */ static char afsdb_handler_shutdown; /* Protected by GLOCK */ +/* from cellconfig.h */ +#define MAXCELLCHARS 64 static struct { - afs_rwlock_t lock; + /* lock moved to afsdb_req_lock for cmdebug */ char pending; char complete; char *cellname; - afs_int32 *cellhosts; - int *timeout; - char **realname; } afsdb_req; void @@ -64,46 +64,60 @@ afs_StopAFSDB() int afs_AFSDBHandler(char *acellName, int acellNameLen, afs_int32 * kernelMsg) { + afs_int32 timeout, code; + afs_int32 cellHosts[MAXCELLHOSTS]; + if (afsdb_handler_shutdown) return -2; afsdb_handler_running = 1; - ObtainSharedLock(&afsdb_req.lock, 683); + ObtainSharedLock(&afsdb_req_lock, 683); if (afsdb_req.pending) { int i, hostCount; - UpgradeSToWLock(&afsdb_req.lock, 684); + UpgradeSToWLock(&afsdb_req_lock, 684); hostCount = kernelMsg[0]; - *afsdb_req.timeout = kernelMsg[1]; - if (*afsdb_req.timeout) - *afsdb_req.timeout += osi_Time(); - *afsdb_req.realname = afs_strdup(acellName); + timeout = kernelMsg[1]; + if (timeout) + timeout += osi_Time(); for (i = 0; i < MAXCELLHOSTS; i++) { if (i >= hostCount) - afsdb_req.cellhosts[i] = 0; + cellHosts[i] = 0; else - afsdb_req.cellhosts[i] = kernelMsg[2 + i]; + cellHosts[i] = kernelMsg[2 + i]; } + if (hostCount) + code = afs_NewCell(acellName, cellHosts, CNoSUID, NULL, 0, 0, + timeout); + + if (!hostCount || (code && code != EEXIST)) + /* null out the cellname if the lookup failed */ + afsdb_req.cellname = NULL; + else + /* If we found an alias, create it */ + if (afs_strcasecmp(afsdb_req.cellname, acellName)) + afs_NewCellAlias(afsdb_req.cellname, acellName); + /* Request completed, wake up the relevant thread */ afsdb_req.pending = 0; afsdb_req.complete = 1; afs_osi_Wakeup(&afsdb_req); - ConvertWToSLock(&afsdb_req.lock); + ConvertWToSLock(&afsdb_req_lock); } - ConvertSToRLock(&afsdb_req.lock); + ConvertSToRLock(&afsdb_req_lock); /* Wait for a request */ while (afsdb_req.pending == 0 && afs_termState != AFSOP_STOP_AFSDB) { - ReleaseReadLock(&afsdb_req.lock); + ReleaseReadLock(&afsdb_req_lock); afs_osi_Sleep(&afsdb_req); - ObtainReadLock(&afsdb_req.lock); + ObtainReadLock(&afsdb_req_lock); } /* Check if we're shutting down */ if (afs_termState == AFSOP_STOP_AFSDB) { - ReleaseReadLock(&afsdb_req.lock); + ReleaseReadLock(&afsdb_req_lock); /* Inform anyone waiting for us that we're going away */ afsdb_handler_shutdown = 1; @@ -117,43 +131,38 @@ afs_AFSDBHandler(char *acellName, int acellNameLen, afs_int32 * kernelMsg) /* Return the lookup request to userspace */ strncpy(acellName, afsdb_req.cellname, acellNameLen); - ReleaseReadLock(&afsdb_req.lock); + ReleaseReadLock(&afsdb_req_lock); return 0; } static int -afs_GetCellHostsAFSDB(char *acellName, afs_int32 * acellHosts, int *timeout, - char **realName) +afs_GetCellHostsAFSDB(char *acellName) { AFS_ASSERT_GLOCK(); if (!afsdb_handler_running) return ENOENT; ObtainWriteLock(&afsdb_client_lock, 685); - ObtainWriteLock(&afsdb_req.lock, 686); + ObtainWriteLock(&afsdb_req_lock, 686); - *acellHosts = 0; - afsdb_req.cellname = afs_strdup(acellName); - afsdb_req.cellhosts = acellHosts; - afsdb_req.timeout = timeout; - afsdb_req.realname = realName; + afsdb_req.cellname = acellName; afsdb_req.complete = 0; afsdb_req.pending = 1; afs_osi_Wakeup(&afsdb_req); - ConvertWToRLock(&afsdb_req.lock); + ConvertWToRLock(&afsdb_req_lock); while (afsdb_handler_running && !afsdb_req.complete) { - ReleaseReadLock(&afsdb_req.lock); + ReleaseReadLock(&afsdb_req_lock); afs_osi_Sleep(&afsdb_req); - ObtainReadLock(&afsdb_req.lock); + ObtainReadLock(&afsdb_req_lock); }; afs_osi_FreeStr(afsdb_req.cellname); - ReleaseReadLock(&afsdb_req.lock); + ReleaseReadLock(&afsdb_req_lock); ReleaseWriteLock(&afsdb_client_lock); - if (*acellHosts) + if (afsdb_req.cellname) return 0; else return ENOENT; @@ -164,41 +173,13 @@ void afs_LookupAFSDB(char *acellName) { #ifdef AFS_AFSDB_ENV - afs_int32 *cellHosts; - char **realName=NULL; int code; - int *timeout=NULL; + char *cellName = afs_strdup(acellName); - if(!(cellHosts = afs_osi_Alloc(MAXCELLHOSTS * sizeof(afs_int32)))) - goto done; - - if(!(realName = afs_osi_Alloc(sizeof(char *)))) - goto done; - *realName = NULL; - - if(!(timeout = afs_osi_Alloc(sizeof(int)))) - goto done; - - code = afs_GetCellHostsAFSDB(acellName, cellHosts, timeout, realName); - if (code) - goto done; - code = afs_NewCell(*realName, cellHosts, CNoSUID, NULL, 0, 0, *timeout); - if (code && code != EEXIST) - goto done; - - /* If we found an alias, create it */ - if (afs_strcasecmp(acellName, *realName)) - afs_NewCellAlias(acellName, *realName); - - done: - if(timeout) - afs_osi_Free(timeout, sizeof(int)); - if (realName && *realName) - afs_osi_FreeStr(*realName); - if(realName) - afs_osi_Free(realName, sizeof(char *)); - if(cellHosts) - afs_osi_Free(cellHosts, MAXCELLHOSTS * sizeof(afs_int32)); + code = afs_GetCellHostsAFSDB(cellName); + afs_Trace2(afs_iclSetp, CM_TRACE_AFSDB, ICL_TYPE_STRING, cellName, + ICL_TYPE_INT32, code); + afs_osi_FreeStr(cellName); #endif } @@ -862,7 +843,7 @@ afs_CellInit() RWLOCK_INIT(&afs_xcell, "afs_xcell"); #ifdef AFS_AFSDB_ENV RWLOCK_INIT(&afsdb_client_lock, "afsdb_client_lock"); - RWLOCK_INIT(&afsdb_req.lock, "afsdb_req.lock"); + RWLOCK_INIT(&afsdb_req_lock, "afsdb_req_lock"); #endif QInit(&CellLRU); diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c index 6642587224..d825a58e69 100644 --- a/src/afs/afs_daemons.c +++ b/src/afs/afs_daemons.c @@ -47,7 +47,7 @@ afs_int32 afs_gcpags_procsize = 0; afs_int32 afs_CheckServerDaemonStarted = 0; #ifndef DEFAULT_PROBE_INTERVAL -#define DEFAULT_PROBE_INTERVAL 180 /* default to 3 min */ +#define DEFAULT_PROBE_INTERVAL 30 /* default to 3 min */ #endif afs_int32 afs_probe_interval = DEFAULT_PROBE_INTERVAL; afs_int32 afs_probe_all_interval = 600; @@ -123,12 +123,9 @@ afs_CheckServerDaemon(void) } afs_CheckServerDaemonStarted = 0; } -#define RECURSIVE_VFS_CONTEXT 1 -#if RECURSIVE_VFS_CONTEXT + extern int vfs_context_ref; -#else -#define vfs_context_ref 1 -#endif + void afs_Daemon(void) { @@ -153,10 +150,8 @@ afs_Daemon(void) osi_Panic("vfs context already initialized"); while (afs_osi_ctxtp && vfs_context_ref) afs_osi_Sleep(&afs_osi_ctxtp); -#if RECURSIVE_VFS_CONTEXT if (afs_osi_ctxtp && !vfs_context_ref) vfs_context_rele(afs_osi_ctxtp); -#endif afs_osi_ctxtp = vfs_context_create(NULL); afs_osi_ctxtp_initialized = 1; #endif diff --git a/src/afs/afs_dcache.c b/src/afs/afs_dcache.c index 1e645a1b43..3801328af6 100644 --- a/src/afs/afs_dcache.c +++ b/src/afs/afs_dcache.c @@ -3073,6 +3073,7 @@ afs_WriteDCache(register struct dcache *adc, int atime) if (cacheDiskType == AFS_FCACHE_TYPE_MEM) return 0; AFS_STATCNT(afs_WriteDCache); + osi_Assert(WriteLocked(&afs_xdcache)); if (atime) adc->f.modTime = osi_Time(); /* diff --git a/src/afs/afs_init.c b/src/afs/afs_init.c index 6a26db2b92..4bab6ddb15 100644 --- a/src/afs/afs_init.c +++ b/src/afs/afs_init.c @@ -254,8 +254,12 @@ afs_InitCellInfo(char *afile) ino_t inode; int code; +#ifdef AFS_CACHE_VNODE_PATH + return afs_cellname_init(AFS_CACHE_CELLS_INODE, code); +#else code = LookupInodeByPath(afile, &inode, NULL); return afs_cellname_init(inode, code); +#endif } /* @@ -296,6 +300,8 @@ afs_InitVolumeInfo(char *afile) * it in the cache... */ code = LookupInodeByPath(afile, &volumeInode, &volumeVnode); +#elif defined(AFS_CACHE_VNODE_PATH) + volumeInode = AFS_CACHE_VOLUME_INODE; #else code = LookupInodeByPath(afile, &volumeInode, NULL); #endif @@ -426,11 +432,15 @@ afs_InitCacheInfo(register char *afile) #if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS) || defined(AFS_DARWIN_ENV) afs_InitDualFSCacheOps(filevp); #endif - cacheInode = afs_vnodeToInumber(filevp); - cacheDev.dev = afs_vnodeToDev(filevp); +#ifndef AFS_CACHE_VNODE_PATH #ifndef AFS_DARWIN80_ENV afs_cacheVfsp = filevp->v_vfsp; #endif + cacheInode = afs_vnodeToInumber(filevp); +#else + cacheInode = AFS_CACHE_ITEMS_INODE; +#endif + cacheDev.dev = afs_vnodeToDev(filevp); #endif /* AFS_LINUX20_ENV */ AFS_RELE(filevp); #endif /* AFS_LINUX22_ENV */ diff --git a/src/afs/afs_nfsclnt.c b/src/afs/afs_nfsclnt.c index c8941dd219..a4c898fc29 100644 --- a/src/afs/afs_nfsclnt.c +++ b/src/afs/afs_nfsclnt.c @@ -503,6 +503,8 @@ afs_nfsclient_sysname(register struct nfsclientpag *np, char *inname, /* Don't touch our arguments when called recursively */ *outname = np->sysname; *num = np->sysnamecount; + if (!np->sysname[0]) + return ENODEV; /* XXX */ } return 0; } diff --git a/src/afs/afs_osi_alloc.c b/src/afs/afs_osi_alloc.c index 9df230a801..158bc32c7c 100644 --- a/src/afs/afs_osi_alloc.c +++ b/src/afs/afs_osi_alloc.c @@ -207,7 +207,11 @@ osi_AllocSmallSpace(size_t size) if (!freeSmallList) { afs_stats_cmperf.SmallBlocksAlloced++; afs_stats_cmperf.SmallBlocksActive++; - return afs_osi_Alloc(AFS_SMALLOCSIZ); + tp = afs_osi_Alloc(AFS_SMALLOCSIZ); +#ifdef KERNEL_HAVE_PIN + pin((char *)tp, AFS_SMALLOCSIZ); +#endif + return (char *)tp; } afs_stats_cmperf.SmallBlocksActive++; MObtainWriteLock(&osi_fsplock, 327); diff --git a/src/afs/afs_osi_pag.c b/src/afs/afs_osi_pag.c index 6b06d54063..10dabff058 100644 --- a/src/afs/afs_osi_pag.c +++ b/src/afs/afs_osi_pag.c @@ -556,11 +556,7 @@ PagInCred(const struct AFS_UCRED *cred) g0 = cred->cr_groups[1]; g1 = cred->cr_groups[2]; #else -#if defined(AFS_AIX51_ENV) - if (kcred_getpag(cred, PAG_AFS, &pag) < 0 || pag == 0) - pag = NOPAG; - return pag; -#elif defined(AFS_AIX_ENV) +#if defined(AFS_AIX_ENV) if (cred->cr_ngrps < 2) { return NOPAG; } diff --git a/src/afs/afs_osidnlc.c b/src/afs/afs_osidnlc.c index 218af5e5b9..e01e5a1732 100644 --- a/src/afs/afs_osidnlc.c +++ b/src/afs/afs_osidnlc.c @@ -242,7 +242,12 @@ osi_dnlc_lookup(struct vcache *adp, char *aname, int locktype) ReleaseReadLock(&afs_xvcache); dnlcstats.misses++; } else { - if (tvc->states & CVInit) { + if ((tvc->states & CVInit) +#ifdef AFS_DARWIN80_ENV + ||(tvc->states & CDeadVnode) +#endif + ) + { ReleaseReadLock(&afs_xvcache); dnlcstats.misses++; osi_dnlc_remove(adp, aname, tvc); diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index b5b5323e98..6aadbaf952 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -2762,7 +2762,8 @@ DECL_PIOCTL(PGetVnodeXStatus2) DECL_PIOCTL(PSetSysName) { char *cp, *cp2 = NULL, inname[MAXSYSNAME], outname[MAXSYSNAME]; - int setsysname, foundname = 0; + afs_int32 setsysname; + int foundname = 0; register struct afs_exporter *exporter; register struct unixuser *au; register afs_int32 pag, error; @@ -2779,7 +2780,7 @@ DECL_PIOCTL(PSetSysName) #endif } memset(inname, 0, MAXSYSNAME); - memcpy((char *)&setsysname, ain, sizeof(afs_int32)); + memcpy(&setsysname, ain, sizeof(afs_int32)); ain += sizeof(afs_int32); if (setsysname & 0x8000) { allpags = 1; diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h index 8a71b401d1..2903616852 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -119,7 +119,12 @@ extern void afs_InitCBQueue(int doLockInit); extern void afs_DequeueCallback(struct vcache *avc); /* afs_cell.c */ +extern afs_int32 afs_cellindex; extern afs_rwlock_t afs_xcell; +#ifdef AFS_AFSDB_ENV +extern afs_rwlock_t afsdb_client_lock; +extern afs_rwlock_t afsdb_req_lock; +#endif extern struct afs_q CellLRU; extern void afs_CellInit(void); @@ -301,6 +306,7 @@ extern void init_sys_error_to_et(void); /* afs_exporter.c */ extern struct afs_exporter *root_exported; extern struct afs_exporter *exporter_find(int type); +extern void shutdown_exporter(void); /* afs_icl.c */ extern struct afs_icl_set *afs_icl_allSets; @@ -488,6 +494,7 @@ extern int afs_nfsclient_reqhandler(struct afs_exporter *exporter, struct AFS_UCRED **cred, afs_int32 host, afs_int32 *pagparam, struct afs_exporter **outexporter); +extern void shutdown_nfsclnt(void); /* afs_osi.c */ extern afs_lock_t afs_ftf; @@ -502,6 +509,7 @@ extern void afs_osi_UnmaskRxkSignals(void); extern void afs_osi_RxkRegister(void); extern void afs_osi_Invisible(void); extern void shutdown_osi(void); +extern void shutdown_osinet(void); extern int afs_osi_suser(void *credp); extern void afs_osi_TraverseProcTable(void); #if defined(KERNEL) && !defined(UKERNEL) && defined(AFS_PROC) @@ -525,6 +533,7 @@ extern void osi_FreeLargeSpace(void *adata); extern void osi_FreeSmallSpace(void *adata); extern void *osi_AllocLargeSpace(size_t size); extern void *osi_AllocSmallSpace(size_t size); +extern void shutdown_osinet(void); /* afs_osi_pag.c */ extern int afs_setpag(); diff --git a/src/afs/afs_segments.c b/src/afs/afs_segments.c index d9b6e8dac9..dce5ac8498 100644 --- a/src/afs/afs_segments.c +++ b/src/afs/afs_segments.c @@ -92,6 +92,10 @@ afs_StoreMini(register struct vcache *avc, struct vrequest *areq) afs_int32 l1, l2; l1 = avc->m.Length; l2 = tlen; + if ((avc->m.Length > 0x7fffffff) || + (tlen > 0x7fffffff) || + ((0x7fffffff - tlen) < avc->m.Length)) + return EFBIG; code = StartRXAFS_StoreData(tcall, (struct AFSFid *)&avc->fid.Fid, diff --git a/src/afs/afs_server.c b/src/afs/afs_server.c index 90fbd118e9..520757a4f6 100644 --- a/src/afs/afs_server.c +++ b/src/afs/afs_server.c @@ -1129,6 +1129,7 @@ afsi_SetServerIPRank(struct srvAddr *sa, afs_int32 addr, sa->sa_iprank = afs_min(sa->sa_iprank, MED); } } + return 0; } #else /* AFS_USERSPACE_IP_ADDR */ #if (! defined(AFS_SUN5_ENV)) && !defined(AFS_DARWIN60_ENV) && defined(USEIFADDR) @@ -1273,23 +1274,74 @@ static int afs_SetServerPrefs(struct srvAddr *sa) { #else /* AFS_USERSPACE_IP_ADDR */ #if defined(AFS_SUN5_ENV) #ifdef AFS_SUN510_ENV - ill_walk_context_t ctx; + int i = 0; #else extern struct ill_s *ill_g_headp; long *addr = (long *)ill_g_headp; -#endif ill_t *ill; ipif_t *ipif; +#endif int subnet, subnetmask, net, netmask; if (sa) sa->sa_iprank = 0; #ifdef AFS_SUN510_ENV - for (ill = ILL_START_WALK_ALL(&ctx) ; ill ; ill = ill_next(&ctx, ill)) { + rw_enter(&afsifinfo_lock, RW_READER); + + for (i = 0; (afsifinfo[i].ipaddr != NULL) && (i < ADDRSPERSITE); i++) { + + if (IN_CLASSA(afsifinfo[i].ipaddr)) { + netmask = IN_CLASSA_NET; + } else if (IN_CLASSB(afsifinfo[i].ipaddr)) { + netmask = IN_CLASSB_NET; + } else if (IN_CLASSC(afsifinfo[i].ipaddr)) { + netmask = IN_CLASSC_NET; + } else { + netmask = 0; + } + net = afsifinfo[i].ipaddr & netmask; + +#ifdef notdef + if (!s) { + if (afsifinfo[i].ipaddr != 0x7f000001) { /* ignore loopback */ + *cnt += 1; + if (*cnt > 16) + return; + *addrp++ = afsifinfo[i].ipaddr; + } + } else +#endif /* notdef */ + { + /* XXXXXX Do the individual ip ranking below XXXXX */ + if ((sa->sa_ip & netmask) == net) { + if ((sa->sa_ip & subnetmask) == subnet) { + if (afsifinfo[i].ipaddr == sa->sa_ip) { /* ie, ME! */ + sa->sa_iprank = TOPR; + } else { + sa->sa_iprank = HI + afsifinfo[i].metric; /* case #2 */ + } + } else { + sa->sa_iprank = MED + afsifinfo[i].metric; /* case #3 */ + } + } else { + sa->sa_iprank = LO + afsifinfo[i].metric; /* case #4 */ + } + /* check for case #5 -- point-to-point link */ + if ((afsifinfo[i].flags & IFF_POINTOPOINT) + && (afsifinfo[i].dstaddr == sa->sa_ip)) { + + if (afsifinfo[i].metric >= (MAXDEFRANK - MED) / PPWEIGHT) + sa->sa_iprank = MAXDEFRANK; + else + sa->sa_iprank = MED + (PPWEIGHT << afsifinfo[i].metric); + } + } + } + + rw_exit(&afsifinfo_lock); #else for (ill = (struct ill_s *)*addr /*ill_g_headp */ ; ill; ill = ill->ill_next) { -#endif #ifdef AFS_SUN58_ENV /* Make sure this is an IPv4 ILL */ if (ill->ill_isv6) @@ -1349,6 +1401,7 @@ static int afs_SetServerPrefs(struct srvAddr *sa) { } } } +#endif /* AFS_SUN510_ENV */ #else #ifndef USEIFADDR struct ifnet *ifn = NULL; diff --git a/src/afs/afs_trace.et b/src/afs/afs_trace.et index cf81f078d9..1c26405786 100644 --- a/src/afs/afs_trace.et +++ b/src/afs/afs_trace.et @@ -172,5 +172,6 @@ error_table 2 ZCM ec CM_TRACE_LOCKWAIT,"%s line %d: Waiting for lock 0x%lx level %d" ec CM_TRACE_WRITEFAILED, "osi_Write failed len %ld resid %ld err %ld" ec CM_TRACE_ADJUSTSIZE2, "AdjustSize dc = 0x%lx, chunkBytes = 0x%x used = %ld, diff = %ld" + ec CM_TRACE_AFSDB, "AFSDB lookup %s returned %d" end diff --git a/src/afs/lock.h b/src/afs/lock.h index 852babc38a..0abe76400e 100644 --- a/src/afs/lock.h +++ b/src/afs/lock.h @@ -102,9 +102,15 @@ extern tid_t thread_self(); #define MyPidxx2Pid(x) ((afs_int32)(x)) #else /* AFS_AIX41_ENV */ #if defined(AFS_HPUX101_ENV) +#if defined(AFS_HPUX1111_ENV) +typedef struct kthread * afs_lock_tracker_t; +#define MyPidxx (u.u_kthreadp) +#define MyPidxx2Pid(x) (x ? kt_tid(x) : 0) +#else typedef struct proc * afs_lock_tracker_t; #define MyPidxx (u.u_procp) #define MyPidxx2Pid(x) (x ? (afs_int32)p_pid(x) : 0) +#endif #else #if defined(AFS_SGI64_ENV) #if defined(AFS_SGI65_ENV) diff --git a/src/afs/sysincludes.h b/src/afs/sysincludes.h index 55ca2bb077..09a87e066c 100644 --- a/src/afs/sysincludes.h +++ b/src/afs/sysincludes.h @@ -75,6 +75,9 @@ #if defined(LINUX_KEYRING_SUPPORT) #include #include +#if defined(KEY_TYPE_H_EXISTS) +#include +#endif #ifndef KEY_ALLOC_IN_QUOTA #define KEY_ALLOC_IN_QUOTA 1 #endif diff --git a/src/afsd/afsd.c b/src/afsd/afsd.c index 40a50bae2e..0b08fdc1e8 100644 --- a/src/afsd/afsd.c +++ b/src/afsd/afsd.c @@ -334,8 +334,10 @@ int *dir_for_V = NULL; /* Array: dir of each cache file. * -2: file exists in top-level * >=0: file exists in Dxxx */ +#ifndef AFS_CACHE_VNODE_PATH AFSD_INO_T *inode_for_V; /* Array of inodes for desired * cache files */ +#endif int missing_DCacheFile = 1; /*Is the DCACHEFILE missing? */ int missing_VolInfoFile = 1; /*Is the VOLINFOFILE missing? */ int missing_CellInfoFile = 1; /*Is the CELLINFOFILE missing? */ @@ -428,7 +430,7 @@ afsd_event_cleanup(int signo) { CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); CFRelease (source); - IODeregisterForSystemPower(iterator); + IODeregisterForSystemPower(&iterator); IOServiceClose(root_port); IONotificationPortDestroy(notify); @@ -1007,7 +1009,9 @@ doSweepAFSCache(vFilesFound, directory, dirNum, maxDir) * file's inode, directory, and bump the number of files found * total and in this directory. */ +#ifndef AFS_CACHE_VNODE_PATH inode_for_V[vFileNum] = currp->d_ino; +#endif dir_for_V[vFileNum] = dirNum; /* remember this directory */ if (!maxDir) { @@ -1144,7 +1148,9 @@ doSweepAFSCache(vFilesFound, directory, dirNum, maxDir) vFileNum); else { struct stat statb; +#ifndef AFS_CACHE_VNODE_PATH assert(inode_for_V[vFileNum] == (AFSD_INO_T) 0); +#endif sprintf(vFilePtr, "D%d/V%d", thisDir, vFileNum); if (afsd_verbose) printf("%s: Creating '%s'\n", rn, fullpn_VFile); @@ -1155,7 +1161,9 @@ doSweepAFSCache(vFilesFound, directory, dirNum, maxDir) if (CreateCacheFile(fullpn_VFile, &statb)) printf("%s: Can't create '%s'\n", rn, fullpn_VFile); else { +#ifndef AFS_CACHE_VNODE_PATH inode_for_V[vFileNum] = statb.st_ino; +#endif dir_for_V[vFileNum] = thisDir; cache_dir_list[thisDir]++; (*vFilesFound)++; @@ -1383,8 +1391,8 @@ SweepAFSCache(vFilesFound) return doSweepAFSCache(vFilesFound, cacheBaseDir, -2, maxDir); } -static -ConfigCell(struct afsconf_cell *aci, char *arock, struct afsconf_dir *adir) +static int +ConfigCell(struct afsconf_cell *aci, void *arock, struct afsconf_dir *adir) { int isHomeCell; int i, code; @@ -1416,7 +1424,7 @@ ConfigCell(struct afsconf_cell *aci, char *arock, struct afsconf_dir *adir) static ConfigCellAlias(struct afsconf_cellalias *aca, - char *arock, struct afsconf_dir *adir) + void *arock, struct afsconf_dir *adir) { /* push the alias into the kernel */ call_syscall(AFSOP_ADDCELLALIAS, aca->aliasName, aca->realName); @@ -1509,7 +1517,7 @@ AfsdbLookupHandler() #endif #endif -mainproc(struct cmd_syndesc *as, char *arock) +mainproc(struct cmd_syndesc *as, void *arock) { static char rn[] = "afsd"; /*Name of this routine */ afs_int32 code; /*Result of fork() */ @@ -1923,6 +1931,7 @@ mainproc(struct cmd_syndesc *as, char *arock) cacheStatEntries); } +#ifndef AFS_CACHE_VNODE_PATH /* * Create and zero the inode table for the desired cache files. */ @@ -1937,6 +1946,7 @@ mainproc(struct cmd_syndesc *as, char *arock) if (afsd_debug) printf("%s: %d inode_for_V entries at 0x%x, %d bytes\n", rn, cacheFiles, inode_for_V, (cacheFiles * sizeof(AFSD_INO_T))); +#endif /* * Set up all the pathnames we'll need for later. @@ -2125,6 +2135,23 @@ mainproc(struct cmd_syndesc *as, char *arock) rn, vFilesFound, cacheFiles, cacheIteration); } while ((vFilesFound < cacheFiles) && (cacheIteration < MAX_CACHE_LOOPS)); +#ifdef AFS_CACHE_VNODE_PATH + if (afsd_debug) + printf + ("%s: Calling AFSOP_CACHEBASEDIR with '%s'\n", + rn, cacheBaseDir); + call_syscall(AFSOP_CACHEBASEDIR, cacheBaseDir); + if (afsd_debug) + printf + ("%s: Calling AFSOP_CACHEDIRS with %d dirs\n", + rn, nFilesPerDir); + call_syscall(AFSOP_CACHEDIRS, nFilesPerDir); + if (afsd_debug) + printf + ("%s: Calling AFSOP_CACHEFILES with %d files\n", + rn, cacheFiles); + call_syscall(AFSOP_CACHEFILES, cacheFiles); +#endif } else if (afsd_verbose) printf("%s: Using memory cache, not swept\n", rn); @@ -2259,6 +2286,7 @@ mainproc(struct cmd_syndesc *as, char *arock) if (!(cacheFlags & AFSCALL_INIT_MEMCACHE)) call_syscall(AFSOP_VOLUMEINFO, fullpn_VolInfoFile); +#ifndef AFS_CACHE_VNODE_PATH /* * Give the kernel the names of the AFS files cached on the workstation's * disk. @@ -2277,7 +2305,7 @@ mainproc(struct cmd_syndesc *as, char *arock) call_syscall(AFSOP_CACHEINODE, inode_for_V[currVFile]); #endif } - +#endif /*end for */ /* diff --git a/src/afsd/vsys.c b/src/afsd/vsys.c index 424eb1b3c2..a36b5cdd03 100644 --- a/src/afsd/vsys.c +++ b/src/afsd/vsys.c @@ -12,13 +12,7 @@ #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/afsmonitor/afsmon-output.c b/src/afsmonitor/afsmon-output.c index 5ab39e4e09..8f2f2f89d7 100644 --- a/src/afsmonitor/afsmon-output.c +++ b/src/afsmonitor/afsmon-output.c @@ -19,14 +19,7 @@ #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif RCSID ("$Header$"); diff --git a/src/afsmonitor/afsmon-win.c b/src/afsmonitor/afsmon-win.c index e54d17f5cc..7cbaf03ea8 100644 --- a/src/afsmonitor/afsmon-win.c +++ b/src/afsmonitor/afsmon-win.c @@ -22,9 +22,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#endif #undef IN #include @@ -567,6 +565,7 @@ afsmonExit_gtx() } afsmon_Exit(0); + return 0; /* not reached */ } diff --git a/src/afsmonitor/afsmonitor.c b/src/afsmonitor/afsmonitor.c index 002905e4aa..345004c666 100644 --- a/src/afsmonitor/afsmonitor.c +++ b/src/afsmonitor/afsmonitor.c @@ -3880,8 +3880,7 @@ afsmon_execute() *----------------------------------------------------------------------*/ int -afsmonInit(as) - struct cmd_syndesc *as; +afsmonInit(struct cmd_syndesc *as, void *arock) { /* afsmonInit() */ static char rn[] = "afsmonInit"; /* Routine name */ @@ -4185,7 +4184,7 @@ main(argc, argv) /* * Set up the commands we understand. */ - ts = cmd_CreateSyntax("initcmd", afsmonInit, 0, "initialize the program"); + ts = cmd_CreateSyntax("initcmd", afsmonInit, NULL, "initialize the program"); cmd_AddParm(ts, "-config", CMD_SINGLE, CMD_OPTIONAL, "configuration file"); cmd_AddParm(ts, "-frequency", CMD_SINGLE, CMD_OPTIONAL, diff --git a/src/afsweb/weblog.c b/src/afsweb/weblog.c index ec33b53993..43259b366a 100644 --- a/src/afsweb/weblog.c +++ b/src/afsweb/weblog.c @@ -112,7 +112,7 @@ main(int argc, char **argv) zero_argc = argc; zero_argv = argv; - ts = cmd_CreateSyntax(NULL, CommandProc, 0, + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "obtain Kerberos authentication for web servers"); /* define the command line arguments */ @@ -792,10 +792,8 @@ getDFScreds(char *name, char *realm, char *passwd, afs_uint32 lifetime, * arrive through a pipe from the httpds, authenticates the user and * returns a token (or a failure message) over the pipe */ -CommandProc(as, arock) - char *arock; - struct cmd_syndesc *as; - +static int +CommandProc(struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN]; char cell[MAXKTCREALMLEN]; diff --git a/src/aklog/Makefile.in b/src/aklog/Makefile.in index 0b24e01cee..f2d90da42c 100644 --- a/src/aklog/Makefile.in +++ b/src/aklog/Makefile.in @@ -31,11 +31,6 @@ asetkey: asetkey.o ${AFSLIBS} ${CC} -o $@ ${CFLAGS} asetkey.o ${LIBS} ${AFSLIBS} \ ${KRB5LIBS} $(LIBCOM_ERR) ${XLIBS} -klog: klog.o skipwrap.o ${AFSLIBS} - ${CC} -o $@ ${CFLAGS} klog.o skipwrap.o ${LIBS} ${AFSLIBS} \ - ${TOP_LIBDIR}/libcmd.a \ - ${KRB5LIBS} $(LIBCOM_ERR) ${XLIBS} - verifykt: verifykt.o skipwrap.o ${AFSLIBS} ${CC} -o $@ ${CFLAGS} verifykt.o skipwrap.o ${LIBS} ${AFSLIBS} \ ${TOP_LIBDIR}/libcmd.a \ @@ -44,6 +39,11 @@ verifykt: verifykt.o skipwrap.o ${AFSLIBS} afserror.o: $(COMERR)/afserror.c $(CC) $(CFLAGS) -c $(COMERR)/afserror.c +klog: klog.o skipwrap.o ${AFSLIBS} + ${CC} -o $@ ${CFLAGS} klog.o skipwrap.o ${AKLIBS} ${AFSLIBS} \ + ${TOP_LIBDIR}/libcmd.a \ + ${KRB5LIBS} $(LIBCOM_ERR) ${XLIBS} + # # Installation targets # diff --git a/src/aklog/aklog_main.c b/src/aklog/aklog_main.c index 19ba489ec8..37f2763cc7 100644 --- a/src/aklog/aklog_main.c +++ b/src/aklog/aklog_main.c @@ -203,7 +203,7 @@ static int get_user_realm(krb5_context, char *); #error "Must have either krb5_princ_size or krb5_principal_get_comp_string" #endif -#if !defined(HAVE_KRB5_ENCRYPT_TKT_PART) && defined(HAVE_ENCODE_KRB5_ENC_TKT_PART) +#if !defined(HAVE_KRB5_ENCRYPT_TKT_PART) && defined(HAVE_ENCODE_KRB5_ENC_TKT_PART) && defined(HAVE_KRB5_C_ENCRYPT) krb5_error_code krb5_encrypt_tkt_part(krb5_context context, const krb5_keyblock *key, @@ -725,7 +725,7 @@ static int auth_to_cell(krb5_context context, char *cell, char *realm) } fprintf(stderr, "%s: Couldn't get %s AFS tickets:\n", progname, cell_to_use); - com_err(progname, status, "while getting AFS tickets"); + afs_com_err(progname, status, "while getting AFS tickets"); return(AKLOG_KERBEROS); } @@ -802,7 +802,7 @@ static int auth_to_cell(krb5_context context, char *cell, char *realm) status = krb5_524_convert_creds(context, v5cred, &cred); if (status) { - com_err(progname, status, "while converting tickets " + afs_com_err(progname, status, "while converting tickets " "to Kerberos V4 format"); return(AKLOG_KERBEROS); } @@ -859,7 +859,7 @@ static int auth_to_cell(krb5_context context, char *cell, char *realm) if ((status = get_user_realm(context, realm_of_user))) { fprintf(stderr, "%s: Couldn't determine realm of user:)", progname); - com_err(progname, status, " while getting realm"); + afs_com_err(progname, status, " while getting realm"); return(AKLOG_KERBEROS); } if (strcmp(realm_of_user, realm_of_cell)) { @@ -977,11 +977,14 @@ static int auth_to_cell(krb5_context context, char *cell, char *realm) printf("Setting tokens. %s / %s @ %s \n", aclient.name, aclient.instance, aclient.cell ); } +#ifndef AFS_AIX51_ENV /* on AIX 4.1.4 with AFS 3.4a+ if a write is not done before * this routine, it will not add the token. It is not clear what - * is going on here! So we will do the following operation + * is going on here! So we will do the following operation. + * On AIX 5, it causes the parent program to die, so we won't. */ write(2,"",0); /* dummy write */ +#endif #ifndef WINDOWS #ifdef AFS_RXK5 if (service == k5service) { @@ -1769,7 +1772,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, int *paddress, krb5_creds** out_creds /* out */ ) { -#if defined(USING_HEIMDAL) || (defined(HAVE_ENCODE_KRB5_ENC_TKT) && defined(HAVE_ENCODE_KRB5_TICKET)) +#if defined(USING_HEIMDAL) || (defined(HAVE_ENCODE_KRB5_ENC_TKT) && defined(HAVE_ENCODE_KRB5_TICKET) && defined(HAVE_KRB5_C_ENCRYPT)) krb5_error_code code; krb5_keytab kt = 0; krb5_kt_cursor cursor[1]; @@ -1813,9 +1816,9 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, code = krb5_kt_resolve(context, keytab, &kt); if (code) { if (keytab) - com_err(progname, code, "while resolving keytab %s", keytab); + afs_com_err(progname, code, "while resolving keytab %s", keytab); else - com_err(progname, code, "while resolving default keytab"); + afs_com_err(progname, code, "while resolving default keytab"); goto cleanup; } @@ -1834,7 +1837,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, } } if (code) { - com_err(progname, code,"while scanning keytab entries"); + afs_com_err(progname, code,"while scanning keytab entries"); goto cleanup; } } else { @@ -1842,7 +1845,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, int best = -1; memset(new, 0, sizeof *new); if ((code == krb5_kt_start_seq_get(context, kt, cursor))) { - com_err(progname, code, "while starting keytab scan"); + afs_com_err(progname, code, "while starting keytab scan"); goto cleanup; } while (!(code = krb5_kt_next_entry(context, kt, new, cursor))) { @@ -1858,12 +1861,12 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, } else krb5_free_keytab_entry_contents(context, new); } if ((i = krb5_kt_end_seq_get(context, kt, cursor))) { - com_err(progname, i, "while ending keytab scan"); + afs_com_err(progname, i, "while ending keytab scan"); code = i; goto cleanup; } if (best < 0) { - com_err(progname, code, "while scanning keytab"); + afs_com_err(progname, code, "while scanning keytab"); goto cleanup; } deref_keyblock_enctype(session_key) = deref_entry_enctype(entry); @@ -1874,7 +1877,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, #if USING_HEIMDAL if ((code = krb5_generate_random_keyblock(context, deref_keyblock_enctype(session_key), session_key))) { - com_err(progname, code, "while making session key"); + afs_com_err(progname, code, "while making session key"); goto cleanup; } enc_tkt_reply->flags.initial = 1; @@ -1897,7 +1900,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, #else if ((code = krb5_c_make_random_key(context, deref_keyblock_enctype(session_key), session_key))) { - com_err(progname, code, "while making session key"); + afs_com_err(progname, code, "while making session key"); goto cleanup; } enc_tkt_reply->magic = KV5M_ENC_TKT_PART; @@ -1960,12 +1963,12 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, ASN1_MALLOC_ENCODE(EncTicketPart, buf, buf_size, enc_tkt_reply, &buf_len, code); if(code) { - com_err(progname, code, "while encoding ticket"); + afs_com_err(progname, code, "while encoding ticket"); goto cleanup; } if(buf_len != buf_size) { - com_err(progname, code, + afs_com_err(progname, code, "%d != %d while encoding ticket (internal ASN.1 encoder error", buf_len, buf_size); goto cleanup; @@ -1983,7 +1986,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, if (buf) free(buf); if (crypto) krb5_crypto_destroy(context, crypto); if(code) { - com_err(progname, code, "while %s", what); + afs_com_err(progname, code, "while %s", what); goto cleanup; } } /* crypto block */ @@ -1995,7 +1998,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, ticket_reply->server = service_principal; ticket_reply->enc_part2 = enc_tkt_reply; if ((code = krb5_encrypt_tkt_part(context, &deref_entry_keyblock(entry), ticket_reply))) { - com_err(progname, code, "while making ticket"); + afs_com_err(progname, code, "while making ticket"); goto cleanup; } ticket_reply->enc_part.kvno = entry->vno; @@ -2005,17 +2008,17 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, if ((code = krb5_copy_principal(context, service_principal, &creds->server))) { - com_err(progname, code, "while copying service principal"); + afs_com_err(progname, code, "while copying service principal"); goto cleanup; } if ((code = krb5_copy_principal(context, client_principal, &creds->client))) { - com_err(progname, code, "while copying client principal"); + afs_com_err(progname, code, "while copying client principal"); goto cleanup; } if ((code = krb5_copy_keyblock_contents(context, session_key, &deref_session_key(creds)))) { - com_err(progname, code, "while copying session key"); + afs_com_err(progname, code, "while copying session key"); goto cleanup; } @@ -2033,7 +2036,7 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, ; else if ((code = krb5_copy_addresses(context, deref_enc_tkt_addrs(enc_tkt_reply), &creds->addresses))) { - com_err(progname, code, "while copying addresses"); + afs_com_err(progname, code, "while copying addresses"); goto cleanup; } @@ -2043,13 +2046,13 @@ static krb5_error_code get_credv5_akimpersonate(krb5_context context, ASN1_MALLOC_ENCODE(Ticket, creds->ticket.data, creds->ticket.length, ticket_reply, &creds_tkt_len, code); if(code) { - com_err(progname, code, "while encoding ticket"); + afs_com_err(progname, code, "while encoding ticket"); goto cleanup; } } #else if ((code = encode_krb5_ticket(ticket_reply, &temp))) { - com_err(progname, code, "while encoding ticket"); + afs_com_err(progname, code, "while encoding ticket"); goto cleanup; } creds->ticket = *temp; diff --git a/src/aklog/asetkey.c b/src/aklog/asetkey.c index 459348bd9c..000e89306b 100644 --- a/src/aklog/asetkey.c +++ b/src/aklog/asetkey.c @@ -14,19 +14,11 @@ #ifdef HAVE_UNISTD_H #include #endif -#ifdef HAVE_STDLIB_H #include -#endif #ifdef HAVE_MEMORY_H #include #endif /* HAVE_MEMORY_H */ -#ifdef HAVE_STRING_H #include -#else /* HAVE_STRING_H */ -#ifdef HAVE_STRINGS_H -#include -#endif /* HAVE_STRINGS_H */ -#endif /* HAVE_STRING_H */ #include #ifdef USING_K5SSL diff --git a/src/auth/authcon.c b/src/auth/authcon.c index 4eac9f74f5..f781a0c4c1 100644 --- a/src/auth/authcon.c +++ b/src/auth/authcon.c @@ -32,6 +32,7 @@ RCSID #include "afs/stds.h" #include "afs/pthread_glock.h" #include "des/des.h" +#include "des/des_prototypes.h" #include "rx/rxkad.h" #include "rx/rx.h" #include "afs/keys.h" @@ -50,8 +51,11 @@ RCSID #include #endif #if defined(AFS_RXK5) && !defined(AFS_NT40_ENV) +#include +#include #include #endif +#include #include #include #include "cellconfig.h" @@ -66,9 +70,7 @@ RCSID /* return a null security object if nothing else can be done */ static afs_int32 -QuickAuth(astr, aindex) - struct rx_securityClass **astr; - afs_int32 *aindex; +QuickAuth(struct rx_securityClass **astr, afs_int32 *aindex) { register struct rx_securityClass *tc; tc = rxnull_NewClientSecurityObject(); @@ -118,11 +120,10 @@ afsconf_ServerAuth(void *parm1, #endif /* !defined(UKERNEL) */ static afs_int32 -GenericAuth(adir, astr, aindex, flags) - struct afsconf_dir *adir; - struct rx_securityClass **astr; - afs_int32 *aindex; - afs_int32 flags; +GenericAuth(struct afsconf_dir *adir, + struct rx_securityClass **astr, + afs_int32 *aindex, + afs_int32 flags) { char tbuffer[256]; struct ktc_encryptionKey key, session; @@ -227,10 +228,9 @@ afsconf_ClientAuth(struct afsconf_dir * adir, struct rx_securityClass ** astr, * tells rxkad to encrypt the data, too. */ afs_int32 -afsconf_ClientAuthSecure(adir, astr, aindex) - struct afsconf_dir *adir; - struct rx_securityClass **astr; - afs_int32 *aindex; +afsconf_ClientAuthSecure(struct afsconf_dir *adir, + struct rx_securityClass **astr, + afs_int32 *aindex) { afs_int32 rc; diff --git a/src/auth/cellconfig.c b/src/auth/cellconfig.c index 28f318887c..6d66766720 100644 --- a/src/auth/cellconfig.c +++ b/src/auth/cellconfig.c @@ -18,6 +18,7 @@ RCSID #ifdef UKERNEL #include "afs/sysincludes.h" #include "afsincludes.h" +#include "des/des.h" #include "rx/rxkad.h" #else /* UKERNEL */ #include @@ -48,16 +49,12 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif +#include +#include #endif /* UKERNEL */ #include #include @@ -312,7 +309,10 @@ IsClientConfigDirectory(const char *path) static int afsconf_Check(register struct afsconf_dir *adir) { - char tbuffer[256], *p; + char tbuffer[256]; +#ifdef AFS_NT40_ENV + char *p; +#endif struct stat tstat; register afs_int32 code; @@ -358,9 +358,11 @@ afsconf_Check(register struct afsconf_dir *adir) static int afsconf_Touch(register struct afsconf_dir *adir) { - char tbuffer[256], *p; + char tbuffer[256]; #ifndef AFS_NT40_ENV struct timeval tvp[2]; +#else + char *p; #endif adir->timeRead = 0; /* just in case */ @@ -782,8 +784,8 @@ ParseCellLine(register char *aline, register char *aname, /* call aproc(entry, arock, adir) for all cells. Proc must return 0, or we'll stop early and return the code it returns */ int afsconf_CellApply(struct afsconf_dir *adir, - int (*aproc) (struct afsconf_cell * cell, char *arock, - struct afsconf_dir * dir), char *arock) + int (*aproc) (struct afsconf_cell * cell, void *arock, + struct afsconf_dir * dir), void *arock) { register struct afsconf_entry *tde; register afs_int32 code; @@ -805,8 +807,8 @@ afsconf_CellApply(struct afsconf_dir *adir, int afsconf_CellAliasApply(struct afsconf_dir *adir, int (*aproc) (struct afsconf_cellalias * alias, - char *arock, struct afsconf_dir * dir), - char *arock) + void *arock, struct afsconf_dir * dir), + void *arock) { register struct afsconf_aliasentry *tde; register afs_int32 code; @@ -1283,9 +1285,8 @@ afsconf_GetKeys(struct afsconf_dir *adir, struct afsconf_keys *astr) /* get latest key */ afs_int32 -afsconf_GetLatestKey(struct afsconf_dir * adir, - afs_int32 * avno, - struct ktc_encryptionKey *akey) +afsconf_GetLatestKey(struct afsconf_dir * adir, afs_int32 * avno, + struct ktc_encryptionKey *akey) { register int i; int maxa; @@ -1346,10 +1347,10 @@ have_afs_keyfile(struct afsconf_dir *adir) int afsconf_GetKey(void *rock, afs_int32 avno, struct ktc_encryptionKey *akey) { + struct afsconf_dir *adir = (struct afsconf_dir *) rock; register int i, maxa; register struct afsconf_key *tk; register afs_int32 code; - struct afsconf_dir *adir = rock; LOCK_GLOBAL_MUTEX; code = afsconf_Check(adir); diff --git a/src/auth/cellconfig.p.h b/src/auth/cellconfig.p.h index 13d331c74c..c3bb24a243 100644 --- a/src/auth/cellconfig.p.h +++ b/src/auth/cellconfig.p.h @@ -109,14 +109,14 @@ struct afsconf_servPair { extern struct afsconf_dir *afsconf_Open(register const char *adir); extern int afsconf_CellApply(struct afsconf_dir *adir, int (*aproc) (struct afsconf_cell * cell, - char *arock, + void *arock, struct afsconf_dir * dir), - char *arock); + void *arock); extern int afsconf_CellAliasApply(struct afsconf_dir *adir, int (*aproc) (struct afsconf_cellalias * - alias, char *arock, + alias, void *arock, struct afsconf_dir * dir), - char *arock); + void *arock); extern int afsconf_GetExtendedCellInfo(struct afsconf_dir *adir, char *acellName, char *aservice, struct afsconf_cell *acellInfo, @@ -135,8 +135,9 @@ extern int afsconf_GetKeys(struct afsconf_dir *adir, struct afsconf_keys *astr); struct ktc_encryptionKey; extern afs_int32 afsconf_GetLatestKey(struct afsconf_dir *adir, - afs_int32 * avno, struct ktc_encryptionKey *akey); -extern int afsconf_GetKey(void *adir, afs_int32 avno, + afs_int32 * avno, + struct ktc_encryptionKey *akey); +extern int afsconf_GetKey(void *rock, afs_int32 avno, struct ktc_encryptionKey *akey); extern int afsconf_AddKey(struct afsconf_dir *adir, afs_int32 akvno, char akey[8], afs_int32 overwrite); diff --git a/src/auth/copyauth.c b/src/auth/copyauth.c index 96a5e59c37..2ced48a466 100644 --- a/src/auth/copyauth.c +++ b/src/auth/copyauth.c @@ -13,14 +13,7 @@ RCSID ("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include "auth.h" #ifdef AFS_NT40_ENV @@ -35,9 +28,8 @@ RCSID char whoami[256]; -main(argc, argv) - int argc; - char **argv; +int +main(int argc, char **argv) { char localName[64]; register afs_int32 code; diff --git a/src/auth/ktc.c b/src/auth/ktc.c index 456bb7e25d..4cba8dfd62 100644 --- a/src/auth/ktc.c +++ b/src/auth/ktc.c @@ -49,6 +49,7 @@ RCSID #include #endif #include +#include #include #include #include @@ -58,13 +59,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #ifdef AFS_AIX_ENV #include @@ -136,10 +131,16 @@ static struct flock fileUlock = { F_UNLCK, 0, 0, 0, 0 }; /* the following routines aren't static anymore on behalf of the kerberos IV * compatibility library built in subtree krb. */ -int afs_tf_init(), afs_tf_get_pname(), afs_tf_get_pinst(), afs_tf_get_cred(); -int afs_tf_save_cred(), afs_tf_close(), afs_tf_create(); -int afs_tf_dest_tkt(); -static void ktc_LocalCell(); +int afs_tf_init(char *, int); +int afs_tf_get_pname(char *); +int afs_tf_get_pinst(char *); +int afs_tf_get_cred(struct ktc_principal *, struct ktc_token *); +int afs_tf_save_cred(struct ktc_principal *, struct ktc_token *, + struct ktc_principal *); +int afs_tf_close(void); +int afs_tf_create(char *, char *); +int afs_tf_dest_tkt(void); +static void ktc_LocalCell(void); #endif /* AFS_KERBEROS_ENV */ #ifdef AFS_DUX40_ENV @@ -258,12 +259,11 @@ static struct { /* new interface routines to the ticket cache. Only handle afs service right * now. */ -/* static */ int -NewSetToken(aserver, atoken, aclient, flags) - struct ktc_principal *aserver; - struct ktc_principal *aclient; - struct ktc_token *atoken; - afs_int32 flags; +static int +NewSetToken(struct ktc_principal *aserver, + struct ktc_token *atoken, + struct ktc_principal *aclient, + afs_int32 flags) { TRY_KERNEL(KTC_SETTOKEN_OP, aserver, aclient, atoken, sizeof(struct ktc_token)); @@ -274,11 +274,9 @@ NewSetToken(aserver, atoken, aclient, flags) #define MAXPIOCTLTOKENLEN \ (3*sizeof(afs_int32)+MAXKTCTICKETLEN+sizeof(struct ClearToken)+MAXKTCREALMLEN) -/* static */ int -OldSetToken(aserver, atoken, aclient, flags) - struct ktc_principal *aserver, *aclient; - struct ktc_token *atoken; - afs_int32 flags; +static int +OldSetToken(struct ktc_principal *aserver, struct ktc_token *atoken, + struct ktc_principal *aclient, afs_int32 flags) { struct ViceIoctl iob; char tbuffer[MAXPIOCTLTOKENLEN]; @@ -779,10 +777,9 @@ Done: /* get token, given server we need and token buffer. aclient will eventually * be set to our identity to the server. */ -ktc_GetToken(aserver, atoken, atokenLen, aclient) - struct ktc_principal *aserver, *aclient; - int atokenLen; - struct ktc_token *atoken; +int +ktc_GetToken(struct ktc_principal *aserver, struct ktc_token *atoken, + int atokenLen, struct ktc_principal *aclient) { struct ViceIoctl iob; char tbuffer[MAXPIOCTLTOKENLEN]; @@ -794,7 +791,9 @@ ktc_GetToken(aserver, atoken, atokenLen, aclient) afs_int32 temp; int maxLen; /* biggest ticket we can copy */ int tktLen; /* server ticket length */ +#ifdef AFS_KERBEROS_ENV char found = 0; +#endif LOCK_GLOBAL_MUTEX; #ifndef NO_AFS_CLIENT @@ -832,8 +831,8 @@ ktc_GetToken(aserver, atoken, atokenLen, aclient) found = 1; } else { char tmpstring[MAXHOSTCHARS]; - afs_tf_get_pname(&tmpstring); - afs_tf_get_pinst(&tmpstring); + afs_tf_get_pname(tmpstring); + afs_tf_get_pinst(tmpstring); found = 1; } } @@ -963,8 +962,8 @@ ktc_GetToken(aserver, atoken, atokenLen, aclient) * NOT IMPLEMENTED YET! */ #ifndef NO_AFS_CLIENT -ktc_ForgetToken(aserver) - struct ktc_principal *aserver; +int +ktc_ForgetToken(struct ktc_principal *aserver) { int rc; @@ -1193,7 +1192,8 @@ ktc_ForgetAllTokens(void) /* ktc_OldPioctl - returns a boolean true if the kernel supports only the old * pioctl interface for delivering AFS tickets to the cache manager. */ -ktc_OldPioctl() +int +ktc_OldPioctl(void) { int rc; LOCK_GLOBAL_MUTEX; @@ -1243,12 +1243,13 @@ ktc_OldPioctl() * c. In tf_close, be sure it gets reinitialized to a negative * number. */ -static fd = -1; -static curpos; /* Position in tfbfr */ -static lastpos; /* End of tfbfr */ +static int fd = -1; +static int curpos; /* Position in tfbfr */ +static int lastpos; /* End of tfbfr */ static char tfbfr[BUFSIZ]; /* Buffer for ticket data */ -static tf_gets(), tf_read(); +static int tf_gets(char *, int); +static int tf_read(char *, int); /* * This file contains routines for manipulating the ticket cache file. @@ -1313,8 +1314,8 @@ static tf_gets(), tf_read(); * TKT_FIL_LCK - couldn't lock the file, even after a retry */ -afs_tf_init(tf_name, rw) - char *tf_name; +int +afs_tf_init(char *tf_name, int rw) { int wflag; int me; @@ -1407,8 +1408,8 @@ afs_tf_init(tf_name, rw) * was longer than MAXKTCNAMELEN, TKT_FIL_FMT is returned. */ -afs_tf_get_pname(p) - char *p; +int +afs_tf_get_pname(char *p) { if (fd < 0) { return TKT_FIL_INI; @@ -1428,8 +1429,8 @@ afs_tf_get_pname(p) * instance may be null. */ -afs_tf_get_pinst(inst) - char *inst; +int +afs_tf_get_pinst(char *inst) { if (fd < 0) { return TKT_FIL_INI; @@ -1450,9 +1451,8 @@ afs_tf_get_pinst(inst) * EOF - end of file encountered */ -afs_tf_get_cred(principal, token) - struct ktc_principal *principal; - struct ktc_token *token; +int +afs_tf_get_cred(struct ktc_principal *principal, struct ktc_token *token) { int k_errno; int kvno, lifetime; @@ -1510,7 +1510,8 @@ afs_tf_get_cred(principal, token) * The return value is not defined. */ -afs_tf_close() +int +afs_tf_close(void) { if (!(fd < 0)) { #if defined(AFS_AIX_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_SUN5_ENV) @@ -1522,6 +1523,7 @@ afs_tf_close() fd = -1; /* see declaration of fd above */ } memset(tfbfr, 0, sizeof(tfbfr)); + return 0; } /* @@ -1542,11 +1544,10 @@ afs_tf_close() * file is seriously ill. */ -static -tf_gets(s, n) - register char *s; +static int +tf_gets(register char *s, int n) { - register count; + register int count; if (fd < 0) { return TKT_FIL_INI; @@ -1578,12 +1579,10 @@ tf_gets(s, n) * 0 on end of file or read error */ -static -tf_read(s, n) - register char *s; - register n; +static int +tf_read(register char *s, register int n) { - register count; + register int count; for (count = n; count > 0; --count) { if (curpos >= sizeof(tfbfr)) { @@ -1598,8 +1597,6 @@ tf_read(s, n) return n; } -char *tkt_string(); - /* * afs_tf_save_cred() appends an incoming ticket to the end of the ticket * file. You must call afs_tf_init() before calling afs_tf_save_cred(). @@ -1611,10 +1608,10 @@ char *tkt_string(); * called previously, and KFAILURE for anything else that went wrong. */ -afs_tf_save_cred(aserver, atoken, aclient) - struct ktc_principal *aserver; - struct ktc_principal *aclient; - struct ktc_token *atoken; /* Token */ +int +afs_tf_save_cred(struct ktc_principal *aserver, + struct ktc_token *atoken, + struct ktc_principal *aclient) { char realm[MAXKTCREALMLEN + 1]; char junk[MAXKTCNAMELEN]; @@ -1713,8 +1710,6 @@ afs_tf_save_cred(aserver, atoken, aclient) * . */ -char *getenv(); - /* * This routine is used to generate the name of the file that holds * the user's cache of server tickets and associated session keys. @@ -1744,7 +1739,7 @@ ktc_tkt_string_uid(afs_uint32 uid) LOCK_GLOBAL_MUTEX; if (!*krb_ticket_string) { - if (env = getenv("KRBTKFILE")) { + if ((env = getenv("KRBTKFILE"))) { (void)strncpy(krb_ticket_string, env, sizeof(krb_ticket_string) - 1); krb_ticket_string[sizeof(krb_ticket_string) - 1] = '\0'; @@ -1787,9 +1782,8 @@ ktc_set_tkt_string(char * val) * success, or KFAILURE if something goes wrong. */ -afs_tf_create(pname, pinst) - char *pname; - char *pinst; +int +afs_tf_create(char *pname, char *pinst) { int tktfile; int me, metoo; @@ -1866,7 +1860,8 @@ afs_tf_create(pname, pinst) * failure. */ -afs_tf_dest_tkt() +int +afs_tf_dest_tkt(void) { char *file = ktc_tkt_string(); int i, fd; @@ -1906,15 +1901,8 @@ afs_tf_dest_tkt() } static afs_uint32 -curpag() +curpag(void) { -#if defined(AFS_AIX51_ENV) - afs_int32 pag; - - if (kcred_getpag(cred, PAG_AFS, &pag) < 0 || pag == 0) - pag = NOPAG; - return pag; -#else gid_t groups[NGROUPS_MAX]; afs_uint32 g0, g1; afs_uint32 h, l, ret; @@ -1938,11 +1926,10 @@ curpag() return -1; } return -1; -#endif } - -ktc_newpag() +int +ktc_newpag(void) { extern char **environ; @@ -1961,7 +1948,7 @@ ktc_newpag() if (pag == -1) { sprintf(fname, "%s%d", prefix, getuid()); } else { - sprintf(fname, "%sp%ld", prefix, pag); + sprintf(fname, "%sp%ld", prefix, (long int) pag); } ktc_set_tkt_string(fname); @@ -1969,7 +1956,7 @@ ktc_newpag() numenv++; newenv = (char **)malloc((numenv + 2) * sizeof(char *)); - for (senv = environ, denv = newenv; *senv; *senv++) { + for (senv = environ, denv = newenv; *senv; senv++) { if (strncmp(*senv, "KRBTKFILE=", 10) != 0) *denv++ = *senv; } @@ -1980,6 +1967,7 @@ ktc_newpag() *++denv = 0; environ = newenv; UNLOCK_GLOBAL_MUTEX; + return 0; } /* @@ -1987,7 +1975,7 @@ ktc_newpag() * find out what the local cell is. */ static void -ktc_LocalCell() +ktc_LocalCell(void) { int code; struct afsconf_dir *conf; diff --git a/src/auth/setkey.c b/src/auth/setkey.c index edefbd6036..86081d7ced 100644 --- a/src/auth/setkey.c +++ b/src/auth/setkey.c @@ -21,19 +21,14 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_NETDB_H #include #endif +#include #include "cellconfig.h" #include "keys.h" #include @@ -43,9 +38,7 @@ static int char2hex(char c); static int hex2char(char c); int -main(argc, argv) - int argc; - char **argv; +main(int argc, char **argv) { struct afsconf_dir *tdir; register afs_int32 code; diff --git a/src/auth/test/testcellconf.c b/src/auth/test/testcellconf.c index 4f8002615d..1bc9cae600 100644 --- a/src/auth/test/testcellconf.c +++ b/src/auth/test/testcellconf.c @@ -40,10 +40,8 @@ RCSID #endif #include -PrintOneCell(ainfo, arock, adir) - struct afsconf_cell *ainfo; - char *arock; - struct afsconf_dir *adir; +int +PrintOneCell(struct afsconf_cell *ainfo, void *arock, struct afsconf_dir *adir) { register int i; long temp; @@ -101,7 +99,7 @@ main(argc, argv) printf("failed to find afsprot service (%d)\n", code); else { printf("AFSPROT service:\n"); - PrintOneCell(&theCell, (char *)NULL, theDir); + PrintOneCell(&theCell, NULL, theDir); } code = afsconf_GetCellInfo(theDir, 0, "bozotheclown", &theCell); if (code == 0) diff --git a/src/auth/userok.c b/src/auth/userok.c index 6711423a41..b6cf909543 100644 --- a/src/auth/userok.c +++ b/src/auth/userok.c @@ -46,8 +46,6 @@ RCSID #include "keys.h" #include "afs/audit.h" -afs_int32 afsconf_SuperUser(); - #if !defined(UKERNEL) int afsconf_CheckAuth(void *rock, @@ -61,8 +59,7 @@ afsconf_CheckAuth(void *rock, #endif /* !defined(UKERNEL) */ static int -GetNoAuthFlag(adir) - struct afsconf_dir *adir; +GetNoAuthFlag(struct afsconf_dir *adir) { if (access(AFSDIR_SERVER_NOAUTH_FILEPATH, 0) == 0) { osi_audit(NoAuthEvent, 0, AUD_END); /* some random server is running noauth */ @@ -73,8 +70,7 @@ GetNoAuthFlag(adir) int -afsconf_GetNoAuthFlag(adir) - struct afsconf_dir *adir; +afsconf_GetNoAuthFlag(struct afsconf_dir *adir) { int rc; @@ -85,9 +81,7 @@ afsconf_GetNoAuthFlag(adir) } void -afsconf_SetNoAuthFlag(adir, aflag) - struct afsconf_dir *adir; - int aflag; +afsconf_SetNoAuthFlag(struct afsconf_dir *adir, int aflag) { register afs_int32 code; @@ -112,9 +106,7 @@ afsconf_SetNoAuthFlag(adir, aflag) /* deletes a user from the UserList file */ int -afsconf_DeleteUser(adir, auser) - struct afsconf_dir *adir; - register char *auser; +afsconf_DeleteUser(struct afsconf_dir *adir, register char *auser) { char tbuffer[1024]; char nbuffer[1024]; @@ -204,11 +196,8 @@ afsconf_DeleteUser(adir, auser) /* returns nth super user from the UserList file */ int -afsconf_GetNthUser(adir, an, abuffer, abufferLen) - struct afsconf_dir *adir; - afs_int32 an; - char *abuffer; - afs_int32 abufferLen; +afsconf_GetNthUser(struct afsconf_dir *adir, afs_int32 an, char *abuffer, + afs_int32 abufferLen) { char tbuffer[256]; register FILE *tf; @@ -246,9 +235,7 @@ afsconf_GetNthUser(adir, an, abuffer, abufferLen) /* returns true iff user is in the UserList file */ static int -FindUser(adir, auser) - struct afsconf_dir *adir; - register char *auser; +FindUser(struct afsconf_dir *adir, register char *auser) { char tbuffer[256]; register bufio_p bp; @@ -280,9 +267,7 @@ FindUser(adir, auser) /* add a user to the user list, checking for duplicates */ int -afsconf_AddUser(adir, aname) - struct afsconf_dir *adir; - char *aname; +afsconf_AddUser(struct afsconf_dir *adir, char *aname) { FILE *tf; register afs_int32 code; @@ -316,12 +301,8 @@ afsconf_AddUser(adir, aname) otherwise returns NULL. The resulting string should be immediately copied to other storage prior to release of mutex. */ static char * -CompFindUser(adir, name, sep, inst, realm) - struct afsconf_dir *adir; - char *name; - char *sep; - char *inst; - char *realm; +CompFindUser(struct afsconf_dir *adir, char *name, char *sep, char *inst, + char *realm) { static char fullname[MAXKTCNAMELEN + MAXKTCNAMELEN + MAXKTCREALMLEN + 3]; @@ -360,10 +341,7 @@ CompFindUser(adir, name, sep, inst, realm) if a pointer is passed. */ afs_int32 -afsconf_SuperUser(adir, acall, namep) - struct afsconf_dir *adir; - struct rx_call *acall; - char *namep; +afsconf_SuperUser(struct afsconf_dir *adir, struct rx_call *acall, char *namep) { register struct rx_connection *tconn; register afs_int32 code; @@ -433,7 +411,7 @@ afsconf_SuperUser(adir, acall, namep) tmp = tcell_l; while (*tmp) { *tmp = tolower(*tmp); - *tmp++; + tmp++; } /* determine local cell name. It's static, so will only get diff --git a/src/auth/writeconfig.c b/src/auth/writeconfig.c index c94715805f..dbc229dedd 100644 --- a/src/auth/writeconfig.c +++ b/src/auth/writeconfig.c @@ -28,19 +28,14 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif +#include #include "cellconfig.h" #include "keys.h" @@ -49,8 +44,7 @@ RCSID */ static int -VerifyEntries(aci) - register struct afsconf_cell *aci; +VerifyEntries(register struct afsconf_cell *aci) { register int i; register struct hostent *th; @@ -91,10 +85,8 @@ VerifyEntries(aci) */ int -afsconf_SetCellInfo(adir, apath, acellInfo) - struct afsconf_dir *adir; - char *apath; - struct afsconf_cell *acellInfo; +afsconf_SetCellInfo(struct afsconf_dir *adir, const char *apath, + struct afsconf_cell *acellInfo) { afs_int32 code; @@ -103,11 +95,9 @@ afsconf_SetCellInfo(adir, apath, acellInfo) } int -afsconf_SetExtendedCellInfo(adir, apath, acellInfo, clones) - struct afsconf_dir *adir; - char *apath; - struct afsconf_cell *acellInfo; - char clones[]; +afsconf_SetExtendedCellInfo(struct afsconf_dir *adir, + const char *apath, + struct afsconf_cell *acellInfo, char clones[]) { register afs_int32 code; register int fd; diff --git a/src/bozo/Makefile.in b/src/bozo/Makefile.in index 15cc9087e6..eb6f29b15d 100644 --- a/src/bozo/Makefile.in +++ b/src/bozo/Makefile.in @@ -55,16 +55,16 @@ bosint.xdr.o: bosint.xdr.c ${RPCINCLS} bosint.cs.o: bosint.cs.c ${RPCINCLS} bosint.cs.c: bosint.xg - ${RXGEN} -x -C -o $@ ${srcdir}/bosint.xg + ${RXGEN} -x -A -C -o $@ ${srcdir}/bosint.xg bosint.ss.c: bosint.xg - ${RXGEN} -x -S -o $@ ${srcdir}/bosint.xg + ${RXGEN} -x -A -S -o $@ ${srcdir}/bosint.xg bosint.xdr.c: bosint.xg - ${RXGEN} -x -c -o $@ ${srcdir}/bosint.xg + ${RXGEN} -x -A -c -o $@ ${srcdir}/bosint.xg bosint.h: bosint.xg - ${RXGEN} -x -h -o $@ ${srcdir}/bosint.xg + ${RXGEN} -x -A -h -o $@ ${srcdir}/bosint.xg bosint.cs.c: bosint.h bosint.ss.c: bosint.h diff --git a/src/bozo/bnode.c b/src/bozo/bnode.c index 0ebdfb3d53..da8f4d1c1a 100644 --- a/src/bozo/bnode.c +++ b/src/bozo/bnode.c @@ -28,14 +28,7 @@ RCSID #include #endif #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include /* signal(), kill(), wait(), etc. */ #include @@ -43,6 +36,7 @@ RCSID #include #include #include "bnode.h" +#include "bosprototypes.h" #if defined(AFS_AIX_ENV) || defined(AFS_SUN4_ENV) /* All known versions of AIX lack WCOREDUMP but this works */ diff --git a/src/bozo/bos.c b/src/bozo/bos.c index bc86117acb..ad9f84baef 100644 --- a/src/bozo/bos.c +++ b/src/bozo/bos.c @@ -362,9 +362,8 @@ SkipSc: return tconn; } -static -SetAuth(as) - struct cmd_syndesc *as; +static int +SetAuth(struct cmd_syndesc *as, void *arock) { register afs_int32 code; register struct rx_connection *tconn; @@ -433,9 +432,8 @@ CopyBytes(afd, acall) } } -static -Prune(as) - register struct cmd_syndesc *as; +static int +Prune(register struct cmd_syndesc *as, void *arock) { register afs_int32 code; register struct rx_connection *tconn; @@ -457,9 +455,8 @@ Prune(as) return code; } -static -Exec(as) - register struct cmd_syndesc *as; +static int +Exec(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -471,9 +468,8 @@ Exec(as) return code; } -static -GetDate(as) - register struct cmd_syndesc *as; +static int +GetDate(register struct cmd_syndesc *as, void *arock) { register afs_int32 code; char tbuffer[256]; @@ -522,9 +518,8 @@ GetDate(as) return 0; } -static -UnInstall(as) - register struct cmd_syndesc *as; +static int +UnInstall(register struct cmd_syndesc *as, void *arock) { register afs_int32 code; char tbuffer[256]; @@ -581,9 +576,8 @@ GetServerGoal(aconn, aname) return BSTAT_NORMAL; } -static -Install(as) - struct cmd_syndesc *as; +static int +Install(struct cmd_syndesc *as, void *arock) { struct rx_connection *tconn; register afs_int32 code; @@ -639,9 +633,8 @@ Install(as) return 0; } -static -Shutdown(as) - struct cmd_syndesc *as; +static int +Shutdown(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -669,10 +662,8 @@ Shutdown(as) return 0; } -static -BlockScannerCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +BlockScannerCmd(struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct rx_connection *tconn; @@ -687,10 +678,8 @@ BlockScannerCmd(as, arock) return 0; } -static -UnBlockScannerCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +UnBlockScannerCmd(struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct rx_connection *tconn; @@ -705,10 +694,8 @@ UnBlockScannerCmd(as, arock) return 0; } -static -GetRestartCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +GetRestartCmd(struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct ktime generalTime, newBinaryTime; @@ -750,10 +737,8 @@ GetRestartCmd(as, arock) return 0; } -static -SetRestartCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +SetRestartCmd(struct cmd_syndesc *as, void *arock) { afs_int32 count; register afs_int32 code; @@ -792,9 +777,8 @@ SetRestartCmd(as, arock) return 0; } -static -Startup(as) - struct cmd_syndesc *as; +static int +Startup(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -816,9 +800,8 @@ Startup(as) return 0; } -static -Restart(as) - struct cmd_syndesc *as; +static int +Restart(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -862,9 +845,8 @@ Restart(as) return 0; } -static -SetCellName(as) - struct cmd_syndesc *as; +static int +SetCellName(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -876,9 +858,8 @@ SetCellName(as) return 0; } -static -AddHost(as) - register struct cmd_syndesc *as; +static int +AddHost(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -904,9 +885,8 @@ AddHost(as) return 0; } -static -RemoveHost(as) - register struct cmd_syndesc *as; +static int +RemoveHost(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -922,9 +902,8 @@ RemoveHost(as) return 0; } -static -ListHosts(as) - register struct cmd_syndesc *as; +static int +ListHosts(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -953,9 +932,8 @@ ListHosts(as) return 0; } -static -AddKey(as) - register struct cmd_syndesc *as; +static int +AddKey(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1023,9 +1001,8 @@ AddKey(as) return 0; } -static -RemoveKey(as) - register struct cmd_syndesc *as; +static int +RemoveKey(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1044,9 +1021,8 @@ RemoveKey(as) return 0; } -static -ListKeys(as) - IN register struct cmd_syndesc *as; +static int +ListKeys(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1085,9 +1061,8 @@ ListKeys(as) return 0; } -static -AddSUser(as) - register struct cmd_syndesc *as; +static int +AddSUser(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1106,9 +1081,8 @@ AddSUser(as) return failed; } -static -RemoveSUser(as) - register struct cmd_syndesc *as; +static int +RemoveSUser(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register struct cmd_item *ti; @@ -1132,9 +1106,8 @@ RemoveSUser(as) } #define NPERLINE 10 /* dudes to print per line */ -static -ListSUsers(as) - register struct cmd_syndesc *as; +static int +ListSUsers(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register int i; @@ -1201,9 +1174,8 @@ ListSUsers(as) return 0; } -static -StatServer(as) - register struct cmd_syndesc *as; +static int +StatServer(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1236,9 +1208,8 @@ StatServer(as) return 0; } -static -CreateServer(as) - register struct cmd_syndesc *as; +static int +CreateServer(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1269,9 +1240,8 @@ CreateServer(as) return code; } -static -DeleteServer(as) - register struct cmd_syndesc *as; +static int +DeleteServer(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1292,9 +1262,8 @@ DeleteServer(as) return code; } -static -StartServer(as) - register struct cmd_syndesc *as; +static int +StartServer(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1311,9 +1280,8 @@ StartServer(as) return code; } -static -StopServer(as) - register struct cmd_syndesc *as; +static int +StopServer(register struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code; @@ -1571,9 +1539,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2, return code; } -static -GetLogCmd(as) - register struct cmd_syndesc *as; +static int +GetLogCmd(register struct cmd_syndesc *as, void *arock) { struct rx_connection *tconn; register struct rx_call *tcall; @@ -1610,9 +1577,8 @@ GetLogCmd(as) return code; } -static -SalvageCmd(as) - struct cmd_syndesc *as; +static int +SalvageCmd(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; register afs_int32 code, rc, i; @@ -2028,9 +1994,8 @@ DoStat(aname, aconn, aint32p, firstTime) } #ifdef BOS_RESTRICTED_MODE -static -GetRestrict(as) - struct cmd_syndesc *as; +static int +GetRestrict(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; afs_int32 code, val; @@ -2045,9 +2010,8 @@ GetRestrict(as) return 0; } -static -SetRestrict(as) - struct cmd_syndesc *as; +static int +SetRestrict(struct cmd_syndesc *as, void *arock) { register struct rx_connection *tconn; afs_int32 code, val; @@ -2132,12 +2096,12 @@ main(argc, argv) #endif initialize_rx_error_table(); - ts = cmd_CreateSyntax("start", StartServer, 0, "start running a server"); + ts = cmd_CreateSyntax("start", StartServer, NULL, "start running a server"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, 0, "server process name"); add_std_args(ts); - ts = cmd_CreateSyntax("stop", StopServer, 0, "halt a server instance"); + ts = cmd_CreateSyntax("stop", StopServer, NULL, "halt a server instance"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, 0, "server process name"); cmd_Seek(ts, 8); @@ -2145,7 +2109,7 @@ main(argc, argv) "wait for process to stop"); add_std_args(ts); - ts = cmd_CreateSyntax("status", StatServer, 0, + ts = cmd_CreateSyntax("status", StatServer, NULL, "show server instance status"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, CMD_OPTIONAL, @@ -2153,7 +2117,7 @@ main(argc, argv) cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "long status"); add_std_args(ts); - ts = cmd_CreateSyntax("shutdown", Shutdown, 0, "shutdown all processes"); + ts = cmd_CreateSyntax("shutdown", Shutdown, NULL, "shutdown all processes"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, CMD_OPTIONAL, "instances"); cmd_Seek(ts, 8); @@ -2161,12 +2125,12 @@ main(argc, argv) "wait for process to stop"); add_std_args(ts); - ts = cmd_CreateSyntax("startup", Startup, 0, "start all processes"); + ts = cmd_CreateSyntax("startup", Startup, NULL, "start all processes"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, CMD_OPTIONAL, "instances"); add_std_args(ts); - ts = cmd_CreateSyntax("restart", Restart, 0, "restart processes"); + ts = cmd_CreateSyntax("restart", Restart, NULL, "restart processes"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, CMD_OPTIONAL, "instances"); cmd_AddParm(ts, "-bosserver", CMD_FLAG, CMD_OPTIONAL, @@ -2176,7 +2140,7 @@ main(argc, argv) #ifndef OPBOS - ts = cmd_CreateSyntax("create", CreateServer, 0, + ts = cmd_CreateSyntax("create", CreateServer, NULL, "create a new server instance"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_SINGLE, 0, "server process name"); @@ -2186,108 +2150,108 @@ main(argc, argv) "Notifier program"); add_std_args(ts); - ts = cmd_CreateSyntax("delete", DeleteServer, 0, + ts = cmd_CreateSyntax("delete", DeleteServer, NULL, "delete a server instance"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-instance", CMD_LIST, 0, "server process name"); add_std_args(ts); - ts = cmd_CreateSyntax("adduser", AddSUser, 0, + ts = cmd_CreateSyntax("adduser", AddSUser, NULL, "add users to super-user list"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-user", CMD_LIST, 0, "user names"); add_std_args(ts); - ts = cmd_CreateSyntax("removeuser", RemoveSUser, 0, + ts = cmd_CreateSyntax("removeuser", RemoveSUser, NULL, "remove users from super-user list"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-user", CMD_LIST, 0, "user names"); add_std_args(ts); - ts = cmd_CreateSyntax("listusers", ListSUsers, 0, "list super-users"); + ts = cmd_CreateSyntax("listusers", ListSUsers, NULL, "list super-users"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); add_std_args(ts); cmd_Seek(ts, ADDPARMOFFSET*2); cmd_AddParm(ts, "-width", CMD_SINGLE, CMD_OPTIONAL, "output width"); cmd_AddParm(ts, "-onecol", CMD_FLAG, CMD_OPTIONAL, "one per col"); - ts = cmd_CreateSyntax("addkey", AddKey, 0, + ts = cmd_CreateSyntax("addkey", AddKey, NULL, "add keys to key dbase (kvno 999 is bcrypt)"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_OPTIONAL, "key"); cmd_AddParm(ts, "-kvno", CMD_SINGLE, 0, "key version number"); add_std_args(ts); - ts = cmd_CreateSyntax("removekey", RemoveKey, 0, + ts = cmd_CreateSyntax("removekey", RemoveKey, NULL, "remove keys from key dbase"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-kvno", CMD_LIST, 0, "key version number"); add_std_args(ts); - ts = cmd_CreateSyntax("listkeys", ListKeys, 0, "list keys"); + ts = cmd_CreateSyntax("listkeys", ListKeys, NULL, "list keys"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-showkey", CMD_FLAG, CMD_OPTIONAL, "show the actual key rather than the checksum"); add_std_args(ts); - ts = cmd_CreateSyntax("listhosts", ListHosts, 0, "get cell host list"); + ts = cmd_CreateSyntax("listhosts", ListHosts, NULL, "get cell host list"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); add_std_args(ts); cmd_CreateAlias(ts, "getcell"); - ts = cmd_CreateSyntax("setcellname", SetCellName, 0, "set cell name"); + ts = cmd_CreateSyntax("setcellname", SetCellName, NULL, "set cell name"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "cell name"); add_std_args(ts); - ts = cmd_CreateSyntax("addhost", AddHost, 0, "add host to cell dbase"); + ts = cmd_CreateSyntax("addhost", AddHost, NULL, "add host to cell dbase"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-host", CMD_LIST, 0, "host name"); cmd_AddParm(ts, "-clone", CMD_FLAG, CMD_OPTIONAL, "vote doesn't count"); add_std_args(ts); - ts = cmd_CreateSyntax("removehost", RemoveHost, 0, + ts = cmd_CreateSyntax("removehost", RemoveHost, NULL, "remove host from cell dbase"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-host", CMD_LIST, 0, "host name"); add_std_args(ts); - ts = cmd_CreateSyntax("setauth", SetAuth, 0, + ts = cmd_CreateSyntax("setauth", SetAuth, NULL, "set authentication required flag"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-authrequired", CMD_SINGLE, 0, "on or off: authentication required for admin requests"); add_std_args(ts); - ts = cmd_CreateSyntax("install", Install, 0, "install program"); + ts = cmd_CreateSyntax("install", Install, NULL, "install program"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-file", CMD_LIST, 0, "files to install"); cmd_AddParm(ts, "-dir", CMD_SINGLE, CMD_OPTIONAL, "destination dir"); add_std_args(ts); - ts = cmd_CreateSyntax("uninstall", UnInstall, 0, "uninstall program"); + ts = cmd_CreateSyntax("uninstall", UnInstall, NULL, "uninstall program"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-file", CMD_LIST, 0, "files to uninstall"); cmd_AddParm(ts, "-dir", CMD_SINGLE, CMD_OPTIONAL, "destination dir"); add_std_args(ts); - ts = cmd_CreateSyntax("getlog", GetLogCmd, 0, "examine log file"); + ts = cmd_CreateSyntax("getlog", GetLogCmd, NULL, "examine log file"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-file", CMD_SINGLE, 0, "log file to examine"); add_std_args(ts); - ts = cmd_CreateSyntax("getdate", GetDate, 0, "get dates for programs"); + ts = cmd_CreateSyntax("getdate", GetDate, NULL, "get dates for programs"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-file", CMD_LIST, 0, "files to check"); cmd_AddParm(ts, "-dir", CMD_SINGLE, CMD_OPTIONAL, "destination dir"); add_std_args(ts); - ts = cmd_CreateSyntax("exec", Exec, 0, "execute shell command on server"); + ts = cmd_CreateSyntax("exec", Exec, NULL, "execute shell command on server"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-cmd", CMD_SINGLE, 0, "command to execute"); add_std_args(ts); - ts = cmd_CreateSyntax("prune", Prune, 0, "prune server files"); + ts = cmd_CreateSyntax("prune", Prune, NULL, "prune server files"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-bak", CMD_FLAG, CMD_OPTIONAL, "delete .BAK files"); cmd_AddParm(ts, "-old", CMD_FLAG, CMD_OPTIONAL, "delete .OLD files"); @@ -2295,7 +2259,7 @@ main(argc, argv) cmd_AddParm(ts, "-all", CMD_FLAG, CMD_OPTIONAL, "delete all junk files"); add_std_args(ts); - ts = cmd_CreateSyntax("setrestart", SetRestartCmd, 0, + ts = cmd_CreateSyntax("setrestart", SetRestartCmd, NULL, "set restart times"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine name"); cmd_AddParm(ts, "-time", CMD_SINGLE, CMD_REQUIRED, @@ -2306,12 +2270,12 @@ main(argc, argv) "set new binary restart time"); add_std_args(ts); - ts = cmd_CreateSyntax("getrestart", GetRestartCmd, 0, + ts = cmd_CreateSyntax("getrestart", GetRestartCmd, NULL, "get restart times"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine name"); add_std_args(ts); - ts = cmd_CreateSyntax("salvage", SalvageCmd, 0, + ts = cmd_CreateSyntax("salvage", SalvageCmd, NULL, "salvage partition or volumes"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, @@ -2369,23 +2333,23 @@ main(argc, argv) "(MR-AFS) Numeric mask of residencies to be included in the salvage. Do not use with -SalvageRemote or -SalvageArchival"); add_std_args(ts); - ts = cmd_CreateSyntax("blockscanner", BlockScannerCmd, 0, + ts = cmd_CreateSyntax("blockscanner", BlockScannerCmd, NULL, "block scanner daemon from making migration requests"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine name"); add_std_args(ts); - ts = cmd_CreateSyntax("unblockscanner", UnBlockScannerCmd, 0, + ts = cmd_CreateSyntax("unblockscanner", UnBlockScannerCmd, NULL, "allow scanner daemon to make migration requests again"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine name"); add_std_args(ts); #ifdef BOS_RESTRICTED_MODE - ts = cmd_CreateSyntax("getrestricted", GetRestrict, 0, + ts = cmd_CreateSyntax("getrestricted", GetRestrict, NULL, "get restrict mode"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); add_std_args(ts); - ts = cmd_CreateSyntax("setrestricted", SetRestrict, 0, + ts = cmd_CreateSyntax("setrestricted", SetRestrict, NULL, "set restrict mode"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-mode", CMD_SINGLE, 0, "mode to set"); diff --git a/src/bozo/bos_util.c b/src/bozo/bos_util.c index b6e992fe94..c29b79790f 100644 --- a/src/bozo/bos_util.c +++ b/src/bozo/bos_util.c @@ -28,14 +28,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/bozo/bosoprocs.c b/src/bozo/bosoprocs.c index 5d4517040c..6481a236a4 100644 --- a/src/bozo/bosoprocs.c +++ b/src/bozo/bosoprocs.c @@ -37,18 +37,11 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "bnode.h" #include "bosint.h" - +#include "bosprototypes.h" extern struct ktime bozo_nextRestartKT, bozo_nextDayKT; diff --git a/src/bozo/bosprototypes.h b/src/bozo/bosprototypes.h new file mode 100644 index 0000000000..590bedd685 --- /dev/null +++ b/src/bozo/bosprototypes.h @@ -0,0 +1,16 @@ +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + */ + +#ifndef _BOSPROTOTYPES_H_ +#define _BOSPROTOTYPES_H_ + +/* bosserver.c */ +void bozo_Log(char *format, ... ); + +#endif diff --git a/src/bozo/bosserver.c b/src/bozo/bosserver.c index f13a7690d6..a515ee85b5 100644 --- a/src/bozo/bosserver.c +++ b/src/bozo/bosserver.c @@ -21,6 +21,7 @@ RCSID #include #include #include +#include #ifdef AFS_NT40_ENV #include #include @@ -42,6 +43,7 @@ RCSID #endif #include "bosint.h" #include "bnode.h" +#include "bosprototypes.h" #include #include #include @@ -52,14 +54,11 @@ RCSID #include #endif - #define BOZO_LWP_STACKSIZE 16000 extern int BOZO_ExecuteRequest(); extern int RXSTATS_ExecuteRequest(); extern struct bnode_ops fsbnode_ops, dafsbnode_ops, ezbnode_ops, cronbnode_ops; -void bozo_Log(); - struct afsconf_dir *bozo_confdir = 0; /* bozo configuration dir */ static PROCESS bozo_pid; #ifdef AFS_RXK5 @@ -1095,17 +1094,21 @@ main(int argc, char **argv, char **envp) rx_SetMinProcs(tservice, 2); rx_SetMaxProcs(tservice, 4); rx_StartServer(1); /* donate this process */ + return 0; } void -bozo_Log(char *a, char *b, char *c, char *d, char *e, char *f) +bozo_Log(char *format, ...) { char tdate[27]; time_t myTime; + va_list ap; + + va_start(ap, format); if (DoSyslog) { #ifndef AFS_NT40_ENV - syslog(LOG_INFO, a, b, c, d, e, f); + vsyslog(LOG_INFO, format, ap); #endif } else { myTime = time(0); @@ -1119,11 +1122,11 @@ bozo_Log(char *a, char *b, char *c, char *d, char *e, char *f) printf("bosserver: WARNING: problem with %s\n", AFSDIR_SERVER_BOZLOG_FILEPATH); printf("%s ", tdate); - printf(a, b, c, d, e, f); + vprintf(format, ap); fflush(stdout); } else { fprintf(bozo_logFile, "%s ", tdate); - fprintf(bozo_logFile, a, b, c, d, e, f); + vfprintf(bozo_logFile, format, ap); /* close so rm BosLog works */ fclose(bozo_logFile); diff --git a/src/bozo/cronbnodeops.c b/src/bozo/cronbnodeops.c index 7fecb2c4f0..6c80b71843 100644 --- a/src/bozo/cronbnodeops.c +++ b/src/bozo/cronbnodeops.c @@ -23,19 +23,14 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include #include /* signal(), kill(), wait(), etc. */ #include "bnode.h" +#include "bosprototypes.h" static int cron_timeout(), cron_getstat(), cron_setstat(), cron_delete(); static int cron_procexit(), cron_getstring(), cron_getparm(), cron_restartp(); diff --git a/src/bozo/ezbnodeops.c b/src/bozo/ezbnodeops.c index 7852d9cbd2..681e59a71b 100644 --- a/src/bozo/ezbnodeops.c +++ b/src/bozo/ezbnodeops.c @@ -21,18 +21,13 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include /* signal(), kill(), wait(), etc. */ #include "bnode.h" +#include "bosprototypes.h" static int ez_timeout(), ez_getstat(), ez_setstat(), ez_delete(); static int ez_procexit(), ez_getstring(), ez_getparm(), ez_restartp(); diff --git a/src/bozo/fsbnodeops.c b/src/bozo/fsbnodeops.c index 7e3a467729..07ddef200a 100644 --- a/src/bozo/fsbnodeops.c +++ b/src/bozo/fsbnodeops.c @@ -26,13 +26,7 @@ RCSID #else #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #endif /* AFS_NT40_ENV */ @@ -40,7 +34,7 @@ RCSID #include /* signal(), kill(), wait(), etc. */ #include #include "bnode.h" - +#include "bosprototypes.h" static int emergency = 0; diff --git a/src/bu_utils/fms.c b/src/bu_utils/fms.c index 42b46044bb..83067f50d8 100644 --- a/src/bu_utils/fms.c +++ b/src/bu_utils/fms.c @@ -35,7 +35,7 @@ afs_int32 eotEnabled = 1; /* prototypes */ int fileMark(usd_handle_t hTape); int fileMarkSize(char *tapeDevice); -void tt_fileMarkSize(struct cmd_syndesc *as, char *arock); +static int tt_fileMarkSize(struct cmd_syndesc *as, void *arock); #define ERROR(evalue) \ { \ @@ -64,23 +64,24 @@ main(argc, argv) sigaction(SIGINT, &intaction, &oldaction); cptr = - cmd_CreateSyntax(NULL, tt_fileMarkSize, 0, + cmd_CreateSyntax(NULL, tt_fileMarkSize, NULL, "write a tape full of file marks"); cmd_AddParm(cptr, "-tape", CMD_SINGLE, CMD_REQUIRED, "tape special file"); cmd_Dispatch(argc, argv); + return 0; } -void -tt_fileMarkSize(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +tt_fileMarkSize(struct cmd_syndesc *as, void *arock) { char *tapeDevice; tapeDevice = as->parms[0].items->data; fileMarkSize(tapeDevice); + + return 0; } diff --git a/src/bubasics/Makefile.in b/src/bubasics/Makefile.in index 77eec29d72..21b37680d5 100644 --- a/src/bubasics/Makefile.in +++ b/src/bubasics/Makefile.in @@ -18,16 +18,16 @@ libbubasics.a: $(OBJS) AFS_component_version_number.o ${RANLIB} libbubasics.a butc.xdr.c: butc.xg - ${RXGEN} -c -o $@ ${srcdir}/butc.xg + ${RXGEN} -A -c -o $@ ${srcdir}/butc.xg butc.ss.c: butc.xg - ${RXGEN} -S -o $@ ${srcdir}/butc.xg + ${RXGEN} -A -S -o $@ ${srcdir}/butc.xg butc.cs.c: butc.xg - ${RXGEN} -C -o $@ ${srcdir}/butc.xg + ${RXGEN} -A -C -o $@ ${srcdir}/butc.xg butc.h: butc.xg - ${RXGEN} -h -o $@ ${srcdir}/butc.xg + ${RXGEN} -A -h -o $@ ${srcdir}/butc.xg butc.xdr.c: butc.h butc.cs.c: butc.h diff --git a/src/bucoord/bc.p.h b/src/bucoord/bc.p.h index 4e385e238d..4fbc1bfc61 100644 --- a/src/bucoord/bc.p.h +++ b/src/bucoord/bc.p.h @@ -13,11 +13,8 @@ #ifdef HAVE_STDIO_H #include #endif /* HAVE_STDIO_H */ -#if defined(HAVE_STRING_H) -# include -#elif defined(HAVE_STRINGS_H) -# include -#endif /* HAVE_STRING_H */ + +#include /* * Represents a host in the config database. diff --git a/src/bucoord/commands.c b/src/bucoord/commands.c index fc1d5428db..4b10f2ac2f 100644 --- a/src/bucoord/commands.c +++ b/src/bucoord/commands.c @@ -765,7 +765,8 @@ concatParams(itemPtr) /* printIfStatus * print out an interface status node as received from butc */ - + +void printIfStatus(statusPtr) struct tciStatusS *statusPtr; { @@ -822,10 +823,8 @@ getPortOffset(port) /* bc_GetTapeStatusCmd * display status of all tasks on a particular tape coordinator */ - -bc_GetTapeStatusCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_GetTapeStatusCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct rx_connection *tconn; @@ -920,10 +919,8 @@ bc_WaitForNoJobs() * parameters * ignored - a null "as" prints only jobs. */ - -bc_JobsCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_JobsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 prevTime; dlqlinkP ptr; @@ -1037,9 +1034,8 @@ bc_JobsCmd(as, arock) return 0; } -bc_KillCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_KillCmd(struct cmd_syndesc *as, void *arock) { afs_int32 i; afs_int32 slot; @@ -1111,9 +1107,8 @@ bc_KillCmd(as, arock) } /* restore a volume or volumes */ -bc_VolRestoreCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_VolRestoreCmd(struct cmd_syndesc *as, void *arock) { /* * parm 0 is the new server to restore to @@ -1266,9 +1261,8 @@ bc_VolRestoreCmd(as, arock) * various optional */ -bc_DiskRestoreCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_DiskRestoreCmd(struct cmd_syndesc *as, void *arock) { struct bc_volumeSet tvolumeSet; /* temporary volume set for EvalVolumeSet call */ struct bc_volumeEntry tvolumeEntry; /* entry within the volume set */ @@ -1423,9 +1417,8 @@ bc_DiskRestoreCmd(as, arock) * restore a volumeset or list of volumes. */ -bc_VolsetRestoreCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_VolsetRestoreCmd(struct cmd_syndesc *as, void *arock) { int oldFlag; long fromDate; @@ -1606,9 +1599,7 @@ bc_VolsetRestoreCmd(as, arock) int dontExecute; int -bc_DumpCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +bc_DumpCmd(struct cmd_syndesc *as, void *arock) { /*bc_DumpCmd */ static char rn[] = "bc_DumpCmd"; /*Routine name */ char *dumpPath, *vsName; /*Ptrs to various names */ @@ -1986,10 +1977,8 @@ bc_DumpCmd(as, arock) * parameters: * ignored */ - -bc_QuitCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_QuitCmd(struct cmd_syndesc *as, void *arock) { int i; struct bc_dumpTask *td; @@ -2038,10 +2027,8 @@ bc_QuitCmd(as, arock) * Labels a tape i.e. request the tape coordinator to perform this * operation */ - -bc_LabelTapeCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_LabelTapeCmd(struct cmd_syndesc *as, void *arock) { char *tapename = 0, *pname = 0; afs_int32 size; @@ -2101,10 +2088,8 @@ bc_LabelTapeCmd(as, arock) * params: * optional port number */ - -bc_ReadLabelCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_ReadLabelCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 port = 0; @@ -2131,10 +2116,8 @@ bc_ReadLabelCmd(as, arock) * read content information from dump tapes, and if user desires, * add it to the database */ - -bc_ScanDumpsCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_ScanDumpsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 port = 0; afs_int32 dbAddFlag = 0; @@ -2242,10 +2225,8 @@ bc_ParseExpiration(paramPtr, expType, expDate) * Currently a single option, volumename to search for. Reports * all dumps containing the specified volume */ - -bc_dblookupCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_dblookupCmd(struct cmd_syndesc *as, void *arock) { struct cmd_item *ciptr; afs_int32 code; @@ -2261,10 +2242,8 @@ bc_dblookupCmd(as, arock) /* for ubik version */ - -bc_dbVerifyCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_dbVerifyCmd(struct cmd_syndesc *as, void *arock) { afs_int32 status; afs_int32 orphans; @@ -2420,10 +2399,8 @@ deleteDump(dumpid, port, force) * entry: * dump id - single required arg as param 0. */ - -bc_deleteDumpCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_deleteDumpCmd(struct cmd_syndesc *as, void *arock) { afs_uint32 dumpid; afs_int32 code = 0; @@ -2576,9 +2553,8 @@ bc_deleteDumpCmd(as, arock) return (rcode); } -bc_saveDbCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_saveDbCmd(struct cmd_syndesc *as, void *arock) { struct rx_connection *tconn; afs_int32 portOffset = 0; @@ -2646,9 +2622,8 @@ bc_saveDbCmd(as, arock) return (code); } -bc_restoreDbCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_restoreDbCmd(struct cmd_syndesc *as, void *arock) { struct rx_connection *tconn; afs_int32 portOffset = 0; @@ -3151,9 +3126,8 @@ printRecentDumps(ndumps) * as - name of tape * arock - */ -bc_dumpInfoCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_dumpInfoCmd(struct cmd_syndesc *as, void *arock) { afs_int32 dumpid; afs_int32 detailFlag; diff --git a/src/bucoord/dsstub.c b/src/bucoord/dsstub.c index 040208d9d7..7ed4fb73e1 100644 --- a/src/bucoord/dsstub.c +++ b/src/bucoord/dsstub.c @@ -26,6 +26,8 @@ RCSID #include #include #endif +#include +#include #include #include #include diff --git a/src/bucoord/dsvs.c b/src/bucoord/dsvs.c index 13d464b1c1..d65c50323c 100644 --- a/src/bucoord/dsvs.c +++ b/src/bucoord/dsvs.c @@ -44,6 +44,8 @@ struct ubik_client *cstructp; /*Ptr to Ubik client structure */ extern struct bc_volumeSet *bc_FindVolumeSet(struct bc_config *cf, char *name); +static FreeVolumeEntryList(); +static FreeVolumeEntry(); /* Code to maintain dump schedule and volume set abstractions. * A volume set looks like this: diff --git a/src/bucoord/dump.c b/src/bucoord/dump.c index 2e45b7f1ba..d6b46c8bc8 100644 --- a/src/bucoord/dump.c +++ b/src/bucoord/dump.c @@ -178,6 +178,7 @@ bc_Dumper(aindex) * free the list of volumes used for dumps */ +void freeDumpTaskVolumeList(vdptr) struct bc_volumeDump *vdptr; { diff --git a/src/bucoord/dump_sched.c b/src/bucoord/dump_sched.c index e721ea0b5f..04d0fdff0d 100644 --- a/src/bucoord/dump_sched.c +++ b/src/bucoord/dump_sched.c @@ -12,6 +12,8 @@ */ #include +#include +#include #include #include @@ -43,6 +45,7 @@ extern struct bc_config *bc_globalConfig; extern struct udbHandleS udbHandle; extern char *whoami; +static ListDumpSchedule(); /* ------------------------------------ * command level routines @@ -56,13 +59,11 @@ extern char *whoami; * parm 1: expiration date (list) */ -afs_int32 -bc_AddDumpCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_AddDumpCmd(struct cmd_syndesc *as, void *arock) { register char *dname; /* dump schedule name */ - register afs_int32 code; + register int code; afs_int32 expType, expDate; register struct cmd_item *ti; udbClientTextP ctPtr; @@ -146,16 +147,14 @@ bc_AddDumpCmd(as, arock) * delete a dump schedule */ -afs_int32 -bc_DeleteDumpCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_DeleteDumpCmd(struct cmd_syndesc *as, void *arock) { /* parm 0 is vol set name * parm 1 is dump schedule name */ register char *dname; - register afs_int32 code; + register int code; udbClientTextP ctPtr; /* lock schedules and check validity */ @@ -265,11 +264,11 @@ ListDumpSchedule(register struct bc_dumpSchedule *adump, int alevel) * ignored */ -afs_int32 -bc_ListDumpScheduleCmd(struct cmd_syndesc *as, char *arock) +int +bc_ListDumpScheduleCmd(struct cmd_syndesc *as, void *arock) { /* no parms */ - afs_int32 code; + int code; register struct bc_dumpSchedule *tdump; /* first check to see if schedules must be updated */ @@ -298,17 +297,15 @@ bc_ListDumpScheduleCmd(struct cmd_syndesc *as, char *arock) * parm 1: expiration date (list) */ -afs_int32 -bc_SetExpCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_SetExpCmd(struct cmd_syndesc *as, void *arock) { register char *dname; /* dump schedule name */ register struct cmd_item *ti; struct bc_dumpSchedule *node, *parent; afs_int32 expType, expDate; udbClientTextP ctPtr; - register afs_int32 code; + register int code; afs_int32 bc_ParseExpiration(); diff --git a/src/bucoord/main.c b/src/bucoord/main.c index 1326966a7b..504d9f81fa 100644 --- a/src/bucoord/main.c +++ b/src/bucoord/main.c @@ -322,8 +322,7 @@ backupInit() */ static int -MyBeforeProc(as) - register struct cmd_syndesc *as; +MyBeforeProc(register struct cmd_syndesc *as, void *arock) { afs_int32 code; @@ -465,9 +464,7 @@ doDispatch(targc, targv, dispatchCount) } int -bc_interactCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +bc_interactCmd(struct cmd_syndesc *as, void *arock) { interact = 1; return 0; @@ -524,7 +521,7 @@ main(argc, argv) cmd_SetBeforeProc(MyBeforeProc, NULL); - ts = cmd_CreateSyntax("dump", bc_DumpCmd, 0, "start dump"); + ts = cmd_CreateSyntax("dump", bc_DumpCmd, NULL, "start dump"); cmd_AddParm(ts, "-volumeset", CMD_SINGLE, CMD_OPTIONAL, "volume set name"); cmd_AddParm(ts, "-dump", CMD_SINGLE, CMD_OPTIONAL, "dump level name"); @@ -538,7 +535,7 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("volrestore", bc_VolRestoreCmd, 0, + ts = cmd_CreateSyntax("volrestore", bc_VolRestoreCmd, NULL, "restore volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "destination machine"); @@ -557,7 +554,7 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("diskrestore", bc_DiskRestoreCmd, 0, + ts = cmd_CreateSyntax("diskrestore", bc_DiskRestoreCmd, NULL, "restore partition"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine to restore"); @@ -575,9 +572,9 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("quit", bc_QuitCmd, 0, "leave the program"); + ts = cmd_CreateSyntax("quit", bc_QuitCmd, NULL, "leave the program"); - ts = cmd_CreateSyntax("volsetrestore", bc_VolsetRestoreCmd, 0, + ts = cmd_CreateSyntax("volsetrestore", bc_VolsetRestoreCmd, NULL, "restore a set of volumes"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "volume set name"); cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "file name"); @@ -588,7 +585,7 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("addhost", bc_AddHostCmd, 0, "add host to config"); + ts = cmd_CreateSyntax("addhost", bc_AddHostCmd, NULL, "add host to config"); cmd_AddParm(ts, "-tapehost", CMD_SINGLE, CMD_REQUIRED, "tape machine name"); cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL, @@ -596,7 +593,7 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("delhost", bc_DeleteHostCmd, 0, + ts = cmd_CreateSyntax("delhost", bc_DeleteHostCmd, NULL, "delete host to config"); cmd_AddParm(ts, "-tapehost", CMD_SINGLE, CMD_REQUIRED, "tape machine name"); @@ -605,29 +602,29 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("listhosts", bc_ListHostsCmd, 0, + ts = cmd_CreateSyntax("listhosts", bc_ListHostsCmd, NULL, "list config hosts"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("jobs", bc_JobsCmd, 0, "list running jobs"); + ts = cmd_CreateSyntax("jobs", bc_JobsCmd, NULL, "list running jobs"); - ts = cmd_CreateSyntax("kill", bc_KillCmd, 0, "kill running job"); + ts = cmd_CreateSyntax("kill", bc_KillCmd, NULL, "kill running job"); cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_REQUIRED, "job ID or dump set name"); - ts = cmd_CreateSyntax("listvolsets", bc_ListVolSetCmd, 0, + ts = cmd_CreateSyntax("listvolsets", bc_ListVolSetCmd, NULL, "list volume sets"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "volume set name"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("listdumps", bc_ListDumpScheduleCmd, 0, + ts = cmd_CreateSyntax("listdumps", bc_ListDumpScheduleCmd, NULL, "list dump schedules"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("addvolset", bc_AddVolSetCmd, 0, + ts = cmd_CreateSyntax("addvolset", bc_AddVolSetCmd, NULL, "create a new volume set"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED, "volume set name"); cmd_AddParm(ts, "-temporary", CMD_FLAG, CMD_OPTIONAL, @@ -635,20 +632,20 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("status", bc_GetTapeStatusCmd, 0, + ts = cmd_CreateSyntax("status", bc_GetTapeStatusCmd, NULL, "get tape coordinator status"); cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL, "TC port offset"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("delvolset", bc_DeleteVolSetCmd, 0, + ts = cmd_CreateSyntax("delvolset", bc_DeleteVolSetCmd, NULL, "delete a volume set"); cmd_AddParm(ts, "-name", CMD_LIST, CMD_REQUIRED, "volume set name"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("addvolentry", bc_AddVolEntryCmd, 0, + ts = cmd_CreateSyntax("addvolentry", bc_AddVolEntryCmd, NULL, "add a new volume entry"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED, "volume set name"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine name"); @@ -658,26 +655,26 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("delvolentry", bc_DeleteVolEntryCmd, 0, + ts = cmd_CreateSyntax("delvolentry", bc_DeleteVolEntryCmd, NULL, "delete a volume set sub-entry"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED, "volume set name"); cmd_AddParm(ts, "-entry", CMD_SINGLE, CMD_REQUIRED, "volume set index"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("adddump", bc_AddDumpCmd, 0, "add dump schedule"); + ts = cmd_CreateSyntax("adddump", bc_AddDumpCmd, NULL, "add dump schedule"); cmd_AddParm(ts, "-dump", CMD_LIST, CMD_REQUIRED, "dump level name"); cmd_AddParm(ts, "-expires", CMD_LIST, CMD_OPTIONAL, "expiration date"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("deldump", bc_DeleteDumpCmd, 0, + ts = cmd_CreateSyntax("deldump", bc_DeleteDumpCmd, NULL, "delete dump schedule"); cmd_AddParm(ts, "-dump", CMD_SINGLE, CMD_REQUIRED, "dump level name"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("labeltape", bc_LabelTapeCmd, 0, "label a tape"); + ts = cmd_CreateSyntax("labeltape", bc_LabelTapeCmd, NULL, "label a tape"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "AFS tape name, defaults to NULL"); cmd_AddParm(ts, "-size", CMD_SINGLE, CMD_OPTIONAL, @@ -689,14 +686,14 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("readlabel", bc_ReadLabelCmd, 0, + ts = cmd_CreateSyntax("readlabel", bc_ReadLabelCmd, NULL, "read the label on tape"); cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL, "TC port offset"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("scantape", bc_ScanDumpsCmd, 0, + ts = cmd_CreateSyntax("scantape", bc_ScanDumpsCmd, NULL, "dump information recovery from tape"); cmd_AddParm(ts, "-dbadd", CMD_FLAG, CMD_OPTIONAL, "add information to the database"); @@ -705,34 +702,34 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("volinfo", bc_dblookupCmd, 0, + ts = cmd_CreateSyntax("volinfo", bc_dblookupCmd, NULL, "query the backup database"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume name"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("setexp", bc_SetExpCmd, 0, + ts = cmd_CreateSyntax("setexp", bc_SetExpCmd, NULL, "set/clear dump expiration dates"); cmd_AddParm(ts, "-dump", CMD_LIST, CMD_REQUIRED, "dump level name"); cmd_AddParm(ts, "-expires", CMD_LIST, CMD_OPTIONAL, "expiration date"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("savedb", bc_saveDbCmd, 0, "save backup database"); + ts = cmd_CreateSyntax("savedb", bc_saveDbCmd, NULL, "save backup database"); cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL, "TC port offset"); cmd_AddParm(ts, "-archive", CMD_LIST, CMD_OPTIONAL, "date time"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("restoredb", bc_restoreDbCmd, 0, + ts = cmd_CreateSyntax("restoredb", bc_restoreDbCmd, NULL, "restore backup database"); cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL, "TC port offset"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("dumpinfo", bc_dumpInfoCmd, 0, + ts = cmd_CreateSyntax("dumpinfo", bc_dumpInfoCmd, NULL, "provide information about a dump in the database"); cmd_AddParm(ts, "-ndumps", CMD_SINGLE, CMD_OPTIONAL, "no. of dumps"); cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_OPTIONAL, "dump id"); @@ -741,13 +738,13 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("dbverify", bc_dbVerifyCmd, 0, + ts = cmd_CreateSyntax("dbverify", bc_dbVerifyCmd, NULL, "check ubik database integrity"); cmd_AddParm(ts, "-detail", CMD_FLAG, CMD_OPTIONAL, "additional details"); if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("deletedump", bc_deleteDumpCmd, 0, + ts = cmd_CreateSyntax("deletedump", bc_deleteDumpCmd, NULL, "delete dumps from the database"); cmd_AddParm(ts, "-dumpid", CMD_LIST, CMD_OPTIONAL, "dump id"); cmd_AddParm(ts, "-from", CMD_LIST, CMD_OPTIONAL, "date time"); @@ -764,7 +761,7 @@ main(argc, argv) if (!interact) add_std_args(ts); - ts = cmd_CreateSyntax("interactive", bc_interactCmd, 0, + ts = cmd_CreateSyntax("interactive", bc_interactCmd, NULL, "enter interactive mode"); add_std_args(ts); diff --git a/src/bucoord/regex.c b/src/bucoord/regex.c index a65587e2aa..435749f1a7 100644 --- a/src/bucoord/regex.c +++ b/src/bucoord/regex.c @@ -93,6 +93,10 @@ static char expbuf[ESIZE], *braslist[NBRA], *braelist[NBRA]; static char circf; +static int advance(); +static int backref(); +static int cclass(); + /* * compile the regular expression argument into a dfa */ diff --git a/src/bucoord/restore.c b/src/bucoord/restore.c index a06bc65b15..0fc3135b66 100644 --- a/src/bucoord/restore.c +++ b/src/bucoord/restore.c @@ -131,6 +131,7 @@ extractTapeSeq(tapename) return (atol(sptr)); } +void viceName(value) long value; { @@ -224,7 +225,7 @@ bc_Restorer(aindex) code = bcdb_FindDumpByID(dumpTaskPtr->parentDumpID, dumpDescr); if (code) { - afs_com_err(whoami, "Couldn't look up info for dump %d\n", + afs_com_err(whoami, code, "Couldn't look up info for dump %d\n", dumpTaskPtr->parentDumpID); continue; } diff --git a/src/bucoord/status.c b/src/bucoord/status.c index d48c145776..956d93f75c 100644 --- a/src/bucoord/status.c +++ b/src/bucoord/status.c @@ -38,6 +38,7 @@ extern struct Lock cmdLineLock; /* lock on the cmdLine */ * These routines are common the backup coordinator and tape coordinator */ +void initStatus() { dlqInit(&statusHead); @@ -47,21 +48,25 @@ initStatus() /* lock managment */ +void lock_Status() { ObtainWriteLock(&statusQueueLock); } +void unlock_Status() { ReleaseWriteLock(&statusQueueLock); } +void lock_cmdLine() { ObtainWriteLock(&cmdLineLock); } +void unlock_cmdLine() { ReleaseWriteLock(&cmdLineLock); @@ -109,6 +114,7 @@ createStatusNode() return (ptr); } +void deleteStatusNode(ptr) statusP ptr; { diff --git a/src/bucoord/tape_hosts.c b/src/bucoord/tape_hosts.c index 6318968802..73c3fd8b0a 100644 --- a/src/bucoord/tape_hosts.c +++ b/src/bucoord/tape_hosts.c @@ -49,10 +49,8 @@ extern char *whoami; * Add a host to the tape hosts */ -afs_int32 -bc_AddHostCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_AddHostCmd(struct cmd_syndesc *as, void *arock) { struct cmd_item *ti; udbClientTextP ctPtr; @@ -107,10 +105,8 @@ bc_AddHostCmd(as, arock) return (code); } -afs_int32 -bc_DeleteHostCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_DeleteHostCmd(struct cmd_syndesc *as, void *arock) { struct cmd_item *ti; afs_int32 port = 0; @@ -174,10 +170,8 @@ bc_DeleteHostCmd(as, arock) * ignored */ -afs_int32 -bc_ListHostsCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_ListHostsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; register struct bc_hostEntry *tentry; diff --git a/src/bucoord/vol_sets.c b/src/bucoord/vol_sets.c index 6190d6e6e0..3333daf633 100644 --- a/src/bucoord/vol_sets.c +++ b/src/bucoord/vol_sets.c @@ -41,6 +41,7 @@ extern char *whoami; extern struct bc_volumeSet *bc_FindVolumeSet(struct bc_config *cf, char *name); extern void FreeVolumeSet(struct bc_volumeSet *avset); +static ListVolSet(); /* ------------------------------------ * command level routines @@ -57,11 +58,10 @@ extern void FreeVolumeSet(struct bc_volumeSet *avset); * parm 3 is volume regexp */ -bc_AddVolEntryCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_AddVolEntryCmd(struct cmd_syndesc *as, void *arock) { - register afs_int32 code; + register int code; char *volSetName, *serverName, *partitionName, *volRegExp; udbClientTextP ctPtr; struct bc_volumeSet *tset; @@ -129,13 +129,11 @@ bc_AddVolEntryCmd(as, arock) * name of new volume set */ -afs_int32 -bc_AddVolSetCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_AddVolSetCmd(struct cmd_syndesc *as, void *arock) { /* parm 0 is vol set name */ - register afs_int32 code; + register int code; register struct cmd_item *ti; udbClientTextP ctPtr; afs_int32 flags; @@ -190,12 +188,10 @@ bc_AddVolSetCmd(as, arock) * parm 1 is entry # (integer, 1 based) */ -afs_int32 -bc_DeleteVolEntryCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_DeleteVolEntryCmd(struct cmd_syndesc *as, void *arock) { - register afs_int32 code; + register int code; afs_int32 entry; char *vsname; udbClientTextP ctPtr; @@ -279,13 +275,11 @@ bc_DeleteVolEntryCmd(as, arock) * name of volumeset to delete */ -afs_int32 -bc_DeleteVolSetCmd(as, arock) - struct cmd_syndesc *as; - char *arock; +int +bc_DeleteVolSetCmd(struct cmd_syndesc *as, void *arock) { /* parm 0 is vol set name */ - register afs_int32 code; + register int code; register struct cmd_item *ti; udbClientTextP ctPtr; afs_int32 c; @@ -364,13 +358,13 @@ ListVolSet(struct bc_volumeSet *aset) * optional parameter specifies a volumeset name */ -afs_int32 -bc_ListVolSetCmd(struct cmd_syndesc *as, char *arock) +int +bc_ListVolSetCmd(struct cmd_syndesc *as, void *arock) { /* parm 0 is optional volume set to display */ register struct bc_volumeSet *tset; register struct cmd_item *ti; - afs_int32 code = 0; + int code = 0; code = bc_UpdateVolumeSet(); if (code) { diff --git a/src/budb/Makefile.in b/src/budb/Makefile.in index f8f167180e..a5f143647f 100644 --- a/src/budb/Makefile.in +++ b/src/budb/Makefile.in @@ -80,16 +80,16 @@ budb_server: $(SERVER_OBJS) ${LIBS} ${KRB5LIBS} $(LIBCOM_ERR) ${XLIBS} budb.cs.c: budb.rg - ${RXGEN} -u -C -o $@ ${srcdir}/budb.rg + ${RXGEN} -A -u -C -o $@ ${srcdir}/budb.rg budb.ss.c: budb.rg - ${RXGEN} -S -o $@ ${srcdir}/budb.rg + ${RXGEN} -A -S -o $@ ${srcdir}/budb.rg budb.xdr.c: budb.rg - ${RXGEN} -c -o $@ ${srcdir}/budb.rg + ${RXGEN} -A -c -o $@ ${srcdir}/budb.rg budb.h: budb.rg - ${RXGEN} -u -h -o $@ ${srcdir}/budb.rg + ${RXGEN} -A -u -h -o $@ ${srcdir}/budb.rg budb.cs.c: budb.h budb.xdr.c: budb.h diff --git a/src/budb/database.c b/src/budb/database.c index 42c4f43c9b..56797f6421 100644 --- a/src/budb/database.c +++ b/src/budb/database.c @@ -26,15 +26,7 @@ RCSID #include "database.h" #include "error_macros.h" #include "afs/audit.h" - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - int pollCount; struct memoryDB db; /* really allocate it here */ diff --git a/src/budb/db_alloc.c b/src/budb/db_alloc.c index fbed0a6b72..4ac984a426 100644 --- a/src/budb/db_alloc.c +++ b/src/budb/db_alloc.c @@ -18,13 +18,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/budb/db_dump.c b/src/budb/db_dump.c index 587fde42c7..4d0a11e285 100644 --- a/src/budb/db_dump.c +++ b/src/budb/db_dump.c @@ -28,14 +28,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "database.h" #include "budb.h" @@ -100,6 +93,7 @@ canWrite(fid) * no return value */ +void haveWritten(nbytes) afs_int32 nbytes; { @@ -121,6 +115,7 @@ haveWritten(nbytes) * done flag. */ +void doneWriting(error) afs_int32 error; { diff --git a/src/budb/db_hash.c b/src/budb/db_hash.c index 16a0636e82..d9b9897c2c 100644 --- a/src/budb/db_hash.c +++ b/src/budb/db_hash.c @@ -18,13 +18,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/budb/db_text.c b/src/budb/db_text.c index 8876612bc7..ab21aeaea3 100644 --- a/src/budb/db_text.c +++ b/src/budb/db_text.c @@ -22,13 +22,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -489,7 +483,7 @@ SaveText(call, lockHandle, textType, offset, flags, charListPtr) } /* debug support */ - +void saveTextToFile(ut, tbPtr) struct ubik_trans *ut; struct textBlock *tbPtr; diff --git a/src/budb/ol_verify.c b/src/budb/ol_verify.c index 7af32766c2..741630ef1b 100644 --- a/src/budb/ol_verify.c +++ b/src/budb/ol_verify.c @@ -22,13 +22,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/budb/procs.c b/src/budb/procs.c index b58ab68864..34770e4acb 100644 --- a/src/budb/procs.c +++ b/src/budb/procs.c @@ -29,14 +29,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include diff --git a/src/budb/server.c b/src/budb/server.c index 4771da746d..65dcbf5793 100644 --- a/src/budb/server.c +++ b/src/budb/server.c @@ -24,15 +24,7 @@ RCSID #include #include #endif - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -66,6 +58,8 @@ RCSID struct ubik_dbase *BU_dbase; struct afsconf_dir *BU_conf; /* for getting cell info */ +int argHandler(struct cmd_syndesc *, void *); + char lcell[MAXKTCREALMLEN]; afs_int32 myHost = 0; int helpOption; @@ -135,8 +129,7 @@ convert_cell_to_ubik(cellinfo, myHost, serverList) * If it were, this routine would never have been called. */ static int -MyBeforeProc(as) - register struct cmd_syndesc *as; +MyBeforeProc(register struct cmd_syndesc *as, void *arock) { helpOption = 0; return 0; @@ -146,12 +139,11 @@ MyBeforeProc(as) * initialize all the supported commands and their arguments */ +void initializeArgHandler() { struct cmd_syndesc *cptr; - int argHandler(); - cmd_SetBeforeProc(MyBeforeProc, NULL); cptr = cmd_CreateSyntax(NULL, argHandler, NULL, "Backup database server"); @@ -183,9 +175,7 @@ initializeArgHandler() } int -argHandler(as, arock) - struct cmd_syndesc *as; - char *arock; +argHandler(struct cmd_syndesc *as, void *arock) { /* globalConfPtr provides the handle for the configuration information */ @@ -623,7 +613,7 @@ main(argc, argv) return (code); } - +void consistencyCheckDb() { /* do consistency checks on structure sizes */ diff --git a/src/budb/struct_ops.c b/src/budb/struct_ops.c index 0377f3bdc2..49be35f698 100644 --- a/src/budb/struct_ops.c +++ b/src/budb/struct_ops.c @@ -107,6 +107,7 @@ printDumpEntry(struct budb_dumpEntry *deptr) * print the hash table structure, i.e. the header structure. */ +void printHashTable(fid, htptr) FILE *fid; struct hashTable *htptr; @@ -311,6 +312,7 @@ printVolInfo(fid, viptr) * currently used for debug only */ +void volFragment_ntoh(netVfPtr, hostVfPtr) struct volFragment *netVfPtr, *hostVfPtr; { @@ -327,6 +329,7 @@ volFragment_ntoh(netVfPtr, hostVfPtr) hostVfPtr->sequence = ntohs(netVfPtr->sequence); } +void volInfo_ntoh(netViPtr, hostViPtr) struct volInfo *netViPtr, *hostViPtr; { @@ -342,6 +345,7 @@ volInfo_ntoh(netViPtr, hostViPtr) hostViPtr->nFrags = ntohl(netViPtr->nFrags); } +void tape_ntoh(netTapePtr, hostTapePtr) struct tape *netTapePtr, *hostTapePtr; { @@ -363,6 +367,7 @@ tape_ntoh(netTapePtr, hostTapePtr) hostTapePtr->useCount = ntohl(netTapePtr->useCount); } +void dump_ntoh(netDumpPtr, hostDumpPtr) struct dump *netDumpPtr, *hostDumpPtr; { @@ -385,6 +390,7 @@ dump_ntoh(netDumpPtr, hostDumpPtr) principal_ntoh(&netDumpPtr->dumper, &hostDumpPtr->dumper); } +void DbHeader_ntoh(netptr, hostptr) struct DbHeader *netptr, *hostptr; { @@ -396,6 +402,7 @@ DbHeader_ntoh(netptr, hostptr) hostptr->lastTapeId = ntohl(netptr->lastTapeId); } +void dumpEntry_ntoh(netptr, hostptr) struct budb_dumpEntry *netptr, *hostptr; { @@ -434,6 +441,7 @@ principal_ntoh(netptr, hostptr) return 0; } +void structDumpHeader_hton(hostPtr, netPtr) struct structDumpHeader *hostPtr, *netPtr; { @@ -442,6 +450,7 @@ structDumpHeader_hton(hostPtr, netPtr) netPtr->size = htonl(hostPtr->size); } +void structDumpHeader_ntoh(netPtr, hostPtr) struct structDumpHeader *hostPtr, *netPtr; { @@ -450,6 +459,7 @@ structDumpHeader_ntoh(netPtr, hostPtr) hostPtr->size = ntohl(netPtr->size); } +void tapeEntry_ntoh(netptr, hostptr) struct budb_tapeEntry *netptr, *hostptr; { @@ -494,6 +504,7 @@ tapeSet_ntoh(netptr, hostptr) return 0; } +void textBlock_hton(hostptr, netptr) struct textBlock *hostptr, *netptr; { @@ -504,6 +515,7 @@ textBlock_hton(hostptr, netptr) netptr->newTextAddr = htonl(hostptr->newTextAddr); } +void textBlock_ntoh(netptr, hostptr) struct textBlock *netptr, *hostptr; { @@ -514,6 +526,7 @@ textBlock_ntoh(netptr, hostptr) hostptr->newTextAddr = ntohl(netptr->newTextAddr); } +void textLock_hton(hostptr, netptr) db_lockP hostptr, netptr; { @@ -525,6 +538,7 @@ textLock_hton(hostptr, netptr) netptr->lockHost = htonl(hostptr->lockHost); } +void textLock_ntoh(netptr, hostptr) db_lockP netptr, hostptr; { @@ -536,6 +550,7 @@ textLock_ntoh(netptr, hostptr) hostptr->lockHost = ntohl(netptr->lockHost); } +void volumeEntry_ntoh(netptr, hostptr) struct budb_volumeEntry *netptr, *hostptr; { @@ -562,7 +577,7 @@ volumeEntry_ntoh(netptr, hostptr) * ------------------------------------- */ - +void copy_ktcPrincipal_to_budbPrincipal(ktcPtr, budbPtr) struct ktc_principal *ktcPtr; struct budb_principal *budbPtr; @@ -666,4 +681,5 @@ default_tapeset(tapesetPtr, dumpname) tapesetPtr->a = 1; tapesetPtr->b = 1; tapesetPtr->maxTapes = 0; + return 0; } diff --git a/src/butc/dbentries.c b/src/butc/dbentries.c index 5da1ba1efa..16f09df491 100644 --- a/src/butc/dbentries.c +++ b/src/butc/dbentries.c @@ -24,6 +24,7 @@ RCSID #include #endif #include +#include #include #include #include @@ -309,6 +310,7 @@ waitDbWatcher() if (message) { printf("Updating database - done\n"); } + return 0; } #define MAXVOLUMESTOADD 100 diff --git a/src/butc/dump.c b/src/butc/dump.c index 5f5b95f63d..56562e4eef 100644 --- a/src/butc/dump.c +++ b/src/butc/dump.c @@ -24,6 +24,7 @@ RCSID #include #endif #include +#include #include #include #include diff --git a/src/butc/lwps.c b/src/butc/lwps.c index 038d5bc7b6..3561d5df9b 100644 --- a/src/butc/lwps.c +++ b/src/butc/lwps.c @@ -14,6 +14,7 @@ RCSID ("$Header$"); #include +#include #ifdef AFS_NT40_ENV #include #include @@ -546,6 +547,7 @@ callOutRoutine(taskId, tapePath, flag, name, dbDumpId, tapecount) * Regardless of error, the closecallout routine will be called * (unless a tape is not mounted in the first place). */ +void unmountTape(taskId, tapeInfoPtr) afs_int32 taskId; struct butm_tapeInfo *tapeInfoPtr; @@ -1922,6 +1924,7 @@ Restorer(newNode) /* this is just scaffolding, creates new tape label with name */ +void GetNewLabel(tapeInfoPtr, pName, AFSName, tapeLabel) struct butm_tapeInfo *tapeInfoPtr; char *pName, *AFSName; @@ -2283,6 +2286,7 @@ Labeller(labelIfPtr) * print out the tape label. */ +void PrintTapeLabel(labelptr) struct butm_tapeLabel *labelptr; { diff --git a/src/butc/read_tape.c b/src/butc/read_tape.c index 0f4aee8462..0e12480544 100644 --- a/src/butc/read_tape.c +++ b/src/butc/read_tape.c @@ -21,6 +21,7 @@ RCSID #include #include #include +#include #include #include @@ -81,6 +82,7 @@ readblock(buffer) return 0; } +void printLabel(tapeLabelPtr) struct tapeLabel *tapeLabelPtr; { @@ -129,6 +131,7 @@ printLabel(tapeLabelPtr) } } +void printHeader(headerPtr, isvolheader) struct volumeHeader *headerPtr; afs_int32 *isvolheader; @@ -381,9 +384,8 @@ writeData(data, size) return 0; } -WorkerBee(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +WorkerBee(struct cmd_syndesc *as, void *arock) { char *tapedev; struct tapeLabel *label; diff --git a/src/butc/recoverDb.c b/src/butc/recoverDb.c index fe40c8ac51..a6d0d7f03e 100644 --- a/src/butc/recoverDb.c +++ b/src/butc/recoverDb.c @@ -24,6 +24,7 @@ RCSID #include #endif #include +#include #include #include #include @@ -51,6 +52,8 @@ struct tapeScanInfo { extern struct tapeConfig globalTapeConfig; extern struct deviceSyncNode *deviceLatch; +static readDump(); + /* PrintDumpLabel * print out the tape (dump) label. */ diff --git a/src/butc/tcmain.c b/src/butc/tcmain.c index 7503c2ee36..2c2a7cc347 100644 --- a/src/butc/tcmain.c +++ b/src/butc/tcmain.c @@ -822,7 +822,7 @@ GetConfigParams(char *filename, afs_int32 port) } static int -WorkerBee(struct cmd_syndesc *as, char *arock) +WorkerBee(struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct rx_securityClass *(securityObjects[3]); diff --git a/src/butc/tcprocs.c b/src/butc/tcprocs.c index 89b01baf12..4bb4f231e3 100644 --- a/src/butc/tcprocs.c +++ b/src/butc/tcprocs.c @@ -27,6 +27,7 @@ RCSID #include #include #include +#include #include #include #include @@ -41,6 +42,11 @@ RCSID #include "error_macros.h" #include "butc_xbsa.h" +static CopyDumpDesc(); +static CopyRestoreDesc(); +static CopyTapeSetDesc(); + + int callPermitted(struct rx_call *call) { @@ -138,7 +144,7 @@ STC_LabelTape(struct rx_call *acid, struct tc_tapeLabel *label, afs_uint32 *task PROCESS pid; #endif struct labelTapeIf *ptr; - statusP statusPtr; + statusP statusPtr = NULL; afs_int32 code; extern int Labeller(); @@ -486,7 +492,7 @@ STC_SaveDb(struct rx_call *rxCall, Date archiveTime, afs_uint32 *taskId) #else PROCESS pid; #endif - statusP statusPtr; + statusP statusPtr = NULL; afs_int32 code = 0; struct saveDbIf *ptr; diff --git a/src/butc/tcstatus.c b/src/butc/tcstatus.c index 79c0c53658..08cbfb9582 100644 --- a/src/butc/tcstatus.c +++ b/src/butc/tcstatus.c @@ -24,6 +24,7 @@ RCSID #include #endif #include +#include #include #include #include diff --git a/src/butc/tcudbprocs.c b/src/butc/tcudbprocs.c index 4e0a754ec2..7e84e5d539 100644 --- a/src/butc/tcudbprocs.c +++ b/src/butc/tcudbprocs.c @@ -28,6 +28,7 @@ RCSID #include #include #include +#include #include #include #include @@ -51,6 +52,10 @@ RCSID extern int dump_namecheck; extern int autoQuery; +static void initTapeBuffering(); +static writeDbDump(); +static restoreDbEntries(); + /* CreateDBDump * create a dump entry for a saved database */ @@ -904,7 +909,7 @@ readDbTape(tapeInfoPtr, rstTapeInfoPtr, query) } static afs_int32 nbytes = 0; /* # bytes left in buffer */ -static +static void initTapeBuffering() { nbytes = 0; diff --git a/src/butc/test.c b/src/butc/test.c index f61c66bcd8..1c09a6d455 100644 --- a/src/butc/test.c +++ b/src/butc/test.c @@ -80,9 +80,8 @@ GetServer(aname) } -static -PerformDump(as) - register struct cmd_syndesc *as; +static int +PerformDump(register struct cmd_syndesc *as, void *arock) { struct rx_connection *aconn; afs_int32 server; @@ -127,11 +126,12 @@ PerformDump(as) exit(1); } printf("dumpid returned %u\n", tdumpID); + + return 0; } -static -PerformRestore(as) - register struct cmd_syndesc *as; +static int +PerformRestore(register struct cmd_syndesc *as, void *arock) { struct rx_connection *aconn; afs_int32 server; @@ -169,11 +169,11 @@ PerformRestore(as) exit(1); } printf("dumpid returned %u\n", tdumpID); + return 0; } -static -CheckDump(as) - register struct cmd_syndesc *as; +static int +CheckDump(register struct cmd_syndesc *as, void *arock) { struct rx_connection *aconn; afs_int32 server; @@ -189,11 +189,11 @@ CheckDump(as) printf("call to TC_CheckDump failed %u\n", code); exit(1); } + return 0; } -static -AbortDump(as) - register struct cmd_syndesc *as; +static int +AbortDump(register struct cmd_syndesc *as, void *arock) { struct rx_connection *aconn; afs_int32 server; @@ -209,11 +209,11 @@ AbortDump(as) printf("call to TC_AbortDump failed %u\n", code); exit(1); } + return 0; } -static -WaitForDump(as) - register struct cmd_syndesc *as; +static int +WaitForDump(register struct cmd_syndesc *as, void *arock) { struct rx_connection *aconn; afs_int32 server; @@ -229,11 +229,11 @@ WaitForDump(as) printf("call to TC_WaitForDump failed %u\n", code); exit(1); } + return 0; } -static -EndDump(as) - register struct cmd_syndesc *as; +static int +EndDump(register struct cmd_syndesc *as, void *arock) { struct rx_connection *aconn; afs_int32 server; @@ -249,12 +249,11 @@ EndDump(as) printf("call to TC_EndDump failed %u\n", code); exit(1); } + return 0; } -static -MyBeforeProc(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +MyBeforeProc(struct cmd_syndesc *as, void *arock) { afs_int32 code; @@ -295,20 +294,20 @@ main(argc, argv) #endif cmd_SetBeforeProc(MyBeforeProc, NULL); - ts = cmd_CreateSyntax("dump", PerformDump, 0, "perform a dump"); + ts = cmd_CreateSyntax("dump", PerformDump, NULL, "perform a dump"); - ts = cmd_CreateSyntax("restore", PerformRestore, 0, "perform a restore"); + ts = cmd_CreateSyntax("restore", PerformRestore, NULL, "perform a restore"); - ts = cmd_CreateSyntax("check", CheckDump, 0, "check a dump"); + ts = cmd_CreateSyntax("check", CheckDump, NULL, "check a dump"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id"); - ts = cmd_CreateSyntax("abort", AbortDump, 0, "abort a dump"); + ts = cmd_CreateSyntax("abort", AbortDump, NULL, "abort a dump"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id"); - ts = cmd_CreateSyntax("wait", WaitForDump, 0, "wait for a dump"); + ts = cmd_CreateSyntax("wait", WaitForDump, NULL, "wait for a dump"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id"); - ts = cmd_CreateSyntax("end", EndDump, 0, "end a dump"); + ts = cmd_CreateSyntax("end", EndDump, NULL, "end a dump"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id"); code = cmd_Dispatch(argc, argv); diff --git a/src/butm/file_tm.c b/src/butm/file_tm.c index e6b71ab03e..1e858d38d1 100644 --- a/src/butm/file_tm.c +++ b/src/butm/file_tm.c @@ -24,6 +24,7 @@ RCSID #include #include #include +#include #include #include #include @@ -626,6 +627,7 @@ ShutdownAccess(usd_handle_t fid) * dataSize - bytes used on the tape */ +void incSize(info, dataSize) struct butm_tapeInfo *info; afs_uint32 dataSize; @@ -647,6 +649,7 @@ incSize(info, dataSize) * dataSize - bytes used on the tape */ +void incPosition(info, fid, dataSize) struct butm_tapeInfo *info; usd_handle_t fid; diff --git a/src/cf/kerberos.m4 b/src/cf/kerberos.m4 index e471ed21bb..f4a31ed8a4 100644 --- a/src/cf/kerberos.m4 +++ b/src/cf/kerberos.m4 @@ -210,7 +210,7 @@ if test "X$KRB5VENDOR" != X && test "X$KRB5VENDOR" != XK5SSL; then CPPFLAGS="$CPPFLAGS $KRB5CFLAGS" save_LIBS="$LIBS" LIBS="$LIBS $KRB5LIBS" - AC_CHECK_FUNCS([add_to_error_table add_error_table krb5_princ_size krb5_principal_get_comp_string encode_krb5_enc_tkt_part encode_krb5_ticket]) + AC_CHECK_FUNCS([add_to_error_table add_error_table krb5_princ_size krb5_principal_get_comp_string encode_krb5_enc_tkt_part encode_krb5_ticket krb5_c_encrypt krb5_c_encrypt_length krb5_cc_register]) AC_CHECK_FUNCS([krb5_524_convert_creds], , [AC_CHECK_FUNCS([krb524_convert_creds_kdc], , [AC_CHECK_LIB([krb524], [krb524_convert_creds_kdc], @@ -269,8 +269,13 @@ else ENABLE_KRB5='#' fi +if test "x$ac_cv_krb5_cc_register_exists" = "xyes"; then + AC_DEFINE(HAVE_KRB5_CC_REGISTER, 1, [define if krb5_cc_register exists]) +fi + AC_SUBST(DISABLE_KRB5) AC_SUBST(ENABLE_KRB5) +AC_SUBST(BUILD_KRB5) AC_SUBST(KRB5CFLAGS) AC_SUBST(KRB5LIBS) dnl KRB5LIBS_RAW is not used; only output in case -lcom_err is missed. diff --git a/src/cf/linux-test1.m4 b/src/cf/linux-test1.m4 index f2fe2bbe78..6bee0e5ed8 100644 --- a/src/cf/linux-test1.m4 +++ b/src/cf/linux-test1.m4 @@ -2,9 +2,12 @@ # [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE]) # AC_DEFUN([AC_TRY_KBUILD26],[ rm -fr conftest.dir + if test "x$ac_linux_kbuild_requires_extra_cflags" = "xyes" ; then + CFLAGS_PREFIX='EXTRA_' + fi if mkdir conftest.dir && cat >conftest.dir/Makefile <<_ACEOF && -CFLAGS += $CPPFLAGS +${CFLAGS_PREFIX}CFLAGS += $CPPFLAGS obj-m += conftest.o _ACEOF @@ -24,8 +27,9 @@ $2 MODULE_LICENSE("http://www.openafs.org/dl/license10.html"); _ACEOF - echo make -C $LINUX_KERNEL_PATH M=$SRCDIR_PARENT/conftest.dir modules KBUILD_VERBOSE=1 >&AS_MESSAGE_LOG_FD - make -C $LINUX_KERNEL_PATH M=$SRCDIR_PARENT/conftest.dir modules KBUILD_VERBOSE=1 >&AS_MESSAGE_LOG_FD 2>conftest.err + echo make -C $LINUX_KERNEL_PATH M=$SRCDIR_PARENT/conftest.dir modules KBUILD_VERBOSE=1 >&AS_MESSAGE_LOG_FD && + make -C $LINUX_KERNEL_PATH M=$SRCDIR_PARENT/conftest.dir modules KBUILD_VERBOSE=1 >&AS_MESSAGE_LOG_FD 2>conftest.err && + ! grep "^WARNING: .* undefined!$" conftest.err >/dev/null 2>&1 then [$3] else sed '/^ *+/d' conftest.err >&AS_MESSAGE_LOG_FD @@ -42,8 +46,10 @@ _ACEOF # AC_DEFUN([AC_TRY_KBUILD24], [ ac_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="-I$LINUX_KERNEL_PATH/include -D__KERNEL__ $CPPFLAGS" - AC_TRY_COMPILE([$1], [$2], [$3], [$4]) + CPPFLAGS="-I$LINUX_KERNEL_PATH/include -D__KERNEL__ -Werror-implicit-function-declaration $CPPFLAGS" + AC_TRY_COMPILE([ +#include +$1], [$2], [$3], [$4]) CPPFLAGS="$ac_save_CPPFLAGS"]) @@ -77,3 +83,16 @@ lose ],:,AC_MSG_RESULT(no) AC_MSG_FAILURE([Fix problem or use --disable-kernel-module...])) AC_MSG_RESULT(yes)]) + +AC_DEFUN([LINUX_KBUILD_USES_EXTRA_CFLAGS], [ + AC_MSG_CHECKING([if linux kbuild requires EXTRA_CFLAGS]) + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS=-Wall + AC_TRY_KBUILD( +[#include +#include ], + [], + ac_linux_kbuild_requires_extra_cflags=no, + ac_linux_kbuild_requires_extra_cflags=yes) + CPPFLAGS="$save_CPPFLAGS" + AC_MSG_RESULT($ac_linux_kbuild_requires_extra_cflags)]) diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 51b9e2e9f6..e0e1bb814a 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -41,6 +41,15 @@ lose ac_cv_linux_completion_h_exists=no)]) AC_MSG_RESULT($ac_cv_linux_completion_h_exists)]) +AC_DEFUN([LINUX_EXPORTFS_H_EXISTS], [ + AC_MSG_CHECKING([for linux/exportfs.h existence]) + AC_CACHE_VAL([ac_cv_linux_exportfs_h_exists], [ + AC_TRY_KBUILD( +[#include ], +[return;], + ac_cv_linux_exportfs_h_exists=yes, + ac_cv_linux_exportfs_h_exists=no)]) + AC_MSG_RESULT($ac_cv_linux_exportfs_h_exists)]) AC_DEFUN([LINUX_DEFINES_FOR_EACH_PROCESS], [ AC_MSG_CHECKING([for defined for_each_process]) @@ -871,3 +880,99 @@ fl_owner_t id; ac_cv_linux_func_f_flush_takes_fl_owner_t=no)]) AC_MSG_RESULT($ac_cv_linux_func_f_flush_takes_fl_owner_t)]) +AC_DEFUN([LINUX_HAVE_KMEM_CACHE_T], [ + AC_MSG_CHECKING([whether kmem_cache_t exists]) + AC_CACHE_VAL([ac_cv_linux_have_kmem_cache_t], [ + AC_TRY_KBUILD( +[#include ], +[kmem_cache_t *k;], + ac_cv_linux_have_kmem_cache_t=yes, + ac_cv_linux_have_kmem_cache_t=no)]) + AC_MSG_RESULT($ac_cv_linux_have_kmem_cache_t)]) + +AC_DEFUN([LINUX_KMEM_CACHE_CREATE_TAKES_DTOR], [ + AC_MSG_CHECKING([whether kmem_cache_create takes a destructor argument]) + AC_CACHE_VAL([ac_cv_linux_kmem_cache_create_takes_dtor], [ + AC_TRY_KBUILD( +[#include ], +[kmem_cache_create(NULL, 0, 0, 0, NULL, NULL);], + ac_cv_linux_kmem_cache_create_takes_dtor=yes, + ac_cv_linux_kmem_cache_create_takes_dtor=no)]) + AC_MSG_RESULT($ac_cv_linux_kmem_cache_create_takes_dtor)]) + +AC_DEFUN([LINUX_FS_STRUCT_FOP_HAS_SENDFILE], [ + AC_MSG_CHECKING([for sendfile in struct file_operations]) + AC_CACHE_VAL([ac_cv_linux_fs_struct_fop_has_sendfile], [ + AC_TRY_KBUILD( +[#include ], +[struct file_operations _fop; +_fop.sendfile(NULL, NULL, 0, 0, NULL);], + ac_cv_linux_fs_struct_fop_has_sendfile=yes, + ac_cv_linux_fs_struct_fop_has_sendfile=no)]) + AC_MSG_RESULT($ac_cv_linux_fs_struct_fop_has_sendfile)]) + +AC_DEFUN([LINUX_HAVE_SVC_ADDR_IN], [ + AC_MSG_CHECKING([whether svc_addr_in exists]) + AC_CACHE_VAL([ac_cv_linux_have_svc_addr_in], [ + AC_TRY_KBUILD( +[#include ], +[svc_addr_in(NULL);], + ac_cv_linux_have_svc_addr_in=yes, + ac_cv_linux_have_svc_addr_in=no)]) + AC_MSG_RESULT($ac_cv_linux_have_svc_addr_in)]) + +AC_DEFUN([LINUX_FS_STRUCT_FOP_HAS_SPLICE], [ + AC_MSG_CHECKING([for splice_write and splice_read in struct file_operations]) + AC_CACHE_VAL([ac_cv_linux_fs_struct_fop_has_splice], [ + AC_TRY_KBUILD( +[#include ], +[struct file_operations _fop; +_fop.splice_write(NULL, NULL, NULL, 0, 0); +_fop.splice_read(NULL, NULL, NULL, 0, 0);], + ac_cv_linux_fs_struct_fop_has_splice=yes, + ac_cv_linux_fs_struct_fop_has_splice=no)]) + AC_MSG_RESULT($ac_cv_linux_fs_struct_fop_has_splice)]) + +AC_DEFUN([LINUX_KEY_TYPE_H_EXISTS], [ + AC_MSG_CHECKING([whether linux/key-type.h exists]) + AC_CACHE_VAL([ac_cv_linux_key_type_h_exists], [ + AC_TRY_KBUILD( +[#include ], +[return;], + ac_cv_linux_key_type_h_exists=yes, + ac_cv_linux_key_type_h_exists=no)]) + AC_MSG_RESULT($ac_cv_linux_key_type_h_exists)]) + +AC_DEFUN([LINUX_HAVE_CURRENT_KERNEL_TIME], [ + AC_MSG_CHECKING([for current_kernel_time()]) + AC_CACHE_VAL([ac_cv_linux_have_current_kernel_time], [ + AC_TRY_KBUILD( +[#include ], +[struct timespec s = current_kernel_time();], + ac_cv_linux_have_current_kernel_time=yes, + ac_cv_linux_have_current_kernel_time=no)]) + AC_MSG_RESULT($ac_cv_linux_have_current_kernel_time)]) + +AC_DEFUN([LINUX_KMEM_CACHE_INIT], [ + AC_MSG_CHECKING([for new kmem_cache init function parameters]) + AC_CACHE_VAL([ac_cv_linux_kmem_cache_init], [ + AC_TRY_KBUILD( +[#include ], +[extern struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, + unsigned long, + void (*)(struct kmem_cache *, void *)); +return;], + ac_cv_linux_kmem_cache_init=yes, + ac_cv_linux_kmem_cache_init=no)]) + AC_MSG_RESULT($ac_cv_linux_kmem_cache_init)]) + +AC_DEFUN([LINUX_SYSCTL_TABLE_CHECKING], [ + AC_MSG_CHECKING([for sysctl table checking]) + AC_CACHE_VAL([ac_cv_linux_sysctl_table_checking], [ + AC_TRY_KBUILD( +[#include ], +[ sysctl_check_table(NULL);], + ac_cv_linux_sysctl_table_checking=yes, + ac_cv_linux_sysctl_table_checking=no)]) + AC_MSG_RESULT($ac_cv_linux_sysctl_table_checking)]) + diff --git a/src/cf/osconf.m4 b/src/cf/osconf.m4 index a4cc41f0f9..00147706a9 100644 --- a/src/cf/osconf.m4 +++ b/src/cf/osconf.m4 @@ -18,6 +18,8 @@ KERN_OPTMZ=-O DBG=-g OPTMZ=-O LWP_DBG=-g +NO_STRIP_BIN=-ns +NO_STRIP_KRB=-ns LWP_OPTMZ=-O PAM_DBG=-g PAM_OPTMZ= @@ -897,7 +899,7 @@ case $AFS_SYSNAME in SHLIB_CFLAGS="-KPIC" SHLIB_LDFLAGS="-G -Bsymbolic" TXLIBS="-lcurses" - XCFLAGS64='${XCFLAGS} -xarch=v9' + XCFLAGS64='${XCFLAGS} -m64' XCFLAGS="-dy -Bdynamic" XLIBELFA="-lelf" XLIBKVM="-lkvm" @@ -1009,7 +1011,7 @@ case $AFS_SYSNAME in SHLIB_CFLAGS="-KPIC" SHLIB_LDFLAGS="-G -Bsymbolic" TXLIBS="-lcurses" - XCFLAGS64='${XCFLAGS} -xarch=amd64' + XCFLAGS64='${XCFLAGS} -m64' XCFLAGS="-dy -Bdynamic" XLIBELFA="-lelf" XLIBKVM="-lkvm" @@ -1100,6 +1102,8 @@ fi if test "x$enable_debug" = "xno"; then DBG= + NO_STRIP_BIN= + NO_STRIP_KRB=-s fi if test "x$enable_optimize" = "xno"; then @@ -1114,6 +1118,19 @@ if test "x$enable_optimize_lwp" = "xno"; then LWP_OPTMZ= fi +if test "x$enable_strip_binaries" != "xno"; then + if test "x$enable_strip_binaries" = "xmaybe" -a "x$enable_debug" = "xyes"; then + NO_STRIP_BIN=-ns + NO_STRIP_KRB=-ns + else + NO_STRIP_BIN= + NO_STRIP_KRB=-s + fi +else + NO_STRIP_BIN=-ns + NO_STRIP_KRB=-ns +fi + AC_SUBST(CCXPG2) AC_SUBST(CCOBJ) AC_SUBST(AFSD_LIBS) @@ -1134,6 +1151,8 @@ AC_SUBST(MT_CC) AC_SUBST(MT_CFLAGS) AC_SUBST(MT_LIBS) AC_SUBST(MV) +AC_SUBST(NO_STRIP_BIN) +AC_SUBST(NO_STRIP_KRB) AC_SUBST(OPTMZ) AC_SUBST(PAM_CFLAGS) AC_SUBST(PAM_LIBS) diff --git a/src/cmd/cmd.c b/src/cmd/cmd.c index c83aaebd54..b0e504b108 100644 --- a/src/cmd/cmd.c +++ b/src/cmd/cmd.c @@ -30,9 +30,9 @@ struct cmd_token { static int dummy; /* non-null ptr used for flag existence */ static struct cmd_syndesc *allSyntax = 0; static int noOpcodes = 0; -static int (*beforeProc) (struct cmd_syndesc * ts, char *beforeRock) = - 0, (*afterProc) (struct cmd_syndesc * ts, char *afterRock) = 0; -static char *beforeRock, *afterRock; +static int (*beforeProc) (struct cmd_syndesc * ts, void *beforeRock) = NULL; +static int (*afterProc) (struct cmd_syndesc * ts, void *afterRock) = NULL; +static void *beforeRock, *afterRock; static char initcmd_opcode[] = "initcmd"; /*Name of initcmd opcode */ /* take name and string, and return null string if name is empty, otherwise return @@ -168,7 +168,7 @@ PrintParmHelp(register struct cmd_parmdesc *aparm) extern char *AFSVersion; static int -VersionProc(register struct cmd_syndesc *as, char *arock) +VersionProc(register struct cmd_syndesc *as, void *arock) { printf("%s\n", AFSVersion); return 0; @@ -272,7 +272,7 @@ PrintFlagHelp(register struct cmd_syndesc *as) } static int -AproposProc(register struct cmd_syndesc *as, char *arock) +AproposProc(register struct cmd_syndesc *as, void *arock) { register struct cmd_syndesc *ts; char *tsub; @@ -297,7 +297,7 @@ AproposProc(register struct cmd_syndesc *as, char *arock) } static int -HelpProc(register struct cmd_syndesc *as, char *arock) +HelpProc(register struct cmd_syndesc *as, void *arock) { register struct cmd_syndesc *ts; register struct cmd_item *ti; @@ -344,8 +344,8 @@ HelpProc(register struct cmd_syndesc *as, char *arock) } int -cmd_SetBeforeProc(int (*aproc) (struct cmd_syndesc * ts, char *beforeRock), - char *arock) +cmd_SetBeforeProc(int (*aproc) (struct cmd_syndesc * ts, void *beforeRock), + void *arock) { beforeProc = aproc; beforeRock = arock; @@ -353,8 +353,8 @@ cmd_SetBeforeProc(int (*aproc) (struct cmd_syndesc * ts, char *beforeRock), } int -cmd_SetAfterProc(int (*aproc) (struct cmd_syndesc * ts, char *afterRock), - char *arock) +cmd_SetAfterProc(int (*aproc) (struct cmd_syndesc * ts, void *afterRock), + void *arock) { afterProc = aproc; afterRock = arock; @@ -380,8 +380,8 @@ SortSyntax(struct cmd_syndesc *as) struct cmd_syndesc * cmd_CreateSyntax(char *aname, - int (*aproc) (struct cmd_syndesc * ts, char *arock), - char *arock, char *ahelp) + int (*aproc) (struct cmd_syndesc * ts, void *arock), + void *arock, char *ahelp) { register struct cmd_syndesc *td; @@ -481,7 +481,7 @@ cmd_AddParm(register struct cmd_syndesc *as, char *aname, int atype, strcpy(tp->name, aname); tp->type = atype; tp->flags = aflags; - tp->items = (struct cmd_item *)0; + tp->items = NULL; if (ahelp) { tp->help = (char *)malloc(strlen(ahelp) + 1); assert(tp->help); @@ -556,7 +556,7 @@ ResetSyntax(register struct cmd_syndesc *as) default: break; } - tp->items = (struct cmd_item *)0; + tp->items = NULL; } } diff --git a/src/cmd/cmd.p.h b/src/cmd/cmd.p.h index d8500321a3..fc143ff844 100644 --- a/src/cmd/cmd.p.h +++ b/src/cmd/cmd.p.h @@ -51,8 +51,8 @@ struct cmd_syndesc { char *name; /* subcommand name */ char *a0name; /* command name from argv[0] */ char *help; /* help description */ - int (*proc) (struct cmd_syndesc * ts, char *arock); - char *rock; + int (*proc) (struct cmd_syndesc * ts, void *arock); + void *rock; int nParms; /* number of parms */ afs_int32 flags; /* random flags */ struct cmd_parmdesc parms[CMD_MAXPARMS]; /* parms themselves */ @@ -60,14 +60,14 @@ struct cmd_syndesc { extern struct cmd_syndesc *cmd_CreateSyntax(char *namep, int (*aprocp) (struct cmd_syndesc - * ts, char *arock), - char *rockp, char *helpp); + * ts, void *arock), + void *rockp, char *helpp); extern int - cmd_SetBeforeProc(int (*aproc) (struct cmd_syndesc * ts, char *beforeRock), - char *arock); + cmd_SetBeforeProc(int (*aproc) (struct cmd_syndesc * ts, void *beforeRock), + void *arock); extern int - cmd_SetAfterProc(int (*aproc) (struct cmd_syndesc * ts, char *afterRock), - char *arock); + cmd_SetAfterProc(int (*aproc) (struct cmd_syndesc * ts, void *afterRock), + void *arock); extern int cmd_CreateAlias(struct cmd_syndesc *as, char *aname); extern int cmd_Seek(struct cmd_syndesc *as, int apos); extern int cmd_AddParm(struct cmd_syndesc *as, char *aname, int atype, diff --git a/src/cmd/test/ctest.c b/src/cmd/test/ctest.c index 93c86d5672..4d1bcbb838 100644 --- a/src/cmd/test/ctest.c +++ b/src/cmd/test/ctest.c @@ -16,19 +16,15 @@ RCSID #include "cmd.h" #include -static -cproc1(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +cproc1(struct cmd_syndesc *as, void *arock) { printf("in the apple command\n"); return 0; } -static -cproc2(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +cproc2(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; printf("in the pear command\n"); @@ -43,9 +39,8 @@ cproc2(as, arock) return 0; } -main(argc, argv) - int argc; - char **argv; +int +main(int argc, char **argv) { register struct cmd_syndesc *ts; diff --git a/src/cmd/test/dtest.c b/src/cmd/test/dtest.c index 96d42eaaba..f9577a292a 100644 --- a/src/cmd/test/dtest.c +++ b/src/cmd/test/dtest.c @@ -16,10 +16,8 @@ RCSID #include "cmd.h" #include -static -cproc(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +cproc(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; printf("in the pear command\n"); @@ -32,9 +30,8 @@ cproc(as, arock) return 0; } -main(argc, argv) - int argc; - char **argv; +int +main(int argc, char **argv) { register struct cmd_syndesc *ts; diff --git a/src/cmd/test/itest.c b/src/cmd/test/itest.c index a4e537a3da..619f889caa 100644 --- a/src/cmd/test/itest.c +++ b/src/cmd/test/itest.c @@ -17,19 +17,15 @@ RCSID #include #include -static -cproc1(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +cproc1(struct cmd_syndesc *as, void *arock) { printf("in the apple command\n"); return 0; } -static -cproc2(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +cproc2(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; printf("in the pear command\n"); @@ -44,17 +40,14 @@ cproc2(as, arock) return 0; } -static void -cproc3(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +cproc3(struct cmd_syndesc *as, void *arock) { exit(0); } -main(argc, argv) - int argc; - char **argv; +int +main(int argc, char **argv) { register struct cmd_syndesc *ts; char tline[1000]; diff --git a/src/comerr/error_table_nt.c b/src/comerr/error_table_nt.c index 9e6ffaaf64..2d928c6dfc 100755 --- a/src/comerr/error_table_nt.c +++ b/src/comerr/error_table_nt.c @@ -1,1335 +1,1335 @@ - -/* A Bison parser, made from error_table.y with Bison version GNU Bison version 1.24 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define ERROR_TABLE 258 -#define ERROR_CODE_ENTRY 259 -#define END 260 -#define INDEX 261 -#define PREFIX 262 -#define ID 263 -#define BASE 264 -#define NL 265 -#define STRING 266 -#define QUOTED_STRING 267 -#define NUMBER 268 - -#line 1 "error_table.y" - -#include -#include -#include "compiler.h" - -RCSID("$Header$"); - -/* - * - * Copyright 1986, 1987 by the MIT Student Information Processing Board - * - * For copyright info, see mit-sipb-cr.h. - */ -#ifndef AFS_NT40_ENV -#include -#endif -#include -#include -#include -#ifdef AFS_NT40_ENV -#include -#include -#else -#include -#endif -#include -#include "error_table.h" -#include "mit-sipb-cr.h" - -/* - * If __STDC__ is defined, function prototypes in the SunOS 5.5.1 lex - * and yacc templates are visible. We turn this on explicitly on - * NT because the prototypes help supress certain warning from the - * Microsoft C compiler. - */ - -#ifdef AFS_NT40_ENV -#include -# ifndef __STDC__ -# define __STDC__ 1 -# endif -#endif - -#include -#include -#include - -#include "internal.h" - -int char_to_num(char c); -char *gensym(const char *x); -char *current_token = (char *)NULL; -extern char *table_name; - -char *ds(const char *string); -char *quote(const char *string); -void set_table_1num(char *string); -int char_to_1num(char c); -void add_ec(const char *name, const char *description); -void add_ec_val(const char *name, const char *val, const char *description); -void put_ecs(void); -void set_table_num(char *string); -void set_table_fun(char *astring); -void set_id(const char *, const char *); -void set_base(const char *); -void set_prefix(const char *); -void add_index(const char *); - - -#line 70 "error_table.y" -typedef union { - char *dynstr; -} YYSTYPE; -#line 77 "error_table.y" - - -#ifndef YYLTYPE -typedef - struct yyltype - { - int timestamp; - int first_line; - int first_column; - int last_line; - int last_column; - char *text; - } - yyltype; - -#define YYLTYPE yyltype -#endif - -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 37 -#define YYFLAG -32768 -#define YYNTBASE 16 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 268 ? yytranslate[x] : 26) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 1, 4, 12, 13, 16, 19, 21, 23, 25, - 29, 32, 37, 44, 47, 50, 53, 54, 56 -}; - -static const short yyrhs[] = { -1, - 16, 17, 0, 18, 3, 19, 18, 22, 5, 18, - 0, 0, 18, 10, 0, 20, 21, 0, 21, 0, - 13, 0, 11, 0, 22, 23, 10, 0, 23, 10, - 0, 4, 24, 14, 25, 0, 4, 24, 15, 11, - 14, 25, 0, 6, 13, 0, 7, 11, 0, 9, - 13, 0, 0, 11, 0, 12, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 82, 82, 84, 92, 92, 94, 97, 104, 111, 117, - 118, 121, 125, 131, 135, 146, 150, 153, 158 -}; - -static const char * const yytname[] = { "$","error","$undefined.","ERROR_TABLE", -"ERROR_CODE_ENTRY","END","INDEX","PREFIX","ID","BASE","NL","STRING","QUOTED_STRING", -"NUMBER","','","'='","error_tables","error_table","maybe_blank_lines","header", -"table_fun","table_id","error_codes","ec_entry","ec_name","description","" -}; -#endif - -static const short yyr1[] = { 0, - 16, 16, 17, 18, 18, 19, 19, 20, 21, 22, - 22, 23, 23, 23, 23, 23, 23, 24, 25 -}; - -static const short yyr2[] = { 0, - 0, 2, 7, 0, 2, 2, 1, 1, 1, 3, - 2, 4, 6, 2, 2, 2, 0, 1, 1 -}; - -static const short yydefact[] = { 1, - 4, 2, 0, 0, 5, 9, 8, 4, 0, 7, - 0, 6, 0, 0, 0, 0, 17, 0, 18, 0, - 14, 15, 16, 4, 0, 11, 0, 0, 3, 10, - 19, 12, 0, 0, 13, 0, 0 -}; - -static const short yydefgoto[] = { 1, - 2, 3, 8, 9, 10, 17, 18, 20, 32 -}; - -static const short yypact[] = {-32768, - 5,-32768, -2, 7,-32768,-32768,-32768,-32768, 10,-32768, - 0,-32768, 11, 6, 12, 13, 8, 1,-32768, -12, --32768,-32768,-32768,-32768, 14,-32768, 15, 17, 19,-32768, --32768,-32768, 16, 15,-32768, 25,-32768 -}; - -static const short yypgoto[] = {-32768, --32768, -8,-32768,-32768, 22,-32768, 18,-32768, -1 -}; - - -#define YYLAST 35 - - -static const short yytable[] = { 11, - 4, 27, 28, 13, 36, 14, 15, 5, 16, 5, - 26, 13, 24, 14, 15, 29, 16, 6, 21, 7, - 6, 19, 22, 30, 37, 23, 31, 33, 5, 34, - 12, 0, 35, 0, 25 -}; - -static const short yycheck[] = { 8, - 3, 14, 15, 4, 0, 6, 7, 10, 9, 10, - 10, 4, 5, 6, 7, 24, 9, 11, 13, 13, - 11, 11, 11, 10, 0, 13, 12, 11, 10, 14, - 9, -1, 34, -1, 17 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 3: -#line 87 "error_table.y" -{ table_name = ds(yyvsp[-4].dynstr); - current_token = table_name; - put_ecs(); ; - break;} -case 6: -#line 95 "error_table.y" -{ current_token = yyvsp[-1].dynstr; - yyval.dynstr = yyvsp[0].dynstr; ; - break;} -case 7: -#line 98 "error_table.y" -{ current_token = yyvsp[0].dynstr; - set_table_fun(ds("1")); - yyval.dynstr = yyvsp[0].dynstr; - ; - break;} -case 8: -#line 105 "error_table.y" -{ current_token = yyvsp[0].dynstr; - set_table_fun(yyvsp[0].dynstr); - yyval.dynstr = yyvsp[0].dynstr; ; - break;} -case 9: -#line 112 "error_table.y" -{ current_token = yyvsp[0].dynstr; - set_table_num(yyvsp[0].dynstr); - yyval.dynstr = yyvsp[0].dynstr; ; - break;} -case 12: -#line 122 "error_table.y" -{ add_ec(yyvsp[-2].dynstr, yyvsp[0].dynstr); - free(yyvsp[-2].dynstr); - free(yyvsp[0].dynstr); ; - break;} -case 13: -#line 126 "error_table.y" -{ add_ec_val(yyvsp[-4].dynstr, yyvsp[-2].dynstr, yyvsp[0].dynstr); - free(yyvsp[-4].dynstr); - free(yyvsp[-2].dynstr); - free(yyvsp[0].dynstr); - ; - break;} -case 14: -#line 132 "error_table.y" -{ add_index(yyvsp[0].dynstr); - free(yyvsp[0].dynstr); - ; - break;} -case 15: -#line 136 "error_table.y" -{ set_prefix(yyvsp[0].dynstr); - free(yyvsp[0].dynstr); - ; - break;} -case 16: -#line 147 "error_table.y" -{ set_base(yyvsp[0].dynstr); - free(yyvsp[0].dynstr); - ; - break;} -case 18: -#line 154 "error_table.y" -{ yyval.dynstr = ds(yyvsp[0].dynstr); - current_token = yyval.dynstr; ; - break;} -case 19: -#line 159 "error_table.y" -{ yyval.dynstr = ds(yyvsp[0].dynstr); - current_token = yyval.dynstr; ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 163 "error_table.y" - - -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern FILE *hfile, *cfile, *msfile; -extern int use_msf; -char st_prefix[] = ""; -char *prefix = st_prefix; - -static afs_int32 gensym_n = 0; - -char *gensym(const char *x) -{ - char *symbol; - if (!gensym_n) { - struct timeval tv; - gettimeofday(&tv, (void *)0); - gensym_n = (tv.tv_sec%10000)*100 + tv.tv_usec/10000; - } - symbol = (char *)malloc(32 * sizeof(char)); - gensym_n++; - sprintf(symbol, "et%ld", (long int) gensym_n); - return(symbol); -} - -char * -ds(const char *string) -{ - char *rv; - rv = (char *)malloc(strlen(prefix)+strlen(string)+1); - strcpy(rv, prefix); - strcat(rv, string); - return(rv); -} - -char * -quote(const char *string) -{ - char *rv; - rv = (char *)malloc(strlen(string)+3); - strcpy(rv, "\""); - strcat(rv, string); - strcat(rv, "\""); - return(rv); -} - -afs_int32 table_number = 0; -int current = 0; -char **error_codes = (char **)NULL; - -void add_ec(const char *name, const char *description) -{ - if (msfile) { - if (current > 0) -#ifndef sun - fprintf(msfile, "%d\t%s\n", current, description); -#else - fprintf(msfile, "%d %s\n", current, description); -#endif /* !sun */ - } else { - fprintf(cfile, "\t\"%s\",\n", description); - } - if (error_codes == (char **)NULL) { - error_codes = (char **)malloc(sizeof(char *)); - *error_codes = (char *)NULL; - } - error_codes = (char **)realloc((char *)error_codes, - (current + 2)*sizeof(char *)); - error_codes[current++] = ds(name); - error_codes[current] = (char *)NULL; -} - -void add_ec_val(const char *name, const char *val, const char *description) -{ - const int ncurrent = atoi(val); - if (ncurrent < current) { - fprintf(stderr,"Error code %s (%d) out of order", name, - current); - return; - } - - while (ncurrent > current) { - if (!msfile) - fputs("\t(char *)0,\n", cfile); - current++; - } - if (msfile) { - if (current > 0) -#ifndef sun - fprintf(msfile, "%d\t%s\n", current, description); -#else - fprintf(msfile, "%d %s\n", current, description); -#endif /* ! sun */ - } else { - fprintf(cfile, "\t\"%s\",\n", description); - } - if (error_codes == (char **)NULL) { - error_codes = (char **)malloc(sizeof(char *)); - *error_codes = (char *)NULL; - } - error_codes = (char **)realloc((char *)error_codes, - (current + 2)*sizeof(char *)); - error_codes[current++] = ds(name); - error_codes[current] = (char *)NULL; -} - -void add_index(const char *val) -{ - const int ncurrent = atoi(val); - if (ncurrent < current) { - fprintf(stderr,"Index (%d) attempt to go backwards", - current); - return; - } - - if (error_codes == (char **)NULL) { - error_codes = (char **)malloc((ncurrent + 1) * sizeof(char *)); - } else { - error_codes = (char **)realloc((char *)error_codes, - (ncurrent + 1)*sizeof(char *)); - } - while (ncurrent > current) { - if (!msfile) - fputs("\t(char *)0,\n", cfile); - error_codes[current++] = (char *)NULL; - } -} - -/* -void set_id(const char *id, const char *text) -{ -} -*/ - -void set_prefix(const char *val) -{ - char *new; - - if (*val) { - new = malloc(strlen(val)+2); - strcpy(new, val); - strcat(new, "_"); - } else { - new = malloc(1); - *new = 0; - } - if (prefix != st_prefix) { - free(prefix); - } - prefix = new; -} - -void set_base(const char *base) -{ - table_number = atoi(base); -} - -void put_ecs(void) -{ - int i; - for (i = 0; i < current; i++) { - if (error_codes[i] != (char *)NULL) - fprintf(hfile, "#define %-40s (%ldL)\n", - error_codes[i], (long int) table_number + i); - } - put_ecs_postlog(); -} - -/* - * char_to_num -- maps letters and numbers into a small numbering space - * uppercase -> 1-26 - * lowercase -> 27-52 - * digits -> 53-62 - * underscore-> 63 - */ - -static const char char_set[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; - -int char_to_num(char c) -{ - const char *where; - int diff; - - where = strchr (char_set, c); - if (where) { - diff = where - char_set + 1; - assert (diff < (1 << ERRCODE_RANGE)); - return diff; - } - else if (isprint (c)) - fprintf (stderr, - "Illegal character `%c' in error table name\n", - c); - else - fprintf (stderr, - "Illegal character %03o in error table name\n", - c); - exit (1); -} - -void set_table_num(char *string) -{ - if (msfile) { - set_table_1num(string); - return; - } - if (strlen(string) > 4) { - fprintf(stderr, "Table name %s too long, truncated ", - string); - string[4] = '\0'; - fprintf(stderr, "to %s\n", string); - } - if (char_to_num (string[0]) > char_to_num ('z')) { - fprintf (stderr, "%s%s%s%s", - "First character of error table name must be ", - "a letter; name ``", - string, "'' rejected\n"); - exit (1); - } - while (*string != '\0') { - table_number = (table_number << BITS_PER_CHAR) - + char_to_num(*string); - string++; - } - table_number = table_number << ERRCODE_RANGE; - current = 0; - if (error_codes) - error_codes[current] = (char *)NULL; - if (!msfile) { - fprintf(cfile, - "static const char * const text%s[] = {\n", - cot_suffix(count_of_tables)); /* } */ - } -} - -void set_table_fun(char *astring) -{ - register char *tp; - unsigned int tc; - - for(tp=astring; (tc = *tp) != 0; tp++) { - if (!isdigit(tc)) { - fprintf(stderr, "Table function '%s' must be a decimal integer.\n", - astring); - exit(1); - } - } - if (msfile) - table_number += (atoi(astring)) << 28; -} - -/* for compatibility with old comerr's, we truncate package name to 4 - * characters, but only store first 3 in the error code. Note that this - * function, as a side effect, truncates the table name down to 4 chars. - */ -void set_table_1num(char *string) -{ - afs_int32 temp; - int ctr; - - if ((temp = strlen(string)) > 4) { - fprintf(stderr, "Table name %s too long, truncated ", - string); - string[4] = '\0'; - fprintf(stderr, "to %s\n", string); - } - if (temp == 4) { - fprintf(stderr, "Table name %s too long, only 3 characters fit in error code.\n", - string); - } - if (char_to_1num (string[0]) > char_to_1num ('z')) { - fprintf (stderr, "%s%s%s%s", - "First character of error table name must be ", - "a letter; name ``", - string, "'' rejected\n"); - exit (1); - } - temp = 0; - for(ctr=0; ctr < 3; ctr++) { /* copy at most 3 chars to integer */ - if (*string == '\0') break; /* and watch for early end */ - temp = (temp * 050) /* "radix fifty" is base 050 = 40 */ - + char_to_1num(*string); - string++; - } - table_number += temp << 12; -} - -/* - * char_to_num -- maps letters and numbers into very small space - * 0-9 -> 0-9 - * mixed case -> 10-35 - * _ -> 36 - * others are reserved - */ - -static const char char_1set[] = - "abcdefghijklmnopqrstuvwxyz_0123456789"; - -int char_to_1num(char c) -{ - const char *where; - int diff; - - if (isupper(c)) c = tolower(c); - - where = strchr (char_1set, c); - if (where) { - /* start at 1 so we can decode */ - diff = where - char_1set; - assert (diff < 050); /* it is radix 50, after all */ - return diff; - } - else if (isprint (c)) - fprintf (stderr, - "Illegal character `%c' in error table name\n", - c); - else - fprintf (stderr, - "Illegal character %03o in error table name\n", - c); - exit (1); -} - -#ifdef AFS_NT40_ENV -#include "et_lex.lex_nt.c" -#else -#include "et_lex.lex.c" -#endif + +/* A Bison parser, made from error_table.y with Bison version GNU Bison version 1.24 + */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define ERROR_TABLE 258 +#define ERROR_CODE_ENTRY 259 +#define END 260 +#define INDEX 261 +#define PREFIX 262 +#define ID 263 +#define BASE 264 +#define NL 265 +#define STRING 266 +#define QUOTED_STRING 267 +#define NUMBER 268 + +#line 1 "error_table.y" + +#include +#include +#include "compiler.h" + +RCSID("$Header$"); + +/* + * + * Copyright 1986, 1987 by the MIT Student Information Processing Board + * + * For copyright info, see mit-sipb-cr.h. + */ +#ifndef AFS_NT40_ENV +#include +#endif +#include +#include +#include +#ifdef AFS_NT40_ENV +#include +#include +#else +#include +#endif +#include +#include "error_table.h" +#include "mit-sipb-cr.h" + +/* + * If __STDC__ is defined, function prototypes in the SunOS 5.5.1 lex + * and yacc templates are visible. We turn this on explicitly on + * NT because the prototypes help supress certain warning from the + * Microsoft C compiler. + */ + +#ifdef AFS_NT40_ENV +#include +# ifndef __STDC__ +# define __STDC__ 1 +# endif +#endif + +#include +#include +#include + +#include "internal.h" + +int char_to_num(char c); +char *gensym(const char *x); +char *current_token = (char *)NULL; +extern char *table_name; + +char *ds(const char *string); +char *quote(const char *string); +void set_table_1num(char *string); +int char_to_1num(char c); +void add_ec(const char *name, const char *description); +void add_ec_val(const char *name, const char *val, const char *description); +void put_ecs(void); +void set_table_num(char *string); +void set_table_fun(char *astring); +void set_id(const char *, const char *); +void set_base(const char *); +void set_prefix(const char *); +void add_index(const char *); + + +#line 70 "error_table.y" +typedef union { + char *dynstr; +} YYSTYPE; +#line 77 "error_table.y" + + +#ifndef YYLTYPE +typedef + struct yyltype + { + int timestamp; + int first_line; + int first_column; + int last_line; + int last_column; + char *text; + } + yyltype; + +#define YYLTYPE yyltype +#endif + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 37 +#define YYFLAG -32768 +#define YYNTBASE 16 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 268 ? yytranslate[x] : 26) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 1, 4, 12, 13, 16, 19, 21, 23, 25, + 29, 32, 37, 44, 47, 50, 53, 54, 56 +}; + +static const short yyrhs[] = { -1, + 16, 17, 0, 18, 3, 19, 18, 22, 5, 18, + 0, 0, 18, 10, 0, 20, 21, 0, 21, 0, + 13, 0, 11, 0, 22, 23, 10, 0, 23, 10, + 0, 4, 24, 14, 25, 0, 4, 24, 15, 11, + 14, 25, 0, 6, 13, 0, 7, 11, 0, 9, + 13, 0, 0, 11, 0, 12, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 82, 82, 84, 92, 92, 94, 97, 104, 111, 117, + 118, 121, 125, 131, 135, 146, 150, 153, 158 +}; + +static const char * const yytname[] = { "$","error","$undefined.","ERROR_TABLE", +"ERROR_CODE_ENTRY","END","INDEX","PREFIX","ID","BASE","NL","STRING","QUOTED_STRING", +"NUMBER","','","'='","error_tables","error_table","maybe_blank_lines","header", +"table_fun","table_id","error_codes","ec_entry","ec_name","description","" +}; +#endif + +static const short yyr1[] = { 0, + 16, 16, 17, 18, 18, 19, 19, 20, 21, 22, + 22, 23, 23, 23, 23, 23, 23, 24, 25 +}; + +static const short yyr2[] = { 0, + 0, 2, 7, 0, 2, 2, 1, 1, 1, 3, + 2, 4, 6, 2, 2, 2, 0, 1, 1 +}; + +static const short yydefact[] = { 1, + 4, 2, 0, 0, 5, 9, 8, 4, 0, 7, + 0, 6, 0, 0, 0, 0, 17, 0, 18, 0, + 14, 15, 16, 4, 0, 11, 0, 0, 3, 10, + 19, 12, 0, 0, 13, 0, 0 +}; + +static const short yydefgoto[] = { 1, + 2, 3, 8, 9, 10, 17, 18, 20, 32 +}; + +static const short yypact[] = {-32768, + 5,-32768, -2, 7,-32768,-32768,-32768,-32768, 10,-32768, + 0,-32768, 11, 6, 12, 13, 8, 1,-32768, -12, +-32768,-32768,-32768,-32768, 14,-32768, 15, 17, 19,-32768, +-32768,-32768, 16, 15,-32768, 25,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768, -8,-32768,-32768, 22,-32768, 18,-32768, -1 +}; + + +#define YYLAST 35 + + +static const short yytable[] = { 11, + 4, 27, 28, 13, 36, 14, 15, 5, 16, 5, + 26, 13, 24, 14, 15, 29, 16, 6, 21, 7, + 6, 19, 22, 30, 37, 23, 31, 33, 5, 34, + 12, 0, 35, 0, 25 +}; + +static const short yycheck[] = { 8, + 3, 14, 15, 4, 0, 6, 7, 10, 9, 10, + 10, 4, 5, 6, 7, 24, 9, 11, 13, 13, + 11, 11, 11, 10, 0, 13, 12, 11, 10, 14, + 9, -1, 34, -1, 17 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "bison.simple" + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#ifdef __cplusplus +extern "C" { +void *alloca (unsigned int); +}; +#else /* not __cplusplus */ +void *alloca (); +#endif /* not __cplusplus */ +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc. */ +#endif /* not GNU C. */ +#endif /* alloca not defined. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +int yyparse (void); +#endif + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (from, to, count) + char *from; + char *to; + int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *from, char *to, int count) +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 192 "bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#else +#define YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#endif + +int +yyparse(YYPARSE_PARAM) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); + yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 3: +#line 87 "error_table.y" +{ table_name = ds(yyvsp[-4].dynstr); + current_token = table_name; + put_ecs(); ; + break;} +case 6: +#line 95 "error_table.y" +{ current_token = yyvsp[-1].dynstr; + yyval.dynstr = yyvsp[0].dynstr; ; + break;} +case 7: +#line 98 "error_table.y" +{ current_token = yyvsp[0].dynstr; + set_table_fun(ds("1")); + yyval.dynstr = yyvsp[0].dynstr; + ; + break;} +case 8: +#line 105 "error_table.y" +{ current_token = yyvsp[0].dynstr; + set_table_fun(yyvsp[0].dynstr); + yyval.dynstr = yyvsp[0].dynstr; ; + break;} +case 9: +#line 112 "error_table.y" +{ current_token = yyvsp[0].dynstr; + set_table_num(yyvsp[0].dynstr); + yyval.dynstr = yyvsp[0].dynstr; ; + break;} +case 12: +#line 122 "error_table.y" +{ add_ec(yyvsp[-2].dynstr, yyvsp[0].dynstr); + free(yyvsp[-2].dynstr); + free(yyvsp[0].dynstr); ; + break;} +case 13: +#line 126 "error_table.y" +{ add_ec_val(yyvsp[-4].dynstr, yyvsp[-2].dynstr, yyvsp[0].dynstr); + free(yyvsp[-4].dynstr); + free(yyvsp[-2].dynstr); + free(yyvsp[0].dynstr); + ; + break;} +case 14: +#line 132 "error_table.y" +{ add_index(yyvsp[0].dynstr); + free(yyvsp[0].dynstr); + ; + break;} +case 15: +#line 136 "error_table.y" +{ set_prefix(yyvsp[0].dynstr); + free(yyvsp[0].dynstr); + ; + break;} +case 16: +#line 147 "error_table.y" +{ set_base(yyvsp[0].dynstr); + free(yyvsp[0].dynstr); + ; + break;} +case 18: +#line 154 "error_table.y" +{ yyval.dynstr = ds(yyvsp[0].dynstr); + current_token = yyval.dynstr; ; + break;} +case 19: +#line 159 "error_table.y" +{ yyval.dynstr = ds(yyvsp[0].dynstr); + current_token = yyval.dynstr; ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 487 "bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; +} +#line 163 "error_table.y" + + +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + */ + +extern FILE *hfile, *cfile, *msfile; +extern int use_msf; +char st_prefix[] = ""; +char *prefix = st_prefix; + +static afs_int32 gensym_n = 0; + +char *gensym(const char *x) +{ + char *symbol; + if (!gensym_n) { + struct timeval tv; + gettimeofday(&tv, (void *)0); + gensym_n = (tv.tv_sec%10000)*100 + tv.tv_usec/10000; + } + symbol = (char *)malloc(32 * sizeof(char)); + gensym_n++; + sprintf(symbol, "et%ld", (long int) gensym_n); + return(symbol); +} + +char * +ds(const char *string) +{ + char *rv; + rv = (char *)malloc(strlen(prefix)+strlen(string)+1); + strcpy(rv, prefix); + strcat(rv, string); + return(rv); +} + +char * +quote(const char *string) +{ + char *rv; + rv = (char *)malloc(strlen(string)+3); + strcpy(rv, "\""); + strcat(rv, string); + strcat(rv, "\""); + return(rv); +} + +afs_int32 table_number = 0; +int current = 0; +char **error_codes = (char **)NULL; + +void add_ec(const char *name, const char *description) +{ + if (msfile) { + if (current > 0) +#ifndef sun + fprintf(msfile, "%d\t%s\n", current, description); +#else + fprintf(msfile, "%d %s\n", current, description); +#endif /* !sun */ + } else { + fprintf(cfile, "\t\"%s\",\n", description); + } + if (error_codes == (char **)NULL) { + error_codes = (char **)malloc(sizeof(char *)); + *error_codes = (char *)NULL; + } + error_codes = (char **)realloc((char *)error_codes, + (current + 2)*sizeof(char *)); + error_codes[current++] = ds(name); + error_codes[current] = (char *)NULL; +} + +void add_ec_val(const char *name, const char *val, const char *description) +{ + const int ncurrent = atoi(val); + if (ncurrent < current) { + fprintf(stderr,"Error code %s (%d) out of order", name, + current); + return; + } + + while (ncurrent > current) { + if (!msfile) + fputs("\t(char *)0,\n", cfile); + current++; + } + if (msfile) { + if (current > 0) +#ifndef sun + fprintf(msfile, "%d\t%s\n", current, description); +#else + fprintf(msfile, "%d %s\n", current, description); +#endif /* ! sun */ + } else { + fprintf(cfile, "\t\"%s\",\n", description); + } + if (error_codes == (char **)NULL) { + error_codes = (char **)malloc(sizeof(char *)); + *error_codes = (char *)NULL; + } + error_codes = (char **)realloc((char *)error_codes, + (current + 2)*sizeof(char *)); + error_codes[current++] = ds(name); + error_codes[current] = (char *)NULL; +} + +void add_index(const char *val) +{ + const int ncurrent = atoi(val); + if (ncurrent < current) { + fprintf(stderr,"Index (%d) attempt to go backwards", + current); + return; + } + + if (error_codes == (char **)NULL) { + error_codes = (char **)malloc((ncurrent + 1) * sizeof(char *)); + } else { + error_codes = (char **)realloc((char *)error_codes, + (ncurrent + 1)*sizeof(char *)); + } + while (ncurrent > current) { + if (!msfile) + fputs("\t(char *)0,\n", cfile); + error_codes[current++] = (char *)NULL; + } +} + +/* +void set_id(const char *id, const char *text) +{ +} +*/ + +void set_prefix(const char *val) +{ + char *new; + + if (*val) { + new = malloc(strlen(val)+2); + strcpy(new, val); + strcat(new, "_"); + } else { + new = malloc(1); + *new = 0; + } + if (prefix != st_prefix) { + free(prefix); + } + prefix = new; +} + +void set_base(const char *base) +{ + table_number = atoi(base); +} + +void put_ecs(void) +{ + int i; + for (i = 0; i < current; i++) { + if (error_codes[i] != (char *)NULL) + fprintf(hfile, "#define %-40s (%ldL)\n", + error_codes[i], (long int) table_number + i); + } + put_ecs_postlog(); +} + +/* + * char_to_num -- maps letters and numbers into a small numbering space + * uppercase -> 1-26 + * lowercase -> 27-52 + * digits -> 53-62 + * underscore-> 63 + */ + +static const char char_set[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; + +int char_to_num(char c) +{ + const char *where; + int diff; + + where = strchr (char_set, c); + if (where) { + diff = where - char_set + 1; + assert (diff < (1 << ERRCODE_RANGE)); + return diff; + } + else if (isprint (c)) + fprintf (stderr, + "Illegal character `%c' in error table name\n", + c); + else + fprintf (stderr, + "Illegal character %03o in error table name\n", + c); + exit (1); +} + +void set_table_num(char *string) +{ + if (msfile) { + set_table_1num(string); + return; + } + if (strlen(string) > 4) { + fprintf(stderr, "Table name %s too long, truncated ", + string); + string[4] = '\0'; + fprintf(stderr, "to %s\n", string); + } + if (char_to_num (string[0]) > char_to_num ('z')) { + fprintf (stderr, "%s%s%s%s", + "First character of error table name must be ", + "a letter; name ``", + string, "'' rejected\n"); + exit (1); + } + while (*string != '\0') { + table_number = (table_number << BITS_PER_CHAR) + + char_to_num(*string); + string++; + } + table_number = table_number << ERRCODE_RANGE; + current = 0; + if (error_codes) + error_codes[current] = (char *)NULL; + if (!msfile) { + fprintf(cfile, + "static const char * const text%s[] = {\n", + cot_suffix(count_of_tables)); /* } */ + } +} + +void set_table_fun(char *astring) +{ + register char *tp; + unsigned int tc; + + for(tp=astring; (tc = *tp) != 0; tp++) { + if (!isdigit(tc)) { + fprintf(stderr, "Table function '%s' must be a decimal integer.\n", + astring); + exit(1); + } + } + if (msfile) + table_number += (atoi(astring)) << 28; +} + +/* for compatibility with old comerr's, we truncate package name to 4 + * characters, but only store first 3 in the error code. Note that this + * function, as a side effect, truncates the table name down to 4 chars. + */ +void set_table_1num(char *string) +{ + afs_int32 temp; + int ctr; + + if ((temp = strlen(string)) > 4) { + fprintf(stderr, "Table name %s too long, truncated ", + string); + string[4] = '\0'; + fprintf(stderr, "to %s\n", string); + } + if (temp == 4) { + fprintf(stderr, "Table name %s too long, only 3 characters fit in error code.\n", + string); + } + if (char_to_1num (string[0]) > char_to_1num ('z')) { + fprintf (stderr, "%s%s%s%s", + "First character of error table name must be ", + "a letter; name ``", + string, "'' rejected\n"); + exit (1); + } + temp = 0; + for(ctr=0; ctr < 3; ctr++) { /* copy at most 3 chars to integer */ + if (*string == '\0') break; /* and watch for early end */ + temp = (temp * 050) /* "radix fifty" is base 050 = 40 */ + + char_to_1num(*string); + string++; + } + table_number += temp << 12; +} + +/* + * char_to_num -- maps letters and numbers into very small space + * 0-9 -> 0-9 + * mixed case -> 10-35 + * _ -> 36 + * others are reserved + */ + +static const char char_1set[] = + "abcdefghijklmnopqrstuvwxyz_0123456789"; + +int char_to_1num(char c) +{ + const char *where; + int diff; + + if (isupper(c)) c = tolower(c); + + where = strchr (char_1set, c); + if (where) { + /* start at 1 so we can decode */ + diff = where - char_1set; + assert (diff < 050); /* it is radix 50, after all */ + return diff; + } + else if (isprint (c)) + fprintf (stderr, + "Illegal character `%c' in error table name\n", + c); + else + fprintf (stderr, + "Illegal character %03o in error table name\n", + c); + exit (1); +} + +#ifdef AFS_NT40_ENV +#include "et_lex.lex_nt.c" +#else +#include "et_lex.lex.c" +#endif diff --git a/src/comerr/error_table_nt.h b/src/comerr/error_table_nt.h index 60ac7aec01..8a115897ae 100755 --- a/src/comerr/error_table_nt.h +++ b/src/comerr/error_table_nt.h @@ -1,17 +1,17 @@ -typedef union { - char *dynstr; -} YYSTYPE; -#define ERROR_TABLE 258 -#define ERROR_CODE_ENTRY 259 -#define END 260 -#define INDEX 261 -#define PREFIX 262 -#define ID 263 -#define BASE 264 -#define NL 265 -#define STRING 266 -#define QUOTED_STRING 267 -#define NUMBER 268 - - -extern YYSTYPE yylval; +typedef union { + char *dynstr; +} YYSTYPE; +#define ERROR_TABLE 258 +#define ERROR_CODE_ENTRY 259 +#define END 260 +#define INDEX 261 +#define PREFIX 262 +#define ID 263 +#define BASE 264 +#define NL 265 +#define STRING 266 +#define QUOTED_STRING 267 +#define NUMBER 268 + + +extern YYSTYPE yylval; diff --git a/src/comerr/et_lex.lex_nt.c b/src/comerr/et_lex.lex_nt.c index 70a549f27c..f4ebac5f31 100644 --- a/src/comerr/et_lex.lex_nt.c +++ b/src/comerr/et_lex.lex_nt.c @@ -1,1630 +1,1630 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header$ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include -#include -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - - -#define YY_USES_REJECT -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -#define YY_FLEX_LEX_COMPAT -extern int yylineno; -int yylineno = 1; -extern char yytext[]; - - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yytext_ptr -= yy_more_len; \ - yyleng = (int) (yy_cp - yytext_ptr); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - if ( yyleng >= YYLMAX ) \ - YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ - yy_flex_strncpy( yytext, yytext_ptr, yyleng + 1 ); \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 17 -#define YY_END_OF_BUFFER 18 -static yyconst short int yy_acclist[83] = - { 0, - 14, 14, 18, 16, 17, 10, 16, 17, 11, 17, - 16, 17, 16, 17, 16, 17, 13, 14, 16, 17, - 14, 16, 17, 14, 16, 17, 14, 16, 17, 14, - 16, 17, 14, 16, 17, 12, 15, 13, 13, 14, - 14, 14, 4, 14, 14, 14, 2, 14, 8, 14, - 14, 14, 13, 14, 5, 14, 14, 14, 14, 9, - 14, 14, 14, 14, 14, 6, 14, 14, 14, 7, - 14, 14, 14, 14, 14, 14, 14, 3, 14, 14, - 1, 14 - } ; - -static yyconst short int yy_accept[58] = - { 0, - 1, 2, 3, 4, 6, 9, 11, 13, 15, 17, - 21, 24, 27, 30, 33, 36, 36, 37, 37, 38, - 38, 39, 41, 42, 43, 45, 46, 47, 49, 51, - 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, - 64, 65, 66, 68, 69, 70, 72, 73, 74, 75, - 76, 77, 78, 80, 81, 83, 83 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 4, 5, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 6, 1, 1, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, - 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 1, 1, 1, 1, 9, 1, 10, 11, 12, 13, - - 14, 15, 8, 8, 16, 8, 8, 17, 8, 18, - 19, 20, 8, 21, 22, 23, 8, 8, 8, 24, - 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst int yy_meta[25] = - { 0, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2 - } ; - -static yyconst short int yy_base[60] = - { 0, - 0, 0, 73, 74, 74, 74, 68, 68, 19, 63, - 0, 59, 15, 16, 47, 63, 74, 63, 74, 24, - 58, 57, 0, 41, 0, 49, 40, 0, 0, 47, - 45, 51, 43, 0, 37, 41, 39, 0, 32, 28, - 35, 41, 0, 25, 16, 0, 29, 37, 33, 34, - 30, 20, 0, 21, 0, 74, 39, 41, 30 - } ; - -static yyconst short int yy_def[60] = - { 0, - 56, 1, 56, 56, 56, 56, 57, 58, 56, 59, - 59, 59, 59, 59, 59, 57, 56, 58, 56, 56, - 56, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 56, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 0, 56, 56, 56 - } ; - -static yyconst short int yy_nxt[99] = - { 0, - 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, - 12, 11, 11, 13, 11, 14, 11, 11, 11, 15, - 11, 11, 11, 11, 20, 21, 25, 47, 29, 20, - 21, 23, 26, 30, 55, 27, 54, 28, 48, 16, - 16, 18, 18, 53, 52, 51, 50, 49, 46, 45, - 44, 43, 42, 41, 40, 39, 38, 32, 37, 36, - 35, 34, 33, 22, 32, 19, 17, 31, 24, 22, - 19, 17, 56, 3, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56 - - } ; - -static yyconst short int yy_chk[99] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 9, 9, 13, 45, 14, 20, - 20, 59, 13, 14, 54, 13, 52, 13, 45, 57, - 57, 58, 58, 51, 50, 49, 48, 47, 44, 42, - 41, 40, 39, 37, 36, 35, 33, 32, 31, 30, - 27, 26, 24, 22, 21, 18, 16, 15, 12, 10, - 8, 7, 3, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56 - - } ; - -static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; -static char *yy_full_match; -static int yy_lp; -#define REJECT \ -{ \ -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ -yy_cp = yy_full_match; /* restore poss. backed-over text */ \ -++yy_lp; \ -goto find_rule; \ -} -static int yy_more_flag = 0; -static int yy_more_len = 0; -#define yymore() (yy_more_flag = 1) -#define YY_MORE_ADJ yy_more_len -#ifndef YYLMAX -#define YYLMAX 8192 -#endif - -char yytext[YYLMAX]; -char *yytext_ptr; -#line 1 "et_lex.lex.l" -#define INITIAL 0 - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 4 "et_lex.lex.l" - - - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_more_len = 0; - if ( yy_more_flag ) - { - yy_more_len = yyleng; - yy_more_flag = 0; - } - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; - yy_state_ptr = yy_state_buf; - *yy_state_ptr++ = yy_current_state; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 57 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 74 ); - -yy_find_action: - yy_current_state = *--yy_state_ptr; - yy_lp = yy_accept[yy_current_state]; -find_rule: /* we branch to this label when backing up */ - for ( ; ; ) /* until we find what rule we matched */ - { - if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) - { - yy_act = yy_acclist[yy_lp]; - { - yy_full_match = yy_cp; - break; - } - } - --yy_cp; - yy_current_state = *--yy_state_ptr; - yy_lp = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - if ( yy_act != YY_END_OF_BUFFER ) - { - int yyl; - for ( yyl = 0; yyl < yyleng; ++yyl ) - if ( yytext[yyl] == '\n' ) - ++yylineno; - } - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ -case 1: -YY_RULE_SETUP -#line 6 "et_lex.lex.l" -return ERROR_TABLE; - YY_BREAK -case 2: -YY_RULE_SETUP -#line 7 "et_lex.lex.l" -return ERROR_TABLE; - YY_BREAK -case 3: -YY_RULE_SETUP -#line 8 "et_lex.lex.l" -return ERROR_CODE_ENTRY; - YY_BREAK -case 4: -YY_RULE_SETUP -#line 9 "et_lex.lex.l" -return ERROR_CODE_ENTRY; - YY_BREAK -case 5: -YY_RULE_SETUP -#line 10 "et_lex.lex.l" -return END; - YY_BREAK -case 6: -YY_RULE_SETUP -#line 11 "et_lex.lex.l" -return INDEX; - YY_BREAK -case 7: -YY_RULE_SETUP -#line 12 "et_lex.lex.l" -return PREFIX; - YY_BREAK -case 8: -YY_RULE_SETUP -#line 13 "et_lex.lex.l" -return ID; - YY_BREAK -case 9: -YY_RULE_SETUP -#line 14 "et_lex.lex.l" -return BASE; - YY_BREAK -case 10: -YY_RULE_SETUP -#line 16 "et_lex.lex.l" -; - YY_BREAK -case 11: -YY_RULE_SETUP -#line 17 "et_lex.lex.l" -return NL; - YY_BREAK -case 12: -YY_RULE_SETUP -#line 19 "et_lex.lex.l" -{ register char *p; yylval.dynstr = ds((char *)yytext+1); - if ((p=strrchr(yylval.dynstr, '"'))) *p='\0'; - return QUOTED_STRING; - } - YY_BREAK -case 13: -YY_RULE_SETUP -#line 24 "et_lex.lex.l" -{ yylval.dynstr = ds((char *)yytext); return NUMBER; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 25 "et_lex.lex.l" -{ yylval.dynstr = ds((char *)yytext); return STRING; } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 27 "et_lex.lex.l" -return NL; - YY_BREAK -case 16: -YY_RULE_SETUP -#line 29 "et_lex.lex.l" -{ return (*yytext); } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 30 "et_lex.lex.l" -ECHO; - YY_BREAK - case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a singled characater, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - yy_state_ptr = yy_state_buf; - *yy_state_ptr++ = yy_current_state; - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 57 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - - register YY_CHAR yy_c = 1; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 57 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - yy_is_jam = (yy_current_state == 56); - - return yy_is_jam ? 0 : yy_current_state; - } - - -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - if ( c == '\n' ) - --yylineno; - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - yytext_ptr = yy_c_buf_p; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - { - yy_c_buf_p = - yytext_ptr + YY_MORE_ADJ; - return EOF; - } - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - break; - - case EOB_ACT_LAST_MATCH: -#ifdef __cplusplus - YY_FATAL_ERROR( - "unexpected last match in yyinput()" ); -#else - YY_FATAL_ERROR( - "unexpected last match in input()" ); -#endif - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - if ( c == '\n' ) - ++yylineno; - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *str ) -#else -YY_BUFFER_STATE yy_scan_string( str ) -yyconst char *str; -#endif - { - int len; - for ( len = 0; str[len]; ++len ) - ; - - return yy_scan_bytes( str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n - YY_MORE_ADJ; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 30 "et_lex.lex.l" - -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ -int yywrap(void) { - return 1; -} +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +#define YY_FLEX_LEX_COMPAT +extern int yylineno; +int yylineno = 1; +extern char yytext[]; + + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yytext_ptr -= yy_more_len; \ + yyleng = (int) (yy_cp - yytext_ptr); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + if ( yyleng >= YYLMAX ) \ + YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ + yy_flex_strncpy( yytext, yytext_ptr, yyleng + 1 ); \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 17 +#define YY_END_OF_BUFFER 18 +static yyconst short int yy_acclist[83] = + { 0, + 14, 14, 18, 16, 17, 10, 16, 17, 11, 17, + 16, 17, 16, 17, 16, 17, 13, 14, 16, 17, + 14, 16, 17, 14, 16, 17, 14, 16, 17, 14, + 16, 17, 14, 16, 17, 12, 15, 13, 13, 14, + 14, 14, 4, 14, 14, 14, 2, 14, 8, 14, + 14, 14, 13, 14, 5, 14, 14, 14, 14, 9, + 14, 14, 14, 14, 14, 6, 14, 14, 14, 7, + 14, 14, 14, 14, 14, 14, 14, 3, 14, 14, + 1, 14 + } ; + +static yyconst short int yy_accept[58] = + { 0, + 1, 2, 3, 4, 6, 9, 11, 13, 15, 17, + 21, 24, 27, 30, 33, 36, 36, 37, 37, 38, + 38, 39, 41, 42, 43, 45, 46, 47, 49, 51, + 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, + 64, 65, 66, 68, 69, 70, 72, 73, 74, 75, + 76, 77, 78, 80, 81, 83, 83 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 6, 1, 1, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, + 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 1, 1, 1, 1, 9, 1, 10, 11, 12, 13, + + 14, 15, 8, 8, 16, 8, 8, 17, 8, 18, + 19, 20, 8, 21, 22, 23, 8, 8, 8, 24, + 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[25] = + { 0, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2 + } ; + +static yyconst short int yy_base[60] = + { 0, + 0, 0, 73, 74, 74, 74, 68, 68, 19, 63, + 0, 59, 15, 16, 47, 63, 74, 63, 74, 24, + 58, 57, 0, 41, 0, 49, 40, 0, 0, 47, + 45, 51, 43, 0, 37, 41, 39, 0, 32, 28, + 35, 41, 0, 25, 16, 0, 29, 37, 33, 34, + 30, 20, 0, 21, 0, 74, 39, 41, 30 + } ; + +static yyconst short int yy_def[60] = + { 0, + 56, 1, 56, 56, 56, 56, 57, 58, 56, 59, + 59, 59, 59, 59, 59, 57, 56, 58, 56, 56, + 56, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 56, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 0, 56, 56, 56 + } ; + +static yyconst short int yy_nxt[99] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, + 12, 11, 11, 13, 11, 14, 11, 11, 11, 15, + 11, 11, 11, 11, 20, 21, 25, 47, 29, 20, + 21, 23, 26, 30, 55, 27, 54, 28, 48, 16, + 16, 18, 18, 53, 52, 51, 50, 49, 46, 45, + 44, 43, 42, 41, 40, 39, 38, 32, 37, 36, + 35, 34, 33, 22, 32, 19, 17, 31, 24, 22, + 19, 17, 56, 3, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + + } ; + +static yyconst short int yy_chk[99] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 13, 45, 14, 20, + 20, 59, 13, 14, 54, 13, 52, 13, 45, 57, + 57, 58, 58, 51, 50, 49, 48, 47, 44, 42, + 41, 40, 39, 37, 36, 35, 33, 32, 31, 30, + 27, 26, 24, 22, 21, 18, 16, 15, 12, 10, + 8, 7, 3, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +++yy_lp; \ +goto find_rule; \ +} +static int yy_more_flag = 0; +static int yy_more_len = 0; +#define yymore() (yy_more_flag = 1) +#define YY_MORE_ADJ yy_more_len +#ifndef YYLMAX +#define YYLMAX 8192 +#endif + +char yytext[YYLMAX]; +char *yytext_ptr; +#line 1 "et_lex.lex.l" +#define INITIAL 0 + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 4 "et_lex.lex.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_more_len = 0; + if ( yy_more_flag ) + { + yy_more_len = yyleng; + yy_more_flag = 0; + } + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 57 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 74 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + { + yy_full_match = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER ) + { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + ++yylineno; + } + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 6 "et_lex.lex.l" +return ERROR_TABLE; + YY_BREAK +case 2: +YY_RULE_SETUP +#line 7 "et_lex.lex.l" +return ERROR_TABLE; + YY_BREAK +case 3: +YY_RULE_SETUP +#line 8 "et_lex.lex.l" +return ERROR_CODE_ENTRY; + YY_BREAK +case 4: +YY_RULE_SETUP +#line 9 "et_lex.lex.l" +return ERROR_CODE_ENTRY; + YY_BREAK +case 5: +YY_RULE_SETUP +#line 10 "et_lex.lex.l" +return END; + YY_BREAK +case 6: +YY_RULE_SETUP +#line 11 "et_lex.lex.l" +return INDEX; + YY_BREAK +case 7: +YY_RULE_SETUP +#line 12 "et_lex.lex.l" +return PREFIX; + YY_BREAK +case 8: +YY_RULE_SETUP +#line 13 "et_lex.lex.l" +return ID; + YY_BREAK +case 9: +YY_RULE_SETUP +#line 14 "et_lex.lex.l" +return BASE; + YY_BREAK +case 10: +YY_RULE_SETUP +#line 16 "et_lex.lex.l" +; + YY_BREAK +case 11: +YY_RULE_SETUP +#line 17 "et_lex.lex.l" +return NL; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 19 "et_lex.lex.l" +{ register char *p; yylval.dynstr = ds((char *)yytext+1); + if ((p=strrchr(yylval.dynstr, '"'))) *p='\0'; + return QUOTED_STRING; + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 24 "et_lex.lex.l" +{ yylval.dynstr = ds((char *)yytext); return NUMBER; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 25 "et_lex.lex.l" +{ yylval.dynstr = ds((char *)yytext); return STRING; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 27 "et_lex.lex.l" +return NL; + YY_BREAK +case 16: +YY_RULE_SETUP +#line 29 "et_lex.lex.l" +{ return (*yytext); } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 30 "et_lex.lex.l" +ECHO; + YY_BREAK + case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a singled characater, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 57 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 57 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + yy_is_jam = (yy_current_state == 56); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ) + --yylineno; + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + yytext_ptr = yy_c_buf_p; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + { + yy_c_buf_p = + yytext_ptr + YY_MORE_ADJ; + return EOF; + } + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + break; + + case EOB_ACT_LAST_MATCH: +#ifdef __cplusplus + YY_FATAL_ERROR( + "unexpected last match in yyinput()" ); +#else + YY_FATAL_ERROR( + "unexpected last match in input()" ); +#endif + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + if ( c == '\n' ) + ++yylineno; + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *str ) +#else +YY_BUFFER_STATE yy_scan_string( str ) +yyconst char *str; +#endif + { + int len; + for ( len = 0; str[len]; ++len ) + ; + + return yy_scan_bytes( str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n - YY_MORE_ADJ; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 30 "et_lex.lex.l" + +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + */ +int yywrap(void) { + return 1; +} diff --git a/src/config/Makefile.config.in b/src/config/Makefile.config.in index 62ac27b775..dc9e24852e 100644 --- a/src/config/Makefile.config.in +++ b/src/config/Makefile.config.in @@ -32,6 +32,7 @@ AS = @AS@ AFSD_LIBS = @AFSD_LIBS@ AFSD_LDFLAGS = @AFSD_LDFLAGS@ CC = @CC@ +CPP = @CPP@ CCOBJ = @CCOBJ@ CCXPG2 = @CCXPG2@ CFLAGS = @CFLAGS@ @@ -58,6 +59,8 @@ MT_CC = @MT_CC@ MT_CFLAGS = @MT_CFLAGS@ MT_LIBS = @MT_LIBS@ MV = @MV@ +NO_STRIP_BIN = @NO_STRIP_BIN@ +NO_STRIP_KRB = @NO_STRIP_KRB@ OPTMZ = @OPTMZ@ PAM_CFLAGS = @PAM_CFLAGS@ PAM_LIBS = @PAM_LIBS@ @@ -116,7 +119,7 @@ KERNELDIR = ../libafs # Build helper apps # COMPILE_ET = ${TOP_OBJDIR}/src/comerr/compile_et -INSTALL = ${TOP_OBJDIR}/src/pinstall/pinstall +INSTALL = ${TOP_OBJDIR}/src/pinstall/pinstall ${NO_STRIP_BIN} INSTALLex = ${INSTALL} -m 755 RXGEN = ${TOP_OBJDIR}/src/rxgen/rxgen SHELL = /bin/sh diff --git a/src/config/NTMakefile.amd64_w2k b/src/config/NTMakefile.amd64_w2k index 0c050a873d..1cff269034 100644 --- a/src/config/NTMakefile.amd64_w2k +++ b/src/config/NTMakefile.amd64_w2k @@ -84,7 +84,7 @@ LIB = $(AFSDEV_LIB) #define used in WinNT/2000 installation and program version display AFSPRODUCT_VER_MAJOR=1 AFSPRODUCT_VER_MINOR=5 -AFSPRODUCT_VER_PATCH=2500 +AFSPRODUCT_VER_PATCH=2800 AFSPRODUCT_VER_BUILD=0 AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH) diff --git a/src/config/NTMakefile.i386_nt40 b/src/config/NTMakefile.i386_nt40 index a2e74f40b8..df220e5a25 100644 --- a/src/config/NTMakefile.i386_nt40 +++ b/src/config/NTMakefile.i386_nt40 @@ -84,7 +84,7 @@ LIB = $(AFSDEV_LIB) #define used in WinNT/2000 installation and program version display AFSPRODUCT_VER_MAJOR=1 AFSPRODUCT_VER_MINOR=5 -AFSPRODUCT_VER_PATCH=2500 +AFSPRODUCT_VER_PATCH=2800 AFSPRODUCT_VER_BUILD=0 AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH) diff --git a/src/config/NTMakefile.i386_w2k b/src/config/NTMakefile.i386_w2k index 413e5b0d7c..106e40f974 100644 --- a/src/config/NTMakefile.i386_w2k +++ b/src/config/NTMakefile.i386_w2k @@ -84,7 +84,7 @@ LIB = $(AFSDEV_LIB) #define used in WinNT/2000 installation and program version display AFSPRODUCT_VER_MAJOR=1 AFSPRODUCT_VER_MINOR=5 -AFSPRODUCT_VER_PATCH=2500 +AFSPRODUCT_VER_PATCH=2800 AFSPRODUCT_VER_BUILD=0 AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH) diff --git a/src/config/afs_args.h b/src/config/afs_args.h index 7860e77943..7e362e7d3a 100644 --- a/src/config/afs_args.h +++ b/src/config/afs_args.h @@ -87,6 +87,14 @@ /* For SGI, this can't interfere with any of the 64 bit inode calls. */ #define AFSOP_RXLISTENER_DAEMON 48 /* starts kernel RX listener */ +/* skip 64 bit calls */ +#define AFSOP_CACHEBASEDIR 50 /* cache base dir */ +#define AFSOP_CACHEDIRS 51 /* number of files per dir */ +#define AFSOP_CACHEFILES 52 /* number of files */ + +#define AFSOP_SETINT 60 /* we should just set key/value pairs + for things which are just ints */ + /* these are for initialization flags */ #define AFSCALL_INIT_MEMCACHE 0x1 @@ -227,4 +235,10 @@ struct afssysargs { #define SYSCALL_DEV_FNAME "/dev/openafs_ioctl" #endif +#ifdef AFS_CACHE_VNODE_PATH +#define AFS_CACHE_CELLS_INODE -2 +#define AFS_CACHE_ITEMS_INODE -3 +#define AFS_CACHE_VOLUME_INODE -4 +#endif + #endif /* _AFS_ARGS_H_ */ diff --git a/src/config/mc.c b/src/config/mc.c index b09863868d..cece05c57c 100644 --- a/src/config/mc.c +++ b/src/config/mc.c @@ -16,9 +16,7 @@ #include #include -#ifdef HAVE_STRING_H #include -#endif #define TOK_DONTUSE 1 /* Don't copy if match and this flag is set. */ struct token { diff --git a/src/config/param.amd64_nbsd30.h b/src/config/param.amd64_nbsd30.h new file mode 100644 index 0000000000..7d7e170202 --- /dev/null +++ b/src/config/param.amd64_nbsd30.h @@ -0,0 +1,21 @@ +#ifndef AFS_AMD64_PARAM_H +#define AFS_AMD64_PARAM_H + +#define AFS_X86_XBSD_ENV 1 +#define AFS_X86_ENV 1 +#define AFSLITTLE_ENDIAN 1 + +#define SYS_NAME "amd64_nbsd30" +#define SYS_NAME_ID SYS_NAME_ID_amd64_nbsd30 + +#define AFS_64BITPOINTER_ENV 1 +#ifndef UKERNEL +/* This section for kernel libafs compiles only */ + +#else /* !defined(UKERNEL) */ + +/* This section for user space compiles only */ + +#endif /* !defined(UKERNEL) */ + +#endif /* AFS_AMD64_PARAM_H */ diff --git a/src/config/param.amd64_nbsd40.h b/src/config/param.amd64_nbsd40.h new file mode 100644 index 0000000000..f6f3b13f7a --- /dev/null +++ b/src/config/param.amd64_nbsd40.h @@ -0,0 +1,21 @@ +#ifndef AFS_AMD64_PARAM_H +#define AFS_AMD64_PARAM_H + +#define AFS_X86_XBSD_ENV 1 +#define AFS_X86_ENV 1 +#define AFSLITTLE_ENDIAN 1 + +#define SYS_NAME "amd64_nbsd40" +#define SYS_NAME_ID SYS_NAME_ID_amd64_nbsd40 + +#define AFS_64BITPOINTER_ENV 1 +#ifndef UKERNEL +/* This section for kernel libafs compiles only */ + +#else /* !defined(UKERNEL) */ + +/* This section for user space compiles only */ + +#endif /* !defined(UKERNEL) */ + +#endif /* AFS_AMD64_PARAM_H */ diff --git a/src/config/param.nbsd30.h b/src/config/param.nbsd30.h index 85c0b5113e..53f344c2d3 100644 --- a/src/config/param.nbsd30.h +++ b/src/config/param.nbsd30.h @@ -21,6 +21,7 @@ #define AFS_NBSD15_ENV 1 #define AFS_NBSD16_ENV 1 #define AFS_NBSD20_ENV 1 +#define AFS_NBSD30_ENV 1 #define AFS_NONFSTRANS 1 #define AFS_KERBEROS_ENV 1 diff --git a/src/config/param.nbsd40.h b/src/config/param.nbsd40.h new file mode 100644 index 0000000000..6868bd3038 --- /dev/null +++ b/src/config/param.nbsd40.h @@ -0,0 +1,160 @@ +/* NetBSD shared section */ + +#ifndef AFS_PARAM_COMMON_H +#define AFS_PARAM_COMMON_H 1 + +#define AFS_64BIT_ENV 1 +#define AFS_NAMEI_ENV 1 /* User space interface to file system */ +#define AFS_64BIT_IOPS_ENV 1 /* Needed for NAMEI */ +#define AFS_64BIT_CLIENT 1 + +#define AFS_MOUNT_AFS "afs" /* The name of the filesystem type. */ +#define AFS_SYSCALL 210 + +#ifndef MOUNT_AFS +#define MOUNT_AFS AFS_MOUNT_AFS +#endif + +#define AFS_XBSD_ENV 1 /* {Free,Open,Net}BSD */ + +#define AFS_NBSD_ENV 1 +#define AFS_NBSD15_ENV 1 +#define AFS_NBSD16_ENV 1 +#define AFS_NBSD20_ENV 1 +#define AFS_NBSD30_ENV 1 +#define AFS_NBSD40_ENV 1 +#define AFS_NONFSTRANS 1 +#define AFS_KERBEROS_ENV 1 + +#define AFS_VFSINCL_ENV 1 + +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H) +#define AFS_HAVE_STATVFS 1 /* System supports statvfs */ +#endif + +#ifndef UKERNEL + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H) +#include +#endif + +#define FTRUNC O_TRUNC + +#define IUPD 0x0010 +#define IACC 0x0020 +#define ICHG 0x0040 +#define IMOD 0x0080 + +#define IN_LOCK(ip) lockmgr(&ip->i_lock, LK_EXCLUSIVE, \ + NULL, curproc) +#define IN_UNLOCK(ip) lockmgr(&ip->i_lock, LK_RELEASE, \ + NULL, curproc) + +#include + +#define AFS_VM_RDWR_ENV 1 +#define AFS_VFS_ENV 1 +#define AFS_GREEDY43_ENV 1 + +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ +#define AFS_USE_GETTIMEOFDAY 1 /* use gettimeofday to implement rx clock */ + +/* Extra kernel definitions (from kdefs file) */ +#ifdef _KERNEL +#define AFS_GLOBAL_SUNLOCK 1 +#define AFS_VFS34 1 /* What is VFS34??? */ +#define AFS_SHORTGID 1 /* are group id's short? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES CLBYTES +#define osi_GetTime(x) microtime(x) +#define AFS_KALLOC(x) kalloc(x) +#define AFS_KFREE(x,y) kfree(x,y) +#define v_count v_usecount +#define v_vfsp v_mount +#define vfs_bsize mnt_stat.f_bsize +#define vfs_fsid mnt_stat.f_fsid +#define va_nodeid va_fileid +#define vfs_vnodecovered mnt_vnodecovered +#define direct dirent +#define vnode_t struct vnode + +#ifndef MUTEX_DEFAULT +#define MUTEX_DEFAULT 0 +#endif /* MUTEX_DEFAULT */ + +#ifndef SSYS +#define SSYS 0x00002 +#endif /* SSYS */ + +#define p_rcred p_ucred + +#define VN_RELE(vp) vrele(((struct vnode *)(vp))) +#define VN_HOLD(vp) VREF(((struct vnode *)(vp))) + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H) +enum vcexcl { NONEXCL, EXCL }; + +#ifdef KERNEL +#ifndef MIN +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#endif +#ifndef MAX +#define MAX(A,B) ((A) > (B) ? (A) : (B)) +#endif +#endif /* KERNEL */ + +#endif /* ! ASSEMBLER & ! __LANGUAGE_ASSEMBLY__ && !defined(IGNORE_STDS_H) */ +#endif /* _KERNEL */ + +#else /* !defined(UKERNEL) */ + + +/* This section for user space compiles only */ + +#define UKERNEL 1 /* user space kernel */ + +#include + +#define AFS_USERSPACE_IP_ADDR 1 +#define RXK_LISTENER_ENV 1 +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ + +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_fmode uio_fmode +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES MCLBYTES +#define AFS_MINCHANGE 2 +#define VATTR_NULL usr_vattr_null + +#define AFS_DIRENT +#ifndef CMSERVERPREF +#define CMSERVERPREF +#endif + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H) +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#endif /* !defined(UKERNEL) */ + +#endif /* AFS_PARAM_COMMON_H */ diff --git a/src/config/param.ppc_darwin_90.h b/src/config/param.ppc_darwin_90.h index ac74560cd2..a62b8556e7 100644 --- a/src/config/param.ppc_darwin_90.h +++ b/src/config/param.ppc_darwin_90.h @@ -30,6 +30,7 @@ #define AFS_SYSCALL 230 #define AFS_NAMEI_ENV 1 #define DARWIN_REFBASE 3 +#define AFS_CACHE_VNODE_PATH /* File system entry (used if mount.h doesn't define MOUNT_AFS */ #define AFS_MOUNT_AFS "afs" diff --git a/src/config/param.x86_darwin_90.h b/src/config/param.x86_darwin_90.h index ac74560cd2..a62b8556e7 100644 --- a/src/config/param.x86_darwin_90.h +++ b/src/config/param.x86_darwin_90.h @@ -30,6 +30,7 @@ #define AFS_SYSCALL 230 #define AFS_NAMEI_ENV 1 #define DARWIN_REFBASE 3 +#define AFS_CACHE_VNODE_PATH /* File system entry (used if mount.h doesn't define MOUNT_AFS */ #define AFS_MOUNT_AFS "afs" diff --git a/src/des/NTMakefile b/src/des/NTMakefile index 1a8d6e5c30..04e4563189 100644 --- a/src/des/NTMakefile +++ b/src/des/NTMakefile @@ -32,6 +32,7 @@ INCFILEDIR = $(DESTDIR)\include INCFILES =\ $(INCFILEDIR)\des.h \ $(INCFILEDIR)\des_conf.h \ + $(INCFILEDIR)\des_prototypes.h \ $(INCFILEDIR)\mit-cpyright.h \ $(INCFILEDIR)\des_odd.h \ $(INCFILEDIR)\crypt.h \ diff --git a/src/dir/dir.c b/src/dir/dir.c index b7f40a3373..ec4ad26322 100644 --- a/src/dir/dir.c +++ b/src/dir/dir.c @@ -100,13 +100,7 @@ extern void *DNew(); #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #endif /* KERNEL */ afs_int32 DErrno; @@ -478,7 +472,7 @@ DirHash(register char *string) { /* Hash a string to a number between 0 and NHASHENT. */ register unsigned char tc; - register int hval; + unsigned int hval; register int tval; hval = 0; while ((tc = (*string++))) { @@ -488,7 +482,7 @@ DirHash(register char *string) tval = hval & (NHASHENT - 1); if (tval == 0) return tval; - else if (hval < 0) + else if (hval >= 1<<31) tval = NHASHENT - tval; return tval; } diff --git a/src/dir/salvage.c b/src/dir/salvage.c index f499a057aa..4b867e08f0 100644 --- a/src/dir/salvage.c +++ b/src/dir/salvage.c @@ -23,13 +23,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "dir.h" #define printf Log /* To make it work with volume salvager */ diff --git a/src/fsint/Makefile.in b/src/fsint/Makefile.in index cf421009d0..a528e18b58 100644 --- a/src/fsint/Makefile.in +++ b/src/fsint/Makefile.in @@ -29,67 +29,67 @@ libafsint.a: ${OBJS} AFS_component_version_number.o afsaux.o: afsaux.c afsint.h Kcallback.cs.c: common.xg afscbint.xg Kvice.h Kcallback.h - ${RXGEN} -x -k -C -o Kcallback.cs.c ${srcdir}/afscbint.xg + ${RXGEN} -A -x -k -C -o Kcallback.cs.c ${srcdir}/afscbint.xg Kcallback.ss.c: common.xg afscbint.xg Kvice.h Kcallback.h - ${RXGEN} -x -k -S -o Kcallback.ss.c ${srcdir}/afscbint.xg + ${RXGEN} -A -x -k -S -o Kcallback.ss.c ${srcdir}/afscbint.xg Kcallback.xdr.c: common.xg afscbint.xg Kvice.h Kcallback.h - ${RXGEN} -x -k -y -c -o Kcallback.xdr.c ${srcdir}/afscbint.xg + ${RXGEN} -A -x -k -y -c -o Kcallback.xdr.c ${srcdir}/afscbint.xg Kvice.cs.c: common.xg afsint.xg Kvice.h - ${RXGEN} -x -k -C -o Kvice.cs.c ${srcdir}/afsint.xg + ${RXGEN} -A -x -k -C -o Kvice.cs.c ${srcdir}/afsint.xg Kvice.ss.c: common.xg afsint.xg Kvice.h - ${RXGEN} -x -k -S -o Kvice.ss.c ${srcdir}/afsint.xg + ${RXGEN} -A -x -k -S -o Kvice.ss.c ${srcdir}/afsint.xg Kvice.xdr.c: common.xg afsint.xg - ${RXGEN} -x -k -c -o Kvice.xdr.c ${srcdir}/afsint.xg + ${RXGEN} -A -x -k -c -o Kvice.xdr.c ${srcdir}/afsint.xg Kvice.h: common.xg afsint.xg - ${RXGEN} -x -k -h -o Kvice.h ${srcdir}/afsint.xg + ${RXGEN} -A -x -k -h -o Kvice.h ${srcdir}/afsint.xg Kpagcb.cs.c: pagcb.xg Kpagcb.h - ${RXGEN} -x -k -C -o Kpagcb.cs.c ${srcdir}/pagcb.xg + ${RXGEN} -A -x -k -C -o Kpagcb.cs.c ${srcdir}/pagcb.xg Kpagcb.ss.c: pagcb.xg Kpagcb.h - ${RXGEN} -x -k -S -o Kpagcb.ss.c ${srcdir}/pagcb.xg + ${RXGEN} -A -x -k -S -o Kpagcb.ss.c ${srcdir}/pagcb.xg Kpagcb.xdr.c: pagcb.xg - ${RXGEN} -x -k -c -o Kpagcb.xdr.c ${srcdir}/pagcb.xg + ${RXGEN} -A -x -k -c -o Kpagcb.xdr.c ${srcdir}/pagcb.xg Kpagcb.h: pagcb.xg - ${RXGEN} -x -k -h -o Kpagcb.h ${srcdir}/pagcb.xg + ${RXGEN} -A -x -k -h -o Kpagcb.h ${srcdir}/pagcb.xg pagcb.h: pagcb.xg - ${RXGEN} -x -h -o pagcb.h ${srcdir}/pagcb.xg + ${RXGEN} -A -x -h -o pagcb.h ${srcdir}/pagcb.xg Kcallback.h: common.xg afscbint.xg - ${RXGEN} -x -k -h -o Kcallback.h ${srcdir}/afscbint.xg + ${RXGEN} -A -x -k -h -o Kcallback.h ${srcdir}/afscbint.xg afscbint.cs.c: common.xg afscbint.xg afsint.h afscbint.h - ${RXGEN} -x -C -o afscbint.cs.c ${srcdir}/afscbint.xg + ${RXGEN} -A -x -C -o afscbint.cs.c ${srcdir}/afscbint.xg afscbint.ss.c: common.xg afscbint.xg afsint.h afscbint.h - ${RXGEN} -x -S -o afscbint.ss.c ${srcdir}/afscbint.xg + ${RXGEN} -A -x -S -o afscbint.ss.c ${srcdir}/afscbint.xg afscbint.xdr.c: common.xg afscbint.xg afsint.h afscbint.h - ${RXGEN} -x -y -c -o afscbint.xdr.c ${srcdir}/afscbint.xg + ${RXGEN} -A -x -y -c -o afscbint.xdr.c ${srcdir}/afscbint.xg afsint.cs.c: common.xg afsint.xg afsint.h - ${RXGEN} -x -C -o afsint.cs.c ${srcdir}/afsint.xg + ${RXGEN} -A -x -C -o afsint.cs.c ${srcdir}/afsint.xg afsint.ss.c: common.xg afsint.xg afsint.h - ${RXGEN} -x -S -o afsint.ss.c ${srcdir}/afsint.xg + ${RXGEN} -A -x -S -o afsint.ss.c ${srcdir}/afsint.xg afsint.xdr.c: common.xg afsint.xg - ${RXGEN} -x -c -o afsint.xdr.c ${srcdir}/afsint.xg + ${RXGEN} -A -x -c -o afsint.xdr.c ${srcdir}/afsint.xg afsint.h: common.xg afsint.xg - ${RXGEN} -x -h -o afsint.h ${srcdir}/afsint.xg + ${RXGEN} -A -x -h -o afsint.h ${srcdir}/afsint.xg afscbint.h: common.xg afscbint.xg - ${RXGEN} -x -h -o afscbint.h ${srcdir}/afscbint.xg + ${RXGEN} -A -x -h -o afscbint.h ${srcdir}/afscbint.xg # # Installation targets diff --git a/src/fsprobe/fsprobe.c b/src/fsprobe/fsprobe.c index 863a043e4f..f512aeca11 100644 --- a/src/fsprobe/fsprobe.c +++ b/src/fsprobe/fsprobe.c @@ -20,13 +20,7 @@ RCSID ("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include /*Interface for this module */ #include /*Lightweight process package */ diff --git a/src/fsprobe/fsprobe_test.c b/src/fsprobe/fsprobe_test.c index 36a2b37146..a766e71a26 100644 --- a/src/fsprobe/fsprobe_test.c +++ b/src/fsprobe/fsprobe_test.c @@ -19,14 +19,7 @@ RCSID ("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include /*Interface for fsprobe module */ /* diff --git a/src/gtx/curseswindows.c b/src/gtx/curseswindows.c index a1d351b2e9..601dc2bb20 100644 --- a/src/gtx/curseswindows.c +++ b/src/gtx/curseswindows.c @@ -37,14 +37,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "gtxcurseswin.h" /*Interface definition */ diff --git a/src/gtx/frame.c b/src/gtx/frame.c index 983226f4bc..9e8e3ee482 100644 --- a/src/gtx/frame.c +++ b/src/gtx/frame.c @@ -19,13 +19,7 @@ RCSID #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "gtxobjects.h" @@ -324,6 +318,7 @@ gtxframe_DisplayString(aframe, amsgLine) if (aframe->messageLine) free(aframe->messageLine); aframe->messageLine = gtx_CopyString(amsgLine); + return 0; } /* Called by input processor to try to clear the dude */ diff --git a/src/gtx/gtxtest.c b/src/gtx/gtxtest.c index 68877ac703..a859d5e658 100644 --- a/src/gtx/gtxtest.c +++ b/src/gtx/gtxtest.c @@ -13,14 +13,7 @@ RCSID ("$Header$"); - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "gtxwindows.h" #include "gtxobjects.h" @@ -253,4 +246,5 @@ main() keymap_Delete(tmap); gtx_InputServer(win); + return 0; } diff --git a/src/gtx/input.c b/src/gtx/input.c index 834377f67c..384aa81a5c 100644 --- a/src/gtx/input.c +++ b/src/gtx/input.c @@ -61,6 +61,7 @@ gtx_InputServer(awin) tframe->flags &= ~GTXFRAME_RECURSIVEEND; WOP_DISPLAY(awin); /* eventually calls gtxframe_Display */ } + return 0; } struct gwin * diff --git a/src/gtx/keymap.c b/src/gtx/keymap.c index e6c010016b..93dedcfc54 100644 --- a/src/gtx/keymap.c +++ b/src/gtx/keymap.c @@ -13,14 +13,7 @@ RCSID ("$Header$"); - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "gtxkeymap.h" diff --git a/src/gtx/lightobject.c b/src/gtx/lightobject.c index 4feaf1a330..db9e6980cf 100644 --- a/src/gtx/lightobject.c +++ b/src/gtx/lightobject.c @@ -22,17 +22,9 @@ RCSID #include "gtxlightobj.h" /*Interface for this module */ #include /*Standard I/O stuff */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include - /*Externally-advertised array of light onode operations*/ struct onodeops gator_light_ops = { gator_light_destroy, diff --git a/src/gtx/object_test.c b/src/gtx/object_test.c index 405d1fbc6e..4c03b834ef 100644 --- a/src/gtx/object_test.c +++ b/src/gtx/object_test.c @@ -386,10 +386,7 @@ test_objects(pkg) *------------------------------------------------------------------------*/ static int -object_testInit(as, arock) - struct cmd_syndesc *as; - char *arock; - +object_testInit(struct cmd_syndesc *as, void *arock) { /*object_testInit */ static char rn[] = "object_testInit"; /*Routine name */ @@ -442,7 +439,7 @@ main(argc, argv) /* * Set up the commands we understand. */ - ts = cmd_CreateSyntax("initcmd", object_testInit, 0, + ts = cmd_CreateSyntax("initcmd", object_testInit, NULL, "Initialize the program"); cmd_AddParm(ts, "-package", CMD_SINGLE, CMD_REQUIRED, "Graphics package to use"); diff --git a/src/gtx/objects.c b/src/gtx/objects.c index 1ca8facb9c..86299701a1 100644 --- a/src/gtx/objects.c +++ b/src/gtx/objects.c @@ -26,14 +26,7 @@ RCSID #include /*Standard I/O stuff */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include /* diff --git a/src/gtx/screen_test.c b/src/gtx/screen_test.c index 5247bf2cb0..c9e39ba0ce 100644 --- a/src/gtx/screen_test.c +++ b/src/gtx/screen_test.c @@ -224,10 +224,7 @@ test_this_package(pkg) *--------------------------------------------------------------------------------*/ static int -screen_testInit(as, arock) - struct cmd_syndesc *as; - char *arock; - +screen_testInit(struct cmd_syndesc *as, void *arock) { /*screen_testInit */ static char rn[] = "screen_testInit"; /*Routine name */ @@ -280,7 +277,7 @@ main(argc, argv) * There really aren't any opcodes here, but we do want to interpret switches * from the command line. So, all we need do is set up the initcmd ``opcode''. */ - ts = cmd_CreateSyntax("initcmd", screen_testInit, 0, + ts = cmd_CreateSyntax("initcmd", screen_testInit, NULL, "Initialize, interpret command line"); cmd_AddParm(ts, "-package", CMD_SINGLE, CMD_REQUIRED, "Graphics package to use"); diff --git a/src/gtx/textcb.c b/src/gtx/textcb.c index 5bc5d6545a..3b095e687a 100644 --- a/src/gtx/textcb.c +++ b/src/gtx/textcb.c @@ -22,14 +22,7 @@ RCSID #include "gtxtextcb.h" /*Module interface */ #include /*Standard I/O stuff */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include static int gator_textcb_debug; /*Is debugging output turned on? */ diff --git a/src/gtx/textobject.c b/src/gtx/textobject.c index 5c7bc33d53..b0a57ee1b7 100644 --- a/src/gtx/textobject.c +++ b/src/gtx/textobject.c @@ -25,14 +25,7 @@ RCSID #include "gtxX11win.h" /*Gator X11 window interface */ #include /*Standard I/O stuff */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include /*Externally-advertised array of text onode operations*/ @@ -370,7 +363,7 @@ gator_text_Scroll(onp, nlines, direction) * the window empty. */ if (objects_debug) - fprintf(stderr, "[%s:%s] Scrolling text object at 0x%x %d lines %s\n", + fprintf(stderr, "[%s:%s] Scrolling text object %d lines %s\n", mn, rn, nlines, (direction == GATOR_TEXT_SCROLL_UP) ? "UP" : "DOWN"); @@ -461,7 +454,7 @@ gator_text_Write(onp, strToWrite, numChars, highlight, skip) if (objects_debug) { fprintf(stderr, "[%s:%s] Writing %d chars to text object at 0x%x (highlight=%d, skip=%d: '", - rn, numChars, onp, highlight, skip); + mn, rn, numChars, onp, highlight, skip); for (i = 0; i < numChars; i++) fprintf(stderr, "%c", strToWrite + i); fprintf(stderr, "\n"); diff --git a/src/kauth/Makefile.in b/src/kauth/Makefile.in index 88cb4a0a59..f134bc3e97 100644 --- a/src/kauth/Makefile.in +++ b/src/kauth/Makefile.in @@ -101,29 +101,29 @@ kauth.xdr.o: kauth.xdr.c kauth.h $(UKSRCS): kauth.h kauth.cs.c: kauth.rg - ${RXGEN} -u -x -C -o $@ ${srcdir}/kauth.rg + ${RXGEN} -A -u -x -C -o $@ ${srcdir}/kauth.rg kauth.ss.c: kauth.rg - ${RXGEN} -x -S -o $@ ${srcdir}/kauth.rg + ${RXGEN} -A -x -S -o $@ ${srcdir}/kauth.rg kauth.xdr.c: kauth.rg - ${RXGEN} -x -c -o $@ ${srcdir}/kauth.rg + ${RXGEN} -A -x -c -o $@ ${srcdir}/kauth.rg kauth.h: kauth.rg - ${RXGEN} -u -x -h -o $@ ${srcdir}/kauth.rg + ${RXGEN} -A -u -x -h -o $@ ${srcdir}/kauth.rg kauth.xdr.c: kauth.h kauth.cs.c: kauth.h kauth.ss.c: kauth.h Kkauth.cs.c: kauth.rg Kkauth.h - ${RXGEN} -x -k -C -o Kkauth.cs.c ${srcdir}/kauth.rg + ${RXGEN} -A -x -k -C -o Kkauth.cs.c ${srcdir}/kauth.rg Kkauth.xdr.c: kauth.rg - ${RXGEN} -x -k -c -o Kkauth.xdr.c ${srcdir}/kauth.rg + ${RXGEN} -A -x -k -c -o Kkauth.xdr.c ${srcdir}/kauth.rg Kkauth.h: kauth.rg - ${RXGEN} -x -k -h -o Kkauth.h ${srcdir}/kauth.rg + ${RXGEN} -A -x -k -h -o Kkauth.h ${srcdir}/kauth.rg libkauth.a: $(OBJS) AFS_component_version_number.o -$(RM) -f $@ @@ -262,37 +262,37 @@ install: \ ${DESTDIR}${includedir}/afs/kaport.h ${DESTDIR}${afssrvlibexecdir}/kaserver: kaserver - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${sbindir}/kas: kas - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${sbindir}/kpwvalid: kpwvalid ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/kas: kas - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/kpwvalid: kpwvalid ${INSTALL} $? $@ ${DESTDIR}${bindir}/klog@KAUTH_KLOG_SUFFIX@: klog - ${INSTALL} -f -s $? $@ + ${INSTALL} -f $? $@ ${DESTDIR}${bindir}/klog.krb: klog.krb - ${INSTALL} -s $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DESTDIR}${afssrvbindir}/klog@KAUTH_KLOG_SUFFIX@: klog - ${INSTALL} -f -s $? $@ + ${INSTALL} -f $? $@ ${DESTDIR}${afssrvbindir}/klog.krb: klog.krb - ${INSTALL} -s $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DESTDIR}${bindir}/knfs: knfs - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${bindir}/kpasswd@KAUTH_KLOG_SUFFIX@: kpasswd - ${INSTALL} -f -s $? $@ + ${INSTALL} -f $? $@ ${DESTDIR}${bindir}/kpwvalid: kpwvalid ${INSTALL} $? $@ @@ -307,7 +307,7 @@ ${DESTDIR}${afssrvsbindir}/kadb_check: rebuild ${INSTALL} -f $? $@ ${DESTDIR}${afssrvsbindir}/kdb: kdb - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/ka-forwarder: ka-forwarder ${INSTALL} $? $@ @@ -348,25 +348,25 @@ dest: \ ${DEST}/include/afs/kaport.h ${DEST}/root.server/usr/afs/bin/kaserver: kaserver - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/etc/kas ${DEST}/root.server/usr/afs/bin/kas: kas - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/kpwvalid ${DEST}/etc/kpwvalid ${DEST}/root.server/usr/afs/bin/kpwvalid: kpwvalid ${INSTALL} $? $@ ${DEST}/bin/klog@KAUTH_KLOG_SUFFIX@ ${DEST}/root.server/usr/afs/bin/klog@KAUTH_KLOG_SUFFIX@: klog - ${INSTALL} -f -s $? $@ + ${INSTALL} -f $? $@ ${DEST}/bin/klog.krb ${DEST}/root.server/usr/afs/bin/klog.krb: klog.krb - ${INSTALL} -s $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DEST}/bin/knfs: knfs - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/kpasswd@KAUTH_KLOG_SUFFIX@: kpasswd - ${INSTALL} -f -s $? $@ + ${INSTALL} -f $? $@ ${DEST}/lib/afs/libkauth.a: libkauth.a ${INSTALL} $? $@ @@ -378,7 +378,7 @@ ${DEST}/etc/kadb_check: rebuild ${INSTALL} -f $? $@ ${DEST}/etc/kdb: kdb - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/root.server/usr/afs/bin/ka-forwarder: ka-forwarder ${INSTALL} $? $@ diff --git a/src/kauth/admin_tools.c b/src/kauth/admin_tools.c index c62cf12a54..6fe44d96c3 100644 --- a/src/kauth/admin_tools.c +++ b/src/kauth/admin_tools.c @@ -234,7 +234,7 @@ DumpUser(char *user, char *arock, int showadmin, int showkey, char *inst) } int -ListUsers(struct cmd_syndesc *as, char *arock) +ListUsers(struct cmd_syndesc *as, void *arock) { struct kaident name; afs_int32 index; @@ -273,7 +273,7 @@ ListUsers(struct cmd_syndesc *as, char *arock) int -ExamineUser(struct cmd_syndesc *as, char *arock) +ExamineUser(struct cmd_syndesc *as, void *arock) { int showkey = (as->parms[1].items != NULL); return DumpUser(as->parms[0].items->data, arock, 0, showkey, NULL); @@ -318,7 +318,7 @@ handle_errors(int code, /* error code to handle */ } int -CreateUser(struct cmd_syndesc *as, char *arock) +CreateUser(struct cmd_syndesc *as, void *arock) { int code; char name[MAXKTCNAMELEN]; @@ -348,7 +348,7 @@ CreateUser(struct cmd_syndesc *as, char *arock) } int -DeleteUser(struct cmd_syndesc *as, char *arock) +DeleteUser(struct cmd_syndesc *as, void *arock) { int code; char name[MAXKTCNAMELEN]; @@ -532,7 +532,7 @@ ka_islocked(char *name, char *instance, afs_uint32 * when) } int -Unlock(struct cmd_syndesc *as, char *arock) +Unlock(struct cmd_syndesc *as, void *arock) { afs_int32 code, rcode = 0; afs_int32 count; @@ -573,7 +573,7 @@ Unlock(struct cmd_syndesc *as, char *arock) } int -SetFields(struct cmd_syndesc *as, char *arock) +SetFields(struct cmd_syndesc *as, void *arock) { int code; char name[MAXKTCNAMELEN]; @@ -735,7 +735,7 @@ SetFields(struct cmd_syndesc *as, char *arock) } int -StringToKey(struct cmd_syndesc *as, char *arock) +StringToKey(struct cmd_syndesc *as, void *arock) { afs_int32 code; char realm[MAXKTCREALMLEN]; @@ -772,7 +772,7 @@ StringToKey(struct cmd_syndesc *as, char *arock) } int -SetPassword(struct cmd_syndesc *as, char *arock) +SetPassword(struct cmd_syndesc *as, void *arock) { int code; char name[MAXKTCNAMELEN]; @@ -964,7 +964,7 @@ ListTicket(struct ktc_principal *server, int verbose) } static -GetTicket(struct cmd_syndesc *as, char *arock) +GetTicket(struct cmd_syndesc *as, void *arock) { int code; struct ktc_principal server; @@ -1010,7 +1010,7 @@ GetTicket(struct cmd_syndesc *as, char *arock) } static -GetPassword(struct cmd_syndesc *as, char *arock) +GetPassword(struct cmd_syndesc *as, void *arock) { int code; char name[MAXKTCNAMELEN]; @@ -1062,7 +1062,7 @@ GetPassword(struct cmd_syndesc *as, char *arock) } int -GetRandomKey(struct cmd_syndesc *as, char *arock) +GetRandomKey(struct cmd_syndesc *as, void *arock) { int code; struct ktc_encryptionKey key; @@ -1088,7 +1088,7 @@ GetRandomKey(struct cmd_syndesc *as, char *arock) } int -Statistics(struct cmd_syndesc *as, char *arock) +Statistics(struct cmd_syndesc *as, void *arock) { int code; kasstats statics; @@ -1141,7 +1141,7 @@ Statistics(struct cmd_syndesc *as, char *arock) } int -DebugInfo(struct cmd_syndesc *as, char *arock) +DebugInfo(struct cmd_syndesc *as, void *arock) { int code; struct ka_debugInfo info; @@ -1237,21 +1237,21 @@ DebugInfo(struct cmd_syndesc *as, char *arock) } int -Interactive(struct cmd_syndesc *as, char *arock) +Interactive(struct cmd_syndesc *as, void *arock) { finished = 0; return 0; } int -Quit(struct cmd_syndesc *as, char *arock) +Quit(struct cmd_syndesc *as, void *arock) { finished = 1; return 0; } int -MyAfterProc(struct cmd_syndesc *as) +MyAfterProc(struct cmd_syndesc *as, void *arock) { if (!strcmp(as->name, "help")) return 0; @@ -1274,14 +1274,14 @@ char newCell[MAXKTCREALMLEN]; afs_int32 serverList[MAXSERVERS]; int -NoAuth(struct cmd_syndesc *as, char *arock) +NoAuth(struct cmd_syndesc *as, void *arock) { noauth = 1; return 0; } static int -MyBeforeProc(struct cmd_syndesc *as, char *arock) +MyBeforeProc(struct cmd_syndesc *as, void *arock) { extern struct passwd *getpwuid(); struct ktc_encryptionKey key; @@ -1539,7 +1539,7 @@ MyBeforeProc(struct cmd_syndesc *as, char *arock) /* These are some helpful command that deal with the cache managers tokens. */ static -ForgetTicket(struct cmd_syndesc *as, char *arock) +ForgetTicket(struct cmd_syndesc *as, void *arock) { afs_int32 code; @@ -1593,7 +1593,7 @@ ForgetTicket(struct cmd_syndesc *as, char *arock) } static -ListTickets(struct cmd_syndesc *as, char *arock) +ListTickets(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; int index, newIndex; @@ -1666,14 +1666,15 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) cmd_SetBeforeProc(MyBeforeProc, NULL); cmd_SetAfterProc(MyAfterProc, NULL); - ts = cmd_CreateSyntax("interactive", Interactive, 0, + ts = cmd_CreateSyntax("interactive", Interactive, NULL, "enter interactive mode"); add_std_args(ts); - ts = cmd_CreateSyntax("noauthentication", NoAuth, 0, + ts = cmd_CreateSyntax("noauthentication", NoAuth, NULL, "connect to AuthServer w/o using token"); - ts = cmd_CreateSyntax("list", ListUsers, 0, "list all users in database"); + ts = cmd_CreateSyntax("list", ListUsers, NULL, + "list all users in database"); cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "show detailed info about each user"); cmd_AddParm(ts, "-showadmin", CMD_FLAG, CMD_OPTIONAL, @@ -1683,26 +1684,26 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) add_std_args(ts); cmd_CreateAlias(ts, "ls"); - ts = cmd_CreateSyntax("examine", ExamineUser, 0, + ts = cmd_CreateSyntax("examine", ExamineUser, NULL, "examine the entry for a user"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); cmd_AddParm(ts, "-showkey", CMD_FLAG, CMD_OPTIONAL, "show the user's actual key rather than the checksum"); add_std_args(ts); - ts = cmd_CreateSyntax("create", CreateUser, 0, + ts = cmd_CreateSyntax("create", CreateUser, NULL, "create an entry for a user"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); cmd_AddParm(ts, "-initial_password", CMD_SINGLE, CMD_OPTIONAL, "initial password"); add_std_args(ts); - ts = cmd_CreateSyntax("delete", DeleteUser, 0, "delete a user"); + ts = cmd_CreateSyntax("delete", DeleteUser, NULL, "delete a user"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); add_std_args(ts); cmd_CreateAlias(ts, "rm"); - ts = cmd_CreateSyntax("setfields", SetFields, 0, + ts = cmd_CreateSyntax("setfields", SetFields, NULL, "set various fields in a user's entry"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); cmd_AddParm(ts, "-flags", CMD_SINGLE, CMD_OPTIONAL, @@ -1727,18 +1728,18 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) cmd_CreateAlias(ts, "sf"); - ts = cmd_CreateSyntax("unlock", Unlock, 0, + ts = cmd_CreateSyntax("unlock", Unlock, NULL, "Enable authentication ID after max failed attempts exceeded"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "authentication ID"); add_std_args(ts); - ts = cmd_CreateSyntax("stringtokey", StringToKey, 0, + ts = cmd_CreateSyntax("stringtokey", StringToKey, NULL, "convert a string to a key"); cmd_AddParm(ts, "-string", CMD_SINGLE, 0, "password string"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); - ts = cmd_CreateSyntax("setpassword", SetPassword, 0, + ts = cmd_CreateSyntax("setpassword", SetPassword, NULL, "set a user's password"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); cmd_AddParm(ts, "-new_password", CMD_SINGLE, CMD_OPTIONAL, @@ -1752,7 +1753,7 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) #endif /* set a user's key */ - ts = cmd_CreateSyntax("setkey", SetPassword, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("setkey", SetPassword, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); cmd_Seek(ts, 2); cmd_AddParm(ts, "-new_key", CMD_SINGLE, 0, "eight byte new key"); @@ -1761,7 +1762,7 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) add_std_args(ts); /* get a user's password */ - ts = cmd_CreateSyntax("getpassword", GetPassword, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("getpassword", GetPassword, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of user"); /* don't take standard args */ /* add_std_args (ts); */ @@ -1770,27 +1771,27 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) #endif /* get a random key */ - ts = cmd_CreateSyntax("getrandomkey", GetRandomKey, 0, + ts = cmd_CreateSyntax("getrandomkey", GetRandomKey, NULL, (char *)CMD_HIDDEN); add_std_args(ts); /* get a ticket for a specific server */ - ts = cmd_CreateSyntax("getticket", GetTicket, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("getticket", GetTicket, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of server"); cmd_AddParm(ts, "-lifetime", CMD_SINGLE, CMD_OPTIONAL, "ticket lifetime"); add_std_args(ts); - ts = cmd_CreateSyntax("statistics", Statistics, 0, + ts = cmd_CreateSyntax("statistics", Statistics, NULL, "show statistics for AuthServer"); add_std_args(ts); /* show debugging info from AuthServer */ - ts = cmd_CreateSyntax("debuginfo", DebugInfo, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("debuginfo", DebugInfo, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-hostname", CMD_SINGLE, CMD_OPTIONAL, "authentication server host name"); add_std_args(ts); - ts = cmd_CreateSyntax("forgetticket", ForgetTicket, 0, + ts = cmd_CreateSyntax("forgetticket", ForgetTicket, NULL, "delete user's tickets"); #ifdef notdef cmd_AddParm(ts, "-name", CMD_SINGLE, (CMD_OPTIONAL | CMD_HIDE), @@ -1798,13 +1799,13 @@ ka_AdminInteractive(int cmd_argc, char *cmd_argv[]) #endif cmd_AddParm(ts, "-all", CMD_FLAG, CMD_OPTIONAL, "delete all tickets"); - ts = cmd_CreateSyntax("listtickets", ListTickets, 0, + ts = cmd_CreateSyntax("listtickets", ListTickets, NULL, "show all cache manager tickets"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "name of server"); cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "show session key and ticket"); - ts = cmd_CreateSyntax("quit", Quit, 0, "exit program"); + ts = cmd_CreateSyntax("quit", Quit, NULL, "exit program"); finished = 1; conn = 0; /* no connection yet */ diff --git a/src/kauth/authclient.c b/src/kauth/authclient.c index 86d7b1f7ee..29081918ef 100644 --- a/src/kauth/authclient.c +++ b/src/kauth/authclient.c @@ -46,13 +46,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -559,15 +553,15 @@ ka_Authenticate(char *name, char *instance, char *cell, struct ubik_client * con version = 2; code = - kawrap_ubik_Call(KAA_AuthenticateV2, conn, 0, name, instance, start, - end, &arequest, &oanswer); + kawrap_ubik_Call(KAA_AuthenticateV2, conn, 0, name, instance, + start, end, &arequest, &oanswer, 0, 0); if (code == RXGEN_OPCODE) { oanswer.MaxSeqLen = sizeof(answer); oanswer.SeqBody = (char *)&answer; version = 1; code = ubik_Call(KAA_Authenticate, conn, 0, name, instance, start, end, - &arequest, &oanswer); + &arequest, &oanswer, 0, 0); if (code == RXGEN_OPCODE) { extern int KAA_Authenticate_old(); oanswer.MaxSeqLen = sizeof(answer_old); diff --git a/src/kauth/client.c b/src/kauth/client.c index 7dfdc76a20..3d551d1a49 100644 --- a/src/kauth/client.c +++ b/src/kauth/client.c @@ -41,13 +41,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #define __USE_XOPEN #include diff --git a/src/kauth/ka-forwarder.c b/src/kauth/ka-forwarder.c index d7fcb20325..fa9b42614f 100644 --- a/src/kauth/ka-forwarder.c +++ b/src/kauth/ka-forwarder.c @@ -9,12 +9,12 @@ /* * HISTORY * $Log$ - * Revision 1.2.6.2 2007/09/26 16:34:30 rees - * DELTA mdw-rxk5-m55-20070926 + * Revision 1.2.6.3 2008/01/03 16:47:47 rees + * DELTA mdw-rxk5-m58-20080103 * AUTHOR mdw@umich.edu * * merge in latest changes from openafs-devel-1_5_x - * update to rxk5-m55 + * update to rxk5-m58 * * Revision 1.2.2.2 2007/08/19 22:15:29 rra * DELTA DEVEL15-ka-forwarder-20060731 diff --git a/src/kauth/kaauxdb.c b/src/kauth/kaauxdb.c index aef045dfe5..507500a8f1 100644 --- a/src/kauth/kaauxdb.c +++ b/src/kauth/kaauxdb.c @@ -25,13 +25,7 @@ RCSID #ifdef HAVE_FCNTL_H #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "ubik_int.h" #include "kauth.h" diff --git a/src/kauth/kadatabase.c b/src/kauth/kadatabase.c index c3bee37b4c..d49fc8d674 100644 --- a/src/kauth/kadatabase.c +++ b/src/kauth/kadatabase.c @@ -19,14 +19,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#include #include #include #include @@ -114,6 +107,7 @@ static afs_int32 keyCacheVersion = 0; static afs_int32 maxKeyLifetime; static int dbfixup = 0; +void init_kadatabase(initFlags) int initFlags; /* same as init_kaprocs (see which) */ { diff --git a/src/kauth/kalocalcell.c b/src/kauth/kalocalcell.c index 0081e9c7e6..a2e7c07031 100644 --- a/src/kauth/kalocalcell.c +++ b/src/kauth/kalocalcell.c @@ -37,13 +37,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/kauth/kalog.c b/src/kauth/kalog.c index bd51f247b8..8bc6cbddf4 100644 --- a/src/kauth/kalog.c +++ b/src/kauth/kalog.c @@ -24,13 +24,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_FCNTL_H #include #endif diff --git a/src/kauth/kas.c b/src/kauth/kas.c index e1ee197c99..df410cf69b 100644 --- a/src/kauth/kas.c +++ b/src/kauth/kas.c @@ -29,13 +29,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/kauth/kaserver.c b/src/kauth/kaserver.c index dc51fcb95a..30ad2ebbdf 100644 --- a/src/kauth/kaserver.c +++ b/src/kauth/kaserver.c @@ -26,13 +26,7 @@ RCSID #include "kalog.h" /* for OpenLog() */ #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_FCNTL_H #include #endif diff --git a/src/kauth/kautils.c b/src/kauth/kautils.c index 2a43c4f1b9..21ee9d772c 100644 --- a/src/kauth/kautils.c +++ b/src/kauth/kautils.c @@ -22,13 +22,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/kauth/kdb.c b/src/kauth/kdb.c index de5aab4cd7..39df9e4e84 100644 --- a/src/kauth/kdb.c +++ b/src/kauth/kdb.c @@ -29,8 +29,8 @@ RCSID char *dbmfile; -static -cmdproc(register struct cmd_syndesc *as, afs_int32 arock) +static int +cmdproc(register struct cmd_syndesc *as, void * arock) { DBM *kdb; datum key, data; @@ -96,6 +96,7 @@ cmdproc(register struct cmd_syndesc *as, afs_int32 arock) } } dbm_close(kdb); + return 0; } @@ -111,7 +112,7 @@ main(int argc, char **argv) sprintf(dbmfile_help, "dbmfile to use (default %s)", AFSDIR_SERVER_KALOGDB_FILEPATH); dbmfile = AFSDIR_SERVER_KALOGDB_FILEPATH; - ts = cmd_CreateSyntax(NULL, cmdproc, 0, "Dump contents of dbm database"); + ts = cmd_CreateSyntax(NULL, cmdproc, NULL, "Dump contents of dbm database"); cmd_AddParm(ts, "-dbmfile", CMD_SINGLE, CMD_OPTIONAL, dbmfile_help); cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_OPTIONAL, "extract entries that match specified key"); @@ -128,5 +129,6 @@ int main(void) { printf("kdb not supported\n"); + return 1; } #endif diff --git a/src/kauth/kkids.c b/src/kauth/kkids.c index 48e6f14b8b..ef0fc1497c 100644 --- a/src/kauth/kkids.c +++ b/src/kauth/kkids.c @@ -422,6 +422,7 @@ init_child(char *myname) argv[1] = NULL; argv[0] = dirpath; execv(dirpath, argv); + return 0; } else { using_child = pid; /* save it for later */ childin = fdopen(pipe1[1], "w"); diff --git a/src/kauth/klog.c b/src/kauth/klog.c index 78a464e6a1..1642408996 100644 --- a/src/kauth/klog.c +++ b/src/kauth/klog.c @@ -19,14 +19,7 @@ RCSID #ifdef AFS_AIX32_ENV #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include @@ -70,7 +63,7 @@ RCSID #define KLOGEXIT(code) assert(!code || code >= KAMINERROR); \ rx_Finalize(); \ (!code ? exit(0) : exit((code)-KAMINERROR+1)) -extern int CommandProc(struct cmd_syndesc *as, char *arock); +int CommandProc(struct cmd_syndesc *as, void *arock); static int zero_argc; static char **zero_argv; @@ -98,7 +91,7 @@ main(int argc, char *argv[]) zero_argc = argc; zero_argv = argv; - ts = cmd_CreateSyntax(NULL, CommandProc, 0, + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "obtain Kerberos authentication"); #define aXFLAG 0 @@ -151,7 +144,7 @@ getpipepass(void) } int -CommandProc(struct cmd_syndesc *as, char *arock) +CommandProc(struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN]; char instance[MAXKTCNAMELEN]; diff --git a/src/kauth/knfs.c b/src/kauth/knfs.c index 68f08e5254..24a9b829d9 100644 --- a/src/kauth/knfs.c +++ b/src/kauth/knfs.c @@ -27,21 +27,12 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include #include - -extern struct cmd_syndesc *cmd_CreateSyntax(); - /* Modifications: @@ -358,10 +349,8 @@ NFSCopyToken(ahost, auid) return code; } -static -cmdproc(as, arock) - register struct cmd_syndesc *as; - afs_int32 arock; +static int +cmdproc(register struct cmd_syndesc *as, void *arock) { register struct hostent *the; char *tp, *sysname = 0; @@ -469,7 +458,7 @@ main(argc, argv) sigaction(SIGSEGV, &nsa, NULL); #endif - ts = cmd_CreateSyntax(NULL, cmdproc, 0, "copy tickets for NFS"); + ts = cmd_CreateSyntax(NULL, cmdproc, NULL, "copy tickets for NFS"); cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host name"); cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_OPTIONAL, "user ID (decimal)"); cmd_AddParm(ts, "-sysname", CMD_SINGLE, CMD_OPTIONAL, diff --git a/src/kauth/kpasswd.c b/src/kauth/kpasswd.c index 211b2f704e..eaaf9a0d0d 100644 --- a/src/kauth/kpasswd.c +++ b/src/kauth/kpasswd.c @@ -29,13 +29,7 @@ RCSID #ifndef AFS_NT40_ENV #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -79,7 +73,7 @@ RCSID /* The following code to make use of libcmd.a also stolen from klog.c. */ -int CommandProc(); +int CommandProc(struct cmd_syndesc *, void *); static int zero_argc; static char **zero_argv; @@ -207,9 +201,7 @@ timedout() #endif char passwd[BUFSIZ], npasswd[BUFSIZ], verify[BUFSIZ]; -CommandProc(as, arock) - char *arock; - struct cmd_syndesc *as; +CommandProc(struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN] = ""; char instance[MAXKTCNAMELEN] = ""; diff --git a/src/kauth/kpwvalid.c b/src/kauth/kpwvalid.c index e42ed953c6..2114eb9a01 100644 --- a/src/kauth/kpwvalid.c +++ b/src/kauth/kpwvalid.c @@ -14,13 +14,7 @@ RCSID ("$Header$"); #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_NT40_ENV #include #endif @@ -49,4 +43,5 @@ main(int argc, char *argv[]) fflush(stdout); } } + return rc; } diff --git a/src/kauth/krb_tf.c b/src/kauth/krb_tf.c index 21090569b6..7d577afe96 100644 --- a/src/kauth/krb_tf.c +++ b/src/kauth/krb_tf.c @@ -58,13 +58,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/kauth/krb_udp.c b/src/kauth/krb_udp.c index f77006a63f..21abc02b73 100644 --- a/src/kauth/krb_udp.c +++ b/src/kauth/krb_udp.c @@ -30,13 +30,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -823,7 +817,7 @@ process_udp_request(ksoc, pkt) return; } -static +static void SocketListener() { fd_set rfds; diff --git a/src/kauth/manyklog.c b/src/kauth/manyklog.c index 6a24faffb1..edeed350e0 100644 --- a/src/kauth/manyklog.c +++ b/src/kauth/manyklog.c @@ -62,7 +62,7 @@ RCSID #define KLOGEXIT(code) assert(!code || code >= KAMINERROR); \ rx_Finalize(); \ (!code ? exit(0) : exit((code)-KAMINERROR+1)) -int CommandProc(); +static int CommandProc(struct cmd_syndesc *, void *); static int zero_argc; static char **zero_argv; @@ -90,7 +90,7 @@ main(argc, argv) zero_argc = argc; zero_argv = argv; - ts = cmd_CreateSyntax(NULL, CommandProc, 0, + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "obtain Kerberos authentication"); #define aXFLAG 0 @@ -145,9 +145,8 @@ getpipepass() return gpbuf; } -CommandProc(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +CommandProc(struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN]; char instance[MAXKTCNAMELEN]; diff --git a/src/kauth/read_passwd.c b/src/kauth/read_passwd.c index 0cac47afc1..28f40535ee 100644 --- a/src/kauth/read_passwd.c +++ b/src/kauth/read_passwd.c @@ -35,14 +35,7 @@ int strcmp(); #if defined(AFS_SGI_ENV) #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #if defined (AFS_AIX_ENV) || defined(AFS_SGI_ENV) /* Just temp till we figure out the aix stuff */ diff --git a/src/kauth/rebuild.c b/src/kauth/rebuild.c index 3b74376ab5..00f1ae0d63 100644 --- a/src/kauth/rebuild.c +++ b/src/kauth/rebuild.c @@ -23,13 +23,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -223,6 +217,7 @@ PrintEntry(index, entry) } /* ntohEntry - convert back to host-order */ +void ntohEntry(struct kaentry *entryp) { entryp->flags = ntohl(entryp->flags); @@ -402,13 +397,13 @@ readDB(offset, buffer, size) afs_com_err(whoami, errno, "reading db got %d bytes", code); exit(3); } + return 0; } #include "AFS_component_version_number.c" -WorkerBee(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +WorkerBee(struct cmd_syndesc *as, void *arock) { afs_int32 code; char *dbFile; diff --git a/src/kauth/test/multiklog.c b/src/kauth/test/multiklog.c index a29384368c..5ee72e4959 100644 --- a/src/kauth/test/multiklog.c +++ b/src/kauth/test/multiklog.c @@ -52,7 +52,7 @@ RCSID -repeat is the number of times to iterate over the authentication */ -int CommandProc(); +static int CommandProc(struct cmd_syndesc *, void *); static int zero_argc; static char **zero_argv; @@ -67,7 +67,7 @@ main(argc, argv) zero_argc = argc; zero_argv = argv; - ts = cmd_CreateSyntax(NULL, CommandProc, 0, + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "obtain Kerberos authentication"); #define aXFLAG 0 @@ -120,9 +120,8 @@ getpipepass() return gpbuf; } -CommandProc(as, arock) - char *arock; - struct cmd_syndesc *as; +static int +CommandProc(struct cmd_syndesc *as, void *arock) { char name[MAXKTCNAMELEN]; char instance[MAXKTCNAMELEN]; diff --git a/src/kauth/test/test_getticket.c b/src/kauth/test/test_getticket.c index 446d45c5a1..c4fea4745b 100644 --- a/src/kauth/test/test_getticket.c +++ b/src/kauth/test/test_getticket.c @@ -207,12 +207,10 @@ GetTokenLife(name, passwd, expectedLife, match) CheckLife(t.endTime, t.startTime, expectedLife, match); } -static long -Main(as, arock) - IN struct cmd_syndesc *as; - IN char *arock; +static int +Main(struct cmd_syndesc *as, void *arock) { - long code; + int code; char name[MAXKTCNAMELEN]; char instance[MAXKTCNAMELEN]; char newCell[MAXKTCREALMLEN]; @@ -511,7 +509,7 @@ main(argc, argv) initialize_KA_error_table(); initialize_rx_error_table(); - ts = cmd_CreateSyntax(0, Main, 0, "Main program"); + ts = cmd_CreateSyntax(NULL, Main, NULL, "Main program"); /* 0 */ cmd_AddParm(ts, "-patient", CMD_FLAG, CMD_OPTIONAL, "wait for TGS ticket to age"); cmd_Seek(ts, 12); diff --git a/src/kauth/test/test_rxkad_free.c b/src/kauth/test/test_rxkad_free.c index 1c1e767461..9fc1a691cc 100644 --- a/src/kauth/test/test_rxkad_free.c +++ b/src/kauth/test/test_rxkad_free.c @@ -52,12 +52,10 @@ PrintRxkadStats() rxkad_stats.destroyUnauth); } -static long -Main(as, arock) - IN struct cmd_syndesc *as; - IN char *arock; +static int +Main(struct cmd_syndesc *as, void *arock) { - long code; + int code; char name[MAXKTCNAMELEN]; char instance[MAXKTCNAMELEN]; char newCell[MAXKTCREALMLEN]; @@ -374,7 +372,7 @@ main(argc, argv) initialize_KA_error_table(); initialize_rx_error_table(); - ts = cmd_CreateSyntax(0, Main, 0, "Main program"); + ts = cmd_CreateSyntax(NULL, Main, NULL, "Main program"); /* 0 */ cmd_AddParm(ts, "-number", CMD_SINGLE, CMD_OPTIONAL, "number of iterations"); /* 1 */ cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, diff --git a/src/kauth/token.c b/src/kauth/token.c index 7a126bba78..d28e3c7020 100644 --- a/src/kauth/token.c +++ b/src/kauth/token.c @@ -44,13 +44,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* netinet/in.h and cellconfig.h are needed together */ #include /* these are needed together */ diff --git a/src/kauth/user.c b/src/kauth/user.c index f53730a6b8..7a188d7a29 100644 --- a/src/kauth/user.c +++ b/src/kauth/user.c @@ -45,13 +45,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/libacl/aclprocs.c b/src/libacl/aclprocs.c index 24367419c4..03a3fd485a 100644 --- a/src/libacl/aclprocs.c +++ b/src/libacl/aclprocs.c @@ -25,9 +25,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#endif #include #include #include diff --git a/src/libadmin/adminutil/afs_AdminInternal.h b/src/libadmin/adminutil/afs_AdminInternal.h index ae69853942..d8ce0a40bb 100644 --- a/src/libadmin/adminutil/afs_AdminInternal.h +++ b/src/libadmin/adminutil/afs_AdminInternal.h @@ -50,6 +50,12 @@ typedef struct afs_cell_handle { int pts_valid; int vos_valid; int vos_new; + /* need to add server lists with TTL + * so we don't pound the dns servers constantly + * when generating the iterators + */ + void *server_list; + time_t server_ttl; /* expiration time */ int end_magic; } afs_cell_handle_t, *afs_cell_handle_p; diff --git a/src/libadmin/bos/afs_bosAdmin.c b/src/libadmin/bos/afs_bosAdmin.c index caeb31ba13..8df7268dbd 100644 --- a/src/libadmin/bos/afs_bosAdmin.c +++ b/src/libadmin/bos/afs_bosAdmin.c @@ -32,14 +32,7 @@ RCSID #else #include #endif - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif typedef struct bos_server { int begin_magic; diff --git a/src/libadmin/cfg/cfgclient.c b/src/libadmin/cfg/cfgclient.c index 3d2aadd84e..9ac669f7b5 100644 --- a/src/libadmin/cfg/cfgclient.c +++ b/src/libadmin/cfg/cfgclient.c @@ -23,15 +23,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include @@ -104,7 +96,7 @@ cfg_ClientQueryStatus(const char *hostName, /* name of host */ afs_status_t clientSt = 0; char *clientCellName = NULL; short cmInstalled = 0; - unsigned cmVersion; + unsigned cmVersion = 0; /* validate parameters */ diff --git a/src/libadmin/cfg/cfginternal.c b/src/libadmin/cfg/cfginternal.c index aad5d62b69..aa35bade17 100644 --- a/src/libadmin/cfg/cfginternal.c +++ b/src/libadmin/cfg/cfginternal.c @@ -480,8 +480,8 @@ cfgutil_HostAddressFetchAll(const char *hostName, int *addrCount, { int rc = 1; afs_status_t tst = 0; - int aCount; - afs_int32 *aList; + int aCount = 0; + afs_int32 *aList = NULL; #ifdef AFS_NT40_ENV /* Note: gethostbyname() allocs hostent on a per-thread basis */ diff --git a/src/libadmin/cfg/test/cfgtest.c b/src/libadmin/cfg/test/cfgtest.c index 670c73f0db..3416e80066 100644 --- a/src/libadmin/cfg/test/cfgtest.c +++ b/src/libadmin/cfg/test/cfgtest.c @@ -90,7 +90,7 @@ CellServDbCallBack(void *callBackId, cfg_cellServDbStatus_t * statusItemP, static int -DoCellServDbAddHost(struct cmd_syndesc *as, char *arock) +DoCellServDbAddHost(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; int maxUpdates; @@ -135,7 +135,7 @@ DoCellServDbAddHost(struct cmd_syndesc *as, char *arock) static int -DoCellServDbRemoveHost(struct cmd_syndesc *as, char *arock) +DoCellServDbRemoveHost(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; int maxUpdates; @@ -181,7 +181,7 @@ DoCellServDbRemoveHost(struct cmd_syndesc *as, char *arock) static int -DoCellServDbEnumerate(struct cmd_syndesc *as, char *arock) +DoCellServDbEnumerate(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; char *fsDbHost = as->parms[0].items->data; @@ -216,21 +216,21 @@ SetupCellServDbCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("CellServDbAddHost", DoCellServDbAddHost, 0, + ts = cmd_CreateSyntax("CellServDbAddHost", DoCellServDbAddHost, NULL, "add configuration target to server CellServDB"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-syshost", CMD_SINGLE, CMD_OPTIONAL, "system control host"); - ts = cmd_CreateSyntax("CellServDbRemoveHost", DoCellServDbRemoveHost, 0, + ts = cmd_CreateSyntax("CellServDbRemoveHost", DoCellServDbRemoveHost, NULL, "remove configuration target from server CellServDB"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-syshost", CMD_SINGLE, CMD_OPTIONAL, "system control host"); - ts = cmd_CreateSyntax("CellServDbEnumerate", DoCellServDbEnumerate, 0, + ts = cmd_CreateSyntax("CellServDbEnumerate", DoCellServDbEnumerate, NULL, "enumerate server CellServDB from specified host"); cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host name"); @@ -245,7 +245,7 @@ SetupCellServDbCmd(void) static int -DoDbServersWaitForQuorum(struct cmd_syndesc *as, char *arock) +DoDbServersWaitForQuorum(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -273,7 +273,7 @@ DoDbServersWaitForQuorum(struct cmd_syndesc *as, char *arock) static int -DoFileServerStop(struct cmd_syndesc *as, char *arock) +DoFileServerStop(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -294,7 +294,7 @@ DoFileServerStop(struct cmd_syndesc *as, char *arock) } static int -DoFileServerStart(struct cmd_syndesc *as, char *arock) +DoFileServerStart(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -321,18 +321,18 @@ SetupServerCmd(void) struct cmd_syndesc *ts; ts = cmd_CreateSyntax("DbServersWaitForQuorum", DoDbServersWaitForQuorum, - 0, "wait for database servers to achieve quorum"); + NULL, "wait for database servers to achieve quorum"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-timeout", CMD_SINGLE, CMD_OPTIONAL, "timeout in seconds"); - ts = cmd_CreateSyntax("FileServerStop", DoFileServerStop, 0, + ts = cmd_CreateSyntax("FileServerStop", DoFileServerStop, NULL, "stop and unconfigure fileserver on specified host"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); - ts = cmd_CreateSyntax("FileServerStart", DoFileServerStart, 0, + ts = cmd_CreateSyntax("FileServerStart", DoFileServerStart, NULL, "start the fileserver on specified host"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); @@ -344,7 +344,7 @@ SetupServerCmd(void) static int -DoHostPartitionTableEnumerate(struct cmd_syndesc *as, char *arock) +DoHostPartitionTableEnumerate(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; cfg_partitionEntry_t *vptable; @@ -385,7 +385,7 @@ SetupHostCmd(void) struct cmd_syndesc *ts; ts = cmd_CreateSyntax("HostPartitionTableEnumerate", - DoHostPartitionTableEnumerate, 0, + DoHostPartitionTableEnumerate, NULL, "enumerate vice partition table"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); @@ -398,7 +398,7 @@ SetupHostCmd(void) static int -DoClientCellServDbAdd(struct cmd_syndesc *as, char *arock) +DoClientCellServDbAdd(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -422,7 +422,7 @@ DoClientCellServDbAdd(struct cmd_syndesc *as, char *arock) static int -DoClientCellServDbRemove(struct cmd_syndesc *as, char *arock) +DoClientCellServDbRemove(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -447,7 +447,7 @@ DoClientCellServDbRemove(struct cmd_syndesc *as, char *arock) static int -DoClientStart(struct cmd_syndesc *as, char *arock) +DoClientStart(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -474,7 +474,7 @@ DoClientStart(struct cmd_syndesc *as, char *arock) static int -DoClientStop(struct cmd_syndesc *as, char *arock) +DoClientStop(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -501,7 +501,7 @@ DoClientStop(struct cmd_syndesc *as, char *arock) static int -DoClientSetCell(struct cmd_syndesc *as, char *arock) +DoClientSetCell(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *hostHandle; @@ -544,7 +544,7 @@ DoClientSetCell(struct cmd_syndesc *as, char *arock) static int -DoClientQueryStatus(struct cmd_syndesc *as, char *arock) +DoClientQueryStatus(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; char *cfgHost = as->parms[0].items->data; @@ -578,7 +578,7 @@ DoClientQueryStatus(struct cmd_syndesc *as, char *arock) static int -DoHostQueryStatus(struct cmd_syndesc *as, char *arock) +DoHostQueryStatus(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; char *cfgHost = as->parms[0].items->data; @@ -610,7 +610,7 @@ SetupClientCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("ClientCellServDbAdd", DoClientCellServDbAdd, 0, + ts = cmd_CreateSyntax("ClientCellServDbAdd", DoClientCellServDbAdd, NULL, "add host entry to client CellServDB"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); @@ -618,38 +618,38 @@ SetupClientCmd(void) cmd_AddParm(ts, "-dbhost", CMD_SINGLE, CMD_REQUIRED, "host to add"); ts = cmd_CreateSyntax("ClientCellServDbRemove", DoClientCellServDbRemove, - 0, "remove host entry from client CellServDB"); + NULL, "remove host entry from client CellServDB"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_REQUIRED, "cell name"); cmd_AddParm(ts, "-dbhost", CMD_SINGLE, CMD_REQUIRED, "host to remove"); - ts = cmd_CreateSyntax("ClientSetCell", DoClientSetCell, 0, + ts = cmd_CreateSyntax("ClientSetCell", DoClientSetCell, NULL, "set default client cell"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_REQUIRED, "cell name"); cmd_AddParm(ts, "-dbhosts", CMD_LIST, CMD_REQUIRED, "database hosts"); - ts = cmd_CreateSyntax("ClientQueryStatus", DoClientQueryStatus, 0, + ts = cmd_CreateSyntax("ClientQueryStatus", DoClientQueryStatus, NULL, "query status of client on host"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); - ts = cmd_CreateSyntax("HostQueryStatus", DoHostQueryStatus, 0, + ts = cmd_CreateSyntax("HostQueryStatus", DoHostQueryStatus, NULL, "query status of server on host"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); - ts = cmd_CreateSyntax("ClientStart", DoClientStart, 0, + ts = cmd_CreateSyntax("ClientStart", DoClientStart, NULL, "start the client"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-timeout", CMD_SINGLE, CMD_REQUIRED, "wait timeout"); - ts = cmd_CreateSyntax("ClientStop", DoClientStop, 0, "stop the client"); + ts = cmd_CreateSyntax("ClientStop", DoClientStop, NULL, "stop the client"); cmd_AddParm(ts, "-cfghost", CMD_SINGLE, CMD_REQUIRED, "configuration host"); cmd_AddParm(ts, "-timeout", CMD_SINGLE, CMD_REQUIRED, "wait timeout"); diff --git a/src/libadmin/client/afs_clientAdmin.c b/src/libadmin/client/afs_clientAdmin.c index e7e561c100..5bc1116206 100644 --- a/src/libadmin/client/afs_clientAdmin.c +++ b/src/libadmin/client/afs_clientAdmin.c @@ -66,6 +66,8 @@ RCSID static const unsigned long ADMIN_TICKET_LIFETIME = 24 * 3600; +static const unsigned long SERVER_TTL = 10 * 60; + /* * We need a way to track whether or not the client library has been * initialized. We count on the fact that the other library initialization @@ -972,6 +974,8 @@ if (!t_handle->kas_token_set) continue; c_handle->begin_magic = BEGIN_MAGIC; c_handle->is_valid = 1; c_handle->is_null = 0; + c_handle->server_list = NULL; + c_handle->server_ttl = 0; c_handle->end_magic = END_MAGIC; *cellHandleP = (void *)c_handle; } @@ -1046,9 +1050,11 @@ afsclient_NullCellOpen(void **cellHandleP, afs_status_p st) c_handle->kas_valid = 0; c_handle->pts_valid = 0; c_handle->vos_valid = 0; - c_handle->kas = 0; - c_handle->pts = 0; - c_handle->vos = 0; + c_handle->kas = NULL; + c_handle->pts = NULL; + c_handle->vos = NULL; + c_handle->server_list = NULL; + c_handle->server_ttl = 0; *cellHandleP = (void *)c_handle; rc = 1; @@ -1097,6 +1103,8 @@ afsclient_CellClose(const void *cellHandle, afs_status_p st) goto fail_afsclient_CellClose; } + if (c_handle->server_list) + free(c_handle->server_list); if (c_handle->kas_valid) ubik_ClientDestroy(c_handle->kas); if (c_handle->pts_valid) @@ -1851,6 +1859,7 @@ afsclient_AFSServerGetBegin(const void *cellHandle, void **iterationIdP, afs_admin_iterator_p iter = (afs_admin_iterator_p) malloc(sizeof(afs_admin_iterator_t)); server_get_p serv = (server_get_p) calloc(1, sizeof(server_get_t)); + server_get_p serv_cache = NULL; const char *cellName; void *database_iter; util_databaseServerEntry_t database_entry; @@ -1873,57 +1882,77 @@ afsclient_AFSServerGetBegin(const void *cellHandle, void **iterationIdP, goto fail_afsclient_AFSServerGetBegin; } - /* - * Retrieve the list of database servers for this cell. - */ - - if (!afsclient_CellNameGet(cellHandle, &cellName, &tst)) { - goto fail_afsclient_AFSServerGetBegin; + restart: + LOCK_GLOBAL_MUTEX; + if (c_handle->server_list != NULL && c_handle->server_ttl < time(NULL)) { + serv_cache = c_handle->server_list; + c_handle->server_list = NULL; } + UNLOCK_GLOBAL_MUTEX; - if (!util_DatabaseServerGetBegin(cellName, &database_iter, &tst)) { - goto fail_afsclient_AFSServerGetBegin; - } + if (c_handle->server_list == NULL) { + if (serv_cache == NULL) { + serv_cache = (server_get_p) calloc(1, sizeof(server_get_t)); - while (util_DatabaseServerGetNext(database_iter, &database_entry, &tst)) { - serv->server[serv->total].serverAddress[0] = - database_entry.serverAddress; - serv->server[serv->total].serverType = DATABASE_SERVER; - serv->total++; - } + if (serv_cache == NULL) { + tst = ADMNOMEM; + goto fail_afsclient_AFSServerGetBegin; + } + } - if (tst != ADMITERATORDONE) { - util_DatabaseServerGetDone(database_iter, 0); - goto fail_afsclient_AFSServerGetBegin; - } - - if (!util_DatabaseServerGetDone(database_iter, &tst)) { - goto fail_afsclient_AFSServerGetBegin; - } - - /* - * Retrieve the list of file servers for this cell. - */ - - if (!vos_FileServerGetBegin(cellHandle, 0, &fileserver_iter, &tst)) { - goto fail_afsclient_AFSServerGetBegin; - } - - while (vos_FileServerGetNext(fileserver_iter, &fileserver_entry, &tst)) { /* - * See if any of the addresses returned in this fileserver_entry - * structure already exist in the list of servers we're building. - * If not, create a new record for this server. + * Retrieve the list of database servers for this cell. */ - is_dup = 0; - for (iserv = 0; iserv < serv->total; iserv++) { - for (ientryaddr = 0; ientryaddr < fileserver_entry.count; - ientryaddr++) { - for (iservaddr = 0; iservaddr < AFS_MAX_SERVER_ADDRESS; - iservaddr++) { - if (serv->server[iserv].serverAddress[iservaddr] == - fileserver_entry.serverAddress[ientryaddr]) { - is_dup = 1; + + if (!afsclient_CellNameGet(c_handle, &cellName, &tst)) { + goto fail_afsclient_AFSServerGetBegin; + } + + if (!util_DatabaseServerGetBegin(cellName, &database_iter, &tst)) { + goto fail_afsclient_AFSServerGetBegin; + } + + while (util_DatabaseServerGetNext(database_iter, &database_entry, &tst)) { + serv->server[serv->total].serverAddress[0] = + database_entry.serverAddress; + serv->server[serv->total].serverType = DATABASE_SERVER; + serv->total++; + } + + if (tst != ADMITERATORDONE) { + util_DatabaseServerGetDone(database_iter, 0); + goto fail_afsclient_AFSServerGetBegin; + } + + if (!util_DatabaseServerGetDone(database_iter, &tst)) { + goto fail_afsclient_AFSServerGetBegin; + } + + /* + * Retrieve the list of file servers for this cell. + */ + + if (!vos_FileServerGetBegin(c_handle, 0, &fileserver_iter, &tst)) { + goto fail_afsclient_AFSServerGetBegin; + } + + while (vos_FileServerGetNext(fileserver_iter, &fileserver_entry, &tst)) { + /* + * See if any of the addresses returned in this fileserver_entry + * structure already exist in the list of servers we're building. + * If not, create a new record for this server. + */ + is_dup = 0; + for (iserv = 0; iserv < serv->total; iserv++) { + for (ientryaddr = 0; ientryaddr < fileserver_entry.count; ientryaddr++) { + for (iservaddr = 0; iservaddr < AFS_MAX_SERVER_ADDRESS; iservaddr++) { + if (serv->server[iserv].serverAddress[iservaddr] == + fileserver_entry.serverAddress[ientryaddr]) { + is_dup = 1; + break; + } + } + if (is_dup) { break; } } @@ -1931,72 +1960,80 @@ afsclient_AFSServerGetBegin(const void *cellHandle, void **iterationIdP, break; } } + if (is_dup) { - break; + serv->server[iserv].serverType |= FILE_SERVER; + } else { + iserv = serv->total++; + serv->server[iserv].serverType = FILE_SERVER; } - } - if (is_dup) { - serv->server[iserv].serverType |= FILE_SERVER; - } else { - iserv = serv->total++; - serv->server[iserv].serverType = FILE_SERVER; - } + /* + * Add the addresses from the vldb list to the serv->server[iserv] + * record. Remember that VLDB's list-of-addrs is not guaranteed + * to be unique in a particular entry, or to return only one entry + * per machine--so when we add addresses, always check for + * duplicate entries. + */ - /* - * Add the addresses from the vldb list to the serv->server[iserv] - * record. Remember that VLDB's list-of-addrs is not guaranteed - * to be unique in a particular entry, or to return only one entry - * per machine--so when we add addresses, always check for - * duplicate entries. - */ - - for (ientryaddr = 0; ientryaddr < fileserver_entry.count; - ientryaddr++) { - for (iservaddr = 0; iservaddr < AFS_MAX_SERVER_ADDRESS; - iservaddr++) { - if (serv->server[iserv].serverAddress[iservaddr] == - fileserver_entry.serverAddress[ientryaddr]) { - break; - } - } - if (iservaddr == AFS_MAX_SERVER_ADDRESS) { - for (iservaddr = 0; iservaddr < AFS_MAX_SERVER_ADDRESS; - iservaddr++) { - if (!serv->server[iserv].serverAddress[iservaddr]) { - serv->server[iserv].serverAddress[iservaddr] = - fileserver_entry.serverAddress[ientryaddr]; + for (ientryaddr = 0; ientryaddr < fileserver_entry.count; ientryaddr++) { + for (iservaddr = 0; iservaddr < AFS_MAX_SERVER_ADDRESS; iservaddr++) { + if (serv->server[iserv].serverAddress[iservaddr] == + fileserver_entry.serverAddress[ientryaddr]) { break; } } + if (iservaddr == AFS_MAX_SERVER_ADDRESS) { + for (iservaddr = 0; iservaddr < AFS_MAX_SERVER_ADDRESS; + iservaddr++) { + if (!serv->server[iserv].serverAddress[iservaddr]) { + serv->server[iserv].serverAddress[iservaddr] = + fileserver_entry.serverAddress[ientryaddr]; + break; + } + } + } } } - } - if (tst != ADMITERATORDONE) { - vos_FileServerGetDone(fileserver_iter, 0); - goto fail_afsclient_AFSServerGetBegin; - } - - if (!vos_FileServerGetDone(fileserver_iter, &tst)) { - goto fail_afsclient_AFSServerGetBegin; - } - - /* - * Iterate over the list and fill in the hostname of each of the servers - */ - - LOCK_GLOBAL_MUTEX; - for (iserv = 0; iserv < serv->total; iserv++) { - int addr = htonl(serv->server[iserv].serverAddress[0]); - host = gethostbyaddr((const char *)&addr, sizeof(int), AF_INET); - if (host != NULL) { - strncpy(serv->server[iserv].serverName, host->h_name, - AFS_MAX_SERVER_NAME_LEN); - serv->server[iserv].serverName[AFS_MAX_SERVER_NAME_LEN - 1] = '\0'; + if (tst != ADMITERATORDONE) { + vos_FileServerGetDone(fileserver_iter, 0); + goto fail_afsclient_AFSServerGetBegin; } + + if (!vos_FileServerGetDone(fileserver_iter, &tst)) { + goto fail_afsclient_AFSServerGetBegin; + } + + /* + * Iterate over the list and fill in the hostname of each of the servers + */ + + for (iserv = 0; iserv < serv->total; iserv++) { + int addr = htonl(serv->server[iserv].serverAddress[0]); + LOCK_GLOBAL_MUTEX; + host = gethostbyaddr((const char *)&addr, sizeof(int), AF_INET); + if (host != NULL) { + strncpy(serv->server[iserv].serverName, host->h_name, + AFS_MAX_SERVER_NAME_LEN); + serv->server[iserv].serverName[AFS_MAX_SERVER_NAME_LEN - 1] = '\0'; + } + UNLOCK_GLOBAL_MUTEX; + } + + memcpy(serv_cache, serv, sizeof(server_get_t)); + } else { + int race = 0; + LOCK_GLOBAL_MUTEX; + if (c_handle->server_list == NULL) + race = 1; + else + memcpy(serv, c_handle->server_list, sizeof(server_get_t)); + UNLOCK_GLOBAL_MUTEX; + if (race) + goto restart; } - UNLOCK_GLOBAL_MUTEX; + if (IteratorInit (iter, (void *)serv, GetServerRPC, GetServerFromCache, NULL, NULL, &tst)) { @@ -2007,17 +2044,28 @@ afsclient_AFSServerGetBegin(const void *cellHandle, void **iterationIdP, fail_afsclient_AFSServerGetBegin: if (rc == 0) { - if (iter != NULL) { + if (iter != NULL) free(iter); - } - if (serv != NULL) { + if (serv != NULL) free(serv); + if (serv_cache != NULL) + free(serv_cache); + } else { + if (serv_cache) { + LOCK_GLOBAL_MUTEX; + /* in case there was a race and we constructed the list twice */ + if (c_handle->server_list) + free(c_handle->server_list); + + c_handle->server_list = serv_cache; + c_handle->server_ttl = time(NULL) + SERVER_TTL; + UNLOCK_GLOBAL_MUTEX; } } - if (st != NULL) { + if (st != NULL) *st = tst; - } + return rc; } diff --git a/src/libadmin/kas/afs_kasAdmin.c b/src/libadmin/kas/afs_kasAdmin.c index 468b72583a..d3bbdce1d0 100644 --- a/src/libadmin/kas/afs_kasAdmin.c +++ b/src/libadmin/kas/afs_kasAdmin.c @@ -14,14 +14,7 @@ RCSID ("$Header$"); #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "afs_kasAdmin.h" diff --git a/src/libadmin/pts/afs_ptsAdmin.c b/src/libadmin/pts/afs_ptsAdmin.c index 1a6bfae8d0..bdcae6b579 100644 --- a/src/libadmin/pts/afs_ptsAdmin.c +++ b/src/libadmin/pts/afs_ptsAdmin.c @@ -14,15 +14,6 @@ RCSID ("$Header$"); #include - -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include "afs_ptsAdmin.h" #include "../adminutil/afs_AdminInternal.h" diff --git a/src/libadmin/samples/rxdebug_conns.c b/src/libadmin/samples/rxdebug_conns.c index 00e00f6644..2e0ff99fbb 100644 --- a/src/libadmin/samples/rxdebug_conns.c +++ b/src/libadmin/samples/rxdebug_conns.c @@ -69,7 +69,7 @@ main(int argc, char *argv[]) struct rx_debugConn conn; afs_uint32 supportedStats; afs_uint32 supportedValues; - int allconns; + int allconns = 1; int i; ParseArgs(argc, argv, &srvrName, &srvrPort); diff --git a/src/libadmin/samples/rxdebug_rx_stats.c b/src/libadmin/samples/rxdebug_rx_stats.c index d4d230eb82..b8ed0af327 100644 --- a/src/libadmin/samples/rxdebug_rx_stats.c +++ b/src/libadmin/samples/rxdebug_rx_stats.c @@ -23,15 +23,7 @@ RCSID #include #include #endif - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include diff --git a/src/libadmin/samples/rxstat_get_peer.c b/src/libadmin/samples/rxstat_get_peer.c index 3b25040077..0632411ea2 100644 --- a/src/libadmin/samples/rxstat_get_peer.c +++ b/src/libadmin/samples/rxstat_get_peer.c @@ -24,13 +24,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/libadmin/samples/rxstat_get_process.c b/src/libadmin/samples/rxstat_get_process.c index 0eb31bdaba..6c7bc35716 100644 --- a/src/libadmin/samples/rxstat_get_process.c +++ b/src/libadmin/samples/rxstat_get_process.c @@ -23,14 +23,7 @@ RCSID #include #include #endif - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/libadmin/test/afscp.c b/src/libadmin/test/afscp.c index 48259b6719..af0fb22a8c 100644 --- a/src/libadmin/test/afscp.c +++ b/src/libadmin/test/afscp.c @@ -59,7 +59,7 @@ pthread_mutex_t rxkad_random_mutex = PTHREAD_MUTEX_INITIALIZER; */ static int -MyBeforeProc(struct cmd_syndesc *as, char *arock) +MyBeforeProc(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; int no_auth = 0; @@ -149,7 +149,7 @@ MyBeforeProc(struct cmd_syndesc *as, char *arock) } static int -MyAfterProc(struct cmd_syndesc *as) +MyAfterProc(struct cmd_syndesc *as,void *arock) { afsclient_CellClose(cellHandle, (afs_status_p) 0); diff --git a/src/libadmin/test/bos.c b/src/libadmin/test/bos.c index ec7b95ab22..bc85cc932b 100644 --- a/src/libadmin/test/bos.c +++ b/src/libadmin/test/bos.c @@ -268,7 +268,7 @@ ktime_ParsePeriodic(char *adate, bos_RestartTime_p ak) } int -DoBosProcessCreate(struct cmd_syndesc *as, char *arock) +DoBosProcessCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, BINARY, CRON, CRONTIME, NOTIFIER @@ -334,7 +334,7 @@ DoBosProcessCreate(struct cmd_syndesc *as, char *arock) } int -DoBosFSProcessCreate(struct cmd_syndesc *as, char *arock) +DoBosFSProcessCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, FILESERVER, VOLSERVER, SALVAGER, NOTIFIER @@ -386,7 +386,7 @@ DoBosFSProcessCreate(struct cmd_syndesc *as, char *arock) } int -DoBosProcessDelete(struct cmd_syndesc *as, char *arock) +DoBosProcessDelete(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoBosProcessDelete_parm_t; afs_status_t st = 0; @@ -435,7 +435,7 @@ Print_bos_ProcessExecutionState_p(bos_ProcessExecutionState_p state, } int -DoBosProcessExecutionStateGet(struct cmd_syndesc *as, char *arock) +DoBosProcessExecutionStateGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoBosProcessExecutionStateGet_parm_t; afs_status_t st = 0; @@ -471,7 +471,7 @@ DoBosProcessExecutionStateGet(struct cmd_syndesc *as, char *arock) } int -DoBosProcessExecutionStateSet(struct cmd_syndesc *as, char *arock) +DoBosProcessExecutionStateSet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STOPPED, RUNNING @@ -522,7 +522,7 @@ DoBosProcessExecutionStateSet(struct cmd_syndesc *as, char *arock) } int -DoBosProcessExecutionStateSetTemporary(struct cmd_syndesc *as, char *arock) +DoBosProcessExecutionStateSetTemporary(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STOPPED, RUNNING @@ -574,7 +574,7 @@ DoBosProcessExecutionStateSetTemporary(struct cmd_syndesc *as, char *arock) } int -DoBosProcessNameList(struct cmd_syndesc *as, char *arock) +DoBosProcessNameList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosProcessNameList_parm_t; afs_status_t st = 0; @@ -663,7 +663,7 @@ Print_bos_ProcessInfo_p(bos_ProcessInfo_p info, const char *prefix) } int -DoBosProcessInfoGet(struct cmd_syndesc *as, char *arock) +DoBosProcessInfoGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoBosProcessInfoGet_parm_t; afs_status_t st = 0; @@ -694,7 +694,7 @@ DoBosProcessInfoGet(struct cmd_syndesc *as, char *arock) } int -DoBosProcessParameterList(struct cmd_syndesc *as, char *arock) +DoBosProcessParameterList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoBosProcessParameterList_parm_t; afs_status_t st = 0; @@ -738,7 +738,7 @@ DoBosProcessParameterList(struct cmd_syndesc *as, char *arock) } int -DoBosProcessNotifierGet(struct cmd_syndesc *as, char *arock) +DoBosProcessNotifierGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoBosProcessNotifierGet_parm_t; afs_status_t st = 0; @@ -773,7 +773,7 @@ DoBosProcessNotifierGet(struct cmd_syndesc *as, char *arock) } int -DoBosProcessRestart(struct cmd_syndesc *as, char *arock) +DoBosProcessRestart(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoBosProcessRestart_parm_t; afs_status_t st = 0; @@ -801,7 +801,7 @@ DoBosProcessRestart(struct cmd_syndesc *as, char *arock) } int -DoBosProcessAllStop(struct cmd_syndesc *as, char *arock) +DoBosProcessAllStop(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosProcessAllStop_parm_t; afs_status_t st = 0; @@ -824,7 +824,7 @@ DoBosProcessAllStop(struct cmd_syndesc *as, char *arock) } int -DoBosProcessAllStart(struct cmd_syndesc *as, char *arock) +DoBosProcessAllStart(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosProcessAllStart_parm_t; afs_status_t st = 0; @@ -847,7 +847,7 @@ DoBosProcessAllStart(struct cmd_syndesc *as, char *arock) } int -DoBosProcessAllWaitStop(struct cmd_syndesc *as, char *arock) +DoBosProcessAllWaitStop(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosProcessAllWaitStop_parm_t; afs_status_t st = 0; @@ -870,7 +870,7 @@ DoBosProcessAllWaitStop(struct cmd_syndesc *as, char *arock) } int -DoBosProcessAllWaitTransition(struct cmd_syndesc *as, char *arock) +DoBosProcessAllWaitTransition(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosProcessAllWaitTransition_parm_t; afs_status_t st = 0; @@ -893,7 +893,7 @@ DoBosProcessAllWaitTransition(struct cmd_syndesc *as, char *arock) } int -DoBosProcessAllStopAndRestart(struct cmd_syndesc *as, char *arock) +DoBosProcessAllStopAndRestart(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, INCLUDEBOS } DoBosProcessAllStopAndRestart_parm_t; afs_status_t st = 0; @@ -921,7 +921,7 @@ DoBosProcessAllStopAndRestart(struct cmd_syndesc *as, char *arock) } int -DoBosAdminCreate(struct cmd_syndesc *as, char *arock) +DoBosAdminCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, ADMIN } DoBosAdminCreate_parm_t; afs_status_t st = 0; @@ -949,7 +949,7 @@ DoBosAdminCreate(struct cmd_syndesc *as, char *arock) } int -DoBosAdminDelete(struct cmd_syndesc *as, char *arock) +DoBosAdminDelete(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, ADMIN } DoBosAdminDelete_parm_t; afs_status_t st = 0; @@ -977,7 +977,7 @@ DoBosAdminDelete(struct cmd_syndesc *as, char *arock) } int -DoBosAdminList(struct cmd_syndesc *as, char *arock) +DoBosAdminList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosAdminList_parm_t; afs_status_t st = 0; @@ -1016,7 +1016,7 @@ DoBosAdminList(struct cmd_syndesc *as, char *arock) } int -DoBosKeyCreate(struct cmd_syndesc *as, char *arock) +DoBosKeyCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, VERSIONNUMBER, KEY } DoBosKeyCreate_parm_t; afs_status_t st = 0; @@ -1058,7 +1058,7 @@ DoBosKeyCreate(struct cmd_syndesc *as, char *arock) } int -DoBosKeyDelete(struct cmd_syndesc *as, char *arock) +DoBosKeyDelete(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, VERSIONNUMBER } DoBosKeyDelete_parm_t; afs_status_t st = 0; @@ -1106,7 +1106,7 @@ Print_bos_KeyInfo_p(bos_KeyInfo_p key, const char *prefix) } int -DoBosKeyList(struct cmd_syndesc *as, char *arock) +DoBosKeyList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosKeyList_parm_t; afs_status_t st = 0; @@ -1145,7 +1145,7 @@ DoBosKeyList(struct cmd_syndesc *as, char *arock) } int -DoBosCellSet(struct cmd_syndesc *as, char *arock) +DoBosCellSet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, CELL } DoBosCellSet_parm_t; afs_status_t st = 0; @@ -1173,7 +1173,7 @@ DoBosCellSet(struct cmd_syndesc *as, char *arock) } int -DoBosCellGet(struct cmd_syndesc *as, char *arock) +DoBosCellGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosCellGet_parm_t; afs_status_t st = 0; @@ -1199,7 +1199,7 @@ DoBosCellGet(struct cmd_syndesc *as, char *arock) } int -DoBosHostCreate(struct cmd_syndesc *as, char *arock) +DoBosHostCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, HOST } DoBosHostCreate_parm_t; afs_status_t st = 0; @@ -1227,7 +1227,7 @@ DoBosHostCreate(struct cmd_syndesc *as, char *arock) } int -DoBosHostDelete(struct cmd_syndesc *as, char *arock) +DoBosHostDelete(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, HOST } DoBosHostDelete_parm_t; afs_status_t st = 0; @@ -1255,7 +1255,7 @@ DoBosHostDelete(struct cmd_syndesc *as, char *arock) } int -DoBosHostList(struct cmd_syndesc *as, char *arock) +DoBosHostList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoBosHostList_parm_t; afs_status_t st = 0; @@ -1294,7 +1294,7 @@ DoBosHostList(struct cmd_syndesc *as, char *arock) } int -DoBosExecutableCreate(struct cmd_syndesc *as, char *arock) +DoBosExecutableCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, BINARY, DEST } DoBosExecutableCreate_parm_t; afs_status_t st = 0; @@ -1327,7 +1327,7 @@ DoBosExecutableCreate(struct cmd_syndesc *as, char *arock) } int -DoBosExecutableRevert(struct cmd_syndesc *as, char *arock) +DoBosExecutableRevert(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, EXECUTABLE } DoBosExecutableRevert_parm_t; afs_status_t st = 0; @@ -1355,7 +1355,7 @@ DoBosExecutableRevert(struct cmd_syndesc *as, char *arock) } int -DoBosExecutableTimestampGet(struct cmd_syndesc *as, char *arock) +DoBosExecutableTimestampGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, EXECUTABLE } DoBosExecutableTimestampGet_parm_t; afs_status_t st = 0; @@ -1387,7 +1387,7 @@ DoBosExecutableTimestampGet(struct cmd_syndesc *as, char *arock) } int -DoBosExecutablePrune(struct cmd_syndesc *as, char *arock) +DoBosExecutablePrune(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, OLDFILES, BAKFILES, COREFILES @@ -1428,7 +1428,7 @@ DoBosExecutablePrune(struct cmd_syndesc *as, char *arock) } int -DoBosExecutableRestartTimeSet(struct cmd_syndesc *as, char *arock) +DoBosExecutableRestartTimeSet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, DAILY, WEEKLY, TIME @@ -1527,7 +1527,7 @@ Print_bos_RestartTime_p(bos_RestartTime_p restart, const char *prefix) } int -DoBosExecutableRestartTimeGet(struct cmd_syndesc *as, char *arock) +DoBosExecutableRestartTimeGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, DAILY, WEEKLY @@ -1578,7 +1578,7 @@ DoBosExecutableRestartTimeGet(struct cmd_syndesc *as, char *arock) #define INITIAL_BUF_SIZE 4096 int -DoBosLogGet(struct cmd_syndesc *as, char *arock) +DoBosLogGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, LOGFILE } DoBosLogGet_parm_t; afs_status_t st = 0; @@ -1626,7 +1626,7 @@ DoBosLogGet(struct cmd_syndesc *as, char *arock) } int -DoBosAuthSet(struct cmd_syndesc *as, char *arock) +DoBosAuthSet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, REQUIREAUTH, DISABLEAUTH } DoBosAuthSet_parm_t; afs_status_t st = 0; @@ -1670,7 +1670,7 @@ DoBosAuthSet(struct cmd_syndesc *as, char *arock) } int -DoBosCommandExecute(struct cmd_syndesc *as, char *arock) +DoBosCommandExecute(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, COMMAND } DoBosCommandExecute_parm_t; afs_status_t st = 0; @@ -1698,7 +1698,7 @@ DoBosCommandExecute(struct cmd_syndesc *as, char *arock) } int -DoBosSalvage(struct cmd_syndesc *as, char *arock) +DoBosSalvage(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME, NUMSALVAGERS, TMPDIR, LOGFILE, FORCE, NOWRITE, INODES, ROOTINODES, SALVAGEDIRS, BLOCKREADS @@ -1802,7 +1802,7 @@ SetupBosAdminCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("BosProcessCreate", DoBosProcessCreate, 0, + ts = cmd_CreateSyntax("BosProcessCreate", DoBosProcessCreate, NULL, "create a new bos process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process will be created"); @@ -1818,7 +1818,7 @@ SetupBosAdminCmd(void) "path to notifier binary that is run when process terminates"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosFSProcessCreate", DoBosFSProcessCreate, 0, + ts = cmd_CreateSyntax("BosFSProcessCreate", DoBosFSProcessCreate, NULL, "create a fs bos process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process will be created"); @@ -1834,7 +1834,7 @@ SetupBosAdminCmd(void) "path to notifier binary that is run when process terminates"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessDelete", DoBosProcessDelete, 0, + ts = cmd_CreateSyntax("BosProcessDelete", DoBosProcessDelete, NULL, "delete a bos process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process will be deleted"); @@ -1843,7 +1843,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosProcessExecutionStateGet", - DoBosProcessExecutionStateGet, 0, + DoBosProcessExecutionStateGet, NULL, "get the process execution state of a process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process exists"); @@ -1852,7 +1852,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosProcessExecutionStateSet", - DoBosProcessExecutionStateSet, 0, + DoBosProcessExecutionStateSet, NULL, "set the process execution state of a process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process exists"); @@ -1865,7 +1865,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosProcessExecutionStateSetTemporary", - DoBosProcessExecutionStateSetTemporary, 0, + DoBosProcessExecutionStateSetTemporary, NULL, "set the process execution state " "of a process temporarily"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, @@ -1878,12 +1878,12 @@ SetupBosAdminCmd(void) "set the process state to running"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessNameList", DoBosProcessNameList, 0, + ts = cmd_CreateSyntax("BosProcessNameList", DoBosProcessNameList, NULL, "list the names of all processes at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessInfoGet", DoBosProcessInfoGet, 0, + ts = cmd_CreateSyntax("BosProcessInfoGet", DoBosProcessInfoGet, NULL, "get information about a process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process exists"); @@ -1892,7 +1892,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosProcessParameterList", - DoBosProcessParameterList, 0, + DoBosProcessParameterList, NULL, "list the parameters of a process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process exists"); @@ -1900,7 +1900,7 @@ SetupBosAdminCmd(void) "the name of the process"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessNotifierGet", DoBosProcessNotifierGet, 0, + ts = cmd_CreateSyntax("BosProcessNotifierGet", DoBosProcessNotifierGet, NULL, "get the notifier for a process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process exists"); @@ -1908,7 +1908,7 @@ SetupBosAdminCmd(void) "the name of the process"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessRestart", DoBosProcessRestart, 0, + ts = cmd_CreateSyntax("BosProcessRestart", DoBosProcessRestart, NULL, "restart a process"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where process exists"); @@ -1916,13 +1916,13 @@ SetupBosAdminCmd(void) "the name of the process"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessAllStop", DoBosProcessAllStop, 0, + ts = cmd_CreateSyntax("BosProcessAllStop", DoBosProcessAllStop, NULL, "stop all processes at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where processes exists"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosProcessAllWaitStop", DoBosProcessAllWaitStop, 0, + ts = cmd_CreateSyntax("BosProcessAllWaitStop", DoBosProcessAllWaitStop, NULL, "stop all processes at a bos server and block " "until they all exit"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, @@ -1930,7 +1930,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosProcessAllWaitTransition", - DoBosProcessAllWaitTransition, 0, + DoBosProcessAllWaitTransition, NULL, "wait until all processes have transitioned to " "their desired state"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, @@ -1938,7 +1938,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosProcessAllStopAndRestart", - DoBosProcessAllStopAndRestart, 0, + DoBosProcessAllStopAndRestart, NULL, "stop all processes at a bos server and " "then restart them"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, @@ -1947,7 +1947,7 @@ SetupBosAdminCmd(void) "include the bos server in the processes to be restarted"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosAdminCreate", DoBosAdminCreate, 0, + ts = cmd_CreateSyntax("BosAdminCreate", DoBosAdminCreate, NULL, "create an admin user at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where admin will be created"); @@ -1955,7 +1955,7 @@ SetupBosAdminCmd(void) "the name of the administrator to add"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosAdminDelete", DoBosAdminDelete, 0, + ts = cmd_CreateSyntax("BosAdminDelete", DoBosAdminDelete, NULL, "delete an admin user at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where admin will be deleted"); @@ -1963,13 +1963,13 @@ SetupBosAdminCmd(void) "the name of the administrator to delete"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosAdminList", DoBosAdminList, 0, + ts = cmd_CreateSyntax("BosAdminList", DoBosAdminList, NULL, "list all admin users at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where admins will be listed"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosKeyCreate", DoBosKeyCreate, 0, + ts = cmd_CreateSyntax("BosKeyCreate", DoBosKeyCreate, NULL, "create a key at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where key will be created"); @@ -1978,7 +1978,7 @@ SetupBosAdminCmd(void) cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_REQUIRED, "new encryption key"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosKeyDelete", DoBosKeyDelete, 0, + ts = cmd_CreateSyntax("BosKeyDelete", DoBosKeyDelete, NULL, "delete a key at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where key will be deleted"); @@ -1986,41 +1986,41 @@ SetupBosAdminCmd(void) "version number of the key"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosKeyList", DoBosKeyList, 0, + ts = cmd_CreateSyntax("BosKeyList", DoBosKeyList, NULL, "list keys at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where keys exist"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosCellSet", DoBosCellSet, 0, + ts = cmd_CreateSyntax("BosCellSet", DoBosCellSet, NULL, "set the cell at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_REQUIRED, "new cell"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosCellGet", DoBosCellGet, 0, + ts = cmd_CreateSyntax("BosCellGet", DoBosCellGet, NULL, "get the cell at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosHostCreate", DoBosHostCreate, 0, + ts = cmd_CreateSyntax("BosHostCreate", DoBosHostCreate, NULL, "add a host entry to the server CellServDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host to add"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosHostDelete", DoBosHostDelete, 0, + ts = cmd_CreateSyntax("BosHostDelete", DoBosHostDelete, NULL, "delete a host entry from the server CellServDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host to delete"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosHostList", DoBosHostList, 0, + ts = cmd_CreateSyntax("BosHostList", DoBosHostList, NULL, "list all host entries from the server CellServDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosExecutableCreate", DoBosExecutableCreate, 0, + ts = cmd_CreateSyntax("BosExecutableCreate", DoBosExecutableCreate, NULL, "create a new binary at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-binary", CMD_SINGLE, CMD_REQUIRED, @@ -2029,7 +2029,7 @@ SetupBosAdminCmd(void) "path where the binary will be stored"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosExecutableRevert", DoBosExecutableRevert, 0, + ts = cmd_CreateSyntax("BosExecutableRevert", DoBosExecutableRevert, NULL, "revert a binary at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-executable", CMD_SINGLE, CMD_REQUIRED, @@ -2037,14 +2037,14 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosExecutableTimestampGet", - DoBosExecutableTimestampGet, 0, + DoBosExecutableTimestampGet, NULL, "get the timestamps for a binary at bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); cmd_AddParm(ts, "-executable", CMD_SINGLE, CMD_REQUIRED, "path to the binary to revert"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosExecutablePrune", DoBosExecutablePrune, 0, + ts = cmd_CreateSyntax("BosExecutablePrune", DoBosExecutablePrune, NULL, "prune various files at bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-oldfiles", CMD_FLAG, CMD_OPTIONAL, "prune .old files"); @@ -2053,7 +2053,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosExecutableRestartTimeSet", - DoBosExecutableRestartTimeSet, 0, + DoBosExecutableRestartTimeSet, NULL, "set the restart times at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-daily", CMD_FLAG, CMD_OPTIONAL, @@ -2065,7 +2065,7 @@ SetupBosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("BosExecutableRestartTimeGet", - DoBosExecutableRestartTimeGet, 0, + DoBosExecutableRestartTimeGet, NULL, "get the restart times at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); cmd_AddParm(ts, "-daily", CMD_FLAG, CMD_OPTIONAL, @@ -2074,14 +2074,14 @@ SetupBosAdminCmd(void) "get weekly restart time"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosLogGet", DoBosLogGet, 0, + ts = cmd_CreateSyntax("BosLogGet", DoBosLogGet, NULL, "get a log file from the bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); cmd_AddParm(ts, "-logfile", CMD_SINGLE, CMD_REQUIRED, "path to the log file to retrieve"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosAuthSet", DoBosAuthSet, 0, + ts = cmd_CreateSyntax("BosAuthSet", DoBosAuthSet, NULL, "set the authorization level at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify"); cmd_AddParm(ts, "-requireauth", CMD_FLAG, CMD_OPTIONAL, @@ -2098,7 +2098,7 @@ SetupBosAdminCmd(void) "command to execute"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("BosSalvage", DoBosSalvage, 0, + ts = cmd_CreateSyntax("BosSalvage", DoBosSalvage, NULL, "execute a salvage command at a bos server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where salvager will execute"); diff --git a/src/libadmin/test/client.c b/src/libadmin/test/client.c index 8b18ba02c0..c4fd4d43ba 100644 --- a/src/libadmin/test/client.c +++ b/src/libadmin/test/client.c @@ -262,7 +262,7 @@ interface_t int_list[] = { */ int -DoClientLocalCellGet(struct cmd_syndesc *as, char *arock) +DoClientLocalCellGet(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; char cellName[MAXCELLCHARS]; @@ -277,7 +277,7 @@ DoClientLocalCellGet(struct cmd_syndesc *as, char *arock) } int -DoClientMountPointCreate(struct cmd_syndesc *as, char *arock) +DoClientMountPointCreate(struct cmd_syndesc *as, void *arock) { typedef enum { DIRECTORY, VOLUME, READWRITE, CHECK @@ -331,7 +331,7 @@ Print_afs_serverEntry_p(afs_serverEntry_p serv, const char *prefix) } int -DoClientAFSServerGet(struct cmd_syndesc *as, char *arock) +DoClientAFSServerGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoClientAFSServerGet_parm_t; afs_status_t st = 0; @@ -352,7 +352,7 @@ DoClientAFSServerGet(struct cmd_syndesc *as, char *arock) } int -DoClientAFSServerList(struct cmd_syndesc *as, char *arock) +DoClientAFSServerList(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; afs_serverEntry_t entry; @@ -476,7 +476,7 @@ GetStatTypeFromString(const char *type) } int -DoClientRPCStatsStateGet(struct cmd_syndesc *as, char *arock) +DoClientRPCStatsStateGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STAT_TYPE @@ -536,7 +536,7 @@ DoClientRPCStatsStateGet(struct cmd_syndesc *as, char *arock) } int -DoClientRPCStatsStateEnable(struct cmd_syndesc *as, char *arock) +DoClientRPCStatsStateEnable(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STAT_TYPE } DoClientRPCStatsEnable_parm_t; afs_status_t st = 0; @@ -590,7 +590,7 @@ DoClientRPCStatsStateEnable(struct cmd_syndesc *as, char *arock) } int -DoClientRPCStatsStateDisable(struct cmd_syndesc *as, char *arock) +DoClientRPCStatsStateDisable(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STAT_TYPE @@ -694,7 +694,7 @@ Print_afs_RPCStats_p(afs_RPCStats_p stat, interface_function_list_p f_list, } int -DoClientRPCStatsList(struct cmd_syndesc *as, char *arock) +DoClientRPCStatsList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STAT_TYPE } DoClientRPCStatsList_parm_t; afs_status_t st = 0; @@ -819,7 +819,7 @@ DoClientRPCStatsList(struct cmd_syndesc *as, char *arock) } int -DoClientRPCStatsClear(struct cmd_syndesc *as, char *arock) +DoClientRPCStatsClear(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS, STAT_TYPE, CLEAR_ALL, CLEAR_INVOCATIONS, CLEAR_BYTES_SENT, CLEAR_BYTES_RCVD, @@ -991,7 +991,7 @@ DoClientRPCStatsClear(struct cmd_syndesc *as, char *arock) } int -DoClientRPCStatsVersionGet(struct cmd_syndesc *as, char *arock) +DoClientRPCStatsVersionGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PROCESS } DoClientRPCStatsVersionGet_parm_t; afs_status_t st = 0; @@ -1047,7 +1047,7 @@ Print_afs_CMServerPref_p(afs_CMServerPref_p pref) } int -DoClientCMGetServerPrefs(struct cmd_syndesc *as, char *arock) +DoClientCMGetServerPrefs(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; typedef enum { SERVER, PORT } DoClientCMGetServerPrefs_parm_t; @@ -1117,7 +1117,7 @@ Print_afs_CMListCell_p(afs_CMListCell_p cellInfo) } int -DoClientCMListCells(struct cmd_syndesc *as, char *arock) +DoClientCMListCells(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; typedef enum { SERVER, PORT } DoClientCMListCells_parm_t; @@ -1172,7 +1172,7 @@ DoClientCMListCells(struct cmd_syndesc *as, char *arock) } int -DoClientCMLocalCell(struct cmd_syndesc *as, char *arock) +DoClientCMLocalCell(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; typedef enum { SERVER, PORT } DoClientCMLocalCell_parm_t; @@ -1231,7 +1231,7 @@ Print_afs_ClientConfig_p(afs_ClientConfig_p config) } int -DoClientCMClientConfig(struct cmd_syndesc *as, char *arock) +DoClientCMClientConfig(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; typedef enum { SERVER, PORT } DoClientCMLocalCell_parm_t; @@ -1280,12 +1280,12 @@ SetupClientAdminCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("ClientLocalCellGet", DoClientLocalCellGet, 0, + ts = cmd_CreateSyntax("ClientLocalCellGet", DoClientLocalCellGet, NULL, "get the name of this machine's cell"); SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("ClientMountPointCreate", DoClientMountPointCreate, - 0, "create a mount point"); + NULL, "create a mount point"); cmd_AddParm(ts, "-directory", CMD_SINGLE, CMD_REQUIRED, "directory where mount point will be created"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, @@ -1296,12 +1296,12 @@ SetupClientAdminCmd(void) "check that the volume exists before mounting"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientAFSServerGet", DoClientAFSServerGet, 0, + ts = cmd_CreateSyntax("ClientAFSServerGet", DoClientAFSServerGet, NULL, "retrieve information about an afs server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientAFSServerList", DoClientAFSServerList, 0, + ts = cmd_CreateSyntax("ClientAFSServerList", DoClientAFSServerList, NULL, "retrieve information about all afs " "servers in a cell"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, @@ -1314,7 +1314,7 @@ SetupClientAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("ClientRPCStatsStateGet", DoClientRPCStatsStateGet, - 0, "retrieve the rpc stat collection state"); + NULL, "retrieve the rpc stat collection state"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED, @@ -1325,7 +1325,7 @@ SetupClientAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("ClientRPCStatsStateEnable", - DoClientRPCStatsStateEnable, 0, + DoClientRPCStatsStateEnable, NULL, "set the rpc stat collection state to on"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); @@ -1337,7 +1337,7 @@ SetupClientAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("ClientRPCStatsStateDisable", - DoClientRPCStatsStateDisable, 0, + DoClientRPCStatsStateDisable, NULL, "set the rpc stat collection state to off"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); @@ -1348,7 +1348,7 @@ SetupClientAdminCmd(void) "stats to retrieve "); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientRPCStatsList", DoClientRPCStatsList, 0, + ts = cmd_CreateSyntax("ClientRPCStatsList", DoClientRPCStatsList, NULL, "list the rpc stats"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); @@ -1359,7 +1359,7 @@ SetupClientAdminCmd(void) "stats to retrieve "); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientRPCStatsClear", DoClientRPCStatsClear, 0, + ts = cmd_CreateSyntax("ClientRPCStatsClear", DoClientRPCStatsClear, NULL, "reset rpc stat counters"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); @@ -1395,7 +1395,7 @@ SetupClientAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("ClientRPCStatsVersionGet", - DoClientRPCStatsVersionGet, 0, + DoClientRPCStatsVersionGet, NULL, "list the server's rpc stats version"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); @@ -1405,27 +1405,27 @@ SetupClientAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("ClientCMGetServerPrefs", DoClientCMGetServerPrefs, - 0, "list a client's server preferences "); + NULL, "list a client's server preferences "); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientCMListCells", DoClientCMListCells, 0, + ts = cmd_CreateSyntax("ClientCMListCells", DoClientCMListCells, NULL, "list a client's CellServDB "); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientCMLocalCell", DoClientCMLocalCell, 0, + ts = cmd_CreateSyntax("ClientCMLocalCell", DoClientCMLocalCell, NULL, "get the name of the client's local cell"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClientCMClientConfig", DoClientCMClientConfig, 0, + ts = cmd_CreateSyntax("ClientCMClientConfig", DoClientCMClientConfig, NULL, "get the client's cache configuration"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where command will execute"); diff --git a/src/libadmin/test/kas.c b/src/libadmin/test/kas.c index 4de8be6aa4..a2d3dc513d 100644 --- a/src/libadmin/test/kas.c +++ b/src/libadmin/test/kas.c @@ -45,7 +45,7 @@ GetIntFromString(const char *int_str, const char *error_msg) } int -DoKasPrincipalCreate(struct cmd_syndesc *as, char *arock) +DoKasPrincipalCreate(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE, PASSWORD @@ -73,7 +73,7 @@ DoKasPrincipalCreate(struct cmd_syndesc *as, char *arock) } int -DoKasPrincipalDelete(struct cmd_syndesc *as, char *arock) +DoKasPrincipalDelete(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE } DoKasPrincipalGet_parm_t; afs_status_t st = 0; @@ -160,7 +160,7 @@ Print_kas_principalEntry_p(kas_principalEntry_p principal, const char *prefix) } int -DoKasPrincipalGet(struct cmd_syndesc *as, char *arock) +DoKasPrincipalGet(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE } DoKasPrincipalGet_parm_t; afs_status_t st = 0; @@ -186,7 +186,7 @@ DoKasPrincipalGet(struct cmd_syndesc *as, char *arock) } int -DoKasPrincipalList(struct cmd_syndesc *as, char *arock) +DoKasPrincipalList(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *iter; @@ -218,7 +218,7 @@ DoKasPrincipalList(struct cmd_syndesc *as, char *arock) } int -DoKasPrincipalKeySet(struct cmd_syndesc *as, char *arock) +DoKasPrincipalKeySet(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE, PASSWORD, KEYVERSION @@ -258,7 +258,7 @@ DoKasPrincipalKeySet(struct cmd_syndesc *as, char *arock) } int -DoKasPrincipalLockStatusGet(struct cmd_syndesc *as, char *arock) +DoKasPrincipalLockStatusGet(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE } DoKasPrincipalLockStatusGet_parm_t; afs_status_t st = 0; @@ -284,7 +284,7 @@ DoKasPrincipalLockStatusGet(struct cmd_syndesc *as, char *arock) } int -DoKasPrincipalUnlock(struct cmd_syndesc *as, char *arock) +DoKasPrincipalUnlock(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE } DoKasPrincipalUnlock_parm_t; afs_status_t st = 0; @@ -307,7 +307,7 @@ DoKasPrincipalUnlock(struct cmd_syndesc *as, char *arock) } int -DoKasPrincipalFieldsSet(struct cmd_syndesc *as, char *arock) +DoKasPrincipalFieldsSet(struct cmd_syndesc *as, void *arock) { typedef enum { PRINCIPAL, INSTANCE, ADMIN, NOADMIN, GRANTTICKET, NOGRANTTICKET, ENCRYPT2, NOENCRYPT, CHANGEPASSWORD, @@ -549,7 +549,7 @@ Print_kas_serverStats_p(kas_serverStats_p stats, const char *prefix) } int -DoKasServerStatsGet(struct cmd_syndesc *as, char *arock) +DoKasServerStatsGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoKasServerStatsGet_parm_t; afs_status_t st = 0; @@ -634,7 +634,7 @@ Print_kas_serverDebugInfo_p(kas_serverDebugInfo_p debug, const char *prefix) } int -DoKasServerDebugGet(struct cmd_syndesc *as, char *arock) +DoKasServerDebugGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoKasServerDebugGet_parm_t; afs_status_t st = 0; @@ -662,7 +662,7 @@ DoKasServerDebugGet(struct cmd_syndesc *as, char *arock) } int -DoKasServerRandomKeyGet(struct cmd_syndesc *as, char *arock) +DoKasServerRandomKeyGet(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; kas_encryptionKey_t key; @@ -686,7 +686,7 @@ SetupKasAdminCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("KasPrincipalCreate", DoKasPrincipalCreate, 0, + ts = cmd_CreateSyntax("KasPrincipalCreate", DoKasPrincipalCreate, NULL, "create a new principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to create"); @@ -696,7 +696,7 @@ SetupKasAdminCmd(void) "initial principal password"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasPrincipalDelete", DoKasPrincipalDelete, 0, + ts = cmd_CreateSyntax("KasPrincipalDelete", DoKasPrincipalDelete, NULL, "delete a principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to delete"); @@ -704,7 +704,7 @@ SetupKasAdminCmd(void) "principal instance"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasPrincipalGet", DoKasPrincipalGet, 0, + ts = cmd_CreateSyntax("KasPrincipalGet", DoKasPrincipalGet, NULL, "get information about a principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to get"); @@ -712,11 +712,11 @@ SetupKasAdminCmd(void) "principal instance"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasPrincipalList", DoKasPrincipalList, 0, + ts = cmd_CreateSyntax("KasPrincipalList", DoKasPrincipalList, NULL, "list all principals"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasPrincipalKeySet", DoKasPrincipalKeySet, 0, + ts = cmd_CreateSyntax("KasPrincipalKeySet", DoKasPrincipalKeySet, NULL, "set the password for a principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to modify"); @@ -729,7 +729,7 @@ SetupKasAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("KasPrincipalLockStatusGet", - DoKasPrincipalLockStatusGet, 0, + DoKasPrincipalLockStatusGet, NULL, "get the lock status of a principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to query"); @@ -737,7 +737,7 @@ SetupKasAdminCmd(void) "principal instance"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasPrincipalUnlock", DoKasPrincipalUnlock, 0, + ts = cmd_CreateSyntax("KasPrincipalUnlock", DoKasPrincipalUnlock, NULL, "unlock a principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to unlock"); @@ -745,7 +745,7 @@ SetupKasAdminCmd(void) "principal instance"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasPrincipalFieldsSet", DoKasPrincipalFieldsSet, 0, + ts = cmd_CreateSyntax("KasPrincipalFieldsSet", DoKasPrincipalFieldsSet, NULL, "modify a principal"); cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_REQUIRED, "principal to modify"); @@ -785,17 +785,17 @@ SetupKasAdminCmd(void) "maximum failed password attempts is exceeded"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasServerStatsGet", DoKasServerStatsGet, 0, + ts = cmd_CreateSyntax("KasServerStatsGet", DoKasServerStatsGet, NULL, "get stats on a kaserver"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasServerDebugGet", DoKasServerDebugGet, 0, + ts = cmd_CreateSyntax("KasServerDebugGet", DoKasServerDebugGet, NULL, "get debug info from a kaserver"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("KasServerRandomKeyGet", DoKasServerRandomKeyGet, 0, + ts = cmd_CreateSyntax("KasServerRandomKeyGet", DoKasServerRandomKeyGet, NULL, "create a random key"); SetupCommonCmdArgs(ts); diff --git a/src/libadmin/test/pts.c b/src/libadmin/test/pts.c index b48c81c2c8..36a6cd3852 100644 --- a/src/libadmin/test/pts.c +++ b/src/libadmin/test/pts.c @@ -90,7 +90,7 @@ GetUserAccessFromString(const char *in_str, const char *error_msg) } int -DoPtsGroupMemberAdd(struct cmd_syndesc *as, char *arock) +DoPtsGroupMemberAdd(struct cmd_syndesc *as, void *arock) { typedef enum { USER, GROUP } DoPtsGroupMemberAdd_parm_t; afs_status_t st = 0; @@ -105,7 +105,7 @@ DoPtsGroupMemberAdd(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupOwnerChange(struct cmd_syndesc *as, char *arock) +DoPtsGroupOwnerChange(struct cmd_syndesc *as, void *arock) { typedef enum { OWNER, GROUP } DoPtsGroupOwnerChange_parm_t; afs_status_t st = 0; @@ -120,7 +120,7 @@ DoPtsGroupOwnerChange(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupCreate(struct cmd_syndesc *as, char *arock) +DoPtsGroupCreate(struct cmd_syndesc *as, void *arock) { typedef enum { OWNER, GROUP } DoPtsGroupCreate_parm_t; afs_status_t st = 0; @@ -170,7 +170,7 @@ Print_pts_GroupEntry_p(pts_GroupEntry_p entry, const char *prefix) } int -DoPtsGroupGet(struct cmd_syndesc *as, char *arock) +DoPtsGroupGet(struct cmd_syndesc *as, void *arock) { typedef enum { GROUP } DoPtsGroupGet_parm_t; afs_status_t st = 0; @@ -187,7 +187,7 @@ DoPtsGroupGet(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupDelete(struct cmd_syndesc *as, char *arock) +DoPtsGroupDelete(struct cmd_syndesc *as, void *arock) { typedef enum { GROUP } DoPtsGroupDelete_parm_t; afs_status_t st = 0; @@ -201,7 +201,7 @@ DoPtsGroupDelete(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupMaxGet(struct cmd_syndesc *as, char *arock) +DoPtsGroupMaxGet(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; int max_group_id; @@ -214,7 +214,7 @@ DoPtsGroupMaxGet(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupMaxSet(struct cmd_syndesc *as, char *arock) +DoPtsGroupMaxSet(struct cmd_syndesc *as, void *arock) { typedef enum { MAX } DoPtsGroupMaxSet_parm_t; afs_status_t st = 0; @@ -231,7 +231,7 @@ DoPtsGroupMaxSet(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupMemberList(struct cmd_syndesc *as, char *arock) +DoPtsGroupMemberList(struct cmd_syndesc *as, void *arock) { typedef enum { GROUP } DoPtsGroupMemberList_parm_t; afs_status_t st = 0; @@ -260,7 +260,7 @@ DoPtsGroupMemberList(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupMemberRemove(struct cmd_syndesc *as, char *arock) +DoPtsGroupMemberRemove(struct cmd_syndesc *as, void *arock) { typedef enum { USER, GROUP } DoPtsGroupMemberRemove_parm_t; afs_status_t st = 0; @@ -275,7 +275,7 @@ DoPtsGroupMemberRemove(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupRename(struct cmd_syndesc *as, char *arock) +DoPtsGroupRename(struct cmd_syndesc *as, void *arock) { typedef enum { GROUP, NEWNAME } DoPtsGroupRename_parm_t; afs_status_t st = 0; @@ -290,7 +290,7 @@ DoPtsGroupRename(struct cmd_syndesc *as, char *arock) } int -DoPtsGroupModify(struct cmd_syndesc *as, char *arock) +DoPtsGroupModify(struct cmd_syndesc *as, void *arock) { typedef enum { GROUP, LISTSTATUS, LISTGROUPSOWNED, LISTMEMBERSHIP, LISTADD, LISTDELTE @@ -323,7 +323,7 @@ DoPtsGroupModify(struct cmd_syndesc *as, char *arock) } int -DoPtsUserCreate(struct cmd_syndesc *as, char *arock) +DoPtsUserCreate(struct cmd_syndesc *as, void *arock) { typedef enum { USER } DoPtsUserCreate_parm_t; afs_status_t st = 0; @@ -340,7 +340,7 @@ DoPtsUserCreate(struct cmd_syndesc *as, char *arock) } int -DoPtsUserDelete(struct cmd_syndesc *as, char *arock) +DoPtsUserDelete(struct cmd_syndesc *as, void *arock) { typedef enum { USER } DoPtsUserDelete_parm_t; afs_status_t st = 0; @@ -383,7 +383,7 @@ Print_pts_UserEntry_p(pts_UserEntry_p entry, const char *prefix) } int -DoPtsUserGet(struct cmd_syndesc *as, char *arock) +DoPtsUserGet(struct cmd_syndesc *as, void *arock) { typedef enum { USER } DoPtsUserGet_parm_t; afs_status_t st = 0; @@ -400,7 +400,7 @@ DoPtsUserGet(struct cmd_syndesc *as, char *arock) } int -DoPtsUserRename(struct cmd_syndesc *as, char *arock) +DoPtsUserRename(struct cmd_syndesc *as, void *arock) { typedef enum { USER, NEWNAME } DoPtsUserRename_parm_t; afs_status_t st = 0; @@ -415,7 +415,7 @@ DoPtsUserRename(struct cmd_syndesc *as, char *arock) } int -DoPtsUserModify(struct cmd_syndesc *as, char *arock) +DoPtsUserModify(struct cmd_syndesc *as, void *arock) { typedef enum { USER, GROUPQUOTA, LISTSTATUS, LISTGROUPSOWNED, LISTMEMBERSHIP @@ -481,7 +481,7 @@ DoPtsUserModify(struct cmd_syndesc *as, char *arock) } int -DoPtsUserMaxGet(struct cmd_syndesc *as, char *arock) +DoPtsUserMaxGet(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; int max_user_id; @@ -494,7 +494,7 @@ DoPtsUserMaxGet(struct cmd_syndesc *as, char *arock) } int -DoPtsUserMaxSet(struct cmd_syndesc *as, char *arock) +DoPtsUserMaxSet(struct cmd_syndesc *as, void *arock) { typedef enum { MAX } DoPtsUserMaxSet_parm_t; afs_status_t st = 0; @@ -511,7 +511,7 @@ DoPtsUserMaxSet(struct cmd_syndesc *as, char *arock) } int -DoPtsUserMemberList(struct cmd_syndesc *as, char *arock) +DoPtsUserMemberList(struct cmd_syndesc *as, void *arock) { typedef enum { USER } DoPtsUserMemberList_parm_t; afs_status_t st = 0; @@ -541,7 +541,7 @@ DoPtsUserMemberList(struct cmd_syndesc *as, char *arock) } int -DoPtsOwnedGroupList(struct cmd_syndesc *as, char *arock) +DoPtsOwnedGroupList(struct cmd_syndesc *as, void *arock) { typedef enum { USER } DoPtsOwnedGroupList_parm_t; afs_status_t st = 0; @@ -575,61 +575,61 @@ SetupPtsAdminCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("PtsGroupMemberAdd", DoPtsGroupMemberAdd, 0, + ts = cmd_CreateSyntax("PtsGroupMemberAdd", DoPtsGroupMemberAdd, NULL, "add a user to a group"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to add"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to modify"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupOwnerChange", DoPtsGroupOwnerChange, 0, + ts = cmd_CreateSyntax("PtsGroupOwnerChange", DoPtsGroupOwnerChange, NULL, "change the owner of a group"); cmd_AddParm(ts, "-owner", CMD_SINGLE, CMD_REQUIRED, "new owner"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to modify"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupCreate", DoPtsGroupCreate, 0, + ts = cmd_CreateSyntax("PtsGroupCreate", DoPtsGroupCreate, NULL, "create a new group"); cmd_AddParm(ts, "-owner", CMD_SINGLE, CMD_REQUIRED, "owner of group"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to create"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupGet", DoPtsGroupGet, 0, + ts = cmd_CreateSyntax("PtsGroupGet", DoPtsGroupGet, NULL, "get information about a group"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupDelete", DoPtsGroupDelete, 0, + ts = cmd_CreateSyntax("PtsGroupDelete", DoPtsGroupDelete, NULL, "delete a group"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to delete"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupMaxGet", DoPtsGroupMaxGet, 0, + ts = cmd_CreateSyntax("PtsGroupMaxGet", DoPtsGroupMaxGet, NULL, "get the maximum group id"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupMaxSet", DoPtsGroupMaxSet, 0, + ts = cmd_CreateSyntax("PtsGroupMaxSet", DoPtsGroupMaxSet, NULL, "set the maximum group id"); cmd_AddParm(ts, "-max", CMD_SINGLE, CMD_REQUIRED, "new max group id"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupMemberList", DoPtsGroupMemberList, 0, + ts = cmd_CreateSyntax("PtsGroupMemberList", DoPtsGroupMemberList, NULL, "list members of a group"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupMemberRemove", DoPtsGroupMemberRemove, 0, + ts = cmd_CreateSyntax("PtsGroupMemberRemove", DoPtsGroupMemberRemove, NULL, "remove a member from a group"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to remove"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to modify"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupRename", DoPtsGroupRename, 0, + ts = cmd_CreateSyntax("PtsGroupRename", DoPtsGroupRename, NULL, "rename a group"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to modify"); cmd_AddParm(ts, "-newname", CMD_SINGLE, CMD_REQUIRED, "new group name"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsGroupModify", DoPtsGroupModify, 0, + ts = cmd_CreateSyntax("PtsGroupModify", DoPtsGroupModify, NULL, "modify a group"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_REQUIRED, "group to modify"); cmd_AddParm(ts, "-liststatus", CMD_SINGLE, CMD_REQUIRED, @@ -644,28 +644,28 @@ SetupPtsAdminCmd(void) "list delete permission "); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserCreate", DoPtsUserCreate, 0, + ts = cmd_CreateSyntax("PtsUserCreate", DoPtsUserCreate, NULL, "create a new user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to create"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserDelete", DoPtsUserDelete, 0, + ts = cmd_CreateSyntax("PtsUserDelete", DoPtsUserDelete, NULL, "delete a user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to delete"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserGet", DoPtsUserGet, 0, + ts = cmd_CreateSyntax("PtsUserGet", DoPtsUserGet, NULL, "get information about a user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserRename", DoPtsUserRename, 0, + ts = cmd_CreateSyntax("PtsUserRename", DoPtsUserRename, NULL, "rename a user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to modify"); cmd_AddParm(ts, "-newname", CMD_SINGLE, CMD_REQUIRED, "new user name"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserModify", DoPtsUserModify, 0, + ts = cmd_CreateSyntax("PtsUserModify", DoPtsUserModify, NULL, "change a user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to modify"); cmd_AddParm(ts, "-groupquota", CMD_SINGLE, CMD_OPTIONAL, @@ -678,21 +678,21 @@ SetupPtsAdminCmd(void) "list membership permission "); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserMaxGet", DoPtsUserMaxGet, 0, + ts = cmd_CreateSyntax("PtsUserMaxGet", DoPtsUserMaxGet, NULL, "get the max user id"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserMaxSet", DoPtsUserMaxSet, 0, + ts = cmd_CreateSyntax("PtsUserMaxSet", DoPtsUserMaxSet, NULL, "set the max user id"); cmd_AddParm(ts, "-max", CMD_SINGLE, CMD_REQUIRED, "max user id"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsUserMemberList", DoPtsUserMemberList, 0, + ts = cmd_CreateSyntax("PtsUserMemberList", DoPtsUserMemberList, NULL, "list group membership for a user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("PtsOwnedGroupList", DoPtsOwnedGroupList, 0, + ts = cmd_CreateSyntax("PtsOwnedGroupList", DoPtsOwnedGroupList, NULL, "list groups owned by a user"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_REQUIRED, "user to query"); SetupCommonCmdArgs(ts); diff --git a/src/libadmin/test/util.c b/src/libadmin/test/util.c index 7ef9586550..da4261f8d9 100644 --- a/src/libadmin/test/util.c +++ b/src/libadmin/test/util.c @@ -20,7 +20,7 @@ RCSID #include "util.h" int -DoUtilErrorTranslate(struct cmd_syndesc *as, char *arock) +DoUtilErrorTranslate(struct cmd_syndesc *as, void *arock) { typedef enum { ERROR_CODE } DoUtilErrorTranslate_parm_t; afs_status_t st = 0; @@ -37,7 +37,7 @@ DoUtilErrorTranslate(struct cmd_syndesc *as, char *arock) } int -DoUtilDatabaseServerList(struct cmd_syndesc *as, char *arock) +DoUtilDatabaseServerList(struct cmd_syndesc *as, void *arock) { typedef enum { CELL_NAME } DoUtilDatabaseServerList_parm_t; afs_status_t st = 0; @@ -66,7 +66,7 @@ DoUtilDatabaseServerList(struct cmd_syndesc *as, char *arock) } int -DoUtilNameToAddress(struct cmd_syndesc *as, char *arock) +DoUtilNameToAddress(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER_NAME } DoUtilNameToAddress_parm_t; afs_status_t st = 0; @@ -88,17 +88,17 @@ SetupUtilAdminCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("UtilErrorTranslate", DoUtilErrorTranslate, 0, + ts = cmd_CreateSyntax("UtilErrorTranslate", DoUtilErrorTranslate, NULL, "translate an error code"); cmd_AddParm(ts, "-error", CMD_SINGLE, CMD_REQUIRED, "error code"); SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("UtilDatabaseServerList", DoUtilDatabaseServerList, - 0, "list the database servers in a cell"); + NULL, "list the database servers in a cell"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_REQUIRED, "cell to list"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("UtilNameToAddress", DoUtilNameToAddress, 0, + ts = cmd_CreateSyntax("UtilNameToAddress", DoUtilNameToAddress, NULL, "translate a host name to an address"); cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host name"); SetupCommonCmdArgs(ts); diff --git a/src/libadmin/test/util.h b/src/libadmin/test/util.h index ca524597d0..98f22f6b42 100644 --- a/src/libadmin/test/util.h +++ b/src/libadmin/test/util.h @@ -29,13 +29,13 @@ #include "common.h" int - DoUtilErrorTranslate(struct cmd_syndesc *as, char *arock); + DoUtilErrorTranslate(struct cmd_syndesc *as, void *arock); int - DoUtilDatabaseServerList(struct cmd_syndesc *as, char *arock); + DoUtilDatabaseServerList(struct cmd_syndesc *as, void *arock); int - DoUtilNameToAddress(struct cmd_syndesc *as, char *arock); + DoUtilNameToAddress(struct cmd_syndesc *as, void *arock); void SetupUtilAdminCmd(void); diff --git a/src/libadmin/test/vos.c b/src/libadmin/test/vos.c index d68867a66d..6af38754c3 100644 --- a/src/libadmin/test/vos.c +++ b/src/libadmin/test/vos.c @@ -144,7 +144,7 @@ PrintMessage(vos_messageType_t type, char *message) } int -DoVosBackupVolumeCreate(struct cmd_syndesc *as, char *arock) +DoVosBackupVolumeCreate(struct cmd_syndesc *as, void *arock) { typedef enum { VOLUME } DoVosBackupVolumeCreate_parm_t; afs_status_t st = 0; @@ -162,7 +162,7 @@ DoVosBackupVolumeCreate(struct cmd_syndesc *as, char *arock) } int -DoVosBackupVolumeCreateMultiple(struct cmd_syndesc *as, char *arock) +DoVosBackupVolumeCreateMultiple(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, PREFIX, EXCLUDE @@ -214,7 +214,7 @@ Print_vos_partitionEntry_p(vos_partitionEntry_p part, const char *prefix) } int -DoVosPartitionGet(struct cmd_syndesc *as, char *arock) +DoVosPartitionGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION } DoVosPartitionGet_parm_t; afs_status_t st = 0; @@ -245,7 +245,7 @@ DoVosPartitionGet(struct cmd_syndesc *as, char *arock) } int -DoVosPartitionList(struct cmd_syndesc *as, char *arock) +DoVosPartitionList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoVosPartitionGet_parm_t; afs_status_t st = 0; @@ -281,7 +281,7 @@ DoVosPartitionList(struct cmd_syndesc *as, char *arock) } int -DoVosServerSync(struct cmd_syndesc *as, char *arock) +DoVosServerSync(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION } DoVosServerSync_parm_t; afs_status_t st = 0; @@ -309,7 +309,7 @@ DoVosServerSync(struct cmd_syndesc *as, char *arock) } int -DoVosFileServerAddressChange(struct cmd_syndesc *as, char *arock) +DoVosFileServerAddressChange(struct cmd_syndesc *as, void *arock) { typedef enum { OLDADDRESS, NEWADDRESS @@ -334,7 +334,7 @@ DoVosFileServerAddressChange(struct cmd_syndesc *as, char *arock) } int -DoVosFileServerAddressRemove(struct cmd_syndesc *as, char *arock) +DoVosFileServerAddressRemove(struct cmd_syndesc *as, void *arock) { typedef enum { ADDRESS } DoVosFileServerAddressRemove_parm_t; afs_status_t st = 0; @@ -363,7 +363,7 @@ Print_vos_fileServerEntry_p(vos_fileServerEntry_p serv, const char *prefix) } int -DoVosFileServerList(struct cmd_syndesc *as, char *arock) +DoVosFileServerList(struct cmd_syndesc *as, void *arock) { afs_status_t st = 0; void *iter; @@ -414,7 +414,7 @@ Print_vos_serverTransactionStatus_p(vos_serverTransactionStatus_p tran, } int -DoVosServerTransactionStatusList(struct cmd_syndesc *as, char *arock) +DoVosServerTransactionStatusList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER } DoVosServerTransactionStatusList_parm_t; afs_status_t st = 0; @@ -522,7 +522,7 @@ Print_vos_vldbEntry_p(vos_vldbEntry_p entry, const char *prefix) } int -DoVosVLDBGet(struct cmd_syndesc *as, char *arock) +DoVosVLDBGet(struct cmd_syndesc *as, void *arock) { typedef enum { VOLUME } DoVosVLDBGet_parm_t; afs_status_t st = 0; @@ -546,7 +546,7 @@ DoVosVLDBGet(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBList(struct cmd_syndesc *as, char *arock) +DoVosVLDBList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION } DoVosVLDBList_parm_t; afs_status_t st = 0; @@ -594,7 +594,7 @@ DoVosVLDBList(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBEntryRemove(struct cmd_syndesc *as, char *arock) +DoVosVLDBEntryRemove(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME } DoVosVLDBEntryRemove_parm_t; afs_status_t st = 0; @@ -637,7 +637,7 @@ DoVosVLDBEntryRemove(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBUnlock(struct cmd_syndesc *as, char *arock) +DoVosVLDBUnlock(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION } DoVosVLDBUnlock_parm_t; afs_status_t st = 0; @@ -671,7 +671,7 @@ DoVosVLDBUnlock(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBEntryLock(struct cmd_syndesc *as, char *arock) +DoVosVLDBEntryLock(struct cmd_syndesc *as, void *arock) { typedef enum { VOLUME } DoVosVLDBEntryLoc_parm_tk; afs_status_t st = 0; @@ -690,7 +690,7 @@ DoVosVLDBEntryLock(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBEntryUnlock(struct cmd_syndesc *as, char *arock) +DoVosVLDBEntryUnlock(struct cmd_syndesc *as, void *arock) { typedef enum { VOLUME } DoVosVLDBEntryUnlock_parm_t; afs_status_t st = 0; @@ -709,7 +709,7 @@ DoVosVLDBEntryUnlock(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBReadOnlySiteCreate(struct cmd_syndesc *as, char *arock) +DoVosVLDBReadOnlySiteCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME @@ -744,7 +744,7 @@ DoVosVLDBReadOnlySiteCreate(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBReadOnlySiteDelete(struct cmd_syndesc *as, char *arock) +DoVosVLDBReadOnlySiteDelete(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME @@ -780,7 +780,7 @@ DoVosVLDBReadOnlySiteDelete(struct cmd_syndesc *as, char *arock) } int -DoVosVLDBSync(struct cmd_syndesc *as, char *arock) +DoVosVLDBSync(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, FORCE } DoVosVLDBSync_parm_t; afs_status_t st = 0; @@ -819,7 +819,7 @@ DoVosVLDBSync(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeCreate(struct cmd_syndesc *as, char *arock) +DoVosVolumeCreate(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME, QUOTA @@ -864,7 +864,7 @@ DoVosVolumeCreate(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeDelete(struct cmd_syndesc *as, char *arock) +DoVosVolumeDelete(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeDelete_parm_t; afs_status_t st = 0; @@ -898,7 +898,7 @@ DoVosVolumeDelete(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeRename(struct cmd_syndesc *as, char *arock) +DoVosVolumeRename(struct cmd_syndesc *as, void *arock) { typedef enum { OLDVOLUME, NEWVOLUME } DoVosVolumeRename_parm_t; afs_status_t st = 0; @@ -922,7 +922,7 @@ DoVosVolumeRename(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeDump(struct cmd_syndesc *as, char *arock) +DoVosVolumeDump(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME, STARTTIME, DUMPFILE @@ -978,7 +978,7 @@ DoVosVolumeDump(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeRestore(struct cmd_syndesc *as, char *arock) +DoVosVolumeRestore(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, ID, VOLUME, DUMPFILE, FULL @@ -1032,7 +1032,7 @@ DoVosVolumeRestore(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeOnline(struct cmd_syndesc *as, char *arock) +DoVosVolumeOnline(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME, SLEEP, BUSY @@ -1080,7 +1080,7 @@ DoVosVolumeOnline(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeOffline(struct cmd_syndesc *as, char *arock) +DoVosVolumeOffline(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeOffline_parm_t; afs_status_t st = 0; @@ -1337,7 +1337,7 @@ Print_vos_volumeEntry_p(vos_volumeEntry_p entry, const char *prefix) } int -DoVosVolumeGet(struct cmd_syndesc *as, char *arock) +DoVosVolumeGet(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeGet_parm_t; afs_status_t st = 0; @@ -1374,7 +1374,7 @@ DoVosVolumeGet(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeList(struct cmd_syndesc *as, char *arock) +DoVosVolumeList(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION } DoVosVolumeList_parm_t; afs_status_t st = 0; @@ -1420,7 +1420,7 @@ DoVosVolumeList(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeMove(struct cmd_syndesc *as, char *arock) +DoVosVolumeMove(struct cmd_syndesc *as, void *arock) { typedef enum { VOLUME, FROMSERVER, FROMPARTITION, TOSERVER, TOPARTITION @@ -1472,7 +1472,7 @@ DoVosVolumeMove(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeRelease(struct cmd_syndesc *as, char *arock) +DoVosVolumeRelease(struct cmd_syndesc *as, void *arock) { typedef enum { VOLUME, FORCE } DoVosVolumeRelease_parm_t; afs_status_t st = 0; @@ -1495,7 +1495,7 @@ DoVosVolumeRelease(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeZap(struct cmd_syndesc *as, char *arock) +DoVosVolumeZap(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME, FORCE } DoVosVolumeZap_parm_t; afs_status_t st = 0; @@ -1534,7 +1534,7 @@ DoVosVolumeZap(struct cmd_syndesc *as, char *arock) } int -DoVosPartitionNameToId(struct cmd_syndesc *as, char *arock) +DoVosPartitionNameToId(struct cmd_syndesc *as, void *arock) { typedef enum { PARTITION } DoVosPartitionNameToId_parm_t; afs_status_t st = 0; @@ -1552,7 +1552,7 @@ DoVosPartitionNameToId(struct cmd_syndesc *as, char *arock) } int -DoVosPartitionIdToName(struct cmd_syndesc *as, char *arock) +DoVosPartitionIdToName(struct cmd_syndesc *as, void *arock) { typedef enum { PARTITIONID } DoVosPartitionIdToName_parm_t; afs_status_t st = 0; @@ -1575,7 +1575,7 @@ DoVosPartitionIdToName(struct cmd_syndesc *as, char *arock) } int -DoVosVolumeQuotaChange(struct cmd_syndesc *as, char *arock) +DoVosVolumeQuotaChange(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME, QUOTA @@ -1725,7 +1725,7 @@ Print_vos_volintInfo(afs_uint32 server, afs_uint32 partition, volintInfo* pinfo, } int -DoVosVolumeGet2(struct cmd_syndesc *as, char *arock) +DoVosVolumeGet2(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeGet_parm_t; afs_status_t st = 0; @@ -1767,7 +1767,7 @@ DoVosVolumeGet2(struct cmd_syndesc *as, char *arock) int -DoVos_ClearVolUpdateCounter(struct cmd_syndesc *as, char *arock) +DoVos_ClearVolUpdateCounter(struct cmd_syndesc *as, void *arock) { typedef enum { SERVER, PARTITION, VOLUME } DoVosVolumeGet_parm_t; afs_status_t st = 0; @@ -1805,13 +1805,13 @@ SetupVosAdminCmd(void) { struct cmd_syndesc *ts; - ts = cmd_CreateSyntax("VosBackupVolumeCreate", DoVosBackupVolumeCreate, 0, + ts = cmd_CreateSyntax("VosBackupVolumeCreate", DoVosBackupVolumeCreate, NULL, "create a backup volume"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to back up"); SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("VosBackupVolumeCreateMultiple", - DoVosBackupVolumeCreateMultiple, 0, + DoVosBackupVolumeCreateMultiple, NULL, "create a backup volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "server housing volumes to back up"); @@ -1823,7 +1823,7 @@ SetupVosAdminCmd(void) "exclude volumes from backup that match prefix"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosPartitionGet", DoVosPartitionGet, 0, + ts = cmd_CreateSyntax("VosPartitionGet", DoVosPartitionGet, NULL, "get information about a partition"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server housing partition of interest"); @@ -1831,13 +1831,13 @@ SetupVosAdminCmd(void) "partition to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosPartitionList", DoVosPartitionList, 0, + ts = cmd_CreateSyntax("VosPartitionList", DoVosPartitionList, NULL, "list information about all partitions at a server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server housing partitions of interest"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosServerSync", DoVosServerSync, 0, + ts = cmd_CreateSyntax("VosServerSync", DoVosServerSync, NULL, "sync server with vldb"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to sync"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, @@ -1845,7 +1845,7 @@ SetupVosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("VosFileServerAddressChange", - DoVosFileServerAddressChange, 0, + DoVosFileServerAddressChange, NULL, "change a server's address in the vldb"); cmd_AddParm(ts, "-oldaddress", CMD_SINGLE, CMD_REQUIRED, "old address to change"); @@ -1853,29 +1853,29 @@ SetupVosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("VosFileServerAddressRemove", - DoVosFileServerAddressRemove, 0, + DoVosFileServerAddressRemove, NULL, "remove a server's address from the vldb"); cmd_AddParm(ts, "-address", CMD_SINGLE, CMD_REQUIRED, "address to remove"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosFileServerList", DoVosFileServerList, 0, + ts = cmd_CreateSyntax("VosFileServerList", DoVosFileServerList, NULL, "list the file servers in a cell"); SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("VosServerTransactionStatusList", - DoVosServerTransactionStatusList, 0, + DoVosServerTransactionStatusList, NULL, "list the active transactions at a server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBGet", DoVosVLDBGet, 0, + ts = cmd_CreateSyntax("VosVLDBGet", DoVosVLDBGet, NULL, "get a vldb entry for a volume"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to retrieve"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBList", DoVosVLDBList, 0, + ts = cmd_CreateSyntax("VosVLDBList", DoVosVLDBList, NULL, "list a group of vldb entries"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "limit entries to a particular server"); @@ -1883,7 +1883,7 @@ SetupVosAdminCmd(void) "limit entries to a particular partition"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBEntryRemove", DoVosVLDBEntryRemove, 0, + ts = cmd_CreateSyntax("VosVLDBEntryRemove", DoVosVLDBEntryRemove, NULL, "remove vldb entries"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "limit entries to a particular server"); @@ -1892,7 +1892,7 @@ SetupVosAdminCmd(void) cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_OPTIONAL, "volume to remove"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBUnlock", DoVosVLDBUnlock, 0, + ts = cmd_CreateSyntax("VosVLDBUnlock", DoVosVLDBUnlock, NULL, "unlock a group of vldb entries"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "limit entries to a particular server"); @@ -1900,18 +1900,18 @@ SetupVosAdminCmd(void) "limit entries to a particular partition"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBEntryLock", DoVosVLDBList, 0, + ts = cmd_CreateSyntax("VosVLDBEntryLock", DoVosVLDBList, NULL, "lock a single vldb entry"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to lock"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBEntryUnlock", DoVosVLDBEntryUnlock, 0, + ts = cmd_CreateSyntax("VosVLDBEntryUnlock", DoVosVLDBEntryUnlock, NULL, "unlock a single vldb entry"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to unlock"); SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("VosVLDBReadOnlySiteCreate", - DoVosVLDBReadOnlySiteCreate, 0, + DoVosVLDBReadOnlySiteCreate, NULL, "create a read only site"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where read only will be created"); @@ -1922,7 +1922,7 @@ SetupVosAdminCmd(void) SetupCommonCmdArgs(ts); ts = cmd_CreateSyntax("VosVLDBReadOnlySiteDelete", - DoVosVLDBReadOnlySiteDelete, 0, + DoVosVLDBReadOnlySiteDelete, NULL, "delete a read only site before initial replication"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "server where read only will be deleted"); @@ -1931,7 +1931,7 @@ SetupVosAdminCmd(void) cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to delete"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVLDBSync", DoVosVLDBSync, 0, + ts = cmd_CreateSyntax("VosVLDBSync", DoVosVLDBSync, NULL, "sync vldb with server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to sync"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, @@ -1939,7 +1939,7 @@ SetupVosAdminCmd(void) cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "force sync to occur"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeCreate", DoVosVolumeCreate, 0, + ts = cmd_CreateSyntax("VosVolumeCreate", DoVosVolumeCreate, NULL, "create a read write volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where volume will be created"); @@ -1951,7 +1951,7 @@ SetupVosAdminCmd(void) "size quota of new volume in 1kb units"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeDelete", DoVosVolumeDelete, 0, + ts = cmd_CreateSyntax("VosVolumeDelete", DoVosVolumeDelete, NULL, "delete a volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server where volume exists"); @@ -1960,13 +1960,13 @@ SetupVosAdminCmd(void) cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to delete"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeRename", DoVosVolumeRename, 0, + ts = cmd_CreateSyntax("VosVolumeRename", DoVosVolumeRename, NULL, "rename a volume"); cmd_AddParm(ts, "-oldname", CMD_SINGLE, CMD_REQUIRED, "old volume name"); cmd_AddParm(ts, "-newname", CMD_SINGLE, CMD_REQUIRED, "new volume name"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeDump", DoVosVolumeDump, 0, + ts = cmd_CreateSyntax("VosVolumeDump", DoVosVolumeDump, NULL, "dump a volume to a file"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "dump volume at a particular server"); @@ -1979,7 +1979,7 @@ SetupVosAdminCmd(void) "file to contain dump results"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeRestore", DoVosVolumeRestore, 0, + ts = cmd_CreateSyntax("VosVolumeRestore", DoVosVolumeRestore, NULL, "restore a volume from a dumpfile"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses volume to restore"); @@ -1994,7 +1994,7 @@ SetupVosAdminCmd(void) "does a full restore of volume"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeOnline", DoVosVolumeOnline, 0, + ts = cmd_CreateSyntax("VosVolumeOnline", DoVosVolumeOnline, NULL, "bring a volume online"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses volume"); @@ -2006,7 +2006,7 @@ SetupVosAdminCmd(void) cmd_AddParm(ts, "-busy", CMD_FLAG, CMD_OPTIONAL, "mark volume busy"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeOffline", DoVosVolumeOffline, 0, + ts = cmd_CreateSyntax("VosVolumeOffline", DoVosVolumeOffline, NULL, "take a volume offline"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses volume"); @@ -2016,7 +2016,7 @@ SetupVosAdminCmd(void) "volume to bring offline"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeGet", DoVosVolumeGet, 0, + ts = cmd_CreateSyntax("VosVolumeGet", DoVosVolumeGet, NULL, "get a volume entry"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses volume"); @@ -2026,7 +2026,7 @@ SetupVosAdminCmd(void) "volume to retrieve"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeList", DoVosVolumeList, 0, + ts = cmd_CreateSyntax("VosVolumeList", DoVosVolumeList, NULL, "list a group of volumes"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "limit volumes to a particular server"); @@ -2034,7 +2034,7 @@ SetupVosAdminCmd(void) "limit volumes to a particular partition"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeMove", DoVosVolumeMove, 0, + ts = cmd_CreateSyntax("VosVolumeMove", DoVosVolumeMove, NULL, "move a volume"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to move"); cmd_AddParm(ts, "-fromserver", CMD_SINGLE, CMD_REQUIRED, "source server"); @@ -2046,7 +2046,7 @@ SetupVosAdminCmd(void) "destination partition"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeRelease", DoVosVolumeRelease, 0, + ts = cmd_CreateSyntax("VosVolumeRelease", DoVosVolumeRelease, NULL, "release updates to read only"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume to replicate"); @@ -2054,7 +2054,7 @@ SetupVosAdminCmd(void) "force release to occur"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeZap", DoVosVolumeZap, 0, "zap a volume"); + ts = cmd_CreateSyntax("VosVolumeZap", DoVosVolumeZap, NULL, "zap a volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses the volume to zap"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED, @@ -2063,18 +2063,18 @@ SetupVosAdminCmd(void) cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "force zap"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosPartitionNameToId", DoVosPartitionNameToId, 0, + ts = cmd_CreateSyntax("VosPartitionNameToId", DoVosPartitionNameToId, NULL, "convert a partition name to a number"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED, "partition to convert"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosPartitionIdToName", DoVosPartitionIdToName, 0, + ts = cmd_CreateSyntax("VosPartitionIdToName", DoVosPartitionIdToName, NULL, "convert a number to a partition"); cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_REQUIRED, "number to convert"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeQuotaChange", DoVosVolumeQuotaChange, 0, + ts = cmd_CreateSyntax("VosVolumeQuotaChange", DoVosVolumeQuotaChange, NULL, "change the quota for a partition"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses the volume"); @@ -2085,7 +2085,7 @@ SetupVosAdminCmd(void) "new quota in 1kb units"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("VosVolumeGet2", DoVosVolumeGet2, 0, + ts = cmd_CreateSyntax("VosVolumeGet2", DoVosVolumeGet2, NULL, "get a volume entry"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses volume"); @@ -2095,7 +2095,7 @@ SetupVosAdminCmd(void) "volume to retrieve"); SetupCommonCmdArgs(ts); - ts = cmd_CreateSyntax("ClearVolUpdateCounter", DoVos_ClearVolUpdateCounter, 0, + ts = cmd_CreateSyntax("ClearVolUpdateCounter", DoVos_ClearVolUpdateCounter, NULL, "clear volUpdateCounter"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server that houses volume"); diff --git a/src/libadmin/vos/afs_vosAdmin.c b/src/libadmin/vos/afs_vosAdmin.c index baf3a76af0..df07bd77b8 100644 --- a/src/libadmin/vos/afs_vosAdmin.c +++ b/src/libadmin/vos/afs_vosAdmin.c @@ -15,13 +15,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #ifdef AFS_NT40_ENV #include diff --git a/src/libadmin/vos/lockprocs.c b/src/libadmin/vos/lockprocs.c index 5234a265ab..bc72dfd799 100644 --- a/src/libadmin/vos/lockprocs.c +++ b/src/libadmin/vos/lockprocs.c @@ -14,13 +14,7 @@ RCSID ("$Header$"); #include "lockprocs.h" -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* Finds an index in VLDB entry that matches the volume type, server, and partition. * If type is zero, will match first index of ANY type (RW, BK, or RO). diff --git a/src/libadmin/vos/vosutils.c b/src/libadmin/vos/vosutils.c index f74602c360..878920d85c 100644 --- a/src/libadmin/vos/vosutils.c +++ b/src/libadmin/vos/vosutils.c @@ -17,13 +17,7 @@ RCSID #include "vsprocs.h" #include "lockprocs.h" #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* * VLDB entry conversion routines. diff --git a/src/libadmin/vos/vsprocs.c b/src/libadmin/vos/vsprocs.c index 9bfd9a7284..8823f50b3e 100644 --- a/src/libadmin/vos/vsprocs.c +++ b/src/libadmin/vos/vsprocs.c @@ -30,13 +30,7 @@ RCSID #include "../adminutil/afs_AdminInternal.h" #include #include "afs_vosAdmin.h" -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/libafs/MakefileProto.DARWIN.in b/src/libafs/MakefileProto.DARWIN.in index ceef9adb5e..02916784c5 100644 --- a/src/libafs/MakefileProto.DARWIN.in +++ b/src/libafs/MakefileProto.DARWIN.in @@ -5,7 +5,7 @@ # License. For details, see the LICENSE file in the top-level source # directory or online at http://www.openafs.org/dl/license10.html # $Header$ -# +# # MakefileProto for Digital Unix systems # srcdir=@srcdir@ @@ -69,28 +69,32 @@ AFS_OS_NONFSOBJS = osi_vfsops.o KDEFS= DBUG = DEFINES= -D_KERNEL -DKERNEL -DKERNEL_PRIVATE -DDIAGNOSTIC -DUSE_SELECT -DMACH_USER_API -DMACH_KERNEL + +KOPTS_DBUG=-g + +KOPTS_DBUG=-ggdb -KOPTS_ppc=-static -g -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch ppc -Dppc -DPPC -D__PPC__ -DPAGE_SIZE_FIXED -mcpu=750 -mmultiple -fschedule-insns -KOPTS_x86=-static -g -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch i386 -Di386 -DI386 -D__I386__ -DPAGE_SIZE_FIXED -march=i686 -mpreferred-stack-boundary=2 -falign-functions=4 +KOPTS_ppc=-static -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch ppc -Dppc -DPPC -D__PPC__ -DPAGE_SIZE_FIXED -mcpu=750 -mmultiple -fschedule-insns -force_cpusubtype_ALL +KOPTS_x86=-static -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch i386 -Di386 -DI386 -D__I386__ -DPAGE_SIZE_FIXED -march=i686 -mpreferred-stack-boundary=2 -falign-functions=4 ARCH_ppc=$(shell echo "${ARCHFLAGS}" | grep -q -w ppc && echo yes) ARCH_x86=$(shell echo "${ARCHFLAGS}" | grep -q -w i386 && echo yes) ifeq ($(ARCH_ppc),yes) ifeq ($(ARCH_x86),yes) -MODLD=$(CC) -static -g -nostdlib -arch ppc -arch i386 -CFLAGS_ppc=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS_ppc) -CFLAGS_x86=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS_x86) +MODLD=$(CC) -static $(KOPTS_DBUG) -nostdlib -arch ppc -arch i386 +CFLAGS_ppc=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS_ppc) $(KOPTS_DBUG) +CFLAGS_x86=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS_x86) $(KOPTS_DBUG) else -MODLD=$(CC) -static -g -nostdlib -arch ppc +MODLD=$(CC) -static $(KOPTS_DBUG) -nostdlib -arch ppc KOPTS=$(KOPTS_ppc) CFLAGS=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS) endif else ifeq ($(ARCH_x86),yes) -MODLD=$(CC) -static -g -nostdlib -arch i386 +MODLD=$(CC) -static $(KOPTS_DBUG) -nostdlib -arch i386 KOPTS=$(KOPTS_x86) else _ARCH=$(shell arch) -MODLD=$(CC) -static -g -nostdlib -arch $(_ARCH) +MODLD=$(CC) -static $(KOPTS_DBUG) -nostdlib -arch $(_ARCH) KOPTS=$(KOPTS_$(shell echo $(_ARCH) | sed 's/i386/x86/')) endif CFLAGS=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS) @@ -178,6 +182,12 @@ dest_libafs: $(LIBAFSNONFS) ; ${LIBAFS}: $(AFSAOBJS) $(AFSNFSOBJS) $(MODLD) -r -o ${LIBAFS} ${AFSAOBJS} ${AFSNFSOBJS} -lcc_kext + + dsymutil -o ${LIBAFS}.dSYM ${LIBAFS} + ${LIBAFSNONFS}: $(AFSAOBJS) $(AFSNONFSOBJS) $(MODLD) -r -o ${LIBAFSNONFS} ${AFSAOBJS} ${AFSNONFSOBJS} -lcc_kext + + dsymutil -o ${LIBAFSNONFS}.dSYM ${LIBAFSNONFS} + diff --git a/src/libafs/afs.ppc_darwin_12.plist.in b/src/libafs/afs.ppc_darwin_12.plist.in index 50e5e72d9f..eb1be80c90 100644 --- a/src/libafs/afs.ppc_darwin_12.plist.in +++ b/src/libafs/afs.ppc_darwin_12.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - @VERSION@ + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - @VERSION@ + @MACOS_VERSION@ OSBundleLibraries com.apple.kernel.bsd diff --git a/src/libafs/afs.ppc_darwin_13.plist.in b/src/libafs/afs.ppc_darwin_13.plist.in index 50e5e72d9f..eb1be80c90 100644 --- a/src/libafs/afs.ppc_darwin_13.plist.in +++ b/src/libafs/afs.ppc_darwin_13.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - @VERSION@ + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - @VERSION@ + @MACOS_VERSION@ OSBundleLibraries com.apple.kernel.bsd diff --git a/src/libafs/afs.ppc_darwin_14.plist.in b/src/libafs/afs.ppc_darwin_14.plist.in index 7e4f1bf1ac..eafb931589 100644 --- a/src/libafs/afs.ppc_darwin_14.plist.in +++ b/src/libafs/afs.ppc_darwin_14.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - @VERSION@ + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - @VERSION@ + @MACOS_VERSION@ OSBundleLibraries com.apple.kernel.bsd diff --git a/src/libafs/afs.ppc_darwin_60.plist.in b/src/libafs/afs.ppc_darwin_60.plist.in index 98ab344210..46d02fdcb8 100644 --- a/src/libafs/afs.ppc_darwin_60.plist.in +++ b/src/libafs/afs.ppc_darwin_60.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - @VERSION@ + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - @VERSION@ + @MACOS_VERSION@ OSBundleLibraries com.apple.kernel.bsd diff --git a/src/libafs/afs.ppc_darwin_70.plist.in b/src/libafs/afs.ppc_darwin_70.plist.in index a5334fe376..8fbe490610 100644 --- a/src/libafs/afs.ppc_darwin_70.plist.in +++ b/src/libafs/afs.ppc_darwin_70.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.5.25 + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - 1.5.25 + @MACOS_VERSION@ OSBundleLibraries com.apple.kernel.bsd diff --git a/src/libafs/afs.ppc_darwin_80.plist.in b/src/libafs/afs.ppc_darwin_80.plist.in index eb48495ffc..a1385718c5 100644 --- a/src/libafs/afs.ppc_darwin_80.plist.in +++ b/src/libafs/afs.ppc_darwin_80.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.5.25 + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - 1.5.25 + @MACOS_VERSION@ OSBundleLibraries com.apple.kpi.bsd diff --git a/src/libafs/afs.ppc_darwin_90.plist.in b/src/libafs/afs.ppc_darwin_90.plist.in index eb48495ffc..a1385718c5 100644 --- a/src/libafs/afs.ppc_darwin_90.plist.in +++ b/src/libafs/afs.ppc_darwin_90.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.5.25 + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - 1.5.25 + @MACOS_VERSION@ OSBundleLibraries com.apple.kpi.bsd diff --git a/src/libafs/afs.x86_darwin_80.plist.in b/src/libafs/afs.x86_darwin_80.plist.in index eb48495ffc..a1385718c5 100644 --- a/src/libafs/afs.x86_darwin_80.plist.in +++ b/src/libafs/afs.x86_darwin_80.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.5.25 + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - 1.5.25 + @MACOS_VERSION@ OSBundleLibraries com.apple.kpi.bsd diff --git a/src/libafs/afs.x86_darwin_90.plist.in b/src/libafs/afs.x86_darwin_90.plist.in index eb48495ffc..a1385718c5 100644 --- a/src/libafs/afs.x86_darwin_90.plist.in +++ b/src/libafs/afs.x86_darwin_90.plist.in @@ -15,11 +15,11 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.5.25 + @MACOS_VERSION@ CFBundleSignature ???? CFBundleVersion - 1.5.25 + @MACOS_VERSION@ OSBundleLibraries com.apple.kpi.bsd diff --git a/src/libafsrpc/Makefile.in b/src/libafsrpc/Makefile.in index 923c30b14a..e7fc8af543 100644 --- a/src/libafsrpc/Makefile.in +++ b/src/libafsrpc/Makefile.in @@ -401,7 +401,7 @@ fasttime.o: ${LWP}/fasttime.c syscall.o: ${SYS}/syscall.s case "$(SYS_NAME)" in \ sun4x_5* | sunx86_5*) \ - /usr/ccs/lib/cpp ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ + $(CPP) ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ as -o syscall.o syscall.ss; \ $(RM) syscall.ss;; \ sgi_* | *_darwin_* ) \ @@ -413,7 +413,7 @@ syscall.o: ${SYS}/syscall.s *bsd* ) \ touch syscall.o ;; \ *) \ - /lib/cpp ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ + $(CPP) ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ as -o syscall.o syscall.ss; \ $(RM) syscall.ss;; \ esac @@ -427,8 +427,8 @@ rxstat.cs.o: ${TOP_OBJDIR}/src/rxstat/rxstat.cs.c rxstat.ss.o: ${TOP_OBJDIR}/src/rxstat/rxstat.ss.c ${CCRULE} ${TOP_OBJDIR}/src/rxstat/rxstat.ss.c -rxstat.xdr.o: ${TOP_OBJDIR}/src/rxstat//rxstat.xdr.c - ${CCRULE} ${TOP_OBJDIR}/src/rxstat//rxstat.xdr.c +rxstat.xdr.o: ${TOP_OBJDIR}/src/rxstat/rxstat.xdr.c + ${CCRULE} ${TOP_OBJDIR}/src/rxstat/rxstat.xdr.c afsint.cs.o: ${TOP_OBJDIR}/src/fsint/afsint.cs.c ${CCRULE} ${TOP_OBJDIR}/src/fsint/afsint.cs.c diff --git a/src/libuafs/nsafslib.exp b/src/libuafs/nsafslib.exp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/log/Makefile.in b/src/log/Makefile.in index 93fb409eca..47ef6343e3 100644 --- a/src/log/Makefile.in +++ b/src/log/Makefile.in @@ -95,13 +95,13 @@ ${DEST}/bin/tokens: tokens ${INSTALL} $? $@ ${DEST}/bin/tokens.krb: tokens.krb - ${INSTALL} $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DEST}/root.server/usr/afs/bin/tokens: tokens ${INSTALL} $? $@ ${DEST}/root.server/usr/afs/bin/tokens.krb: tokens.krb - ${INSTALL} $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DEST}/etc/kseal: kseal ${INSTALL} $? $@ @@ -124,13 +124,13 @@ ${DESTDIR}${bindir}/tokens: tokens ${INSTALL} $? $@ ${DESTDIR}${bindir}/tokens.krb: tokens.krb - ${INSTALL} $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DESTDIR}${afssrvbindir}/tokens: tokens ${INSTALL} $? $@ ${DESTDIR}${afssrvbindir}/tokens.krb: tokens.krb - ${INSTALL} $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DESTDIR}${sbindir}/kseal: kseal ${INSTALL} $? $@ diff --git a/src/log/kseal.c b/src/log/kseal.c index 703954db23..d42df102bb 100644 --- a/src/log/kseal.c +++ b/src/log/kseal.c @@ -19,13 +19,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/log/tokens.c b/src/log/tokens.c index ae8d97b44a..dcf108fda8 100644 --- a/src/log/tokens.c +++ b/src/log/tokens.c @@ -44,15 +44,10 @@ RCSID #endif /* AFS_RXK5 */ #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifndef AFS_NT40_ENV + #define VIRTUE #define VICE diff --git a/src/log/unlog.c b/src/log/unlog.c index d6554b20fd..3d0a9008f0 100644 --- a/src/log/unlog.c +++ b/src/log/unlog.c @@ -38,14 +38,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -72,7 +65,7 @@ struct tokenInfo { int -CommandProc(struct cmd_syndesc *as, char *arock) +CommandProc(struct cmd_syndesc *as, void *arock) { struct cmd_item *itp; afs_int32 code, i; @@ -126,7 +119,7 @@ main(int argc, char *argv[]) initialize_ktc_error_table(); initialize_rx_error_table(); - ts = cmd_CreateSyntax(NULL, CommandProc, 0, + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "Release Kerberos authentication"); cmd_AddParm(ts, "-cell", CMD_LIST, CMD_OPTIONAL, "cell name"); @@ -259,6 +252,7 @@ unlog_NormalizeCellNames(char **list, int size) *list = newCellName; } afsconf_Close(conf); + return 0; } /* @@ -284,4 +278,5 @@ unlog_VerifyUnlog(char **cellList, int cellListSize, struct token_list *tokenLis fprintf(stderr, "unlog: Warning - no tokens held for cell %s\n", cellList[index]); } + return 0; } diff --git a/src/lwp/Makefile.in b/src/lwp/Makefile.in index b70a678234..d7306b2840 100644 --- a/src/lwp/Makefile.in +++ b/src/lwp/Makefile.in @@ -37,7 +37,7 @@ process.o : process.s process.i386.s process.c pmax_he1) \ $(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c -I${TOP_INCDIR} process.s;; \ sun4c_51 | sun4c_52 | sun4m_51 | sun4m_52 | sun4c_53 | sun4m_53 | sun4_53 | sun4_52 | sun4_54 | sun4c_54 | sun4m_54 | sun4x_5* ) \ - /usr/ccs/lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s process.ss; \ + $(CPP) -P -I${TOP_INCDIR} ${srcdir}/process.s process.ss; \ ${AS} process.ss -o process.o; \ $(RM) process.ss ;; \ sgi_5* ) \ @@ -45,11 +45,11 @@ process.o : process.s process.i386.s process.c sgi_61 | sgi_62 | sgi_63 ) \ $(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c ${XCFLAGS} ${ARCHFLAGS} -I${TOP_INCDIR} -KPIC -G0 ${srcdir}/process.s;; \ s390_*) \ - /lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s390.s >process.ss; \ + $(CPP) -P -I${TOP_INCDIR} ${srcdir}/process.s390.s >process.ss; \ ${AS} -ahlns process.ss -o process.o >process.lst; \ $(RM) process.ss ;; \ s390x_*) \ - /lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s390x.s >process.ss; \ + $(CPP) -P -I${TOP_INCDIR} ${srcdir}/process.s390x.s >process.ss; \ ${AS} -ahlns process.ss -o process.o >process.lst; \ $(RM) process.ss ;; \ *_darwin* ) \ @@ -88,11 +88,11 @@ process.o : process.s process.i386.s process.c ${AS} process.ss -o process.o ; \ $(RM) -f process.S ;;\ ncrx86_* | sunx86_*) \ - /usr/ccs/lib/cpp -P -D__sun -D__i386 -DIGNORE_STDS_H -I${TOP_INCDIR} -I${srcdir} ${srcdir}/process.i386.s process.ss; \ + $(CPP) -P -D__sun -D__i386 -DIGNORE_STDS_H -I${TOP_INCDIR} -I${srcdir} ${srcdir}/process.i386.s process.ss; \ ${AS} -o process.o process.ss; \ $(RM) process.ss ;; \ alpha_nbsd* ) \ - /usr/bin/cpp -DASSEMBLER -P -I${TOP_INCDIR} ${srcdir}/process.s > process.ss; \ + $(CPP) -DASSEMBLER -P -I${TOP_INCDIR} ${srcdir}/process.s > process.ss; \ ${AS} -o process.o process.ss; \ $(RM) process.ss ;; \ hp* | *_linux* | *_umlinux* | sgi_64 | sgi_65 ) \ @@ -103,11 +103,11 @@ process.o : process.s process.i386.s process.c ia64_hpux11* | hp_ux11* ) \ ${CC} ${CFLAGS} -c ${srcdir}/process.c;; \ i386_*) \ - /lib/cpp -P -I${TOP_INCDIR} -I${srcdir} ${srcdir}/process.i386.s process.ss; \ + $(CPP) -P -I${TOP_INCDIR} -I${srcdir} ${srcdir}/process.i386.s process.ss; \ ${AS} process.ss -o process.o; \ $(RM) process.ss ;; \ *) \ - /lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s process.ss; \ + $(CPP) -P -I${TOP_INCDIR} ${srcdir}/process.s process.ss; \ ${AS} process.ss -o process.o; \ $(RM) process.ss ;; \ esac diff --git a/src/lwp/lwp.c b/src/lwp/lwp.c index 55226f7dc7..0549f25b12 100644 --- a/src/lwp/lwp.c +++ b/src/lwp/lwp.c @@ -39,13 +39,7 @@ int setlim(int limcon, uchar_t hard, int limit); extern char *getenv(); #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #if !defined(USE_PTHREADS) && !defined(USE_SOLARIS_THREADS) @@ -967,6 +961,8 @@ Dispatcher(void) lwp_cpptr = runnable[i].head; returnto(&lwp_cpptr->context); + + return 0; /* not reachable */ } /* Complain of a stack overflow to stderr without using stdio. */ diff --git a/src/lwp/threadname.c b/src/lwp/threadname.c index f36b3170bd..3f7e9be0a0 100644 --- a/src/lwp/threadname.c +++ b/src/lwp/threadname.c @@ -25,13 +25,8 @@ RCSID ("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif + #if defined(AFS_PTHREAD_ENV) #include #else /* defined(AFS_PTHREAD_ENV) */ diff --git a/src/lwp/waitkey.c b/src/lwp/waitkey.c index e31e0c5250..5d2a88476d 100644 --- a/src/lwp/waitkey.c +++ b/src/lwp/waitkey.c @@ -35,13 +35,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "lwp.h" #define LWP_KEYSTROKE_DELAY 250 /* 250ms. Must be < 1000 */ diff --git a/src/package/tags b/src/package/tags deleted file mode 100644 index 89e6b52f54..0000000000 --- a/src/package/tags +++ /dev/null @@ -1,61 +0,0 @@ -AddBlkEntry test.c /^AddBlkEntry(f, p, o, m, u)$/ -AddChrEntry test.c /^AddChrEntry(f, p, o, m, u)$/ -AddDirEntry test.c /^AddDirEntry(f, p, o, m, u)$/ -AddEntry conftree.c /^int AddEntry(filetype, updtspec, filename, prototy/ -AddLnkEntry test.c /^AddLnkEntry(f, p, o, m, u)$/ -AddRegEntry test.c /^AddRegEntry(f, p, o, m, u)$/ -AddSockEntry test.c /^AddSockEntry(f)$/ -AllocConfigNode conftree.c /^static CTREEPTR AllocConfigNode()$/ -ApplyConfigTree conftree.c /^ApplyConfigTree(func)$/ -BuildConfigTree conftree.c /^int BuildConfigTree(f)$/ -CheckMount check.c /^static CheckMount(path)$/ -FixDir update.c /^static int FixDir(np, path)$/ -FixLostFoundDir update.c /^static int FixLostFoundDir(path)$/ -FixReg update.c /^static FixReg(np, path)$/ -GetArgs package.c /^static GetArgs(argc, argv)$/ -InitializeConfigTree conftree.c /^int InitializeConfigTree()$/ -LocateChildNode conftree.c /^CTREEPTR LocateChildNode(dp, name, lmode)$/ -LocatePathNode conftree.c /^CTREEPTR LocatePathNode(dp, path, lmode)$/ -Mpackage package.c /^main(argc, argv)$/ -Mtest test.c /^main(argc, argv)$/ -TraverseConfigTree conftree.c /^TraverseConfigTree(np, path, func)$/ -UpdateDev update.c /^static UpdateDev(np, path)$/ -UpdateDir update.c /^static UpdateDir(np, path)$/ -UpdateLnk update.c /^static UpdateLnk(np, path)$/ -UpdateReg update.c /^static UpdateReg(np, path)$/ -UpdateSock update.c /^static UpdateSock(np, path)$/ -ValidUpdtSpec conftree.c /^static int ValidUpdtSpec(ftype, uspec)$/ -ValidateGroupName conftree.c /^static int ValidateGroupName(name, gidp)$/ -ValidateUserName conftree.c /^static int ValidateUserName(name, uidp)$/ -allprint misc.c /^allprint(i)$/ -check check.c /^int check(np, path)$/ -cp fileops.c /^int cp(from,to)$/ -dbgprint globals.h /^#define dbgprint(x) {fprintf x ; fflush(stderr);/ -dochmod update.c /^static dochmod(np, path)$/ -dochown update.c /^static dochown(np, path)$/ -dochtim update.c /^static dochtim(np, path)$/ -dochtyp update.c /^static dochtyp(np, path)$/ -ecalloc globfuncs.c /^char *ecalloc(nelem, size)$/ -echo_modeinfo test.c /^echo_modeinfo(m)$/ -echo_ownerinfo test.c /^echo_ownerinfo(o)$/ -echo_prototypeinfo test.c /^echo_prototypeinfo(p)$/ -echo_updateoptions test.c /^echo_updateoptions(u)$/ -efopen globfuncs.c /^FILE *efopen(filename, type)$/ -emalloc globfuncs.c /^char *emalloc(size)$/ -fatal messages.c /^\/* VARARGS1 *\/fatal(cp) char *cp; \/*ARGSUSED*\/ {}$/ -ln fileops.c /^int ln(from,to)$/ -loudonly_message messages.c /^\/* VARARGS1 *\/loudonly_message(cp) char *cp; \/*ARG/ -message messages.c /^\/* VARARGS1 *\/message(cp) char *cp; \/*ARGSUSED*\/ {/ -mklostfound fileops.c /^int mklostfound(path)$/ -mv fileops.c /^int mv(from,to)$/ -namehash conftree.c /^static int namehash(name)$/ -putformat messages.c /^static char *putformat(dp,fp,ap)$/ -putnum messages.c /^static char *putnum(dp,n,b)$/ -putstr messages.c /^static char *putstr(dp,s)$/ -rm fileops.c /^int rm(path)$/ -sprint misc.c /^sprint(s)$/ -update update.c /^int update(np, path)$/ -usage package.c /^static usage()$/ -verbose_message messages.c /^\/* VARARGS1 *\/verbose_message(cp) char *cp; \/*ARGS/ -yyerror misc.c /^yyerror()$/ -yywrap misc.c /^yywrap()$/ diff --git a/src/packaging/MacOS/OpenAFS.Info.plist b/src/packaging/MacOS/OpenAFS.Info.plist.in similarity index 91% rename from src/packaging/MacOS/OpenAFS.Info.plist rename to src/packaging/MacOS/OpenAFS.Info.plist.in index 13878eda70..2a78672129 100644 --- a/src/packaging/MacOS/OpenAFS.Info.plist +++ b/src/packaging/MacOS/OpenAFS.Info.plist.in @@ -3,13 +3,13 @@ CFBundleGetInfoString - OpenAFS 1.5.25 + OpenAFS @MACOS_VERSION@ CFBundleIdentifier org.openafs.OpenAFS.pkg CFBundleName OpenAFS CFBundleShortVersionString - 1.5.25 + @MACOS_VERSION@ IFMajorVersion 1 IFMinorVersion @@ -31,7 +31,7 @@ IFPkgFlagRelocatable IFPkgFlagRestartAction - NoRestart + RecommendedRestart IFPkgFlagRootVolumeOnly IFPkgFlagUpdateInstalledLanguages diff --git a/src/packaging/MacOS/OpenAFS.info b/src/packaging/MacOS/OpenAFS.info.in similarity index 90% rename from src/packaging/MacOS/OpenAFS.info rename to src/packaging/MacOS/OpenAFS.info.in index abc9a8594c..a026c98441 100644 --- a/src/packaging/MacOS/OpenAFS.info +++ b/src/packaging/MacOS/OpenAFS.info.in @@ -1,5 +1,5 @@ Title OpenAFS -Version 1.5.25 +Version @VERSION@ Description The OpenAFS distributed filesystem. This package installs an almost-ready-to-run client for OpenAFS. see http://www.openafs.org for more information. DefaultLocation / Diskname (null) @@ -11,6 +11,6 @@ Application NO Relocatable NO Required NO InstallOnly NO -RequiresReboot NO +RequiresReboot YES InstallFat NO rootVolumeOnly YES diff --git a/src/packaging/MacOS/OpenAFS.post_install b/src/packaging/MacOS/OpenAFS.post_install index c840b18977..96281e6e56 100644 --- a/src/packaging/MacOS/OpenAFS.post_install +++ b/src/packaging/MacOS/OpenAFS.post_install @@ -36,6 +36,14 @@ if [ ! -f ThisCell -a -f ThisCell.sample ]; then cp ThisCell.sample ThisCell fi +# force reversion of 10.4 memcache mistake +rm -f config/afsd.options.broken +echo '-memcache -afsdb -stat 2000 -dcache 800 -daemons 3 -volumes 70 -dynroot -fakestat-all' > config/afsd.options.broken +if cmp -s config/afsd.options.broken config/afsd.options ; then + rm -f config/afsd.options +fi +rm -f config/afsd.options.broken + if [ ! -f config/afsd.options -a -f config/afsd.options.sample ]; then cp config/afsd.options.sample config/afsd.options fi @@ -91,7 +99,3 @@ elif [ -e config/afssettings ]; then # turn off execution of afssettings chmod a-x config/afssettings fi - -#here we should run tools which configure the client, and then if it's enabled: -/Library/StartupItems/OpenAFS/OpenAFS start - diff --git a/src/packaging/MacOS/OpenAFS.pre_upgrade b/src/packaging/MacOS/OpenAFS.pre_upgrade index 9b1f721fb4..ae71e03a50 100644 --- a/src/packaging/MacOS/OpenAFS.pre_upgrade +++ b/src/packaging/MacOS/OpenAFS.pre_upgrade @@ -23,6 +23,3 @@ if [ -f config/afsd.options -a -f config/afsd.options.sample ]; then fi fi -if [ -f /Library/StartupItems/OpenAFS/OpenAFS ]; then - /Library/StartupItems/OpenAFS/OpenAFS stop -fi diff --git a/src/packaging/MacOS/ReadMe.rtf b/src/packaging/MacOS/ReadMe.rtf.8 similarity index 98% rename from src/packaging/MacOS/ReadMe.rtf rename to src/packaging/MacOS/ReadMe.rtf.8 index a2c5dddcaa..ada1c7dd51 100644 --- a/src/packaging/MacOS/ReadMe.rtf +++ b/src/packaging/MacOS/ReadMe.rtf.8 @@ -4,7 +4,7 @@ \margl1440\margr1440\vieww9000\viewh9000\viewkind0 \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f0\fs20 \cf0 This release of OpenAFS is targeted at MacOS 10.4. +\f0\fs20 \cf0 This release of OpenAFS is targeted at MacOS 10.4. (Tiger) \ Select a client cell name by editing /var/db/openafs/etc/ThisCell\ \ diff --git a/src/packaging/MacOS/ReadMe.rtf.9 b/src/packaging/MacOS/ReadMe.rtf.9 new file mode 100644 index 0000000000..dfba64d377 --- /dev/null +++ b/src/packaging/MacOS/ReadMe.rtf.9 @@ -0,0 +1,13 @@ +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf100 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\margl1440\margr1440\vieww9000\viewh9000\viewkind0 +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\fs20 \cf0 This release of OpenAFS is targeted at MacOS 10.5. (Leopard) +\ +Select a client cell name by editing /var/db/openafs/etc/ThisCell\ +\ +The included afssettings program is distributed under the Apple Public Source License, version 2.0. See http://www.opensource.apple.com/apsl/2.0.txt or the included file 2.0.txt.\ +\ +Reboot when all of this is done.} diff --git a/src/packaging/MacOS/buildpkg.sh b/src/packaging/MacOS/buildpkg.sh.in similarity index 84% rename from src/packaging/MacOS/buildpkg.sh rename to src/packaging/MacOS/buildpkg.sh.in index d7f6db0233..4c9cd5080b 100644 --- a/src/packaging/MacOS/buildpkg.sh +++ b/src/packaging/MacOS/buildpkg.sh.in @@ -25,6 +25,15 @@ CURDIR=`pwd` RESSRC=`dirname $0` RESSRC=`cd $RESSRC && pwd` majorvers=`uname -r | sed 's/\..*//'` +if [ $majorvers -eq 7 ]; then + RELNAME="Panther" +fi +if [ $majorvers -eq 8 ]; then + RELNAME="Tiger" +fi +if [ $majorvers -eq 9 ]; then + RELNAME="Leopard" +fi PKGROOT=$CURDIR/pkgroot PKGRES=$CURDIR/pkgres @@ -67,7 +76,7 @@ if [ $firstpass = yes ]; then die=1 fi fi - FILES="ReadMe.rtf License.rtf CellServDB.list OpenAFS.info OpenAFS.post_install OpenAFS.pre_upgrade csrvdbmerge.pl 2.0.txt" + FILES="ReadMe.rtf.$majorvers License.rtf CellServDB.list OpenAFS.info OpenAFS.post_install OpenAFS.pre_upgrade csrvdbmerge.pl 2.0.txt" for f in $FILES; do if [ ! -f $RESSRC/$f ]; then echo "file missing: " $RESSRC/$f @@ -122,11 +131,7 @@ if [ $firstpass = yes ]; then else echo /Network/afs:/var/db/openafs/cache:30000 > $PKGROOT/private/var/db/openafs/etc/cacheinfo.sample fi - if [ $majorvers -ge 9 ]; then - echo '-memcache -afsdb -stat 2000 -dcache 800 -daemons 3 -volumes 70 -dynroot -fakestat-all' > $PKGROOT/private/var/db/openafs/etc/config/afsd.options.sample - else echo '-afsdb -stat 2000 -dcache 800 -daemons 3 -volumes 70 -dynroot -fakestat-all' > $PKGROOT/private/var/db/openafs/etc/config/afsd.options.sample - fi strip -X -S $PKGROOT/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs @@ -137,7 +142,7 @@ if [ $firstpass = yes ]; then chmod -R og-w $PKGROOT/private chmod og-rx $PKGROOT/private/var/db/openafs/cache - mkdir -p $PKGROOT/usr/bin $PKGROOT/usr/sbin + mkdir -p $PKGROOT/usr/bin $PKGROOT/usr/sbin $PKGROOT/usr/share/man/man1 $PKGROOT/usr/share/man/man5 $PKGROOT/usr/share/man/man8 BINLIST="fs klog klog.krb pagsh pagsh.krb pts sys tokens tokens.krb unlog unlog.krb aklog" ETCLIST="vos" @@ -152,6 +157,18 @@ if [ $firstpass = yes ]; then for f in $ETCLIST; do ln -s ../../Library/OpenAFS/Tools/etc/$f $PKGROOT/usr/sbin/$f done + for f in `ls $PKGROOT/Library/OpenAFS/Tools/man/man1`; do + gzip -9 $PKGROOT/Library/OpenAFS/Tools/man/man1/$f + ln -s ../../../../Library/OpenAFS/Tools/man/man1/$f.gz $PKGROOT/usr/share/man/man1/$f.gz + done + for f in `ls $PKGROOT/Library/OpenAFS/Tools/man/man5`; do + gzip -9 $PKGROOT/Library/OpenAFS/Tools/man/man5/$f + ln -s ../../../../Library/OpenAFS/Tools/man/man5/$f.gz $PKGROOT/usr/share/man/man5/$f.gz + done + for f in `ls $PKGROOT/Library/OpenAFS/Tools/man/man8`; do + gzip -9 $PKGROOT/Library/OpenAFS/Tools/man/man8/$f + ln -s ../../../../Library/OpenAFS/Tools/man/man8/$f.gz $PKGROOT/usr/share/man/man8/$f.gz + done ln -s ../../Library/OpenAFS/Tools/bin/kpasswd $PKGROOT/usr/bin/kpasswd.afs @@ -186,12 +203,21 @@ if [ $secondpass = yes ]; then cp OpenAFS.post_install $PKGRES/OpenAFS.post_upgrade chmod a+x $PKGRES/OpenAFS.post_install $PKGRES/OpenAFS.post_upgrade $PKGRES/OpenAFS.pre_upgrade fi - cp License.rtf ReadMe.rtf $PKGRES + cp License.rtf $PKGRES + cp ReadMe.rtf.$majorvers $PKGRES/ReadMe.rtf cp csrvdbmerge.pl $PKGRES chmod a+x $PKGRES/csrvdbmerge.pl cp CellServDB.list $PKGRES chown -R root${SEP}wheel $PKGRES rm -rf $CURDIR/OpenAFS.pkg + + # once we have cm cleanup in 10.4 this can go + if [ $majorvers -le 8 ]; then + cat $RESSRC/OpenAFS.info|sed 's/RequiresReboot NO/RequiresReboot YES/'>$RESSRC/OpenAFS.info.new + rm -f $RESSRC/OpenAFS.info + mv $RESSRC/OpenAFS.info.new $RESSRC/OpenAFS.info + fi + if [ $majorvers -ge 7 ]; then echo $package -build -p $CURDIR/OpenAFS.pkg -f $PKGROOT -r $PKGRES \ -i OpenAFS.Info.plist -d OpenAFS.Description.plist @@ -213,14 +239,14 @@ if [ $secondpass = yes ]; then rm -rf $PKGROOT $PKGRES mkdir $CURDIR/dmg mv $CURDIR/OpenAFS.pkg $CURDIR/dmg - rm -rf $CURDIR/OpenAFS.dmg + rm -rf $CURDIR/OpenAFS-@VERSION@-$RELNAME.dmg cp Uninstall $CURDIR/dmg/Uninstall.command cp DS_Store $CURDIR/dmg/.DS_Store mkdir $CURDIR/dmg/.background cp afslogo.jpg $CURDIR/dmg/.background # hdiutil create -srcfolder $CURDIR/dmg -volname OpenAFS -anyowners $CURDIR/OpenAFS.dmg hdiutil makehybrid -hfs -hfs-volume-name OpenAFS -hfs-openfolder $CURDIR/dmg $CURDIR/dmg -o $CURDIR/TMP.dmg - hdiutil convert -format UDZO $CURDIR/TMP.dmg -o $CURDIR/OpenAFS.dmg + hdiutil convert -format UDZO $CURDIR/TMP.dmg -o $CURDIR/OpenAFS-@VERSION@-$RELNAME.dmg rm $CURDIR/TMP.dmg rm -rf $CURDIR/dmg # Unfortunately, sudo sets $USER to root, so I can't chown the diff --git a/src/packaging/RedHat/.cvsignore b/src/packaging/RedHat/.cvsignore new file mode 100644 index 0000000000..f07c5d2b14 --- /dev/null +++ b/src/packaging/RedHat/.cvsignore @@ -0,0 +1 @@ +openafs.spec diff --git a/src/packaging/RedHat/RPM-build-notes b/src/packaging/RedHat/RPM-build-notes new file mode 100644 index 0000000000..bf6f187dff --- /dev/null +++ b/src/packaging/RedHat/RPM-build-notes @@ -0,0 +1,35 @@ +Beginning with the 1.4.5 release, OpenAFS's prebuilt binaries use a new +mechanism for packaging kernel modules on Fedora Core (all versions) +and RHEL 5 (and derivatives). This new mechanism allows the +installation of modules for multiple kernel variants simultaneously, +and is identical to the technique used by Fedora and Red Hat's own +out of tree kernel modules. + +The difference is that instead of a single 'openafs-kernel' module, +multiple kmod-openafs- RPMs are produced. When manually +upgrading to OpenAFS 1.4.5, it may be necessary to remove any openafs- +kernel modules left behind by your old installation, and to ensure +that the appropriate kmod-openafs module is installed. + +If you wish to build 'kmod' modules for new kernel release, this may +be done by rebuilding the SRPM with 'fedorakmod' defined, and the +'kvariants' parameter set to the list of kernel variants you wish to +build modules for (a kernel-devel package must be installed for each +of these variants). Note that supplying '' as a variant will build +for a normal kernel. The 'kernvers' variable can be set to specify +what kernel release version you wish to build for. + +For example: + rpmbuild -bb --define "fedorakmod 1" \ + --target i686 \ + --define "build_modules 1" \ + --define "kvariants '' PAE" \ + openafs.spec + +would build a kernel module for the normal and PAE variants of the +currently running kernel. + +Old-style packages may still be built in the same way as previous +releases. However, note that you must use userland RPMs which match +the packaging of your kernel module. Old style kernel modules will +not work with a set of userland RPMs which expect kmod-style packages. diff --git a/src/packaging/RedHat/afs-krb5-2.0-com_err.patch b/src/packaging/RedHat/afs-krb5-2.0-com_err.patch deleted file mode 100644 index 7b496bbee3..0000000000 --- a/src/packaging/RedHat/afs-krb5-2.0-com_err.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -uNr afs-krb5.orig/src/configure.in afs-krb5/src/configure.in ---- afs-krb5.orig/src/configure.in 2005-04-14 16:06:15.597138000 -0400 -+++ afs-krb5/src/configure.in 2005-04-14 16:06:44.201789856 -0400 -@@ -143,7 +143,19 @@ - LIBS="$ac_save_LIBS"]) - if test "x$afs_cv_func_getDirPath" = "xyes"; then - AC_MSG_RESULT([Setting compilation parameters for AFS 3.5 and later]) -- AKLOG_EXTRA_OBJ=adderrtable.o -+ AC_MSG_CHECKING([for add_to_error_table]) -+dnl -+dnl We may be using libcom_err from Kerberos (shared libraries), and -+dnl already have add_to_error_table -+dnl -+ AC_TRY_LINK_FUNC(add_to_error_table, have_adderr=yes, have_adderr=no) -+ if test $have_adderr != yes; then -+ AC_MSG_RESULT([no, adding adderrtable.o]) -+ AKLOG_EXTRA_OBJ=adderrtable.o -+ else -+ AC_MSG_RESULT([yes]) -+ AKLOG_EXTRA_OBJ= -+ fi - else - AC_MSG_RESULT([Setting compilation parameters for pre-AFS 3.5]) - AC_DEFINE(PRE_AFS35) diff --git a/src/packaging/RedHat/afs-krb5-2.0-krb524.patch b/src/packaging/RedHat/afs-krb5-2.0-krb524.patch deleted file mode 100644 index 7503d41191..0000000000 --- a/src/packaging/RedHat/afs-krb5-2.0-krb524.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- afs-krb5/src/configure.in-orig 2003-03-16 20:13:34.000000000 -0500 -+++ afs-krb5/src/configure.in 2005-09-14 17:20:46.000000000 -0400 -@@ -179,14 +197,20 @@ - [ EXTRA_INC="$EXTRA_INC -I$with_krb5_obj/include -I$with_krb5_obj/include/krb5" - KADM_LIBS=`echo $KADM_LIBS | sed -e "s#-ldb#$with_krb5_obj/lib/libdb.a#"`]) - dnl --dnl Sigh, why is this so complicated? Right now, just assume that --dnl the 524 library is always called krb524 and will be picked up by the --dnl Kerberos link line --dnl --dnl AC_CHECK_LIB(krb524, krb524_convert_princs, [KRB524LIB="-lkrb524"], [ --dnl AC_MSG_ERROR([Cannot find 524 library, exiting]) --dnl ]) --KRB524LIB=-lkrb524 -+dnl The krb524 functions may be included in libkrb5 itself, or else in a -+dnl separate library named libkrb524 -+dnl -+ac_save_LIBS="$LIBS" -+KRB524LIB= -+AC_MSG_CHECKING([for krb524 library]) -+AC_CHECK_FUNC(krb524_init_ets, have_krb524=yes, have_krb524=no) -+ -+if test "$have_krb524" = no; then -+ LIBS="$LIBS -lkrb524" -+ AC_CHECK_LIB(krb524, krb524_init_ets, [KRB524LIB="-lkrb524"], -+ [AC_MSG_ERROR([Unable to find krb524 library])]) -+fi -+LIBS="$ac_save_LIBS" - - dnl AC_CHECK_LIB(kdb5, krb5_db_fetch_mkey, [KD_LIBS="-lkdb5"],[ - dnl AC_MSG_WARN([Cannot find Kerberos 5 DB library, will not be able to build DB utilities]) diff --git a/src/packaging/RedHat/afs-krb5-2.0-libsocket.patch b/src/packaging/RedHat/afs-krb5-2.0-libsocket.patch deleted file mode 100644 index e39ef2ceff..0000000000 --- a/src/packaging/RedHat/afs-krb5-2.0-libsocket.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -uNr afs-krb5.orig/src/configure.in afs-krb5/src/configure.in ---- afs-krb5.orig/src/configure.in 2003-03-16 20:13:34.000000000 -0500 -+++ afs-krb5/src/configure.in 2003-07-30 11:52:55.000000000 -0400 -@@ -44,14 +44,6 @@ - if test $retval -ne 0; then - AC_MSG_ERROR($krb5_config failed with error code of $retval) - fi --AC_MSG_RESULT([Adding $krb5_cflags to CFLAGS]) --AC_MSG_RESULT([Adding $krb5_libs to LIBS]) --AC_MSG_RESULT([Setting KADM_CFLAGS to $krb5_cflags_kadm]) --AC_MSG_RESULT([Setting KADM_LIBS to $krb5_libs_kadm]) --CFLAGS="$CFLAGS $krb5_cflags" --LIBS="$LIBS $krb5_libs" --KADM_CFLAGS="$krb5_cflags_kadm" --KADM_LIBS="$krb5_libs_kadm" - dnl - dnl Check for various network libraries - dnl -@@ -105,6 +97,20 @@ - AC_MSG_ERROR([Unable to find res_search function]) - fi - LIBS="$save_LIBS" -+ -+dnl -+dnl Don't add these to LIBS until after we've already looked for -+dnl libsocket, etc. Otherwise ka-forwarder won't build properly -+dnl -+AC_MSG_RESULT([Adding $krb5_cflags to CFLAGS]) -+AC_MSG_RESULT([Adding $krb5_libs to LIBS]) -+AC_MSG_RESULT([Setting KADM_CFLAGS to $krb5_cflags_kadm]) -+AC_MSG_RESULT([Setting KADM_LIBS to $krb5_libs_kadm]) -+CFLAGS="$CFLAGS $krb5_cflags" -+LIBS="$LIBS $krb5_libs" -+KADM_CFLAGS="$krb5_cflags_kadm" -+KADM_LIBS="$krb5_libs_kadm" -+ - dnl - dnl Optional support for AFS - dnl diff --git a/src/packaging/RedHat/afs-krb5-2.0-openafs1.3.patch b/src/packaging/RedHat/afs-krb5-2.0-openafs1.3.patch deleted file mode 100644 index 44045a0670..0000000000 --- a/src/packaging/RedHat/afs-krb5-2.0-openafs1.3.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -uNr afs-krb5.orig/src/asetkey.c afs-krb5/src/asetkey.c ---- afs-krb5.orig/src/asetkey.c 2005-04-08 15:55:35.637620000 -0400 -+++ afs-krb5/src/asetkey.c 2005-04-08 15:55:57.614279120 -0400 -@@ -81,7 +81,7 @@ - exit(1); - } - -- code = afsconf_AddKey(tdir, kvno, key->contents); -+ code = afsconf_AddKey(tdir, kvno, key->contents, 1); - if (code) { - printf("setkey: failed to set key, code %ld.\n", code); - exit(1); diff --git a/src/packaging/RedHat/afs-krb5-2.0-res_search.patch b/src/packaging/RedHat/afs-krb5-2.0-res_search.patch deleted file mode 100644 index fda5ba45b4..0000000000 --- a/src/packaging/RedHat/afs-krb5-2.0-res_search.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- afs-krb5/src/configure.in.res_search 2005-09-30 12:53:38.000000000 -0400 -+++ afs-krb5/src/configure.in 2005-09-30 14:40:38.000000000 -0400 -@@ -89,7 +89,10 @@ - if test "$have_res_search" != yes; then - AC_CHECK_LIB(${lib}, res_search, - [have_res_search=yes -- NETLIBS="$NETLIBS -l${lib}"]) -+ NETLIBS="$NETLIBS -l${lib}"], -+ [AC_CHECK_LIB(${lib}, __res_search, -+ [have_res_search=yes -+ NETLIBS="$NETLIBS -l${lib}"])]) - fi - done - fi diff --git a/src/packaging/RedHat/kmodtool b/src/packaging/RedHat/kmodtool new file mode 100644 index 0000000000..2afc4d9ccf --- /dev/null +++ b/src/packaging/RedHat/kmodtool @@ -0,0 +1,172 @@ +#!/bin/bash + +# kmodtool - Helper script for building kernel module RPMs +# Copyright (c) 2003-2007 Ville Skyttä , +# Thorsten Leemhuis +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +shopt -s extglob + +myprog="kmodtool" +myver="0.10.13" +knownvariants=@(BOOT|PAE?(-debug)|@(big|huge)mem|debug|enterprise|kdump|?(large)smp?(-debug)|uml|xen?([0U])?(-PAE)) +kmod_name= +kver= +verrel= +variant= + +get_verrel () +{ + verrel=${1:-$(uname -r)} + verrel=${verrel%%$knownvariants} +} + +print_verrel () +{ + get_verrel $@ + echo "${verrel}" +} + +get_variant () +{ + get_verrel $@ + variant=${1:-$(uname -r)} + variant=${variant##$verrel} + variant=${variant:-'""'} +} + +print_variant () +{ + get_variant $@ + echo "${variant}" +} + + +get_rpmtemplate () +{ + local variant="${1}" + local dashvariant="${variant:+-${variant}}" + case "$verrel" in + *.EL*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;; + *) kdep="kernel-%{_target_cpu} = ${verrel}${variant}" ;; + esac + cat <= %{?epoch:%{epoch}:}%{version} +Requires(post): /sbin/depmod +Requires(postun): /sbin/depmod +BuildRequires: kernel${dashvariant}-devel-%{_target_cpu} = ${verrel} +%description -n kmod-${kmod_name}${dashvariant} +This package provides the ${kmod_name} kernel modules built for the Linux +kernel ${verrel}${variant} for the %{_target_cpu} family of processors. +%post -n kmod-${kmod_name}${dashvariant} +/sbin/depmod -aeF /boot/System.map-${verrel}${variant} ${verrel}${variant} > /dev/null || : +%postun -n kmod-${kmod_name}${dashvariant} +/sbin/depmod -aF /boot/System.map-${verrel}${variant} ${verrel}${variant} &> /dev/null || : +%files -n kmod-${kmod_name}${dashvariant} +%defattr(644,root,root,755) +/lib/modules/${verrel}${variant}/extra/${kmod_name}/ + +EOF +} + +print_rpmtemplate () +{ + kmod_name="${1}" + shift + kver="${1}" + get_verrel "${1}" + shift + if [ -z "${kmod_name}" ] ; then + echo "Please provide the kmodule-name as first parameter." >&2 + exit 2 + elif [ -z "${kver}" ] ; then + echo "Please provide the kver as second parameter." >&2 + exit 2 + elif [ -z "${verrel}" ] ; then + echo "Couldn't find out the verrel." >&2 + exit 2 + fi + + for variant in "$@" ; do + get_rpmtemplate "${variant}" + done +} + +usage () +{ + cat <

(4D2OW@f+Lr_U46wh@XiX}f)bK~x2 ztXCIvVyM=iNm{e=AF8%|?PNriOapJ2{g_1xR)Y$dHd}~=srPoq7&PV5RhKa_rlqV? zT}v_1HW?bE_f|I~P35G_$7V{X_M_Cmsx7??N$I^rFr%ecvDb7xV6z1Mk|K;QN$72y zIS+_h;td0dI0=VG#b6ET23H7>1~Up_lgoHmdBa%gor}eznMrOQc3{N@bkVI13Vp+b z72d{T8cUDgebt6N0)x7ZQJ7b8o$i3|=MuXQCE8fx8}?o{k)`wY6kL;MMUST;c?P%? zVJLMN;+&8&ioO^HFKKrcjCP=1z5ApUY;)=lVWlKlK&H{(fIJ>@PFtGOLh636Ce&Y;Eng4)ge@9mj34-%pa z3ll&z?L=4U%NMak#lH0-){QJS^$BTlOKJ1Z329RYBkw9w1|vkkgvBgd!Q61u#FZ>d z-E$SsO^G`P4R-q3Z;y~kHjGRjfD)2Bgyl$bI$W`nZNF^7xD+j$k8CYc||cg~vrJi+a(x7%YeQi}hppCK}sJ#X%K!UTUju zuaF7lqp@Q#k`KpxoatUo^4JO+_dhQ_hYtLc{i~A71R2WwK7Fo@O~?UaFd(nT>%Yq7ZR59ZjN~ zaxGZeDy?vt_u(Cl&|9orWLJft2ax*cXl%T6XI1v6nDBl$(`91nTK`NL!N?>Ql?p)t zuoap<4Z}cdPN=bgtuOH;pA%iT)z0KXk)%Wv6-*B3P1+_DdhpKCsAbVi$9rHW=&&+# zkje90&1jZEJ;|W{OjjBHVW3(#Rtjb{ZdQvelhDW>i+`8g!@Zlr@eo)f0j3);cV<2AMNe`+&=wq&}?zB zlhfm$+l|wmcl*CI<4@X+-Cg79Y2)Z%|E=+0|EP7=I5^-Z@0yL>=4rciw%a)USv+b0 z41V6qk8gXWt020I2BXW;Rlz8+_u*)#m5(N!VQ+0SpuhZkbR)_Kqj5OIzumzo3gLsO zjy2mm@0vUB^IswqUZ)pDc)Z)(+dpdN3HUFqlhgg9v%NyW9N)+H@QqyLPd^;B_YN9A zBSH@P!)p-h!rlHPUn=3O;G~o~#lZMjqM0ISW9U`ybT$a{pMYv@McSH7= z4^f)#=uwY5{RtzU%0AKd5|qY6W_$Bui3_*%N%syZbr@c9P%OZ4f7qh~Ao9NuPpLHV zqu~G!8uF;@95#fZmHg@%4&j0QX@-oGqJ&ipYR|yS{2tn0lG^2wcEC0Ma2-cGj0`uBdRSyFlTt{*Yc!4di zH)KSKcwwc!fYJ)3Qe770)$7-otWYYi^Zxwdr@HN_{hznYxgBsR)IZo8lZGqD_G4a zYoW=db)MIx@9U9iCh0>))P?SLuZ)#*?d0i*FA;Nvi2Bx=2ohGyE2n~97tnyhEt>tT zRD!J-6q6|!cMPda?TMiS?OWgC9Z!0#maM}R1fq;N&p#8@m& z0H**(Ms+puWD+R97}aBxA+BPs(Nl5pk_*ynTRB6hgQ0nyr)UlXr-eEN ziF46~kJPQypNuAYzKrup`wa>AS}@38jmF`{Y%sVh$TJWITixPXxz~cM-@I1S_vW=^ zpKnAVIu2Q-`8!QP-0pO5|)iA4xvAh?ha`TMQ`xMd5$>E6=&ZHED5YF*^b?C)&zAG@2m^d=#H_d(sar*4ql%;Vvc=rgha^TjI-K8t$ zXOY;Tje58r2qBxMFHu@pmfMxw1z-ac=O2cu!@9}oL_O3b90Z+PIHrvTJ$Wt;@Bn>h z&L=WyoK3yI&~xCZNa!*yp}GGU?cn|BFuYBKPMnErD!W`)z+@prMrg!#Uj!95{GnaR z3S_6k9vY*>Q|}ng=Hp2piP{J_N#ix|-$j5sg<~q9{pYbi>0Qy+_U2tBHKXtFWlvie zDilN6ig*m7XR`Uir@X{;;j<&MD#~rXW^q}_cfW7MY|}HPw(i7Jo#Y~Vxqn(A zn_f@_|Zp03iT9R9TKN9jHCi7I7s5KFdWg`GU;&&10&7*PU(_)5 z4bWGsx)of+>EfrYh7WO2VZ~(?u}YF@crcz&5h@6r*^Sjx8;Xq|D$MO&-C=2HEwi(K z(l`jDRZRNyz$qIx>e&D`X>D%anF=YzoGAd6GFPyDVH~m$-5s7_oJ!uu<^5rV0#?yD ztE&~hyANyp;P_+vpS0dPv?+14G!%4dZTWoAc zK&o3|rZ2#9d9zx9X;@>n*oB#1){}dS4$!U{vsJOMSZZlMV_t9H-d<#e0 z;bl0l>5n__8b?3J5RJA;AQ;~d8LeMV;>>o9v!MuC70GKOONC`LyGGAR=p=Uf-M(+*}7a4bdDD()j5e=x-S^!WK!fCyy zMoM5yVj@>)A|0B&ySusR_1?WZJfwEQ(q$=lS+7*9_43PFxmq)p(95k_c?+I&N;f48 zky5RzSs^WnyBzNBN;fy9Ua$1-UFq`wXk z-{L?|^5K$FEyI{%Y}K;#s3^XApuUh-Szb zd^@^AHC9g~Ot~S&%n(hphRX8;o(!N-R2%THlAsVrW+?8A{McLh@qFdS-?n}{Q&U@B z5j<`Msc@^ZzO`0G+K09Jq0}mgR-$B3r>UTPaKyf|+dMdHEVAhsaa;d|JC4cVJ8){0 z+2nz0Bh4VMK3#n_3Sxe0^gc`Ak|rEvv<9G?PdE1j#EjMe6@7~C35q#*WHW6`x?H)s z+Pb;fBE=QW{>Dmq4Os$gn|hT;;g@hom@1+H-Gm1lz|t3;B~>AIj9ZKevAwISn;WB% z-r7~Id{c=Yu?=S&>p=WKx@H6YuMD#oz`8JjVle|#CQz%}>sQsI)w-MP5j(LtD0Va%HJr0NS!|0dj$OB zYp(e>U4zl(WjIOn4w0`D?zhzI9z~3E1zB`6|cMSRN z7?Qy;7KY9)BbULyE}#6}_2N5b_ViSPDm1g&9~ zSR+|>2JaDXvY(~y=mt$VQ*!`a>=EL*dosz$!0$D8Z2X zrVD1;gQJfGGl)VBMHF|&`T9#|g30LpEn9W)J>x&ex+Cn>VdGa!$A{VYTKoUm%vH+O zHSQ&BbQd{z{qDGRhBuH0%_9SX{UTSbuUpOAuMOuQI1ivwOy~#nE^J(j5vjwLH-p8?abP})wmz@C!80%Ha&i|n+>UbS z>HQkr+u87V+?ihC-u{N)GME0e{Th#*Kmm7eK5f0e=yYk>Sws#w_pxz$w0|Uv zA05NG5D3WaAMG8BkGsvcA4D0A!i1h6JCz}x=bO;HD zvm1I$HlTk5@7uU@ApHq@R(`-FXFnqPvK|RCvz{@vS&xp6kD9@ss#Tvu7`?2bS*(0J z8{*OL@=kvlf--;Acp@m|VGYNo_ipq7if zj$nGk$G)4Rfp$UXjSQQP+v?S*bJO>{fD^+smiut5M`* z>_GUX6h(ou{9t*lq&_Um{=_@On1b18t8cIDhpANIc%@%Y+BC0|(NlO&${JCh!Im=EvB1;{v* z37TQ9)jmFH9_3+^yD8)@5bgZgC?_}`7lcxx*wQL=1mpHZFl|dt9RZsn(Bv-&cs_r@ zfok}B@P7RVF1cokL#}w9uN8tDn2*jSsyno@Q_4$X|8n!=tZM4`GU}rO zB;FV=iz4NVDT+IoV$jjEPHzwUIWGmMp~T69k1R(%*gOsjHi@*c-^WI%49YkOrbGrN>-Hp0v1 z5Ivgc4n6Fk?5SXgh)8)JC}v%OLlKZDBU5>2GdbXo>lxJP^-!G>bS`k87T{3=l&4-e z@2ev)X?!%Kjwr95s9y0H01?l`3;_Qaz)Iq8h0pfr_AgL{B-COcgY%(IkYrIh(S@jQ z(QTk-3DQSF$qpbTDLk-KtN_8~3a>onmf%3U6pKLCozr#v5q~WDFdYNuQH(hyQZ)f% zpAE;ThCubwRi}H+o^Eswp^Q!l9hwX&hQ|OW4mjvgL)sL<3~obGa@=SaI1(;Nqt_Qo zGOA(F1Q8R{a{ud& zi#97JDT8}zDzjz%_zvoUkVp4vT=M|xQ~9&=pz^sW(PBNXx&>y zrC{Uw`Yt{^IH?SmgiEtHt7NY1>5KL&HYQIT!Q46JGmn2xclneUjnN7`<2T99S?pt))Cfvy<|J;tTq!<i>gA<78X<|>ESIyEl>bw(Xu!V!srN!9sPMnd+=QaR(1LATpk{6Zim`~EU z#7|M4&I)O}dThJ41T=f~nlYpBe@p*B@e=qtsLzoJjf`lXI~+O+O*m{LUs*=t5|-{6 z+4k}r$%+g)F!YPC=!92O5$-M0DkMY40Si!fM?TsH2-*b=>2pbg5Nj%jah*AErKrp7K(;{Iqyk1<0%-&5boxWKAfaVOQSnin z@o3A0Aro2A$dH=4CShRp3Wcu`I_LDP2}lbZsFs8dq%RU7N}ZXWy+tyM`m%l6nl(Ej znQFw+of*0|u|_G1KA;n%S)WEumI5x}6r$JaJuX&TvkoI2UXDgRy8=q%@T+P)#h4^r zt1=KZp>d9;#OX6zCf)1{XH_xn| z%CM^Uh0l0N2Cu@&(N4XLh7D}s#8yq16&j^9p-&vmh9ak=V!`1cM7zX@>+9^>^AMMd z&&sEyI-jiy-XbFPxHT3$=F0RXB>3>Xl*ni;dz&C_Q8cUgRhjIFh(DD$N)-djg;CIX zG7?(0BCVOCHCmiVp_m+SU>Ebrw`PFTSdw80B_P`Jy+F^K-U@f%lBg|? zSBNZ9;m0}}sKi%Ykbi^jSmw8vmCz^inOjX>0l3c#D-|(zW*QoHm4H`QRs?kTEc10O zb0a#Hm&V(E#8;XfvPt^8H7HJTHJuFc)YiQjlfG&RceABpux8~GlK`2nAFs#j#u6Br?t-*9{Ty#a}0K;zi&U6t>-RaWPE4(4BppK z!DZINOVFjxi=|*ISh|&(1RC0f0^wr`CLKzJ0=D!jTNRh!WlHait%+o)JR(u=Pg9e^ zOVmEpFYSzGgC6YXj9(NZ$fgDF=g7{{4CO14W#3xCx8X=em&*x>3ywGny%fghADhN#NPa?NXh3S~7OC-}L-PN**fbBv+sY<3b6t5tc5VVZL{H-k+1-LF zUEFDn#NX3sd|lJ3m|OulN7_R&(#N2b${AU9sw7LTYO3a?F5+?GByYeZBW#P>Nvy>H zj6&WOk7JC2NkDTF9ahln;~|+YcT)THlx{(JdS$nk0G&&P%*!xkIwT#&F1#EHi}wHv z-nS28IoWq-qA#``b^4{*yiT$a@54K(@85i#Ouu-W*GDY(pt)3+cfP*qTRZ=?+q~Y1 zqK|+>^A69~)A^To^ZLpqAEB$pMWC;zb8Z0VbrZ`yXu{PkqOWu5*N5}^Mg<=MgZd`Y z*GKaTGN*zK+q;yCHf%9Wwy%(;4QhW9#s)%2V&@4wrzh}vYj`d$;5~8<*y{{Dq)OXq zJEhw3joAs=t%9?47JVu#>g)AWG{=iPI&+p{Azmpr;JGt?|PHxQa zYxC9X_RH)tO1krG@t3>SU@3ZkM`6h*xag6B6rT-8LS0xWl3uiMKde)yUd^wlm6@6_ zmTa^v`B0sJPZNPs8z!7&vf@)%do700o`X=!Yv=xG6ksyoQCnQ${iXB^dI07+!qX|U zI+hLBV(M612}&1#LTMRIx7T=mMZazhYZcZA8^6QgT8{Ni75oMNQbwE#qGI7mh?Ms_XgEFt;%n6NI z3c67qw7E!kY~-PtSFdV$2+3h9tqFpldviBkjGcjt&HZ|Py5``FSHcBPXiez85U*+R zUNbVUXc05wW`0|lPEyY^-*i$>Db-HwUhb9ZYy5r8*~hfoNE^}RNW_3qmWaZjh%K>j zpPP;}C=oftFrCy3OfIh&2GZ`36^6u+yoG4w$@kySVs4vBg;(CB?e3|S|hT zb4>&Pc%qEs0^7e;pa<354uTXu{!hDj2(Rh69gBM~{O>w0Snl6*d*4g${kL)naLmd5 zN3?Wv@>I#mBpKRkGHs2XYFYLGxn(?cH_w78UL@|tDUxY|Iht$Yn8{YrznLU=(Qyx- zzpI&@O52r^n^Yx|8ue{#vROr{MD+*S?cUQB-aV)zw8C*u^7++CP)v{x|CSO(mE%$6 zorKm>-k==TTqG70fyaQ~9a!?aa?#b!? zVWah4R*fQ|Y0**7)GNWAqeL%dY8$zNdPqxF!8Bu|(em}I{`poHRx9+-ZpDnHmexwD z*@V>yKC{~}qOYYjp{*Zm)QIg!BSr;gbD;TbCM;0mu?^0S+m_bBxke9GWBk-^%Zm1v z)>OLHg4GT_vs*FZ!=<&6YJ6ZdK@aUV%$Ra%jTqJgJ~>dbqbN$3^`uh~FpF0IW;Whui0?zV8glqXC`XPPvj3_OWOUfp0aH*Uu73WHcL0K4z$=4n!GK&!?ML*QhR4|@) zdzu@LZf#lT>~v2g2p|T?>Eol(#f48|5rrL(^(X3(zsFY2(wuT7j4-vdbkDQWIc%v~ zx_Tbi_BkF3ut-5a&*jiSI(!qnmYX7c?DyV$dOe2UpYyNfJiIAv1+PVOZ+s1K0tXws zh90Y_*czJG@)SA81qxIC46s^AL#qczoLXiYZegODpw|nGaQ}AWI2mj?x7MjC{r;)eIr~$VSF#P13ByXBXwV5$*)vA z!2@h^m^V)S=3^K%TCERIk?f3AENbC0hY_tP1w}tfBAHxobnD_RnErPZ+`-T9M&y;C zT&dR9>gyYuFMXflxJJ$L_)g)ttFafn2-b>0rLM5ZNUPN6E)-_e!7t6zw;*ESX`&^Y zGlDHFVXW34qfbBfKIeao3KX_T3i8QXiX^qkWjKYkkuRuF3$D~9mrOxVthZB3hO8(H zEEdk_G2&T>Cga>VPL;_aEn+})v7cV_f{-h;fl|mjCx+Tjb>EA1?rd7O}r&1P1&OLQL5_t@y(K zi*tZ`enCd9J8NnlY*&K~$|)5>pTvLthELCn5Tt zgy?$`qVGwF<|ZLh7YmAe1o}on1W;8uC~+E8JRvfl7NCyx*|MSp(m-;CgCu=Rdwjw+@^rmzTW9k!MFb0Iz1q* z=sMKZ;K2$$NFP+cdmTei~lU(;K;g)hTPV~WLt z)LJ5Oy{aU>&uJ<8(lwgNQs<^uS2f^sI((v3SSMWk2)4wNMab2vxwk0I8nuJ7pU;?X zNwN#0ITOtUY&E|K6QDGoidqy!6Q z@-{B04eMj}G1}H)2fN_CJ4btTjsha8Th~dBwPW;*B_E|gT3vRf9_vTSM7iWw#t*A7 z0=_KWecRsMZ#51Mjz6|fj!|!L*4!=T%Eg?$kruIc4#z?rQ85A5-tp(|NY@vr+1 zEV)CQ=#uO%4VL6$1}J0WE_xVXA}ILXKHLA*M3&mji$R1Y&@(egEMi@{8i&Wa# zKVw`Dm8}Nvp&KN!>EhdN<5fW_rU_d7{ipJ088Ht-@Fqkab&q%ay%>PR-JkZqgv9`O za)&=r37xEmw6B3}L1rpu6%6l730A%|&P&UpCD-~br-GK!w~Nti*z>^#(8{8X4LXMS z7Y2oYEK8Cu^wE02hp#88QpD6b@QudgB&LC9Xu>Fmi?-tO zbFdZP{$w-MV>Wxht7Ukj6u4vYDlhSiFhx22Xv>O5isLj#LBlj1AMkW0Qp(5xaS|44 zG*p+lqUE+?`J+L>Vjzi#1|glgWRvVaPaS#zg8-}-xS;HcytYsdZ#>{<&jPC@O`(cr z&F1U|#%=>@dbNL1Y}uJ16l3vhL}pTK=5x^!7y6$|=6Sqexic{}Rn%1v*`hFJWM4h7 zumF2FE%VaAAm;IMtYna&mH(Ek^K3i#pOi{ZvR)+RX&B1uVgKlt#({aal)!3S;jG5Qj~92UTk9hQRbiyj7)8z(iFTZZNwmdDRW z<5xCZ4kBzp*ElgQoiuLwen+j*5t^9TW8r>T=HA?lxs+88$)r3S6MG29F>YfZ4p#r$ z0cN{4qmL4iaFkezxCsZXTh5AWTS8=AKHT?bNpx#PMTLVft`r@lmK`tq)928O3yMWf z>7kS@2jj`P?9PwIF9c(ZH_87HZ1Mu;3rUsox|?``K)mUmDO|ZmVxh%91&N$fS3wBV+fmCM*QiBM$MJUTvX9x`0b0jz4I*#knFPCBqf zj4py(VRu851RJ8pz97^&T*~DygjjJgDZ>^^pIZvb^*kcQ{2;uT;!RX!czj9f`X6pu z*+1w35}%@W)y^U(Q5IenQ?BDIdf1c6RK7^R@hd(5^YO1_wfWU)<7jtn^NG%V zOiywVjI3upr^f^DU9aHpm)k4PGwu>w z$mt$sZ}@)wJw8n6@#x0a=h)K(L@v_)ypBJ?rnDO(Gnad74>xKXUETd2s2-h)Q#Oevc^Rwzi@`rK7R76)EJd5Yf;5ycV^+ad)89)$Va96Kj@aZj zMY(fKS8Uoug_=O7cT0B9Mi|mbXc}3XD0~IQZ^pT4WS+ZB5a>J8tCv%(pZm3%fUn4ZZU!jai=1EnYQ1PX4JQe*j?Tp}QXZE#? z_Dyh11>w6h$m6{Upvf9?@0{;LbIbU48D5(MXRHhe43?M0*RWE0d0Ph@tax9r9x1Nw)?vd)*Tafr`BJH!Or^_X%m%jQ@BeGz0ZLlB zg-7U74v8VfSD%R7Lw+!ASbGR656B-UtT%j>yw>yzGql(y#t0(_!@w6Ji=HQ-N%-h2 ziC6g_dxcLh*zF&CpV1rBrC9rkAQ!!Ygj(2xITf#sG=-wkAIsIRZYz>LRS-8>SUP3N z2}oshc;EgQj4sB;1o{KYTKEqyW0P$goJ~Gjh_x{;ZJ4Hh-NV8Dfpz}z+G!OYsY(Wu zT6rT2ppsT$?D`9c-P;_vk^8TT{lh6{@~;GFNHmlRa4tYmGAqnVW|);MFqurV^;DJ3 z4mVS8Rap;%PXMo0OZl^A_X*(RW#?lzi$^zZ4WbHN}(A>i2%_1zJ zC-T;2B}4f~-sk48S+SMP9fz~AWgU0cG2eUV18|G(d}4>QS*(dJ-sb%Hk~;>x%LA8! zy{xc>pOG8jmrs(Uwu2?*vX1&+f|hf$bAAq@&S0vB zpAJZ}%vX}~=64$z)*o)4O(g5<$i?tcG4PSQ4>Bqm8D`%;FB$P+?6SI0`W|TF;UV_5uw}{wDFWP!%pxfLo)r+UtCWQwi&SZ zAkJ-BuV(%BS}wQDtvjYI%h(q$pk>iNb5=#9B^heT(|9`yRj0*ec5ZwtF0&1euWyf) zeg%5d3ophU3hA{p4WsE;*s3ojmxd|ts^a)%wLio_7~SwE*og->O9l->uknE7C}}Y8 zpk8w{05q=23w#C7*ci02d)Pi~x0+`KT)yRk0T^ha#1sEez}_ z!`V%q?bmcAW-1&7CKZz8vsO{jAydc2V-raK=eCJ;i7c;Si8gp)MB@Y+_)Nl<(6tGQ z!?4Y&6GErA%*#}kxNjdVBDv{&9rQ24ImBTp?TxYUvR`=vP}&4WqI*u?1iU%u^FUW- z&=|5!ftcG!($L9rKil}7n}`G?D4(W9(V@UEfRk8b7IseOqsMC0iz8sU{R!Xur(?*y zP4VEzfRzz18fZqWSWPHwIAF50m%b4DXB1x)39weevnRo8n~ zhRyP6Y`08k+e^VKnu71wp&0HiIv{iOGN8`96;0~B0JZ?)80y3Erdoa&+7h~BuQX_? zJDLsWiJQ*tu&3t;sZB0k3@_`llYk$Dws_<75R}}m!jJf1o&08Bfj4$0cRIobl}N-L zP2i|IMR|Sze4QQFUa42|a&vh)AnlZXAtyb6YF7E1QLoL%mK*xR3K%#Q_4>WhQ2Hl{ zZweEV@@-=SSJ}_K(3B^8r=?zYB{Scm4pl0D^$-;dF?c@&McG;r3m|-yZxB;Xx5C=V z{A?KYFEI}Y%II*&zH6O|7|^T(Rb@i1n-*JPGzK zoNr20mYi4(nTrR>{p^640f+;;ZJv669d)JYpCErFsX)UR+BS8oy;5J`tJHq-m40DR zzaU(1Iw_LvP16%JWw#7W41(s>QNrbdKFxE8N-lw?oQa6iUr`nuLmMO11;yZ*0h>PA z?jJ(g61FM0O{iBaU!7`*0*+Ml7)RncNZ{AnHNnf`8XtZI#57E4!{({~BIYDJ{Xp)5 zeSZW7gJ2SPjAwVfH>+_fFUD=0$_p_Zr*1Z$gOwI$JHAR8IFGMd7Ututm&|`m=^)O6 z%(q@HL@O-=2N8fh(tgqn#xUnsIq3;rV&+^+2cV zG;d?C2j=~229%oDmH$wU=F|YHb(xeoDMxWO@Rd0OiV_AC-FrZl`wYmx$lo`AlZ#wb zvm}N^4pjGCmF8`omhTh-%JKE-h=SgtdO2n;O{=e*p|ok;P+iMj!EC@wUggyFLPCs} z!a#tq(zzO36#A#Hx6^xRU+#eoKy;&YjMszSakbxc*6u_8)*nJmF$?4Au%L* zQSIE?{*SN6qSfH8r^ursi@D|V+~ri-76)G_JW4IhS)tjek}jXo!iQ0d zxYSf+S?nbC*n7w9@36SD&D392*6MD)?_3(AZIk_|VA&td?|i~7apDNnwQAO37!?x7 z;#~IHqq1KvG`^%8P5;$Gg{Xp(hnCJ$@q4$v6%On*%rvhx#O{KTJ?~u z=Lw^7_bmS?g%4@$^3*>@wOzRbOlJU8Hr`49ewWx)&#kM!mvo7lX$nM1FYb*?RE>E3 za3NYsyg2m_z_?V*Gz_b}cQDp{ryh>^c;Ny0ZZng|!?%5zha-z8k47}_42GXBG?s)r z#su1u_j1|jOPBTz#Jv~PgK^$0G$8vHFw3Zf8ZOhAR9S08agR(PE%7;gf!_NSe*S)o zvs|WrtFl(V;|^B$?RU~SF=^)$C!~xUpDJzj-eCQCP-mqbz04(D_D9uY`nDm@?)zd9&RpaIO1*MXrz4TrI!RjFpC^$(T#+Y#PJ;A z&NCKQ{PT4;Rm__&<*6PkkN&>8t#zA9kjdtYWV#XQJek}`q5zdee$owTcP`zOBjD^} zfEDzp2{0tGll7@H4KMGuv`rml!44zLV&V8z1tOBbRY-yOD3D8k%8pe8E~f&I*@4F5 zbRiJU? za@;FZ@LR;qtS?;Jk`$`5spq{B2>E&vPJO)^;+Y__p~AGnK=1{|DfNlG!#2@5%Bnuq zFLWmMUJAd%wiH`k{V&vVUs(u`u12##kJzHICUMz`8FYM+mxH(AWq%m_7%d6X(Dzuv zC_{2HS%pX^__4R7i0G9G(e+nVy$q-3y^z3fe<~+8|4hzqAzmh&YPG(0eiPHJZrJ2h zCs=36*E+_LqKNy0V6RsJ<=Hb0Qr~gyb7Wr(9FGZkHAl?dgg3A_^2*ms0xAaOVvyW! zte$FgUPXhlI7*HARe@7it`?E1i)daBI()uZ0~&{}<(5H|mVxk7%j`#CQ}7JFe>Rs< z;9l#g`%4vHKDqeMO>KLf(-&v5RTbmw8#XKG!QP6j{Xrya$a%bTpYT<^CK1WnpP7yG zS2?Nh&A`3frLhk?dashf%U7l=w*l=%-O<3fGklsCYd2x{bGj(AfLOh9-|!IJr>fi5 zi)T!4&O=FcmZ2psHW~Yu#!WJy*q(30=U>9$a)i;@(C=sv-cS@;Cs6xS6JrFL8paD& zbh^InbFAFCTfNNI?MI=#=f_dVqjW~j59P?6$Iqb%qp!c$42y>vvDPNwi|Ge}h42q)J#mBQGNYKcxgU zj(=!~P_xsicV%ZLQ*T>(nr$;mXIUaIx8|*oeUrx z+L#d?nMVrQ@#W%bp;euXDho-RCVaf^E10UmM%VFsy&BBJqT`N)bA>0}+1NB| z8`{i>28)a+#(~Y_n)1akBuLx)lSW6Nls7YwS(y;)oB9~DA{Nc2@6l?`c;*wxV zw?W0+76A4NuX}u53|NsRqDpg>bj=L@$TVuQBV?ZG)3MGFDo80?Iypn|X=M_;9u9|Z zKEuZ^pPxttC8rO#>GX&B&g8ON4B+<{E3pthwp3foSme{^nC34{|0uL`d~t+04kO=t z!pkeO_0bpwd-(_`Ae;=fh2<2w;;7w#U0+T*H>P&fi3{aKnv&Qxx@IcB#AwV%)JyY$ z(Iz}5^pwp=-Wj4pQEr30nSB5%skb6xQl7B^ur9+Xd^V;GmfU3P%Tj@K^3CHtnLQD< zsqR%ED#{#(D78JGJl`@m%P8u0h8KCpDK22#X`Y!_A$B1(-;JKaiEzr^z z7(t^`gf4atLZj=)iXU_yG4AOX-BUdq+FMT-7b)sgX>T9p>cGz8s^EU|vcTS|4N&!3 ze9#Qi?Rj$QLyCTgrA=!PeqhiC6V!`seKnv7%D5mX7lR56qBVs{=}dYQ3Ji+_hRcOl z3&Sd#ur7VDOivSQ=_;R-jIC9;wNt(~7VY$3R8rWvjX8^%BBAwopb;kRfiDO$3i3bJ zOVx`Xe=OKkM=kWuMnGPGaSPwiTTB<8HAmU;5r++)|%a8B+q zRU$F>m@bi)dn^WLvD{;-`l7kV*2>kC++%wD`X=yu?y>K=$G+zt`<{C&L+&xnm9pg? zqw+=i{XO^C_uOOumbu3$!b5-D84y27PDz9plT?->PUy35?7*gtLgabQ42GLM7Op&n z146>GDXXY&5+rn@tx?ADxPqHqnd_NEgp&;^FWXUp~A0QToqn}gd`2wxS*x$n#*>r zkWAQN0QqSXr{IsE{I!gS>96QeQ2yFE$KTzWX>d{gTCL&J$~ykuTr1L(;LkLEEO;)o zBf_cMVLSLaw7+KYr*#oXfyYPzBT7ctrG)q|1k2EudMcZmapSd$SYY(iRa1ypIw*z@ zz7_xCSx~Ll=TP86BNR4WJa2`Eja0`u$Mg*2J1>x;pb=$GW;Jb&DmiTdQ*FA-5fT5? zb~s8|2&tB!4_GBEl_<%^plkJvG^8Hs$5c1z!XWD<2j~(jE3g}|A3u|`qC_*Iy@E|V z9Nk7OyuV8V+!DIX1m41e1hP!ky2ZP`X;22!qwSt^+mB7H{a(dR_`{f-zDAjL%>2Se z&|arHwpNd=AYEBMlrDTS;fZfSjeHMd;FEp)jG%9lB-#SaE_w~BQSE9vinn0wRgdCA z=&tDgqfEBBSOa^p5`LTcQ7P7vAAWrCbn;6U~Z$%Xzu^AF?bRIe>e4h6jSec z=rutvYRK)v))Z^a-2!IW*{rKACh-4XCwDlhknXX~2;}m%Irn#~SlPy3%qmux4SctX z{caWe-75Cq-zrv{v3@sU{TG|C)>lj2FL+%!nuN-Pb+s3MSsl(Wy>(JqG(sf&~P{S zf!bPy-|+8m{fi-nuWh&AH+Byxki-5_`(3+D_~NnBH2($1%9FHOsjT9}ZHS3mbevwJ z>uRM~0ic@J>A{9Xg|LYW7}n15(cb>g?cM#Iv-aNpK{J;te=S4T%H^b@l+JbU^!Tv- z{_QT7UP~+eo`N;*woi^v&#>?&6@K9_%mZue?w+=wY^5v!{Gs(G4!?KKa+$YT`O-JUwfb6dt^QIEajm{lTw8xBhe$Nn2EGoWRUp5D zkOU(|)8a77<4s_&%tLEmQB>6;RAhZ1cO?8eE{c!K%TO`W1@IPcSw=~F5x~F17ANNw zVc{P78-1bg)9rgxzN@nekj3EaMgokim$IwycYrr^39tQ?X+*=edRcg-)?e_U)s(C6 zWWW7O^R%^pd=$J1DoL28vzp3~;~jOvjx(5|ZucU|E5s}zc8+RliMn^|iNWyfKDFfC zM^z_B5~>CpHf-B3x60+@4QQ=aF0R$;2GQb!HN~8SO~vw9nVjLXKgH_!6B!4ESLet* zyGO0|!SV6?4<};DiPQHB3^1%N9=fwho9t8tndbD9l1ThA?tsh}l~gISh|WPLjN**4 z1um>Fum__qW=4u8U)sH4lz*ncfb`hDrbWGkAE({%lBT_90;a(#;xA1`QYcWneA43A z6wwH?!6YzL$(0C)WPOYZG6#)n%fTPIp<%=SFP*`Rjr*-oNK_hsuKMAmGwEL4aZbV| zS%NO|mtG}MdiM%>Z+kZF50Z)9DwHH=xrNqzB=3c^5Y<}{NMxm&YeBWPRjF*%tI334 zDQ-Nv+*M*Y_moDg!KBJxHCHatzgAhoC~iEup!L{;Thjxp2jw*}Unv8dOS5eba~hSx zX$ImoO8b5JQc73nkh2H2$G@+h;NO=7ijEcnMET`bePavwG=SLj6F3N5Ym&sDhyy$s zAp|?`PzY>)INLu^vAf&Amr&@0U9@rf8%h;RN8zoG0)9((GqWK(M+Ln;Ird=C)zL*T z9)b9GKF~>Y$gk`7;qO2#c)!ZNZkS%_JPg84)F0dhm$MMgzP(a#G6<1(b+1P3dN#ru z3Q~!ov_ih@9DQN&5P%J#%q26yt8g&Jei01R?{|XB(Ws|^EM>#N(eatcfVvBtf{a~G z$|6o#Dj?As1N^Gv%)c>y9~m_Xt5lxqOZ{Qu+BC`}$x%+34evViz*%fpF#wQ4qcOV- zsxO1e+E%r^RZBU}Zx$;xElO<`Yl;mwcG@SW#~=WFe9zx@-ZgjLx8F4zyCAyeqq_(g zaOtXGzTEq8wA0FufK$V}fQtm(0n8$OpH41NQ5$@TSdoPyNN+d@KHy|eI^Am+(cj@2 zz-yfT+(xI;{3rS1Gs-ic0_YxIqOHisf&F8GqJ^f&wR;tIuVJMzoSoCg&ijM?x9!&H z&h`%o5d@Ua*dfx6E`9yMEU^S64zIrc^D7#Hp%kRv9>4v6t?i{HdiV+@q-8DuW7uu( z?H@JsEKZ^HFDr2g5TD5QZlxD2S*@+g0W7^D6FDJvSzS)5L1i!cb^{k~0~ejB+mEKD zu4p0Hdc|%n+!FNtum$*UoF3&r?MQ4!quHbz()tnJow)EVz@H0d`})m?x4ZkN+p?1} z1Rm_S&eYpg#AvB?rZE~uoi0-a0BW7(%@zy(7u2BtooEkV0_k%2&YkvY^XKNTOuz6H zh?0K?js0Iyt34aeq8XeeVZh|@+n)maLnD6l3y$t?&f#2(F4&_1$Q_uBZ_poJ)7^x3 z)zx0YiA68F^;%IMy5HCF=D&T|c;7^AN*-hzz{=?S9|h0L?f}i0aCVZ*z)8X`^1@d{ zkx*K5vtfU_f;1&w0^*K8oSl3)OXj2ayFD3qlNF%4L=q3RN_ZuiI1CT}TubDiy1GXh zx{)H1*Vcf48VVG8pwFUc8jD9wq3r2ip$@&)?o2Mt&v-(`Yd$#pf9=7Jrr+dQfAB&A zxD2O;B81@3QB?(-4m#t0TbO~oQg0kx2)%H1Ao%c4{N?o7(`5V+)-y&BFOX*iPhevL z6&^5vAaMZr#?Xx5UhmgrRcjTHZ48ZN6_!}FzLqc%&_Te&mxwxGesQM4d^Kk-cqr*} z5gW=2>6dC~o6M)y?C_Me7o9ONMCVcZjEUjWjG1cIAfH#mD^x3$YQZUhS}nVfSz_n3 z**I&0Sh0V!vwzY!uu4`6{+ZpV7pof^#>~E~6{|1R5>uDgilCOoXGQh3c7-QT_M_E2 zLk+a*N6qR8oLLJRF!@~fy9_xBr>Ku}A!}VUW1?$PvzM&-uuBQnxHh*`DvPyY(IF9~%?hyD`qtXoR((F3We|(8+LzUh;>(($ zj;9A3RZAVuSCGNk>4zrH_n*9A(>c?xyQjhOSJapJc-=DWgkzkxKa@%yHFXFJCpFI% zpJAz$H^zb|gH%$mi9Y4`8V9XrL235?jKQ;6wGEkFP8Wv>EW-w5vi$7uKbw);hzQoL1XUCuY?v3q~=ztiC?WG*EF z_~2Ql29Z0mmLTu|dgABd;w}e<3mZabkSrm`3ML84zJgvwb|OUL=g5?Unh={S$T09vhBQX;%pac-4+dn2JD)|Ehg;`I{-UAAfK@m3B;5uLqW(DuYAl zLS{Tpg$LU5IM6%>J?oEa&_fM&2k4qf&S5DxPqC7T*H6BZ-fP!nn4Tl=X0pmK2F9~^ z(~iD>vBeu7PwIu#=D*kKO&DF>vwSy_N9LPHI5^kTOq%vWI;_-y!tr2~1No%g-Z|cF z?lh0iny2k{0S09SkD7F&K4uwO`d7~45}okqT3U`l1Xz0=O?&-O>FNzlEe}|p8vddK zo;R^s2J2n5^>VSYUY7GM>{h%g3vH$ou<40yd%}XvQx=>YW2QDmBkWC-Ns@SfHHye9 zb@^)Sz9QK8Dw=#z?@$oD=viO;F$1Uz*e}Sqs^4W}flqHg?6vm)^K+5f`*hg&_1$sn z?5J_rJZK)l)8#HX#V`5NRVS`I9m5nHI<-GlDwWgbe|*?KZSJ;D8mEoJR*<*MQ%;+WgTvsT0p2U( z6nJb`TFuj6nx{!+-cupAE-YZXa;7LE2+ts#zYPnSXKt6sgg^G|4<2IN>qf%V&Noz$ zyn+P9yfV=v`g^$FYV9BWO#K#(Fr`-4*GNOA?Vs*})`}0Wh2-*8r+fmc=ioX4c+Cr( zY>*1h3_Z;_M-@uH9vk$tXV_7Il@UzU2d0VvVHix14NT1krp7+g{{pJl3h-{1%o4|cV9YGm-460D9~2%w5>c#)5rci(*cBw$MqVZGaXFfff-bu=8mmG1i3B2W!82yW zI#vOG*KQ8Pr%Ms^_M&rx<_g;|yp=asWKM@FcvX;0H48H0mWqe)Oab7A)C&zpxndYS zP&IsAp@_}Uk?Cj{<@2+4bOjFpqK#y>8e{`y4MhIEK*+oP>-H_HAAI{#jcbl!V)8pT)p5SlFByX}%t3*NcaDXWTLm;}*o&8>m{uh2` z#J1q95I1BAZz*wZ5G1iB`((%}ld#v8zV5EX0uzVt5sVj6o7G}{)41ndFRvBXE0udA zD!4bMV(Z^QmHx?su^7;SJ{H=L;zeF1+trwg19j(+O%rJp&!UdBi_g_bdZ6E1F=@bx z-xk-_(zKJ6%3oGJX^iS#I?BI-uIfHxNLE_G&+E%5nvA=vWQFxcC}H*T|I1HeJ?@PO z1p4nYf%E#m$mDtXdu_8=U#l1!AwJkxGZbvbc5)rwMV$f2z~V!ZFNLqa3`gQhRq#!5 z*lq3~{n9uvEE9|?fAuYkA7P5~py1@L?_i?Cpb*$&{(^BQLBj~bV}c^=>pXACj6%7T z@*u6@w5LMOLf{#KP{Blh z2Twu2FI^HukF@YIle9okJaR%kC7QwJ%VPDVA)e!dTKT2Vsx1F(A{=^!U72q+@?(c= zfojnQn#9l-7?Uz?W`;#*dUp=?f$;~+So)P<3^~F7Jq=EnqOgz~e-pcFp6;>tZ2LmN z7Eu!J0@(>0a>sJ9m|!kPF-68EgYz4I6-D!B`-jcr4`-|*KS5)B3hgA;nOvZG5w+(9 z#(L4~R$^Qk;#kI*Pmme+rw)FpPt4gFr)h+r#mC1jnCN;JE0~x~F9mAc=`O|oCI)5E z+wpgj%@!A9r=ZiFcl*CI<4;f{Vmv)<93AYxH6H9A zwayv`2k_*Vdb{^lftSHewhLbOu5P%MmfyPkA8%nH;b4~+2tQ-Ib{R$7*1_GuHh86ci6dx zW6mIrj1|Byt7P?~)XvD{DZnyvlgUGze1 z{RES9_?vKxYiZr8<^{Ui8NMz85J;h)#q1}-mL0R!n07zC|%*zM-8C%es)*7oms zaQq<;-G!&Sg;mAa0e@Jq`71~s{z8&h+a)>JQL(Zq=jd@d9{l9GAO7_1$Ks{MjbdFJ zU?`i={GY}#~#JMU=YddQ58=-iP@zREy3MVelu_{thfz$t&(g5Zh`RFkiJaQ(!TslDQWGo zq*;FhLLAjzz`uVu7+r1!77+3NH2lH?kwCpr2`pFGzmZv{--na)a59R5dJ({Ia0C#9 zOI02$>q@JCEnTSxmp)_jmy6)>g@ebnzzdOaNQDo>$t6bDphz1XQm{~R?Zf>u1FHb4 zTB?<(O01EZJyF%I%Gy?K(`;m~|23G6N%{c}FcnQ$6NO2MVKNh%khD;Kxmv-C5rDr{ zE5kANHXL+CBNT`H>v1bMNruDcQUPmywM<%gjN7tdc2{Ko5M4t0I)y$eya?Fem}Y(K zpk67~|2n3~_hbf%dh*;7K%)%LuE+mhaj5gw>il7*?{TSat5%^j@!u?zy1`kHJfeSc zkW>qTyS-IYBh~%oE+MV4q+Q!pQsSlluTtn@Jx{Zezl&DUiYfZbUN**u99xq_et-3e zn%C>Bla$O)vZ!(0a!Fd;Sh*A>ZW2sS;IxfY`FV~CcRfvoTQ9pRTyf~R1~&YSRk-rW zLGxD=%*XevQHwfXLR8_lwwHduKd|)$^mS!$847)!88-^kv0z00Xc|%iNg2Or>4#1i zwSE_~VYe*`En(>Y$t(;+h@_PuCt6ai2Gk5TDw9^bCGg!vpF8XHWfD?L0j8t+8g}9D zrTBh{-?4j-6CQ}+1bZMh&4!(6IJhfP^*+?ZlyA4eEW+e7Tm!S5^(c}L>M=2!K`{uw zghRlUfCP1+Ls%MHy6ixg1^{+~sSwEuP$^N-&J^QXtpv*}%PXD!*X4qNB!R)+IU*_d z3ay4I4ih13QQbX-Ao8j1;l+2&{ddj%V`}aN`|EVSt3rNja$$g?>`Zu zM`@EBtuqGY|A1g?jVJZER{smiO!w=3x>44@hm0E^`TD7nm>Kx~o=-RpTzH zYI-uekSI9k8|TGREDFRDo3hCK5b;=*PXZHVWb?7Si~%*_8=x>J;<2#8Ehs{mk11T06@DR}@{LCLzDcu4kv+9vauzmd5W z#w(8vk;|C<%Pr%iw#OZc+AdA6j67KZ6xrh-nmZU*G%xMYjJW6t?L1MT#pFm}C&e_+ zXkoTv>}I~e`cQ0+oT<^`2ph_?xg{Un z+T1{}%zsUTPU#5*)D=WiX{^VSK}3dK6~tp0B`W$WU^2$WU;_LJVxJ zO40vmz*}@3|5V)f8_@jdRIz5U?!N>6VV4$ma zqG)y#iUZjN%=+_)Lr;su^Awz$B1=ziM?nWp->R+#ax|I>5ZDjZIMyZdQh2~q7kOL3 zD_wm&fsN=Zbr2l_OPHo!vN!5AAN0;c1<|NGm|@WDfZVyDfu+*b?G2`WD2;D1jU3W2 ze(o>nj<3p3;;*7GSZFeXxS4}u<&7#)2wntrFztIy?jCFHm46X@pfK$|@}s1# zVx}n_rCz)~Yu^~&FwXM+(a#`4?R171UKzPhBB4VQMSGzc3(#6~#UPGB1M%d%6ffaf zqZ}ZOIUxMj%n@3Srh=K_1C#Ob)0^lrg}M2RwN>o)z2gr@yUxS{IG8eP=f!qSlqYgA zh0sZek{zt5VR$R91-E$O0DL;5GNv)HyAsU;)o6iuR?d7L2&SomQjlK`rL!i*VedR_&&EB>i#6y(z$$Oy{6LJ`<7Ir^J1aCMCFs?gZ-V~R2o(p^ni~5oJX9DzuExVb>aoU@KWU_x5jPc=njPV zYl!!(?ho%GE2owRHQn*8XE-o|Dc%ExcXY@uin!=F4MMx=o2ME&z`U#*X?XA_)k#bR z1L$Am9lXg1+lAnt|8#JA&}f~tPd@I794%NvG=>PaiXI;Cw$YKq0|j59QEF=S_rDw+ zd+Ihm{Mv4uot^H#{czT7r9r@G;k%8qM$#~pR||lk7;~G|Vr^3ykv<|4|4*REtKlfG z71t_dGyYI)8J-=8CO9&~bU@kpC<+-Y2TIAl@0=nrNU7oi~V$LW$E^bppk%t}bq@^YgH!#DLgf03b!_*l6hVI)-Y z={8?xK^IToR&Y5V95iu7e@ndiNT|MEF4ouUrkZT6Sl1!q%`A|CPvNlt{D#uoM6(IS zfng^QnTS3LB8stsr}c}`qzea#=_t4v!EShGpZdjQfmlC*T^Mh4M-$R4k;>uxOMe6> z`T_&=v7b=Q;#P6Qd_lIE+GD zJz$=uQu*;8(pB(5JMj}vLWzVRsMM)f(3vPHm`V@MuGVRl`!4!`cGk0Ln?U8&21{H1 zvkvXw)-G8vVFn56%8j*`#ma`MUxja|!mMkRrSLt+E{KGzD{thdHoh`~Dkhwu4Q=Hq zm*^;c`4`ymd*U*8r$gDQgh%kIa`shv$R|4A1THuvwRUU&KbyJDC;!&I?}EU1a&tMD zR7nS;sKfnglXGI&#q7rFt&A8zlab3U%a87R5`zG4cxS!gS~V3{B6`$^*&iNK-tX#jz=mXI3*+? zoC+w_F9!d3UN`X6qC-9?PR{2$l>K30 z-Sklx+b7OgEysAD1^W$@AlObMgKF8)Kjk$W!WCt+Azm*gH!7GN7Fl-$wCRB1l+>op z&xIGanqJd`TRki&ZJpZX4SqcxI6L%q(he=Wu=}*->PjMC@#}cI!Qa*L_Egx4S0HU# zE}Bk;sN^+9rQFm_IFg8fPl%c#ZkKcnC#;z@SSE<+Hu>H|VTET+3m{6QCdmG6CoUdn z>bec(?SjFwfz(h%3|ruCvjsb~zB;%S0)qwxCE7c0ciN|okBPgpyX}(N6<82XY5HbM zAeu)zC}g!|Q#+?S#bBkv|38yFQjn;Hg5*A2_u9RXEQxep@(c%0Ap$U`pjzC6A}fEB zyMT;Ej2L?1jtG$V%0E*d!{=W@-1_;-NK+l&nTS(0&Co4O+0A%xhnkfMX63p8>B17j zurv}`a1bA#9lM*ajJXLWKUM@B?Yw0wPjt`rM$*aZSTs9PkeI<3m z7>~(+A3PlW?g67Q#Fs?|U13sbzHGzgaY1WHjoY_8L{L%(KjqIwlO=(gQx0(UOPxeVa6HdSw(i8^tje5L_`^ql zXR_gFa21q{<>5MMr;&8 zyI8OmoZn3edk92ebu^p81{u)4UgB4)vPXo|e=tt}0XVh!#cEK6#|p97W#TWxPu0(g zD-2~aO|VvQ%H?DH=+i%zt5}sFya`?gf9H>I*e?S! zd){~s;_LJBbNGzU=RkTDtZ#nq!^;84<{3+!OqBWXhVUMr&t(A1OPWbOv%B^MlbXOz!aR9Fw!dtcIQL70q;kS?lejGww_{tvk=T zu&C=x5PhbS^4D?)Mht&0f(a^eTzWtX?c+Y-tS^HCQc1=nmz>Lw2{6t@j2xa(m(ZG} z{Iyo*Q-l;{6Ck|7qAv^TXp>TOWgF&L5yzj#9v82WJhi?J&xtu_0hGIv9e2*8BvrzW z4(EpAgMY{)wxoP5oIca^X?n*nkNJcw9r;(v`l;7z;hhBzS>{u1lOrC*CD3gATFrA@ z8dCF07BBJlYC1jdji6)_cp@QZ@1Mm_;@z`e$9rc>n?71HH4e$a|IDo43kMkFexv_+PU=kX-Qd(Fdv)Jbfy_pn8pw+v`uZ(X$Kw z!SkCt%qWD<{9~db_}X}oAsCVhiu5AT0gO&}%y34hI~eL{fsje`&a7VuR(AJ~v=KDh zaFK1+kEL$l6z12hGx&}!N!!1ZAjIZrrBRN)j(Lpo>tu$;s-ql#<8-C;nqd)`+z)wl zN;+*8BrFv@hO4Rf5_r;kZY}ApZe5iSBRbuoURZ-&m7VEIF!pQNmxR~cm2S@eR(GY# zT>uWeG8^{4Zf(&=cr!Zx2g)E6e_p=gFY;xE^?llG>>f53T-sboWyXGlRm~8Ix8Z`W zmXWtr>svK6ym|R@{(`QQYjQ=e-17(55%%Z6Soz2fF!&MqUeE=d2%lm^OL@P$^RQN* zpz;9DRu+ z^n(Gh{{PK}ArRa2sz^3(B`$_oQr5yFVAav+CS+%aC^+v#P*EQ3`aOA+8&5`EI1EB{ zvW%b1hC@0+N2QL#@IVf%vP*|GH)pC8c zx`{@h=q9&Gf)Gk1M5>9UL87Q^Ro6u6D#Nyx9=BF|SuWOI3hyfhiI3LG>v9>&AL)y; z1T!}njjquf8+Of3aMU3??m@6WjAn3T>dLc~u#^v!7)RC#hHnmPTzJ(P+7NBFa3Pe? za$>{@&0ezX^nf=PSaO7B4kOyZO;8vRm`DhxknIU(a6VLK1g0uQNt@#KZaUGX**}Nf zQIwaAgz~=w>E&6~&p&^7PzEp@Ojst*0u9i75C{VfRoIlkC!FGA)}4+fq@c!#dckZs?Mx;i`vf3F=-KKlnylib z!2mXvu3{X;YH0)2Nm%uktW{*M$&I8J@2>{r!g&tW7}Uh*b!T!pyTKz~DKpn)W|@VN zXXU+${eDE=p=$@{z}<1?0IqDKNXQ`S7q~#4H;kr8>$pyK5|MJnZmw7E2R+AJqlkFVy6U0&#H&!=U~UzT6NeDh0uB5;KCPS)+3=DOEKoxlaVra&E{7F?v*1Kt`8FC^hE)fMey^JdFYha9%}0*-vOkoDt` zd;OklQcah2hCw&Blg8OQL6xl$G9|2O&a`h7MF02#c^Xf+eq>I)=P{B1)bhRP7lfM` zAw;2x*CcKWP!IQoEyavJQR>v_v*1&|9e+42aeC8ji&+M*DU;V5^O5Q273)oM-9N1* zjBB*T)EWsdPeFfD!Y#!|avpX&(kjm$5xpi! z${h@oCcQ#SLAt+1AqS3>M61AeZm&kp2>TJmbm_8pmqdywYAZ4A!o?1`4fML_qc+ z;7|@)Yo~w@XYU$E?_1^*dJ0PiElK*WvnXs6X+Z_r5}P9=1M!Ph=y z=7TK}KStIu0_HHC;^g06;7JBLwHHoq`hyNLLpnC{jXm`iw~d|@a!U#4$Qk-RV??5b zlx4nJ57djYKwQl5+G!jeAMNin4%(PrTLf^zn;t&w&>0Jb2>=lh*)nT@9U0FKK-0=HdBRG%9+!gh zSl5hdg^{`Pryq{anys@UoD;B&{9A|>JZYXD6vyFYK)=L$HX++N$XTJeuqX!O!h*p{ z2cC#l@S$jcpF>p)3blkv|D`1rw=2l)9=EZ=HtdNa9+wUW#IFhgBL{w?$0HhY?HnAP zA-L1V>2Kn(2-svl#Imi^U*bhEWR(37V-Go%F=&(hsMRta{K6iXI^vZK?8HU(o2`2V z8R}(L$M+W2zi;@siUlUlNowUs<0R119PZ(i@I*|Cm#8@$A_0aQ_;YQmvgY$Ob*ekT zk;>)t;7Iji)kI3YSW^-IJ;Bui3a%D#aJ3gi5*%dP#dJ2@8$AR$!cJVPT$D(_!EdJzK#PD`BV)jAOw#c;8O}pj29QsW3(=Z3Is+o7%cOpGeCB7hnH!@ zHeLid=m{q~$nTtd1h&Vh{1#1~H+hhB=tYt-)e*6USmzV_3y`Pz;7<*V(X;`Ib7R&{AVq&jsBVO@Q> zRjwqHaD5%a%P11Yuj{cmL$9N0uRn5P485i(5B%^6DX>s~<(;4>FKl;KDA<_|rfr}b zGA^b3f7+PbDr=U(m%=BNoJDk)peK|tuWh+$AkV?hDsGM^oD4#z$thQ z2UuuJ<`mAw@BzJ8Hv1Ycp)tEsc@?ZKi?1AA1Mkd9MXBzS3p7>Kgks zW0X))XmvUGctz*gTeR(^6UN{1C^BHzDOuMKk6%N`MOEy4}Zbf5&3CV!OA%=p}a7EdZ zV~{H}G^Cw&GJ?Gwx44d?IQ&9KW(h-q=Tkg&sifbp%8z7H6`KtmX2?rgcwJVog1#Uq z;e^5#Mh=}h)-j#}Y~kf!)jGvsp6!ndanmhfBpe$`(L?p_GsE(hePUc7pM2#lOR%{^ zOI&~6rSLCelXJKBIGOKX0NK%|E=UCl5hX#o6jWifNN0*%69X9!qiNVNsT0**&}*z7 zTf+s1N|B&ULBTNB^5PS^)tim&Dz8j(f0{&|(j$#c+=V)K&P-56{KYYao|qS1UZjdq z{qcWoi}DFqYn9F7T2%$1$o(m}Yn(?&lp;)Q7{v73S0&y_c_pSlP3_QGya z(%fIUMJb5d8%o%JOSkwS5b?95e=29ZERKxf=~<6Sh7W221evRxjvto>odMCOS-_S{1{uD6lWk|;zY~X-Mjpu@i`6s@%l*{U`FCg$tdF_yaRN1`BwjU0s3 zGxP9Ed{=U0*)CqTX-MZZyq>2K83~eYt1)t^^eIRbzXS@pdhU|ax_TZhtjL)tyj2L5pC;YfX&#hpOc@&JevxXkXpX*tsF){0z>V{A)GnOr`l)dbhr%6cNRJ^2-tCmDv)>4(si%9 z^vZrg?mSD_N$jBemK=v%h>F#ZCnMw!6cB*hmmD5`YYr}{>R5+=IOgT z1~uFAOD0LyjCj_aglJO4?DxxXR0`y#ffrk0go^~9lh4x#_5fTA#XukZZ4k(|s5nWf z5*@HxkO~mE78Ib5FF;Q6Zlo_^-z*zi{Pl9JxL&bBG^tpisO!M%#oPQ*e>Z~O zW!h5{4l^_#@e@k|i?`>;idJLlF-XFU>A5H8Yguol?4tL-ma^e^?xiY^b}xlZU1AED z$>7GT$F~c3lG4QrxC!a}5aP+`YBirW->z-ddWm@kQuC}}Vu51<6WGUC z$b&)TU!-frdd1YgcZV0k1PWWFX2qkt6&LEMcq)Ra5pO{5TQTCJi3pD}a0&DW#FRFf zV-*AX({BA|L1|njpX4)i0@eFr5EvVA{=E!>_evh*a-5oqj(KKA$VVQHd9k6dHO!ac zWHOqx=~59oi+|O75p9&_Px6wd>M$)z%OelP#}_T+pNS6zvx3<1sM0_G$+d8B^8Uv; zbv>i+1uJx2_URE-6tBipUc4?f;jM@Lo-@Vvp3A+}dnJE&OFfln(>g0T5jsdIAW-8k z8zFhw+O@dFEdhoT7@JwdW1?_)e?2)qJ;O$FADbt^PZgm2*8Xnu z=nTVziX3o%E_oZ%_E9=gs*DyIR^i1?YwL5qRjZynta?kJB5C<&yKMG zy!xpw-ki11-V=m%eDEHdZJ#twTTOhnLC;`0vq4hh!`VB0yeS_yk9ONFAbvnAK7T2n z|J*!lH+B!-wFq*hY(C#PZSK<3iun{KzVYGU3~hK$@nzL~iP_A~n!ldmi#7Ab0r3HX zRyUuYpb-~6Ubh~9Z0{fOcz>#>u^sAxRW^->C#UY5d%TGK>M34G~Qe09C0|8|np`$h8mlkKWVsP4(Qtef4D=6wzK;Qdx87twod- z`QpSP*Pm)t`C`A-{@851N2;V6ijMd8fBkSm)C|A~^OfKplNr?r>9LOUnAM7?a5_z06jJ*!vD$LJ$LPpjtBy@L+` zPC&80En0>3n)w)c)afx%M}5tFfn$98VQ;T_igA?@=k+=<$P{xv+}EZT?b)>NPrP8g zPdHha?|lc0SpE39V(n$pxk6QTj}^64Gog+0%i>0*Zi?W8(eRRloG6-wc+d@Bp_YyA zxak==J@L8x4;}7(baBz1V)ZBtuMP2bIAu|obc+Otvqs@YdOPV)1tf8PMmE)Yci24C z)j88xglAz=@Ule&cYG~52>M2~QrxKOVD(CshE444A0YEGqt**W#-8x(3DD6>*xOC} z-Rp458f3bHFvM3L?nSQ{ zmH|KOIy&yR#t$H-)oi}Uz5lO{AMf(N{r|D|=lgBsxZ^1LxAVCVK|6^pIg+f^Yp1`F zCD~TuMUmtzo#~^Lq>@#!wp5kkczSZ)=f1#sg5Q0w3xH%5Ytt5IroVHn>4~K(5F|km z06`EmMi!<_iZ;O&hzJW@g@`u5L+}Lc?_B78)V|^&=J) zrl3||H|{N4A0D!cM)E!I$N0`-xzu+BqA?u~HS-=ILM?O>2C`&hjND`~u(ngO5%}*K zrN1I@{EH{E=^a0qZDFc4TTe|#9p_N?(CC=sok=HY+0$NcXJ{qwcpZ{N@^2E|TUdqu zy`xWTC*$W(>+*DtYw-kI7$243X}j%CpWQ(*LUVx?H^x1imH0WMJ8_B( zI^G%Jc>s;B4%E$_)^Rb{im)y?Ck!!pI7rlPIZ*tRp}<22>QbqclMq7=P(O~BMIZTB zHv9uCl*U!*jr0466(^H{IMD~QKrEvu;=fHzTp~Rd6G`BUDz}9G9A2a2%g?)f$DX3qKNR=J~CDphLDNG5?5w*q_&%sqpnUS(C_()ksv)vnO64+YM7fUhnuE2YSGyvnP< zuwtlHDs@~*gaQ|Qz}SdL;N1}5s|bp`+Eangnpc? ziv|YhT|YD~x+0-HBiVoza5VD)^u8B*_AJO8_@SFu(a_nn7kV}WW<6usIJ<6wwuu^_ zS6RH${ z*FTFZ^>@)N2?z*+M%fq!?UxYP%V^oN=cVEMMzPrVcv*^IF__AkFz^V{19)~OxVK%e zF!fS6co;bWJU<6qMGxSG2=Fk10{HGs@Ic%5eBhHgbFVKGBoW2hi2nFG?jY&Dlj(y+&`*~+2H z1MVNyYD0qhaTB5&MU>sXz*R1*l4w&%t^W0XoN}|kn0&=3H0sH z_`JdZ2gW?Ue`$#6;~tyu)ha9=4^UV(9$-H_9-uHg9w7gK@c@N+2UYzbA*cI7K!VP@ za4bRpT_GYaz+0YE1r``U%S_=gpFPaaSheR8$~Emdj1mwoonnbjJhpJ91oK3BQhfi0 zpPqD2gH|qa(<%1pwt!b|j*?x&bk2e%`GM7>^6q81inH~6JmzstdwIs0J6Z{-q7^~+i**5@Rt1< z=R*J{eWS_0QmEv0wcNtrXT?UVc-g47-d&v+n|Q!Hl%+Lml*%kKZT$s)Zu0uEg-qey z2c5#aLL_h!zfSHW=5YWnVls!p`46AZ#J9|}4j>^%-c`qDY)>SvlZ8X)_U?Wnx9_=8 z(b9&=&aE{aemeNmuMa2=6JD_^a@7>iWhB@-&|0{W(0lYL{bwr0FeXyuW9ph(&jzSQ z@#18l-B|4K@Fgs2n~ZP&Qq%>0U_vJ?tqXlg-s<waH_(m&RZm+CvfmVOoDOsw7JALfX{DY}KzrB? zj0yF9WDohl45IIWCuV0w`ied{_cA53{%)*0=-cD&eONbwIFiR#<&O!aC~sLvw`4uB zOe%Fz{19hXCr)!E0z44E&I4k?8cdZ%w|Xw|UC{Z&_oAgF1IUib=al?;g9eY$mjw5e z#6(F+qx&i6t!REpCpUOV}dL?hwl`jR=F(CGCSelOzReJ%!8gsM1DlThDL!z!$zB+5qLw)(7oAa zs1K3H6wM#z-SCnyrrgWs5_?%?sYwrV1(zws35u9|0O19rDwV)w`pp~AvhZ9840LPU zIsUUIGuZIH`WI1U$rpa?_rZSeQpcOLGj{2W9Xr=Oa;rW}4c43(c*Vr$EBf z4*8Tqe8q&H)oxOiElk2H?p$%(%tG7Dls5YdGtu%elJBSY6Z;uOYwTwViTzzg4*Uos z{2Z!lL-%f!R+bvSAiaG>*|vw~mTvPl;E%sV$hoC`(-UkPbht#-)?t0!;;Efs%_j?p z%gnW#5sW9lQbxq16dRYB)k_Qk<8In%wH~|^t?E>Ot;bVZ(>Bl|rQTEe7gM-5w#gxsyw}j-)+`8l z)CxmfLMxzSmq6d-?>?#%JIj0r{`>t9U6PvZ%hBOIMkwltM(>=db`i=#;^g7%rX?63 zc%?nEJa)1LI<+C)Cm@6f(sQTacp~#mcx!9n+ANVxcqOK0a@g6$(I{*g z-9&Dc(k>Bck(S8+6p}fw!;P9G8$8qnW-pqpeXaI zqCChX4l?Q0Z4=p8hXL?Gb}8#590l`PDnB6$IAhEb24UQYY?ztHh6}R>*zUw0(zK@s z*_px@LqB=E4z&-c!u!=5bQ7Q#61`EJ{lhsNCrtuSX7DZkm-9*`iBj~4{Q!_qCfUt` z@uZxgJjfm-4ho*6YGE@8MvW-l0zR=VpBQo+6W$ZS*s;*jDg;L>k)Bmd@d)^&k3448 zLI6Ut!nBs-HhaY8YfOj9mzyKrq7OJX{>^$)D!RF9avp=>?99#PusQM|AKGaa&KhhX z)?h630>Y?;Wq*lPa)0I~O%Qg`RdRpEX3bKod=Y1GTWtI=>bVxKqVaW-+cQmZ(H57MHGutmmcca&7MUq*JVt#Rx~H z$Wo|P17HCb2r0E7@xm>R`Q(eTR2JqvS#U85O6Vn6!qpLrF@vg87V5>s)bW}S%)_`; zf5OWtm4-`+-Tg#nPq9}sd%KCueojh>c_dfX!Q%e;nJuNu=SR4pmcxxjc&eQR=pVA` zo<9nzZ_Xvg;{D<`&B!M+yT?IWlfJ1T?+$np8Mof~iVLb(*u5)Z7g1aa>|Dj=#~Y%! z_7_rI647#sYj!mCjtTw3>nPre**;#(+F)Z!s^xsW(n#bh1RQFC z$F&@(2_ExNO`k^V3X!gfJY=(7jZ}gsO?#O>!rDI>f1*2)@@P=Hv?B#3nS^J*BP4u{ z%Y6+e)s#vd4@EfM#HNyvRxE);ULWO3XoUhulNT?U%wy=9@l+As{|93bi#r|h594f? zw`k~X7gH&IjSa0EZd$Y87&3Q2B$%_1_YG|5^6UVXX9w!?ER#zd?B;)#0Ylu~OYokO z!ZBdbtiXqY`B;p_)@exp^)LQSaeIb7#N1%2BXoUR*_ye{X5JY% zd;SGxU&PdloOercuj`C{5Ed48@~V6s!Dv3$qv#2qcD&I|l^DUI9#?00!EUz&EAaU) zR#95v+SwQ)JiU&f_O0Y2ums%AtCsiryqCn{_q#7!-0$@dFF$J_J+2gmmsM9vL{Zgq z6T$+^&ac^e&F_y6XtQv?v~Nny@lGFPvx$SOs@e7r5}9;*|0h-393S=a;$fc0dMSe| zg1Hp;b0k~N5)Mmq#?LW_B*jm1h`TVH!6v!g#6ez(`pKj-d%!38w2x05(riY0spCG$ z5$dKE`9)m>n1i`vO!}bi_3yU48R3cB&&aBwWZWlhLj9KW1lCM}^Y@W9Kc~<`eC4aD z@-WZ&11WKjFL?nK9>t0<-RCj}`#Hu4GUvjKF{9{A##q>+u#hWU!Y<)aSjZLb$NRG$ zg(Y3#y9Wt1k3Ie@sC#Wu%aDmij4=m_=bV`XB%Na~WV#sCyb{p z3U}}A=M$Oz14WYW7ZRBR$CpBjB0iTz!t;br4Rik-3I+*IQ(6d#_|a;Pm!-URB$ZS_ z!aaqHISPFKI@KrO^vF|vC>^u8d?K4u=$OszC$f3xxW>XOrgw{9)`7JAcRKA|}MR@ttTuQ6(XJZP4) z$@Vk3#C~R9jVOl)`Ft=?4s%$mjtDNC+}S3BkV5oE4Bz02W)crsxQM$U5oTuKEVL0Y z_=162=#UR^sp0bHb;1zc&oF7YXr>Ti$XTB zU)b|SA*T<1UbreAqt#`rYE=E4Xmv3yAP|(c|2xM$+=g3`1ELJV8N7fZ!4qtp*-IR# zH#o1t3v_9rG0_GqvVl{c7WIA(n4=J!!m2}ep{QJrB<($m;NGec2JAceW*o4^yY{JzdfA-URU=u2lKlC7{*o53Q6tX+z z=T+$h3Ns36Sn+ij#|E7rf<0Z{4pNfMq$GPljp3SoGg-^E?pEX} z_o1^N>M_O~3WXSBA;r?(VxDW%L;>%vdej6A&+ORII(>baJa~Z;KbHtEfG#8x-rmC| zv*a}{lG8E>8R2FQgN*hw&%hhvXx@)4!Gq5Q!tPje={q^nu{ELZD|7+sUeuae+- z`{NuBPmWnHomJmef=@8j^VrbPk6Ki5wRC5%mQDr zg{H#6oT=c$88RRCf5m*DY8Rgr0r1%~BM3fsdPLR`GDi;P%#i@DWhctslJf+>&hWCi zvr4gCfw?jr88BT^eKAE&t}jdc8nsw&Fz(zYoMfmmDt3bDmgDh%>)wta6`#s0%!NR~ z2bm24tReH^;8)BCQSst4BBa3VIT2Q1?yQ(mOK@IfB5oI*g>BiH@%P=V6n!K$wE{o; z%RLA?`;i8@IscGXdHd>JoSB30vw1lLel9CV*Ac?W^Q@pCvi}}N<_j7d^I%)cFmgn> zpJU_*q#=x)eNaaB)Vly9N5V%iax{E2BhRfP$jI4j6eC9>Tb7Y`m$y}%eD?n_ww5dR zlx{CFpbB`z7Qzhh?7X22!S3Ho*qgDL5QU58NO5|@GB8JShj~Dgo{ zidO>@q1VofrOMgWdAXIz?k3hY@R_)?jbPyE#_Upip{4e))RT38LAr>zUTRd!Q0iH= zd&rc2CB88^2H2Y&_z$R*%?K*p>Z3lZe4nsq8$9OBj~f{6s)0!Z(ds=pFP=gj)zLR? zV00M!1 z^>-()B<=nVGS8l1p1&Vy!#FvYNhfj{#bL}J>_^bPCFIlP6)cJ9E^n+&$S}>l?vn0= z#3oo1y<_z5@%}n(I-n*Eh7kn8oIKZ;jq4iT9#knO7~4384!~og2VJ@`Zrd8}#^RAk z4V``)pq|1IRWIKa&#UDY-O;E}R(BE{JTTdh{@g5R*J~r{%kTCqkTJ5}5`B1BZegfolm#KO$ zWnZ)KYD2uoWMdJf^Q|ykM(McV3n?8B_U99b(H)v`C0k8{z$JP0cumK|^=uCV>dux^H@9b5r*c$X#Gx&4;N zqK3k0-~5qqHoHOx0ywQ)#k|Ffw=aAnD-?OL(Rg2O)z0cgB;|SKqH@`c!X27zCk*Rp zqtUt|vmg`?yvCb@0U|=)Vf4;UsjmTZo{w)Lq?{KhVu9oXie43kV_Rk^|=^Gt*tRM)xNi_@vClUpf*m&({$dJxk>P#NkwcD8|in>rNVe4 z7s4?Oajfyl?G$kZc8b@6l%!ZF7=kQPvT(3e6ECz|9gQ|z8?!pG4tx5veAQSNcW&cd z&wQP_BQCH8&=j>T@EFa6(fE#uqI4JX9fuOlMP6&@6P7KY-bDY=?$0*2%QkxB@!=s% zyK(Ya?EP7>8Q)+7x=S3dQOCPmsJTvAafe`Ys#9Ci1tcB%M)IO9tkgH5D>W0)kN&BR z#w<3W@2`f2jrXs|z4sUr8{*NxuQ1dO8Kqn%OViYQx``(itpr_iZR(Q&UXG5Ja4VQR ztO;C6W$)qXt-C`{^A<-O8ZUft*nUYn)B2vwWKyElE*U*85!qhLhK6Zo z*Z3#U)Y5GndC==)1O@@uF~`vMyS~xs6FKpY92{(r23>LQwd%i6`13-$XIU;H(m?0P z0gpKY9uIA4!aMvhcbGMu;CeJov1M-R(x+R)I_SOWXRgSJ5JaBmL zjShpr-s!dt!aH`0zrMZdP0=(?b;d)tG25w6o&KMPOo&)E9gTDy`5dqAsGq<(of?B75`@KWMpL{7-5zUQZwnLxu-JJS7mf`O zBdjtohO9f~2Dg+AD88sVm~7cYSoUZ0OLn-&^C|&X1Mk8bqf62W%qsCzxep#zs8d)d z&`Jac4O&8C6i@UalQUX*jd!|W1xvIca~kH!Ku5LCZ!j15NaLj3X^XwuLq|qF?Qs3V zo$}PjQA=jI=k*~s;f+tVlCMri16Rl$=5k`-;OQ-^z??8pUFr1YRp%ZC(85}yrko9J zVB@LHsts67;}&BhA--2HOXt_+ihm4IUZ&IV-_k=!OS)9w?W@5roFo}T8Fa%tOzWF{ z29@Uag@Rs!Q@2wc;LGB-F)X`(BjX{JO8qWXgXOO$!?HPaPG_RkSD1L{@iXfnSiMSC zK5b1j(~dhLt^>;f?D}`EVQms**l~T-O<|pQ-zE$TW$zvh?nx6{L>g%s0IxfxJhcQ= zv(h)<(!)Yw$&stT@*HF;_o>8yp3;P2LgOl82UG>Rc|1DF!{pGt?bT2C61=E4;r*a@04LqW+Th^gtsnO~A35?Xs-{nvE z<$e9t^ZKj%nx{m7xBRu;xwZW-Em;;{TJo(bGw(EuO($K==Avw<*`2;3oat6tQV+n5 z`8`31C9HvMVbSq5HnPljnroWa18NEGvRsvf)*IFdc6VMFnE4s(Kh*9qQ+$M6L7nJ| z6qgUlM9hdMjXE3Xo?Xb>-_k- zdR}f`)c`D&`Um|dU!7Nv(Mk9c9%9Q<&_rG^)k%$ME+S$?%4>=viJ!$Rv(q)q_|CI! znm4b+UK84KuXuUfR(iSi55&;JSV%KPQC^h~&A9p$W_-wt3C;ZQ=U+pf12jqX;G3!4 zN7rxo8<5c9FIt_jH^Pt!J_o@b(hHLJp@=9;R5zr#_`<#oD?uy6;A3<%1Ro1o8U8$k ze$Jve@MfS{b~w$sOFiT{&Hk{*-@>1U51gg-^x#tx@Aw3Ydh<2(jhreG?{Kn2 zydo|Sc_%IZkT*1CB3?wHlhY>R6;7P6SKO%*@`5H$$O~y|M7#;5p6gc%zH=r~$U8BO z!rpK-8v5c})bl8Ypy?FyoZCg=&qK$@nN(r#NlvnXrpJ&*48_o>brP7OE2u_)7}L7d7!V)i2@#VrN^0p&FfE zPF);iG3#c5@R$JHEc<4`aF|G(OItXz!(V2bIDg+bF6x>T*|Ww)!ps^I2WHNA_;H1d zMQ-L;I67v@amYC_)5PDfW{DsKzT*I;@#Nk#Zu&MhD2=W@T>f5YmZf$2Qw!FzuoxX# zwqZ|g@&+~aPJc8WjBoB!3YyAya@N6n8&}%axM$y?8&SGx+4ac4m081v1sbljS#hYF zMn{8%+C4{s$C|!Q4fKbK@B*U)?eFNgw-kZr6o$bZ;YLnMBB|QAG(k|Yb7ZuQfnnd1 z&vSIoCc0_CaKL(YY~E-i%oX8wQ*T7tn zZ6v&xs_14mU|_oA&J;T@A~c{+)WfMc8C$xG2c2~2k?QHR-H$$J80Q;PgD!WWL9paC zaA|Az(cc4<;|{uxWDSmGG=`-(IjeQxNFWBTd;!LQali&q>Gs&}^KVXRr=V;O^+lmV z0I_iWqQlqI!-P|hL?pb3Ftit`YO0x{*p#-8RP9m|yTBi|K`|Y;1vqWP&>=HG^*Er; zSi?v-)W$XuBkL~3B?%>CCfJ>6*tR~x74g{QNZdZ9m~0Ro6oY2rwg51s?23gno^oni zQ^VFACRJ$U&LZ!~rX-g;Be$Vh@O#5)CU7L0q8t|#Hh{AYbT8q>!Xx`$WmNvvUH=O+ zHWsHBJ7Q@n_l!1f3rPc}TYrPUKri5vWJq!0A`v&LCEdLb={pgBkJNXfu()8`h?Tv0aXesf@G;928-2U&X_=mGI8qpo|@bxZ0x5+5tC zt9a>Ub(>Fn5t8WTm5g{$Z&RV9d11?~NZ?_8s*F^H{jjGV>Y z;{|lu>=M5~u{nVOb5xrHH%Ga-aP!q$0Ou+S&W&t%`1O`coJS@1sN^1%+@q3PWyR&h zaX)~M(T8v~Pooz}v;wrIZM>h-s{m#2l1~K+*k7QboS3mW8p?s2qoG{5`5G#Ka}^Ec z2E8r22+PmaP%d$zG*klq$vmiQfa3RvF!2$fjQL28KtAjt zSbkD7^Dy1{nwi7R*USQLA<>}$s3R*(V*3S;qT=ne7w}N(djy*s4?xjPL$Mxr<@_kgk zkIHvBeY+FL$I$H`*-w>y%@(+$i~I0Q3C-Ef%s%Ep6h6;;FYBRqH{s363n znt4<+k80*o%`B;AKzOXIVzBH_suxWEGA9Dml4!ll9q}?W6x0eXrv9!+8{8yH^Htd* z@ihwELMrX2<7<>GP|K!`*i2R;fsk0tat9U>pc_*gSZ+pPi>b|-5qj$F#7cftO5`_VA@?ADPZXr)f=C2# z0EwHRPc9$%mgP_%f@F`yI(?W{+wpK%y1(7~ieF?O*tU$Q%fFB5Ge@GW2K9XiVW5I; zYaWgeu%KU9W;*bZIXnY`3LolX_O@l7EBR-mmXvIO^X;7lPP`~^i`hFrd*a1K@{8=9 z#}hA)rp}|O^Jwakmm#?!P0DVkqqR(_>Riu2Knwa* zms=#LnU}|Ad9a1s3H%}`Zn*dYvOFN+(OD9q6MQ91Oj6V{x0C}VjzaM%*4}JO&0iuM zonrSbh)yy7LRyFPwfyKp3><$62VF3LjlcU5ZMpFg^P7Jw+BkD_1qz_~*3CkB0)5z4 zv};z#5ja2Rtfa=HMe}IUJX$o57R~Y&%>!fyGewLGepN7eGETEbO}d-?7%`X#iyBlT$sv8ZNI zZvUl~prc;!9!JAjS^`mG#>?~(0ev$5Wa}^K?lpKI*NeU4I!R9C{2W-B&@?%^@VL7)KJ$T9pmoAU%p+}|l zsI(rH){;t#%MVH+w4{^QvmgrK`8hYQAKi?sMv5bImLJmt9B|sod)j1gr zHSY2n7q83wS#9g!Sjh{iV))g{^+6)RY#^+KvMFV|S*Kh`XMBC@Odg$~|1g?+cGUPo=zncx5T?fS;``CDd$n=|IiZmwtRJC`{+_`UhY0 z3Rldd&V1CFk2>>FXD+QXh5T4mYs%tF=ROn#qm|`E3t6d6v{uMMO@RKQ)$LDTPV=w_ zk^^Y7zP8Qu_p8Nzk$#?gdz*w>KtC^Zdz&9$h6I^Wlf_qZM~lLLe?|Q;2a+*RD^xM_H^2IbuGinZ@J)7eiUq2gj?fHP z?o6<+%~Xp}q}B}*D5a<6$+t3;F!IZ-1LD$g}geC~INk!`~_)m9-T1<#Z;mGbbd$TZ@4 zNr^@1iJDKuqnW(Ooc8>18>VQhnce@%EeE&Hk;j&15PI38ON{aUQkrqxOB&zK_~>IqmDjKd-2LL*u6xb_&SSEufTnKkxpc z0Q7RV82J{x-aCjMZnemr6Z5o{gqp3Z9H_aP%8zdaJta{*{M~vENgj37qmFviQI9%m zIUU8t$Eq4C%!RzLf)a)2X(ku!zx-l7@`KOSZ5(KhY7;>7HJcaPDvFI`SX!?g%++gx z8jou2QLR0ywMVtKq*`h;^tYS(YS;yOG*h)3P}s9PU( z>!WU6TDN{%dBKQfm(ioXwICFaj&l0D-YSHxUL?!D3pZc=EShCMh;v0Xv|5(^`B?)M z;ykLOM|Je5jvm#~^6F@nEc*ey^iWCmJ-DK^6^yw#=cJ|&BoNN&NxdHoY+W(y{#-;> z0MP^L%DZlBp*=naZjP>W;pXeg0M1o(rGw-bEZbb-MCr=MlPZr2^HE_wD$H35Q%I4O zb)_u7^np@Ya>f#FpbtZinLs%UWCtkKz+nwp;@7AmYkq8`12$g~S&KzR1~9IuhOAZM zB6IV1<{Y{_DxpUu^r(a$mC%Yx$Q9{7p^3uv!Xm4-2?!=YFzK6`rMHA02}Yyv2ol7J zha<6wf34B0*;-1#%vDidTr21&j^N?5(+NU6x)L9i z(xXy(R7%S!B@`a3>LM!pbB;qq@&68gp_^5puXk>(>ClHqKK7>-kkAjm*t0wHleKf0 z*$Py^%vGRXTq`J0j^N?<kBhrUJ^H9eANA-;dQ_xdTTzpSByL+c+LD)@m6H7d z643kylEsCltN*o$;!wfNy*F6^&DV(w-J9&gwxU*C;oju=hrva5oX4f*qe^^KiH|CA zMU}X+r!y=$*V0OH_BlHTYUz{T@)NDXf7N+#`^KglpXaJ62X2n0a^dDHs{qbb^p%6; z;iE+q;ymiCN1gSkvmSNUk~&KWkkz%8gTT=Q@W@(NaZy>+NKhzRaVb!fi7d~x7Cr&B zMdg_QVDv}LS;Ae8-ga`}FqK6;SWZj9;tg|h&ec*5+#D_C!p+xG0i3I7DF?|fSXjBl zdGt6ws;Wm-^{A>=QB^{U;92EWm6d{GwPluzAld<`q+XuAWSV(hg{THZkv%p;ka^yR zT$$*WeZV!@t$q(Iv6Je2vy7V&$QVc4?R52TJEJK~y*VXNN0H`mN<=H1ptcI2TWj{G zT-6m=CViMYILz;IRTrkMq^bhE8Q#qoIL_*&6tV}nG_VtN%gchxzw@ z1@m{8;s5S3Q@{^AcNRoo519zNb0$Lf=jK9T$*Hg~!~TWue*8Sc;(S|yWqrjKV%p3c zruE_ccd;#1yEx+pz-O~=5PUB4M%J(b`v!1DkIVl$1~!+IwdT@NHkx70Ir4S?VHp*w zy8ufZ2Xh90dZ7f<hmyE@Hsq^oC`C0Skxu!eKg(G|EQMNI|i7Vj8ThcL1D< zW)2Jcyl5DavU_`p?0(iI6@O6R1Y_)3%rZN`QgIl*0jx<<9d^i`vhPXp^B!QHk^OOC^eyN^6bU~piaWw$!^_tf~%{oY}~%Omutzks61y7fxjc}wO* zCZ{9g`{5yd1)`4IU#w{Ekf@_MLqLd; zJeUcQ%|)<;4+$|oj%ntAW%7sVy~EtzEOrpZiHm5a0W0hR3ms->iJ)vEBZLrFSI_X@7n;P`x88j!79Tw4M=3)kzA8dy9ioodCTDymZNH?P&$FkZglV4I@t-Q>D z2WORHxl(U6n&o2sG)na$ToKTmTwj(NG0Qf4wlUO!2h0h5xzTNXYS2j%;-32TWs3yW z{DsOjFh=pRcu^7G-;|*|R9!FDKT34`XH}}^71eBKg7;FiI-}^wSU;E;{p@_OC}9(Z zjkL&#-e%b>ijLgwVJ0(6;;1-?m#8f0tlS~6Qz0F#fpP~4FgJzRar`3A1s*5GI@`9# zNAU750RTT?25+OU_XuV=e(bTEMHb%ijC$jajl1jdAxQRdCx$T2%_ZxOcV}HK8;2Jn z^B=2RUR_i!Bt`rK0`Q`|c&jla2r2MKT><=m!G53O0+fJZ#Sa9>`ZpG)5R z!R;*kfHEzzfnnPNowW_xkr`??M&}4QiM-0afp&w=V@t<9#J)blZ|bX&K!ww3mQAj#%Ik7oVq zb^|I9_5*WwH4#Z?JRR9U(DV^=fBwcUiXWiit>&9%>-_4f)==K^jM&kfYjj$C@i?1v z6|fn$gAXhl#knEaLS%hmCg&P3x9NZmBYW~(#q>ik`)czzB>$2)+f_k4mGVn1B8xCN{*oY=bJ zqNmsJhc3`eFwMLXunA;5_+Xo4u>>(r0!>TPZlPhJLh5un~o7I-L)ccmVSZTb!FmHaV*Rh?xI3SdYcN;tAEyb5-N?)DVT%3Em>n-b} zK2U;f3vwXfUmVy!kR}Qn_$Mon88FADmfjj_mfK*p!)|9q0gyH>5!g#E0OPVg2?ABf zti8~IuHMt817#;@lNaZr$JIsfM>OFF(+8HWVwDvJhv0|PIJYMxN1W#%t9piMfpj(R z57AH+`_d%xaKrW1<~!TCxhDjaEUWayOY%qt_pvf(U+ROx)KRRgf;*LJG`r-iVKL56 zapsvu%u9g;jf;l{bk>Xnt~KqTyjJ_^j2dN6mSn#fgV^p2bZs=9cyLvFwC^k=`j*9T ze{?$1zG=olYlG73!52S%SpkU?R4vz+^-8gH7H9wZ7xTP?$LALyaW0$iwQ+U+t`c9M zQASS;>|}7yx_f27+7kS;wj}ecshq`jc)Ke&S*ZG zXz}+o8>XXSryOF4mLJZP;EJRbQoA!4Tgv%gA+p{6d(4OzGuIGc&`j=TyY(EHIX0Mt ziCSz2@T_8e5rX9w4Vio{k;(5XrWZZ%EIdg}U}z1DwK<&tQKgiWrrA6x>5h^Iss;dH zp0`el)$>Z309hy?dTAT2+WT_#vRM~!Ykr{6c_7hw=Rz1IvIl#KTv~N`AMC?}yw?cz z=o@F{?S%IaK{IQ^39d0*IYRFO*Sg6EM-C3OYWm};X&t%i44RQ2K73$%AXD#Q*#!WD zE(R${#~R8Kn1M~4vhW|OH(1QrHYkZMpz9>U-7D#QA}0d{keH}T7Ev+<>W%q!9HxfmPEHao*f%rEgbZnf^v810Z8&?k2rakh@cj5|eRsvU++ z8uy^@iWvsf1#mtDvJmJCQlQFFyyWkwLGXwYb{{zDPiSTc(~H$;PDMk=ht7yls>=B)4Tzm> zz6#i8B{EP^A4(Xo+x0=$5&%M9emDYBd?Vj#q=o5jPR}qg zU7#5rY7bD9e>#Y1S?{!q!7($zEJZW(KmaI%*4jop1e#aI4{-&Gc!-$dJQb5vrmR{e1-s*I^gF$OB*1EAU zXJCBBUh^%63eRL90Wo8R;zC5NPkcC*U7d*H#BNux;01FQm?jU!W~@yL`}>K)K~7;C zc(9vx?6)7>PE$R=MAcBYuSg9wY{7UBaBoR(Wqq`^zb81X4~*}%SsjwP(sx2m74giu z6zqkoT*K;X$sMj3)rF-!Wq8!Ld>rE74(VQWbxviA^iuXQuIwj@F2+L#XE&39DXsYI zceCll?%wW$4bF`A(*$04qnbY72F;q#Tc?qM?2v@JaSv@{btCBwPb zHnq+zXxZiQih>c7!s+}#YwLrbn0i!xP9>|O4@WFLr((lxY4pDG;gw8oTd=?cR#~3* zZqc96JhG9q^o`>}=DceL)r}dUZcw{q3yQkghX)7wpHnvuU1ypCE|hF`$dohZOB)xD zU(T4}a>o1_L%^wR5j$Y@amnQpyE(;~w3p5%_A&<#H7*NF$JGakCXuRqE_>)ko?7#(}gCS75f2aGgODlx#NBb0F$SR}c_(zs)Pp?aJdK>{;W&N6$(KtqrgQ$l^E?~*yOoPF;@BB(I-xphK=!{yMZx|7T>@s znfDWWT+*OE4knpd{u*=pn%kOO8r{O^nVh zIgv-?nB<8m?sONE-8V+JPLwOTuPIal2We`hq>s_r0HWDWs5Uo2QpoP7<(`gw#4491 zYIwQQXqApjK$Oyvf`jj!#BQ`(4BS(^(;_x3`MZqB;TV<394^e9xIYoKs0}c}ks@vq z4AGJh@`kxN5fhU8@gsfwxE@TfjpwOt^wjgMPzGa)gAg_HEl~)-SkX;|09?*d5Du}) zL+eeJWSMw8V)uR@r?9d<$ffrZxy+s#$KZ%-O3W?-;$O-tnE+u08f0(<6O!n~t;-pczEVp1npj@bwQL^y33o!>T#+H&e$cc`ywOb%s2gCc| zrO32%N5_4nP<^kjIWzfAN{ zCWr$-p_>%_)Z==9kBG%$6yE6~kQIu+dYl+E5t%jS!bddh4uh;@3qvZ4XL_UAuGD?0gli1(Qd8Z(WlC*2D z$SoadqbZvw6OF7azacN$$t4-Lk}&)qx74?V0Q9^BH2kVNV+7yT$VBh!?eWwO1K@8- zMyijcRuCfA(;Rt7XIscrPkmuA*Ajw9IeNvjS{S3el;}uAA+&%OgCoPG3T2@|)s!2@ zed+h6qjS+YD-sFDoskIJ4gn_W*~3Xoi6eJk_yiWcr42b0_@6TA^q+F4Rs7(j5kF*U z`l;d;^7_^l*WNc=7%JZb4FlPZBd$L8Zy^NA00~UZ?({>b&>oL5_6+m>7~O#XeAc2O z{IP#H6z_*+dfqzhO@2O2()o!KROtlTC?S>dteX;ihjDeFDay6?Ww*Q>S67)jb4<#M zBOjzVe!JLYm6dpj_$HS9f3j^)I$glPmHWTF58ee{81?zY6*6Dx5()qKf27gX%Xh`|YMHNb zg3aFHSrZ(vgi}P&BrF?<^(Jvax`>Fa#U}f2TY=M=pEF z_ylw6_+Dstv~;x5JuZ&Gj1B_|{W7IdFB4maj@0IJwXuxvU$7dP09GZ6ZASpgR3 zCfW#qzEFsJYzWnrAZ!}>@F)yshP&a#99Ki6GhhK1fNb!hP5{SngduFfid{9Bl{Mm~ z@;KB8LO~E3KBCoRQJ_rFKA&hKz~Awz9Go>*WNvKLeb0DkGzLk72#m#xlhzqc5s8T3eY~ziSg8`k|!b9%tJ7E4_aS)CdC$)~pjSSVT9CRD` z$7&I;5ib+wG!nxlOo|)H zGX9f>h6qGfcsQS#t%K z7>}mc`>oNAn9N;50&R@>{xOdgv+!hjSG#wI1Q3v{LsccQXaf@#3-_=9LXVbQSMUug zr=V}JTwVwW24@gFlH$KyXDjmGDDQv8toHHI z$`t%tuO4AMFUNPvA$*!k-(ZE_yZ3kl$c-UpsT^$n%XL zVuSvY^6|P+JcZ>C4?rlL70=Hrm+*k96`(V`z#L#(xMMaI@BZJ? zFR>=BEpQqsz@1Z*{Ja4_62KySpbB#c{;2k584liLVUD-Uz=M5*d)LKeji+Wu_gdL7 zUUalwH)#VG#*nqOuKRwdYj_uiiv-`wDxhSUHcD@dZz6c3YnXb6ZZhe%HRS0rX~XeI z*$TGJdy)66ZBA`H2^Du-FP-J}daYzg{rdH+vzoXZ+xj8;9L0u?m|MrN{-|CyE2s5p z^CRvqgUPL%$$|b&AK*rBm~n)!8^T5iAs3=!Tk>Qg3huLc!|rRw9~x{zJ^-jXYN& zTnQQ-p6;x37Z}|+%;~XzquYWE90oHwW$9Mz}TW1bM-C!f2suUAkVX09`ah1W< zGHQO##n^Gq>~)bRfA<)6Fh6k{@F)ldZS-uH@rZJd5tt1r=5F+PRYwSDWcqEltaler z2~iY*#r}vcCBV`-93ygOJPD1k)CM-+_j!!6Ts_M2i7(rLo0PW?6X!^M#rtUwC!VLu znBYI2cMj<$$~e=E2?X0IJA3Ofn-T}alv?Aysff*x$&*~>agw;hQvgsnIyAV?txaw- z%374dGb<4(;vEbL77`VhU@AIEAazYc+n_{3p`$I_Tt*+GGaRn$;2N0z6+=pmqnUo$ zY&GidT4#+WNLL)dVC&@|c`8-4hg&5g;7;GTvWMb1eHmySReBUvr<WT^g?2K5#C@ACOW#q@gzL$ z31IQH#~E4K5=S%1*5EO&kbXfW$xI^pT;sRieG9N)s^XbP8$EC{PB;4DqH^ko;tQT} z%w=btar7XeV~!1d!tmO;y~A{2c2@oUy+k&hSME^3>EG#Soxa}E%o_|3;lI>GrUbOD zKq*t7xgKc_fNbCC;H9+U9sPEU@O37x2k~e8>!2ZFjR)V9M7E>bA0b>Z2U+Rb`+Y6%QF~~;sV+oHm9I75X<#WsYRai zM?9i?;_5BnsEnI)<5zN2I6JLHk>lS+hEORpwsy*w^+@3&Uq{Fk=XLbeUVaQA7g6p< zUFjvuhFs;9opqI0ZeLy{gG<0QepmO}i80U**VYIlJ;48$Fpaq}vJUaN6K8-sITy9} zydXm;ai#m=+W!|CyMK^`78lUbSDZ`+IxB%WKBbtP>Zp@SP$px7x0pCd*A0$Xiwa5iJm6g+dG!xsjsIX`Vud53jIM6##9lx^v zjE*$J`upqyep3r{r!uvCZ(wxjY$O#iMzZf11+JTFnL6h@*`lVYO^VKy2;{i`&XeeN z)lxDT9KkE!ffyEroum{ZI<3DSw#Nf9Vb1^`&whUc+)~0P@F2QOcVw!-HJe&~GBqj2 zZ8+}Y*#*8^g}l_T^=~>m(FV8rs6B;QEVv8$UT!wn{?0)L%U}4*y*7pbV*}DVSZkCu z(;klTLZH%kFwil^xWG#ao}YcIy*M097tdW3OO312o7Nd~KQN)LMuU6So*IKL-}w^T z_s~qhGPe3k4ZRT}YqhQ#*UjpAqt#OD{SBVl#=yd~nMrv(*jKPpuV2;u`9HG|9>BP+mjVUrI^W=(S(uvuzLFQfoaX(kV$FK7=C2Q#a%Nqpl|~b6&dS?s zU&&KUMm(@9U#ByPb9G*>1c-Vv9>CO^S#R^|>O5>5o8$2yVkEsZDwbdpdkb&ynJt(v zwAy013`5iSa88+SeZ`C2E{Is`!+`I-2GH#6h+GFH4EUP>RNELBHijfmd)}(nT7rIM z!{MjIJ}BNwa&nh+$t0tUZaC}NN`H}87e0Nn$MOJg=v$wt#* zTPLm2)j@|3Vdxn`P9`!nhj@5i7I9we z8znuF`xrX1xNJWK$xK0S-H)dfR?%@tgAN^za2#kps6EZ1TkgcwHX4@$1nP7hd#O~) zkx>U-T0Wha+Rab{E9C}z#88l3fJr!;&EV}{I6HBHa4FbKh@x0a_ASA%Ah8my9DH!; z@7NLrC{Ct?^n-r~3zt}MjZ$lPUggEBA9MS#z+8}hLDk+M>RJ5aBW`vU)4Yk|*FKJT zu_y@0y@&!6+hpnQ>3wJ$&kaL15gx&V;V-A0BC;D-4QG}Gy6DhE>E+z{Dm&uzS-fac z3;{QQlt(ZrRidb~-qWq7NOt26CZ0}lJN*)Sy?1gFXTQTB`?w`8MpZ(;WG&D9k?j)w z4)Br(SY@d7AVY~d5=?1$T&3U&x)v`Ng}>VXUNw}J$f>uZG1z@^A{Mo1&1o_Z-=RmmsPo`Q zuQ=M+%*~ zO|V;BO`GF^LSe4@Z_Dt4l)la%2S?jK#G=BmK@N;EZ>k*YHLf5-Y!Xxlly8gne=P#Q zli>tIi+;4FEFL8|#PvHhrNey$q)E15O*h%XRXvaSB#HLRj3CK?XEn{#hR3*Nh%>Nf zP`4YlnJpBk&A3daXB?NQ_eK~XEjY1fq!5UZq>M3oD+W5*rH)zRhq(lV+-~up_d$ud z3s9oAix{RbQ&vPJJg$`TZNx$CPbeLn)U2eI2 z6eh~HI$ix6aKzR>?GAE=m%UsKFOaPBbG%M`l)@*X6T|?b4_u3|6L-csT}Y?CyPfc; zu%GF~@PRr3Yja=I%%lg^OI7P9u!l!aB(9n579I+Q@G&lF>^YitTmv^HS9MlWU_CBS%ToA zdZeP_L2@gd@O=hRz~|VA)Couak>my3p>*^ysN*f0j||r99YerOuG|=3q^wEnZLO@^ zTBq++tkx36*>0_o3hIZ-Ec^(spB#KxfFYpWm`t^e;{(J)M+Y}Zuq*I`cjRLHO+Py` zLK=8>4){Z!t5oLpRZKXH;@c{;D(&e&ERoQe9lZLT9r82|1D;0Q3_&lUI&rZY;bWvt z7DReotI2vy+^h^Mqt4a@yQ)<#MWUiQHz_XpeHwC5I-yH7o`sanZ@bm`o45n5e z$u9Wg?0Pf^r{5YbpJ05sGcF7u)a&Na@@7X}6FX8)@(mYr9z`7{xL!sGE@T@awD@r$ zzudBs!U5q$<3SeyFFnehhR+ygK*YPnV%sp4fn1JkEQdC&_0_ zNky((w9*6-I4{A{tT{%vj8K;t)pkj?w*|}fj!j{1XqU2W(;hYGS%Mq?YrGz;gSQB` zRuc^Siy1M>nysOP_Jg$L=^`Lizo_N{YFCU1qpAb6*xODw4Yw6)Xz#2dfX8 zL90~aS~ud>PCl+@WO1x3%Vcd4UQZv*c#YSe`ajpG*$CdiJ%#c!Ol1Ei|sGxRu z-k>^ld&iT}RZ%P*9V%~rWyMmfdRcA8RBXt`rK`)6>S?QfeO_t6&+cfz@S=A$ z`!EF%${XZU9TwxcBW`q?A`XW9F!$I()Tw@4V4?iAL%TJ+#j?~@bX@_LZ6Su@jv4(onZBRecp^c3qm50joC&*-hs^x_%Z$f(3C4D z)yqnZSfE}xEnQvEmbImQ(=pw2F>sTjbI>Izf@n;A3-1u3 zKsjTe@4yOof|7>{QqF1@PT&D(dP`wEfD-dKf>ch4kw#`{om^j*8Zm*CA=0>P(#A8V zwHpdU^AaXr0O@cIXYy9%v|g#jkhxoUj@D&}ghG&w>3dGQnt|vw?S*>H~!62;s>m|64r3xAl+o zmIR_2G+Wd_WDBBX7~W_O^bvnVHPDSuPJVl}RnA38p`Cz%O8!2%Yr#|qZ97}6?XKyw zSp7~HH+JOEgwQV7QRhZ2$~)NUV4xL8bke$dgNLWqun}nN^0x-YCqfgVX6sPvSmVyj z+3J8qn_Di(Oj|2}DQIZr(lZP#r~I;3)_!)^J%a=P0I$0p$DjO}duRY(VQPOF?Z$0? zo?BPMh%4oqeUXLDEdctgui2=BYI)6mxE5`j1J2eJF%Ht+bHuw#N38bZt1kCf&tk~5ixLt%s9G#_c z4&$Kx!PA;TU92_~&Ty=Gmjq8_ zNJEKc#eO48NjPn=8;ZLJhdg41uu+6TfCd1*7 z%_7jOetE!0|y%8NqcQ=+MP_=wEl(?{E^)ekABdkq*6}kI-hy(jZp($B@JtcCLiTh zvBzUJy%|vAaa^rq)c5_JxUtSdWMs%nv(`V5hFKZgot< zxgul?)E71T*??5OgfVw%HE0dco=!+1j~2;&WxLW z7!cB!HArT8Bk$=>mI*eOk3zyPLg3XuaFOYeBP^y5$q*m)#;-c`Dh0-GJhhRa+NyRy z+G)(f%m-c(Mj~T0z7yp#={?>L<3jr`S_`Wavu)UP&`}&W;9Y{^pw~e6C1eSBQocz5 z6~EJMemABzB#kKv#i!X|@(yOnn1b69xM1olJlju?G*3y7<=8v1^krU7Ch zC!AW6xxT>?lb=ygJ9`VPeM5#6Uo-Plg|L(prxYyw2O~F8J~E+B_+p($k|1TOJ6HT* zf~j}D;WWhZ9eau~JZg0yq&XT|<4;B6NTXw`qvX4R5KG2791H| zpr2J|A@iK|z$U$`fFNu-cX>HGhO&_u^(<4=xH3)INaL~4Kiu&$Muyd&NvRS>wF9Lb zB7|eYyCpQ-D2L&k!q`hwjgWC!j>An4V|ePtxf97AcgEZ?jII~0cO<{s;zS1hkbp#EVlqozg#y0*jNdXd`wS&Uh<6g?@7|X;R_T_S_mij*Lg2aD><{qx-;xfKjwMw_OXKjI4OQ2(^dtueYrE0e(9eKj95|B&XYim1h;*pf;A8xfdAI!IPH*8~ z4&(Mr7VeBkBe0EHxJjJ?mDB2JLxZmM5=V3*0m&wr55~XH9~W9=f9JBoWqU4KIp2%i z!!qwH(m6psB*pgwLTpWrD=mIpR%SEVm;-Y*21t18<6sF8#)xbN1J5dVPPeE*T|Nd5 zE#opUQyJLLkO6)~GVzl((QNo{=R)2?_}AsazY`OxL8glB5@C{sSX5G`as!QmL8U+z zq*kmWw}QVGvxinx9Ik422FKxo5YZn!UxIR<#BiNQjQU|5Sp!fp{tb7`nXf6XBw7>B z-j$^658p_J%aS>y@QIE&q)=rCl7im*Na17n2PXyLpF;|1iUnqT$YO!B`LQuV(?PH< ztb{$RE)MFG8h`c&T?*!kJlf;D0*dnAIOFgXsz|F85skMri zA0MKF(%nkQ2;T6UR}#!Xx4vKq$MCdpujYt*pbY73iss6OPF#s`=#ndOxiZmp)5{_j z0K#j*>*y}ReKBkXT{8e}8n?)X#&166QC6&+gSgqz7OI^;!^R@tFv&>b`hsY-lQp{Q z=dsFoe4#5>x*|&xOki|sW!PQUVlOaa%!D~P(ZoeHJh_NQxoAey!9b7?fGZ#}?(xf~ z?4ML&K(Pe43|ojAJM2wdZM@_rYX859bM5i3n~;KJpVEJdYXU$-OPfqQpI|N+pp7&@ zB`@IXj8ZHu>EmBXMXC|+3W}5|ZYAmRrK>{e^*q&~7>_swQn;^Z>$IAICI}*;p%e-Y z-KmM5QVsAs6pmu38l)XFN9aG^Va@t=B@7h*Id{p!ft7rE5iLF&TWX6HaV06d*mBIP z7li?=oNkI{o~uPzQ@j-1;u?t!ax&8#m0ml3YmwiPEi@>1nTs6?(wsmBeMl#rDQS-I zVE5=M)!r1dNl?Z=;~U182{mj>H@d0g5Q{p;BgZ9RSRu80q$V{xHtKb)1cB0*J7h@u z#?w~PSJ5QLF^FZjho_784`ZMz756-om^=?1q(SK^{p8zPdf00T0o9c zhR&0h2AVMxqk%^SZw6p`lwHz@^IH7wDh|hcqS8U+B;?J8#$pT>zaVcwsRUs(c)BA4 z%%Z7@;UWzBF~zVlFkUDqmad!CDDlnxmZ|f6lh_0tlr^#AfP*B4$fF4BeC%Ca$nTwr z(1voOWQIP(*HRjh_-rFBCU!;-2&N)DVPS5upcs}m??e}k#ni7E!K z#-nZ%U>mkJoP-PZ)n#;y+`m67o2l&%n_wpOU`JeMj8iqj{?3$wLcDMkF5A&rb==Iw zxE;)eHk@J}8VmOUZ^qJ)rJmveJa*l)8t7`m=Go=k8rSUAN)Snr~7+Nl0f`5D{bYQ&BkWsxlfbqNzLD%|G< z@hx;U#r0y&1M$|N#0Hd8x<~iHqYfJ3ZomkpILKt&Y^Ng{mN@0Ejo_Vw`-!rn&XH3% zJk0h4-oW^VPG?xMwgj!95~MklW3mDXEv^!dS^;JAUZ-7iWXB#}$wOWMdpyRN4mZ+C z_{4Y>w1Vg7p#n>=2>l`LzmVmV<0xb5#vzkxy@=Lg4#at0wV(IUTMIhpi!c?w>A3gj19CiU0-2)vf}VBEU67g%CQYvJ z-l1)Vp+NR{(}&y)pM!>OwKeSf6LBG;t+wc2@+Yri z79LDXt8uNYbSTYv;Y)AmtRcVvN@Eu-_CLz*UkFB5)&nA!nSE=q*`;e-2f3x4wP!>z z+IEyzt zx}e@pOzmb~_i(hD<8!p}=Rm?xPEB;D&Vd_K2wrJ4m$J&?Hc!t)zZThc5>Dw^n@@8@ zU!?3)GQjxdU&!{(940%8MB^Gyvv^M$K@s~$z8IY47j2OXwx3;_h3m|awGuYb!KJL# zy!us9D9db1`R&}8YvsDh=jJY5H}SprgLcG`wENzp?wbz8h21jAu%NvmLU<{C6GiJy z23kkwk%fc-j|(6i#u|49x@J0i8yGfdm>7o!meXW9ayI=UwByfjN!L5yBBrb~xFh60 z@|`j2;Wah)(VEC-wL`&nLln@cG7wDohwN)SA5_=KL zOl0Dt6*eBi+$Vu}x{$qr6(_GC-n^X_J`m#KiOsNGdB;Qyd+8qG4xd_4j{A9@`*7F& zLrhiVi-@U14(!zn}UJHfS}7|ZNBmXXL^^htg1$Ux38ZjLCZLl}~wNsr_+QCv|B zJZ4^=fUv}2fr&Z(W`K}Twr_!`=ynyUCAd8T>z5Dh`;RHtYvMgRAS3P9*80ML74Nx( zLtn5lp}yf&PMXahxd;+V-`Jf2t#%s6Afuc1&N zd0rC0AkJ^~DEtePk5VJJ)%PUnBPJa{gptIb?Rz4JlG*HOfe&`VF3W?OstoVK zH(_awPS`o=WR%kR=>XVE_<=^lxdGp z-E-GU&48uFbi$Je%b83!@`{2#{EhPOKC6pG0StrQ?KkIj_Oc z($J?Z_orw@2*VERx!ckBP8`(|P)-eQabP@g1+coo;=FfnS{J@#Y6q4A!!u596CU}1 zgM}`7p9j`cQEOn3&r6ZrM_f9QaEuw;&1JCPm`9|;BXKms9YJb>@h3k-BCc;KTGn*P zZ`iS%xFJl4iv~uTasRqVMX%})0|%947kYJ7^n(5AULnl}2@5RhigbBWSWPI;oh0%? znYU9|U6VM0LAP{W?9TjCH^)9g1={0AIOGPY({61`DGI#8MH@VN2>y&bIi>&nUL!_{>2u{ zF0W?r>xH0Jm8xd?J2f)h#>jdU}>of#lAdrvd*a+D}Q} z=+NT7Py2~8O*EtahtDzhSW-|m{&3q1L6k#=~GL1X7K>>cqDe4 zl);{-DVjRw?FM?{w1#O&XXIsYmUlS-GJ>C*rger`4RpO4!p+Mi9K{UJz)&tk7+O41 zj>{X=dLnNC)j$ovO>>URNp~VL{_~(e-*Ix~TsAyh>14LlHqH~pm7{K5@FlOqpglw0 zYrtI;_mon@)&DWw!sCUk$!|xno!|lNi$p@H>c(wYCEru-9cV&tI+&|UhxgnfVD6!3 z88n{R8CIOs5p11MoSq4mc7sSc_)FhWD4(LiU%s;> zSZ-FR7utUvdmx&v=z^8vT&0Nh974jsi=TQ`%z3f;_w22SXE5H0D0j>hnNQqAAQ#2b z*;S*7dG^@Gbc9qNfwdx%*6NiUAjyo0>zG2T0{UZjCW4Uj&Yq8)v**6KuiUBg%V+#j zGka$nclTj3@;hGn{S~Cc#N|86jkUtc(%fhwT0a5NXnwjkx}uoJM-&fA+$k*WCzN1I zz7|{HBZ=;b<5LqNK19r{^(Q<@pu41sIa7ugbGDS^`Xu2jegwH{A)O*zp17IcPVvaaSS0##Y=27Q1O>$9-KOe- z#x@Jy#T0bRK?th|6CftIsYYpnbd&rQLrb)Kg#Ti0S$3!0;{XU774Lr@(?oL5SqO>f z5s86Qj53U4_CZC?*~~XLA`BsrPXQaqZ(Pa!gs?CWeCP2iJiNgq5`_FMET+{`goqx< zC9l&`zODHkK9YKU9^mG43vEg&Cp-p6xB$azV&P>N3Du=6M?ek)9pD10FEPZd)TpE`B9^PqmqMpV8&;O%hi+N!RdkXOAW;H~{ht}Qe6XWoc_Y2^ewARqNnU(9-g^5m0?SaXLXSxmI2_~n` z=4K?Pb`em)GKl+3j%5xG3;TzeY;<<&!d_xG=VqtIp9eBKHOWgu94TSsvZOzZR-1U^ zu*dLX1DA6WNZ{Wg5c)^90fcs@ zvWqQw;Rc|%8M$7No0N$H>#_E<=j8q3eTd6m1j;fh8_EWgv1NSUNp-$i{0>Zq6Lz}# zw;eiqKDz)8ClT5y5R!{H$8!+}2iA{mt=XUQ{Ko~BNgw85cnduLaoE_V-EqzEF@51C z{GQd{1#Z>|0!Cze4grkL`5cWkB=d7ND)Vy?OEk^H^FL?OOWv|EKRJFd4L@EnaCO;e zK2dK7pi2j06V2}9tpMsh35`~**gR{r&f@Y;0r#>2O9wswjZH`5%MJYzaP>;*6n=?!C=9Z7OO6wZdY0aNyRI}6S_6Cu*gAXdgdI&=0 zqDRS(D`-LFvQZX<4+V`570u)5&uDGH7+q=*){N{yE|ERhcbkzt$R~2?w0hYF ztmV3?URR{$^t6Fqx^3W|;urFT(+>VzwK(11@TbGG(jJDkFu%K($nObrix-iU!G(8A z#{hNYY+L_slUH@(Tq(gXjkdpOgE$&2E=619w^T}DAEDSf6{Bk|Xp#SYg1#uK1Cx#Z z&MF^Dl|}=!LnAJ37r~4ZFP$aNw$#ubJA{Y2qFxgw@;kWTETo$14qmkBQhlh=nk^a!a1jNzDEQ(?<#cXK;# zbb&s&_3342nh4=t7JUkId4V>-Q(H+x5z-7gyGR>0+)GYX>0KVWA=UsEi(yXdl z@xh*y4Nn|L5y#I^ukhM<_%)Xs?j2FB7Lf9r{=L=0>7}~c#hpkvan(au@}+ZW5dhFS z+E*|9rAg0A!O!4)LrRQvyW39n!-q+{3?Cx*WytXON`?$gnDay_x!kbicN2w-J1F=w zFNfrZYgd4PYc%WErDm&MD^)I=V7cPA)@7wxK5m`SO;3DiMuD-xj7{`Q98jUye$Z&v z0MBe7NNmC3FN9gXp*WVDpNTzb&5?7A;iygS`MFw< za5>sAe`ipBv!>qZkH&a;7pB9ijykCXD}wN?BeaFrSx^q46yZTDW}7{$b`M#gjfrne z(hXa-1OGu!p|!lHxB95hD&HsU8OOvJzf_D1kc1;V{@pFkyR9v-bXL$dvbAA+HXRvu z67QE>LY;+`SxB+vBNSU0LZ6Durw_q^djJ(T)H*w-jfPmWrW(as3JfCe>3NTJWu#tC#!gRXKIrc zMaU0~p&_3F=V3>bVe$4b_(Ey6Bpl_UZ|TE{eJ^{XG+I1q@vN2N1qz4oH~7#VE29lRib z(#b_K5=guxK)jnO6o?;^fd4=q)|=;0hU44#>*76pJC_amfw%jzSl)QP-;J|UiUX$L z{RYF!*4F&+jq26)2L&t~$~j{l332hB> zZ@wOuQt-^%Ee{aymVjaYx6s%?JO66HYD4cv^f~ZW^ny3}s@AMtT{dv&s+Xnn>vE;> zgC%tgV?>ukay+pqHEEJZnOSTy9>cGpHtCpDyZj`Fle?A-JY~r{jSl)+bV?)H(@?mu z`))CKupdbY<4XI%v+OFmiTK;)Y<6`djri5sTccxC}}C`!)GD&!DDY- zocs#PR40WqdJGupo>`~yWqndM%pdTVqA!1>I%)-xbaJrbobq6$CN7FqbPWScL=}f& z;x0Am^h2Nb)viR8!|LQE>kfyyjWMX8(+FpjetAQjn%u?+&fraAUJh|uNMpNN>u78i zYaQpHa5CX+g%;o+ntSpKP80f$_0Si1a#C!%rTA3ktvQF^_%kUkq)=xea5g+em7U@g zEl4@CXjw2^cu_?LVcEL=Pna~QwMB05lnFCO^VK*XQsDP?jpT$Pbd`pFA2N${hSOq- zJaX4F&;_=!5iT5(ueiA>+M_Ij;Q5AEPJ5)jt4Oqo((2Sjv4;I{5n&s7)qklbML=xN zA&dv1LK~80?$F^+cj#QobN(zywJ@^)c7@;-J>n~{48d2Wuu9pZ0R_JEW21aN643Sgj$(;SaUDc=93!vD9JmKIDTY4>3_ zi5KCEY7^n}L$6)tHxvN`qd0t}@R84i^IBG_B`2u*v(_A;2{GJ!=w}#j5`&zXy!(o_ zaS0_kO_{+i@%$zH8u%9}C*h%U%As?NZG<@51cbv-9%(yQcVRUP>Mu_EnK}*U9K7$1 zO~e}_FGY1;?dB)z!|9)gCn5@+P$Dj(s=O2o>aK;zC)ATy;Rx=Yp>^ay^Cz6UBbATr zkOCa-u!8^75vr8c54x+AmqBNh`ZCm26;gUZN0m}?c{i2xQaxQKA!7+4i>J%V)jI3) zBk}mNfxnFr`-~azlOURPwq@;H6icnf^)b9_q_$t~>`b=UGx*_p&y3OMBZ-DF?e3Os z?fhRD2oG}We?GCbKcQ5D?R@&b{_&4LpY4d!&l)})>|cs1u}!wc*0wOoc_xeh--6d_ ztNxYR{=$f22D9h^Myy^^eTIwglWiVk!RkUt4ayTRQ+T z**fwz`F~A&2cV`iYO}UeeU|;*-DeVTV!WA;g_M#UBOW(|FZ|Dpsd0;U0~%(;+)&=Y{Q<~l!(jOf4|2j{WzL6vQA7M>h zk^Xw)>dgjy6R?Of>!L(NyZHp$&#MS|9@!=?ZUxe=VR^86t_>79uh1~<3=Fg{F+&l> z_-+Vz%%EDMja>}0z@#3BtZ&{bxgU2g4AgN_|*i-QaCf z^bz9$_=05@!sq+^Z^Bpdmd)TldFP+y@nz??Z}+GB>p|fAc<_muIz=k?|+!y~t!1NCtLI;4;RGih&6C=x8-)p&<2KS$5u1?%4o z%K-Fv9nEyq&4j70nP9oa!1A-eqz(W``mhRJR^GnH#b|Fl7>w_TV)T)B?D7$qOY*Q0 zm`nQzV?v>Qj%c5kwBLQC{ZGIqT$o})C+QovQhi#WiY$Z8?kdRG>SQVa78YsM4#%NDuMwTT?Jn zX6ty@PF?S;t=){Z0sc514|x_Y%z_OTwzwr6UnQ6dR2?<+j^*UtQX3ibrhJCxC4cV$ z0nf)B%^sVnJ4!tA@+G^)>-{Y@{wjP9Zz*z@=k11VG!@Ivseg{BvawpZ+H`&lN{0> zPl^NGv}4Y+O7PrBM^e1;^u&}*wQ}phgOV3TmZLs8G!`3*Um;DGbHZK2}FV;Q(MjpT8-( z%keilMOQd1WJI!|UB*PdTgHBCf6=UoHhLwTFTac7+Qu^pNj^nV9Tt;myYT1(B}R=O zlKc_r{@jbUnM})u?6-!QBz1oNM`!$yBEoR{PF!X|>66Ekd!A7hFT3DLE6Ksj);=L| zl0(Dl>|`^UKcC1TDm<^1-34wvOsC;L>{x-Z*W><()s1fhVAbEgnDpgUZ%XdG&Uol{ zuSB~|UEH{44WhWrpS~bt;a6-`n5`2EHj}j!uz9={#2CU{nc2+c;#iiua=Q+DQ6keP z$-oK3JSHohc?i)d=X^muY*+*i>;RmVAf8CD;TWh3f4c_8TD3ugC3u!r6ta}-*BbZi zJI&M`T=*JqK0nB289xC%8asGE?}03kU9&`1bgFV{*jgJG zI`_O43M0s&cE^wpd5W>BOx@4NbVI{iaW|ay>fa}nQWy6M(3C=^z(wH5z7OHqt6Jsq zUA0lYx@6^QqjX-ZUNl(o{G7cn*6YQ~X0_5_@2kx-Rt)uw;)#kIS0_yXskltW z0}ZQ}r&PRpQ9G|z$|{ELGITT~Vp#6_^`W*9}oH!HRY0DzxD0 zx`|k>2r=NgtZ>XU98eTnqoS)->Ohl=BGq!@9VTbwcO2cLuKqSK*sH(cd-@xX4CRYK z&kMRQCgizgca4bW1EcM{cp?&-J54{Cj%Y9BkS?_4$6Dn}w|{&F9J2Q?59x9#g5$aO z(cl6#&BHKYsT3$(6xVcGhyGV<*4kPO7Gz*z;~hkPR1O%_#sP8eI#r`k&;zyc8#}B+ z(7_-RtZ4_2?IzG#L@Ca1tqK&X^m<^P1RJOjg;!@OO%S&v#59Yxj%>Q%1edjOAw+d~ z4X6;{REm7E_L$#o;_WZ9Qfnw<1(cZd*13Rq6Hp|7 z=QK;Oyv&mA{3mk?!4e|vR0XSao~1Abd<=a}unk&06MC*v+>!W)x#3*l5Xf5WtR$S} z4Auq9i2SU|!m2rB&&g7Sf4LzlloM1>7kxtK<~JjXTtuXAc(1YeE(!J^)WY#!jY>*e z7N-|hH=kN6>gDL>B;a=b`@t`QcIK>C=*|#+rr!BBPx#egiQ>vWeu2ZkPx{@(#iatU zP6}`6gGfHtK5~_qf+*oiNk4v)k@8|Q2TxF1 zl10`=H>JgMh-nawKL;GRiTJN%6QKeL2-LyLPceNyH4%`TG$~xmGKiKTBf*2e;qon&) z6jrXH!w+3g>%R)%nQ4=>5d*JG7?yhB+CER74ENWiZ<|XK^dz^Q|5|O z?@V|OhURmNG~v({<#+{!M~2Fe_ZMAl91k&|VoDFxwypUwP-b7zjkxy}e)yH!0f9|& z**E{hFfHu0=U-EnVW;|Ezt8pFd%@>=@qOTnc=N++Sk0^N#kH(=KQFUyvls>blEps6 zP02RJ?xKrWO6X%_bf$l2`BWN*@9^2%)6Pj-?;O9WpG)}{g+`~DOQ-wQ=9`meUjW7MkLIiV z)A+~u?Q!R6wfMDs+I+E_x%l*~U+SH{K7RV_7=q-El<9dGl_%7_Un_A&9mC@b0OW(lAZG4GSj*IBVW#*b|=rz zUNrwWZEx&nPoAxR+A$r*-c5E(xmSs^ zlS+9rf4kNH^wq4M?dOfHgY)Z){aU@$xYjB;bK}G2Zlbh5`1Hr?lh_}ZfMO8SyP0?E zuQt!Mej~H7`5}`#IeT-QXlE;(L1nO8-gk5n#{k`-ML1b@S`TLZ<%do!S19c&BAM zlbBI7hg->5da~WG=aVPzK7VYq_40XPv+;To?`+1d-vNq?+UH8AUinnsZXB#9ck5eU zs>8*D z<<_^h-#-1C{8)K$z4@Y`fB4vV)l3|Je!H9g{Oa^W{psZOn`Egp{P6Vkr_R=wZvM;b zL892in7xC~`yZYrjl5ndWU_B_KvHwUb%d+wHdo;>c;uy*LJ;;yFJgWf7-s@ zjBP!u^|s$`J&(PLUG}zXm!Gqpc(VEeQ0xPy&%?{l+wm{ClS||C@maB4Xlk1;wq9)I z+xyp>Ep$GNk5?P)1ieqK2J zBX^uBRxY=mKi^(&Zy53TvuC##FNRz39z2R4f4ba{_X_XcoPF;6QO!OB6zMmA3_rIo zw`+}Oy)W@f?euv*U)ulhN6e@W2Jy=0^AB2Ma&24`3fW@%S?PBB>u%=RCj(~uA33f0 z8aGJNZ)>*~Z=25xZ=Ox6Z|jreUY%XXUvE7# zPeEwyH|v+hi|x`^^KGYOWDZKNU)69#hOhKjvF^LuL7}#O@g;Yh{Wvh5ACwa3y?iaZ zxxTNx*r+|rch7G>eNJRv8-sPdnm?^Hldse7PL1PI89Q>3EWbUzesz2r*WaEWJn!py ztywNy^bV4*Yg+DXQY(JQoM|75UtgtR?!7&Edwr09YvhlgKYzX6%%J$Kl|P=m+5Mou zJ$Qba$eEdK{mrZ5)~8}~lJA|o{g7>cyiDqYeE!*oH-+u9gX&g#*MQD$?skql*IzdC zfC9wXp!4`%-lG%Ots$G1lUw58PVxLa7^me23DO-7( z{&?|u@JDHV{rNG-1UW)pc_JRc0fd*#B_yw%_c$)-S%k zDzEFe=9m3+J9hdmc``V7cKv02y^%!je0u%7vUzcF&^F^`y;e(}_Ac`A^Ecb2x=|S< zhhJjZ7n{Skv1I$>+t0CA`(GPhKNtJA9}D%*IrH_$P28LM{I&UJaQfw9; zwql=-)5BhKqiEJ^h3aLgmMb>C7~6%7&F#yR{n}Z*{rcUPgWX2q`puXAA1JkAW+(gU zHr{_*{8DWux0*R~|MNl57@pn!QLZKqik0F;Fa56mNk98CIm}%~CC!dp7x4sD8RA4qi8R%|Bw3r*3jTb&0SG&?_s{W9j+H#-I?NJndX(D;r;5 zKmC01skBjRUv`b>l|pr}arS28>qh3h(n)mAUgdk~DypL6bf)|It#P`2TzR|Rd>8ir z+VJedq`khcch>j&Z{K9|&&wZg_2RP^m5Ugj{BBQ5AGW`yd|bXp)_UH2r|HKBji<4T zKN6obJz4p*UHN14-N9C7c)j%pth5f|uV3X0)z5jearyad*eD%;eT}lUyZ)?q3MkOd zx~Oc`YL$BKkCS?oQMCTL5pE2jaj^N?{f#D(sc-M@U#6c|`UmxR?&-T?(|G<4jJ4CZ zU4VFg<^VsxlqgDxW5oj7IDej7kAL{MX?&{HpFY#S^vZ8bZ!bz9;kSx~?aub*`G>0Z zCcb_8s$FfrOQTM0H_~5jcL)9J*PqK~zxwHOZ>zmoO`E;R`kPPH?6Cf|THbvArni}U z`?i+AYPSB!qBTcV=5xa0+sA*Buh+p|doJElBk4E)e0G1s*JrP^=5c-d&Bft* z^ws|B)2%nP_*Pm!sc$2%ysq>&YA0_up{mIriKiPEq9xt(R;?4?LK|E^jpaX8&P6N0 z06JNJ_Hn(|ecE^UCAqGQfI|NG*NY3d6zTZ3OmWcQbvb{Nq_}5N9_xaWO z;o_?{|CIw_5cAe%sfhFlQFvBbfu+LIB+OiN?eDu0RWG(5>ciK|+j2i>n|3=={lMb~ z`#5*4J8rdWaYZ<#zZz)+%#y%vMOH*{1GB|M<{qb1jGxuqqF7jcG@jn{w;W&$?U5Mx zmdr#q``W}}W2ni*s3uE#6J(2I%st1kw#IKD;=jBQbRUrfBPivG50nQ)N^Ih%7Y5To zNC5oqYmV-|#qZv?=zErL@q4hWJyuKGV?V?|X&(O-tO2*^luGcY7YP1uw?_6@6Hv}? zFPL*5H02g2NYA4PXbk`KLF1!PXr8rP1r9|luWNQe<&yxYyg%6ml}`ky6XFAWi&&g6 zAK!a_u#dmExI`fkBqUxy%_H43IzII1`9m+Lv!_RAG}yF7e?2b0ogJoxqtc_rqe70{ z0`7*#0tL_m=yS!b;0YJV6gTuL9_TP?$lztSd+=2HIgx)7$_+X4J2f3)F}PAC4F>p& z&}R<{F&qTXOLoWKvJxE@Fgkk6SA|3@h#Uy6j;z7cBI;jD2Qsw>hSise@RgwpYXqgl zx4*YAk3HK~?l*|fJL7fBZ@8EhQXc>bs^lO@s7{W=w4hQBlwUf~*~wIbk>*%1yH6D! z;9W#KjK0~|$KA21vyUm(w6?~K{bt{Tzqyo@0VSJa_?2V8Y|9;W_4e#x$&5 zWt1EGghqKqqG?lmjKo4x)%o<{G0>EviouZFFQ+r#*k#y zi=ZY94tnN6t#&mX=qg@w0UTxH^;f?Q>F-Sbkh>#nI_YB0LKvzqP#2#+>K*1d-IzGo zi=4~(gv5X|uqg+9Xuo+CU5a=Do*U?l=j_&G)H~HN2RX_c?0aVQzB|H8Bu7IVaV>%@ zHH99Gx2UU<1tkxs73W`=N~Vq~q3ejC`Jx}Qpy4U4Xvr@jq6NPLF;njQ@hmC!W$|UD zepWf(i~skYY{?|$@fM6>xaJa796@O6-?=;}!n%bHYCNT@woHE2mg!uzB{82+Mxx$$ z$hiu&FbI`HdRI3(x9q(J0-hrZsYI8hpzRIry}JM7dovn9wm#7QngCx(0T!i==@L(kDat^dFTY0 zHbJK`(G=2*q2-=>p*aAxqix7rR{79OFs|F+`5gk@>2%UEMatE!nyR%zG$7D{ae_d{ zA3Ocn>Bmk#cKWf?kDY$(^kb(VJN?+{$4)Y43BMWe|FEsnWdm;)hn4Qu6VJ9r z7uWsfc#8MQU`KHISiLNrT%DII^_T4M@KE>zL|8svFTq~2{|9{njwdcP<`3Q*qwe_b z+BOF6Gw#fkzhKGTvg~Qwavybd^eCGneV~-;j!gW)>nvSO_;LQ1?)4cgdB>8&_6-nY zpC#KYY2x)f8-F=%{~O=Px8M<%n{xV)BiiXeCnOgeZZRh$M$S zXtl;(0teR2v8{K|AC(+hH^4aE=>!|^X&8}tEorl2t#*!{nXUT!+s+nC4#X?o67gf> zFZWW-4d>2HIa=^qxwmtpVR!MT@>Y2%uk@5Je^;B8g04^(@#c~wCb7UXbiS55WJEwq zw`ndVHFg{z)DwP{lweoN-`3~f`Iz$WGE={gsl7k@-k+xLCk~zG2@PvtQUsm|v~?a5 zkI9iNb=oN3`^v=NU-ePPyr0-|i(Z*pz;!Tj2S)qw)@&atF9?Hri%U2d^A;fHcOkwG!-L2e9VF_>J^C z3HyJ9xsHLO)S{W04RQ+NyN>TVrvuzxYm*HrJAD)Hjw;^YG*@9G-X zt$0Lt5aI9W3O%C=czKyaL61Xt;;D#V`SyRf{N-}yp8fy+pa0wc;Hla!lq+MK^5cg* z;|ghP(_RDmC~*h$p6>dxSu#o4pKQ&%fdSl@V5to}|GLrDaguMi7?1ICFpK?#Q}RcO zAXEJmdZV4w!%k;~My1&+Je=NgY&?QC7_LI*%|vgsjycRy+$5No`Zqi=M;M$7H!Y|L zj|Kn#+56Y^L~^8I6n&ok4_`$Zp8$gk@S*LhsTyOzM~tz-Zo6uFxe`e1G{+*LT%LD& z-OYCk>k8Jd{eR!jj)SC>G7}%FduHDE`-Yh=L#7mxLZMJ76bDNJ6ITb=WZP|{XaKwa zl!nO)bQ*=_4+FjIA_k&GzY28M?s-Gi8wTW!reha2XsGp_JTobbdB^H^M~rv8OM(hx z>6=dd3&15vjB1L3&fQh>2>-7&Zfa$+dyAHme9RFa4!tC~ZzcYmKKp zzIUM%frzn@q$yED-Pp)W8vG3~;-ZN-@VoeXvES1pc<^65Aem@a@4^2o(&8!%W(t_h zCG#t+NIx}h-1-E+8$hvU&Rh)=FWzrJ0aga~sc(9HQ7rx<4C^2N5L=3srhYd1{AE^A0XFqX-q}liE;| zx?o)(D0En*MAX!c5k`9&q5zBmQKpm8Q~+MH>Q94-{e#&&vjF5B92y0ya%rS~f+Pu| zNJtIlNR9(>R$S~`yw;Eo0qegrRnkV~jC)YGKYIKf{j7WMx!@W; zk6TI=LbK-r<%X z@tVcQXX?rI7dQnORm1P}Coh(eO{hcFj6v(K>3i@gEZpbHhn{MK50;$;CxDgUG0y-R z@zQuSyNuR)L;)otD?W0xZ{3_-n#6Wkz9cYO}gMd`;J>LHT$01DD~`JcNDxg z-goOD-W)LW7nR2lz+je^!Ehojdf7a}{X2;C)ndKyuHp0s7&c>XJbWCyYgE_szhu+a zNqda<(`=A?BF=t74&l5nY#2i6f=Lv@g5Rc&$Knrc`g6k5*Sz_*UUkuKMcjj1@2o1v zwZVO=&L(gk73O*tUW==HacFq$*WkUl7(!%Pr_b)TD8>R7D9{52Kx|=}9BILYrw0tu=7FN6G8Vo4$5C}>^abr1QSq$TES{@n((wU>= z;F_rnha)3*lGSuNXo<)@=Ut!RbW6kqWUu>Js3QWSkaXBO88m^9Ex~;-=+PK&=m!z&!cF!JuwVu4DF2r zmuOHZ!p_k|+D}};Lx$-pC6xy(C3Er%HmiXbv$}`)(E9;&_eeUAB8wy|p4|0ddA7Rt zouloSLnb*5^>Vhxa8yAnsx>(ZIR>!^aSPSk<>1)(2A3tK5~Td`)D$<59Tu=?{)j8W z3Ut-7ll{alb$rf=Op@+15J@6TnxgQjaNUutm9QzA5jO~Jz9hk04~H&b2n!g}jTaDt zfWb@$6v7!}=?c_YQd-dPLlh$-6AN59?KF2(jap7EjkEbAab`VIh<>bTf0x}ta&?G7 zv>Z>|-3Wz~1#6`1Oq9Ve5(rrg<31rL63f8|DEd^dFQ`IdQuNUCr~7JSO}!mE-=-k$ z2oj_Pp~|s+zlE0ltQ=~plmoy7FH1Fyu8#_JQBpLl5vaa&B~@W(#oI!d3zU5{55>(3 z2jOcnvM%q0KeOLCf2GKeEl)%h_(F_z+pvvB6IGK5v$M$>9vJgU|k zg-WGB5s2SOsx>J}##ljBBFJWpo+rHKsz1TV`oINy=q-Rzb3vwEvr1$8&cAw$D?}A( z%Zm%u;gDgF7hBr|wT8hH#gkv~hTtCglD6A5Q3u=QfuZ2pc?#Tj%2Ke1TGV0LT=@rZ zG)8}i+v34qIL+a3!e#sn&q#5|E97dP&GD$B8mTk*K87~%JR#u!f0fSS=l)+B_HB3Y z?ojxaVNWh_^#gWBtZ0UQVwg#nIUGLG;;@sz11N%JHqbUCW+1eES%t;^Bj5iKG?3s*+n^2piEd{zY ztI$E%_>h(dou*)VP2_Wnf?QfKJ=0&=C0*yMaO z&te}6>0kn{ZyFDE}#Ako+;Qb#%_~nV!Qjt%ImRBI87%xF?BBL~5xvw8T7sumX)>LIWwkOWK8_IXk?z-S2K270DvYj3G)$VG=2TmKz=f zY+uZWE!97PX*dAcK_LP7=wv*6@;JCC^;;5$bi0kCb@sbD?rcTnCga6<5?oyO9M7LN zK?Gw?u?dv=!2Sr9l+IOWXfixG8^RsJgcfj)xDkR`0#J>AfsrQ_X2;AYY$8NBl+Zat zOqpZ|Yw9ql?T!3Mnil}1f=(Df1Mi?Yu^nRISmx9mzLoZ)$02hwG5|3ILb_LSImWH5 z_YB$oQC3tZhg}w~M?fmDG2#&9{;k%t?21~*igl*712BRST5VZlO`%CjJ8iRo&)zu& zgTG^A#s<8WN1sK1;BbWaAt&XvqnA|R`J)Zan3^s*bXqJJZka_UHJnDUvaH~GQX*sd zz!!%=n3;@xQ32Q($`ihL&~yyW(ng*tWLC8{|CbO){8eHHN8kiTAX8KbIfhT7ykapi z8DKN6;WVu{u#BfXV**}Hc?Onr?7)H%$WepSWXA$D2J7<(cpIfulboSuw=sY-F+G04 zOqbl_FySMzLG_X;)n9wAr=gV2dh(bz5i3p$^f|yp)gtu%--mz=z>mZot2S1UZ%ukm z(%w7dY9Y6CI z?=U1U&;}{dsC6N2up5`>9zLPimVm9oSE2fe2? z#pBc|(7`k*C_7`SCaI$F4;w=N%f6XXJ`?8=y;15}^?ek)H>&S-5N~!=&gG1ZOu=+aZ*yA1fWy&V zYnA{$+iwj+*qiG6)C|ux>f>zJHS9##cMU_@M>?;;i-7kU$NpGwI|GcMaC>|DYx&}& zetSEoM{PJIZMMkQsh*zIaT>hfRD@H46E6atgwnZ!HQUc*W^V660hnkw}nImV&{NLdN^c1Vu303rJ$yHhTUpe+;tVjo7f z2l8#5?l=+`C>x}BxcEJ7@e_WH-zju~s5-$1o~X2EV`4$S%9RWJuCJ=#?nMKs359qA zPGxwSw<79$I7?Q8;_;51JJ;iTmx+Y|dFR-vJSO4`*PJnK4~G;HA|`%asT{1_XoIm& zISv^cmTVt?s@#X7+}d~Rqg6RQa3-gF_W01D*+^P{`HM&-DvM!AdR4^-qCtiN07VjR zf`@ce;%ti;m)9sfuLquIckx(dXt(|PT4|Aq6M^`NQZaTtrJ9v6Vu%%4tqx4U;c5)r zd;^_5gx=EksHS3v71%Z--w0@o3xFeM8D})%Ppz2iq?OWv_;bqB>QAYfPL=E=c36+< zVcIfABD(cE^-JZA6@ljyqMJ!Szh#&_siQBFb~-?Uava)IpAg@MWI|ge z{5r76V!$pt0$%J4HshKI`J<>BhK%kr%x`nq^QaLtuqjF{eMKB4l;AGRonNt1hx z;Xx1Nz+PfmZWDg}qy!u&sdkBoqGtDk-R7l17?0@ePfbr=Vskb!`SlD`B4qg}G(i!a zlx6?rNc|bK%~}YGuV@H*bWLbn>zrr~v46GR(U;cFGZ@`{5MQq`kt+h%}5u z+%$3cI5_$bGRj~>jEStiC;E7FE`K%`<@^kInoNRx~XjV;UHoTx4tdnk&;TG&d(85{;5 zT&V}xoKZqNP$jIA`~6V=aitJ|Z!igaHfz081oT0?xeC7V>&aeWo*#*a%qKpEWi0#%%^gB7?PsX-Qa`y97O49ZxVhk4po?0L_1-r zaVT(5pz1vOFBQDt3*7SjT4K+$mY4k=1UEulT=cncB>&NN4*wyv)UjdXF`ptk0;ZSWRY^4#>Nty z1XRMLT=l9&Q7(2lz5np>3K{>x0az-R! zbHuxn>tRYRgA)DK5GMR!r2ty=JydSATIZtnQ#qoa*-jM~Q48_vtkd~mJUNt4mlc6CZoG`}??G8!cpxXppiQ^HQ$|ozhv(0KGau*U+;Hlq~UOzi?c(kefCAj@k z-NR7ZR5-k8zA!}I$@CG@lUa>KZOvREJiNo;@Zh)S5VaV~1k1r1fPbUuOJ84BLYJ1c z^);8V)Jjd6r+ELlxrB-GP|-Q~4v(+^d~?TamEj-lsQ^Cq5;<7YS{Z+#X%E-#ZLc`& z4aestb%ZPNmWNI7_Ya}xIK+bzKQ|I#ig$bNq&S=!XLGL3`Y>Vc3d>9$&l#Y_>)wAP z;i!pWSRw(K02w?lDhwiG>plkzb=2sjcFe4^G?GYh1If&%J6|eh)+2|6ey-q z-^TpiRYKMGBCRQN+BM=#8S1q}imRAJL>s0qWX#a~g>;78#0yHkh;Gc#@@Zm%kn(3y z>hA`xleb^T(?J*QTFV%=o6Q(d5@fri@AlY5D|RU(Y8K#RZ*^+7-ksKdyIPg5L>RFBn!FlJa4Dbl^z!HtL*pTl>O{Mz;0m5Q_jE zpuwNfqW&81g z$dW_Iq&3pE-R9q&@zDA~e*!zN0EYI=5uoz`BmF5$k*kwhI7|w>$6^=7_fZ&!hlUc<-w=!=pKn5YXjI@uXPV(-9vA0{*spQ4H;@= zvvAgtU8TfAXlV%#owm{I)XZ+HhRsnv(<=psW=+CDi+$OV!4%z({rnc12>1~K~az-uuvgobp7o)vv(*lF8O0|&;O zfU!)`EFYeJhZAmUGD=(8v%jMaacc5+1xn+vH2Gp5!x4%tf%M{@mC2(Lbug5x*nG=| z(VV27LVdZOTJ9LbldPcGSLB{q_Wf|!^?b%mLkjl5N+?x1a}ZWG)a6fWfy$Rw_AauC)e} zagPeEwLJQZ#-FGrBJR7)h!A*qsbUT*iiW9T@}2mlSb5B>>JE#XAcwD;25v99(1p{f zPVxR$phGH^f*mQMHTuVhU;|3kjOecI6+v1V4||L%R!_1%O<>n7AM6g_`h+Xs1G(2g zH3N51TZu$-B9%hZ|b#m zwjSBmmN6oo%SIOeMKA7i(vWi5sI)CB1=wC>3p>BbsTEV5HE&s1!U)Z6aFdh#hZ%IQ z4bq7E>4k2wA_Wh@0jM%Av`2eX*hol%6B=KSRJ_rG3;rWYaa{tXS!L~}GWtuC9WlQKZ~wQ7>|so%XVQyt z(0DV+n8y?xB+KVK4DKy@!lQnYdn*#Px?wWXx-I(ovvd@ccwT+Zdo4YMPLgjyM6hxKdjpNXWwfu-5x;o< z;+J_=JN&BqmN2Zh>xF;ver0{*KRV%AI^h82`_w)84r{FSLH|7!4}Sj;s!J=xudFO1 zWKnVH5viA;!;*eA^2)YSa30m@>!sSL+HV&KgSSX;6|tgvp>N^;R;eWt!TR3% z!j`Yq|L?GsDg|SJtG{~7dEJE{Cee6?kK^lSSUA0Yo_p&M-paVK?wc?2cGi8SZN*B} zi?x=OvEZ-B<*YIUiF070l{DD;_BL|#!f4cU1S`d03{kvWZr!I8rB8+^g38BkpK=u6 zJC9!4D%s;nALjcW!1a309dL%tcRM*z+rJNc!Hu3gf?szdHPf*^+HXJd0_(uRaB7nX zKYR{?7QO}>4trY1=lmQ!EURc~B0&I+Z{MJ%?i zJ&)m|#u>bg#WwWk#r=JYXc7aAE$uK zE)JZD{GI^%!SBhCa4%kbkW!_vy(|pcvQ8Rf18irrN$Zo9)m5ztoF;-wJG8Rw6mJ2s z>Yele*n=9FBL&|SWGLIjB)Vr>x73&>@(X&`bL-*z9N2sC<=*fIk)y7qsS2bNI6_NAGVq-P9k>~w&Qsb$@9*RasD z_n3h)RRD=eC^DpbOuKoJ^JRDpdgfig2XEvrroKb6`ZhE>@owzJ%E zQUd7=@*}_`3T09}r(Gn>=*wfzrpgqREtaaLQ zxACXfT3%*~e6E_9cE6^0poktu(m^i+qPJ7K)hO2F7!c@Rl_Mz6G6tT(OL>q(Q9ey5 zIwE|h)%?LX@1k9E#(mun25<|gS21#!ywg@L8SveR6){ABY=c{l@K_NFE{*==@`O=w zUL*>R$B9UTvn2*Li#%3WKSaGZ=?fduX(oxm4Vq0#mMV&hX7qhKBiyhl=neA^#Oc{| ze6eqGjiI!uFlR3fgo1?K4~FgnAGLV1_Fri>J?Zu$V3c+reBP~ zj2UeVA-nd&AB3@I{gFZR|D-{{@dd4q)32EfV7Vy;CYw^Q$8#$0L3T%KB> zZ*bzGM(89k=Lq2_PjCx*~^naaw*pURoh}89*Dkn2aU>MsMof;~2%< z99|B3;bDlF0j!G&zB9Bb<`z0``I-!!i^yqVHsZ$t5Uk+i3|4@XAlLw#SOz)41lL@M z9S~|MoKX1y=mm85{;3F_-hQICK-69$wscuSTeO?_`)B!DE1*HKmW|pi(xB0EBDgx>odgS z53~%Nt_VyNx!z2|_-{7RN`w5`IStM$l7^Vr*R71`IsX$@$G?P7Ozio3c1bXAS|fA% zZ7(DBkPb`QnxpnE9Nfhu$l9A2j)DL<)qn-iTKjK6i*z|*Fq~HnUhNu^L=A+VUjHAA zQNG#vLn!^5RUN`%@eu>r2cjCh=B`!wa?QSPRYhjsx%x$(y>|^kdgI-zs{dx6WaURG z-SCDW#?A>9MrJNxMuWGnXi7sSG#AbtB^?yGZA=T7qTO@hlr(T{5klexYnltE?c)7^ zbE?vLp`RjZcvyPECrvmt^NnzyvrCMeaUavlQ9?J2;ooLxsDFKLB|zL4wRPaw0ilki zTmchzj8}$oj6j_(x5uzVDp$^`mdGaqu>9mB)H~NvX$?5m=MYoIz-tBuBH&>728<(iKpoOE}urqnYF~WHr&JiORW0OG6Mc5Ph*iKt}&bSLAD5nm` zASI}Mrv47c-pYzN&oPwturTVWqZPzbbzE_F7RTirWp<1$jJ!%}Dab9Pud|iVxMcq2Pu#Qe^m7{WrVF8GX zLbY*JuBWY|YO!)zI;tL|Rn^MT=~097uBD;bvaG9Bv(EMz(rNjkcnHr5dqkSAG>(dwmBNKpyS%8uZlo>L*luDW>9dniHT$dJp;S)JPa7|NV5n5acgYY&$Hz?%v00J9UTY-|AKXd?3^0b!4T zC%8?wCl)3p&;yDUt808`58S`|27?^dL2(C%M}|sbPT}QE>3&J}NF=1?Vwl5B!wQnZ zQ59yt(6EYURX7S1j;f8cMwY_&J59VUZBe$$r?k)L)XH`Oh?R`QwbnKAQL3+oejs=X*3 zUEG$+^ePt11zw0cu~>dixAlpc#(H%9DIDUYHBi8ukBT((0z!2DFRpFfez1PG>cZ6V zOKwX#%*ozd6)H!ilkyGul*AHf42eFb|DZ29`6VyEtmBuzkq{iS=*fnBwJE=B$uGZ9 z@)51EI-K9Atz6pb=ApUyW~)C+h@b*Ve5}6bm76RLB$-T_sFLHHlY01A3}30+q*#ot zBk6&GwO9%hs^fFO3@2f_J#n5)#8|b&k7VqJ(Wa%h$@o|I#MGqffbh2mS{qH#VOvH` z2+W=qMu7n&QtrU4;TI4v(V{l;y#PSba{~pU+VS4hEm)qtr`OdG{S@h~v^pBDBijIy zA$_IU^T?KfK=ihN$$(%#ZH9gHpM}C9Iki-3USM(5PhbhxVfo@|@f7oc0tDq*{(aK| zVs6~j%2-PA3*Aas2p+d>r#Zd5g&oY1EpSK?;K%SMPzjEd4p$SzP!pkqLl)MFlx#p! z8WfElD%JIq6-DG60-hwta$DTr+uG2%mhtwC-sWF(D!p?ilwh*`oE@-MX!gleFZAr$ zGy>WiPp2A$H`@oVXM;{1Itths!X1sI*bZ%P7@LhiH#*5*!l|=p!|@jH$6|VvnJ(pB zEmh7Aj!LmuW+S_;PgR#Lo(h#Rh{fV{xboS_5lC~!&LrLx;Y7#p!nIJfA?jsAFRxs$ z_Q-E{LNE8ns_JIw<Hs0)OZ%UMp5>Qt{Gk(UXAzPqq_g_-G`|h1OhQh)?Nzsxv#_)*m ze2@vtK);+AKop6^YRp~ncU}fs70NDvY#kk1+0C`=`r6Lcd#hF}S}4<|F&VhbHjC%& z%UX@@h#i}hVF(N)8Ibv)36$SN=%LeL+wSeVJ(vxw5xZ+V4w0PvM}DkeQ3VMLi@?iR z?2gFu?4&svn1$!`07tNlDN-qgNK+LOmdY|@^`H2=G;zaZzSW^+TEc*!0_Ol*K%~E@ zhLjZ~`tTutr^g(Z7y-yQuybrtQNms)tOQRc-MRYBa)W7WSvDcQGGH`t6#y;XKx@vR z4pLUaT2EW+;u#I?0u8b#2A*Fh4O|fagK|V2D7@qCsy(pIPGrhq7T0?$m3IIXA0mFA zflOuotxs6OQiHSF@HcIhzr#|4K42E+l=GeRTf!g~dv^%EP)JsFW6t+U3BG>NQ13at zI!Z`r$Ee08M=Cxqiq-9jj;hKOk-cubDAq1@C^z5gEmCMQ=Af<>(k2WqM3u;a< z+VQ>HbKcy6tfj6JVrofzG{(-07P__PcS|6W45`I5{fZnIfwDcOPGB^vu)6&@ZP-oq zf_Jg^@)hMY;;qO^0BH*=sd{2u` zm55wk6=%ZR2(u4?1MFg7j9%p7ey>OvYV8XPMY2+QbXGWJv`QG?ah+Z}4NDiJ8iMo- zyBaag|K+C=_URV+MMAQ5$LS`Cev_F`PTQUABP6`Q3dmYk25FC04KEGJ;K;5f6$x(w zXNbe(nk-2)c;HOT>5z6*AevDSZlo#ILYbnYzYM>uw*44}t?wN*;FY;9ec6v#vca6i z`j9!-(U8)`j)nWgz2Jg^0j8G)`{!Mewulcr*GG7+LT3Cz->zQUHD-uo$HxAJdq*?- z5?jVy0K~>5_Ym&~Ryd-XZ8dFR79+dmSPB2D;Ki6B8iyj(im;X1oeuU%=o%fyn=Q<% z)%=3kcR%$|-WoV8Yr+PMQ(;!EF>_kH)Dn)7Ak$bpL9c@0id=NQ7-F|jR)Ec^ z_v8cnc`Bj&h-W9fSMgT$!RRC&9bl#?Efe<=X9@?!jh^0({qoOlZeb2JmodV+2muO% z0_&X$$V?%j6Ng9po~QDA+UnUm?dVy4SFJ%Zi0q` zx>pbmsXa{eZ2c8>_V*Uxo+r$Z2oz9HWw8yDh%REimPBSz!OzV0Pa{U=YJy!x7D}$s zg=vq`fD985qmNs;<)Wp~ZT)jBm(}zXv7>6efltlH)p+;6OB zI<>%$bZ}v-V|y%y`vT1TccWutPFzJJouU@}i^TbFALD<^#>L!zk=K{niK$Bg+X{IQLsJZTa-;!w@z6rOjjbc~*}5XcU9x7X3m} z95dVV8G1G?PCS~w=B!$(mwqL=ZJTN+cGuJ`H|!qioGcltlx~M5?jy8Jx(ivP63Thh zbX5pCVU+T%-GeGA19C`RiX^t3{75+Qvepne3FVvM zqeX~#5qeEq(`-g7Dk<%B2A9i=>Pe*bNbD$eIGY3Vw}d>|oAVpS730gDFkciom*9}e z900#46J63AY4%;rJ>c*m&bK6rdh!tDOOxDPNj-lY5wVzdxDKxz7`#yDB?XzdievoF zDv^W|(C1CP1`14}SMnCa(&cny!b&$10Fq>+v4%v@Iavuf?Z3vf!c1%xW*{n|&?1F|Hy}#M6%mNy5+tO}hov-e5T?zI%7m^3Kd416Xq6T@zt;Gn zT0#gVAP@SALw4qoGLDc|3}Ku-8($U3kMm7DbLmU(pSkbl_s?JT8ZaVmdGpWR@>1ou zUhr;g|0ihQ%nWG4BzuH@>JI93Zf{FjyZ|rYU8;;XR@k%>n3{lgD+-R&W+F~mIM-`E z%ic^|?JUEUq58tWL0%|j6W9bwMI?jMBLn(|^Gi-b9}Gt(Ozn!kkQIX#xejm{wWi}S zYI45YKq`n)6Bho0zFLoLPW5WP{PS>>LtcQpcr_WwzdWCw>Prddm4sbcUINe zQ?7-^vto`CmfG;{L-H!?E`$>|ev~b%W9EW+a5doW~JS_6F0? z!y5bQhMseX%J9=RtoDef?l2;!l!)7P-6KQ=lSOe90+lLCOGSmG6e#?*^i+Z0c}9_S_EY%uy{Klk6NLL%|}n`tD#l zkzr|snJ%dr(-=(^une*>eD&n_nR?7Lt1hvOQeVQefXdRZjxz$Q_)C6Ms-vOH};%cG`VfLBfFR2`JIYC zK86`lTBHH|7u`?TcYqW)!e0P}VOwI3CgUf*CZDt@bi;JS7lop>D95**kB)_%V|$o2 zs{vK<_CMn}15^`zcQ}GjTGWMR2UGx66{?6g^!tNZtkB9vnxFx#0!#ugU{H1H9P(8h z%s_NDZ8eAeCWhX%+@RTc$U?jeeg1A}#EHbml6eqe4^b=f^np8Cmu>h9n+lxsn8nT9Z4+E)N11;+kwml>ODgeGw=C7iZUTM!00rhl_Q;b_Wj!Q%~5U z^<@*{4;ks8;l^Y-Qfr;AQ_zxN2y~@7tT+ML!~!Mg>z8)aHG2J#8J^PCh{`xs2{FI z@%K36Sk{Era|V7oJoufQg;feOg1UAfU9{PACbN(mE*bw|$c0hZZlWJxLLxwJ!)eR- z&b{;>C6ff$lbII98?um*hYo*17JXYg5G*uO$GZ-wqER@0IBHNhygi9(LFbYriz;%H z$Im;p>|DOS#Hc`NX*ooON@xuSxa(Wm+LA&~_BYGO4~Oj}E%X3BDBsq8{UBOlyh(zv z5-R(l5UY~bs+CKotz{)lf#}AGNnTZ5uezzKirPpbc*wYI_1s$!B-#m4)SoK><^{Qk z2`+-34CwI>fdht67&95g?%+UU{SbBolIi>MGW;K2zMl*D99asW3?wCH4Q75a9zI1% zkO5hyg=`5$LfG(bu~FlP4e0!XXxB6@<^eGeJ?3g@`#{#c?!2-*2bi#MrI2gl2mpLW9T3 zj+nJAG=tO;abU&p_D9tNQDQ?cQ7Kms8i&@|zI9rz*9!+_t5j$dXd^tU70*g#(KRl8 z(kNdyj3->k;?LiVR|H6XK1shiSi}jE;K}k8PuoeO+8TXCt#<|rIux`J5$NeCW&dt8 zfb{z4W$g@x)4TgL%lBwXJ;9rniKj;|ofEM!1_NQ8!7>s?esu<49|LmS_B_t_#puqIkeeVlJovz)zqFq#`(ob}f}Vjg_ z?j{vJw=hy)b>I(Mf(h0$b>$>f_(yFaWXx#tw0>|4OT+2|QbNah{)Wb-Y@duTF zk@3k(4skAY;!ll6Dr36NX{-@jst7jCs{Q_mgYZpSBa9yb9NtQ4-(?HzvPya$Qi7Fl z_X|fAIZpD=pIDr}rzc~4Mr#vprDo&A$P|Qc=+_MOh@2!m1}1pyu#pOEB=Xsf?W8ye z(WVDoWps^5Jnm*bNyl!vQBTH$mbTH4MrrG$P&y^W9>$(iKaM_^lM>eIN8@?ugoDB0 zpFiR#?F8WLyE~kEz&Hf5S&uDuQI?TgVv%@>rFHxzg>*i>;(5h5{fOsBv(A&VPrdvG(Pj|;jI(gjN3W72B(3U_kR*!V zgVRR2!EM-aX|a&jhbQULg*}8cJ~nH*MZ^wtNF**U<=M82p*Tq5>32~B_C1jd>UZW7 z#==thl(dzXtU72MSj5C%2`MlJivghrM@cL4w0t^au-fXz8OB&aWT5lW`eifc^E%$} zC~iymtgs)_t*AIkQX9hR6;U2HZVc!vT?lB4Z#olXK##UifxQ!W?Rz}Ks#fA=01YvRQoCd(@k`7iA|TRin$y@P z{l>D2s8Ib9q-sf7a_zifm}38s16`)hrL7HZeAsDUf|c52S;MF5ZLN;3ZVJ|T5t%5b z#b=!5nFerGk|=v?j}k~MC>}{J&PjMl{e`!*h1%^!`P}MzcZv*r^^Vq;k>8)>2c4)C z0g1-d*+4*IlQ>KalSrTmv8*JBRzHU5dntWVn4@gq_1%dS{`3PZUJ}sRP(0K(L6T*e zM?tqTrfmDubS{CUEeT(nn=Z#F3HCHV_AwqTPLb_(Z-Lh(2*GlCH0Gydxp_oalql0U zIz5w<(ZC#(Qx&NFc}cD&92IAv@1Knzikaukz)*;}cXSV7^69j#o3l%d#va()czcpl z|H(XsBxS0dc{eqd!mN_FBd1{l~*4aP06 z=}h58PM6^Ns!LE?2j+KrnW!RaQ&99Wm<;cG3Hp@`i@*5!Jqq_yENwfan&Xg%w9!YP zUbcnAJ#Mp9py4yHNBR_^i2=TF5GfF(tz}dKL`!h88(3n^9*u6rRu`Irjb!Y&VluVV1o%T%Z`{Eo85-E@#-WijD)CiU zr7}{Dgc4t4GH-a{CDdbCjxLyG$BdUK*nhNsu6sdV4V3d<9klbWtMp3<# zwkOJi4Hy1s}tw>uzH%eGZ_Pz_hHYf zAHp70!t;I0rohJ(-&h>jWo(F^%gr<~3#%(lG%W#22AEY_Od8jiJpi8QdP>2(rk6Hk z50@fS!@6yo#-Fu|v%SJz8Z$cGI? z{uW>I{uYnx#s6=I!}fc>+9LdiTnH`BuIU6x^uq@&O%rkwigQHi@Hj#SnQgg)7I`sJ2_ad~ zKOD_U=bt!KOrs#dl78s&0*-)%Qu*TI?BYEWR0N&IOu{g#!#SjUcG>v3%Gh@4tXh7y zHgf~>Hp3Ve>cKru?50^#DZu-wn)a3^VpS%9~>P!?Q1lL<@)#*c1Z>s$$c?hrngY?CbH~ZQYaNTAGI2 zA{E_0WNu)lYwTpyO*HEh0jg1)9|cZFQyZ z0&`M~FW+yvchlk2^8=7S44pM(5ce=={kC6}@QS?=J5x`KlTF@N5y+Q9Cfcygz6G9f z1I!Owyl2vnNq?m5vq8KSR@v~)Fvq4{S6ux;4R*0kThCThe2xrTMjSh#bw6eRE4wSc z*;i|{x{5)K{+3-~dX;S{B^A^#;0ha2u0EBvni9b5R@YwDs=(kVEr%7+CYA{_sp|7| zP>T{pdQ6qT>XNECO&}9{s-cnN*iVAGFEpn*85N4fc3rN+{T@C6lRmAEqP963&3B$I^`-fd3BbWb!@u^zZ1KJNdhuE{4cAr6_gauUk(A1|@kCvX)D~zWeb;$!&@|dDAZ~dB#O&2 zVCEmz;TaI=-c6%?dv*ca_6KD4ByIe|+6#aPngQa-aU8-RuIo1{*N!{5qa6{+z*9Ee zoGe>6#-7yz${eI#=z~D!j(Q|tY-_i;DjwSBGvdpbd8%^$8_LGTg9Z@Y~Ba2KFsTF{TAG~B&QW zk@=9_WA=lInVc0&88f!Mdrow`wVlmo(`c%K(+De7Uz6DWsMT!UimrzO|0i*Cihjtq zyrjLR?kc>5%Nt|M>9#^j2Pr^En;{y%@T6&x&*XIEb5BWP-biPkq`ef1Jdqe!$lFXJ zVNpa{Mktv;Mr~^pK?2#k+(#{7Y$Lm~rC7AME*A$9!y8U|cS@-GsWVd1<9jDUd+u=5 zwAh_eZr}&b1l?xo2*e(j{ilF!2fKJm`A%9rp_NjJJY*B`zm3-1(I}4B23%I1``Sah z=Zq%_%`J+$jpao`@b}hI8>)KpxCTrFS4UO`)sbf?*&qF&#pd}*H9c-eTI|bw<`kW=8*+z5*08wb9FWzXUpSpA z86Yr$_+7)WvfOV*71Jg>sqM+=kqLIg>0+bHX!J*@*8LJ9=OGp*6x5A1*Wh`bekwXQ zrtD0nt@mxK%_)1`a0)GS+C*T%c|ej}15w&-yOXE=o_&YI6{@%^is11N`LjUHM*^7k zMh(5rM{6rfc2T|x?}d5{9CvZ5mwRtF@qRA*e(VUVyGQ_-wh`pAK;zlSvWCVlS{3+A zJz*6XZ7vvDkDM7rbJ0Db5(02^i8hek{@A{oSpeszF{~hKo>c_qV2bHGW)>Jy8lU38 z@5bwBKIRj>45J7;0cBMW-p|a4&1)l1n|!y znJUm3MeIbLH*BGgwaE49-+O`JKYp4sG*b%L&u{E%TZ`BzHH0YU7m{jq?vGvhL%fP1 zL^7*qc~!8U#;j)ZD$V@oXLcjCF$9>7=kFE)CV%08Sm1B_uiv*&R=FEc&PhLy^UO_4 zY4d~f4+{p-ce@egLgcT6o$PGkRbIm=Le*tZbvN~Pa!skY9;Q$BOw0Esnnmiv#7Gtk@F}P6y2aVGoRey1?%-c0u{iE`b6b4mW@BlpqX!K-VH)j7l@N~sL&&w6!B7By_iA!^dg%0i56a zqv%xiGt40XAN)EmRia z=d|v=r4n~4R6`n>hN|SXcCxcdFwpGFd>dCGQpU?tMd-dA&!6}3AH_sa)TMY6rN6{7 z27{6+0Ez&CZ{JN!gVU(fW`v9q;NhwP;d zB7RU`ZA-3DCY#`v7EN6891ztFLp2b=BLsvGF9C?;3S3#c!Fz2-W&nAi1IFm3Hsp70 zZvN2L7PV`lw&&=~e}pO%UkSC>$ zv@u98UTF>_UkF;wc&Pg2%K(lt6*#uYW~_u-+`%Os%?r%co=}yNA~vbIy94xMig*;H zf_s=X!-MgK+0o_dAU84BFv)w&Si}n}z?mZqKt5_#JG#Ut7L6QtsP*}ea2zX-acx^- z?AkG5c2ml}DBPId)=WksM+g!(Wj`Z25PMi;)7lOva+J|D*=^my90Q;EwWBw_$POEv z@`Czedx{?0BHRJTJ6N-DO6AQao23ZjPc-roK zWwfOFAgMCcF^+Ms}`Zs>TZzxTTuunVQ{31M*% zHXfCRP>P7z-_f_qi*O(oFOz(&rfv!}11%{G#(a;A2n%;?OWBP}pgye&&M12550G%} z8^4)0v|9d~XglffoccGsbHW4*&UjjE2X?y4!lPggEl~+gLxxsc5CS<#pw?*I zQtwp-LDp+AjJ6^px^OjHzs*Mgc(*A6jR`FjU79=NzB|B6^?)r@${&Hu57S1GM7$ig z0#;7w1K$=*TNs$2aKUkH0{a!ka>o?w!hkl_rd#8bx4KI8#c$o%N1AquOf~Ijtc#d^ zb1FD4E_WV?muAfhMLMuO)3V3PiYp>4NIU{ofv~)j@j(S_dH(|=lXf|6Z3Rkc*Ha6i zl^;RP1Y+!i_PZ^)8=|RGGN6x-OEwm=P_3!}%_6D@>@^b(V+MH6znLG~1T|x1zq1Ej1eLH-0 zJ&rbv#;r4kxKidL7-B|5$BB2Hr#Q73m&Q+V4Ycpa%huPp4ImWhRENWZhUYSVOm@== z;E3b@xP7;0(;5|%;@KSsCdK*Daz=iZLKqvRje$*y^ZDTfNSiEsd^hc*J+j|Zg{qE? zq7SOeRDd5H9io3WIY&S-kn%<&hm1YN`A?dc!2B0_-jD-9Q4r$RuqQbhgAsP$06!jx zNgPjGe7nuIpuU6J8qm7dI>QMXX&IH#@?q^huA>s?gAp#UFDMEG($0IW943keZgXXi zT~rvxVw97V-(kpfc$X0$@lC6oBZ7{_0wbgBVg@b*8q8XuRrQaUv?HWlX4IQ{d}lHz zBWuAYU}+YM5f2}ZQL=K;miN(W3I!}TCn9CVVlClSq{mwF*MJJR#I-&~eXOQ)2W?0z ztH?6iXHK&MR=tpY(0ifQHkXw}+yP1RfwvNUh-~Box0`(ct2lxMi>K!bbzq=v<`EzT zxq~(23~Syk{)s8xaa7apra}l*Edq4FxZbE#KjH$BvlYwe70`@+>}R1x0VOa|*}r@o z{N>{>mS}EdlMOZ-ASs)q7^)xyyM-nabczb`ujETJ33KUa_HwV9$>#%o!I;7yU>rSV zuQn^97oLkkAIwsU9`I;4n+A$NQ^fIb*cYK|0Llv=K5WceV1nH=&Q1 zN*Tj|!Uv+y@S+6QAGF_%Ti?fi3?ZEmXzZHU5R$tw%|Ljr z(~;Qot+gz}CQZjuTE~D^A!1Nr?IC_ts*_;Yv9y)?_F+!O*P@X1s)#5fx##VORRL^I zt*>x;YC_g|l=+(NwQn`!);HQt<3|t6a3^vH%ls~6I?0DtJ&75*iB+ zz>vw3F%mu1M{km*!_L@J7+@bsQ9wZSk9fe2~w|xC0xqw9PCWMG*~V-6Ws#E@|38H|A5(#70@OA2mLW2H2 z8Wl!~s6KeZ>A0ohuFdR8q-jZ1mm&*B_bs~U436Q;BTWuG%E6IXE|I4gCE|drf7bOY zPhp;WRzADF&7Q|r;Bnzz7TZl}mUV3m1ZG+xp%nzM1s`U|RyzY8!d zXGa^LkxOwVmsH&fb1ln|`aZ~#bm{S?-pTzf7Mm5fO*lB~oiSPG}cPbFqexO zWyDCM2Wl=wEcxP6ghJ0QMR@iU+Zl+B~ew{$iwgKSCSpkzg8c9PU47d;y%kJ56>BY=@J>9-XQIux8sp|YUhmQ4pQp+rdOHuDjXp5-Q}Z96^` z+G0^JqoNYXX%OlqabH7h&m#c}3!zlaIkp%Kde?$n9ij-DmRn_4fPMi=w$z>{lmy_b zriFNm8Mc$}0?(3GN}I93%gC+J*GSEtsoS79po=c)kgW0(@!E)sNjH{nX$#3x3qYkE zA2f%R*#W5VoGYgkLt3>ldN_It z>7!Srb4iX(Y0A~&#Z9eY(1p~+egmSwWACcvi-8gzT@y*wA^CUAxFXVHIwdh26pl=2 zS80tB3823JZY#sy6~nLWe3YL>R$ceNdaOWUC&|7HeamDyFXpkC~FdD;_w%MF^()rT5yzWwD9Bdx&_X5 z)3F>-p8_7mVG>ADZC=#~6yb?JQmK;Q+L=!>a1xHSgV&o)Scobz{0Po?Krs{!yl1ya z&cY7r1FAdB@j7@T6Bo;Ktrb_AXZYKsz~K^lMD z+ih{xB0@@t7_RK#{s=V&J#iPo`NmWq*R1+5jU{9rvay5OahdI9!0{aXs~n$A$VU8` zmVR-fC%#Cmy;EINB6X=QUm?5v8MPMFlJ|R9nwZwy*gL z%=aHwb#a2(af`I#>?>?zm^sRbAnyZ7XM{drcT;<8!-7J-JkWM3w$ppGN4I?47mD>C z)_u{Fw$q!~x05$3!(vLF{0Qh4mKJnVF%b8Mk~=GTAly4mL?*4!d^j!u2H;MCL;wdP zc)P9(&|+Wr(+e0f%i7u+y7Y!~ax%0JfoPe~0T9is|C`$ha@SWjOOR+J%N7F)sI+uA zK05fa-S0YT6=x{9Oj&ZI#Xj_<%1HT9cF%8B?~5iPbGm0kQO5H;LyIQ*Ou`QbbF#(# zr~v5=k^gY$#5;6Ah8CL*k;zJ2o7^{dIiKRHNg2Q#@eaWhm0 z5dYYbw)`-bzC<_e`%tD{I8m1E$zw^>se~1WygvFi2v)3YG_C?}t!D3!xvHpQ;!IK3yL-=Mto21+)BDly-_ej@zt74#jhr6@fD zV5HU~qL>_Y*B#MKm4Ob5z#49LHMEHQM?QI5tKnm(1g3N^ensOIYDlB%%Pj`$&020+ zt)E$K7~btYzYo+p@^ zj17$Rl*w3pH#{MM-8ZeAMNhMo+WvS@SNeil8-}DtB&RtYoOZqE+;QwMMsk}74X@pM zw4c1_{wgqm?M^<&%`O=H->~E++0U?&o6=yg zvRiYr^!Qp2v!a8q(cg=+OZ0e0a=_ebaKQZZjRV$Y7kj2U-7oXJTKzd~x}ZuXM|u5Z zs<7nAU3tO2c&#kX6&RqW=_Tk=F(G6Rb-5fdd~;<=AfK#a<*ayeTR$oP8fGE*bcWDJ zUK3-ElOx9G>zEOlsF=YBsbg`r_N!t_0N{q=x?aYP?YnpPBB{3uSk&ram_|)W?bxk* zUY!_jb@({YTcxncQXb~8kABSwf(Pd3Jq=p-E?kYyC zXbzX>*$J_%S$b(dS}*^u&~L-A&M>j2{O1@=bWW;w0tP|~p4?$E05C;nn+tgc3KapC zIKp&Gsqth`=Vww6K`>}Liq=fnB80@8biqvMFcP5_lGg0pXR?%*`7AQEE$ShliN+8^ zN+jg?VD@FpX{$Z(O3-Od%)l||Ii4v&7*94(|Gte;g`-;y1+saR@sEAWW$^|>z;T*# z>BRI`;D!U@S53PK9HKqs6HcJ?csc+cHE{cI{^rogFp;Bhxek=^?xpP!`#PW`7_6gw z8&xcbJd`D{yzbrZ6H7R|v2)=@v$0X1#x(TciKY ze2*Guyl_aRQZK=Xox+p?@+>QF<$ig;3IB&LJ3GHncV|?N)uF;EOkr-z%4gr_^Y7R3 zOLiSw)IZdNTspT7j2wUZ^HqeMdrZ;=G?vT2KWG9?_c)gWmrUAO7Hc>^P~$YQ3RCpe z;M#aePqi@}0?8_dj{_baka+lVhp&TL6EQ~@F33f{QZ#3N5Ye9OBVMmCjG}|rI%%tT zc53BBC#XYdt8s1pvi(ag&rioPQuK6!kk*{`lwWM-@|lfaa+&q~Moul7IdvldOd_ZZ zj>R^NA|i*&kE8|v1s;3h$DB|u^08JL{*RsjC|ileIJ z*d-f%q=g^0tT1hlWbh<2Nw9Pc#>gxRJp4w`!o$uiIF2ZY{+hDfW7{iZ5GD)bLahI$ zdH_EaP~5%5Mm1txgciI^R*)JLAn0x&k%?JXU0j($3a3WWqMJ$IQhcB#K@HaMgLH8P z=D%8bSC|c>39Z6}^jr=le8AEo(Su*wPxHXu-*nA~NaH%P>nLCNl_a$oq3{Ep{~>98 zW{?t-*wO9(%P*VR-xPMj0Wy_ip6{HjCJEi-Wn>7PRdxa~9h?JQ)FAljxAh9Ye+VyV zZLyfwxsn+RqN*+M+31V%&!TmrfiTCHTT zDCLv`P$ElRoFk_I36pgM#WE0Uutis%@{Wd2)GMB$bC8e&S87%wrDSu!SJK2p8Ij9} zZY|8)1T%*q`(Py_xvB{%PI@h(IR$Z%*v+y1vxar z0VqXh+TS-0B9osheTG)DNH^5=uJfoD!fjD2RFl4Ms0f<^Q^Q~L$mu) z&*M!&Q(K1R1a)0|QYy;$@YJ-G`^#T)&lRmzZn%?Her8EM>O7ZSe^uGr)62$Xp@J1Q zW>x@>V02@1W=U}sEy``pELSh=i$XE$m*+bQjf;ZYGYgiEB(yCtY&CH*<%u^!nhtqWwaP%l?Ygt03qU~LVpFp%u{ILFF!I!^U znVj{Wet+WM_>+^Uhk$6h_%}ciG4PSIhz^?gp5k_Ki$`9D`nNg%dNTnalb;e#$>d)X zx#WBL`SBzF&cg3Zj-yJy6M-b)|92otdTEexCMt0Mv)I7?s^7Qh-4zbFzWgI1;QI2@ z%Sb}t{)4we*BdbV7)F(bN5B$D=V`zb{7L?G=9~8fAr`8e=MwpFUH^@&8>*b+BDrv7 z|Bb2~s-5LB+23U1Ol7SWK%+vyKeY>D4oD%4R94YR_?7w+a)f_TYa&X$pgWPJUe=%l z;QfpqMSys#HYJ}ADpLqr%a_@Hz!7!8nSP|bJWRph&KW%l;Ze^dB}F3nd*D3Eub92j z8*=6{9V)bU3sUPXUS9;4mPc7g(^Sx-q@%O*SJ~u-V&t&Wnudvf?NP)-cNChp`lMYLhnj?^6}K6FI*#ZbKMnWc$%~i< zSSOQmJ4`+e*w`bH)qs(N9{%bM+QY|ilUlE}<3;1*vTSKu32PrDqOz4$(!W`}SguqK ztz2HI)F@+m%K_$b?-1_^9L`TJ_VBW7AtuiLrSkq!wR~HL^M9dKx}aCGkHV=d@Jz7C zS8%Hv`yHKHX z8`T3m2I$a?!N@{PCrDRZN}J`uw110Pv8zasxO!vRA6wZ#f#d1jT@URU>`Ch$3T*F_ zk`{KG1}3v(_Ccm^o|U-x^&)91B@o2rpgR~o4v>sv0AXi8@Sazte7&c?=4{I4?~@p3 z`l!=yyscr|k%Tw(Mij%yLEAPf86yptJsNE|-+d~5_f7(A<2h_RoO(5TLUM|}C{9pq zetA*0@|&CbSgzMCp}@j}^}BbLb#!QDH`lW3Ydc%-ty-;Ual{2uKcff5Wv%Av zfq5`uG;C^P$Er=nxKj$}EZ#RN!{G=y91IRB#_mRLYtn|_Xf*>5tdAC&n|<)BoetY} zZ{O{~Fz|gWcGtya>OXm*23ibt-%^_HUI%t>k1p7rsd)*4#nHs+Q?=M#dkA854>0+< z!Z`3(l?3Em;5qJfU=cTFNmGhA=nb28PrJV|I9m)@&7sRtxk;eDcSRIyc%eP+4aH+1 z)?Xdv!2{AD`rS0?x^yU0iV4;w+LOGq%a3DF=a%Z+$|sbN{zP6V^Fww4c2uU(*(?ov zx_OHt9bQOv#g`BM8?q_0y7F7Vg^;B579~afvVT-5lS=)xaQz!#G~Q~Boi^2qD>Fi2 z=*v*a(O7075BC)1jYE6T?xCMGh#p_6m#4R<xLfZgLh}yPfraD#|WAHU9 zU_BDEWAGOa95q00`ulK5G2Q)~hVVvYM}m{j)S-hYr&>LiMqd64zA}t>fg{GWGe9%y zElOBo7;U6C{{md3a;1Hgx~CQO%%b9w(l08GP57Wgi_YqG)bM*9VM>8`q2jUwZ3n|o z^DjKEg2=%?KKO+^vyf*N8Y$ZH=(}bGpudWi1%!4Bs{yNUD48x$%HKxCY8?&;xZ43o zR8ZnU(^QjqpM%!joC!~G@a|>xqDG#iJt;0h-yy%KB5ecj_bor@3X!5y z`pJN~JaL{G6*yzFUqc_(yVNT4oBip4JTcx|c$NS%a{msv6w8JD0ddELM{cj@+`&by>Du`gJwX)L6wD(08rX^psG>Y@-6lAz!jm z9o?a;#Thz8bGJYcXfzA$3;vfDh`@**@3g643v+rkrx{xVvz`oW&$)RwFFK|_=pO|5)!syEXSY3@2B)%x!~LKW(R zqmS;$p4~=KK|(3zBs?HpIZ&D*(mVI=(74^(r`>8 zLd|dVc+64g%?cQ(iKRV`^~!Ua-M*U^ru%_y{$A}gEHRN~G?~Lprn*TuuF8Y44Z~Xg z)?R~!Ng>QA1P{LA7~c3^vvk83q#sGJ(KY@SXJ+jQ={dyjMj4-IFNNYp<{rjJ#p&1^ zjzyXM-qgEiwMPO2T|Ciua$63|kIejr;{hC^feVR7)y@zU)dJjdSxIF{=>yRkJtfqx zl@4ujfh^#2!-MRYDL^rxNEebb!H=PC_s0 z`!Iwd2+l%1R0*QlvWP;+<7v;9x<(*M%2ixrOHh$IFXH6mJZk3`>W@}N>rSxdpV6DZ zu`1jZSwQQDQRmO-#51S0aEGD_Yn_`3>(A(D@ObDv%Cj4FO}*CA-3IFXIla)%ouMw^ zJF|UN`cG**aFh+UFJBv7FzWm{DA3NxAr#;{69uaDA8&k)Tw?4t3HS-$O-6bz#b`?q z5xh_}ZCM5KX7toEyw6}&un2kqB5^Li&DNL{fD7UH(QEbGKFIeHE}h~m*ZPa4PM`2| zbyYee`CAs0JaB09fLf~-7QH>&->;V&B6ShPW6+BG?!PgLRxZa(1+hf}QNP@yR+BO5 zvV@LvHi-O98liOVJsQB&aPxj6a^H!?gh|ruf*6rTjmZ1r;t}55kJ-to&~9Hi9#-ek zcwfkn5BvCA+FB`HTwSa%B;@;8ZqF8*V|WAfSZd-s>st}hM0t;9buTxJ%p-Je68DO% zg6a>~BP5YI112q#$y7lw!*GOIKMBz6!=(~`#3oH55A3<(n;BhGJj{GTy{s!ISCo(k zn27$ef_KURYgiwG9UtK}++gAh-Dc0FkY;w#0g1!tojx|-<&O*^g#HNxGuDo1WG_;3 z3nhsPU?6@cqr@2K95J0!dnDH>JgSq*!hbePtO*un+vJJG4?+IG{D-1*ftJ|x7lU7T zqA(mz(W06T+g|vf9i!3Xz!gPm>BFW2A1}TeqRtcW6$x~S8M&TR0sh&D2B+m#QWdnE zcx0xNrem|n2nr7DQ*7!luVP=#_SEj((KBMxboHZ{vT({2?aLKv+$30rK)mem-}P*ocM4vj zER)id;GA5J$R-x8M0)lU^_7{loRQd+N{9mftZFdoB1AsnQ~HIYQj4|$aU^U`C+LI) zKS#p<8xwY5=*%Yx2gl1nEj*}0!3#;fGBG;@&DDTWU}<2#J_kldQ8_?j$I1!xGyyDd zF;WbQ+|x1cr}Qk7k=a~UY(AlBpw+|R7b28q02UhJh}cK668FlaQocl^ zB{`U^J>J_Bxn?mVn$-tk$SDmU2k&_*a55Pmr}9mLSFoJLnC$b1D3JhcK$E|QfOegy z07%h%e+V4fMgF~PwfgN7=P8L^?E72t?Z9qIu!6^Wo<>dy2oOIMe58CKJ_PW z&v8bHyd=y}SAX|oyUgy7Y(!uI#V7m+-kIH7M&Skh%};Hwo7BRFS*^Y_r@Vpr*ru>ELw=e_a03`Hz%oz? zWdANDc@G!%{6W0D7UeJ`H36_h+etDKfuQtTGu0_I_L<#EhiLru>;YJNS0`@#jWWD5 zRtZxj+X#@=r%zUHi)ncuK1n@0u4uk=R2kasgqoz%(VpD~UIwC^WPy}&%0#kX`f|`S z>c6mLk=pRuj@OF{TBL0r6(N-b*f$0CvEhh}S~eS{Gm~%Q@Q*yMB%~^n4`Ts-%^R@;6K<=iH)%_!jFDaws z7}!Y!mq-SM(3FxwX%@wmCop87OZ=DmpeRw0tfVPyho6Xi?ECP83ybzLpTwLmb2(qb zAQ`4#Ul0=hN3`k=U|V5m?}ZrjZaf zsfke90gwskK7p>kdFM$`d4U(%c%W@x^DX*dFd>1Z(%8OxuZa3rdoZxAHaz>QFW=7^ zELN3B@*5*=Pg) zJRJ7Vrs37}Os@iP8C>K(A$q1npRl6AXA)LMiUFh#^o4!h@`LqtqyYdv-NJxqbolrA z$DDpQ*Z!a}b^`0l9hlyu${<((p6P+WH4VdH+Mmg)XK;1W0Com!O0o5urga#xTB5#x z;fz4^#UOc4ig8mXKJpNiIKax0wt7y|LWtKxfsCQF6&bB@wv~p{XAGxkyhSWOH2fG& z2L_vU68=^h!E5kpHvkpQSS($wt9plk^aEPu?BJ++iy(y9*dA8UpQSbcnNYspP^ThAjOpN) z;ZOze{8v+W4Y0FWyuVz625CN+AB**DvM@zAVrs%Ob6G8&-6Aa2Z(#ENsYo72*Pj`B z5$4E%(3<)ul&JD&wVOZ%%+>x(4VchI*{_1eTQ(5$vyD{Bg$tuf3nSl!t3+a0M!aLa z3kf%dWEj(Un>_s}9){~)KGe9Yl&=Kq3T;hj9zd~!K&GYuIHIWoXM#ULGL~<6F6#2R zwj&Ymcolcw!_)&pUm1izcOke%9>KXG^s+o?b3Jn_3~mAnhoYYeqxb$U_44N7pX354 zR>%1elG%9_whOgUL}7OZHfpCc4t=8Ve%eik)3VsF$_fzW1ur;?uHd-l`NpHO5x`GBlr zu?74hAI?}r_>o011Zsp_`yo(lZ8Ai|vrWxRSHy_~DZ%|ax|Q{`d?H5Gp3|8`*ZuB{ zCvMBAsVd`@EI=^i%ru7VUY3A^@maBsxVn=RDu*GQTs~Td?yq<{g|g~4j?f6NDnsLy zc#FyAgEUGt(gJ9j34^Vd#*QaV4Rs}qoQ~)fLd`@h61E+lAVe?Gu|bg5^Nvs`9z;Vz z9Dy^R&{~QS!`ICmtOr@b-S5@8rAf_UO)nBNTCB4?uua;L{4@ zWJ3}FjG#4kn|{u)QbB5nRy^xq>dI7Ph}I$l?MsCcvzVudT^CPm*yog(sKGkTR+w`3VW@qlP}G~88;EGMHQ3cO$p zVfZ7x9<2n70PX+U{*wfJZ9I*fq%hF%N5DwnX=M{1G1CbFT`&SPmnCYpC>IM1*!A?} zPx?^tK<$qdZ5bw32X*@XgCk-YIAhz_grMi=vmmKy9WZ0N@mg8 z2oAJB%=qWFum?xmG>8cJ9}|T@0vTqZNh+T?_0klI8ER+}pEQJ$Qg%Y1B+1aib|cch z0FCcBo;CUN$*|hwDdHP0_(WDhHj`keX^T2^OPyMlSQKC7Mf9@7njra^{)QHMI&q#y z&A(8@No_u%U9TA7%s%*C5cj@G!@e@qnHl4$9Torm1L96Zj!0N+2D^g5hFxWo0LORU zIYjCdoOKbn+`7jM3u2e%X3Yy5vZ@u7mz9?T)xPy==2|ZNuy%9BMIEy5GDyt3^VUqa#t^M89!c4~Ys31=ziCf=OBWeBP zAC`y}l34lHwyYJpv-(ai5()UW%;qA*R)ie~z{KQF=*}#7-fI@7d9CwDIe*L_glIJL z>AUM)+zrxJ(7VJ>q-u#|gtD8OVep?lqhjkcQdvvCL$*C!n=#?C=4!u3k{CY> zh+_Ou@tR0Z!7aR+OZW-KWZyXvpFUdHIvmG3I<<~68`)oyYZmXJfMUL1n@A8MAKBT7 zL=%_lITOzpuh4IovrVDtG-VSJ)j6>VDc@+$?xh6p;W5qWbdcNH9tM2oBRfI&XGHGf zHD`c_ti*cST9>Y0o-+yZoXiIPCtShMyY>QAVZl}2_oP*y9OXQ>8Z^-aJ~*{C03tPFVV3nxN(-uGH#bXOLNVe$bMZ-8I0KlDc{ z9#7*>nnwIJ`xNr?Ck*rI&}W32a#uS($~ExZ-pV!Aicx2QlE4q8o}xheG)|w8f)OMz zHpJTWLLfuO7`r`u1Tc@tWfHBEaT9t)Sx(sThkGvE{zTQZ6|W8lPW(BOdz?4nJ3kq# zw#btJU020Iy``RO-k!^&iOgDub^a@|bu7bJM7Pm|`uV#dj6KumpfZs0z`^`fc}YJ? zh)^s`n1P%Yj;gm5%=z`F4@tt7u!G8cn*2DGBn@)>cc(E-$U3BvUfoD5I$LWFfoJsP z;+I2|Jx$BG6|Y1Z9wum_`F{GPsSMtcwqypuUNS#3fCPs=_vNIeEE&~UK zU&x_iJRJ739xN1%MTv`Ms1_kOQjs;mdZO0ey{j)h=~(;I3s0xz=iGFk zSzoG}MrQUz>%?w+#v4C6#cNjN3$DX67A2xmtx10ca1hs5EC8T5qzYpdV-EtAUn7Xq zrX}FbJi?JOSEQstw<$x0`XkD$u>ACDJ_O@BA|&W#lv7t&I#4c6{BtkLzbmkpt15wg zTo6Be1F;!BH6Hy39IOU*`hoDZQm@dSL)|0BbeU9TZnTz;dj6BQq zK%S7O`msc!USU%}Y+A&FPT``5Ka)O%b&1K~&NGEaP2=)-@8@vh%S>JSuQV_z#OY|Z z`kUvOcSTPLn!HLljB%T5^K#)w-bjj!_|dbN9!MoJ(~`PC!}%s7y(fbVwY1E2$`0#J z_tC&3%U1pH?6Oh< zo_qq|F(6*!ux$N$R4twTY8}or7ghxM@xUi0+if6 z$Rb1NntWB0uJFg*!Pg?ubYY@SaXpZFyqCIC(k3lyO;LK)$tYTvBrhEB;n|>0Rt*VJ zUfiG)_YD-4MZ_PebrQx3b{9^ZbelJ@*ib@BLB3{5hB15Q)&hqdd1;~Cx3zOk&`TO2 zSW7@oE}f9$IvRQGVgKlt&Oz#O#6J+t85#gg5b~%~c3&t*)CpEy98*rn;S`Vc7&z6J z?_vqLe>+ZBUc+QQiLDK$wFp@KD0Df?y^ep1^ZVh+OIoEwl6m98_cRgee5wBtYYfK} zR%vi1OQG{u=8WM=}#8^H7TNk4M}`qS@U z^iD+Gzi8nqLcN(is?uqp_ROH#J`Cg^iA18U9nfGXZE1~^wBB)8+a$)PrZ3FJ_3|J6 z@_7CJ&%_iDEQ~1253FH~Z#IfRX2!Hc&tS<5VaYSGH$|j-$e$p>pb#kww0C_(FsDviAf&S?3$gk^77>G9;2*OcPydrp^LlD1EKM-c` zw6Q7W0_W%9pdlNzfspntS-n;JFgPh+9hS{#~6i<_x|l_wNG5U4bT zo{FQMbdaRTE^QJPba^c);(dOwKytI_eS4JoG!O^Fm}+5lRqlbT{_v%Jc7P`}i7f2z zm%>RNW%{&^;*5{rw84dl*MGDsAOs|qg{WyX=7Y=Sx6>@X#B`}Z(gevZ!9VDcAF*T0 z@U(Js3rOYqww&U)1({D!W}ifMabrHGt8aqw6Y0dFoqF_b?3r01IUnk-A%)VH@9KhH z+;_J}O84MQ+SHIxo6#S@`bg|_6_}7ByjO2TE=m5GWYo&I3_@W+O^UgX8RVhFrATs> zu}OmTDxbfOUOmE$ewav#Fti^mI96En-ZSY{wD3B56@_QetF}BdUNpUW2EBSO(yR4v zAXx9uCfH}D+RV5Ulq`g7sz+tU(_J!S*_91FVL~$bS$|@WGcX27%(B#roqM zKK6o-kz%=ql4U}#bLzF&#AONGn}Psv3k$v1A&B=THE=jf%u3MaxPy4)8V)c@LWeS6 ziy5UD8x*sEt^}KSBy-iowpWTfHz1(g5M>5gcDf5+; zbCFhK66Et%W6v7#`~h>D2>YK%iyp%)hf2N4qV+#kH~&1Vn?H7k9cdeaFWN)z-bQE4 z&~s^+k_fA&G{YQe+o@URywNZx%I+ZA?q-(R%?!JhpfS#yZEcDZWlJ*p23x#}P%?7{CK;pyVekC4KG# z2Ut=Pgn?s1`4_LYsAs`w)V&T!c64gzaMXxazBI)*>cEX*oIh&lGh9bF&NRIDfkhib z3dN3u3{az0&(co#wQPd1DvruManptKqUgsU9u1=v5ilWW>+PSD4cI0eIEat!K2DWy zH*t2^s2`Qed=>6GnuoL01h{OofmI!xY`(+;vCM5d5!LV!=>$A%RHRC46B z1ZIdnph|=8FDC;T0)j^u{yZ4GK*fl(k1k%C3TtQCgUYGp{20McPux2S0Me_Hkm4F< z&e2BAIX^r&8#RYHdvqw|dv{_8HIIlBv_uIT1EJN3OYT$=5t8All?aE1Gn|Tgno(C! zuyNBClQTI*<8e^^nq|H8KiLL}1_7lh5 zVXrOhbzd#y^?V60BK#4#2ap1gLLm9ElX@8bNM6NDM-($CQXsaG0SXwvdrJp~>^%aS z7At8cIMjW<*L-pLzN&AJtf?!3(d++6EXZF;O0@fbcpn%o&rH? zT3?%wQTXmyB}QD5!Z=_A@8J{~8hLPdl5t8Hcu)#Q(5z6L#)Ka8Q;Vgj;&ChQBrz;v zo<@6!cv~dFwLNRtYJp_XUIP&UI))U4CYU56C;&s{1tjK98J{2o9XN%5Sd$e+m?diK zqgAQc-h@Y?UsA>HhRE1aUCs}rW@|RF3QfGfkmSA8|1f%OzlL7h|9jG__dkhVy%4>6 zCcQpGtTGUtPpz;`4eluThWCh)fyuI?g4Bg0zcJIUmVXU1?SZ4>$ie1Fw^Ohu(qF0C z5rM8@2skh{)DuP=4oFT;KFz+8JYX`=i?TkbI(P+I#F%OcVVCH?PbRfE=MfRj^^nuQ z`wc1jAaNJ5O6FT!3!UBVdXeUJ!5jtD^qS`6pmaKwf$(vqD9ZmwTz zR)U0AGBi13FPKKage#^g9w@5_45puOGa2g>QX<=IgA zULq<#Fr!9Nlz&9nyx{luKSNrx#`oWcuw4IG^GcEuN=jV2A&Qaj@}c|LnC@`5Gqob6iaEvC#6tarvd5XLCN37Z#ETPbx$+bF%&|izgtOnp?6+g8iy3nGX5> zwiKTJx;g#JeB~V2rX#F-BDQJ&{m*aH-Uu4=yA$Y*+^vOak!BZU?AG2-?bgrQ9YyZe z-p}mTUi5CQa(^YvvA;?jtOqx2K_dU24Lcx(zhD|Ro3DC5w_%4Zykf$jB4Wdiq9n$e zKOxdwBxJr3v3YwhZ{FTZo45Dx-@F6lWp3SqxU{X?`&Vz>|3VTocZ1gum$r3#&urac zVluYwSyfSo7*$zvdSy2>d&_@;=f9R2zlLl699s-+|Ndh16{&_4@I3p}^gl1I%l~$= zK#4u+uW1jhv-?S)*si*^JTHr?=z+cL< zFlct*+vvq2?GEY@b_W2(q4-%MmoAWgsAwG8f5{R7M14$R#CPc8W>O?Cy&d3PdukwF z;ypktHL&|>EA`!`8w9+UiKSG2N`C|ikJBe1}r=BfR=3 zd8)9z!+5H;9}iFF5yUi;gzgp_6Ugx*-=jg_def%I+PiR0*UTr%M0(5L$HO6vB;IqI zVw7H-Xa`z?zl5#jfwBz;R7ZVTFclHtRUtrejMxn zEkY$k-k+K#jv|o4W-hg#{&iLOQ2pWDp zoRna;^#9&L2DC5%Go$^Y4T9nQe}Z{sULEdNl%}JKHN$oOwXW_~zzi{D21AYAMmm;0 z;|?0yra4fCyo#o4Jz9b~6BWzXZ9B8OV2T1v6aR6~|7rL9nI89y^M7vyXRQy>-qFv5 zaE|u4XNbIf{>{VUPQ2vxZT1C?#)lKJlatXS1)o9QGS=)L?^TwNz~a{3qJtKl{)0cy zIXc2>bTbTDc$V5BpHiJSMEaG6nFm=Gj!BUa+I^DRlk*Q2Y(^H99GiZoTB+Chnran% zCTsYcns~?828`H@AS`hJAKuBkwEdh1L|0JKpjV@G{$dqK%MD-YS4{w zs?hyUIlj5!e>&UG)aMHFz3E1p4bR#CWbe>`52zNDp8jZ=2>8G&Bxh1rlHG|e!Fw3A z9c2PW0UX}#!IOl;q=$MOb=mTwF#dKLzz7zq#orOmRK3 zTNQ0{<}XZX3tTmk5MShmV9HqpF4E}dwL$#6M2)!I(iNP+DG>Ko{L()NB91=DxlvQ|?1h5gx0&}=FJ4>)X5-bHOVkB} zzq9<*C04{f0sR+FjhYHxU1aH<(zYw5LDx>k3H@#G0!x4Qnn{kl!7>ZXoR3$l&7<_@ z23<*7i^xAuTdbUU<|3$Y9d>oyKul~zUEIUeX^3_U{dDzC%4i|&A7FtInefLxE6s?m zDP%t&9QVKhQs9G^bWD(pjZH3vp`p-=_IPowOXxoJwBTQ}O4!&J%~HceM1(!V79|IP5w0 zz|wYxC~v4J7YNosrszE8PE746&rpP;Q@|sDbXNF}4GVLumGI4c!wyuh_Pv_vRmILl zf7m&S+7O-s$~@Vg2yPMF^GQY{b{a)qm4H1m@oXws8a@sz=GZSeV@Wm@I!p(AvtECq ze#ZRzIs5DIHZQ!Gl>M%6xa%)}@?3g!R>(+LrCbb(9hA8bnhNYf$f;|SBaVqF)84Dm z%-HhbU{3KQR2R72HPSfZemt3WI*v${r)jHv2uu_!sNW@hQ^$3B!rw^1;4^c?mOjI~ zEvAgAjIRDsJMllqQaoTQt`Fxm_TqsJUmM{cHyQr}M&tT0A`Hh(+x?jD?x>D^?r-us zF&2{?QB18?hOag{sGYHeB_=wU0W@RWsw-xynjp3&j@UXe2d678TqqZbM$H~e(a(=K z&|{5J1a^CwPME|+^7O?S_M73=(^jCx^*V05$hyR1UswpT$fgKZi!>;kVoLV&qk6+A ze_z@dB^Z5G2rvlIp|g>;8>;*(ipE*lJ5Z3KGQiNL-NRg?-=^*uT_&BDjY|*qVmh}V zM;W_qkp2ufW{+3Az%CDK&p7+h1^}I9_V1e{*we}I1jfKSg4#QM7Tt%jK?~M0ZLGy% z+c~v8A)LwGN>wuwzpeaju=1Yi?1IrIePj4-HoK1R;dObS)R+N2|2$PHT!u*#X21s` zrXqOK&MKJ4#dn$awIfq3L(@{fO5 z^B%gHB&ER9u^gAA1e6T=qsfyZK5}aP;i@ZP!!lZ8M7N06y2!h|QUpt}=ZCN}e_IM) zDWJd~Q#=W%o#Yz)gF2^BCSO-3`i;;qkwh|6Yx5tm`#)m$Pl(+VPfnV3%Um#=@`Yt> zs48x(k!UT8G_{sx31d=>6*KXUN@;aV@j(>8aJz>}8-~B+8%nYZ&x-d$x1|SM5rOTV z36dfsu~E=EGT)Uz^^YN}N*lhPh;wJQ^43sye(nG5qTO*aCP|dgKQaMrs}n#UW}9eN z*xk4s$4nrd$Onl=N>}(%_b&MSFKBm?)Mi!|zZ|&Vrp{3*v2t3jUall%Z9!pZv+hu! zX9kpx|84Z+#}62U1oTeX0;ztgK4C1U@q}s%cpSzlL|VLihA8%FU6~%7&Y&YuR7OIdWHp+K={@8dlIUcFg%KJ^ znD`5&A;b?JH2@2z_PDE+6pf@gD;mD!S{?TX;+Krd{Nl)?U_ipKjDMl6lN1aL7=ik-y$&eWkE%L^YuMSkqLP2`W$e>PbIJz8R|Kz2y>@C8i zfA9T)^62#H{`X}I(}s6CAAD+}2~#CBF_c6?)siYfdJyS=BgA+i;b|}Aw1{>}bOr1$ zApL&Q(P!3|jd^d;dKRtMA@6Y0YaU(2!>S!69EmW{Im}*{H$?GyM@g8Dk}#!+NrEL0 zPg?AS_CF(PcUyUF%EPwyLhx^S4%UT(S;K@SnJ~Ao*%~ZUf%UH%u{UePUUM)m{q{SCk7UQZaVu?UeWdiBFLx0|1*rOp-UqKo2P#BmOb#U_ z3`N7Ef!(+7h)~FVH05qtw$-F@4LgK$VBG9-pvH*D6|QHIPd+t;Uv4MliT6Pc4hyP4 z`Lq?0VvyV6s!CRwSLP-vgC4i>o~|4)VI>Z9353^<4b#<*v)iB8Jwz_OoF6`r6)+1LP>U{9WH%K)%3tly&{=yT%VyVPX-M21__{>X6AgJXe99rIYr#8XLb z1{M`i>M9Z#gI;*PSh#;wDFZp#aB_8&jyjeSrG*Ettv(-yZOh22&U z?QG0vBmnzOYt$B+DxB5*qwCYMI4e98k(>!$@RTtJwMChj9%HCZlf8)YmY^ZNBurat zYis6S;K}r|;_l$PearSn<2z3-2YBX9Y*=mhFl{j`wOGD;BLFe!B!rvpm)vi%Oq#$b z{*N!o3Ru`F`xTP1Z9qUm)gktP-gcx=l19$)xctvA^z8LUp>ok!Nn3?V`J!=KI-|el zJx76fNuU6_rq1xD6uO8k?u~L+Ot^Q0AkFznB0I66`jxG1> zrkWe#*B?IUnOA|Afb=^~q-^riRX>~3c2{t%oG*N*Y?QGv0*hHhSohk}5WFeA{BDf4 zV^82Xo6vJ*sQyX*s|$HXs!|_}$S(l9olL_aAdXwc4mVI7gEm1qx2*3Qw@@-kU?nvq zJutFzB*te0pTw{cg4-s860xfcRs&)f1=J8lwGBXYBTN9USEGCKHvdE&H5zN9cC0zH z$89*2z|w4yFK{-K%m3mN0$=#a`dUsBe$$grcfMtWU|4Y(J!k=7Vb_BDan5@1dZ(w60vXyNcY7g6L95m+q6OVMc zzjt+)`*HKog@xQFSxETaQ;{{4V)< zUQ&?8HoY{SWBZsYy83T6P>i$YgFC z2lZQ|?A!X$=W^P7#_&x}@XzU%ypnt#r$|j}t)7dQ3Li~2Cf_RR^qEyGii}$0rxA$Y zQ|}hp>af$cpD+>@@UdlNWY718fKhW;85%_?Rj}u*-Wz@m>|MMB$kwX0m93!ls9@>g z@?&S9pw-0?HwjGzvE#cG@# zS4$LW>7-BZlYS4VB_3Qt&=Ty`W7qkP^%y; z8X|>Fn$=|oZ~HR}G@lUxT2yZ%mY@|}!EYGeo4^G?1+V1%qXKEQUOFofmjV&LHGrcS zQSw^LD>AxK5a)}4La$e6b(g1j5}g2Qd(xA18IKaAW(KOjQy{)J0lUKs#{&^fh=q}Y zf2h5eVsgc_Wsxw>i_ZzB2Ef2M>keJ;IYg}YECTV`n;I0i(yU7N?}@{CKjt#}t=C$pxLLji>~q3Iw@jOC!l zpEN*ENhA#3x%;Kj1J(cag)01Jh!CO9iSP#z-7*o74g;1V7U~O^eG2(^lVcbG&(fwZ zH$z!XRmW$_z)U>DdsJY`mzfW0Zl7a7VFQ|f6$9cobWbSMumDVS_8IP^#{L3(`kC<3 zGwH#5mL9w)_GDa!jt#O1#RqivtE zm>Sz_c$g}TEKL0faj;hpF%~(-AmEv$^8^!q&jz?|L|l0zYZbjshkBIeRs~b_N%vp1 zh{A01x%Ko<9`sw*>+@_pM2pWb@<3?8m$>;uK$_H(>xxILw37*~#rV^lP&@6X#!icj z)oBZ4;*PrIjgF9ruP}%~WFW-3jCPa2p(*`h{MfiqFk|?Ro1yCj-Y`hj{E>#EKR%MF zy+5ik>aWAw48QOMI4=Ot)8Kg#06i5?*oR2-p&TG+r+g4Q<-@CX%IEerI?$Mz64cEI zzAX(MZ!jt24Sz7WZwSnLOC5{?3sTwONA>dIrCw@eVD{ASDi(ph%AQ)w(y5ogoH%1> zYv{qLj*V(y3&WZx`-P**OAYuy}RWC93GA1>}uam7CP`otJ=4R=xrgt`K%uhIZD-{B`2kWY(%fAZ3VPK~y>3aep{%(&Qn_YN3h_48Bed{GA|>B`l|-59+wC@c0JH`osE@LNc{NKC%cL{y^#;sG zbf!6rW4*+(UKEYPOzTCi^$gqcxAlls-RSI#!A0<%llo<`SgzM+FdV<`Y=$G&V~~D% zLZerJKh3l0KSCte_wDHLMb8M^|K@!*CY6`1>DWURF#XZqm>0^z#A4D%`)ai{{o##T zG%gt>D;}X!bSHD`Ip0wBnxXRLx{POe(}5an1q4mcX&lc2koP8v7~ipx0*;FUB~Wk_ zJ&EI=&9Nn=4NOucip3Pp50LE zRSmt!j{HT&R-><7Vv=9TC>#1ExT^E4GAV*vXjuSe@hNS2)3Vb?CYS6>LF8t|i2FU< zNi89pv^nGBp>#V#_CNQs!Bez~YUVZ^wO1DWu0&o@NGT*x_N5z&KRaW{KQSvuKvVlC zq~-7r;m_yd&{UUtOA*w~7hFb;Kb>%1b>S6FEKxL3G8%f3EX?Bnp^Vp1#w_*~3PTwo z0RUrp{d`L)UT*m_bPxJY9?3-H79OF4P@D1$J%q8>M(HB_J@y5XG!E*oqRQyQ^(<-m zMVohxfh)EBOb#C5<@6^qbM3Z4_fDF{O%eVJAt5=tm+4Q)%ec3!Ul*?`U-eLCCnsAAoG75Cehd}i;!;y{yf8b zc`^NgE$&V7P|57iE7{DSykP!EFBA&k;||AvaK+3N@P+k~&=s)fH+rw(<7cR(J4^o| zoKhzuf;3@OMj9cQT8t4=1rNvL>1g7#(X)ypi%?~}^eSR_3bZDtc$YRs_$759=T3_A zNx|3aDxlTj2^?IG&Vul41lFZjDr6xV=y5Ip?`hDQ4Rg4Q*YZhqZSBK+_*u6*l2_vmiCUf+Dn+*#Vkaiys z0N5D294=X87_zOtJz^t$IRbJNoDDv3-|!-Q;qCaQHq48H7n;!XtB6Kk(L|$In-1*n zw%fxH*s~}QF>RgNEhufZ$1d{hnGg*Zl>k6|2jnJRViuVpn#v;lvHb#R3=`QCcLYPLAe}_x4mBS_KvZ&Gnw1n_J|-7tRBP7YMXekS+;h@!o>v zD2!ZR0(sO2Mg<%#0Fqx~#G1qljw*R&x8^FC7uHkelfd1eoAZJ4U+4t}vC1xcMTc$(892 ztxF;ODZYQ#`iqs{-11fOvWMtjj2GZg_jW?g4^rtKh*L&iq+6#Stp(`ZQsl%N#KIE# zSThIzV4y>1{t_$@92v;xgf|(g{s)c^=AMLGl8`$%+Gop?ChLS7_PO*#Ox z-RqEjDIxvBX$f6pO1j+zty}4@rShtgNJKS))~ZD&GncZk4cuOIp$n%|og%z0vlh8= z&N8a?q{yRWu4p4#ni65`>lx)|Sk;Cr=#Hdjs3-Q^`*&a)9SZ-?z_xCcEnQMcTg+eK zY)MhH2g2c>B7k9J@D8OX8(?rVk)=%Y7$*QSAVsQ!1!PQ$4uO*Mh#w(Tb4FBVGsdHo zOcg@*=m3wwr3jF~EPh0w_l`6$!w>fx9;(9lnUeu`=2ZI1eG>oLZFHr@!S!qa#Uomctx}`CsU<7X69g zphO2~-m=zR17X-&R+xRg0`8SF9C2aK6yX zsCXLQz1Uumwh24FuPsujMDlqCP zEa}EDp@jm=%Lrr5;bbxt$8`Z!=5ikRbtn#5u*&nLCd1Kce&+ZA_mp(``GE?jA6YnZ zyncM5+OYQ|2yg^n`I$YTa4*fC-SVACg8_+z06>M3Dmaml=Gqj_ayaz_ETRi4`o$$1 z*B>0mY(aTc)62DyJ<$q~@@#EwO~$vxQ~tMh=2JkBq&*)x57o}#bcaJqBxTl4nj)%A znMC2Z)VBxd2K(2){#DGHG1D@7Ty9I76rkSCS#t+vH(y^gmo>}gvd6=PTc6Ez`8OQt`|uDBY(fKzGz!o zIYqF3eW}7~jSO-fC_x&Y%ffRRI?=kA zx5v_7$j8;xsRbgTVJL4(Lc&#!Yrm?NA1KD=Pzg9%a^_dj znC#IrtyRn1oYvaFd3>oMsP*=C^6y`QnGbT5KRfry&+y2|TqIIP5oJWYYU3$$qk%47 zY8l;+#8u8{N+R;ETpkhx?2#A=QZvv1K@D>#Ji21h;sM9T;JE|8%$i(!zHvH*LA&?+ z1`^Niir^Z`2NfeV%X=P*EIHB2$9JWnb@-j`{SeeCE40Y{bFE1WGN)1*1?f7vd|s8; zC^Nd~x?VKzN1WB;!3CkGtq>3`5KByp5)9&>agw6*3PtEt2ohWMt4BPeLgbKVl#Lp* zOjSeN+Mk`U=n_Na#D(Jxd*7Y03=9>+t+*?$=)~z~^r+2xaCo67c@Z=WKNfjNgMcr9 zlcqp589LDfPGn+Ni}@xbAJmpnq@J<+n8Yg`=ZC$vU}S=9aXg`OoVJq&2>Mkcw3gM0 zOgbzHPY%&#mE#-rDcE0bU+XJHm*y2KK7rU*-ZO!(RQAu%vg5u;@)h<_JO`SK)T{Rp zpe*PDaKG15?|&C^_jBC5lw8R&vnxf!>Seb+p)M+nP^W-LuzR;{=vU_C**lPjDM}X`7`LHQxUwbO##Qz=m!QyYMg%HsjC zBdbd%31H%^#;gNt9wqMKB+w{dV^I5L=Hf}bHudFRCBLjIfy2y~-eRv;PA`$VmlGbm zl*7%#&l3V4&R+%6+t?h-D(p0^5$1X~1RSw@i&5RHlOa|8k`Q}WQr+g_O$ZSJ?6G}! zfJWEi7Dp0OFy+*;fR$4%!@ll_2rs5OECzULO?nfQn?h2PDoT_*YGc!F=zPz9ia1e+ zt4kz^FA-l-= zThOYn@X$0asN~RiPAVks2o-=_%vuggrHGO%IyB#s6GTGJzX%zmnx6x`{uY&8UtymMBUGCBUsDl{&|cepA=v@lLadpPQlE~V1K702OEAgx{%D;YSV z#r`WM(-Ml87+}d4(lpIoSmcrDcI-)1j^(g;%eY11DKx-VS_87i{wODD)zDPYV#QQW{%h1rtct5Sgr>h^ zij!~gKXH|WF#ht948N0%pZdMqnM6~Vi0e;NhZfdtznI6YJb?{kFuspg3Sq-n)uMk| z$pA4zZ!;Qk7upZ#h369itYgl>F=s}X@G0ztd4OY+@XT#ROaYaNxr4Uz!&mVU(&?la zL^UoYe4{TT?6yeKBhFZ^M@vcLVF~~r46!-9>Zem7{rH6a6hAVVWW)q`at7E041SQ| zB( z=sw`1BD{e7Q)Ou0G|NKY_O%4&5)<)3xRu+?Ix5+Es5 z&&?S&Vyc3nk`~tjGosJaLV}^8!&trx~HY~UU@+)t_l3hm`M8!VI_{H zR(?rwiKrfgQHdwE(b(yDCc@NX&7zJ`Fz&!iWpailU1==kDoRi(^!h{~W5-M2zLKO{ zSy)yy>vW+ZBm&Q@Eizc;viWw8cp3yb^<*iCG{38X=2 zo&bOVZ9tO0o_QY=^1={(xZxESGoq!*=BNqj4>ofYX75Gk=?(Q=WL7l-iAZvI90N^7 z(1ZV6BZ#wlc{~=rS1%I>etfHVzF{Fl7i+}3VWdIkD=8|N@0L7|Nl{9!$0Oy`>ycNl zykXS%w;|=djRG}EY(8PCD9zbPhOgZHjoZ||Gs2RTu)zYfRZ@uA@qY_X58xeOZY=Stx~P>R!sir`VKrWMTz zCqc}60x`NT-UY9T4nWegdy~WpzQ#Ki{F}5e^$^WRB7qMmmnu$E4wDkm3-nanCyC69$!tgu!Q0NEFd`z-;!aVY(#)IiF&o!(yo>g)2X`iu>H6G|vN(OT zI)e_pQhA#`TCgJU0a>sK>XDrCkRuzt+#h8~((*$g`H9M7k-LG?^$9}HNGnjGr4&~R zG2w}cw1oEg7&R78KX|y{Bmu&@j~0iB4egu5hF#i6O}R&)Cpl*=XLoNj6-Tk)qdBYT`i{F^#-G|-BUa-mD{-8~% zRo6Ogl=u;d+OR*oq7uzH1r9zbo>ljc4sMGVMcd}(Z=j5CZl!hrbAyqFP?NDeDky(2;{LGi8t~L${}Vp< z4W|7DRNNc>z!K&$NK^w3n*FhzRbu8u&=1zb_uM~K7?07vbUHqVsbUmy>=e6#ByKUQ zGs@a&1%l8PEC;7?d&|)Z39cIGGM(G=*=&%dMitwT#q{BQ3L-(YBj10tZZ8KeI=S_o z!Nh5YMNf&5v%11ZP(c{Nf`FdpiJ%=Sgeap~9TCx@#qo5|wY;HKMxQ?rHhVo{k?bY% z-5$G05i&XtIu?S2jWmJ@Q875uyVKgQ9EiZGv-2!Q@tMe&6u1<{YyOucIO|FR7P&7c zb~8h6;qR>teo`K^-z)KCE|bYvSquKn%n=iOPfmXCpwI8R9OOv;UAv!ayPb}eX+2Zq zeQu5Z_goR7N1RKgQm=p%JB33l;L@`4R_>SgoACd2E4Q=r3w3>V{aAg9F{Z{=Zp+GN z-{%IuKP>oW#bcC?hbD|1|%Vk@;aPhh z3y>+VXxOmHBHLi#1{4v)6&5h?y-)S(%qR=BTICjh(}_Y|BT{6%CW?k*Pu}$GA63d! zlK>z8}n86Cj8lxWwRHo5Zyj)Nl6LxWJ=;eh~t zkE*x$5U-Q{kpO+T@-7+50C`a%qW~sl;fE6fL>69ICwNjL3nHC zf(4Or@w;N>tX>Yjrjx71zO|y<`Q;He=a)L4x(c@%YSi2?YA&m#vs-*-VrB}kW%p`@ zVmU`;(osDGq-pO6BMN0`j}>~0=2r@%jdJikn;OdDmkSrSy!cdoOdb(2Fk}Mael^Sm zL<|WiatmT`<&;Ki$&&1nDe^dz@48mLlG8fJB|%nmdU_dhpz=$RBhxH!`C!2iv`S&G zT+vER+zEyXm;n!ITPw^oZTRQOa^z_or0sCY(rKZl0Ti4O<5f;wy&Q}g6~#VLFjMp* zipr%kd(}jA1AXd3-SGV(xKOEFDL1s$D2j;-e!XOX%t8!b49aX(@cBTi^WSBu)HDqYj zjKY}j!|&6C=Gq*pxREw$X?q;3QMdCnyXL0Z z^H%T;YPFF@)uxd=&ZwJ@CMIpM`G)@N**Rm~T@_*7ZEpID$~OQK_GVN(=+XFJs=U#b zShD`2>h$b8)^?gkH^QR%3pBr)Th0A8vq=8sBI`yG4J#~rT^WZ9TEKJw6_U)=Egq$4 zJ&E6Yg$wx=4oT`O9Es$2I{!q^fOgjw-ojDrj>U5NBXNTt@epqetQCZ}61j7bc3kWk z3N7MtkxfFB^D1to^8+Sbx`TEd1fm{m)X5zFs#v z8V@JK*JwyZ!I$-o{>^wfB2CQNZhW&W&qW2pUzw&|&)@l#glg*EACMY{x z&~8oK?@>iX0NG)9jP2pwc=#AmLD)V88$q$aM)!NVI(fs9`U5|!d@)}#O_Q1r5ACuR1Oq8$9z`9w6`yORiRV9;()o4pW> zE;cMeM$TG9@;;Z!ay*NOuD&9mg$7!}L}7!*PF#fzf;sU|PJPRB|5Kc@ZFc{L-9M>w z#Epg{nom!QU+ibTnlOn(jR=I&_9$Tzanzt@)b&OQlXhn#B!mxMgJe*`w^eNnu1@?v zq8wSDaXIwJu(T?4megw?F7KR4-|3Sb=k0`yRf0H!63C0`sQAMTvj=I|$io2Psc%DL zYinykKoon*b1;Mxm$l{Co57+Tdt&zz`nuIi2!neVsaWZv;JBri606Ls;bpheP6TAd zZp1(;sEdx~a`ZB4PolSgBbk!Zn^{8TEt_2=n0h<1TvU$k$bwqt+nJf(LgO^@i|T1l zqf2TXiAorRYRv0qT=MEVbMvK_SL{rhuPDp$~{c=GUEGlrTj44ew6JH{q;z#}P?4m(e_j6?UQa!*Q;^oZo=l}N{KYrr1@$hbJ_u~N^7-*;;eJ%qU zl(ldhmV4d)?$m*4I|D)`X2u*%>QfKcIy$3F`%akyy5U=AfT%kg;Xj2)xeV1j1m;~^$B1@^(^98{E);rNOY zrrUD3ie#oQ{MgKIZ{8%VYilAm*b!ne`0)9plGIZEaVx zOXd5Wi{$#kRiWW7U9IFQ_`ZC3tbzD?v`&8?x?eR=yX(36{O&>FU}e9YC>?y>sU;o? z#fO8+m%^9prAm4C3xMce95qL+>sDrWeAqi&ZJwSVG`GIpySdNlZ_c)JJ~~($@1;A9 zheDy$?Js}J9DVyzIoRpJgYCnIy=wsR`F?dVk-hr7+wK?K(N?c^zI#--E;o0+efv^A z|9a4N3ftMwpPRkTasU2d>3V6iGGAOzr&H_qtLyVih>O#Bb33uJw=|zPTI_9YUDg&? z3)`og{VQj$1bDdlI{tjHb#rxDtB*S?H;rAVaNr!IH*ZFj<&%Eva1}s2Y;AN#tL@R& z;x4E@bI(&-SkdJCxz<4eXF;5etK2N zmJi$A>l4>q7-!s3sSz)%?*fSZ`t|NjYxm1;=JRT6_2P7YetvtQba{2zUHx`Ef0=lw zwA0yDr`WzJ6z{)u6AR_+Zgu&1^{PIfEPkne#$(Ur_;b2>(kNW5I9H4JyY~k-_uHL% z;d1-(Ay=JWbWiP@i_602%)`~!Z&x?toriDP%cX2Ll^oZ%FFQyVJC*I?&e&bQ+J%X| zxi2~g$^G4I;o$!2+qk}avQqloy?i*@-My+Ox3&wrm)-qh=W1)Ia3o-^!#h{q|~`O z887dyW8mrib3jeDdztE<#f{Is z)1$-seImcpD6IGQd*3eWyEpmWg@@b?h6_&@S3W21Kli)ahv`wbnsBn`+1j|j`LNLK zrydH~i>t=g&HZKX{Nidax4LoQX3P2sS8*KFj~2}K&k$^)~NO7 zzqr+n&FCQJti(AY0$<5-|=3c$iIy$|oWRFM3U#|0&#HqcI z!`Lb5O6EN4X1dGUH~V{wo2NUQ*Y*9Y z`wM3wySaaCUtW9z5T*Y5#p(Ka?qX+@>3?y)Y}u8?MYmr%y}CKrOxfqH)1%(E_1)#> z=GK>HqqO5}?4CZ@H;enHn_tR@y&I$pXS~rlxG1(q<@hd8=;8fFqcZw@S-slmTwQlR zmrE%ivz2=OV&lB~C2^45z0cod_Rd%AovW?R4PJL1tTY-A?!k7ebbWBxxmnujp4V=6 zHwu@|=~jNRyj|HiC@pm^wzKC4R|lP&blEv5wXRFc%g*Y_O?T%6K=gVyCr9n|&+(=C ztDW;&+}-$GSyXKckpu^RA zt$UR?oj=^Ju7B(Iiv7iW_jqx+Ti;ndzv$oZEFPcS7mg1X3%k23tNlj4_3(A!^xN{t z>9x!Em7^?fU3-mEqrcUtHOq<9i_eArm+ddfoz=suho0NJTv_H>`OD^JwN$pR zzZ`u&*(-Ev)%NF3t-0u2J|Hfd)uUefVYGX6Q@_7oonN@g^v4Bz_n}pox3>@HQ|;s8 z;ll3yaqS?va({AK`nq@%@2oB!rB1#apO%p2WGjhu>Fes}?+Q`-yujX?P)lPo_tuHp?H@$LcJ$tfr4#hT; zm-T9=TKRHXXwMf9D~si?TbG&am&|$lxUkvnj4zMY%Y~D}uLn17%1J@D0K`Rmy?nTw z1*p#F=K5u=bsjH#Jz1$P_8hzPHFdMP0+QQJa_N4nw7PSC{ZMx^o#WHJ(^hFdli#g2 z0K~V#(tPoH&^qY+oyZ0r@QHLa``?3cxjdP zvR@KcrS%oG6h<7ZY;W&2ay#qGhly;%9gUWtWf(~Luu`6IG=9T zZsJQD_4Q8wV3b+7zW^}baG8ykE(_Z?dtVps&&OMU+FofP-yB2hH}2O?f7RVOn76Z) z`EI`m1KMr7Fe{z*ad}}O`z2mF*+iq$&Eth;{N^Fq=`WWz?5l5Cc=Z{&P<2Ylm6dAg za=zRIbS4U0C!c{IZN{B;wS1VnS<04nyO(i1%J%Q+ai)Bj2Iz(TEokOu`F?k&Q;j=7 z2^-l;^4mJ}DLcvlipr(0>6_*2_Qnd(#+QZW{qg-~@i4oX zXwQEhE#i#q9l(q{v^z`rMq~b4|Md9sYJ0=2u6{|5H(=l>-j&w#UzU1X_IR~*GO{_TWaOoU(1IH z_oBOb>dcS!68EsEj`Q0{y5Ei$_ty8yhl``@os-q0;?izE{Q$IcGG0GH#^)Zv0HE0U z>CvbVU+OgSqs+nimwFz1_0ZdlkDNm3YyP@a-d!A>lou<9^SNs`UtK|vsa=fMbv)kK zxp5Pnt?ZZiudAs-e`O)wa~GY=ioHDE+PHD=yFkoK2S7%nFB=QHwZ!Gl>euWIEU`+y zy^S+cJ?g?#q`%b`%gympYbRbkuP^jkpMiW1%h@lB9U$}t7ke{4tmKaOYRhp4z;46z zAy^EJb%Zl=h((shz0tRuZ=-ML7j^+SmNUQqFuu-r4-&b>@m0@0>YaT1vQx?Toc86x zX+FESn;IV?2d_4Fllh&`=O<1gySh-y9L?`tW-e+6t1EeDZ*@1(KCYz~x=XvYllV%v z*h#dj@OvSXz1TZi-)ih_0f>#Qc6IeMznA(}I@($7ZN)d2*B9$wbM3F2C%F~ZK5VQz zEAh_xVtX@D+DmNiWlxT4qwAZEX6dMQ2?q<1_#PHcTgk2J<^AR;Q9LN8w-3&1`;D!g z)Y4Hc1w{`U+xrJ!dJk^Dow-?V@7o(+7cL9E{$k=wCHondS^9EmeRFlY+{J{NB+U7;AiJ?^YG z-FE+C>AKdouP@xHdzxQO^e>ls*_%f5>uz=G~3YxZZ5p>BRB%_^QxKZ7sBJ;tS6D!tP=7=JQUbQY|cQEcNG8@tsy;@w$}RzCZ5N zmRj9LW!E{6XO`>B0HTrkcC@#;alE>>|80FfGp=3qQ%mXNn{oQQda=B;klo6jq;@Ou z>(pxgtKCShXN$FDr*)CY#8(p4MhT_gi(TL^<@JMg}(q`P}vP#lqso#^vQk{^X** zaxzMl*X{MqgY$;nOuE;%TyY(@1{nS5S;^)>rG>%gOVVWUsij zJb#m@t}k_tSK2qNZ>zoYgQIo3Unw3`>g!weWF9uxbicN^d7aAbc9%<=twr35a;bO? zq{RAq<1|^?xJ;F*JL~Sr&S)=L-`OfVZY2Zf!-ez1gYsgjaWbEMSgvj_x0c*eGgVwl z=8)wqbu(XU$2B*;S-NP}3#$w1hiq&9W_i1Ly3tzQ_*UOOwGZ~c*7v@(YrSNrvbeW6 zUjSM8>$OwfTv$MslWJ@>lhu9qq~NSK&&LbJt?TuL(fUPdCs|+q`lVAnxL%rH?;Wfk z7Y;U-uQs+CjY6~3Z||or4-Ya8JnDj6w_W<(qL0mdt{FW*vOUucJ!_Lxqej&4mTFYQfpl0 z?CRlQMp z)rQ*{e&wX7<#}_l_OYU*8Tik1(Y+bH*s?Cd~3{j_@J8x|@ z>Z$eaX0OsIT~)pnHg4L@{mb+H;%fIKb6x44Coj4S$II8NNAR?Hd~yG^wGHIfeW>9w z+fSvkr&~b&$y#>v^XArQwf;G?zL%=j3+LP0^=xr|pZwDP&OuzI-JYwWp42ldNVa{l}v zkzFdIH>rS(V!og;0dAn14NL`*EZ`X3Q7Kr@4tL6Ak z>Y*_|zwf4xk5ip>kj+lMR+i%X_W8x?LcVf%vD#{%9>XaUxmKpTkh(dE@0{1y_gk&4 zh0E2=TzUIz@!@kdy%pbUZm(Y*9iJ>O9aoaI^ZCo|qsz_Qb?$4Uar*gkeSQ`9k^S=W z-sb9RrgmLkzsjChuh!2GPj)NwD@&`LR%L6ny|I{$kFJ-lo5!n5?bc;^6(pjY>aknw z=60`}dk7+NUf&z1YwcX)U^%g!N*^CxrM8YMJMp5k9$#EN>7_05bieJY;U{%{SAF*`4|I#(pwh{k+u8wyti@LHx*ck6T}Ar(ahJ3zw}e z*nJucE5&quqr1LqXOG7VD;M?3SKI`eiwAqxy@UBi@#reP+t_d0tBY2pmaXlSl(~DUoO8EH!gFVo1M)K_knadr`PA_waspB^YCWgsjS-7J*RFv ziQUiFTYJUId2e@lvT>YE-E|i=6%^N*ODuzwOVlp<<8z| zalL)K9AB(;+Kr3G-fAOz`nl6g_8Tj?lk3%a_wZ}JzIT7Q`q0_ltKK~1;s@DII)0UH zTz9T_`=~jn77s3}4vagMDyqEo)!W_oi`=jlAqdvd8-Y?ef^Yxov`lw!8_#7W)zJAHV(ko^cGWGcC z?nAfI%q|{ZE^Q}{PWSdUwy&}$i>p~Y39J^A*WZ>4mxqU`(|mHVa-3dGZXOrx=Jv(P zLMq+4X(tyClKa>7uPY1n)1^#q`QqTXepuW+nO|DiLoxo_X{p`qR7$XuB{K8l#_9c1 zYT;xregFB(!{Mlw&$nw|uTL8NozwDSdVVvXn%~;UHGx*wx9zRo)*>EtSJscVD)G(p z<&{>_KA-=5{NV1?Pmha>%a!WxQRXziyHrY@tUHaxMDF?swj*HNyUF8Zr?&d#>$#1) zS!TDme!ZW|wK}Pd{S6SBzSvuvh4t;rt;Ln~lS-|)yu4EVTD+XMGqsvsNqjlo+&EpG zZxuJbER~mVAhqPRoy*xBd%KulUiiG;++418w?TS4z4^A8zdlJ{j*9u!^5*>J`eJ!C zzL&c!<;t1s_GYQPy60>lX>FX=8l7Hpqkewg86PEU``6benT>9~v9qwczp;LB)7WhF zbA@>P@L{Rht}Seq4!3t&Ap37D*OMp5sPD`q-QAOgtHQ-b<|J1tzBH~*@aH-{5bh_?|!*>-8s0w z?zZMzOY^JS%j=o^@!tATrg^_wOe`*)tkiOu#{J%6-+dUTGtJayYCC;`=v>;l+4y1%n`vXh&?h`Sf{?b>p6eldQZ%#4rQ=kp82 zi+byGWqm&Wb$NqkWVf}ra=f}&j4vK<7kcZN&Gj#phsxGsZ?RE5*sWLFx$|zOncaxz z_Yd1UnahK{v3tA(%&)(@)OpxOw~s_3^ZCH;SNAGMJ122FRaiZWuk4qPPMV$7=H_;P zHL*J})noR(3Zp6Z^S-E4@^yU2Haz zH~Gz6f2q2@^Ub)va9h zGQU{5%vZ+`ilZmrZ&L;)G3(p@+jk1i|CqP=zed1>z=wVAJ`b~c*1g~NLKvT|H>wzKK2 z{l$1U6t$+&JjK(7KoF znZxYz$wqd&^7VXS{<5*{UfP+@rOwjU`c>xY2w6^j<1+niy|S|P)xBIyCGIcJ7glyQ z7CvW_>vgBN0SAcn%6NS#xmiiX3$=VV)wQ>K&Tj2%=G(DLd+PN;a_{TO!$v;&Io{p; zacYMD}J!Bd2moV`jXnHB#vwOrDnO&8aGhxj4!n^ z7f!X(s9k=$T>5;u)IR@waouQ~Z|)o~wOaL!h5dN-OK0`VDhQ8DPPWx->^C4|2v5NWSU#{65IZ_p6!h z{jKCB&~dum?9$Cd^(2*DSw2ag7wxa{rN!36%6{##x?kHsok7z%tUM&QGuID2SYFHJ z?0PD>?_~G4RyQ}xncYSo4-=J}cJ*Rq@0(NE+A8htm72-bM6c#7w0Bpk7nyZ;!!2yA zoVJd>Hg=ZhJBd*x=f+cs&FV__I=$X;k+hcE#~b~HZF@hF&1O0$E4lUj{e0_k;bChx zb-lMxUie(xjCTt8%Z=RE5iHPJYoTf%UM{pNh3&Q>zCt8P8HyFQ<9rZSb@-lcO~t6vsxx;wk+YGeK2Yacbx z8_WCd!%E@03`gI_UVG>Ce0ASmO%_wf#~b-}=Ks&$pLV-ytZAa?XXme2LUaM@HqR3Q@xoy{ zU(+)YuE3cq5#SDRlz`qr9-M^-r(KW7UC0EWcf)ofjB5$BEkemwyMva~aIsXRCL`*0 zvRd7~69vayY=%tN-JfG%Xn~jA9Cn9*Q%quBdlwQ5ftlU<<-X44X=So7a1!{|L&D$< zs6blw%Mrx9HfeS+pLBa`d5d+4;wS=iPNqm-lsgo>da>oSmhiZ_d0cG?#fw|-vbUUI zi=G`h)_5xUJs-gVB~6d2z$lzYbO1|0TFgm`rN2WobxF9$+y4wJZJ8K35(8v{%Ei zy9mkGlfdc}Zk@EuK3y&gc$V7HPdx7Jrcx67MR zT^fN{IcVl0gU88>E)@s*RalTc2djC0Ja`^>-g-oZk}@1hN=m|=2BA--?UtBQ1JL!3s)MsL8@Qh*rZipLJ z64BYwDh3+{)Y9?#fbo)VBw5RJj*E~fHMzdSWcL?^?HGU4qMSHA!=AD zRHg3jnskyxD*ixxJmTDBCKkoA-}~EQ$Q2Q&@Rn<&qu;JO_u09k?IJfge!3WrjoyRc zH%US6yJ3ADwiCruWv}Fwl_ovp89wO&;MXY3phh9ugmAu|Cyw_>Tr3;vc($&rfIDS+&JMO5ovj2K>3mjr&vZV)i8s6@}gZ1 ziKH`l6ycUopkmdX&~qW|&CDL)Tp5<@6-0t;pCYtZl{ku3L}C zv2S+PpImuOJLDBAqj7VuPZ2?H_p5NIDW>g?|6&n^8=NWW=5oX7)GwUD-L`9Vo1Xg& z?nT_&-fB}KN1T(W6PnCP9rYqvuLRF3NAUNmm(iDuG;BS{WLZov?0l(x!PWglLydQM zlFQ{e`0ed}F`ti1_{zskIQ3Ua<{e!cDucfUFiF0=6y7f*qyCT};!0&&Q>AQ_m%?Ge zqY435ZZ}z&Tiotcbh-dL>>WjiWg|T(AH!=Y@1TgGWeK{F#6h>3NYCd;95`MQ!#7X0 zMaUjilP5Hn#G0I>3t9kN`VmIR^GftL@)8qG%V0*%Ttm1Y3!tZ(z(EaeyLzB zZsh$|Mk0k+QNv$Z!@wLtG2ye+6Co7B9CJG758_#g=8j^(=uSx|7Y3Wai@0M^O1W5V zRynBLVoT8q_OzS5T%6CG+wjTx+TD!ynp6t6TnPmOoG=<$ia9|p2aVEnGY?IDj4wfl z*W$%0*W0)O{4LM96Y+#Qz!}dO(|IzJA~D6HXP19Cu%q3GxP}_*0VGbW9-Cg3z@~}A zEY+ERu?2cs;hE-yaQ>BL60bBZb^ll@{Qp*Sjj6y2{Wc}<%q9}(5yz7+A0PG!+=R+4nx zGzbkOW)deC!8!557ygV-58hKkFUJQ=x==&x?@Hc#f%<&dY($2)o;c(JB5uW!lq}+L z@ypqr!H!Y!)B%b4;)WGQR`8|AS?E!;rVqFF<>q>@XU&6jv9G)PIrs>+TPDaY%{kTG7MJGasI%6C;pQ zJo&_ay|^7@4TyM$1aJ+|5$R#i!L%StP3Md@WMhw(RL>ExaBpR2Sq$5u)(G&ZX>B%o zw>3jKZ_CZCy&1#ES#IR+U* zmC6<}m=iIbpH9vLZNL!qd37(3$gVQFv{5@%b*X)ikq#%Y?37`b%j-EeF$+u0^XvIA z?Ug^r-H9ts)d_;N(w&)tTX^Tf%iZ1t-5JR4(4A13GFLTC$9F0e+~rN{JV73e1G z@h)`{-H8*UXYH(y6TU4$S|&7MQ=%V*73<=ro%>H`FCzBY9RNKkM275=x%4Uv&QcfN zjmr#Wc4yzcC-qcYl#B6cyEVc>}IfM?px@assQetZ$l!cbK}Z zzAN~Kcg|Ec$%9!|RT-9z-F@N~;#q^W<70?U`S)`^9H=d`V24M9*#{d%TtasTEndF~t=xe9I zj;blt4`LWV?2r? z8emWbFAGUrh)gSZ2g>)6y+RlL*ck5M@}#n~4WXUs=BFj0h3lnfESGTF7sez6=m5gC zH`VoJgE?LDh`BtK19WHe=;8;NpsM~sQx#{2Oadd1+$P3aILZ0tO3!DkUv~p`il0xm z=4{Af#@huauHlS*bLP`RnGi^+;tLjAZE zU}*QF3t{pVR=~^3Ulibw3sHG&tG5KwVgs)Ym6qz25-3D7V-Y!qV2+Ro@wZkSxn_y4 z*RkR3)ZIqnY%Fq0-VTRouDk)4x3yQh;M7Ap?OkNKnsO*EC$Z zqYKeRV5&E&xyA)@jK#z@c$6(#e0k(z?ZJR!=}a_wxOGdeosm#-nMsBTcQ1bjUo(kR zSbCBiG^vO1k=DmzWj-m;=4xvkD+x*^8wqO_E@z9r!u?Zl@LS>hhqn z?Zg5guA6Ul&qGropMHRDo=yBx&OkTz`8*7E))n5ZYU&3C5;$C7#T=Lk+MJ(Lqt9q^ zp+`CbS7b4cz2$I^Ne2tFP_}C(o7~C{Lh3$E!p!E^g$Ru3uPxf^Stbtb?RA`t<-W$eZ8x^@*ncMvH zS+PhEEXOWQ9-bUOsJSy3-H51D*aqIG#l14u+uSu#TgMKHwTrOE6Oc+||LkyA+#&0w zhc5c}#96tGPn$=x!2E8mWsI)FFTra)>D_l;GXYs<{v2FfkIZ*eodH zf$HgpH#52p5vC#u#|RB2P0XI|(?fek9HVyhQ_kN#G^OW*ap8g>zm+Why5M+gr(Qpt zH|1!B8C-a8<`d*GYxL_18{sX%;V$X!u4>)WZD#eN>$iBlb$XP>YBp_~8Lt6z_hXup zkF^}YI5~Q$w7eW5m%YPxB~ikrr0rGrvIq&Gh5{2{=m6%Hv(90?pzB#lfQOCGOzj;g zhroc&79y85<^D>TCAfAR6x=T0=m%Z@V!}SZdrUA9gQ*=*&)fY`BwjOF?2cJ@jpSdpb4aJ` zX?4D>XYbOYjoLE8rDfv)w{2URoxoQ=}7teneA~lcr=w5OBKmG`k(c2~R{Wp~ZPR zh4IpDaRtWgg_K{&^8{|L9hZH#bGvF818Atv50t>6F?ozcigOk~gGVb){J@uz3=+DF zVh5VCgdM$#W&t?VG#s0`RkYrt0i8K2Iot++<+Lc9pykhaagE=)~9Ld}7VP z4V_58pbmX{LT8;ji2wzSHw@ST_3bItZPSQ8AfSM{EV|dJRkFMew>&0>@2T1*v=@C% zDPN+nX{OG8pNRZmxn4C^`YW}bFW}r5Nk*vjR9U^XrC=h3aCt1~8nn{xy z4O7W)anPvare;3O@8TtZcoHF;oSB&~X1@B|M8tggC$HWO;{j2oXo|Ze*7Yq+q{U3) zBwh3cCw!h*64>LHECNK|c;Nlk&H$)XFj5O`dKwa5oY+Gy7zHHTxY*f*WUE=-){lE= zC71BZn46TV(KzHc{|txZsz$)J=ZZ*Ff|s+_gNc@051@ox``T?Yw&ZhlV|xv>scs)Z{l?r%(puh|}Ut>dQl=FbI=V zX?sag^m;~9?i2Q*bc&758JJb|yk}dH-liwi@zAcs2q{^ZHLx(`4a>kzXM0YasUVrR zYUdtVVD;cioliEC0?vbGgh#i{u#HX~+8RlIh!&L^kC|W-QJliv-7_1!lkEXLp`^6C z907Grq9sNH1HsBy*|~ofZ@y(Yvg0eG~^`FfLhoKsIxWd%L;SgP7`E7By|0* zSiZkKZD$@*n9@Zz;Dn$fPaSQ{v*liwqln!DT-zwPnZ7(uMm%I(LXGUaks+3tix(?62z%d*f)p`*~T`n8qK9Tw6v5 z*m6sYIaYdw2e`69wEei=A?FZq(L_KTxOezTR7gwUo-P(b)^bKq%DLcs4MKtfBLStS zL|vRj(s>D)Gwo*G!_LyQ9p<;Y1OP%cXYdr9p5g;yaL{{n{{7;L_cUOvASCl!;+LXS zsxobwi8BZ_ey@ZEbZ^OYbcEA;OssiI8N#yYFVp0ex6V`;j-CvQysLy~QMV-D8(1lk zNj~~p?ecv|5MI;W>FGc@*YlW2n^2SYxt#g|@#-tTmXBK&pF&HU$6He@J&RK6 zEO8N=le(F-uXA-T9J@3PQcP&R%Q#@i$%|dGE48T(^c1XzgzO`VY~7sz@JR?RIcjZ# zsl;bu+6{(wH)#SrpeqDKm+29q2+C%O-5COSEz8RY>~f!=W5_4rCh1yYK89qSlm^sa zP78Su?9QjvocROB-}0&&uALqT7nR*dEUGpb+L_Rr8tCE>awaGBxt*+f<|Mg%zLMZ# zU{$#8yoo!*-Lb}(YdT^BW_VtV^WK%4dWCHro0r$~M!5l&7jb+oD7N>Aj2Xe;rU+HL zbJoe~Q)oe^V@0V}g*GHR1!mvMTT~n)d&7!j0?eTxE1j+cD_8*`9eLO+8IIn$1~aj4$5?F=(NwVD7CW_pe3wpy;& z!>2B2y3Rlb2rdPm+&Sl?G443)L(0yt-2#EB!j}+>II3!Ds_Z}paou^VVT{&uTI+d4ACKwS zZbF-6F(IB#$!+3Vq{s>z_wae}7MmfxTvK=Cl9k!@PUeafH+FeiR_uC1FTEyiuz&2{ z*|Pz=53Q4i7fQ}r?M>HZiykVcW1Ab&^fTkWlxQ#BM`w++HDC~AqXUj9VZKuwqD0*klo3y5#xVfH+t>eNT3~{dd zGfieK!AvEIS^?RbCzG$o>$985@N%ZjxmbJ#-RX|}nptr5&$}DZo|Ei%E&n{oghn?V zOm!)>%92%?Str8c^=_JTL@wOZBv)l#vh9LzsO&K(s06x+Sp9ykdu0K7^cYUtAP7=k z;4@vfW{|_$mhXd<-*=Hd1U}1<1{TZR9`CGSq9>}jZ!kRvS&6P7aKJS#?10*&&{^3k zcC+#cikH;8O_X};jSIjb6t;1!n%SE4{q7 zSZ(-BN{)e!0)|~9x2{_ttuGqFy~@uMxl9!nkKo<19#^2xUa!OOfmfR`h;bh})*2{I z)~a((lnTh7!7c0T|Bcu+ja^e zzgKg~8PaV*(P}!|TW%qjWK$Ol#*EoB==y}KY1RVRB zw)Z*6&lxag>=11ZFdxLC&mDj*@_C2<6Ig9kFQgZI7p}bseqQD|$83zUhV~%xwb?s!t*hM>#D`q;{;j@i*!1J!e(BLnnc;ozFd~cq3dFF^0Z*JW49mNsbyE^1&*qbs{o-XPO2SDBaO8= zJI}-kNfUrMH&K4>Z^;YlQ~o)|sOvCk($v}UIE#R8gzR};(KNb_Tx3+f{VJp(D zhv!EoM?lv|H)ptb8z@||U1bw&G{a{RoQz}Db&NZjYI1NVatoo5dnYeU>#PfN4P0uTh~BNPseOn$ZOiTOb>g}P|FRZIrvtOMiBZ>P$*I@-vAA_#;R`C42|vO zRqzs9(@B(aM&c5Re_by_TL4W!vcD*Sa2P&*sGgbSDk00_gRp^&{AA;5Vd2W@XVaT( z#S;a$5(0C2m4#Co1YO&rnltu*-<0z)oG2ZqBbw9vD~BIjInak`m>T}Uw0e0JZL@sug)I3~6E80d3oJqBtPfQB>I4`L&Dle_6#3fx2 zH%f%c;ii<;@PUxxq7m!ZMd|l&s$!JCV$5K7fvMtxd)?63qLOJ`GyQ&{yHg+MYsIa* zdl|Q?_O0|TZQwjydlg=fXAVpV)eKpEymYb=Q{evS4cb)h<+dxh%W-jgmPlmD>Xfx{ z>nS=g(MCQ#%*Aa8+A2RF%7R>jLR-}#P^5-yL(ow>otC;}=#^1Pv~KCxE&)FL?$A`S0Gou01%b5lgDfd{PVMbQY8g1b9Yf_DnG zdb6={%>hyTGefDo|KZPY-Z?{rq&Lz0+grj7axb>LaOEN;Z_yotlcC~w6C$ax-3Vsn zQU2y;xlw}c=(}bGL1q`4PTr~$a7yIeCMo8$V};bbtst2Pf#h$v2QY}loB$20D46+p zaqd=2EQOv%0qYP*GsRqj)EdJTVKhMREX7ZkIvF0T5i(W_ED!ljc@J0DyYgv1`EA!h0aO_Mo^kXwLy_J3%lh54? zTQ8xYNMVan_&&mv%D-X&MNb)0K5x3T1EEwd{4Tv^H{3Q0_0dtXe$0qe$2k`p)kb@d zvNJtdjEdk22ixXe%uTR(Q|2a(s8Gw}FwesXVwm#o!CmJP$;#q*Mrjz4xYnzoAADu! z6jwRw;N974F9x9tfuzn+IqbIl7! zQ#4#x`+Us+CVOrnD*I+8+rZs1?W}Xi4S8h`vkOS!CHeg!TK#8eT8rtA<=QdYf z%c0XwTvG#706~;T1D#vc2qfkOEwiLjL@bYHAEcpuC65dU1$@_7^8-qV-&E7n4$W*2B_vy69aB z)P+z!JK2$u4hk#z#w7Du!CnR91ppA{%4Ouz3_BheV64Gd27^j({y1pjZp-Wkg)d#z zTZ%5;?1^&Ai&T{fgzHdN@1EAiGn`;`qk(}}dx%!kMkaHvOuXE>TNm7g^E!ri8{)e` zZ$y?eGxScA({7qCL6ij^oWWj*tPi@@HBY|0-h_K%+l6J72P>Bfd1bJ*Pq7mp>QjLU z^a)c0SOTyf;;*olm*;ew-NzZO%t}1p+4Wdm3zf##+k{@E7q|iWi3AxpzO_qw_go*3 z~k4d|cS$b>F{wBFV=gC!as`aV*I~@*=?TLIW~6bc(^E zV8)U;;m2ZSx@W?My=VmMkB{O03-Ni2cIW5ULO_5cA<({-bUg^xD-6XS3_b#@H)m`psb#iHoSp$FLN=5##-yjCXL za9#PjVOu*J4Ya$Av6StwS5M94U0hz^<7Hd7N0#|T?)Z?SvM)We^y@IW)BzfCR$l$` z5lC}iHdvJtnYrIE2hRQp5|IR>98t7AcLOh&FWF&dlF&et*N%>ZofIFUg~3(EXdHgi z9{qfN$ga^jUDw(TA+oQsq8+iL7I#gRT2ow#G)VTAO`T6(c9=K#>p}0TYoqNQDKOZV zpIQLe_oXI8;Y@IYmb$uhdj?$<%FQ^2gSCMjOy2ta+J~TM#pa zh&cN`yGu8fn&^UTHd6o?e1#^8loqZ`Y3Q0;!mdBW$^*CRFnrO(R!q?pycpg+{ajnv zk}IeX1jJpJ;1h%Q?Gre;w`An6=R9?J=a#?hKBbNGwWOlMo8?2Q&2zgpF*?u$Ks{hH zyKiAHkUh~tmneVG65e;qy>vSnE;FrBx6LsxS=Bug=uLIc>^uzYf)=MFEnUODuVpI@ zIPTE-RQYPAIL{Qg`4~}d3qstgnRPsF>zi`Uwic<6*KwxBO5x5mwCO&rLW&p(4@fui zlAW&-T<9+Zla!Vqr*r5=xB7MUq`^{dmr%x`!r6WEUc^hiY$p*}?jCe~DE7<8%qLPd zBkyW3esU;Cmukluo`fMLE-%;Saiq|R5az1Bo`&u)d@WX`G>vrt=UD@5+rCAnNlX(@ z6=7m}4i`#7pDPjP@O63d!a!mgw5dkhL&8Wu*W>Xw=&6v)Fi^e^f~8NN`5Dwp{w%+o zmWIM0sGz zSzLni#<7r)jZ8{EobH*MRT-60hmDuohUKX^PO331{q8@uP;s$)RP7V-QmUj)yC{~k zf$DabW^N_nC2**cJCI4#OqZ{0%7>S0WTEXb7IP@L#*$^SAr4pG#3UJ#f`xQr8iv?s zRi(NLJf0d-5#m%wbK*azqDDh|&b2fsj6=W!Smz(T&C$x1OU)Sr-C7(1+rCsH&PCUU z5S5!bKro`6r?QF%00Om^A`lhoRbM0D3;IvnZZt?-@*+eB5#KH^ov%Eh8Hb(gZBI{U z6i2nr_1!)J&z;Us4aj4lG~Kig;co{w>!PVZcuos#+Lp$^To|pp`=_9MwvpSMN=v?z zJ9K+2J8ciiXVlz0dJ!b=T&C2DX2%+zuv>CWxK5`f>~LCeIp69h15m-cDN<&EHTMKi z3{kEgFEJAoR1#Vx@pvTaAKR$D9~}n6a(R)8dv}po+^~j=oP`-%kM~}kb^^LGT*?Q% z#SnU>6lQ6e6FJ$wr-l)1^P;+SQL?S#v! z%Lsfu2kn+q0;UtoBzyHSBV{B>x78Q77{0?9KVHW4GF=vKNXR?kk6d$B0%d*4QIr4>aRpj*Jfp1*ppqGEDX7&9SjRC zf@odEBDNi^z1o1GhHs>y(%e7baJPrD!kYOoIEr7D&??}?PfB$l++_MPO;&v3}*7H z-b}})SGjkb023FF0jJxWV`b0?72I}AqmG+^g!R|!i z)N*=2RW=^B-2z4nWD!##2&6B_0Lt(<(YUoVT?%e`c5+PQO% zl>@+kWhplkzPa-q5lzN%+msvUi>bCT-g;;dA%$lxG(M`6VGo|;}_LUtl zz6|a3#y(5=1x_MU-3+rOf_o%8>_%`YgJ|+rd zn;Dck0f^R$(Nf2hjNRgeZWcPV9568BdzEJ3axz96o)B|qqM95B;E2dahcNQv8#On|Cr0u1YG%H9vEf|T2t z%d!)qoi_RRc{|~Ouw1Cey{FPsSc6kHpM549FPP53&t!OU-2B+wO zXLcJDPVK*l8B4CydU66v1kjUwrY=s754URSh2@|R308x&n{3Z(opaJj#U)gdwk2vaHS=a5fk@QnB|rjpyUClDp7d zzK6F~tbW(3zxas;dFP@h;PdNOl8FhY&!R#|k;#~ohEP8b!M~%ZL(RTT#-5)=6?a6D z3Rgtk{4SG#dNgd$i68Gru`l4ke7%GCY{f@0>^og}Uw9yw*?ipS_pSNz_rl7F8h{~2EJIA;4#fBuKh)8*SEq~I?}U-SHO)b5H#f3M2V++PoC|MG2f@h|@u z%~6M7GGC%Ugn#&DrvJ*^0>3Tq^HlbIz)9-&)&DjNedHm3m*<;ozdvao@&C`ULjGMA z<{kF4{zLV5%*)p-f5*1`lI8Ckmfx53AGIo9@BfdQ6nfA1i%r3<|EqouYyOU4d32Wh zXxz7H_wESK^5d6(`{Czr;;Z)GztzNQwzAoN`0-23{o%{|BpA_$J!4VNUw-`Q=k^Hf`qP(xZIG?`h%{TjV{snA?YT@00ft`zuL*`i!Resga-Ik9RTq@u$y#GsjT> zX=|3LZ+^`F>z9B0j92l`OS63#`5%9-s^-TZ+n*=kx6u*~B|W`{+)I%6R=DBUBK~=*zZJ*ohwTW3^tW4ala;-guXmf@|GAisNJ+bI zY<~KJhF16|&6f2)nNKq`W&7Q^ADf>p0RC+u&wmd09Dmw#e=X=E@YOyJ?ax0p-?XTD ztIfMPza0$u8UE>R$WLAUT7Z*M+s+r_W^xy>k&W`7Mne&CB8cPxA9 zyRL3O%pY3()r9}=vPb{Y{Pd@H)UiK(t^C`ox5HBWc!WXvVYe5befW$O{o%vkUEini z`=7oX0TvFtbzFEC`6+7u+w8`-V|sMzFZ=T4SgHH&Fav+u`@qm&zWeUD>E|E6#^e4^ zUyiUj?`ZEwRJ6ay{rzVT@vqr~T@jD$NBY10lD#gDm?z(T_fEb1QuaqMuOs`sn}A*Z z4iNY@5Fc$`e%ii9WPayAWZ-R_k09P3udce%hwy`)^0>-Qkbuy~R6h*AW8ko34MAgD?N| zmbS7JM`TC`yFrTbDlpsddx3|?G+>c`5idvBjx!1e~}*v|NXOyBm6en?^nn_ ze(AsbmoHzd`{Nf3>p$u{>ROKAC`UNKcjWG3`c|yIt?vK&9{CKxvPAZTuZ>rWANxa-cX|0?8{e@k-uE0mK3a->`F{ULfBC1cV|V$y@!mDNt{<)bR=&Rb zuH2ep{OIc3% z9}ZWK|8iIH^H1Hcw|@KW*F0Y>?RVc7+rRwyYx-A{`rV%V4h#9aJN8S}T>t6l(OE_|sPl_iz7^+I}69UrflS^8Hfrr*?ep=l@pS*yZMp(f;%m zv;7uZ9C15$)tIIa!m%Bw`}?M;KUm7gt?x_UfYANI4?B}RqVfE1(~`fU9)Ho3w{9Fi zzfq6hD#wS%-a+g3&DW1;ufKl(;e!u;lk)wqDaX%8;zwl5za_PA@xkAdO8@b%tKV;= z<<~q_Ra9MbNY4AiA3v4)yWi>bA3s29@c!~P{67`bc)*my0er&jUsdqCUp4U8styg@ zFC2d|=D+?n{mb>sr)K`~FG~7=1b_T>fWCWMi@EtK((kd^mFF4R_OD)Jm$2r`k44*j zw(huN&ouAy_Cs}mnGXzbOwZ*TOz;s(_i%e38078!-?x5L@S(1sTBJVz*-@Q$z8{yJ zf&TQF8UF%6KT6P#J2`nz|Ce6_^nMQX-V*ei3AlVT{vUo_CEF!i{qZ1e{g2&;e(bZc z)34p}zXkt4{oX>ojnhY--~!b2fBZJz2bS4$ex12*3%LB6mHMT~PsRGprN1cUGt=ewPT;RQ$Zy6O{vX(88vpWv ze&A0E@&*3YM#H}v>0ih9>#TgL-Y$b50cUsM_W^G|2JT}Dsv`vL&&#*|&*ThB>(E~zT%w!{^eLB`10=) zl)qKnw~}+@`IMe-{r&&EME!qZx4x>wfBqHG9e4LX{xvuMcV^+sC&oC6eY@&+fk$&b z(8}NA2LJGNkL%0lI_X>V{>K|e@7U0PXSe9%`rqCv`n>*k_lbU6#(!{==;P-9=nfIZ zbN}zI^WO?z{&hrbMb!?=Rd2<=etGN7J4)(~`+j^Iw56%~wy*X!wm&vM{rF9Hk3suL zJ$&===U=yyO3`Reaq2UTZ(Dmd(HP-+%w+G#^`FQ~!PQhky9Zw)!s{PWOE#wjZV+ zf4>o>9>DA`QnfwzUnJW7kAIo?&%sB0;J-|de(L|SI=86CV*&8@>E6$~Y$*Hq|NcVo z*EY&NQ~#or;NN~!*Pnl%8g9k%7g@s}ewe;#;aeI$wn~bC3JdbFGN zr+ERE{XEOP1vbh%<>}56Y+#fZ)_vyZga=-uo=O6m|%P|Cjd4HnrPwyRz z<1_wa_rvznmuau{^W#rHEV#ZE?UCsaT6a(U6+G^gvH$)LYnu3%+deeA9se=~&9qx>{EL6s?(5{gzucSM0!+v6PagIr{hwth zyQlaV0{q(~yV;fX5FevB)=<7oAAf&Y9yr9!+^xnw>>nTg_zR6VQr;G2`!p%&-u%5= z|EX?1{x&~VmrtyF)Nl;R^zrxCLf!-Lv2gt3Psg%%y(?O~|NH*fVLq~dmJsy+@_kd^ z{_UscOLs)NZjK`H&(BAnfBfUSz{7(!U;bQd{lN`C#Kq8?cXaILKLwv3J_|jXRPFa3 zBk{-Ye%q)I1M}18UigvgjXmB4e$%dBCEySce4qd0?=O3C$A$m2Cw{e1pElx$<+$)m z!5>Ba{QZybPJXV_R11Fm+A+^{>gPZHCdWsu|N6%dY`f3HkHw#xV?yxvr(-YYeZyB# ztbX41A^kv<$G`Kk75_39Uw;1ny%CDOrRMVW>e24q`@h$dznPDZZqNU+ed&si1-FlO zzbk5fIz%0XKWq9xEMHr-qn*!m;-7x{Z--3%a`|ZLZ!ZU58-GMCKk}mg(tO|i`IF%s ziARpzgnz{vzskd2&@Xe1qMxGtRixjy8}{C@zkcacHuo~FpXq=6we+`y{igWO?8HAE zGx+1TrT?`nU#09Q{jX+tkH3jc{Vcl35V-87ls_dhv5{>y*6NmCrv%YwBj#-znJXz9bf-`)txW@_}#l^;-8Kb?3Y36 zcU<`WPk-pJZ>;+tzp3_9<$k?=Pxyxo@0S*TcZm8|tBAs1 z&El{0?YlR2IqtZAd5`)BZaMY>chrI(P~@i%WYGQ&mHZ_ld6)9Bj`Cf#?6L!Ym80w% zgZ{Aqx({SO|E(-vuwTsm*W9~hIrMJ%{Q9r&EyK^x-4UT4-D~_W|F|pt{FU{5a2oV_ zH02+^>=^3*`G4NI{^=vvFH1phw6<)`pZgzv{_&R%e7D2uKR4kI=r0qFefd}Xm+8ZP zaWQ}R@FSlR_*v^-4Y9YDx_nLi?zro)2I$*Hk~=r~n&s<_|NWa*|Juy21$?u^_(|5P z<=FIm_v~wjf0@nqd@9YcM*cZpy;>el7P%!T#|hKk>f(*GvEXH&y)7Bjk_BuLJknp8tBw?+*TyKHT{7 z@p->``KpiR_d7fJ>G#&^Z`rx~^uv$ew&B;d{`aq@_ZMID)n)z8+kACZzv#IU{B=k0 z8%Xl$6@tIvlJIY!%;j5}{P7gq_doo!|M>upKOK+j?a*{bML!=XX_x(DEBMD_58_L| z!`LrB|9DuHgF@~D^}i0geg%Sip-!>9tJ?p*`}GE&JJ@^A!!HYM9~u5o?jtYP_2EuG zEBxcPm$x7O^}uq6OZ`}W*~jQTo$xOO?1r%Z5hwTmD1QI{^4n}*>-~L(4}15!Jnv5K z-TTP$b&P(g3x~gUm-wgSd9LFk{`-dfTH1$N{J2#|LHPIm^vm3ReTMgMFKSGEx$W4r z`SI6Jf7n^}AG-Cw{pAYB-^u)!%N>6&^Iu*2_;-~4R~ACpzp@bWcS`z?u8IgG^L14O zeLtdlY|nm~f8McO`QErX^nS-W?`42n|Gm-tw=e7;$U{v3Gbk0|&A(cj=epX*%O>Bx zX!3p^!bNWHH$~`k!*e2IoleZ@bY(s5c|2fl>CEN*vIYD&UVo`cwjucoR9xT1`p-1E zQP2q>p6T)8#pUxg4Q=py=!|^x*2rJ^$*1=p@OYtRa>Whv6f^*n1;-(%-7eA+Qqyqa z}ttTzOZzP(#jTOohc%B6nSLYvNv}H);czIaFpw4G^;qKI&Vm*Y?Ulm`N%s9S zB#e0M#S`G7f#_ZNDtHx~Z<5aHn8k&8xc2Lz`&4X%cM&}k$D7;C>FgRI>z6$UnT>p- zMubW+F2RW@lAfoNs0RB8-nkoBzOY9i7Ym6ya|#goa5@p$VLiDkYz+8IM|kL2kB`O| zDydXmUwh09|I~@Q#S_~wxLeeUcjJcLPgKWJT_CH@3K!dP&eayKWr#4%2@=US3 z6@;N_nqc5u4B^EaugB1seiKCHNq%vrtCoPkcEj@oCM)@l@MhB0YbaIy+{agfo3>~c z@;S;}jvnN4b~k1P+00A08}GiZ4bG943yM6+M)s2>x+@YNXthH&Lt{GZGla24j>j4EP zosmw!iPv(~x!rXh+T~_cWZj*V+@rd?gJg9MX{58BtUbNq$Yz_gI51gZ(nto%215+$I(GiL zi78^OSaR#tseznz<15KJj#i|{P3-Sm6lWOZsa^g+XeBdcC&@dx+XCB!ku|Bx?;&VrB7Hd?+l|qiGi>HUPP@RGd2cL(YB;bdrUP2tq9!Z67ueUb$eXBM zp$}c)g???@%%gLpRB5B^E&)11zmNJS9UVYH7^DBzAwM(VA z850$chWO=ow1qd|;Slk{4!TaQ9W(ZX-Mt7>wKUNy6LodB2A%{F(KQX*R&LU^E<1en zU^>>5ut76V-`vA?c6E1iX7kl-w8q!*vOUe&=sHDr2aet3Y1sX&3~k<`tX51;sWMsv zQ$@qX!(Lz9kC!(NjsMr;)LDQL)Y+J$kRk}{;(>MueQw=QQb1?|+AIs1WhM9ApmO?>uzk}oiV~m$FOVA$5$)p@MxL{@%LP4~0Wty6rF|rU z?3h`)1laNNH`Ac8%wQAKV%M`=(8B4KW0rQ4U^PUAlU8CDqeu-O$WJ&4Xf#kVr8Sby z*e#l()`w5sbZMgDoNJyUqGnjEq6=(m3q~i3MLJ}_ogw8sKJ(5FJyM3x+a+?yvl6JQ z1o6r3IN*^5a#a(+n`(@paZzj#!3DNK@|QpbG9Zh1KQ^nno3xm_H^gPN9{8>`j7i!Y z!c)QVB0P)KAbHkb%d$KrhHat|i|j4C3~ADb5&XKJV+fZZ#>%=r8rM3Fi$#E)5JQ;iOH4M}6$8Zs z-YqQ?>(}Tp5nkY|&n6wFPCpOk3*XbuO1KXhGFl^;R@k%P2Ti?Sj4>R~D>MjTa6bgx z5Rr7|8!j5_hz>5pvw;xEe(7T{jik$R0g>~K%&8(eyUeicdb1aoM;7UlvDZ{bE7&Z% z^o-t$0;BVaZ99aby&B>o0X1=;cj#yCEUbNRq)7}&KH?^2-I*dUjn2v1*aUZMoP2EhzoFU z*9{fH>RREZ=KYk8IqDxRuqnLLel?kWHkkYKt{qIJVZ`@o&h!dq0xHg>k&g%hk{V}@u* zhOzu>^O9kF2(7zekk%*z!|PJ)r*Pg&B*zmc@AOy>#5WhKiCX~3>MHUugM#&nr??pw zk->c&owW+{ZPny$cPiJ`}aw*ioLUfk}*gYI#AtYD#RZ%V{3%f4BN%&eFLy85V zpxM(oLbxq*@;f<4OR5%bEQmItWFVz$%)-RQ0S<(?K;6!@TK9Z~7aoc{E(b_ahh=UJ z%qJ-`uP#*LzNw+4=@aRhSRMl{p=3YQxV$wA#DKmEYVfJ`5fj36 zeFxL4ac|&L)@bf=wF-K|$Isj(xmK&$r&d z?2>wVK?(QT=$7U10vUBrR3qgbmlA3{`4*4D2nD0SI*|HYgAE`GLFl=7?L9~YMfQvJCJHY9u)(@ z+pGpuGO7T<3Oy)|bdd>aEoQDE#>aIbgo5XCX?HndWR91Sk73RCXqrlrAr=fI@v^w; z;``rS{}MZ~6d(*9dJZoV^a$ zjlmo;KEMGwKM8clTA)C$SGE{~lvgHp$K<=O(CoqyfE}XPeWjd`utfrq-6bI_e9T7~mHz)Upidv{( zbcekV9!*RfPLB>LrOG=K)|s6!-EOYATR8Lz@-;4-$apjR>^_QKSQKZ4)P0E!!jXO- z2pcKnQ;LxLrd*}REdWm=b6K&-GW!L26i&R8sSI}>N)>HvgFf1uFh6P|aaFTaf^I$h zh+v#K6Dzyu)RY$foNp~($nKD?Fu6iO-d=&n93?w|oKOZZOJtYqOEkCJ1$(3sB^~di zZ4kB>!rkwA;i2J~ZAgWd&??VZ^ODRi*QPMfK}~ngFQK+-Al;cU2ya^w1zc?^Q>F}wmgf!t?$eeh)OmH@gj-G@8gQ+y za$GfJkBsRc($w>vZeJ)B7*YC`G48{^SHcs!xX7A=dkA}yG! zo`pIoOh)7-)u9CK+JSLYSGl4fLz8#67|Pph2ivqE+^mGhF{XS+3fg(k~qF$l?;9f@kZT?$36;h4=Cv+J|VV4Njd?8>!|tK~%o*+DAnM z z3YVub>T*{^+FzXf8J+7FS+OOs`Y-9-igjn^&DNOq4kVtmR&X{t4li5mI#0kHSr8zL zsLq+b#hR|p6(TGoAg1&Z=ONMf++o4_DT*-xv|T6=a$CR?6}(_EA94b&WB2nyh*$%F*z>GLeb3t%=pY7E}0yzU0Ju%jsijI1_5DC0{x;b-*5syky+=u5J zN5JFSM(6-^w>!#I&J7Lt@G%@K(D<}NuU&|Zoy{$2qSGSzOb4cj*vSt;EPQ3l2q)B< zTzv`E+0jIbO&u2{oN$M=X+|QGPLR8-qk>*t%ovUP8z7hC z9PErpeCAFQ!$^P{$fllO#~T=8gPKJ$V{yD$Qm^jhow&wv4tUy3Qj;uCHL>CjevNa> z$RiR6`>4x?SdzQUryA&hYov9o4CDp+JOLUcNyGVUPobpN#Ny%=#zfO9vpp$$I{1Jm z{Nna336oT{OJdY1%F&7&C}D<>_`B;H5rayN32VtN22H3&9Af9THt|dbxgnZDHAFsq ziGJ>+xH$!B;p+4oK)>90(L7O5XKf$Y#VZ>0-mcO0?lVm~WY{{8OZhD4CA*uhj?7$v z&;X)Mk&NFb=2&T5uhG>)i!mFmyg`XZ3X-N0tK5zd@>W@|wlyf7_R*+7tjVaD64iVd zONNsv_Caz!fRY35?tUb>&|2AA=AfNea)krN&l{y$`V+qexh&tSf$xN6N(?bCZ9=2~f$67!ZSfP*8% zSmQ45vxdpLdo!xhf!v{0`p8u0&W^QfBGE59keW+$e+)r~cL1PEFN|NFSjgO|x?sVH zAF=Ckn(Gi~Cb^*j6Xb)}wp@Lwn!Zhx9e6>HYnF=O?!j)>IUp|5pv2gNPXS?y+TPw# zxyK%XOG=o91Sq8K(ndn(ig}Bt2)0mKy9HQK41%%ox+tyMpgOs-dvVkE@fgNVCG_^m#jQJ!pIYX>6D%1XRI*_ymRz>o2MC4 z9vunTiiqe7{P0HD9VXB})>0b6TSP+ltB9ot#eK53Q>`0tO>7u7D&lUL!yQ*iXDWQJ zcOvoFGX z%?)W^>&1L$3hZ7UZ}(}?%1t9dJ@E}BwGLSjKmp4qxVs)_p?mBe2OOR zR6U_ve8;W&q}c|?E=gueQjtrIBO)lzkH+b?l5A^*3SZwv3e7_8*d%{8XOwrG!Ydw6 z6(*(7FXU8*BIZO(ZsJTB+Gg+rcXuSHoC!roXAY@Ov2*juSMP`iXI~gq0zGWM<=TVc zGoK}=2$_CIGVFX+9y|Ih03B0hT`OV*Xy+W$CBkyf&JLpDRzEnqJSRtdXQ$o^m3Etl zpc)n;y)(xWw#t`hu6RT}64``u{pAd3+Et4JZ71Vtg-+1xKz#j_Nw>OTbO($s0^v^e zAnZ&ZbD6=1BaLfn)O)eFu23*Qh)a!gw33K@-FaabOK%wsz1JzF!_0=`!R(b>~Rq2fjddMBlnbE7$SSkrX2NN*8PAwOmh|((TTgyYCh~Xah`1 zRIZEwGp8XgxL!`B@86dEsY4ewJ@wLw<1WWz3wvdQdUeXqy`()8!NuN1?s)>Oixs4h z&fx|-+G+lHFsd^x4s&jdyvIFIP)#<`ZwGYMIyX%vlEqU9dscP^?YG~@sS$*0Yn}RJ zL=>W(!5ZPnjD7ap$N}=~g?qTJj_TQ|>r1@Osr0iFC!@C~e#z#$9vdOoh7IivXiii85S5 z=~<`^;@;x93xg;@wHF$7qPIANayWsOK*BUm49%W`w(aUdUe1$qV@p}wy5UyeV~jmF z)9UVg?H2B+O!CcfDh`9|t(eI?)L?`VWNwwv8a%1~}g=wYey+-EgYY`j4#* zKsP0EaRALlC$6QK3Eq^T&{0H&o5h5xOO~&TI&UvVf0?F`R{RSZO~Kp52j!{}=#SS6 z0j{n^M^qM!$%7G~oDE(FL_yZG+iFa63ow-~mE>{Xq&a4mUWQ25(N9%euc6#lr#6cl zgT=>qca&Wl4i9j2tN6g3K;LY^-$8Z|O>JA~w>g*=fiY1W>U;m42f~VM{Gu za|i0AW`#ex=-qg|AFqdoh`$0fdshargDx7^0qKRz&2%xX6>V9L+FK8RMJ&3@scUCn;&N>5hxtb9-@TPZtJ3GQmwAdM&<^ z-b+m%<93U9B|na^e4TOcY{vHH&1KnbkX;w38Qq31qnyz(60yVql6#pPeyss&y3*`o zWZb<4)?&Tf-$CM5wrWx=i$>WaHD)!6JEZn;7ttqk8BAykk|wcZIBTdkWMDAQ(;a`dSi@1F+NL}~4cnlzt-xqEc%Z5wp>?v5^q{UPtA^b& z+5xxxtd6BI+fOidEYXtdrj9mf#ukDBf6}EP^@)! z|L6$si;(VK4&2^M~ABXJrdR2YAqu}vgL_i9P=PUKyKzpjrIO@qBC{;9L)UAhjd6%vX7 zNI*V}vskBej0w+2g1eP~K%B znb8GJ%FvH3o|X~cNUzkQarzkSQ1ivZd&)isPHY>Cz%O6(q4HWE8$C`=hzg%(BUf$k zWZ?+#60Wk4s#6jAA~VIj>@v$!7AR$(zFHZa)<$ z6@lHh5FL3l7NxyXQN5WJenf_INhCa-if!op0HZ|s*b`Xf2i(cJUi)^O%x$SHb%6Gv z>fM(jG+&B7q}o=Pi0nGp;#amfl%6=OvJ0qftaAq+DW3P!NuYSw8q}`f&AQ3zT?oo> zM|Gjq#?Ev_DQU>6M&7*Wu8khLYx34oHtCG6df1DBe2qrE5B5Uura)Z6xUHNFTGQaV z8gze&7u2=x9Dnx=)E%^7()i68q4BXn(@s`WgV8UEwWBY4z|anN(+B8!rZJCaYe-gy}ikLPl9u1oL8YA#yf_MKA1dZ2rKUrOR`8r|T5ELsMg<)i>(KrTAD_X*3KkeldKrdpIa{LZPd?h-Ysc z&+aBm>}#g>8R;L^0yaJB&ERyv_Ka6A)CkSC-St))`{&SfdWrhHt&Ds$ z$)L%sNp*iLeUA<-IAU>OfCtGOj!PRAz7%iP`ZNz8I@l=t$kO!PL+9##)#o0V153Yl z_@)F*GRgDkm6JM@-~b$yW=zBA76%z_+?;6iidwnmbXmf6W0<9dP2+a*JE|hbnFL|I9{J++wvnhF zV#^njR+0uqqZ1SyR%;f9#G#;_q)NKG=iqRNq@`#R2TP#bHhxx1q%p~L+x;KwPx4@4 z%#MH;W%7ZT^r(cG)zAnmG4muiXUT!%TwEbd;F?v%r4Uez@tASn`r9i}`= z>M0#XhjT6-dx(P-PNI>vju3RSbbtBzsf<~Ordz85NXmnJmkfZY;!RBp$C=M^w+-_OHarV}TfepUbJ5VxhG>Rj{yET8fLN+yGNC=F-}D&ZBp2p!AsCG*VXGLELb;T%m#0rZqjQq8NmfN+lj3$pi}MOBRaMj zCLfae2%9Or?c!?){2HNaj$hDNe_YFD+BI&?3kcg@kO^B>>w?~SD$dtU2aoM0JS^`N z3o9172K2orc}>B}bJksC=Um)&Dg^d==Gux|q6@Se_w9C72_~LXe@eNNbbx~+J42V? zC^Bj;UR-!{iRGaLW^z`F8rmv1e03CxTv@Z(o0!#d^>X2CH~$M2(dMx;k$N|AZ9!CQ zHSdN_{SchkGd&Hci%n*JJ)Nw~tHxcKwU!ZA50*FHTt;Y>MZ=L%@}M-vf>9Wo z*1dsY@)3+9&s41y+Y|dP^ z%<{Pou1Uz8??QLuT~v=Cr{a<%Bu>#_Nu0Mb@~qoZTVXeUJ1qDUt|D80l>KG(VfWQk zSz4UgChQuyOor#Hn4eMdh?mndLL9`d?~+&tg<{DfE|m}RaENgIc<8#m>Y(fyyZhI; z<5`sXCF&P$0~3Lz@E!R)!h zvr{Q%qeSS$dgpcFr=`F{A|5d_dx|{k%#w*@gjCcAE7H!RK(DDg)FhVKsz)+X45 zZ=-6eFDusT0MJQ3E<{F4g8Q=Fsh2piO-Ds-qaFJrQMcSHWcQ`m17(N_LFIFh5l*KM z!X#f;fir?@Jk(xa;Ex8sBsa_|Gk0$)r^0@$97`bP1-{xl>DSU&X9&1=W&M=3H#sZl7CV9d?yaac8X9b_19 zT5Mp=F^J>q6dUY0>tna>#M0ghmek5#{wP8&XffV#%#b(lOR>46yBpd#t*80lVExfJ;w|ywJ9k)R#3$UE`Y78;;Zbj@LGt zJ7@KI=4aE_2xhlOhH9uGvyGv7EX3S!sWJ5OjF|EfiHwk>8?ct?6s+B%ixJ@57l0?s zX#y$_a#E*iw9xOT-?;s*zL|q-{Th+d0u|Hg!cgX!_z>%01d>%N3`tbYAtI z%NM;j7H4`@yJ-bb(3S=-5qm_x^W+ zY2DyCV#iGucQf2V8=&IvJpufjc*I%eik(GmCiL3vgnC*Rg#lMfWmls+Ei!GdeYR0d z8BTqc$RTrWV3|+IcO2XGI=P^H!BpR$pPKGw6Y8Vg#^S{Y&jGxNC$NpBD(Yo;6+q*$ z`^s}MUDcQ7H&-w^p6_(#h}P+r8O8J-Z_QH)6pFuYFOs3=S7UFSjfd{-qWNM>@H*Pu zSNGhtv@oMeyQ}~4@WjkYnB_Mqeu*Rj1dt8$JEj^Z|F%5bKvZ{LDESd(=&3*lt-I~t z+hqT4$=$q|{aej~=TM9u7_{PXIbHV4p_7Q?j{02 z=-R9HUNU_nyW;v=KAu%^%JqCEf}0k}2l8+7a0`~*hFl81bJ>B%rUj%Y<=87C7|t1G zXW;D0hG>BtGB>$S58~Wh?D3GSA04_Pk(kd(SIJ>3hx^4`rfE0 zt;`30XYl!PfngJLQIyKsXp4uDZ$i`%NOMz+)UOdL)=hu8*_mX$*Dt2$7O$+fz3yDf zOqm}$A$L!KjFn}CdnB$ohoTmk^JwyBBicT-s*QnYk}z-b9XL$RNJ^M$U*aoCO!A?9 zttsN}j;>1OjAc1xaXDH)bFjZG&fr^)*qHdjB`%tIE5W{>GSv_|Ldf&g1Y_B5F7z-c zk4dIgbHi?R;4apvo3BN>st+kf%mz^QF%vFZ(p%3L?tsUB>eE;Nx)m>$CvB69?p&ho zcQ6|yLx&|(LetAVaqTY1hm{>Iec8%&-K0*H$BsT3Z)M*$2ivwGHqCiUuV$mi9cqk2 z?$bBRA6|0>Z7&%fIxs7xI64_O)3PJK@n1JEf0_E>&2}7+CUrR*V4Q;O#S1A2EmXrh zn|`RLtQpmfUekiOc)C)Z&At^?orOmkznZ+Tz84?jMP@q|q1}!3S5}Q4*F|7gN#y+i z-YFxaM~k9wWu)8CYnlqeM2EPw2XsIU7wod*fq|XUvAJFC0B<}9~cks%AkzO3;S1c>?+zrH3;Lnl-D71tT;6^@72T+}v zL~7ILGTrw8$9J;Ouka-s!{)I(%cNoi`Iywa=r4v;EE^S(q-k|zx(PxoA z%dM!H&e~l!8|IINOnvBJYUJNX>}KX;(icze`0I?(&KYQJrFH6;GAD4^JT|sp;tSXN zLppE*CnY_g(sNPn^W!jldnIEOHA9A{_X$Bv=Qa2{$9g%d;D^?AYC9+tCRN`l zL369zQ)lCKS8wQzL!-y7JoW_QJD#i;&%d~B#;x*|45I~K79bMmtXQdy1DuAZl5nt$ z@TNy(o!&=|S{ZToXBGB31e`}BS%u54!S1U>thT>w=BY7TUhr#@a8~@GvZcIIe&`RJ zWsZg%?YtI!B-51Hes*+3<_tk3dCW5x^m_l`pml}>&w8U2SSZl!nnecDVm#VgsCf@^ zN((8rWKNjN*tg@6FKXSW6)+|^jUg9(_#HWvhRbEUs^Xd5*HgpIx0fl#HkOJAqnF#0 z9)q0(WTUp&$btB*^;*;nze&JKPT=YE_eTGpLle@QulohhJflu};gWImsa^z8uuox1By` zwk6l#@kn`76>@6S^v-B7>JCfhD;PHyQiBzA68W^4ZedtKxiDRd6T|LTB83jD1~O6E z1?2MBv5K$rtEwq_NkQY~U(VyBhu;(kxrPy!K2KZI1p*G$f~Ibiv26r5 zzSn+tS&zpZ{8#B2V^;yy7}%b7K7QNEi{YMRxFE@9M@lb}Qo9H=*;BKLOB`Xl5o=@kepRo)b-ZNTb1}-OpfsVqDaK$vW;Rr;dw!4!mRRoM z$fUgbO19B_%Bax}_QV;y_#jU7_^d@NmS``K&zJSp1#P~g(^s0GZj^oJxC1nnjxkN{ z9CW>8sZ#67>;qHXM5zWk?ZA$m?|8c!;dZJsV_Ua%amAg&ofl3SPA6PSt57FvFBg;vLH>luJ z+aAnXiU6%?c)MyxI7>^zjgs>f&Odaq0Rfee{PnORpDY*Ww2@GAd5W zj7zP$bZV6QRp}VfSom<=tyh%EQ12r5=S_F2r+W=LhSWVD4d0JNjxgo-lX4y1^nQUw zAr*KH-3k1t#-tZuDTgzz%*%Jy8KOW9qxyb2Wz}g2v|WwK1FkI!wewUfS~D_HOy+nr zAwxYsz4_;Bg1tI}sGSfem5$tyQ3S@vk{|Ep89l4F6F?uJvC`C;-Md}v0Eq#?ette$ z6SrSRlCk}LmOw&YcB7xVToG_!chhRHu_4BUZ=B^OkAoGtpl5N#Ig%~jzFn&H`dFdW zTpl#j52Y`k$L>r}3+g-5T~#z4Al4ZX&jRem4)a9U!|=VF3rA3+YTtk}`DhB%CunL# z2(3J2-f3m9yPk^isR!k|XYuTHhV$^)vC>}F3+rqKwHeasUKsWmVY_?a zQbEx#4hE^-Hy7XVdgR5M&+dg=TFVycVE$%N4F1YKbkAUUn#XHSE3i zMZ2`~^>msE?8#xXHHlDuzoF0FW0kUX!~jRBYP|2n`HCWKV#WnDSrFPW>445)X##}+ zDwx3SMHwo>R*fVN>m_>*9hBd|6?;e1%`F|{Hw!OZQHqTc;+m?ua(sVDLa__aSdJaz zqJvCV*T8h8jxl)5D> zKSJZph-FL$Wjrcx>ZXf_;qzBLlVV3)lQX&MB|3m2YHc}jyy{PaEQ{aetG)lrc5!Wf zbIb^HIz4_lP6Vht^Py1nUq4s`xSdXL^A3Ic5iWNjc@f}vp#hov;OwUuEDC1a;n%f2 zg70EoegY`^I0prD_g^8aVV89gz7{B(HVJ|DwWRA%uwDnsAw~h-o2K+bCDodPZc#_-GL!~@R5ni0*BQ}G?t+Xhl=FJ5HA&9 zVUT5RS}!F`j3kMNUcg3)KSZ8|v9dv|hmC&_%Zl~6M3 zyF2FE_?fxpWYDTD@Y{053*kjt%2L5x7+sq5%@EC8?y7!fD_eX89@XXRb6!fvbo+Sa zL+LnYz|vI=qgB7?n!<8+TV+ie;22T8i<;I4?ZJ~tZ#&U5jq}aNh;lm!_eR{RnXWu;>y~m(W@bgV^EoJWRf3}Pkfh#ty`?v~ zfMb>LofYdO-QohYK+1-|`Qz;-Sl>V1T4a00r{%P(MMYc$*uNKlyRBO4K$1tB+FSFtQj82uf6 z6-yEVgvrD=WVHd|1*q_iIsJsNg^d7qMAcXQoxb-2T6>4f?CPrSdX6%3Z3!lmX@+^< zF(-pCqVof5MR_0xJegaX+5n0J^!dh;XD}}^s2TBQ*ol8k@fAb2}TqNG{}w`7ywx{(9mm6-WpZo`6Q7OPB}@Jl)1I-^RheVGbIoXctl+> zG)kGBzNL0eb(b}4_rt`oT^Q2J8C+Q5;l?4PJp{;g>G6{76V4)MeU z!sYf#P*ZT}sC~?a7cYP`=G1s|@2l5U?$S8pS;X6jkTx9Zr&#g)ac@*(HP}%FO`a!l z@I%IjD*KU#AgwfM*hLIH$@ExQ%^iPWvfSNI8(%$~=*BDQSr^eW@62&T9K)%quWp38 z*ic-s>wzmjJBl@qfPYVHdrIs;Pyrlnd97MWF&m&6K& zV4$hQ6PrQPO*|T}(`XfElQyWEj`byP8qYAvuLKQX(EHi`T?=7Av8Pb;_cNtIL`*TBmwOm8JW|uR@6w9es8GjY(4BIZTntoPQFO6Mv0NZF)O(w z0)jx0V+0(zMKB{`Z#glJcLjRD_ObD-o|Ia}$nZJq^4xLfZMln=cV3Wo)9)Ze^%4&R zrYZuA+}OSqt4s5GDrXW@v9xa6MRC#Vs zQKw}(HH|ER?8@T!E)FeQIq(HZXRFEpo+n)`QTM|nE$4msJiK(mJ7B4N^5PouI=Zld z?i!MuVhiB=>e*cFi|$9qaORW-J?ea*eJ>W!i>5TB%&gMo6|uT?eVpK2a?RV$5CIml z$4b1cHVDO{z%M9S&C($kX@E?4L^{Me9M6m}rJ>ojpCU+Q@Rq%W78BI~$j+{$%6J&F zLFda6AI|DbdMoZ9!$}$yd$Kc#-8|=|tCcX;i=&DW0MXr=scr!@m;BnW8)OJ;!+0(W zUIFJCcx(+2LUZ^L>C(n@g9!9Ig^K!W8s4W0#l5PP_5kX0f{PSzmC-htOi z6ga%PL{e8xFdLP4pt;)Im?ubhE~opotH%v=bjWGoSC)>CRCc()QA3Vg9NsWG z-o758vDmB72Gj|cJmC)M#prhBlrc=eMPi`%9tV@lUKzQgB8+D`xkVGy@^L8CnbR6( z%rO=h9-5g3z~z)x>}Uq>f#W$(zFzEU6&4htPawb#KH$abZlY5U7auLiLZV@BD0MLo z!*{`pkTy+e?|2uHM#u1^y>+${46iW4&(n=N19C%=S30Pl3wA?AovR8VQFGBo^v4mz zj`?za^}8`}Xwx6mNKIdPL|fpHGYxEak;PwZ2^On}*^M72gBhvEJj0?8ajB=wJ4B1a z3YDSp9d?R#Pd7V+XhUqLi1g_yE)3}?eax`5%6qjvf#$_$T#2>u+e2pu^Bxe#gD`1? zXoX_6F5)u%UF3H63`rui2?D%ycb*KIyo!f=p}e+Wwk4MHg-Z%)1~p?^%bbqD?VwmL zuas&NG=;?Ef;Wdck>Ak`Q?A=mO1$7vJM_vs{tKJK`xVr0%E5}TjKAG1 zQqdChtjyygc{=L}X;@d_T?KO?;!E(-80NU}jitI|jvtRXIh2czppr~S>{k*W!4NEu zc2NUTiB&@0i=_oqw)WgEv|?E0qoGD{@TD=(!Zna(V$Z~^eyTy|q<3EECwVK@|czd+Me~;28*DeLt_#I9CV0GJ z33!GL5-t)tDR(un2*ofsWXunACW&g#`|TzX`fL~OF`OH^*M2A1^GrIol&6t}1G`@fs!ZZy-AE05=-$X!Xdl={`8AvOg40(0OKSk527nneqCbo z`0ngL((Sw>U&sw$)W!^Q07?u>8jxVL-sx5O@Hsg@LZ%}%cB`eF*JlIDZhOm+D4L9!eQa(>!xI{y zm&%v()Yw%{Jv+SYNHO366{>r6Iwl9oR26x$Hax-;XQ<-&BI@~V;K@)Be^m>EI86+P&?UhY`VZg;qwBr55j$fUqKV}x?~YHkYN1mitV14HS;I1JV#(fMnXhXAu%;H#C9K( zG%w40w%P+~)DAoz>)c(|cHZvo3P_f@ZW*%r0rospb&V7^sp ze^Xdeo#@tr(&pG%xm^@(@Nd^BGStdfpK$cx8lf+g*o>By1z{d-f)(Z`_g*O~3a{2- z6He_FPYJ^X-aM6umw3!#Vt0QU>7Hq`GDPx5>_kwu=SN$)FttNI0TagdsqTDd+bLi) znv{QQ2I6v9a9{_O`Hbl#a_ayLU_es_nR7i{QlEUFMufCU#qs#hA z=kfA(MPhcho4r`%OobdhHs{eK&Q21F@+M!N0t_4*?n@6)-L$GZ^FD|8X>?u0^7x9? zfUQT(dx=2fv84A6P4)`MYeJHIpnE1%<8F>!?Ja6YhhWPDrn<)HoU zCFpRJr9Ii=vaN}bbW^YV&4A+sTcjmf#NC%9384%66X7EFdgDu*2QoFjA~Etf_9#VF z*2(3ljfP=o`W=rMvAU6BS>%(TH$B2d2t&smuxu@pW!#I zE>zlWw9X`>H>VfiMm%`#`sGRknt8$D?lzd%v~#yf-#kQ*uG7Y|0wwIs3pw^c2kB6p zU9O#^t37pX$Sh0znAM%z$W7*JvEenvjTla+ox>tLWy<}jP|Pe_y{W*6>9AT2cm)@H zqjvU8Q-ZgwlGH-MX-M^XR;)BQcWEM9#vL2oycbtk5IQ@aiH2V?vJqZ~TvVA3YLh92 zKG(Z=60egwp3ZlH1jS`R$8~Y=p-ZhX^6X2XR=7@^2<2Oj1D#ogNA}L6q%^t|sdfbG6dfiT zthCZ1SUH|C+|BSq9dos0%S|i1(k(pujv&TD@Y?00U6tIt9#IsUnJya9*-=&Ph+y{` z%%v1DeLG+MBb*}t_jM^*r_T6;xI{{&P#F1`GS@^Vt5_vsWhNAOFT%_Wep4G6#HRe?@pqkwuW92`%m{O!%8V#qwa(fMsN!&nHMh(`m z;2i~9W7#dwQW8^^!^D_m#B-rwhfjU@_KhD?zrAlfbv7lyxyJF?*6uSQL%1&b#!a}q z?($9#9-_LnMS%B=+6jp(AiTdEiyKX|Y}n4_Ul?-<;@s8As3L$fy-m}VQM`${#CZ;i zfY8gQlcp0MXAR>EcU}*kg5m0L%WIu-j8!ZZPTfg7^0B6CF61eQ=^g!fbrm(c-K>hW z7Rkn6C6|lwz$=J(1ld79VaJU4_0v?$UO)rBx|01 zO9=duUK;s!k!zQ>^Rjuz!A)(v-U@E4FgIpYEh%^NQt!rQO~{9tD*<}HDffkrbU-UM z8FPb(+UOc0v|f5#h~DXk`6bhFxaULDM{`h>xpk$^Cr{;E6GWRkg~iob%k$NQu}2gXO4b%E zXX|GbsF==&c>NfQK^Mbba!xOT>xLwN6q%s)3Ny)@Ctsi)ucflfJ>^|B6_@gs(B|;E zeRaDAFKmLp^BmmQ8~rkesTaVASatJ7fw!xQ4BKvW{DxL8&DBn!F;fS6p6AMApjECc zO(y(ZL(udH(B)pikB`-qY*T9bjT%y!7{eXegpnL*=X-MBV$-lx3FK$@G2w)5Ovvsp zN5WrXN`F7~Cg+3}Pw0uKb;gnlIvsrT zcf1oW?repqkl~Nc}1{@-Qf92E7wW7)5g?^J+MVG^scc^Ttk>yU#nJp!0!@PG^cCuk6 zL|ipwIKuMdu7)M^IQFFS%|u0`EtA%Lnxp6W8f$7aT9fG@Di6)C?imW*JI43wC3n{6 z>eK~DdOdRmy6qH=E|ug29C<-1kQmx$gEl7Wmc!%{(^V5%YKpzU45#*pqJ(X`u#;CA zPkoA4N<+!BYZrk&)x`boBHAe ziy{btL$h6I@_bq0?POYJwTVUQ4->~M?veS0+4z1l!2)FUN7NsWG8XX_Px?5g(Mq=N z(r9uUA{U&GW@fR%@oHA&sb*&&!(k)7bkULuI^vbBd`&jhpi@AJn$7$m-8WbS*#i&+4L2#l_#KXe+vKfHFMm zi`tQ3le1+&yDwZGTiHdwSw-Fz@=LnO&D>pQS9=`}vG?m~booUCES*h!Sa-atjes`K zfE;dh9v)H#@sV|r{3o}7(V1NM-KB?fUTob-J03cg&XN%!>%e2nOX%I9TKt$Y97J%k zO(@PaxD?@RzTyr^k!tVAr6RiwYK->Q^yO*>(u=eO4mU+~@OF-;k5Yb_&*y{Qwe0E#m4hk??(1ZX%$AcA^!Csf<`Ioa zUOM`DKoFlXpHzNcwO1}(%@fy0%y^$B_t@Igomb;N^QoUMX`}DNL>X6QIK>6j!0CqK zVX84ZqCo}ioVcl;lPJ^arWxa}m0Ha=?&QzbRq~@|?8Aw{i&mNF(Mwwnkvs zEj-E6YNq0eC2DC}lYOSv5A*BRT*ZfV=mp9Sd=+9Cufvi&5`Es1)eH2Io}ZFVFGPiy-k12utb-N$`H56~b8r z-DGhm%x1noFG{fvk{O-YTBs>v>m7=lN+%)2U>}#8^)Rezx5`H5^N9-X1CzxCf=R)( zU|Oo;DgBPJVs-@d@9k9;D1!BwHnR2~n~+lp5_fc>UW%x5Tesy!;XuY{+oBm}vA^n}}pt>j$K7&8+F` zF{$ycyviDf6S}LZxw_{(4b){IUR}MTNy4P=twz_rfQ`#2z4Si9G|OC9gdD=sy-4pT z06Q91C}`z??2*FDsgwA1Z0krJ){Z^F?NJQv6jPzdl|Eh6=P+%7DPEU)2e)VG=!lRt zjCA!i_QDGWk#m{tZ9v{*l*)u-R;7uz>L-yuZSq8tOkCM&&PjD14QX+y%NIe7#(Q_ge(>ek1p?QEc)yla zG-ea1h65m<^J4U-ObsWieuTPXPGaGdd|SX8b<@$?cB2<2DHlMPE$awM={uSBwI##7 z*0`z{+{~n0@pc1;@`h1~yZDDAqXphL-jtOh^DOgLgO^Z*A~IL4jw-VK@@BuhPA^DS zPoa2i8cby;DqDFvbB1;mHk(il)0dv4+jduUZmW#xqRPaLmOq|bo;A0v#AQ_F{-x2W znRnXp$Q($T#hj$Qu^M_GAL&ERGbzW8S(x6-%GY~4a2ln(6UYe~X(>@o8Q7B3t|3c+ zsJg1(ttWNY3zY$zrGOkm9fF;_?eJ!`sO;*gq0NuoZn%&5MWG0_dp2>UMjL=ys&G5` znNCg5@WIQJk=^`^AFK{y0j|a7R|A&-R>v1`bTdsUk^_S`%cT-D<8fvkuH+<-yer6& z1H|s|+f%$NMhf|E zo`K9KJgOPsT_s-~Pr-4@X?J{7*;i7esN{ii#I}`a3d4IBo2R*$JiQUd8mcDhem5B- zSWJXE=K;2nn0v|3enntTW#BnS*=U1m`&tK!>hLsS9Du1plnIgtKII+VpMW9Z^*7-%bLX|f8=>c zg)>z%rXDWWxhw8+bTyZUTQ|FFbKGN(lJ`_s3vQGFy|DBN@K}3us=IA!(gR$sK|W9N zqDqhAl4K_{NpL;e0F%k59Euf*puZ0hT{m@iWgwi>-Z^dL^6JFgN&D4G`WzE zM@s9P*V0Aqa@9>K9;>ZT-w|l{Vg}30lmOodyGA32^+92Vp(_725<5}=;Y(hJ03HC2V56niR97uCfbi0~0y4@)* zB;=9M*!g^~f=d+Fr^9wGr*U^h^qG1#&XbyJ3C-Q}SlqBpVzy(`9a4J5j^}P>BCTkn zKu=fQS$)Io1x{jnI7D&vz-A%}vZAV&!_d2W#)T;-_(sc+j+ds($+{v7!U$?Y&6!gz z&)Jc!g@}-RiQa)*?4878RDF@M#_aYri3c0o;z?Z_+s@b(@Go9!1DieUZ1SN8+T`*y z?5*s1JHkQuCIU+O(%ps4%k$u!CO&`2bs{Zrq7JE(cj(=jorkCK(Q2IX=M@N6oGYE% z?E9N^7`}d}ABBFZpi|eX3G#}w<-!c10P)^Qm>+SWB8*u;q~ne~+1b={Rc{z9TyrZf ziX=YPN4h|~47)?KZeu%@@gQDC{%$D3uGn)>>SudT%2V#{vSgqcJl-Eu$Ka=9x2Yr!X*bQ8Yix*bOULFL?#WjD>`8W=LQL`A ze}P5PS;lbbwv@HoPazhbuOpN~dVQ~1-3X85d znwtGx-B^-b)<*RKcSloXk?XKb%VXnQmt1P~I9O0*<~l+w)`W+Jd6OS)3>(rWFPe;he+WvQok@Kk6~Z|EjQff-2) z>FqEC%%4t!E&8tAH-8K6x|tO|$>kSp^`1_PQjy-VmHP*2Cx)7j9IHa`1k=W zYXpI}$fupL9fiK!ocWn7WJcvn_5{rcY#@M+S|rFhAlKs~_)yd8Qo|FO)y7OjJ6dbz z+ALf8yxLDVAh#_*i&L>Guef#QrMnKh3=S(}ChBuXUGKMPWz-sw8IP};DPY7tWehp) zkjdI*$4AVEDRA{8>7N@+*(ylEwiI7)+mM@ivl_#ua&Iyb#QlAO;98q5*Bnd_>wUjr zVzkV@%$TEM^hPJItdJdvICSeqZel;IqL3bmIM%ml0h+GbujhRy7YSv{n>u1D+`nl;2xo~=EWyqOzTa2vHa+(~j-sXB+YX2I* zt0f6MOx59?gpT=2U;`Cy! zMm`t{&o98%jpOD|!x=eVwr5zwL1~u7ETxb!8;TGM0pCol?`T{nVGCQ>_N)qOJgf2iKG#Oa^JeBEJ!6N%!)G8Y4`k3vlLI>ak>kU>Jsu6CPld6YndCGv z1hp!aFfl%Vp|SOKPV4>{PA?yB%cDf(_GAR?wBXXvHP`t8t#Q4}3GV{1khuLgn69u% zT_cE39iihn3Jrrpt7CKKwp1^Il+?7$@`6U6*#eaGiBK!J8*Ef)Iwj0DImhDN0xU5% zcx#iNJNyz#>+Kw4hjh|Iy&h}tJ1|&@O&H<0l}11)?~}U3$1@9yna|oQ3x_f-&t~)L zcJD{13W6dbUT?>0|9OedX6O&$%<~1bYlL2&YjhttbK`}PxE0TxzwkmmbmJHSF zw@Q^#a-(nrEyGmE_3AF+BBc z+x2IYutT)$Mvz}!;%z$?Ju-3RW{Y$}w^8U&b!es|z>3PNN#TV#foH>fsdEs`7R&)P z)o8B+{p!xmcpe&RsyMOQqQi^xovf|`V%sYs94TiWao0=Zauoos0nH<=>qA|LQtWv8 z%@E5A*Am-Pk^FS@EF$WtncP^$tV1BM^R`0p4M=S%7x=Urrri%@c=a?5%%K-zy>W*H z-!Q4Wt;Onj1(Pj9xZ--P+N)&|<;m=Y^A6f^bIS(2i$ZY6Int=F43W^2!%)=Xz4M{~ zBeF6tFI8(b$T}1zaYJO}XV2Vv)KaLkhTdqaU%g#ECMj#SNyVkP?9_GCdFm6!qY@r6 z^7|KIC`vf+ zZ~##d>wx3!HS0UagaQD(L^JhTh>SaX_?qu(zgZh`4ZG2ByT?{%HZbRtXKu$*{pvua zns2CoPX`Oc`faV1na(t(2X-ExFMxOF%#B7zSW~l>>je`!Uk1KO{DC2t_d7RABT*Tk z^z+he0EH)YR^prS*#+JZ_#7$7fu|47N}DWe))ii+2*#{!Wl}ruq|E!lM-mEDI5@L! zy%o!TxZIEpaX-^&Tu?>oiuJsfb{FxZ?)XgR7aPbZwQf8pKFn|A;Zs{wnmtnosQJ2} z3n$&S%L}UWc!Zo)qEb2}fLYmzDUS~R9N_}IT;_3=xg(1WKxT)IAUqEEr1hB+1LcJ^ zzUEM{)kN6pyAKToM3rpkgb!QkF7;*O-gz%T)LPLhxjhc7C62vIvt+JnN#sCqCYD8R z*MtL@*hOb5Ab-9}33Qg(c@ms4IO;U|K!NVCsBlI}KdLy_PjZ)aP7r|Nl-HMXK+QG> zm`mO??3zFw!?sziguA&_ZdJ;Isow(vhryB@Jh$k0x+$T##TAKsKEIS3724^2lA>k1 z=Lq$TvpY(rO-JhZk?+=-Uizh&V-=gLh!v!6+@Z{t=gUXpaDUwhBSEaj=f z?IK^FBu^OW(stCeZTNLn5Jxx*!#!isac;-=Ta&;ABSt0UrqOe!(rX_B2dq*Pn+{b| zuiJQ^^{XsYYGB9qNk^U2j+!vidHMM!p5E_6#2XqO1_0f0iB7N&v!7}d4k8i3Gc`B3 z)nTe2OQU@#(Dh+;X?q4K1Ff>#rBF;pIINa2NFDo7?cVmrQn=-K*Ldd3fCl$;U&=gB zv#T?V)?j|Nqbcpvmrxz^LxrYW+cFeVX0QTJXJihB+A9h?y*@>E0{%7y%68L|aQqS_57P)$?sUnZ=^NOVNK7Nqh^NaSVL#Vb9V zcy|?)stA(v1Ik+OrMYnkLG#FZBhOCyU?|A7+l(cd@Ci#9OoVF50 zM0~BovsCU1{se=M{s2m+YsrpBna9_MzK=)3EBS9f5q<)IWG@orpFfUg!Vg!(@eR#C z8-lL!^9g;;8c!zA(`BGur_+VuPp9jZ-OFDLdjE54HRdit-)aQknP|fu$hBSBT`4&^s8}D4{?~lwUCgzDj})8OJy>@2E3z596hfvr{hAg`QHZRg~+E(lPV_!WP_ zN>H2Pb470g5&5$UY+=dI4pPBS+Bh}qfjhze@tWY$9eMt&rq*qlOC5HBa6NH=nJK&Z zJ=1}2-7*c79~1P#_{P8M#6EvokUH2AxP8ft;-wfcVb@oRV|yWo7KwzrEDsA;_|<+T z*u(AdWujF~3Q2)hsS^N!dOKSV@;o{M39id^FYQn~awWq#E2>)#VAX&yQ*97l?wV~1 zR0B;t)j_41;7*&K1YAl3AN=gVog5U7`7}!}xTNaKg@T>O>)wmn+Vd*Hcc{i;*7Ft2 zT2oT+h1CEq=r=bl3@T(UmVhH z275y<=zN`<3kWW&{(9%XpbBH2Rk}MFE;;8L0}y=J8pO#t+1*{9VVy~f*07?_8$dsg+9g?MqHW9n3IWK#h|q*;28(3PFJJ`L~s+Mx-W zsuQBT>N4^O#WYnycE&XwZQo4?bxn)H1t?reAm5ok1OWI=LAZ+>}oRhc`y4taYqw&yK)fj1{$4S&Dxl%lbALNLe*Bk-H1k3K4cx@wu3}!GNCa<}~ zQJ~shHr;NNXit9%8^MH+&hbwqBB3} zwBjPwa6CT}6HhV?)X&~I?pnjQtam`y|G=?-{myt2w@*rk0I_*e`~q&OS0?41BR8f(sV$2=ttagI<$CiQVZ#;CnsoJ4JwvrSo4m*3_=XUUY%BR++cA%N2H6_3R7ke@pzIQ&Rd z%XZ28`N`yWIcjwtT|q_YyAvLaL;AQq71*E|;gT%I40Y49xyWS2NvLK79&H~1{js-! zBsktDtMzNa>4v)jqZa4fTaIn9-eL(L?Z*nM#4*QA}i+m9mDjaW)*KV z({6j2Lpc(vp0l8K!s~EcyvWj;0li6!NlL(M;ZeBM4M~J}`QS0YhvRo#3mP04sAzHI zN?)r1Vd+khp3k<}X@-b%ZBIO#Ay)`bpSqaL!?dGWi;ie6;mPjs?87Az^?6q^)376` zvKxn=?u=s?K)&7+Oy|(B4&~7eiM4$A3__@oqs#~o4%>b!?qEeodS^0MMKWmDM?Hm+ z!Vw;sB2S&_>6{cR?X{c5SmHDwz>7{*flHH+GG1nQ-aO;OdVG1%$P0&@v7-6(#tfQx}Vs( z*8tj+rQV#AKwTevud~cF2a%VWvTm_i1 zRm6JJip#TMqo*7}Q(S~LaN-*l+Rk-z+qE}m^dpLb4JRpJ9@LKKPA7k_7@%%e2oNQi z(bz-6Z~Dc(5U(|chF$dG2?touckyHGAa;!4=m>#5axG!aW^*au#YXl7c9v1c5@p(# z$UAGo1Ws}QPd6j-)9Yj+?JcfERNia%Bm2FB4%<`@Lq|@?9kXeKWO1K~+fIQO&&z$+ zb}@ou(cpJm*88iMuViooyX!8oKAY0-*Tv1K)SQL!m7A2lpljcY;462xb80d&fT2r90sbcu8!tt2*kOM1en`m%&E#+As&y-DucQA*a z_C@w$e$zOJS#L%&i|KOF8s|Vc4%%Ij3PRHfqRFdj5*VQ(od0^nu^`8Yp|4j!^Cu$M zS)+MG$?Yx>ozIqZC-(r22cd*k95B^Bm4L=Rl7v2QFwraVmaa845A)d$I_?To#O@gi z3}lP!Idu4C#ZrJd_Fr^ty?J3?#5c&5jf zwVJ(R|kNL6OOlWSll%uF7A4g5-n8V?P}jjJOQ@zSk<7i zoVUH>ho)|iojud;5fz9v@77?k^cfXsUw<xsWk6!&YE zILsxE)Nn0*IurQgvkFw${{$gFGSfZzTE}JCE}x0w%s~kNM3n0Q^3=S3k>`1JSgczz zZ@F~G=80{zXd7)463f9}z5Y>A~-+Is~NWq*n`+fq@iRZuwFZwLo z1fV{A>I_*dcY2Mnj*JgYVr<#&q?hyzuUTt2`EaXEhEbLmerX7`J)N+&U98hff+Prv zdFY)c_XrHAw6OSLDK0+2>$g*@?vpI&9*^*nQBm7&Pph?4oil!s^bKBa>=rcAb;F`} z(zI3B@?N(whMJmZPB5?b9CnF(^MYKOwq`qTCgE5xj(DqcpQO`RRUNvFqMbK{d%hnb zkfBHe0S;7So0er@;D;=t5y6VOXUAX)%+O1~QT*)y$~G>j+4MN{wP2Wim>i7s zZv%}%Rk`y38-~L=5=+P>OHCd44nz^(fi6IG=@SNVRu_O8M2?CSD~iIZ`u7unW-zlG zUHV>;qDWCbs)cZ7gU?}@rI5s7Vfslm1Uu^5jV^Dc3i5sxUU;oX)F>O7ch=!ZFm@4q z=A~T;B)58IftwHaV%tP@j*LMUeec?zO1XDMFR@>aD)`D=GX z8+^6Kx{4_AG@s+8!K@6u1(MIA4@^!FDfYO&4|KB}@9IzqOIo19@r)Jj`0zlL2K3}+ zpV^R&droV&?M=YVb%z0*9pe)$q?45Lz_}sT809NM%gG1tC@w@OU?Gadb zrT8q=Slu}HxGWN9KJ(OszpT5U!`EzmshA`~((9R=@Vn5dC3JXpk6s2*6e#ojIy7{Q z-Sd|E2+P$^Iqc>O;>*7Df?C7vDYDA)pz+pmc6ivA$|ZllU}qhtSmV6zVY+wVytt>O zKc#sb_FaUzuWPxLWkpEWeo{BMtafqB@t0?2ntP^icl}Ji<660MAI4^FO1~KkO&o6N z<&?M=CnSM0f`TXJbfZt}BRO48p8M#1zK2eaE4XzUfxfpnQMKaabSf>MFq=-%;6*u>-c%pFsK~P>6~zP2{*!Rd8fne9 zwC0dJ#6=apQg_{JZ^GQGjYe_H^)X8Z2nw8-p7VoD(0qkPiwX6eb8Vo!*+H;jUpA=6 zq@a>qKNpjM^C}fmUY!%F0x=66Wk5}c@l!d9heKQ%?a2OCluR)D$Yg|yf;6^ZVn_Bj z=SXr;kJnq&p^5EFu*5iEJqa44>-Z{;9&-exGP~5vGJeU#i@)gdx&x#5)CF)H6{91Q zeD1ysNb2a#)FQ?m$ArvL7Fv8@iD%Jm-WWVyGdH%3SWnYJ)HO`fmX6ZRopbk_Znnkv zTJ(Hf#xzU2{an4NYCI~VpZOEFD2H5>9O06XGVc8Q9t8u(l(~v}1Fgr{8g-_ea2NX- zKU_`1BvrD^Zu3=GHk~CFDnVP`uP`wqqgbgH*eIRT;$?I5+2}T9%q~XKl1pyV;hBbe z6QaD1dzn#`4ICD^BLjNlL?1IEWYudqB~`J)HDT@sEAJM>Fwn&*EehKmT05TBs8n(Y zRlHjQzDP^JP!F5c*eVz_*9bvZIRf;Z#e#@y-uP zJX)ftcO-LpYQV*)xi^`};(ID~tP-U6LID@$Qp;?HC9kE4R1p_L07FJpDVsA0P;sW5 zS3v;cY;@1VO(&Yu!ImMI2{77y=F1aUg6Krv7e?6;_dOsu^(^f`Y3vvcq)f5wBJDf? ziFj7oTNkg4T}GF~;<}U zZ_!hH?cVSGXj1HiWi*Px+;D|;?RX#dpL#6-7nAjNsa1J@HFBzVCHzSEE(H_JPQp_%jtb! zz44u=5n9EVD^xybtcFB+Pr5ZHif`y$NO!KxTvXp;d16C%55>1uhz@9o<^Uh;t%?Kf zuosO4-%kruoJ}sHZu%`ipPW&LS-#KCf{DR8@BQ~Jj5mdo*{AIFRo7O}YE_wa*9GYE7onb_EdOwpt~CPfC*)0_f=pxQU5wbFh25u=(!H}>=IrYQ& zpD-A;xu8(&26kttp?9W49gO*WP6Ke^Z7UiTUtm{BTv+Ff@c_W0RBIm_m;=7D1ZaGy zm<8|=S3(y|+|<~*@wY7t7&STv$>?Yr9hj;F$Qm~KEY@23(NTy;kLcQ7{2Z0xb7`*F zJ7L^ah9#-e5-?>POPLn^PJliu8DjKM!Kht#`$ApYEscvL8S|qRvuXqU7RUR|dQn~5 z92$GJ0o+TojpIu}_u0bJ=F~`+H9~GlJdM2^pD}?MiO?jP103*rJwTL-rxP$#*6yQiaI&yC+}$(SB;fwzxSBt4^1y^darI%m}jA+`6e z3wQyIosbf@3);)rSvfh)u3q=b15+i$Wx#;M4Lev7903}lq&7asK;#I>Gh#ppk#RRT zD^YaYt#-=su5iLKH{5}xz|I>O@p4X-ryVif4&2#GLW%|QeHZiT)u*CeBu%heLeU#B zO9BWZ;0L-gwAmiwAT;F4e+q=>K-c-6c`|Us!8HxSZb7Ul4aD4D8-rm9r8Ec|@?d_e zcGteT;F*(?fjChH6~T8Yz< zl_g@q=>j2P3>S~9wQ=C7LR_9AM>odQV^VboC@z@6l=c!@Oh6eioHdW*JxAAu7%_H? zgp+iS16*#c3sX0;cePYgB_DpW1_XTsA9TNuUePVNr`%|*4bFhMq&q}JpNO-g_#<>B z7Tm}gc3B%?t@Uy$+Y63ngO(%(vUe$ z;tlvLKyYOzZKK?@woWB*bQ`jj#u=l6=wsUE|1QJf~JGO>&ZzC5j>}c zY{r!ls&pFG3zQP}v0@bgihQxqsIw@kxr+m*R;>LHP<;*sIu?8tXcE*=s5_C19vtob zJSIbUy7IeC&G%#Ph2hna zvRU`m9=izzpleCFVE8x?R)QGDbOelhJP5^Dvf-MsEuLMn0P$I8H;(#UG7!I%o^U!q zi#xrJ_=Sxa!u3_PJFHq40ibDE*_C*M2PulZ^#RvBww)rCjUDWI!z%rrr4zbag$ji@ zo=Oj&nlRx2?y|`!O~RQx4hQgn@zjbi#TZzeGI3^OFHM4BB0^6E#kYmmoLwe|0)fTY zV-K{5H7*}kGE8m*`4awG8GqgGHwv8wKUi zR2nm(nR!G3@QS0RE~4EB03rB_cjknh4ULSW3|)7VM0-i{R+$IbPBo)gfTs}V0q}IZ(ct9tNknYVTDgQ14}1AO{EtNtvQURl>*0#{?t0IS zHOqI6RDC2w7DGV2E-;1h;kZ}2#TL$W?F~#c zDZGq9qnfkMJw%SfZk}{Eo^Tc~4j3%ko#ocBHHCZ;_hH2%w7}{+ij42nu)9S(Z~Mql zB1rSD-DKUI*=Djne$@r%r;yn=8pM zqZLV0vD>+&l6Ls{cqo8aOAEb&MLe=oBR(~OW-KeMVC#d-uIE9nPVX2WNYEyp1+Ufu zkyo|&bVFT3XTrNzNZ71ybnq1%M}ED#0HR+96QGWiOsmd|2?yN|dx3>8wG_?{sW+&* zyFuns40MOO$m#s&Rf&z}CDswOF`F)5_ZhlAwp^rMdBjb2wnM;U|HTlz^UVp>R-k)5 zXi{k7d4gy8vKebwKDMCX_}KzBhI)ayzXkV zoeA_KY_rsnV}xi@!&qJGXzzsj=o+DVDGJmRFJHx+`ym$xl_`7|yv6sb#F2&BY&77y z3z!l+-hN)(l>l}_BT5krqaj2LC$NGFS9t`HbBMZ?&1s1*nA#Oa0$Gnd_EDKr@QcP1 z!6m0)2kiJ|Wrd4*U$~JpuVAem-c0LbN0@7cGtxG4b!PD7&W9u^$ZtYA!)KKnIi8%N z7Sw48f~7iz>FAo8&M45qMLpI>9vV4gLRz)+pj{Vs(E{aJao%eriWqXB0Swf+RFYcb zPKynvB2%KuTB3G?%%kqSx3jE5(XEo!%3{LVNQ9e?O|7?NmYCY(6M$#iHo)SUHHMnL3dm$$51vYPA!8&v8s;a{y*PYX)sCNYO5?c@yffux#>kK^tR^cc)^J`T z(`Z*kob{cMk%N9vnh-BSpr<*^D1`{PuTaDhr0uA1bk{j@XYl*bKAW>&)$Bz98$oSa zz47)Yb-qDg_k9`=;(DU z28O|8uhKgYG=WI+(_LV#7rmmU5aM(f;G2}KL|Q!JV2Rt(t5~p@?EA8gP2R^r8+efO zYL+G#4_7qp&V~s@y7V>WG}-6ILBTi$TJq|hxq<9%UA0$Z3*J>)^OtI71^SqF(}P-` zDn{=Y!QKdfJKs-;OX;OIB`?7XU9xtOHK@@E0(o9bND(DgA>a7>?!g$E<-5{d3>3Ae zSv`W4Bom3npfvg5NbUsFFq=~ZVMtjH-KL8`Es!n}B9e?v@(3anyj0?NZx?zoC^_YOtw-H|`kD z3!WtLekgV3T52#&QAaUSlRi)n$FN40dEKsIJnGEkN_`IDyq}2yIT5#Z5!vVaS(@9@ ztYbAowD&lvAQ(s`xfPa)zi40%J?CDn)^yYCZosM~y3bn~;+rdax! zk{OV$q3fGt>myZyo|3`za3XoQ z%SxV$J4)%cn%d2+ll5uU6(GL)Y*KEv<-!APuNVz-3WOLp4&KSxp{ZQ1^2$#4ccM8i z=Ye*TY8o@XlKbAy;girAH)6sl#3^!pO7qmPP{k{8JokgPm1JdWb}%Q zomx5W0-ST9rnzQy;>#@7T$|4SZ#^CYE39PEImDS*wt!4pyYZz_T5U(y%!;@0L@gDB9H!X8>0j z>y;?CfE9P#3ci3yvmf#6e%_?^-fEZ} z%$n^MS(YCdwZ+69w4qG8-7Navz9gVmUhNUYu0lt!^N4PIA?WZI71bpQ1;K07si`g! z#kmYn$H$Kw3V;yILBdLVrkB26+zF1b_vVSl6CfC7C}Ai|t>K*qRK|=eqTD$WT((*$ z=89`;H_|7hfJvuYwj{&~FsEdl8Cm;4zqm;(RT!N-3=RE69|rxtdp(wxUE_75Ev+u^ zE!szoJ-{dUFE8n=n=^f% zr_n2~@O@&MU8Uj(Mq`R5HNDTs65f zYddxK!wsb&x;sQ`HMp5=D80@LUi4prR2DOa=K3a!TdGx25fRnq3UKAPGIn>{i;~;h z)r-yHx&J8-dl7Wh4m}^uE`jft)QL+XV0UFC_16_4)U9@wR?dcjPb@mTJ_b%gD3CLjd7cX8_>& zeukTm)`ejo*VA~D+;baqiD;Y%@|wPYrT0@|uaw%37nwwB#EX28FXqcA+pXEaX}{Gm zsq>UyrYe7}n>tfrWm*$B^(V=`1#o`b{Co(>l`sZprA$VK?($O9L)_<^b0oo_4!Bls z%W%u`wHG!xC%4^Y1n%iN10yNna)y~mA!$oytCdoB8F zdVtTJj&@`1LZ^JAirexmU8lc9!&R`H^Xwv>ltbNx%-o)joejNZ1A9zrpwnh1fTjk_ zYL|5vlSS25L-nzLPR%QCPI#K#)@^tW51^wvaDyom(BS#96zL61j^M*Wk?y(+4|)cW zFvAMSyI1+td&Vi8mn6!S64=>}ndC@T%-J1TTi0=sy=>yq*ZLhragXF+&gn6O-Q$c0 z6*6X4XI-m%@TkYcFQKWTsonLHc}bb3)P%Wp9gEub*G^nC?(nI#695~54O}N(I~_1> zx4YAsFLg_Et$==(L>`-=Jdjt~G=b8rcBfyQRA+pO?WUd&HCq7P$6wQvJ)Jv~7VmXP zpLYO(vE9-U6wKPR-qY@6`MR-NAF5*0y44KPGKDO9^u@6uk)FAck=mEOnVnZ%3Ewt& zYUQQCyQi4B;p4mj$h~y0(m5Dsr?3i7D8Q%cQh89K4W!4l+?8A9sX@r2|-b*F{_yC@?&xTW8h!f3LOT|DjR z8CH|0C-oM*oWQYnue!KgiUfyD!*HI-nYQEY*d0Vqk^A(kMrFFyrzwhdqMoO5y}LT| zIWUY}l}2-AwtQM$)xkEQ)+N(OPqPkaws${FPPVxtG(?b^J|CeDNYT(13%|Uynk(x1 z8KME1#zuTkWjH29QoTm%#s$6~m^XgDJ>SI2tq`5-Hrf`5ZLHO*MxOS{liDGj9J=Ad z(5@y65cF=rLK+!2U!UXraj7?|l$Rr-v@#vYu_i@}Og_+Vr(}xVVF7<~f(h(cpP)!OVv^~3rW8tZs#KEmuP|)FtGH}e0ygV~(b_7h zm{T#5$aN7s*wBed=Zo%sv|>4(N4H_9yc^OXR3Aem?d_qbUeLn+zdf$OkR_j3Yk ztg5R*w@M;K;x7GOk|iywTh)j8*m7ikuzJok+CCnzeg*vdUb z>DZS;CH|9qp3cAs#W*bs_3p}aB3aK#(DaLB7DTf2%3aJDe~VqN<34cMor$-;UH0!sLV{_PI>Iq2nK%$16z2o9 zX7XU|95r9%PO41mD&0s)OLv}kS46sR$9}ErI_zjB z#E6N_E5Ien>=~egBR<4_Su@D=xegiYM>nAzPVyzM8lmbz{V2+YB{SO*8cQlbz@Kd% zh|1*DCz4l4RxPax0B{fTBXO`~uLOYIiwVlk%Pc4guiIW7TGab^$L}Nses#to3o>2F zyY?+D8|j^;*tELfIz||1h5PeM93zG*)9T#ePpI4LeKf}`Mh$W70ujhNzK?V~Bo$)T z7e}hGBb{=Cz3;Z+R}X>&h1}c1l6Q3I==sII^QQS7RQdLy>{CV39qnKgb(-9%Q;pYF zX60j5)M2bdb^9yD+o4A)82T>eDADu4Zw2w?zO|EoHgo6-;k+g z?>N$9jF!X5rmy%ilTy38L2KyPfsPAr6SGO8x+8Jg5smNd2HnYPLOWZp-c4mE>He_l z_<<$(a!MOzizIN}9%kHOn0GPVw&liJGG84Hyq^H{)l7K$F|`BpV5unm^^&`&X%L}4 zEh;3r*zNrEQP{ZUr6+;;ty^$B0%!iJ1rvVr58O$|W;maC;z*mKM1I`N+YO$5qYu^F zok0kVR_CJc+)V~54jW>$85b*6iEcMw|=Sz0m9TDT{(LFeMiWIVOl zfj+JGEfD5#;{_MoL^vQCU@Ht7UBm7&R!1u|(JYCQ(5dGMAf-FGtozMiBcQNud2J?p zmA0+eZ}YsE5fSUIMwQ@J*IjYWcLazY0{-YmaW)flf#5aRhSQ1cv52O&P&$S#)Qe5J z_-oLnv&pOD-T+2ZpVuw2w&YTt>jNm=FIp~(eQSm|bIDug_UiAt`7mCBh%(d?m*~PY z{&3`D+jw|;E(6ZIbG6;N{2ajtblt?$>T`SXt+&?DoX!S!!*=&?zl0kkK)kR<;6_t) z3>fF|NNX4Nf-Q4PAc?5u7l%VM6k>YF7g}5xiisCyQ)T_WtN$XhTlWIeCzyxUN!w;Q zglBB$s7&U-OaCaBbEee5yA?t@)UpEY4PBCFyw6HAmdR~m2elzk-I01qb=*D%8G~nT(W?rqC$AQK%sus05sG7XI?fm9z^>y zFB|*X<*n3@&=|vRDI~bRq-INRFxwDU1b%g`B zmhG6-M=wI+R-ZdcN5PKM!t>fffxapXKT)}ct-v5#QlD%N-AL!xc413lM>YO%1=alh zY`;gv$a>vcLpwH40~%!*9mYRSx+4Vz)ayj4IS+))C#?#}%#hYv7xU413SF^^ka6r$ zl3x^!13o)a_C>D=3VC)HJ@({3I&!Y;lRQ=6%0YsLN?t*44+?zu#%K8d7T7hCKK^D%= z9)P8{qvb-aW(zNSqo}q8(+jqWWMQQk*)wqIPuJV#p+GZk#vA24@`Zp`YDyLi-B@Re z@YilfyK%ebyXHp7TKY7isE(sa*Ue7rhq*XFTc}hMiN)cTRX{uEomQozS!)8(cXd*ZEur(Y)`&iYLO)NFp0nrCWZ77)5Vp5k_){G31 z%GXM0F0WTr`uFog=LbsPUbyB*hRgYZpL#j-eo2HAt?29@DlFbH2b@hv?7s(Ih8S-c|Tu%djVn?oJOGVS7;5yhHV;vO}!h^`cKW+Rx3x z;zry0=q~4tK{7VCTB6S%WO?i|ZQnU=L*TKWM{gTww0MI(foZ&0e(y}?i+SZmNrn$? zCbl_^ic7wQFNjD`7f9KyMAOe)rqNTX=jYa6?#u3G-igx;`h=IAwj-o5d-^`e8tx;x zPRSO6ja77PP!0_TPSuWy-z%B%`_dvY-FL%@N?6NsM~KQRolAEl z-Jb9!d+w&`)E3my3XeQ5&~~5L_PO7;H(9H)y52ess3lWOMum6lwfY2=J8Gv$OEM*A z7FNmC)bi#OChrw)5NcFm+XMZA;}_9*e~=}ONRt=N7uwL6R` zCiG_9BvL~k~?IHH(tt9DSn z7S)rF&GNvVwW_II*o>60yqq2w7cSSpm1y!n$oNjLS5PV*_fQ~Ic#eF-hDkW`>eCud zxWC}-VZi~PcN@Y8i4n?^(s1giw|8A`S$Gi0k@WFcVH;Y{x);8=fG+}Izc%4X8v~Vr z^z8Hwf$;3AQ_-lO)>QE72kg&QHd?TE?*TPr&#%ksf>KSi5sot{vich$9VQr{)~5;{ zOK-aXq>mfaKH?4Pm)$M|rq7g@%$9t(3l!BsU$BpsBz)UC%W<}t;1roQf=Ov2de5tK9{Mso$aom@0a2Oorcb4ZUM=QZY_ z`6laZ+HU5qp@tV`K3YE|1QZEVQHV_9cSkbjL>?JN9+^DgqWGp9ODsD9*8#Jr$JdKM zYc9%T8#3;GJ?^gAs?gi+&nJ2tYhbkO=(O!hzFLqZ2{LS4wo7r~P89Tf6xxz`tLiL` zh<9?dVmp$fk@zN;?pcD*eM~&FQJE9bsIG-6)pfg1F5I`^q3rJjY5wUB*zvVXR;t>W z@nZ$N_BHJkjCe`2@6~``nzxNZj(vSLLTXq-hOBgX5z6rlcNiG*9A6xWN=jAdz!{-; zDx75((m8|gBx$z%PLejW4Zq_G2@txmd!)1j4XqR(#LCMhj?B_s#VMI3e7ftxj37pG z?KCK}YLpRNG+4KOv14+#=y`Q@^&NtrLz20hrzz3pEI&MDuEr&N3mog8~c(}4=S3oSnyN_6!=ek-s zREl)K_{&k^*g4FA1R`9n=g%jn=gaB%ePuXSpsf@A&at-rjZAF+;p+p~@lIjGe!mT5 zAF1BX%;R^(1iIbt-X;&OP98cmKkn_4>5!Z0;=xn1Ukal1FVB1b@_Fn%*blRhul@YZ zhY*I?1-W&)W#JGz9FvN+T?XnDyJV(oX!Rr|Hy`LiWDWQAIJwsncA z)wcglE9et6pW6qhomTwYjexIb_RsbG1UmRWdOH_9)Ps-U>sV;}q5T};>d-s875Yw3 z_nwH;xwzxn3O@hxA8;K1AU^iL_d!wl(+|y0_{ieL&p&m4 zmb>DIe`xF<|KUH>ecOKE)&IWaU&ueb|M#ybxi#~T|Jc<30YQ*|eZAi~KmPFX`1yyA z59)*bkAGqJ|CkR_5dP!4TmRc?z6d zAKI<|coaYExB8&yzwDQ?<3s%)Tk+vG{g`2HW7pT4iQrfz=tsV}B4AN7yT zmyaKQ{ORMTVmxg6ci;WgH6LG!x%p_P;vc?z6kk5Zy88ad<){9~AHMwQ^G5%zsXu~d z`Jn#e2TA>fAol-`7PB88j~}}qKK%Y4r~ZeJ|1@mxFJk-im;K^DRX@(ZHdN`iruyl} z?VmsP<`h5e75)H3K)b(F|5NwzlmqD_e2?&l)of+6{rKfW+Iw*{xGIiDyjwZ{SpPgV zJH`ER*sJ-|zd`VR9ijiN@n=eGI{UlfO&+0tOJBX`=f|!8AMfe; zaNbjcef<2TX@8!kkM_syqi)Kd|KT6{AO7K^`1m??<AWG^}c-fOHcLz+S~WFFTWn%MezG( z+y3hKE=TS6f9rx{fWIExwWvRKYhLy{_CGYoO}`IRKQ?9c`={inAN%Lr{rKgl^KT2W z-}~xAmBa7$5Bd8Ok}Rw4`vmpJD+2fLpMiRuqCbB9{Q1wv!2k0{SJcO-&AZBe^gn$Z zV%%)Ig8a6YAlhpWg5xscx5qWfv?KrBSc+voNAb%~`^ zKa_aelyAk5-~Rf$&+3i|`))4!AKp{<(f<5H^*MhZ$Wm;(Y5A$yzTAFO?LP1y-~HBF zeZa?|?#F-ncHNi%VeA9@+^_xhNc5%IK99VcRTn=MpUwG0)xXrdHOutRzp47?U3mZD zhu!jg)_7Eaz1vd#@Y8SV`0gKn?Dz5h;oY(?KbIfyPd~UvKfZh*KmG9aiXZFd^V`;} zKQ~`~`lXrG@_Bq}e)xyqHSKrR9_{=Tj-R64qQLJ)efQn* z=gV&VcNYgA&AGjA{oQv}@um3)pIY>kzc-&|_`Ur1iu#xLsqfx)X#aON7v>NB;mZ2| z(d=fV|MDKMuQujS-wORw_}4D}+hfH_y0{wzn!-a31n|7JX3@K=-bRWg2GuKDQ;{8vT3EBCn@-{1eX&;+{? zH2?nj{n3$sQFspR`S{X&IiSkNVGI5h(z8$hE;j$v?eqSN{QTy`yUO2H^=IdEwf*xOpzToZpT6DYe>oKD zQ}$Cg{L62rlK8vtzE%G5{QL0u=M(aM(EPXhe`)@&WB$9Fe69EU;QsGX^$&WL^~@#kMm%HH%Hn;hD;Q<=9N{we0JFMJ^ z%hr5ZcGA-Pa{W&~9P0L~SNnq*-b?I8^gn-qKmCCJm%Y8^&j+x|gZuYk>Z;!c7=QS&8b7Au%TI5AP*gv? z9ZCCf{?qxhlD_>te}ljLn3Mk<`}lU(-@+g84SH^$7k*Cu(baEw1wN3(-|u>P%+&4_ zOj!zdGl1>VruNbswGh`2YTG7lpkM^>GS& zTh2dy0)tr;v%*in^zjuI{?Bh-Z2z;9(9gftZ*f0wA+vK$3Gpec>08d2h-fG#eS&%@t?lzr0Hw?;ZL{Ei{Zbz z`jcxP!H{L=tG}&e=c?0R)$m!(J`6t}y!OkEyxTXwJv#Hd0$(vC@v(QUE&A!_ZC5+; z`1R%I>JYwP`}F7E5wru(@4x;XnbKFB|LH9DS^9DN{@u^_bbTJJs-ilq?E9ZL|Ne%` z4#WH9ZGL}K`h5)9r|O@+|NWV-;iTmVC4Ko;&sT=>P2dizcgWb+8-M>*{(b}dc5C<9 zlG`Uu`1biq>_6aVWZT%sF5c&V>iX#u)*Z2l{)d0~)A_5Ee@Z3%6=;1E;JKNUd@W&QDet)%vzia20!}x#y(~sXTTmM7VFU9n`_WpK4{unaAe$#{F zbHp*e-)&;x$KM-4cy#t)6kmPF|8bAMeSX*P!>Xy@)%5?q zVV?rBHO*UQKJWI!@8JH|JN_>x@GVSxFMfk<4rKG6KcN2)0qyPk_`_#M68f&&KktP< zj`{l)IDh->V)^lHNZwbeZ8I1kZ0Y8q>_`~G?)%^br@MZ?w{y47P5rxe!$-&mxqSk*Uk`u1$uC3uIZWRM^AiDm3*h`)$LIIOe_!mE z>H3}d{dc#kUyqWv-$4NMZ()GX2pxU|mzrw)^7gf#$BrQK{PRyg7tb zufP867R^0E4{w09-}UD&ALT#))chKe`4(e)Hx)&{hS}b@_?Ia4Uw$+7hcxVc`S>rp zz4?Qo`Er=5pAK{TZuTGT(D6C{vU(G<`y95rrTuGM*Hp!R{Nws3o1V2uH5Qc9t z&)*F0-|ktl1H|Q!?|=UB=l#^jUk%#1{P|cBsE-iQvi=Uwe_z9I{qk178~-;w%I_Tt_^y5b_uY>_c;o+t{QqlU+8-zR zH;VDu-v9agk$L-_KMd~gn*Z6p-*x$~t>o`m{ojzUL1JeRr|kw{`}{U=!bC! zem{JbnSntp{M&{uici3LLs3R2qrC2hkOx;KKBw zwE;U(q{#n0u+H}#A16*HB^Ob$_3n4?#j2XXn4@`~F~=P9KXs4g{IBjnbHlm6$-ABH zKlyb3pKmh#EO9>Bfd8J>x##e>)$=yI|L`}=zl;_A_iVu5g@3o+<~B6@&4B;;fBz)9 zP5Ym3o!oC;*!=IFH1od<^M4hmy8D^_;~ggd;~nvy%{Tw<{~|#B*Z)lYPp&>;^6&az zq`yKve zW%<8f`j@HtzZBsATNn8LtpxwUZ2vE1{$H++`uF5^Jb%sm{9peq3b-w#dVu=>=@t$3 z?^E^96EpwqzklR@#DDt%5=_uTst#=p77KiB>tmVe$w-Trg82LJj0FzC0H;D4XHE#wi~ zKiKr&rGL=r=W%b8^FRFNp9B3%YVMw4<3Ihm*k?ljF^!M<{FmEd+~018e=)zI|Cdky zFa8N<$-meAryl<6a@8Nc{O9u2zn`1Oi2gC`KcmAV#Q#A_|J%P&|7XA7Ap%%;4Yq zJh%Cm*ZG%=|8_Cveumq`{;_cMFaGjjvH#nDe}9R7p6!4Aug3asZu+kedtd)A|Mfo~ z$E_5%t^C_N-=q8u{I8$7T1=|9@}y|MzzPzvbT3~{2%8hUHqTB|M(w?KSJ{N zK>zoD{r_~i=0ASq{=@&W6=+df|HFTo|LcF4&i~{8!{W{VTVMQtSjzc-^Nat_6n6eU zy6gX>%=7*KxXkna)~Nrl7JYIb_Ft=x@$9LV8Xu$lr&GCk+3o!PwH8;M|C2rZAOF4Z zAO7+`_n-e2iVBf|Es+KFEfrWk1N9?|6{R^w{r^~24*-C7T7UKO0k}V9_yqrykv~=W zPNI;ssz}hAhj^gTaHYP#-7m1zBkl+L6h{2%379CEk?0A?9a*Hv01`j|`6&_g3FheU zA4R|wyXW$?00{p9c@g;=!UJBl0!My<){6!J@BURoJjfG>ao-MPo*hlo{WXGCc?{q_ zmVP)dC;r4{kuxZLWM+|O*)}Aw{g&*>@Xu~BN()c)!-~+OT%+>oBQ;H0&aFDMtJ!Y} zbb_JtlN^s=?4XrX!l6*(bsRi!?-mh#=ZAZv6cjilM8URtC@ z!&tcX70xBq>}d&CWCgmX(VDiI5$6wfk+#w zqKLS$?1#Y&Ia0#BjlWV(6QwfubNwk%ZFvf9Q|mC+HLhNXP0sj6>T<+UjZc)ziM=ei z%GbEq-8tXI@1c@EgQN_HUoL5FPYL?{o#RD)hvxHQOy~n?wEGTM=YttTIS<`0Tj5?V z%#M`fz|IB`ez`G;Iw2;z)vkE5qYduU?^wiGLR&UysUv8VDmP0SQ2KO7FnzX=-oaF> zS1;>;d?8cS%12m~@u{%v%hcpF+@Ag)xxcxv*_mu)}28M#qbZnv~L6g)&r*QTG%wRbd8vUS+x%?3oTuIYmiRuNLm z+_rvup{~C1yTwkhe~k&Mg{Hl$^TM<&SH3+)WyKY1y(fNUr};O=O?xf&%P-jhj@)fz zlPk`~(HC89FK+AS%)NHJo1%rH5% zX0?w241t!olvX`Mm})j~8CErdeQUj?`|bHf4LoP6Z=HHJp?=q@{C2O`lvCeq9OmTn z!P6@}ESVgxXHV)k`Y$`A+p}Y{0#KVdWnpoVnm(A&r``^p86L~5AM<@31jvt69m-j zH~2|nv+>hafRPCwsY3v(i`!I)?GpgX%Kr4&-`=uqmKI7K_NsA_Tll*7s-nY`Q+4}! zqUB_{``3sy<#M`PNOg_ALwQfCyfU?AvFNaPYw%*}crW%eXJfE};T0=d`wI?~ACjY5 zWV83T(U_j(*sZJZS8BbH=am=>vLb!cc6ePyuVHed%eEdfXy=1kCoY^huWr!Gk@mFU zeJ1t%@_`s3>l%Q={i+lncyo{(N5I(aPeR8xK*VNik&q=tkRq!TzuX#dfaZ5V+L!z^ zCNN?|;k}iR3$Ro@aT23XNED+kr6?zNvZ&T;+kQW`w|9Bd`dQ`K`^vcqVV%=8zMl>Y z-McL_TxtLa;=fR| ze!r`^=}>VM&>0 zU!`BJdYAhmes&y5WsD^UF)}scqrN%2{&UG`LA|G!!R`jxM`>NAY)*gV=MNvhtz=Jcz+UNcpu3MEJ5^f}tc@%6(GEfH8# zJ{UyGtX`1zp}mts0lc@-v>AkdVDgt!q#MqPs?Dzs+1p)5s@qqKmG^*y6<)@=pw<}7 zL66vh=8P54-dY}bZOZmXkBS|f9aj}2rLg${i3Pn?u3=He~A+sz~t z0txT_)6>=WJE2^hyl1~V)UN?2oxU`_@R5GGqz$@Am2zRdNB-$;Ag4%cvGIGqHBK$O z?Vh&JJI5H68w?uf($j(ceyFP4_C)2Ra{(HW1(gKVtplg8o+b^?AuI8Sc0#(|I4Ihy zXxiy7+knTFf+eYJ_imgVZEmHXS3)b35V^o>K9vsvgL6J?B zuquT3$4PukU2SMWqnW{@i7vlOM;t87*lhlPhLYJ4VvYu#rCG zJx*{7ayA>19ji2wBVi?n$u&KmE6E`CF5;8u9K`aw6GQps0bFA98$ArS zP8n{bjU#Mf2DN&)FB7gPQP};9Yr_78xqlxZjDoIDA{0oa4gIC?)mbgCvdU>pKFP zljxa=tZB8Mup^+GL?#o}zQb2&^n^Cu^u%v6nVQ+NlUrpkMZ@ zrc?0s;=p`sy&x%o%?d0P6po!V}o@_6BCH-$6&U3hYJR|5-k>^5hTB8EBnzNov$H$B0 z{MJg1^fUgqiA`txYPs~KfUc}~orv=p@#}4<)zNrW&5dVQ74V2}w)*(R4vN8P3}ETi85#`uZGm6{Vw%Gl`-D2idJvz|ln))UFh5 z$y9$Yg8a6Z)_G~Mu(*$XZ7M$|OeGDV_$5+SuCHZRb}N*=VJg2UEct4B(neo|%mxVr zuD`?CxKlXbt-VG|WT4OmMg5!abtGvME4u1|w3oDK@9YZnArVK4>hoz~98pU)$g%!9 zvc&JA#VmbploCFjwSS+U;-a(3?i2$RNTfxjP=DuJp}+u6L=qw*ZSlp zc+#~++_>-afuQ$jb^=OH)qdzC`B4=1{QMa0v&^`;<);aL$mMiuGTfj`9oMIA#*PuY7}r-$A~nQVk(UT;+okM4%7O*o@HPa%0azP@|EbwXJl!%&O*}F` z?_R5e&v``0iyRhUw>9cmn&S7|Lw?#=P@A~N#Tup=<_{L{40NPb*FA$JqBp1T9WU#mEEP@VM*Nt=nr>7E?^e{R;zF# zeRnEsIHMVElBs=wj;7f7BM+AGCM6k$nme3bA#`yg^V>k#MgAJ4O{*PnvX7GJDB<_L z$J$TEUr`LNo2`OQocSW(i`~k6I|irGY~;pHeQ;9 zSeX{s$n-L4U{K$*Jr$cbx=uwushfLDqM9NX#e$PtN5SiHe6>KJ5k#{>OkJSu3oOe1 zNW^=Ag*NB9CQ#8XtF&IJz8cs|lHPuiwG@gnr&v3)@#%$9%MNsTPQTRI(*po*&1+su zWc`?L6udxnTBXurtdGj*!Z%Vq1sVjI@v((KZ?R)fdjxT8l5hEwi6RYu>np!QYOskL zV;myVGDyO&;M>WzO_$q>8|#t>Xf_$On}VBqohnb}Alf~=;n=!J75KjQ$Icp}f-jsE zx^9xd1crFf;t1uZ6Pfb+j+%=K4H}_0Tb3ovedwJLDFse>L#kdTvD86Rd!KLhsn?%3 zjoE8iMILK8qGI52^m*WLoy~x&to%Twjc(+F_mR<_+&f%npG2-WP(r#tXT0oplYWb?Y zCIM{~RWK9kG=(`Qu7D1{`L$2};_Csg98=e03AU$>ql79oSCW%h9kiNR`6GRf&s4)- zd*8Cw3B`khjqSz8(^nca>j{Xu0f+q-n}Xzz8b?g06NdAzjpWA0DbCp1RjDJ`EV`{d z5s=ekno-p%*B2mKnKpWc_`GBu3_q9cT5#ocbdq%?;+dNYD!sBXI)Kg89)X`oA0&O$Gt|VRajk*%@6-8yR3tSE>x^R8%G)(2HR3K})6=)ee41!_BciP+Qbjms zQP}TCoZhJ*VDSr*PAMDECT z525YOj$Et*Pdi!K9h366F_u1sm<6~WCvBEnm^EeltIS2?&qXCk;{ybTaD4{|-=0Qk zI7Z5b*7R*53h<;lY5kS0K$4T2pRfAogDSe>v%+ZmbE{Kem`!s@MYulRp$SL6Pk*tu zY|G_`(%DLLw@q#ooxTS3_Trks>h{;)Jhew`0&p{fr~)JBr;1lbBEH)BcFp{gX|yD7 z3ktrnzm=%;M*u1Di^I|nwea1EB%E)zor)5}i{d`>mofb1c-2+y!R)3V{rt#cP4-^) ze4}9*H)qR6RLR?cDZ6CTnrI-6_(7MUGP>;z&Vx^}F0n7z$lmCXKJm+VNaniTG4Kv; zH;&}C{4*?KsM}aih}VFPNTnR(Lt9UsJsYNoA&b zeLmd(d69EJYoMcO^+}i4AQVBNV0`rE?tl>gt1vtkVTr2BH ztIer+zcb`zxUfd&zPp%*OC$Y`4mTkJp&ztLe`m7K%LX0wm+8^3aOx|SRTSiZi!MkT zuDdxGCIi-dNqg!6Sxbo{Hg8(O#%p}dCp-R~ZXB__>6b!QUkIm}e9WrK9Oi71)+^i2 zU5;F@xvpAnA-9EEv|lR-CSX~6L;)FYVNd>o`zX95MxI>AHYy6e=YB0HA&g8Rge@Bs z&n+Q6cx^1VCmMT-axk$P7=HENEJV2aM0S?VxEl%83o$`CSK&(4mTlwjeAjJ|bN@Epl}8`G1&_$+-M+KM@Q+^?tR%ijpx0csh>-c;#!+)vDp zvKG)XXW!eRZd9G1VyJ-A$l>94d}M*IhWFmxT=6n`Jx!-?U0kR~%`0fbkPNm^LTR4l z^uu2cy^(69K;fSCiNY}-A(|eZYDGQq2H&PxoH!@-B)Z!1cM88ZK?a=ZZJ4PNZ|b7$ ztQO&=0rnN?HXZa{^`!f#)pJnYuxgRkPy3<~9<2`yFAYDD3N5NRQ9BVqV2k5V-3)0K zzP_&U1CRqShkD9aM(m~Lc?v{nmw54B^q^&R#A035q)vh&YnN{v%72k$lKZY}%-{!- zf~T^WZa3MiB=t6vWB2r(>ozd~)3pfu2)pbFH{)#UfNbKLE>W}@UYHp8 z7rkF?>BYL6c?|n^INO&3X$-2W(@o?we4%eY^AsHQLZh2V5QejF(^`=muVhImS3L6x zV@+ne24&dj^m8Nw$MJ~WK#S_7Fk*=IVo}>p=a@)R*S;4eUOE#%$ji0-0B|(c>th%d zT?8Yibqt9=UdxcqPB@9w4*bxuw{6#(n@x1n)JB(6Cya8$IJWT~F~0+M`z~`qo3AF( znqN6qGxxNvJMa#wT2Wkqb4+72Ob()DIOcz1(H z-Em0%k4yv$)`LaC_UFli#@DvpHKsOnxE#J3t1HZ{a}0msugrucl&)g@VM$AunZ^`K zn;y>z7asCOW;M+$Qt5W~hAaKdyf2lgg|c=VHBqhl<3{xw9|T<)Gizlvzy&N!QMKh> z-P3x1DVjd3iy72tkoPm);)7sZpn0=S;e6jypwFd`httH~{wGjda@uC5Mkb z3A$x$SYQ(=8@;{RD2%Zrry7-ZA3m>6yY%XFM<)9tOVu$zVpSbEIZiVM0QL^M(BGn0 z!XNLGfO=^0NV>D%%Gb!Z)|hbthI-=!adm)=su}i07V}p(g`-rRiGJ=twZmZj^gFi3 zq)%&hs)PMaHN+LwHJ`c)aF*V@;vF@DaOKChH#TyI&^V{&J48cd{jkp;SIv)V39pYE z%%U}RUujAuWY>kjaev;Vzlk=v*JwFdPc7@jL z0@u#+@Fwg!zDPURGP`{-{1OE_^uqV9Eal26J11Q86J{RY=?GJzOnc`Gc(cGart_TU znlq+j@LgveDmbGw8n{)s%79a*sCBP8uDr=roI}0X$IPm(JKsDlSm&}6`PEuM8C!h3 zvuD}OOKYDj7e(jl{FG(e=R!=HZa1tO$(*#EjKt$F90JjD$i0ydSkNkOsxV7U>8+jS z_-Ui$EPPvsFLOK@XUr@o_Dod@;n3@5%D{DT zg`0(lx|FQTh(DmCjtZQE_1G76u#n{9o)-zW>%zHCErMd0wUgS(Wa+^(;J8C|wktE( z9;`0qvXtgpo}SY0cMH}^Gy*71G=JT7C0dG#wgm8MM`1G)sG>klCuOj~f>AR{4J`bS zde|y?9MPegFVR^acx8d+MjR7x{pLz+5u-I3}SPNOHSF(&F79h&Yayaujd&TDn?Rrp1jjc^v=Y~{_9@?9Ty z!t(FG1*AP+?npf|g2>)gSAyZRQl%2(MQu}+Q0^Q>YIRe=R31JurwEQqj*o<+do47&FR ztOec3-=p#@$-X%sOD20o3_UN*JxSoV84ASAU%^xW36%iBs|e<(q=cV03I|ec%FnRIbT=eGNy;oUh|NwwtQt z!}$b(Ug#uh=bRoYW_fXA4m_;e!J*4~M;q$=eMzrVl1RK-^?PRVTqB8HHH~vd02|Br zqZh%fZ|P4okBSNwW*@0xUH7fC^3O3x3`VWrccKK}aHJWg$8CObwOGuvtP?Ea^R}P# z@e;MRraCsLb@pd6>BSmAD{Zk%u&o7~fGR`4XW=kKIxl(B%*1>a}ddk=I zJTBD!xMAvA=zO)BK&KF|*<^8D0M6mU0`WZHro9d1XDp6s%OZyFp*de1xMKX%ZeHki zfJ}zTfW5jksp|mirU!3pI$)IsCoH+$HEc*89G1Wol*}M58PmEkAgBP$gHQbhjE5Uk zz&k$^HL+e92v8TM@BaYo-DjIHMXH`+xPoE!NI96n0+{Vd&!4Q=ADO+ zC9u6*?09kJvuX?g*T-eY6mZJi=FSsLGJIwVJ|Th>a)BXRj%Bx=lCKP}i|q(#ym-%> zl5V#ho^9BOQKlYSDDZe612t*Ir0}X8=QSZyscXVHnk60r{rwr9EI0sNtNFa1jJ4JTjv{t>f{jh(Ym zQ~Vl&A>VecBrd5r^Y9(4Sg#8yEgS%>+^_(+vSJ9X$7>v%q@ttKu{@{P-O%t^=;@b+s`B9(CG@fq>Y(hCBz2npJc*dHyD?JXe=^?-exj%R_%;L2-^oUuHTM}W z8|dZ1+RVQ@BFs{3Kn`s*Dw%fnikETkQE=55-{N^wlsOwd2+KIBYAf4t=5|Pv~O3ac_cN{1dBZM27{ zRmRqP)QFd2Odj7K+DeJ1?(y&MESmF;8bB2+M&Jyx9Wreb0-(Z{*1+@c`i-X5yu9HC%1eS{;;$^fyF)GZkMvynlU2cVu18uQ~sX z@v$Rzg-D%B?fz=`u*xFv*QO{Z7o-;v+jvj6n-Fekat^hplR8X ziGp3!=8*--a-pP=KR^i2oNjG_Bg`!EZ`KcWIXu#r{~|nY;CLwE<3g_+D_q4ycjVhG zL5%kFeXW0bZK{?x=r1#;7eyeDfoh(y|VWo`kaU@IN62$w9ViD=-6P)$|IRuiu^ zE1qPf3P#3I)q9bBZd^lYqB*SnH4U~vYfzl1jx(}KW-9kyTm5?rHyt~H7m70 zR2OqFgQ95k%W_8Qv)!lp$WTeSEUlPWRWpM&fgg>XY3ey&$3%h>W@igVGFRQZ=KG)= z-~1iw3$`LdPjO67kDd9%^dM4OL-^u%j#z{f#qipXoGIVGP<)HILMMmD3Ky(Ik6vuS zMIfSyjAb99P;1?&r&&ngMjrAHmUdG7gU#V1RQV%L83;v>r^ zph6}$UhY&(1Jsi|jI?6K%7Z2+!^cq~-CSSx4;;>b&%fX^BMzt#gsMyKSGwMbyW3ip zyM&7;^>J$6ClC~sEa7Oig~IRs!1`vtp(Vo%(cKvCrw1r~uq6FC%&&*(&**$-sO*-Q zl+2Dq_CPRfkQA~l#>LJ9<g#Rw<7=>q%d=p07cBU1XAsUXT9V0n{@3%tkRnx{R}^V^{=@XOCe`@D??=KhYLMU&|Rngr>;$6F)CLN#y{TK7d^wrX|a zO)33jCaC#a1`3_23luGco@diW*ovV%5GC=^_@|xgM{-gn01o!D>*)r3VdoUVrd|Q9 zXj-d#cbLyAdkd5x+rvd~O!lp0i}~j-GNNo>^pRw?k27}BBYBm5YDIo24yyccZsOk5 zYT!tA7ff&+>J=)lpxUeGiS_w~!yu=px4*t3E$mIaV{9eUegkg9zP5!}H*NuyANNtIzCYRh57g{SlLvTG2P-6_3Kr zB%J6Mu)Wu=wr3Cr8+ZN;tug0!BxJ{6E@1^J| z{}P^l0JMp`c{_0jLBc+&^fkfa8(?-2D&ZIY5`g{%-re&>`Lmg^4Q ze=^Xwdvukr%V5x+Km_X+ELssrsFJKoelWF27S4P3^ey8P>`KdPL($WDsP;$cXNsZ$*BHfss}|8$N9m>qOQMLi!D!li_Vq zAL6XklQ=XO2N}iX{_ndOesOl>_ixUxoCw@YSVWGMw6uybbL?Wz9H_Az_2F5W5HCP_ zLCTtr>UDJ!5M72ID|+=2;*^oU^!V}0B(Q8d?c3i*dnrdwR9=@cTT9>3f0tf z&I)O`{zm#RgPb}Un`T0YbM~Wg>5p^45;Ra!XFqe!rPh=3_XHn=+sQm(`Cww+@GX2j z$2L-{>6)j76$gO+w$7SPIV*(wtbEuP`t1`)&FJLi-=H|^NB8DM{o^lw{t~bcD8w2IC-C4@lK5hKglv<8=E&=w!!8ygNDuz|WKO2U}Oa)Z^pDcv(N8#T*^y7m? z>EJUgDB(8HPQoAfPp;8RV~W}dyLjc{WwApP*pcV3>0`4diHL5Ga$U$<=Dq-%`M2q z0-(kB^f>|ni(@D248BaBO@0TH?4Wj;7{nC)`BCsngJ&P&g@@%QY~w2Rjr$3}nUEp8 zIh`-Df2T}jCBx$MR8OFq^DyPjkbu_8g{DTA+M#*%SLE+Vj`n-k{*jVz+F6#gyODn- z-8d46=;R}2Uo6`gt?6xjL6?jDf!6#+dkyRG!43ZQ-odMd;p+Oz!cNctkBqe$j`iO} z?VW1#XcQ;h7Nu3Y-45)+2tzZ{@)|IE)$2WNA11ILToJdMD{DY*bsCj*-_!FZCRnpU z9d1dJZ2B7fZgDVp&zGg5sCF!uw^Q)*Qq~V2VXHVA`da3Gw}9hxhgmE3%5}0VhN;YK z6PMxGZgJQb(IJhJk>?l*7Cp}T8;oe`sX4$+xx3^a2j!rB0^VLKP8%U73=hVBe#PO; z&+!E~Kl|JHTG@G{p=_9OfE(^uwDNnr)^rdAW&0zW$fYUgaFl+>DdjmKJFAv%G+NM( zGtEt#F($99m@D1|-F9q*AwV(wJvPGC?kVPJFwfcaalz}hi5r9tLIq`P__#l+@!ZEai(!Q4D(+qe6QsZIqxfI#0d zmO`#b(I>TB>X%}=%a_CaQKU*R|3ANrW?F>4~2CHV;lLW1x1{z#aXVyC( z0Rib~Jvr=8n*7dSbpKu?JW3pmXQ;9%uFEBDpVU;HiY&(s&aH}btRQGiy5XEiIS*%H zysbwtheUwc2zfC0Q+Hxs&Z;6z&;%&J@NNv?)`$k@dAXG`4~Bu=uI?&s%D(neSZ)i@J`NHl0ZzOVU^j^Z@*pFDm9#r*AB^|3GprxUhABf?F)T-#~2uKN+fL> zoRwYWq5UD0!n@z1=n}nBmke*d-7~k*v!g4R8ZX@dQ1M?;b)iEWfvfid3QOvJI6qL) zBmRo;>U%Olw;oE$SeTA`-yr**ane4P z3Wn=@kx4ejbc5`l9D4T3;sn$Aa3r;iiksz|VY!2)TO^yy5Z}>o)V@m`%6g`ye}(Oz zqPOC_=#QFYY$@nUOc$5HP73XP4R-f&Uha}}k!1FSII!Pda$NkU^b*NR{Y}yz7_W#w zGhP#>Pd8c4h2W=I*$w)Z4|QaB;wjoCu&7PTz5S6kuq(JxS~aoo`iIOkTx) zfgHsmL)C-e9hnka@wk65eiX{QUPBi(t+s4?@QyIJT(YHt7UupacqH>fud%pp{rZZl z@|J4Pa<<^tYdI}^YMe0og4{B8BJlZnL4BT1zx;8)t$E!B_=r=pxz0B%c9X|WXqAC7 z@}93lOKOmhfwm_s4)BfO408#F#B5*o6=^$BIQB8WW&VLE2^5s-4up=yo_k5l%03u% z{u`a^ZOl#q3-8KR_Fk*A99914qu~X2cd4XN1Qqux8w`+%;fdjB5R`J+>`mWniQJkwWpQQG_TQLH#f(hw z@YOD}bZqZyo#&Aa)|MFDQuV!wB-({QMV_>=riqT zLDZfW+hD5h>scM611mPbwy;o>AX+H)38}xmG>b8H@NRRTV7Zi?Ln=5ZXrq>#%N{r^ zT6WuXWHlt$p8A;7QzeMRQyS_l*;lQ0cM{xz`*Pwt$!JSypia}X+`DP-7MRxB6bf?l}*%v6ccyT>W(+nGSF}^{if^KixO@*kqj`U zQns9_P6&F@d7ok9P=7_|IyVf|ANM=)G7|*cBu7*=PJ?OVx^i(M5p80Ye|2^1!t+c& zxUs3ad6Opna!q4=|EkM=1;6XrKhh3c!Diw(nf5sVBdr_ZciuJ5YEEspO1sLpD$gqV z6(@J-MI8EldzLeo68uWYt#}aMPd7gK5o`;>6)7_kuta0|kH!rAO8d;g_T*}y^gM=X z7NW2_Bi}IJ#cU;#&|0+hq)bnoMqrH+i3;g)xJ)8w+JSu#kAyDC_b2?u2tc`F#M!ew zM(+HHgektz6iAS7oRQDUM2hybbCX~D@C97pP3oi)Fkvwq&ooH|=wv=MpP_g$kg!;r zm{5fY2_HsczGRJk{T=cN6F0e4;Vx|=zSCs$#ggj^ZYvN9i{sshY&e2rLvVuGI>b@$ z(D^xm?L}M-^^&SbwO+fAUEQ&wA{{$?m{0QNPbP+O??zZ5MEBrz{)wsXXFnGCK&XWg zOYUDZ3LOv#t&i6dbVB2auzov!LxbYRztEcUFyM2KB)=;2_Cfm4*gLUa@O3#C0uHSk zCqnKDNa&~!nc$L_L-zLDZd_Yu;Dvz&01Eh{_^|VjB1Bj0B zuU3vv^FY^iE{W^Dgs5kn`=i_YZ^W)XN#8tGN0VhL7F^j?JE z6jOhvmENx@*XYUdELK4=b`}l;@qtTS_0l_%iANhkxj8t@TcJ-4x$~>#_n^7a^}Dp7 zr$)(JYgB-l>0>u$-Mf&aZ<~cRys7|CF2 zw*5ebJcO>iIMoF*p~eJ*%vzr+vI_24d&s2IXrU)w{TIarfQ!6Cp}+A?TY9}XsTch@y`=~vKjDyVTP*blINJtOj3Ajw_4U?g)6sIG+g39|reMsp@I& zro2d^4Ne^M?z_BYu4g;+@xI&DjRoxoECJ7$In0_6A*%Iu9Qxw$=F!fv2+&{zSY}#` z3x$woS6}pi%M7N63NVZ_K?5{PO>W*q-be#f$}Wp&>h9#$%K$%FSGcNP2Y@28>+Os7 z3Ktf{X`J5H!`xdWxlo$T0@mmZ@0(&2idcV+$W~m8Sv&x$%gt3#!|92u|yPR z96+@`1S+uG173GTlGc?Vg}}=KC`v-8!IS|fh4}1=sjf+1x3?%IK)Sg^R@+(yk!A%@ zaOzl{L4lW+VL!PMj5@LV_Swq3N=n<#ug2ru{&^7v;}>=+_aOkqSfDIT6Mj44_}6-I zAVa*k4>LJhYKXZP?W(tiB{xw_)&)Ap`*$RMn7~oioR#j{STB2}RB5HXFte18_qMUF zcmug?CFp9hqifH=CTkCPwcUBSVbD5T+XIw#Uu3Gf7k1j%Be41M0KJxhPh-9SBM*ZoFo7!zGyv#|i$yKkoM%H|)U8oZ02 zqAq{(xhlV;{Z)21tgpm|?BD^7MI$S!WI&n7eWBHognWPT0P(Ykj-}^|#*npB7jSfj z7ef=Ly0t`%r(m28yUC*TgZR>6G;0@u4o1x6cG`(BG;k;A3?|8;qsJ~b$r=5Tbh^-FG8=s`DXv?e>q%t^C&nmUpuS8o4wXJNO7hC(k{jAgrFf{ugy8TA+P@c=p&d%nuc8R zC2ANmjok0cf9v*m&o^vj4sas?xx>!ag@0NJNF>SPUuQGWK%Am+m_D-54NRqu?2Um1 zxyc(Gs^EbV@TP)3)zn{?8hHgE%UMi<-vKUIe6ly@GRG-(BL4hqUXcQ0M(X(aa$M|y0rm== zivC;)nmF-$+Tf4K{1Rkajfg#d#jSfS#W!}+bdh{CY4g-;RS=9qZD3kcBWl6O0p77o zpQ{vti?&{+HKpDP8%`V*pLyoy-*GFR3Q!g2zzBFa&k~D1loh?`nb|$N^Gn7ZvcORdg6p*N24~OG8|o8mwes8*!D~Cs@ecM?`xe7a zY(08wYY_TI$(slCRs`Y6joWa!z?S9$Tx=y;eJZ7BQ#?Zz=}IH7+oaDkP*=kviWZI7 zaZ#t#&jem=H|NJ99)130PlE1I4n2rHkiO8<#%`;@Uh6ru6j)|(E)@p8+~Lo|4%$kE zw{f7TLw{BIeOm*m*DSj)XlomjxVWwM`A{0}HBU{=qZoT(A1Ayn^in;Wd+SxLy&CLH z*7!Ve9SYIKR47RQV0QSfxy0vz57)k)3^aA4M5B54suAG7?Y35k;GHd~Oe`4B(oCoC zg;u)*q0bKLrU%)J(;F-8-KMTU?s_`0M;9~a;F6P;t!@x1&kU%7Bn*$FXx=t^_*3n+ zeNYyYi;j2`N!z=NMJnxuF-+sn6N+fWAscd}cn_>1YSu)hY4%xS;P0n^(HNNc`)6C} z;Nfao&SkQrGY|q{JgJyz1pjN50INHJ(j+`D(~xsvr_fyeg99SCI))L(t5tMD7kOG|~xvslU^AEaVF;;kA zRet|%S)*e&#`FY~f^`XQ5xp-A@PKOSbz!M_iHW6tj?(RDBwmtA2_%JehCNPqfAA5| z`9pQXlu}wUMK&yZ(VgF-CnOT$o>omR*-=(B^DX?q;2|A30gJdG1qYeAel>4|5L5Tb zDB)VlT%}vT?Jx%-_dG9(#qKD{qrl40Gaf)lr)u?yxvrF+VCevb@l`-r)q1)T;U@^B zhn>9PqY_GI^a$SYH6#yGs|QzaVu>v_zZw9nD)$4XBlrP``4(L|dBOP2+0qzzfYOO@ zbwE^Czp>Dywc8ehQF@9x0-o&PzxcsEluB7;Zp=VQ|)gROG)s!841r8f9qf9S*3x=2>8B? zH#BD-VB5TIj>%PEkSrc502Jgnf{>f=3%OW`Hs07_hC1Coabzpdm7;%2DiPC6 ze2&)`;+AEk0R`mBJX(Ylu7#M;Z(sNd`C$clIc~iJ}DH7 zAft6ZnAdMigX+NAef>il5E$WxbIk}7n~$NZ1ve|tX9#kL_FQ;bFDcLql4mx-&iY=k zOgdC`?vuZ`@C*bK!yqrSs=kv{gc`puL^*=$bw?EX3BS^z zyYfF#Khb28r2+LMHT#5;41pQ&+|u4yex9 zf=J+97Tl{Uk#j|=D?&Rh=$nZ*)hQl)VSZ7BmHZ!S=AnS4^&-~9pmuh7rLFp2KSEeU zGmKmFNIYU{vJbS=Mc{i~?PUV+gk`BMgelktx2GT>?X@WAz5=Cow2_&8y%IH86L9gB znnFW@OlU;!#Y!~^#3a%hV2l|t;&n9atycBS>#j3jLX&n& z&`3Qff5^0-g_Wh=Mizd!XZ6l|iDdGF#36Mw8jWrag|sM1>JaKi?;D&sbiv(0;T281 z?gtnRezp#@vxC!gp5)>uruH$}2&UxNe`?J&zKwybF?MnO~Y%8%S@ z{4KvC%T*Fp35D~4YiSp{MGkq2EQsP7Q8z7o9- zW3pYMse7J+u;|X$@&%(@JZ13PF6NUgfx(nZW6HhO^cYS8l0V- zqBHF$++U57neu%ce+ffY2wU)h`ha- zthej2)SgWTuYY+I_@yXJL=#-e>-%~H_g8e zMpG{0O<1-jF%aP|MTAfk5DBiF%zCMWhC1r^BI+d-gt(Gi9)WJT7Qk;b>43nY=1EG$ zpayzM@_)6{UfqCfNJ~Zgt7k*5C8EDWG ziwoM7Bn2hcq+!R+3e=1y@pG3AY1?&*?H9n02+|?!LYuWkE&4Q?E5cf+xQ_ zP}lYERGhPl%Pu$ceuz#tF|ot(jz_f?PSWB=(*2TJ zLD_QYw`*!}ju9*@K-djbdH>Rvg;2Gi|2Fy$L&7yjX5E)C3+sW$%*dB2sh0CwTy(_* zvcBjrr}2t5 zn>{}a1X&o8R>A!oo&)4fW;Mn4gcLYw$VX{LZ$c6a>mMuHrMKy9i$^1Iqtikdg${}8 zuLf?{65TRM4MJR1h7$kL*4DA}MWPjlTN0KL^xv*G!yS_v%~N^2l*M`9EE!3;H8h9% z%uXmWOtWtK;QM|tUb{q!Xw;i%ovn};CWWcp1C;teMBSS_SJ>Wj%0QSV;Ucie(l_l% zA)>rpNZnbcqYfIczO$#(0fVcq#)kF}bbQ6e#LeBd(b3O#6AM5j4$}#6jgrH1n$H{Q9199vf z#BKNq4f1a&j>eT51OHne8xdAaybwVpe=NJ(FCs3(+Jaaw;tu`VuX2KFD0x9sfrmkU zk^YoQHT|8T>AYf?o}ctFIaxogdKrpOcHJ3m`Y{m2m+@or)Iy7~GK)mk%?t^Qef7(V zC7+n2?9aeoN)+%p?63yE{2}u(5!zpog{yYs7ecQg_f0_@C%$30;33wJXFpcfK|NJ*}TFkEl_DNMFY zauRp8l%8D9PNsNhE`!?G& z>L6eIpI*GDk&&#^Qv0{?K1e^UZD#u&$%03~hey(qLeL6|P@?udrF3pXgmyHFeJv9r zEPS|`46q1L6z?|+AUVZ8yZ-T{pJ)0_x53KW(#nt7c6tJ_Zxyafo3pnB?%8Y*)9VI3 zeUwCD6)sj6Z`Oyw-YR-=7Y98Mjr|B!CXfyEK88VmIhhe5xdO_TpN6V$w zGvM_*t!C#&N2mlWX&AtWwH_&H<{$*($Iec6V`(s+lp&i{3&~`%3jP*)oLfGEU~*?b z3|IM*cp=hmM&PwtSikOo5KU9Y>NP%=Gd=NWk$`*_8mckIj7wRM<8!nKPk@$JC&Aok zKqql9dTI9P$5Fum81VpEcm)=wx3i2iK9Qf^h?*?g&>pm|Uw z&(95FXQrm4_GQq{FAj^a2EV%2gR5Fs#QT>FH*&E5+T^CYELZ0A>zN*)MYtaEL|lDJ zEJ8IAe(a@O58|s#FLC$>zlHKOi|=%4BgK zo6$F&lC8dSdRAHNE?KmTtQs+sZaXi`>-HiK)&i(RqkRS){ccHmNCJekTGe9Ly*5RU z250FH{;H9UuWvTMJ}pyYG3kd^4eMU4m1kLjY!b0>9e=Mk^eeI#RC%c!*5N!GtuX3O zvf(S^DvQ;+a|E`e#Jv2}J^j9Tyv@oateKQ2<&0mb5E6HZ!@-?quh zIwC(jXuc3>Iz(;fa4_kGLtIgrxO6fMx^upm*f7rqHZ zHQ;B035t>9RbTea*Dw1g_X|{0YwCu?tK4hC0L4)|Bw5uBvP9D}*Xs@R#eqxx4t;L; z_!PkZ9JDUvJD9X`{nxWn$lZXXQG6t_VBaVUx+zG(M3EafB~-4c38i&jAjs{d^-(U$ zp8EuSN+Xw;@ijnkN7k&+u})RllYt5 zhL423xBQirQTaH&&bR43@xN8RX0peb3AJtAM1C{PT3bQ@h0*4#??i5?LBHRDZmeU5 z6W{)~acbw;j|T@6p$~@$dgDKyxnMk(t?NcMA6zOVx7Wn*-M_T;N9pe%6cF{-ZcUX> z9uVtVI%LLQPwXAQK3HSHlt;c;;pY8*hOegBdM#yvO2u7Rhr*FIWD#rH@|VO{aA=2VFlONu6m10{aN?I3@7!k2opbd!c;zfrNbm;XQ{auf#~yW!IMn z7SbJ_pVd3Iu|X$V1(R|;`^EdSe18@N(b^5|1%@YgA=eRIatL3v(13En@$L_k25jPi zSw5CZLil()KAY&_qL)8KieW_yNGXPc3y{|gAPC@A1AyEk0wDmLAqeaptUrkF z75flqZN3w6^!N_xm(L6QD-3T5;xR9~q3@(FY_w-HT(x^S#>D(y^Y~gK?KxNLald%! zl0Q&3Nf0}CrL<0J{YAoeG#PFIR&#fVWu)%l0Nqym<`oFJ_~>dZ5*(=`gUF|ZBdk=W zm%vKBpN=Jb#A+CWd{Z0@*dMIN$30?QqGBN?g)d)|q_!{EI+b2EuLJKeiT{Wd^Xus! zb-n?^a%FM+`Xi^k-du+XVOl`gSpab>gA!q5rv?Ku0{Gs1$1mO2;r{#3yEJs0B21f` zh0{A8=0NMT^f2-+X7IrU0tB*uXfQx|0|_zuet#Is$X03IMlkT>>#yb@RBH|X(f}i& zFFLP7lCP@}fKBtVUUQPN?;XExSxn$p86YwIeQH+PTe`^rK6n3G`lT2N00o3J9%A`8 zy1btQtl#d{MJRZ)sRn+PE}f?O|3)`9OA8hr@mPEB|bvSzxedcULhvLQ4oxY`3A#23?_m)L`z^MY{wBYrJp z5gX6TLFA(G&8VICr~i_(`~#r`5H%8NGJ=&dMi%7JUZ$tmiU6QEuzbIu0P0{1FZ7XnX^)8hcvi8((18LFhoj^eJrKV212N*a zvVV9?e?#wB)qAK*721M6S>UXEpk`^GvB>WOgx|lI8lD0-Fh~l?AeKTnZydxcbd7h| z3IYU$IC5h&3wx!X+g)UJiZjG0zC6lkdYgfP$K{ZyBTFCbbH2g+eIovwtbe{Q-Tcm1 zj2C26Ac++lwZ1o?*k!5nWa`yg5W$SR!)VZx*UIPR>(ag-rF&i5FT9S}{>^?$8Xn)2 z5nx@Tdf>10PF)s4zYe{0DBd*nBZ@?!%J)NQqyPzUh$lD^Kkrz`=WL{}VnQ8ov43vA zFTZ+S%~(`Iy(p+GaO1oe;prg#;de4Go;X7JWS9?WcT@<{;PU&e%4^_{?<&$L5`r`R zGtodCBI($F+F$D9c$&rj+#{ozeZA^QVk1Q+EyT(gXz&fSua*TNE5#NmNsSahapc1t zBtHEBKMGS2NK_oM>%f?qyoG2E{~~+Q`vVK{{(7pd35IHkx*BOT_8n4+ z=WWC*)6`~u+3dX3J6vqGk-@>kM}W6Mc(>78hckhAm<7% z9sp9LI=BFYH#v~wvS zc@dRkjOD;24?SQ091p!qNkf?k7m>y=B+aJqKvDzf3O>hqYlu2Qun^vNga{KMc=K#{ zn+k%kB&M>88v^>{JJpPN8zVzj$WEIsVIxt#!oP)9FQ6VUy-c z1Ms^p`P+#Uy>Fi;AO{TaO=vw4lJRHsL5Tb@PCbv62X zN{FQ_)!>r{k7aD;`Bsl+a1$(Y8u|0PQWTnw84dXKMctwS(zhD%h(k2K3FIo&?l|}& z2sc;%6r2;0)WzPn{7Y+oLt=&=QSx%4d|^caO39@5qJx@omoQvfOJN#l-&~5_QipC8 zsh<_@ZwkmQLKdC;K9!>Sy(l!~e{bh^P&`VAk)(7WkBPwhUFBd7FBmGQ2p~!Vq?GoC z{PEP%Ee!&FxA70LPcL3v_tnQ$iIg(?5)FVEKqrIDmV7h5K0~$}tvrqmD}>S%#x9R` zlJo5Y=`f2b(G(<);e}nUmlnfZW*|PQUUtx1;?Ea}kL}(RkDBwQim0GXKzFQp#QEks zAMw1~Bfk$xUQ{g>Z<%O=Kt>6xvh*N$B>etS`%>tb!563M>Dhq02Pbp$RhQf6?#eqtRCc=E_6|bvGFnXn!L^ID5=4I zHL(i@O?u;pf$s=1+NLk8as^Mkzh6H|b{`ZLV z%O!a%v@!{P0rg%ZBw&DPj@ba-uU&C^d7R67&hYy3-8b&zsFRM{L4U3@g;x0aF+25cjc+7)-Ge! z6iw(hEC+BK66gi2{c#pAu+@Ub6s{rIm*nT<;xGHFhzXB+m>rwDsI2IAQw$oqsp-mh z8oS~)Pv5UHzZj=O(rpJcHws46d(WP*rNp~Iv%iMc=k{Ch?}h!GudOAi(Z=5&Mp0(V z#>62RWsJyezCz!d#4m~s6?_sLq%>zgq;JFQale|o7U8!EzGPP_N`8dJLf8@YO&9q) zPXwrb#t&9Y0JT!TlGp*V#^M(-ydXd_KiBkVr|gR*A)XK;9XT6dl1Y2x7T~_z_;c_E zlJ5ed?gkTU*o-&nr8PoYg6PBv3|3jxn7&l1PWR7Owy)f@(@e=LdqW%(24323 zs-__{dOLq0u$a&t0`Iq*8@@1bYK8vJnHUF94SeaA6pkOHNY@hVzapXjZnw#izrZTU?$Ua?%+be}SEl|;dKQkhT@U0@mvAjQ9OO#LD0WHEEljBIM?q;i-F0MAt z!PLQbR0*wEjM;T&$|`ZuABHCn4v@<`^aqE|+jD^z4hYm=4)O-TUP$Fa1P;Gv7y$TD zD!ySpX9*Jk(>D`dKNb7L+XD`kK~3C>t=T=faZFVR8`ezHw9{nIWoTYir~h(22H&^$ z*Y)u14wL{+X5+^_-yzXG0r3-r^5>%aZ$mY~;JEe8+zSiiVc4i{7oqwYwF8lFbr4Ge zN&aKcA8k5E?O#TpQR=go2D0$MfN#DXbX}IfJm^Rv8Aq~ zb#Xknlf)Ho?%^XFz?;U3e>%U1^77z>HJn`|@HTtlTD#awJs%nkWDqOIZp&3nVfeI! z*Z%~lbz|qR2u~J(y!65>^uCz>BPRd$rLQ6aSl*2JF|-GI<1T@YXWCM#j_^%z)pT~1$%B~;2HSsJ1_8LHynW3Lovln&z- zhb3M;(De=1fZ2IjwQ1FUBsFI*zNN`Jlrw;2yQlPGi7FrbSY35TPGui8*im~~wdF$L z>yKm#DWsl#X=?oE?DdXES78AZS`$|e;9~!h7ynyXJu%Qjc@rvU7G#y%NaV*_w+4To z89@mh=m`#zK7w1NUqxv67loti)eT2)Of3%Mr&b%V!SJLJ|LKYC=Iz zCsYO0Od{;gn@eH8>D%+vxWp@DGPjf?0K%o+ZxOIU3) zTBiBofg;H9#tdmRiu&-SI7mOerWo-4=9=0n{q-qKumMC* z^d*H?D%C;W36p7Tpyn~cGU}(rLu>iyr%u_sR2zb}f@VRReAJhJh;ITbILRjDCivGD z*V~~^=o{EQswod)jCQSt9p%T5MZk@7iXU?qWB%_;#C8A1|JtEiU!pGJj1*U-`G5sP zH`uik&q0t!Rpemswd&42A$dn$MFsHwpv-&!(iKe)+VY&9q*Ub$(z-ht?$V4|aH-Nb zOL?|F=VWdQR3i3H-_mB0K6bf7ki7fO6z#axhLQbT@$`suJYR3IZ>CF`a=PNA8L;sl z_yt$GIrLXh@&e?D)QDfl0>IoRD&^z{gADx4lx9@oDRVkR;k{H&Sn+!Y;@y(sYaLfR z!gsQNU=Ux`+!@?tk!lO)#w0H_!agqY^4V8!;K=8RW>@gZHTdn!MJ0B<*^8o67cB`Gtgqoiv*c{c0;NlYBM(i_fQwq6wC&T+lXNz18Ctr zFd;evUi$JTa1O;9_z8K3Ev{aHEh5NE@y4GdHW<`grxztC*tpQWPhy8&m<`W`6Q=!P@Me*kb%+mi><*c3YvZs+ zM6ND1sD?g*nU7pV;$esL4$;h$N@vx%ge+#xeT6kLK&K9SqJE%7^BDKdzI?Ulv=ON~ z4>0U_;1u>6)=aAn?OZKk555*Q++v)Ozig=D>e&(^YW@EFq%?Wl0U&~ zE~{SrGJ-oX^Inr+Z9(dTax65@;V08^4VUp!%R=r=Fek2#b+h3xFBBO}?~>q;G3uVJ za6lq^Ov$)Nz{x@EJbVOLW0FPd;wXMq3mM5l0?h``$;N0lqWmjRzF=y?S5e^o z;zfq)Q*f?dN7_8mjLA91Pn@sw%j`gNg6Q~BPC0%Dj={G2Iyz-TZ7GZ)pjrn9e1~F> znMG}DyREBR{y08Yl5UQI*q&{Lsrc*I*89*?GwcRhO#HhE^+bE&gXlIm#b>QolU0dL zP(Y5_Z}H^^#$y56uFyval-xt}S!4Fsb@8#{YN29zvOk0E!Id=1Ftus%8CfM_JQWuN zK_mcJ*;CVKR#~uBJlmm{%mLmc*lVXE#A-W6P4P2}-aLFe*$mfAdP5#$1B59Ldau6TQKWx)71E>!);XoiK;j^1_PU2^ zgFnLUX=Pshw)tsu_T`D|wWG4c>qcG}%(}tW7fru`tqS4(A=87a)4nv!`GsYSb&?7G zD7b!-P3;7pi_cldNiPXdLyct+d8MJH!+}xk-xsE;vVfXY>_*zb&VN;bYgccd`%(*FNqBR9EtLR z2jn*e6k2|FZw&8e%vWMMAT7?SOunh?}=RG(LdLs`mcK_%k{Q7!;-lD81WT%b1Qn+DeDf z#dWx#d2`w~fCO7@thXZ6cYFqCb%cNV28j~}%;HO%$Zsi_@BM)&LQ$5Ugj^bi!bOoc zmmmzP9Mj6e?u_PCJ0RDt=n0*q_!IggNI2&>Q}U;(>ngH*QXq9(2xZnmD1dsW2~dVG z{leqY8a3O1PcsSN%A7p5Ae-|gCF+O4ZW5~a<{Aj%-gxTCK(qHWB%izrRTl1qgOLhg zJtwf7X-eQrK3v^szEy6ZC-`Wy1dF~gH%i)SwD4-Ke;&Lnh5o$_)80`)>4AYuxLz|F znm7Sf%s_~(WT%_TF}Km8wt;Fqt)$GIYg8L0(LIjOCpJP~e@2DH8Sl;?-$m8H^8iM| zj6S)U05X)+@00@^IiypiV~$0qG%~750{4!2R__p43`qbnoR|I`+5FdSr~EBC3%PON znm8G^&2zjqu+?JiWJEV??Wews5mc+ue}K-`==eumx@R5;2i?PsZd zk_E%shu}yewMYc|rN=UsKFyRuE+JCY?9_0UfJ3c5}`oCuPpvPtstV zCwT)NX+IG_yTr93Y~D3irsT1_{#GU;4*{>+{|@KAm5PahU&?|^8#E~t%nF zS7KoP3hce7iWpWCUOS6QIKWRpbn=@CLbio;v$BdEx8^Z-hn7zt)@z+`f-oZr`)P#f z!<;6={It{$dD)yQ9l%WF`&Xk>BR4fB9lk9$J9)Q0qJMvrM_=|$M3X}tI^7@|-_Tgu zNegEzjM{batAy(EJ+btIa>g{XT_;p!a8|z4umm^p7?*IBTk9y?9P4mNR<-?-kIOT` zK+A=E+e+E68`CKQ=LrI;XHCuP!il`Z!lDz-ZVGT7(74#flfru~4_kE!e(%^3c!i<s zFTbF|VWsPMF!*v=AyXq-?1>k!V6MoviS)u-$FytdATR!_9NAi61|(p z2`s>Df;|bk;TretZ2ZJN51Bd)$#xNsD{NyL@oH&VinOZExd0*h;-c~=6QSX&0; zs>!~=rpWMXcyCr}pGz&ZF|(_8mP#XgI-gPG`{x|HZfh%H zx8(lA1l@9v2)J0}wQBn@^6Bec8TE8!;k_mHxHcw?YX$7o{gWu45>bq0Fwt|N*Y8KV zVU;oLV%3u#c)ji%_Xu;dI@PuuJ>8xuG|s_W?qq}1E%;e`P5VS$@z{5I2Zbi#(8Fy# ztY)AF*t*R6nBpr=zrGHjjDtG7sO7n1Fp=!p7{$hJXZ}|3xil?|7~$gp%ll;)pGGm? zAG;^g^W*J&84z7fB1QTAG<9{ zxwc&R$8f37uO~@;-w^$>U*<>lkWWl15aB40=uC+@ev#+o2D}pWA>$M#3pfh2ui$jh zj6?-*vD`fZnZ(?z4)=Hp2L)d%daeI$nQ&O6+?Tl2bwyJ#nLxq(egN#@TK(HuW0yUuNt8q!15#(OseEHT z08%-^G9@E^O*(o?2c|-BEg>((t+tyi53K-yt|yk0nKG3cYuwrL&8b6kjXhk(3@N<&eNOnhKbAy-k<@Tg5y{+({3mg3C=fs(PLFd_$`_Ga9LGc+D7@T;< z&e^@_18NYTrm6^~&H(dxK!vaKic&AIv)6;*uJ!qT)s6OFE(LO)V4d)^hqvq5q>2co zV5(5)OEB)4U?**}^;}m)2aeS1Q@I89S4}7mljaAPdeIGnEwoA(1qi7GVrBMlo7{J> zJ0A;3lj0{z3=tN~)!>uU1<%XJ`34@~%hu=>d2md*Z5^h*RS$WOY553~^W`cP6VuGOD)-J1#bJvH!8yIJ!OgsM_*RC% z$sR?&{Anc1L8`d7qVHXShEKzcOuO-a`bkTxz5`>+lyTIi5h`<(8%pjd;B0^}dU*X5 z!?_~UZ3exf0C)i6qNfl03EZZEEQjaYJQ^Lo1^pW>oL9%nj?l}UI5jGFV(D>_W$9vp z&Apo*469j3sA~$Y*z+Fv<&X>ZH}hlB_Pd);2jlf_(ePm(xl?b^Hy`RaLam?M5jU?d zg1=A!j+=agCJ>`s{MqcIXH&Hid^E#(RopL?c`P1AIcD<@$ux^E;t5<0$J#qS{U}2T0@boA)8rj6F zQ;|FVE`*|&7nz+aOF|KOi|T|!MTQhmPKAh$?|%!p>+P|vlyvB2kPryU^q%AcFA?-6 zS5Y49#2e5ii|E6Y@oxhUtU2Q??YCVXlj^wEQ?e1P4~(d}R@bttvw7z#u$e6Pqjq)< z{+*uAFDuDui*#u4@Gr-zO>A9+-;rCV@I%Ls{4|w7R;JZ8*SriBP+L9F)Tx*dKzlOW zj1mXV41xe)cNzFPi;Py&%wXPHMphA>wi@3y+GMi0xQui*1P)h(4DQk@B0Y1oU zwE)jT2i9E}_vc(NPw;BM*%+HLCO)Hilk_v`mThCZXw`D9kqda+^+UL#!+LtL3;@d$ z+V8+-EX^o<|8}4#5KK8>8)hJ~q>`+7#a$giw&*etOM+*^0{RL}*8KYY^9LKeEZj4d5`>SJ6!bQtbr!67Wx;G2DfI04S(oi-hOD7@y`gCkf0L zL(NHORMaG&m+GNxJDABeOBjPl-p9io+TkD@_Ip-r{O>EfwE|}fe{Dx)mf9(h@&rJo zO39VaxqgeO9sY;_x%oI%0H5R>Ux+J`+!Cywj`moXeL=jxei8b-Md12ACz_}60>W+n zLR+T2{Khc|Uz{UyHeVzRmgK(f5b@(m`&pCiE?|*7G11I9wG`zwPJ5r~>19;$9>- z3STw!+vG%W?-g3V!>4iC`~aY9Tm0`Ov!UnP2i_SHGZ{h;0>QHni?( zS|+mcmZT?|hxC(OG=9E`B0l0eT7C;qj2$%L2B<$(bSvdK=t38R>sp)RE|!y_t6Wfh z-$oOCV+`NO z-{Q@>dr`umjWw~>yXeg`tjp@&>W{;yXGP@PW{{`BNv=n2QFcCTgiZ&mtjx3bo^Lq} zIuiLFPhK-FH+T$&w=^STYe|Mh@z;yx?98#E6?qIlpO_jJ%b`woVQ7Qe(HHl5o!9K4 z;lxr>L@*x{_sLvpZZVecA{zwdgBQCuLYUl?a|Fnoz#2uVFoqNT!em*0?;Af&08fIn zoafE0NFYg>voNrf=*q^ZJ?BC2uSBUHTdD=TqvUEmy=W47MEirjYE#PSH~pzL5N``5 z`PpxpTzv};gq9B1UKZi&Ifr--7gz=xLt!^^oBlB>6Eh#ie7olG0CzzlXIysikq`(; zQx6?W`sJWtEk}IN7SRVU( zQ8C;vj4iJ5cjFnxK}QRcO=;7`rA+!J@!C65mPL+L|BI~JE8*&_$R&bS29EtXwx;10 z_giG`r;UH{3!~Z1r0}Jv+L%HXAoVq{N4zrAY<9?L9UsN{r2}?>?ZIY3!=@u?S+X;4 zW5&iN^spQlWeN8C^M!Lw^xULApYHg;x32osxrQa?TS4iI8_Rb>bBz@p4R+g#d$8DP zL0pgNe`O1-S>v)4U|Kbr#HmbKwcPIf*tnBcs9E9#$1W6e@pAP80CDGfK^#{;g##l1 zL_oX0H-QiERYZYe{gK)TE7zE{DkoORa4_>bu>oiImRao;&dEq0^>-&KaD|8?uRyg1 zE60MYCzH93#1$TPx|1_4QCla@TF-5rx?}r$dmr0#C{OB@nA5n)L@%VQuiU9H%e_9G zX)aF{2=a6ZcP<01=&H7CuZkr5vM8{d!Z7Fur{q%dL2Rw_-~oI?1|+t!oYA& zihdiFWOglrsRE@dBqLe$UB<%D4+TG~k;}|_MYeuf+(<*V-?hjZisQ{kApNg>-!6bD2Iet{K7}B?V44k}~Ds=<;E&fwi z^PxS_L?JE)MI0pOpw;)OO31g^7J}_|H}H=*VK8sEKYME*%b!CWhs*oydzn_~#{C9? zgpA-PnQF1VFhf4Q4}_t4H|UL_s2w-)Hzw0>k{Dn?v6gm!;uoA$e3Me$2xq{D&cPq! zQL7E3m|>z2Uubyzich@e-WiPdGw}T^)Wqz0GTu9O#U98(p}hZn$LgcJ?I}P_zcG+pf6O_`+ALDvIhO6H^;ij?L>lW|5_H}mf zCYN^C`zYx;-!{UzbK48>P2qO}jr?J$`tbE2csPsiM*K`FwlOc(G^L=c4wPb-35$_K z0Qg@J!s;vd4NEZ4mf&9DYx#gDq<;|<^Bx0t-xzVCRL_x4Kv{7`q={fMq8Y2I6CaVY zFPvAQFgL`Rulvmu#Ggis3`>mrWFX*2k7TNE@HT1@_W)yq3glkM!sKiB7bpYFqd&DBxnDo1g8WC^}{v`U*>Co<{nqe5=STQ`M2G>bZ&JCILY|N?>cy z5q$Cb2XLCXok3k?N(j#S;%k;7~i!8t`DAa#$I$@ax@%piASg zKze17z@qYZlObmq6QJes>^~$&yfzV+*mK@iAo1#z&T#zIC~fr%*y_Jj>Qdpc=U>O9 zL|C7|xomwQ%-1<>!Y9!arcw`5N#Z6FC?Oz*E-2ZShm#l97sve7X@B4D7HlsyTSL=s z4h>xf*4@V#tWu)7^;URK5unKMea%~hI4o)~2$m46 z`a+z^#^KkgUDRLr7^Kn`7ZIf@1UXopk;hN+vM^R9u?xMpaL)+jXBo}MWkV?+v#X^f z8jCpNP%ru6;0vX_SeeRq@6+>o{2`5(o3$-VsCk*C5ywZ|%4%t*iJYFi&rn&@v+74& z&=W)A-cMosW|0!p0&%2$w+8vm{fBE&^VPbhQJd4i-M%3x5_S8o7BVeou6rAei2kuS z`U2_PQ*&?>T*7AZOoRwfC?}dYDHEYibW4geLgD@guu>y{Y!%Zc#_Ac>zzj6R6*n;7 zsvjO#q=@O7^(dT^@i`a8ib*us5bHb3flp-&I9JhjOJR~h8$XWb8+rqa!HklR((#W&yz1VHMnh2l#k9 zOP;b)p0ErCy&VjK{dUzJDESLwR0mK34D-E`&^yJOKjey*pQBeAKkG!{xp}u2D5}BQ+IUA_iv{b|=D}DZ3s^?}+TBZU27nIj zd&n^NvF$HIgI4oX#qZqBNx~2va;Whu*hC9SWI=;}I0a^`L);#l8rtsJBOv3~h`r}7 z1e!OG^7~gLR63!^i=s-gW%qUQvfWWzdolaHDTjF3k>u6dEo$MOU7yk(&NSa2SBxH&G2_mJyBNy1*edVbX1Al z+;7FJ@--&@h1QAuurF_S9U93mY33EVjcAVp!s_&hpT)~D>~#2p7gem`x}&ohoF1%N zo^>-jiiT#eqFA3Kdb!Zsb>uX#X0<+|NtO{s&wI5dP6_uW|A{mPeOD4(K49%k5+E(8 z(#?C65T?!Ss?)H0I@g1HX$dRe7O;;DQze>6%YgTIn8MnM7 z{4`)X6)tZoJP<|Md9-T8vJnPok&%cGw83zgK;RDdhxxBW>DT(ISr8CZ34+DS8a& zh1xGecL?Ya5lLaPb+x??7}bzRm+YXAyESc{ZEF~Jyzi8 zTL!qsjX+2k0~eB6d&HgoSZB*Ic82-_R^X}-nppxuXGv|1U?5{8q3PwyPG^L=E``;{ z6Fi>z)h}6_iQW9^LGmmr%T2-%l_Cx;yyf0ojcNFB!inUT`X0d80V2l@w2ar+hCP|7 z1Er4#7?0NEXH@MHRL%D3MRVfdXn@LB>o z`GKO}xRbV;R`{H%cTYzo9exW!oM@aX3TW-+xr@)P@(^U%^=)0vmvcLs+@ra$yg@LqP$SRO zCqFVlO;_#xSRE&Ys;RQ$F^~2uWi6^SsEW_I99CuxXoI^>H#qzm^QH~W%gtX+QAST@ zg2!OxMYeUamUV_;_dH#Q8|8JSWUst6Wz81$&r%r*1e`oYEt>cd>l$M9077)SdsYOZ zLDF@rG~G*|L)<2g=80O&7ayl$Zb7N_jiVcQ`6AD7r3+j#ALX@z_6YKK?HxQyps+xn z?&F9M3}*~IL|v1nq1i=MQJ`!{r)mVBco(v(T_#Ay2bmEzW{~7pCT8r0r2qYO(*nm@ z{_NTm(Ij>l1=*;)d(RC4XY@vyi7Eh)1QGFg*$QEr+huhb%16|$<3sW+DruTnG#tML z)XNv!`Q1p-OG`GI>L`&w!#aJV8%>}gQAMR|s|>4(9{^d0n+x^KUo%59EWW>hjEB!h zr3E-ub*U{V<*LlOIPU$Iz^zfY@D3!4+}a@b^+ZSTjWx2^r|0IQmZ1;8w*=7CIK3Fk z6yFm_EgjbCrG%{^z{qD@%cQR7Ke~T?n}J1UhUD!})llCRa37ue3%#NRP$>%B9qh(1 zXm16Wa~%Y>46X$Bp#=c4? zu@PcOhOeCm+{;o23xyasCHR*4B~(T`pRYaUOE>$e&i(ZhsMFm0g(Yat0vq8HQ|Ajz zPlzOZFqo^}g8>K)Cl1Unv$sKrhw5TeKR-_}Bm_EmAP2IRK)$7& zrH~>M6@G(2tVoDcH<`NNMp^)B{4CB7&qB6e*!+oK{OAhWWR$@azn5;3Dh2C@UJD1v z?^h0^2lr_I=@k2NuXk?ztpQ{s5iVpEX@R9hf(^6GSSOOUdrh&cYgxsu*hpH}3 zOtDC}0$COd^Lziw)|y{)#grA%-!Lm|{5F=0;M5cC-f<;!hK6BV?-YUTi`^#coT&9;m z1W`O=X0}nNgc!n4FcR%a05XiyPg+h;Ou5;qgs`-McqB9uPt2u@MbncEPSEO^=wI7= z0L*rpPLQlMi~X*(^ROHa^1dCXUS;Ubk@ra`*RyQ}+4{N>0?Zj-P462r{M-BBxJmhF z!3ZM&qiC$H86xUq;FffggzVxl+@E^lW|Xj3Nj4;h`rDdpf&(|~wr>tNKcu2iUT2Ls z6=M9)I}B}^q$ieRrzi;SE0bIAx69636gU_Gc|H%x>JhvN`4h0eU+wkdYWYGMC!sUH z-{|S|2SeX{>xsHX2o>%}h;g#7nu}5?z!8WX$Rc>1jrv#v26-~Y;e|}*f7`~gT#IaO z7Y-+mBV2#?{StVHf&*IpeER)5>felq1UH7g?@E+vk#!)>fR-ikI~n1COK%xG#=DKi z1sj7={`e7GKh&T%V;9e=BwmRPow9yIr5rP;s0c5ev9Rdy%Idm&2+ltwZ0n(_-!QQ{a^jk(D6&Rx+TQ%=fFZq}hI4q<9PXrD-O;QHJaA5C4j2h-V_+xN7}T z0tnrG3MqT{qdbw?kT!ZD(Z$iM<2h#5q+#7*?Q_0v!>xR_WZ9z4tETMiFE&G7&0|{Y z`9?Qvn)3Z?niX>uymFMImIZWwPFIQD=(dy*Th$eCh1<=_b@s$wM=V-c7suTLeC5Py zc>iTA61&0h8fdz`5isPHzO&2%>yS1nq)8&P*(k*6TD$1DZh~=Kxv4SbU-j|unyxvv z7WOhXWEzia)5i&zD$_E}E?A##>C24)o932TIa!7?C@ryEIWzL_&ao*T=sbycxN5n z+KgjWv0chX7=}*AatTHnkkDK=KsS@=7PyDmXMEl`zf9Y*AxNIn3fi(S*IA;^o+YkzJ=j9TOta%Zc9N`0ZLR7Sdj)$A^C6G-|G3WO6qOo0Z_%{NW#p3PT)?j)$;6owB5Wkf zD$%FEeNk3cC>rOvT$;MP=Ic`OF$(ANoHR1=nkTC}T+=3y({}7%LyL}OQ>Yw*wq>8L z@e-@3TdE&>m1r3>_nf_vqE-#ldNL)=a<1o7cqVDn(rnZwSYvQ0Ql(Xu&fe?n6>F~< zUALUnCS6&R86(85=dtJP1+m>UH3Skx*CQqjrO9tIy8VTy0SZYC+4hP*PIQqH?;5pm zcKo(Va%6?t*6v^NoE>7L4U}W(*G*raEKP0hjc{ddS!TdX4aWVhjbly@wxglI5!e2krwLRg{Wvy zSN4rWXUls31hprrQG9uF>CX~sRuCP2oaog0Fb)b_iSTkAK(LI5e1tIrer`Fx( zA70HI#9A-qvhSB)Q%aV${cQHMJOT0kWan(=FE$<2MGKKtuf&`Ug)^Cxb%PXXyAr!| z6MF23Cx3B)ObYnjNcoexW|E)xk1iYzz2xIf;HGFY=Lld8098IGZR6_>g1 z=dzi{WjXDTT>F!Tgs^5hQLOU9T|b#?Tiox#$d#_Y2<^0clCtSTyABY&jZ?keRdnx` z?fwYM8d(oKp19U0pIMCcnfH%?r|3FgAtE@C+7m;!aV&Epl0{jTl)cF1+*K2)3b#?K z%SS6W&CBuG?2T(1XC-r@V^pO%ddWQRMLb9jc(Wwo19y!u3zh%PYHyq-YsQ_t9{E?8 zgPyNe^;0hUODY8F+f`wzM!)RDvO)nJ3$TYE3=!fZn>AFDyv&t-p4jlZFWwaFc>QM< zzhWIcCx+o)2=gzyIuDkiA>{-;@q>jhEO$NVXV^VJd7(?K;AwK^ApJHOBe<-;85CD5JUzXAf# z9&HvOK54r06kh9mlcd$gg$b>iEildu0haYgs>VLB`+WNQBy}RG42YfXj2sJ*S8-1* zN)&vG1`e&WLu~5;KV4pV3#WIRZq13;!>twm`b!N-GW&?LD}Mt|lHcj!iJodv*Rvu> zK1<7yHT!P!hIAA5ULpkc?R*3_;S3qnq1)$gfMc89*r!-Gqg`z`u7-jtZ(Z9{f6)$f zcq_iED#)!gqfRa*Q+KPE)GezD4A&y6)`ZoU@tr=g!y{={zyR+T%?Hhc1`7>Gv)-?~I>0b7DKy%(G-Qr0$WC;P^orrJd#?J4ue9!OXHE)U$NzO8h3ay3YP^5p>NrvU}TK9Zf$cMZ8IEGSclrXa*=Z}H9aXAskyH7Q39aG(ay<-(?Gr2 z5Gg_*fTrce-0)-4Z}WP;H%^%_Qnv7SFm>j*BbLl`8c$qnW0%i1Q(|$zDaI2;x)$jx zn!{GJ-dIJIzOU!$#AF;3)Q*UR+mHN(2D*M-QfI~SlWgoqcuE1owu``D#9HH9^#-UE zZudG#g817|_UJ!@J?h(T>I56&V1*v%{C@5Hb@5TjQpA!xMR+|L`$HKOX-3?n+}#5q zsRaFg`d}((y|Vmm4#rf427VnGI-Kcpr8srrjj`N!=X`RAmhRjzEj0(lD$}>>HeN`f z2IF|*i2c5`MbWYmCCCeR)Q(Yng`xKGkML8szsb8PgBpg^$0C8 zMmteh`>$VB^SA5zJl<&VN%uX54Lg8i6>Q?k_zTc|Uw$35M6`Rb<;okl;sau)a-dmKDQ-i zhAYnPD87F`D_6fhA*Q)ol&ZAmC(ScZ7M5BOA1yDiE}elHLUhg+&BaU|%N=K@QBR?B!pWL<9pj z7hm3uR|8=aUYD?VJ-Bx}Ej`f|UjG+G;S!7S>b1iQ@s#x{y&R8DzG1060O;YpCj!2g}CewVjZgoERI> zZ$R~lG{WHtiIZ|wJ>ByBjbQ8yDBDGK^3=W*sFQ+x>2Fy#o5r}B8)Y<^q(Cv9SNx^L z!ZQ~VuQgY^ft^F>cG|xj@xuCx4XHRg4Bf;A6B#loxd-LAeAlm(RkNuJ;X&{))b z@-1s;;vztZk*aml*j(fK<&>odqz{K>kYwP0Qg#4lHrp22Ou7nGa(~|3Mn=H#)t?xx)!E% z!gbeCuIDUKy4Q+zkN~U+m*qbf;gjfVWk?&-mTT78hw=F<3Foxi7bW!5FI5F|DGcDb zLgn6ou-tZ0x<1eVdGv7zE?eFaUUo8eLc;2MQ~ypwQajUVeOEb|lhnM3hYhK>5VQ0P zE=pK_Di$@cP42!7tI^Qqmq#Hz>?U>=EmWq@PW8y*rY!RB-g>f#;4poVM_^R?MP=n% z8C0G;4e``g5&A7&uG{sE7R-Ew$imhxqd(rv@K1;+Fo#vPSe8Nrh5%mLr*(-s0_Wa# z_qO2yg`yKibGi%A)CXRmpg3;Vu{^{5^&bI@5HqnJVzJ8-u3)-hk2f1(nJ?y6@6M&% z3=h2reP$hVwr~sbab`j%+ymF9ejm^Nc_RQXe~;8Z&-oUX?k(O zrEw1-oN%{q*)Q}7?qrAeFRK)gsm|F6V+=c&MBuGb9>u|0Kh3;-)Z zaQzQkWBbw?$a{9GvZc^C9IyLjuNR;NC`&S-EsEb##^E&AIkr($A5+i$#V#ATiphOQgwx14|G^ zMJxkHRZGnMSE0H<`zWv z`2h!Go7-ZjLxH2>(a8LShj7J72(R%3kp6++UItqk>gBzY*)_o%f=)Ul zGplfojMrN$)$qH@k*Hfn6J=Xt*&8>At@)Pui_eMZIg_dX-U-=+ol^DC3%o^1>-`{6 zllO+%72Cx}H{FlsjT(l$_!4MR^e9zTi*wQ~3=IGAW~z`C9!8n@d+}z~$!j=H+r}l| z_q6mBK?)2ob3F&4A9rZ9^KA%SnHjcbuDufh^ivzJN!GHK`FbovTy>iti2B?|i_zt*xf^slF*vV)ItfYZ`y#11he{pA@fx%>z??PON za;r7rPG%$VMUB6=uv0BM+PKj+xnMeuxBPLfEnmK7r0OE}ftxO{WmoSdnflj}ZTlJBBy{h~ zFV6MS3-*(d!LoE}H5PE;Ja_S6%K!Q;8(xP=xguW3CDoS9vsAcGlKeTrBoFx6?6Wem zDaHCSSaCEfsrX{iMVV zBw24zw!fioz=Ze?BmVd_*AEt+tnOaon`3-l{1EGL=G< z%xCYG&VKsAt|?XROrbQF** z-Z!9C(Xz+p3r5{+*^hNf4vMbTE9!3g!3fOv1K{yHbd?H=+X+|8dh%q++?(lpsw*FR zU!%w*TOBc;a9#xSAh?HkMFN`h00zNsMyAJ&H1lFX0-(;I6`$YLlq5sXE&LAk!OFn> zI)D1^FQKMn_``C7Pb{E}#WWnyay+7uNQi)mi(&|#Z>*BGOnPrb@SR8C^&S%141Hdd zG<+cCL5sG>2?V+4NVnP&1nu2P5Xuh~OTLmrM)@WY^ON#&tkzIID#@$mp<6fgTHD5N zNeHA`L7(G${1VC@&*9rS1tUjE&STX3w*1MS-Kp+MB-m0yEEqM_7*AVXPPQq6qyNvP3m^N)Sr= zB+#F?U;z4k0#Dj8f|{T7KCEEpH_$Rb|y{NFqq3HCO&8 zeD(;kIRk)tP4ixI(OX1>iEKKuz|M;5oxsJg6uhbZqwHJYrI{mm|A(Vgi89?rkR zV(NQ7-q%Wxg5;M~%M1&4k>OcR@5yChUYyp<`!?OE3M=nRkjmH%Q=i4=& z-O0UE##GLCL}c}0ay~lWD>7-wMH1fC9j*F8KLDfW81%Z?o^Mf zB_LAhkfB~OT!kpIg7f275g{TOzAYKjm8_T4DIrawVB>Z~jykQcKT+4KvcO9aKS8$J zy0FRxvdF}NXeZCmS626RQKyoU%4RN5+*n_G{K2>9URI~yF#h+v1$n%^OZ%n8FExJE zyJ8n3a~ALNs?huWhCHL$Ln~SUM_WHp8#h-8>et_20koJ`(YQ>xLwp9-ZJAgXlKiMDjOE)5O2YcI&H>)|YZ`D+Slik?noIC9dQ$ z^wC(S=|-Zf`RS$TBfptJxqBqs6ax4Vr5a{lWl@t2F@=Y=^MQ7M(V6sd$(y^8+r~NH7tSdgTf1c~fSbi%|8@{8& zO_BmMNiP$$-1flO+<`$v2M`o}DjyQ5ggDYSU-d`-jVGmEuWO5KvkNi=kZYD54eRPA z65V0lxI!39--w=JlTn?&6;hsXkS1aQRJ|7cb^VTA$AdR&RkL%O10;eHUjVQ4z-`Q& znwdNjuNEUSU3Q4nvjXiK_F*|KdlTypQgjxxs&9qA=ac0fljsFAoOAt$-b{Nss4$-F z*ro}`4Q|wuJ(X1OkTJjU8STrucVj&s)z4De8hZo{tTHv!MAx!f{XOVwX<6G{Vus!DY>(tW}s09VJkp z`m`3z@9(SlPoAB*2C7K|`JVKeQ+8Y9c5#uo zm9?Q9{gqMIWhBuH0KvJ+f!eQ$M)C%%p1)#f%x%cD=!9T@Rin9iSy~hCd8qB$>84x zKB`Dw-k!T^P?(Wm8B&^?GuEeovuOpJS+WSu2Y~iUr_*BM#*D*6Ir*`f0|9@(>07%! zp>zlC_f7WvZJgc<`TI$x6@&og$_#;mAPXQXw7Zq}Lotuz%L(DjamcK9tmg=8zn`-- zr1aBd2RMiH1$b~J?0`RKxk~V#tha`a{&g(hZE%trKs_z0mi4u7Da+a51?U6#UrH7n ztj{R#00mfLXTjaVI(;puLz|kNs7>tN*IfWF?}V!x!T<#5*6r%K7YZ1*=ii-D5>3Dw zXX6)^1b8@%1R|lKg*I;Vvo|KR{8y6P{;VBwP8odQwTTYE15l2drZOJJ6U)J;u!?D{ z;|Xs2bU**Zq?n&X)gJ3F`%R5Jv&*?i2gqp91Rz7LxlomYcA~jYeUge-=h8pC`H;qCWTyy8XMo%3 zz#=KC$9`Z@*qh{=A!o=p50>2ioK}R^!CTnpPGt}S0W(uA%|rPpfeqERZhw!Yw$dK( z-U+YeOs>*}vMHBCTKTVjg>_bhE)RzeW*=~oS(f45(l>EM;@Rw3Vtu&6ehZ_*@$S&#+FgVTof6EU})o4+MbBg?P-S_HAUxoL4k-Zqh+4L zx>v%X%7a{7J<8?+jS{5#)p9-fTotncMy(;O5@Bce(6t!Px}QDnfvNP%@RbE*3S@Kp zTp+WH9Uk;nYP=XKKRf)^5KP0W`b*WBgOiJI%8XC2QpcmU^7XnLutbg`07KhKZ(J48 zJVB&Vvv$c4HubvbD70uoG91*eTU>HmttvQ(&vc6O{bJ?EExt%irn%02P{BXHt!btU zR8#NamS#wUVcx{m5IQo(fSQDG1#!bmQq(6uGNu+DaLDRNWIvCkPiH^u{q|ptdmzdD zbur6%=d;4wt;(TZ*af$GZcJl%^M?KX{PnS-uv#A-qc{AcL|Sv2Ki{CzxNe778)2@d z&KmK|(Ef6_vbJvpe=E3Ed5yN)uv5kUm3%>&D}TJD++NKK2e^eS8q*b~0-C~6Fc;sx zxj2hqvMGAtde#l}>#{>St6L4v&Gs<9ZX%*{WhT7ZfYtaRDZV^74KM0SbHCY)e|7uTpy&vR>#IUdWH}kntf}9X9frcuP(zsh7Hg)o|INqmD zF7CeOSM2ZIOULv`Wf>hq<5Ms|B+!@#<&iBYt*CDu3KJKMXss&&G3FYjgqsw=R0&U! z_@o^OZKBS1+kB1&8%LmrC?SZCd%uG_+=xgD0XRSpPH>MZv4$$Mm4RYx=1zFm=@R29 z_SXb+AxxbJ7@?o>pT`N5Z`OF#Z(*fFLL_%M*G_rx!?=Zlh?w0IQ5bM|eTtF)(Cc1& zZl}?RJ;YshmtZsVi4-8R|E4gjvd)z2MCnR(H^xFTt=W*3KuI|8ep$k%MN3~z+}tncx^2s$G%vcXjEN~`6d9tKQ%o{lK(^BBw~|u?2u<48 z_iYBBmtj6Zse{4UvPbYP=UK~^yg4bU4K8-dg4hO<^);rG@R094FG+q_k^7u7#jmAl z({!|(={)2h3n~Zg+l>qlPd%XOBYnGS0+6@Ae5Od(@ZiD>3NPMP24hlyk!3nS+$b;J z?Mu^##yj6y4rvaO_)EBGhu02{aFZ%0xbxj^g(;LwXAvi=Vrm9|k@fAXHhi!C7H~I4 ze4ecCs!)*~=-!OWF9L-P@cw(RsPH$`JihsT{RpfM4;w6BZ)#3%F_<4IEFZi$XIt&} z$2+gWBw&2eZU@;&=5#v#`}W78h(v)vV1dwL5$Al_wodsqXY(d)Kh-p*8EKeXC_Hmf z*y@i|(Ov#sp%BWQM-i9fIA1&=Ff46a8%$T$hAz*uLs6Bwi8o&wGs3MM;*38$kfZz@ zQHYgF5HOJ?K;cK>NDaivcT9IQT_zg@{SZGGSrnJVm-0QQm)?s}sQF0TXL_=C#`xOb z#T-{URBzdbZ_pPt%{44Y{o5?KpWgHl5ZsPma1aakF&R4(F1!xfbN%Ke{q@zY`xV+O z?Wmy67gQdq-a#o1csqESxYyipkTftO-_m*c0YD;`_q!>Mm3fX!v!(Ss2vB^~W~F4v zgzfMaKaj8UTwvGi{wXa#V}55r6htsDV#X5K)fyd2brUx=3GD}IaLmTNRZ z%b3(DA`P?2wt27>)25BI9Zn+f_%(oQA5To4$bqJPxva9W>~V;vF1~U?hKaccRlxu| zhRvpf*l7OLMlqOLgHStGekH3k?Vk>^v0uAvtRP|2rHIzkeJ`6%Ml?@v3>&J_FW$SN zrI}c*@CJgKV-#0SyF_CP7f)1a_~G)fKAV1TrD|Ky`96uBd?MHHl(H`g^=LMNCgmFc6mE48HGXK)BsfQ-me zsMRJtSV5|Wrk{zv@>$?O*`UnLgz=LX?LAsYF`V!R0y;FAOo8fC$D?`d`T}n zTk=`(-YMZx;Cc%{!ngX#G3nHQC0{99+4>wi2PCu-Rw0BlYQf+KH(ddO*NY{-$Y)^c zeu6V6>KdKSGS{Jz!HkobY56AvqR;|fmE|T6=HZf*fbNwiPnmpMl`5Ok)P~Hfa!%cA zVi)9mQbq^%{VSqXaww9Xqu6~ zM>dK+pRkf!|4RDw`=9%~Mb{jV22x6VFGt$J@W{`x&;l$*w*kukP;afuX&yK>BCAc4 zCf&Ex;LTfLb{}5%Mjw`koLFA^m8)>gZE%i<26(fT zXGI_*4piRZXEIL@m0-S5Hy$s%&dW#}?oA$WeTQu`eKdB>YblV5gE=N;P|(AdE$HVh zY+k`4`K^?K$%Li8oboqMX8})llR(F#KL%xcE>7wgEdOW`8=K)xq$cKY@rf#DL1-u6lVflBI5vtPj zx_%iHDBdTPJ}>TK2IR*&r4}mn`DS@D7Vu3X5?^w9qK1KdR8*{rV z5ajz*+Qex)Ho@H!Bv20`FBG}3=&VMf_Ez%Tq}vtVZ=CNI+MSX8zJwI5kF>YGg%>| z&eQb?3-DM2721&ab~~!j0}g|szv^Yw3_g+$kJ(?JN4|9*|6QSRqzD2eP`GxX(nk^$ zZ}2oWx+-KP>z*&Zey(21ZErZfirww6L#Y9-0?P@G=#2j>FshB96$fs&i4JC9f5&Hz z!F`+fp_2~NzbgOEeS==<3>`=Y3)6Sb)-MXkUdhp@{C7nc+hH!98E64?EFpjLo4{nS zG?V)$w<|;_xYA{~rIGTE$VVafw+|Mv5x&!hD}dYl1n95?JhVs^tvu}n(Inq#STbrN zf6-W#S51+H>9Sw22x)rcZNH+h^rvW1zzcAnn!i#&L)S)F+}$@%ugAAoDBnG$C@2?1 zqrQTwY09>~A&b!Zp=Abb2NrVt0POEApL@6Pf1W+8Rz$`GkktLM*I+FXf$3W^TmSQH zPZoCJV(sXLKO&8SdIIu>qaeus+=51c4)jq)A5LHa0|Ye$#2wK8u`^g`(+6!SR|#w; zL{Dtt&XtghxAHa#VtAPha1!t3(Tz|Rrat?rz7Cp>#X^&i^^xirhydx9lhFwMM}--;~1p8VP*m{CVikO#sggnb*d?h&=2f zI(+@;(JH@6ZLxjQRIm7_F6Cd9DeMQ;2iECsU)ac_`n9!9{T>!=8q}P&LbX92Gg0pH zdLv}W=wBW(LG{;3ZC=#!{uEm+3FNsZw7dqXLYLU_7Q#qhxH|JDlQ+mbCaPUqM2qUT$Gf|DOo5O31)!yw_M5xs+bAO=k^h>J*wVJ*tj2uadB z1}u7W&`3u5q>S*|*S|}UYJ)j)ev8Q2S-bC-QDHk#`^KI}Y_^QHK1*Ih?d${7lTf8$ zH`T&20O!p!-H1n$zxz8~w1Mb(TlpRVFkpq0m=I%B;{TC@zwI1C7)#Up&Z?AU?n||tAV>O5Hch{;H@5S*&wdI@Yz{^{1-n!#FG6~L1r;G2^oX%eX zQ9Ua%S_3$Xn!S=HMhM;_A=_={-Nu8}*8}JVmcE+?3FbH!1h`R2q~XPR5nUmRs(jLq zX?0`ds~iTgqpX=PwpUS7D7*G;cGg!%AoWyuDYsUS0$Z>eus*&Glb$-cQGS_>E`JTh zL-BX;{6eMSWrRy+591)OZ|YdjmqPf8K0J2|ecqASI?YSHUQkid@EQ=IP?X2tK^PVm z!`G){X0Nfgl!JG#`y7?-2CQ#Mc@X!v#R?0D^OLpyeYf;Yxp(=@&7E zNUp)`*I#J#ll51&;`lKz?hUnt2aBnM=Lb@Kk(_&pA!39@#0wv$d7MD7uypm=C&1a! z;Wsg`?9WL{(&iBOQ^y$oU>`#@WTx{142v_ag=b>_`kef4=K4EL1EyJ@c;Nmk##DuVe@`WPGG?Uu7rDPFDolF_kF&aYe&m5+eFr4CnmZei+xb z3QKraB{_7Y0Hs`7_hea0cWnoG2LaRkZe8?xt2y97&5QUu-ISy6i<}~UmLtR;{dh~O zA5X`8OgQ#UvI$CuK7@A@rtPMo&}5NgBd^%sb?e3LAMs=cr_j*b(^GB27}?Ku zeJmu)WBA*4r0_d**du;MEs4Eh33)87+E9PTK6=8(Gc|p*ZgL@p`dKeS`_kgea&#w9 zg7OTGEe>&-ifbdBH2Rdo+>Hi?Wnay%gCxyR&x+{v7vl;$QCz+J0F+2ON_B;JoBqQ4 zk5uL)s-7aCS+GShGEq;evO1hneaQ`8+rz^zY`P!b-`bl-eOfq<1~fI>*6Al8DzGEJ zD_?I|l%_>(d4^rCz%vypT`*m76aYB3$G~yU@I};)ckCSiS@ugX_FjLoxKOzuk`o!z z&r2hI=4cd|ERQI`GYCp!~RP2=~fk49wc?w0?oA zK$4otP9|%F`MeT^6}Hqu<==0*d?E*$>MZm5DtXVCiwz)a=9{o%&g1@uJ7?XV$_7jC z5FSpPAyt!Mv~urfOB}TgdiD5o8nRg;_9dfG42)RvZmmmYy!xlgAkStzQIJ1x!f3}7 z^2O?IZrGDrvP4mIWohPT9sG9(-H(?%6w=G$r~_i|UN7AiG$_p)KRgot6>e6u==Uxt z`pD%ax~gK)wa$P#=xZy^2er;yG`S9l=zYyKRu0JVTV5ros+t2nI!Xz+A*$Qn?VZo% zma{1%{hQ3m9pft33iC%HM(sgxU+rTQAZMTDt zOjmUqy{y5uv1791p8#DCVuAjeueZLkn42vuZUHo0sN#n=og#6J7dpNZPeBDI!AJW> zL5^Jo^}JyRA&=ZuBIwjp?df9&!41M@h>rruv3x6bsCXu4;=vZ7)NqJQ|0rsVB6f1hq zK|fk}nUI?Y!7+ExOVB^x5T5;Td@V7ze|b_n=DsSvdlx)=g%=hCEUUNDXn;m=I+Kx; zJmFqfgpW==3en}nsFvoV1h+ox_R>M=96l}g3(4pY;8ejavv2%zaW%UjkY=OC|B0=b z2kZbnZ;?eJVUom8{n{VLz<0R71GEmMUh-_Ct!|ebqi`FPX-|()>kd~a`M1V!UnZ2} z>-XVW!i)c+>NI1d*y1zmnlBfH!BG=F(#N8S1RQwXMX=hc{mwU5nE3sE_axmL=~$lI zHSf1bI-HLh5MDm*Y*Lwl6>R80PAGoSV?n+$`-0c+7^q)4(9>IMW&QDC=VDl7b^L~( z_|Gk?9u68xy-9wO^xc>y=O)Xzpn^s(_Zu2YuLZH!f0x=9kqmhvN+L8M zUA|~o|Me7vShpPEDfpa7T+>yopouR*&E`>;=3bYCCQFFC!Z?m5oE7=U`Na5K=E}!j z0#5^_8&B^inlp&~t*$0VOzkiD4Z}-Cw58p$ugLU+DFhu97(qgJv}g#=TP&`&c*#%+ zWdy{{DtrS!Ry>_he@75RX7|1M73f}QQa9#zBRf((%jnE(_oKJ|68>#=9{}|)jmM~~ zM1A&EZ{MfjCCtvTE4lKIZ&>V0Rp;lqxn5s}HY8h|U$NFKkiq$@;|rA=lOq^U@Q;S* zx7r?Umor|n`rK(Bs#T#5YdTm$wqgatBVENtH!JD`wB_vi^LJVAx0^A$<`xP|+?EOu zRv*sneGoXi_K8qz-si$a zdInhoSER&lPQFyDw_9MjzXjzZ2tM_krlxloQE#gM`K$AG0GeB zmgUZlAmCfM5xNv6qu}~Yd;|m*=qqfiw(k|EI=)M z%S%SS8aaSGrz)tm1m`7@*)0CPk=O8qgJ#{_D%@&zUb*dpZpTd|T$4sCsj51`I%sgv zle*hf5FF8wY0K2<-yjpNOm*OU|KNoUtUoIE*bAn1G-`G=>|=!k0oM-F2ogn!F4Mi9 z74xR7@0@g?di*A)feZn^64dlW*GkJ_&c<@Z*~{NkUDc7iRFJlGyE-98hn}S6mJMsE z6I9KOxB38*a>ya=KX;-1@L|8SIiA_R(QzZkp!zd^>o>g6fFTlLOcXld!Bi~nm)k-c ze-M2fu3GrbQWTt+7pag58Mhb`(;ay|p&gBC^}x zjU_^-YE7dIPw;Aq=d&VwI_PoeN>JQO_}kgQmNA*znRQuhLZDI!=RLh8A2zR(2C(qMt|3igVZk<`t!ZET=Cm0MA#k2tQUnDu($8}Mqz(Wu`) z;p^ppCjf_-X#ymMQ@#o~0EjSi-4(teG`+ZYr%qI#TX}dQ(TN~lydf}2KJ^DRZ~Het zZHoN$+;G?|ASZx3>?Fsllb(<(A)OgY(Zj)eFftTJ>jcqnrK`<)FRFZ4J%RCCQ>Und z4+m%2fqA9Buf?W5r8qU&S3a$tD=fQe`27^`-*z}iTuQgj`%dT{rx`>xAabkV*n#?o zuDM6uf8+3WH4K;813#gc!$>{>p7!v)0gX!XJ*&ftfK-uMSY2~Ol8eK)s5`$Db{^AO zyW0K^(eZY_X^)6+LKOVyhI%aFYEv&t`9~!`worJr0>=`Uh!&e1z!Tm!&sFcgE4scD z=*rsh`M~LRX%X#_QD9_k5QcfKlAS)Oc}vooOFp+;y$N|-5_WpqeYvEg95YX7EMQ0@ z*0Hw2`ynZ){3MnBME3ZUncEK%8h-vrVem!zEq=F;LEoghN7(EP>#D0y_hKZoi#bJ(!+7#V~8kkDfmE-XF5|E+09ct`-P-TM=h@L!A%lq5xO-M7=SZ?{1kU1K`J zR$jT`(x8q|1@w-Zs^o;?LuY9_FA^B^O+bO8J64Zr#m#pbcklIMf#q{+<)HQP$a|OX z7u-RNzEW=7s_-wv^e>fTy>{+|%GtNIIxBnZ%<~}T>_8s%nLjqJ0VPvn<|6%C!dOnC zwi}@}7g>O;zJm6q`JsYf=$~MSf?sYTbVR0q&B?Zx7vrn%Ei=S4z}H!Ia;V|ghf^6s z!o|j6JM5*0C?gwVtiE?L&GYBBFf?@rhJ5hi7rl(AQ=#U^-~3yp8vXTie2zA%Ral|D>YpC=p3~$8CR)J%7C_u@4R8) z=-FTQSzAI(iqas&MZ#EXIJY|(+kevxcdf1Kt*-p28(!xxn6O%$M< ziwti7SkZi^gi!naymgPDo0~pm3oVUiO-H~&$ba#g6dL3s~W?`eCwyVD6zk+?&aM?$k2;{{d_gp)%}>urp)OB29!a{dH-HLOSME;X7vf@7hf+%cLA;pgDmEG@ovYtnZEO(i5u==dm6)rW=5l9D5Qf)T0sx6bg^&D;&|%&2__ZhzBn!;YQ}) zAv^a^$u^wF4dQop;mtOZe6;p$rM8^9g%56{qFQ>3(_k34iB0nM$e!UN?>_eeZT(LR zIf@Lqy$lAe-#bO|Knz1DmJp$K^r!*=)tCHM+od2lmlHstED`~#gh%R1IKaCTgNzH~?Woa3BgM{>|Jckhs-ve$brw*GraHCB+7*G6j2x@Bzxq zT1SHR?542u?K;%W1Z4pgHx3V~_l~X!($IZ~#-4{DsT@6lm}8NL{Vg2jASmR!Qg0gU z;G8bt@1n(xpe1l0!*uTp^eJba z)dv@DJco9<|7Nbb8;~IAE5e2zD}WZ~^-~MR%jIOk;`|cD>=o z4tKOlEk~Sz3Ms8o!|Lc>eQlbhS+cWt^O2@&Kr(Ff_{~JzpgO9PA+4$jFRkh2~ZX76PZ0KC|BU0|nK;#fOt{7|_ z{7y};V`%o|M9B-P(i`}|DzfZz5_bRhI00-gof#GOe1A=NeA1qUU%lql9ChjBMi;)7 z>RXiq;FL!Ia(E!qdT-`%hp9*2Q}*yqL|XWpw_Ek~QP1v#Hc9HH*($_s^P~8J4d=Vp zx3Tx1P;aV=Z5l0L-;-AI$+zE!zw_+a4oJ*oMfv5p%em~3aM3uvizpE#3&~Vv^idcebEjPYKKvgRC8ElG4Ss z7|V92yhhp;ku>{fW~vB&2gHfQ&rYO0~CCKbAn8I|W0 z3&hVaHc3VP5ff*Bp+$2UsP(#DMq{4bm88yZn(Ig-afOCs){ho&RZ5x!f;_O_X zz{L}JGY5}>LtC%x#$|D8#5R&aW9iHqd4pM!<(}>>%CWJB=UZc)_=Xu>dfpqvnEaa} zYb{$8`5)uc_;tOIBa8P@^?OT`KIy&wwPXa?xD6M!j!i1>H-7JyW}WZbxRbc+ui}0^ zz&}+WR5VXjGskMZfBQT9 zQM1+Wb={oiw2w*?-tHSQh9*B?18=zAj+rV>=oYG0J+$DUO+_v{}(!ZrY^ zTwiVvPI_av8H146fsK8+rwuC(#va7FQ%Om>NmN}`IW@-K`+Uv43bOo;JO&PIbB=17 zf!c$1**>gQx@vFossrxLuRyehg6pQ(x6R%g*l^sQm1|Vf_wjy_B>Rsmf`xa}cs-_t zy*B{I#GQSlYDrd(}hwvI*){EW0r}!!k?RVU6S=WUrd<$M{(hx#G11jcV@N>%%N3dy%rI zHS=8YN)ZQ3))w!K>%EyxElF`UUfr16t&GtyY-@!)0lE#YLZj%1M5t$Ty* zWhE&Tm96Yd7FM?ROGX<67j@b_fKDeTQTN@7{5^i;AcGqq7u9|x2U=l%X#rPO7?yk( zagtI|kg~V%M5h-RwOqZE?-N>`VNl9JEHjjR0x{Ekm9FF!v@@Qi`DkAX|%TtXj=veCWNy zUwVCxAL1)cT$p&0-ND|J43aV1{smugq`sH=6145v*)Tqv;>A~mTq;$67@14?O ze!42#E9?hm;_CDEIZUMl*Mc6O>TdIkY5T7s1TMVQ?7S84g#Oeg`j${VYOSWyhfGjv zRTEYBhMc4jQuu*v$vlMgf!|Kme%wKi@HQ8!rhb^IC5ro(m>Fu#ulYf)kN`zBv>y7N z@!Ei-lZf2JD-o2fm7aKKaRj7Kvm+ox#S#w6*6?Uigx^?*DnTBy!t0=w^z{;a?ogTu zsW7s3-6YlZ+oGtRK+KqFa*7>Sbi1M3l<0^Q(&F7L)y(1keaFeO z(#r8eQE7?Aw(vwzq}4VC|D4}bQ(oDc%zM?e>1AL`72X3ua*y(N&f{5o3|hDuVe|L; zq7Z2j_N-FQW8fgOH~s=9%kB?RpX58cWJ%oa^*1|Xo8{L)p@F#YHTz4mp;3CPYRy)* za5?aSNbp%ym}5I`*VszBUSq>$d~&9$?=a<@MbGwFM^sW#N!qQ;03W zFY$ar>21w=z#?Pd2SIHHdm;5}jzQ&vzU@!=N@t1(5*^X(bthP0p+FWmbU3j;x~-AG z06(f|i9ynaNE_VzR}h17P4d7o1Htc^4QU6g5>h_!YSRNCr9el4LoI}_P)0KQ+TYMK zo!d^cKm@-aiU#EHRm#X>TjJ{_qlo=0LF|Jdwl2QjG8))o386KMy?7ZGY(;ztGxO9m z0;G&+!1j#w%%Q5zb=b0(86Iq5hc~;^5y93W33>GweL*vg0rHGtK)=J0-Q@T8gz?4Cg81rY+I*2RX1(4sbFu1V|MjH-s2PcX zeMh4E*~sbz&XfcU_jrJIM=s|zGZuu^qy`W(I@YWPcsZEa%J^by!33|TMrp~xsy0iI zu8|$oYVAY|+c23DtY2EJ8(YVhkWpjhtCFz^xN;Dy`SBhPg#oq>y`Hxqtk-A8SbNq% zzW$o8c)q7M*I$usGOwe{oCx*uX!DKUJILM z*{_#heX6ViFU%l=S9FmO7~1$+YfzF-|-a4C?tbl-%V zOe3aJ9;)`!y{@&B&V_h2O}zsJg>B4!?@*0K(Y3~&rk=)Mi?m@nxrMzj&04gm61Sw= zZ*db&wH)f&M0T!|{HBi*jmUUiqlpRXx$T^&YZ6^;h5Q%4c=c)6_?iJ@6Y=7#)ZaLW z{zYp-FOVlkYm>_)t?2UWED%Ur9RwRaGQfBh?!>NplA$SCC{~6>KmQ8)>c{6H`lH>` zI)>vC%InZ#3I?p?s7?ZfE=0ajO*n;v19&85M7JHY%Z+t%2*F|MVwoHeJktak?cqocILG#S+M&B7+qOc z`z|jdxA6>8`O-J@sO!QZ8>+#*Zpk{Kk6oZ4mV5j~GT3G97jiLDI~mU<&ChX<$-OCY zpi~yjsrcT{0}K9W=9UxdFG>vm|0JEquA@p2hMxr!Oq2kF1v_#E0R}|akVTY$_g@U0 zS)6-E8jX*kyZ-wA>gsO#=${c0A=}dVMJWPK#q60E-yy=a z^I;BuvS^*1S zrM1*MUiv<%$fQb%a4ez4aZ+k`JV&uDo;UGbFIhz{UJ~tfR!KK;@VS+`u(D%nf7`XQ zm5oo_Jk_;9-28QrbOBEc)##l<^vKEi-M*q^>LjPN4)dpwDRuY-X7cq`-eoWZQlal> z@Kv~n!Ebp8ym$gb+$((A_xktvE?#G8mZLaWv6l41VhXQb8NHSe7L4dqS{Hx8xW4!j zP@fg<&>aZ?I7kX#;lhs*R=N54QfSl`*c#{5>o}}avtMCVT8e(inq$9+&ub#;WU*xb z*`Hdk@VlY(eZhwBr;+8dD__J>ysC8!PKUu@6fDv(g?!H^UjX2iQg($)S`tR~DXR4e zv((NAOoCk8>Fq-Ry(GOe_t~B?Zz(pO9V*8!_4j?;mJh}8||g`G_8wr4BSU`~94toCBrSh@pOUY159C&Q!kHuCzYqj-xQ|8BH3>qX>}FZ%Om zgdp>}^Z+lEp*tw&yfzLPNx?mv0*4Wp9m&`#CRCWO7Z@B=G!KQRqGXMqop*K77HuJe z8>vdDbq6yVXInWVF_{%!ML48DteTl!6)pE-REA)WoI>#P(GP9M~Um+>P? z5EnOn8nAYzXT>IFSEESSsfNO8=5b^oW3yz&yl-=z?g;$XFt99rhps32?~n zhU66~T*ryN+TheZCkeo*r)PQf(F08pX}h&VA5#7AoCD3PZB^cSS&l2l$^@|^J08I@ zgZk0JlmGynOS9Tai~q_QM_Q0zst0E5BvxBA@gp zT|D(EsV_C(@wPezPncBU6H~_4Z;6t&(${^0J@ZiMGy={zy4@>shr1u2^1ihXZaaky^8k~E!bbAWIwuE$EyEFgv^=ct6tGn>f!BMY=*>(BGdVG!7Rb_4__?Fo;5iZg#@=H7d^cPFB=0TI}A%YK2vZdlAe|x z9h7RGlj@Je8I-wyT_}g&Tf+a=*`f8M6M5X1S_5b!k%g;H@VWC1pinsYnBI&umubx|<07+K&X;nMGr{G3}-i31Pt9IvFZc zvZ=04L4Z;mrx|GTvp%w0dH2%&EdtJ403p8Z9EOGEDlPOH>a&1Rm{8dQGase!;{^FO z>sdt1fIAVU2fqF)2OzpufhTetv?MHB9`Xxe!lY38yre?qjz)EnDknBTS=I7lQA;-H zsvw%7f+gd>n~v@1a>%?bB~_bO>);|VIcMH(hhQ`jE2_86pD$Qvj1ATaf{8>hY8q2z z$O%+_`QH&;(RnDE_CjEMY)w*Fa5C_#$tPu4>CZP7m)p3gn!#lA_m;2HP``}17=y%H zgx*N?!xxiXXGI)VvCy9jy+_Z>d87#PMovtszC2yIxg?ky64eGnivc_mK6DG}rqYE;+B?J8tSiAdz-PY;-#=HX_5lwWsM@U2HIsh<94I&EmnQ zVL&B9uQ^GLUds1GqFaDT5p;@Ja_qo)l5q>V-X{K<(kXD;!{;d?P0;l-9~%o)u8s(@042N5-xr1x|{-}!lIo7pS_2li~6{th)64==2c z+w2@i+Q=t*u_`M#`s*Ek-bS&{wNN>o(8kg2D%%_?6Bp_66qIj0c@cjLJ%r|MC+!sE zZuP-C=Py82>6B@s+om+RaQO2ZuO(e(@`B%LXw8VQ8+x#u3^sb7%EO%lQ-5y70_h>0 z^oD;wmF2BhKHghyJOj{qnhdKu(78=kV@7iZ=^U7^pJyc>Dz5&l34kTAF)6+|KPayY z&w*a1#$`qdlNay(N@&0KK{fLCA#j=g0c z8npOTm^?`mGLtKa_MI5s_tqkeY<@qzIX3MT3@;EAdWab0XJNRFxate=zz2rE@Mz^# zHKuuG`9wPBgs8&cCyz~KLtZl=kX;{582t3f8{d!YTfFd?3B^o*rWSMLp*7$#3CPS& z-$RGJm2>S4bDGzeuV!L}!a&G|bCaul9`>~`h6~=)zlMPz4kguaYg17vtrn6mpo|{? zQk~=2;re~$NRGc3@2ON`bU||Ag zFx_c~`&2sjwNrr%!Gv2bL;D)=WkO#wdKyWXu!908YhpP2c;zm?!N@Sf7h($t8)a*q zhIeXup`+UlX~HK=g8Yt8DB_fpWOTkh%L?pv(9h|ozbdTbqK_P#oP%H;T}vs*HY$y8 zxzGA6c1hBRKT%U}Pg`$g!6kv<$i%Z9CzeL>w_j?FMBkTA>mA_Yd>}A6og%f)tw{Ou zlOMei8OWZSBXxM9_BulB_$~<( zV$c9hFU8`_cL-Yjs~1-L`4&lx9mf%RAz7Et!GZ3lVB?P+_dg=?>Gcb)DFCy~>swiA zq~@lX3$XHy?Fa9UJyx(S|iQi4nh1jo;+^$MBi$H$hi z@oPROj)xt*DJAf$Uw<2IvtvO7r>k!}I-%x%T-cJx`bW*2+u zcG)bPuZ8^<(|f)6^IAMA#PXTEBj+ZN054ZN;dc$y!R2 zv|#nE{Q@B1r-M$B3*g7Mh!IsMoehWQymb!w$}N<5>o*P|DCk&N{4QePnsOd^hWFyN zGB?_ks=V!yoTOe^wYGM7|;5*_chSt&K8L2j_w9R2^X1YUo%w1Q?Eu6Qk!o% z+KV`he?|mPI1RyXfYV<{-lF|p*+-Y9$#unM1T^E%D$Psn^pCB2nsHkRa?Du+^LdTl z5omeN2*+TSmL@(wyNQCq4MpX#pW_#y{>l})xA#T+;5C!AF;^qw-Z+l((IT$l((J9V{53&;Tc5e=lkF`Q zLQV==f<@$uj7q!j>&!^xAEidamz!BwJ+PEwCKq$;QhN?~WOnkpyoaZL(KiQ*5=%Dy z_-Z-fFEX7FBd&Ng)9{3`>6}$f+eMn}1#49OSbF#S?^`~$y7e=ne)e#GFHlz(-^OlB z5Sgzn;fzJdAVxxMoRbTCu-~UWt1O2eA!>-wlxl>8qc8zeB$P4_U%0mK0GfOt5h8Y8 z{NdAHkTcl2Meq#R?C_nEe;26kOP1K{E?#_JX{-uxvN4v)t4~gy@XB`vgxa+%7Nmv* zs&l)%Y*4)KVES6OFO{Ff?`p433z9WGGeH%wKAd`DgxFP&6TnvX=b55n<1k`oMOg9??|)h4ooxGVr5XcVyo@L43ZBGpe-MLa}aqxjsZO zst!rn6Pg!qL+jVr6fq6I_uJm&dh2?wBZP1Lc~)s$eEt+YjyS%@jp0;6B>l1PY*0u>8wE!pB9$nrVW9c$l+FuO5e$avtZG{NmeQ zuDOrUvw$BwWmH{9fsoU7=c}ajk+N)^pP7aW2Z2=b zlKluOUFU$*TKKqTR#MIkyVBMPqo$gYo3&_FdfKl zMyo{rx^PvSG1Y5s6^Mf(BP+Un|897&nAgQw*#abJGqLx~pU_YJ1#l+^udbt0T(drG zqp5gj-u9y8Ssg1NR(uIxwM<6puikkibb-GX#XB`3UB8U?voYGZKRAa}l(kO*H|YNS zqZvJca-nz5p+R)Zl>w{Wc=XLjBWr<#-tGB;(x-N~sutH~BOHcjnkuT$=IK0l$A+|+SCR2Vu(=In0e zC|iww?&n_;=%}raJ9bpw0IHS%CJLIXpH(uNj&MSd@#0XMVehzSi`FkCB~HS7;%yx$ zbbS7OGCP!uhUkL&kHBw$C9Aj4yfqAE8uyZF#hcHPH1s;WhIxX@_8WgU!b+xnWNY%x zG0DRhRw4S-GJ?`X2Okj`ivd`EV*6!qs^e$X3rA&}sRsTLf#jliHeraGrtf*Mmt1TC z>2HZ;{Jc|t0>S3Lx0caBG31Ue7#c&VSB688dvnF!swn@{b#v} z>R$zBwM;;&dwKg+B1MZ`*x^qu=B=;XM1q=i320`VE33j?I;PaGSfW2G5tb+Lv~WaB z;)P$5)isSp^k0}4zghYTIAa!7>y2DB7}YkIlkLTwcA^K&M&k}wx3BC)H`1SMHX(Oj z_(1;c`*PczB-3#YK7ngTP?Xv^YvE=qsMV6bl=xtocgEowC&3bHcvWIr{GBxhx?KC# z#OU`q=VDl~5sh!kQ`4xoo9pEyKjO!KQ@Z<#9_i=Y__F4DtOVC_!gk&Mnlt^NE|Dz3 zm^#wm_ghcE1SLLOGn&R%An4goh+8X;g)>EU7RuXz1`%r=IooAo9X{tAAaR@>KuWNm z*Jc{-+F68*Em0zoD}2jX#F}6agZFGmU)tbugNd1a-})$T10IaOpTcdJZDjMcunArx z>ngw8%ME!h=(<9k2Gij`vf2K|n@%`2*mFvld*A?w4gKaVF3exB?DPrR!M8h1 z0H6Ro+*s)PW)h# zO*knLP#%kZ(H!C+IM+m=_zdVk@hN0oP>!9@-@Gtn7R(GMu?%65=a;~Wpm|nkaJ|?v zNk6iH&Er>T9IkFrVsIw7a*f2L zQm{TnbAW=;k+6Nqb$S>&43hcq1!MG6CY0u7i9Vk6`Zm#w^y0g2HCMVQhYul937v2S zreF1e8qnIYPeuf3{q>gTz(MXg6XQ|v&R)V5jfEUKcN0J>4j6^nT# zbTaAM`{)ZIVyL+SyB>d}G14*mG}Y`Q^=an|rGCv+XNgKOX~C(65M-s714l2Co}@OZ zW2-T)4cjWzCoP2vR)epg!mNjKmU%*;{QcpN4<4(=a-)0Qb`AR}Og~S*D*J=AR~Qto zrIMsb^OB3JB>JJjD-~RO{NoGl6(t*>4Hrhd_IG>o%q#0r{wwk@2Fn<|cZqu~m2gPQ zIdUEjem^@>MqCefs%Jmi$uJDRW2K*n9j9czuBwf`2=HWOE0YRc8!VSTg3KjXG_}Z* zKYF*5H9Q2dXdtcoN?v`E zU!NObSKI7<`rn$sXVb2CM{>@`W5=EBQ>qk|oIv1T1^cWtv2T_75TE#C;mvlOsS%NB zB+7RV-%{Xsic(2-M`dFcZEF5*w>-V_g=UWVYuV=8EQIJMsZRPT(Rwlu5rWu|SFBeC z%W70H*bYApiC@L+z3qDMy_77Dhn%=_ChOUJUpL>U`lKXzrtD{Z4&=At^(>?dmr*%# zAvtSU(1*c4W8}8fvEn{vh>XjxVWBx5OS`dsboW3h~JTkRn&A~#;CbfhMrZ{6HK>ipz$B5y`9BQeTW}0*)gy?v{ z1fGhL0u0e^1H_8z?m(+#Knz~}?OH;!;UAs<5c)+mucG!1Qo#*Y0VyU3%3tS@RhpeH57qh8Z!YPD2BE?f)o`n~{ANrtkYAR|^MD?kCD$qhi zi)VTfzH~<31XR^<4X?K3qCS52KJlG*hILiGOm$IUkwH2MT=VU$Y#Jp=k^q3(n5u|)4)K%E zvmnz?%v_CF88Ev1MoE%P_}DVEwX!G^K`p%|c4gDZ4heSUS*6K&{!MN-rV>ZWqa;Q_ zV#t3I)y0ewy9IASWd=E7uFdTRDP9+2 zItO>2W?H35kdH3sG6E0GU<%zni=y3DrKo;0@A2%|7pE7TS8V$&cI6Foneh&FE`E77 z>ZKE0G``;4ilS}VwzLEsHd=U0Z2u6)M znqhzOs~QKCdTXBdLZ?I1u$g(kIi5R;W_psq#(j{IIyI3V{f4HJ2EBw+CFrdXc`k=rRRz6T{2khM*%ZoL67? zBXYlYgrwi8j*0GIbk1#&p2~qLd{LK-js<&79yf`C1vWP|0o*CZZZs7wh98%(m{oSiOd^xR#Al}!5H3K8mScGuu-mlC@YV=@fjneT+*(X>vhL4gi zgShfijhR2VX}!$vlvPRTZrz}H-Y(~QxEVk=@&PKF^c|X91%R@)&4RW>^+Q{HFQ<%sY*HN z{j1EJYpVI_N?)(Hu6a{{jCXFGFZnlr>`z@^&LvBG)okgaoj-ACpF1T}vN9K&7XtNG zQ+@^d#dyp_oJ9rs>$@+L;N<$|N~osfJ~10OSIgh+<8)WW3Gfpv z@G&gy)0GbG@34l-Uy3W{OG2Y^_AS3}57ui-XgW&D$36zF^vf?t?fFhjR|<-Nw?=Ftwl~sp4ng1)T^3_v^Elx>R2g%2R;(XWMbUWmcBi`x^-^inVFlv59K(z zGGy!Y!Y+w=V=p}2)i3S1>38>%Dl%|rn1nqRDR@3At`uRASEVfEl#iy+OL9I8J{wO( zpyw~8?(C@GgoKC<*K&>#>iv9a{1nMPn-gTBM!ws)niwlRn)YkM{kQ7$XI{vxBy!-n zdWtxId9t>TOqzIG8CKn3(3xHzbC1{%eIg#k1;9)DIA2SIBDOBxJ$!&7kAGom*PsPAm;3L_*FB$p)6+GUCdBeli#}FS zg`5+s4ge^rU5-Z5%$z*y@5cHUHz0H49ozWND4ys6(pK^y8$7dg4)tMxyeNgGo>VAhKMu#fIAgqfJ`;+O2 zQ}FWF?ZF^|Z@(6(?v&E^c5^+(i$XQE{-Uu5)m301+_?AzRU3mH`CK(C zuKcv~Mkp;nDN(&@bMmor3H$hE!Jf zS|m!Xq80sJOv~9CN=D*^!LcvJHDFoKpqffq@a`}*=$ft45DI4{|Hv=R07*c$zh^F% zEavVvs;@g`D)p6ENqfd!pRc#xKFMPF13I4~_6TMhET{CWomoJNYS7ThTx`cZl`tKl zQ|!6Rh57v2Hr5RVz5?(?>Zg(br%KY9`Luj_lVK}q&iB_Xt;(jvTiM(qIu}|hbx6(6 z#LtDhlH8cws*gz;gqOVchX2p9eDwykStV}W61kXp%jqsaMzI-VKGGM8frCWK=EH?hRateL50Nh)& zg~yfFiCI?OTqcsLKU23QR!}*5;Gh!j7Wj4yovLVvD$Hvep%2F-A*acpfC;t&uV`)S-TeaQ$wnO40hTo)s~$@`F#94 z(~>Ti?qWz)9q_DV%KYjp3B$;h7MbD|gNqAj?2oRXxoFPSUX7n`gkyYj%lij+)O^83 z{LaQ1#+Z4~A7iyoJGv_uw>ow?)XG(HGD2_V$h*cXxUlw0)b2gajm39Aj-g$d;NrRL zaL0PIxl!Q_5o|2JmJs@z{kVn3SqbM-L@L73K zAHGm@S zO6{0hHy25LEo|0k%RYj5mo>UOlg5%PAJ#sM2Mx1Gq@1@#bvfxL0ZaFl)9k7x3?Df zPC>#C6MTACcHz7ZX94FCh33mUx33{bO}C=W&ZWJ_smWZncF&_Cf~V?gzLYt<-_LBy z{E~XJo4MUpQ1f}n=8z~NLi|>LlF!V^0Ob6}TY`tU%UTn;u+{Z`-0~6W)*`<(`z$KC z%J;o7-rlWpW(PIRp&!AO_4b?cjBNbU9mHO^O;6U~t<7#O^pn^4Pxr6WtHE zIqQ+tja-UbQYNoSEu|Tr#IA1&8(qX~&Pnw4%#6y8SUN#?*Ar0ux0 z`l{paDDyjme$(i^ZtOrzoZ73@@U}gXE1LH(v*w_T4*&Snddf=8hljRGlpP6fcl1NL za!HrTW^Lo7n5!Q~YD-)1f-2~z)ph4s4X+Zp- zSU?Cq`q2@Wr@vVtOhU1gP)oT3^AXFDMO zdD~URC)ffUZT##iPEaQ~#-4HeMWFUioXo`2I_xkg_7O&9Fe;K_)FECob4ikop*l%O zc2$GSQI91j+sJ&~ug`9OGuDZ&j)Z&@U7jUb>;p#ZA#~)b`~(LxxuNI%34ERA^eV^O z2Hub;23-^4SG>FpC2;%eQ=d|`;%?LQPiB`XtJ0ZBGqYfkQb^IVuhm17?j8CIJ^iCB z<;*vP;Hm@PTVif0#xHp8r+87Co`;X{U7LzxFUo|8%uF18iLcYhy}EMG^f%g|^vmzm z51ON$-IlQ=BMNz4pU>Au?Y*AA^Rp%}LqJ1|*OlpLkFe}|{JtKg8D=-~+KJeZvBQI4 z3PQc7H_K&5ol#4{o=mbf0;}-PHZ8a+h3KN0#low7lWoz-adT@!V zIvwhoI2pegmO-aE&(Mz69$bU*m7I2{5*2YVe47wY`G!@-9wJQLgh|$=jQQprL(fyu zTnJagL$c*k4&Vg#A&0+xi1SI1EM;)KwhQfAR`1(hhd*tp)hjl}E+-`egdNtcor$~bo>o-+?+_o}=O ze)PWBJz~NzDCyJMgKvA>Wd27Twf%K2=50+2^&2#Yw6TJ8vO0pPV42dU6!y2{?Gl$N zIgKXO30rDB8xAXpJK0KgfjUcgYEk+C&8V^9(RN zUsCv)lV`Pm9dp>Z(8_@~AyZKND-PgJf9NKJ8`D4$wUfWzfWg`(sZ*6+Z}z396BKxU#t(nwsVY zeK?0kv1$8q94^;I;qNaPX$9rQY!Lgy3g@`oo} z@1D|vc(GzrASz#sSxej2IJ=i4&q6E#ah6h4_Y!&W{q`6~qn$%qDg7s;&qkPFxsADH zkfnJ48`!spujPL|@2?w!kt@#Ck?>8B&rcyr@yNA*C$@)HN*;mv zrS*4_ynYr}GC8DfHTOARJb1P@iq8p16CudB1XSVf$^vh=$2d;$?lggF@h@8lt*>A%^0ZoxvsMU+ZvJxgp8T9Od3@ z$>a_rh;JlQbU69t0_B708`Q8*MK@x$&@e5C5y!s!tv(CYd0MO<;j=0qF>RrwK3rc= z4VOgFTJ^(gWQu0tHhk`dh28LDc3m2=epaU7Ua*KZc606oJYn`5=c9=U`~<|3Vg@AI zAzCFvDw34oWrLOb$`5DXZ7FHurE**=dae*E%Sfiou1ua7f%m>(a;{&dsjD}O=`&>n z&0qPt^oZZH0Pkq9SC^x1UE+`=OE#L~CcJJIp5g=FsB#ejzMXzM@K;bAoCw&w06@Cf0r2HU?{IucXnNB9^o^Z=H&>D>9EuJ^h|igs~yMF!BwN zh3zXRbLkDiTR@0QecISlhiqGGI zC|=-%Fqo@6jl{0fFAr;Bulea?^W7{r-bcd!LNP+S#n!$Tj)f>P@!b+fIkw+#7>8S4 zBKDhk)I!_4ubXnud3@E(E}eaN4mnAKCmT3o9Gn?T{v{#dGO_{{uTlPB3QWh}toZ>) zPMN|l|2lHimygN(v0WIw9w3r*0It)nl#N+k;#_1u+{;R3mTEpYv%z}Td|HDGc5;*w zT>A47=y3>pccY`WCz0^(gpbo5VsTY3d7*>Dvnr_*PaoAZjwD~z57Ftoi*;#eAfoY@ zrwNadC6H-z59GY&mP%D01Ez6Sm7geS!Z{HDX2pGnptkAX3iIw@O`?}2bmr&8dtG?i z-&Q#iAmw=TuN}2%_-9n@R&>qhYK2LMV2Kr1cH#ocE@d}tRUc=V`Zer@--8YO9;yMv=Vp50OUQ{8_%vM5(5X4os#|o@Jxe5dZaqgJOY?Jv&B@ zON|>JIUemQ3x;o~9llw~OTSqCi>S54v+|0lGZBKO7ArIWd3Sg>4}+&~ubaJOPT=UB zA=bwtr(AXZ{+#f>1gv0UIsoJ+Uw^|K#8&NfMmbuj`=gy!=MBEX!y;bAxw?VD z@8$#+2Y}yfI%E%rpUl;kVWnquxE(>(Q+PbwQxOjUsB8Y#Q)}MS1L&&}p;npC-Q(P4*#-s3PHi1p@r?5b?UK7(jY{#w4Wi6C-h=i};5f-b6*GmmY+ z-gIfaBB_oWtV0ow_;wA=?LcJs)(HNo4<6(SH`%(sm5D>a!Vc_{{QYe-#s)ssZ`+dq z4?VIEF(YhM>CGyK-u;xYu#O(_45}GRm;#7u79Q=4PJtc^S-6N(Pxe^hLH0qI~yTlZ(2u!EzoTRVA43dhKz<)B}h@ zsPn$rY(m`PM{Uayh67Q!4*Q$0(r|%gM4yfM_TEl6Zz+4_SB=eeHfs1OWqz%;)7?d4 z^u9LzeBWbFBYB7agb1{pCkf2G;>zIP(QQ3!4yGK%wGzC&&^1!3t$SAXy6CfpFUG;U zSy}{4@ZlD#Xb^3G1PJMk5CZFYDcxgrKdeMt5LVoHys+5#Wh1z(P&zPW;OT1L2?~z!A43?I+1H|aW@rP}_ zMA>%Eu2HKWo)xd>Td+7SYI!f4DlGRu4@qO~*X#0IR{YQJxkYE?n9K=Rml$-aOyTV;)CW_%;#-EI zcH$}*e3`)KpCm9qxx3(y8s}VXj>;wJgoz8EkITLn_p%k~@Y|M0?pMP!si=O%P?1tj z>Y6fPf!FKL-VtKsWWW~lWjfh}I2t?Ltpcflb<^bg2TlR32H{8=XH`(LAD}06ABYY6 zJ@35MJs*+&6qUI?*ci=a_>DlOj>zX!@&YJtP#DDCM6wH^UbG*Ew2COXx&-sS9T`?Y z#2rbG;f}b9Z|%fHWN!@p@>iqGHdQ?sPCTM1v`S7MoG zP`kdI@!KzKIU93pk0XGQp9CTUY6u`9@p0j-x)M^rOBVf<(-IoLcPnlL7-B7_#E*6| zX8gl~#@;o(V*p(vBKJjh8BJV!krVk(nq7Pf%+Ar+Yv>}KF%#01@;XdhjO_Zyo8>(` zO}dtxs+yqUOvpFOHm}&=h8bJ#_mB$2ZL9}dtTTAO^iNAID^|45dSV|7GM?s4y$)Z) zaW&teccv69%4+Or`G;?^8JVADIH$_xMTBZ%A3+BRtGzZBqm-ZlS$N0Z-?D;ZM6`uT z>)b&&9>OT>ZUizkJ*Z>&D0*O9z(OMR2b2`u%?U^+1Esv* z;_Cu_U1wm%Yi4p&U9L1Nq*#GeK`v0AsVE?7Cqk5o6d+*s5|$?kY@#3^^`xzV1{o)= zq03b4)Zks7jciHgQ@{s>7M)Z?#Bpzby3U=uPswQql$R^i1xuOF4s5pOn)XyS%n

A;BkU;a zP{BT6ItwRetPHG8a55XR)OHmHh&QGYsM#o8Tb9Q&FIpVZk`Os*Yhj#i&E8s=v!Q7C zKRvhs(dV(BT2{jM7Z%Mre^+M^quaES;=FL;^|z{9Kx820JK)|1NM+3XVJ+mahcB-h zF>vlAmj#q`QyVoy7Pz)WJ!O@_=xa*njpV%_GZ6%d<#G^XczymMJ1~`+x}-$=o#{;S zy84niB1bVesL)0Pe`_gn$aETp9(L>U%s$^jJ;p{D64K=+P7D9}7A-%2jn>@J2nUo11Mht$rPlODsqFP?`D!M@@dsP0yEUW-q zVM_uhe!q>*ubnSyQ5m;cb9EW~+%r+eP+)kH!A!F{DhcC)i&Y_w_1dQ~)!Qk|a1{Q^ zxad!+LI6cNPVG;F!5()daws2+_qg%XZiAJ6^edV635HfN0QXX2AT3kt4ow>G*A>rn9_PP zf(FclSf6Q$pJ1oTyufmvk}H2Rr)ZWx+F?LVpY{=@PsY6NHCGL~JbX)8d!sG>(ru<% z19gwNOYNT;AG$SLXIok$O5B4_)hl_eT&#=VrK$6^5Yhv}aN@CLhY%_@38FZvW>2p$h|`wUZu?Byoa3h7Qq3Zm6-%CE3d29gcLg`_4FdW6rJ%(~{+ zZ2yqi>F0+O0p?MJq}D?(Jc>iR-6x({j`K{zAmDYAq^B?bk}VRCWHNh#J^olxThC*GZd}dW1!p)7*8PC2$AI zxeK>M7c!4pO4D;YQ*~te?yWM2J8@1lIWn|dn&b_wj|bPN)p{d+j3nbg)8O7q`7or_ z5gSsQXgEKvyP|EKMO&fRN^M)0srX$Nh2{g5zgqS&nHr5og@`g=M%P_X3k0mZ?IYBL zago**X7@$L31{~1ZwMN?^8E%){D7p}%`IU8eICjwL;QA!D0HGGDSq2Ux0ORMw%ff< z7hZ>#VV70=8rM6=#AN85!j>4CT_63d=s#Y67KS;;NbK>Ye=|m;l^DMbjlB@3PpjTS zp^zaZjO0*gj@dt1Mf2vjz0oPk$bnK)SR4NCXAk)a)g?(Yf{}~{+Q_4za?X;#;BSJ4 z%$OB7u2YIdASH165$=d%+aaRPPuQX+z!|rdRZ8HSEF*nnGXHUR>4>vrg>ntJO2R3@ahb90! zZY^c^AszWUlx2T!I0nO7;X4^17uIiYV+A?R$tF<0GK)cecJil z90Y0bFJe{{SK(`sNIeTYA7RVY9_;jI1v;*EivdN+AD@Erb50DGfYhvDU)ioaskAWR zths5ynxZ8pqWW=Oz&%|cABG}4mUbHZ4uX0MzonwJ4xD$|C)nZhogA2%cC+&GiW5q% zer8S@*g0~8J=y<6&(yjDzkx#VYJ4Gqzt?G3LQ64FFb;$v+?ZiiptT%#T5u-ZM245i zH!^$aZ8??SvbY|-cu@+wuNjqJBA#o`0V~`4dTp@~WW5`uWb}@=G51*gwz_U^b7T`s zw3k%iJmB|NdP-w6qTrA-5zdOl#xOGY$3EFFfRaD~%-=4(B*D`NqtKFJ6;b`D=zIQf zF-3AJ08D>hmMKiwF0xR6Wo^Wce-1_ z8^uh6R-WPm`(m&>g?du^DANMU@>3mA)B&#DdP9jv2yn zgBy-@kMNa{VnmxW=suPsd^;QsRS;1Mz8M?<_&XQAjcFF*H=Q-L+^l{*&{<3QXZ9Bh)A;Cz$ybK3##=mx z&+GJUS-f$?HrKSqYJGvPO4ieH<@S6$6fE!PraN4EX8GK#sqq&Kfk z4`q!^y-`N)3QE*#+(j`wl>47i#_f|Uv%+n;73%dg(l4T}N7?U%FkZr|sX;@3Jw8=p z@f^278q++*1K9Q^v()EHZN9z0=M?xOKjvjB!(rIN77bpCfXF6Nj!dILw>5u)9b^z9 z{z8dffdF*0?@kYZ@x0)$)@KCERj8Mfk4doHPU)W)je@{l*KZ$_4WW(F-_y2WR08i{ z5HynFf|0e7s>yZRJRukOQ(PoCQ0rm){7wF&ldNEE{e{=>zIym8ptNY=gvX?{59PlqL!@%B$M}99jbI0S&<Pz;Y> zS`^^%0%!aB$c6^0Ma%#zX1zOjW2!nN0liid{Rao`_{FDd*agCEe6 z<)#!GpUfXSt{J4u_tvp+jMR^Ja9&;ccy_LXT}|EQEtuMa5E@YTT4WC;1c9YMc&&5{ zr?K6+ehq~SJXZER`$-HNX1VaRvp)S7eJ6GwH+5VhHqiF^Fue#PWRgC8_uu}=5f(T$V=j51N{!QK!er5wy*^18% zArkA1k}cil__*ij?!s(t!aaSzV@-19*V=#m>-feP`{w1y9M2%6;~Tm)y7N3>e?{MY zWysqxb-r_afqR&AydN|Ve3ss@4+On<){kn2cCq69f?=MhaN`S_4TMGmd)m^b* zRsiNmVE0@mqYF7er=N8*&~y#FeyQ7gvu`kxX@}!61T_%R97TUHEcN5r#0c3h^ngZ; zQ@%44EGeK}2bVG6(2n3@VknWRU5wq?)z=KaDD$GS`j{Ox%cz+s&3Zi zQGNS%*f~p2u~>Q*hMm%fIC5qboaEo#TCbFGM_2yVT& z4T?X7m}`viK83bwa(M980yWj?*=FSL=j6E+MICYofp7i7lV1V0Vx#}gTxrY_u)>{~ z>?fO%S*%MA=}L+a!q;FA0$ser2I&$+M=}#UKFBia&9{kVqTW6+m|AX7eSvNDzJ7l^ zR`=URta+o3Nw_gv-U!zlb!MzED2LVyYY(vtwuDAV1GV=UVNX(RM16Vr(VN%O{P%1Y zlU?O%HZ99Ph&b-FV~d#VeIm@csUtMF_RBj4gGkW9d4jTjN$Iul{NXgn0bARzd$G^?;elE|8Sl=LIu`#EzK!je zbzHYQ%I8V|$XK(#`Su%b)7AHZM_gmXLi$aemKCDbMPth8Nd1*Rk;;8PlU_Ga z%y8OZ>T+{_^p+=oTHM`c`1bQSyP_s#-otZ#)jpk2L0Z!_z5##%CzN?%px!61FGa_`GL>}b~?60Tw zJ!oUnAc?H$7J+a4?_lKYe2SpmfqAF9af_W0)cW1)S~`@G-tm(V*(;vmf~7u>M54?N z)qn8)Ph$*{S#F0B{sa24bT(UeIklRFz!*Hlr(a4}X6=2U^5C7Qis^ z1bIhTXon@|4NLommFc)?4FV;~IwcTN%uLH`iiEB?^|#@nq2TLuSSbeaX}g&VJe?0C z4~I!76Ekp@=qmg7G#xZKGTyelE(Z+_ktf3aWfFQm^gF&oeq)j5g+UivlF#{_?;E@V zu>QRd@2g^0|1NxWgNPzzcBp~R07<97KTu*hzw{HSs-7mdyRL{d1Q_-s^Z{>wVcPf! z)@1$4E;}yt{C%f)<`h+tAD_)2WL?@#&6Vz9di;n-Yhk2o9_F4sJOr2sd4YIE?1wnP z`6JsX<6F#+vxHDFnjYw^_gX5-r4K-r`keI?V#s1EJno14)N@M4TH#qIx20vLBMZ8_ zQs=Xp%$=>qXg7iomM2i$T9kXfGN$lY^TBv#H+`RmId-^*`*W;?6)OjJAcikhp&m6F z;D>GiykzI9V+SCye$+xaW%hMtaX$E4;f^jX4Rdv-Klt#XC4})_*>Jqfh^W`G(s&s* z@>3+GGR_lY-zL-MBjJ_jFEk+D%)^~h$=?Hcwm*`<0^%kaaQGY=Rc5~b4P0LBTrXtf zJ3J!RbA}gn-N;J41AIldrd`x$catOtGa19_K31ONyI z`?Xp19w$hKC`W6*!~!Dmr+%RTw;4uqN6oT+1t(4!*V?*GEli{{LH@28nm^{|b4{56 zkOVU$(}oENI4MtZ9r#zoMq)m!wJd~@qWH-@_9LNW4q}7tw!w;Xz+9Y@Vm`Y0D!^A<+HM&Ey0n;%~+UUuyw>TjR`og zu>C$E(}jt}1eU)`WssU)-sNb<-xf$eR!vJ^S`nR3DyJs(iw?_u2URdSI-R5|P7+35 zLpoHfU;lKs>#x^U3E^@i1iR-V=v9ocwrF0{O(8XPjKyuqcT)5`)BJaucQ{P(gNS;v zzVlW-e5Tra8r$<=tnQF5#s<%fNGJPnPUxZheOsn)+3-#O47Mkc$q~j@l>;WQ!;05w zkHc=y16og*K_qH>k>DZq#cKz`hv?Mzz*=Lojp}h9Br_6Q^=a6&^E%0v;T-QZVBsg> zmxa^+PO7<|4sh*#UHSu(Feux)Y>LGU?;_MGbuNlyKi@{`$Lj*C<-S{Z<_>~W5zWJl zEU#x?Z01dtMSsyRNO|Kx41R`Lx3J^~92E0<;p^#xucF8W?;F34r%(x;B^Ggr@Dk4I z?@GlDg9Mai{3)yeL0}oF!u)_*mu}3~@VC=9?I2}+P~$x~{`#(uvfx$$lHbWja0vV0 z8fL5JN0wo{j`Lt@P!4%luTF6Xq*&x=FYi3khxpa@+QbAx8qgrTQC|z%yD$-u^=TyG zRlVll@|iX7V_`hM8B9r#Kd}XaOc!L&87u5PYl63Fa1NTQE?VH$NeyO%Y|=nHi(Z#P z6G#zC+7uLrjZ}rDQh~eTo$PIf&3@_L6bosl(U0bdDAd0D;}-ba4d-FIp=*rO-wG}MeNlaFhN0xJr_bU7a}fj0Ns)m7Yh{3g-?s2-9i4Y9feDcN#C>Hn&fJw z2uu{MtT!8UTFPs9?L0_u@#K5SfpvL-qHd;;YxIfd`qc!HI+CGZ{7kWK>tmnsnWN=>6Zr|@NaXV~B3B&pX|%6CCzZN?ZM0~eq@&f6cJO7M1`geYuscOl?TEv~GyVjwzk-+(c26M0dz`McOS zn~5^SL-%pf1OF?qaTQ4HcgVC{aQ_xJK-LlBk5Ax`6@T`u$MNNz*_QQ5dt0`U)qlo@%^v$ZbWAfcy}8=7lJ(nzCU`21r>rXSUJ}V~tFeT`s`n~+Ud6o3)vI+8aRn=yFQO8_ z>Ma7;Cmgz?!}{0>y7KJLE7s!H(kGHUeXK z&|^gD2ZcS{SRnS2cCdKbB31O@S#=3#!{!?tclaOMWy`n+u(J0Yp zr8!H-9^Oe1k?8YP{?a3LR&jis$axI*UA$4 zrIvBviT+0BKK+er2}AVYcQW5<|&K z1?X=VUoYv&snv{(@KG1@a*_v1Z;1sRQ2#YN#_fOhM$F}#VpFuSx#jD!DgKgbQT;&@ ziOLD2|DCV3%B+smZ}kQ0;C9&WV)+<12*5vnVv+G;0CBgMl~lLZEXee|WbX~8eb~x> z+!(y1r-N>)X8g|H749h(3Rf{;G(~eWbFtZCc6=&w zqo2>zLO5eyQ*4O_qLPsVlZ)jE&oE;x?+wmXW|I+u>lgu=Vb{MatWHdSK`fVLB0BhM zJoBH+AjWaSNc|flt{mCC1OdrZ*ronf-%UHwH}{%JtS8)L&*APhLa`e-pvk@M7~`dCxEkBB_oZ&-@K5i*JdC` z)yH#0t8ZDSNQ_z`&lXQfH3s1%GBVBDh4rpJ<=c#uS@Mej@)V)vr97!<>zLhQE;p_F zfzK)~+mE`cDwnJW+P)Zxbc67E1(f*dv-b#GxE_CdPr~m% z>jPPSxr=6OA~`=~VwSNw0SNDiQoEL~DafMOvez4ELpkD~^0BQgUN_j?ymK-yGBI&u zerGK%YRj44tnIhwk3&8@VT z%%Iaq(AFy3gv1^IXU)s+Ts426{H6i67C+rV6XkIdTL`tx!!#>W5oF61;f=hlrlfKG ze&zwcdk$=IvgG+Y&U`8|bu?QsOqzr9F;-eTa0vS2zV9wP7SJi@K)@V6i}E|Q;xdpx zVrO=W^7OAvlYBmhNNeRG;$TFC2rf8TJAXgc3mAUuj}FBbYee zK5;P6g0L3i{2DskuaFY|flGxCV~C{WBKmN4a|*iqc*7#jfTTjUj)MR?H&| zUzvm$Q5BYS=NK-u!3BCJ0A2%!#EP-3D1u#K z>(V1gTsaH=Zh{O@LcgL-UA`h)E_$s(YUWWO_SWOx0 ziG7)p59PENidrSgxX%I9U%Kn!%*}7N^I=JBKt(lcd&c_F=DI0*jRqEH5trrwgI8^h zyo(RIqBMtveqb#bpA$S+*1z$^AcUvi$Wl;yBZnck$Tk_46jEM(@1mlRl#w^Z-V!A7 zQ_y$3ryhEenH!BruXap@xII-f-A6S|x5gqyUlN2K4$b6Tf;#nG~^K!zTIl1F$U>53Z zcgB)#(Z$ZY%u@Anr+ykS6V36xtfj!Ol+EI8^7DOy!%;44up`X=0Eh$DiAVU@y_v?A zuM%1@^Tx|^qBd$*Y&ApmrECdYM?#68u}{ILee>lNN9X5&OCs)row^6${sr zTsBzy#VY^4nD1f&c>Tt20?$6|&je@Z5Z?GN=IwdX zcna6<)D%&4lVdK9v}SG$qkF?w*AG<1R6Kcqq;-`a3^rge|Gu7nEinZd%9T1u<$$)S zWLHDK44o0LD4P39j02ui$2=~t+c>_fL#gO4GN>~ZXMJ1I?#b-GJM+vVS_d=9VCEGe zdU9KVj$wH|Jy+#s;kOns5+3p#F$4gVI*?tc2Ds7;eni95O&IZHxfk)8vhbW={(Inh z5CA*{*;R)!hYA=6l9Yr3qrEA5<^5+K!jhTWll<7FFh5lk94oOHqiiUSP4)+`&bOCf zQ1NaQq5K{e6ii5%7ZH3_65E0SXkO6!IV$G$bwV}OpVw(&@~3vlP4}&anAmAS?inFn z0)8mn3oW<)Ybh9i-BV*+(41?S^tMf~UfR%Ik z1GL(&tcE z5pF60>I=4F3Zswp=gu}-{F1cyC7Ce`<7m#HUu zD*hzWixsBmTM5N2+U=V)vaaI7gZZov#_P0-U-})qcW_J`O`#kk$-fwh?;o@j zVpm|=G?C9VCbB9xud$6X1zMBGaK8g@<~NQ{CETCd+fOkc^v?7uPG+0QmM;~aE6KuSwlW%;Pm_6;xsVtanw`8yVb@}y`Y)xlpIrwZV zM6cgYnZ(h&oU4Og+roCw)cVl6qtDr@Pw@b9QPaH54UBj*3Tin=W4d*-E_Ln04%|_G z<((1&DJPK1;8Jtg+s}rF4-STwYX-{+1RQam<#D`dl)mcuv$n}T6hCLP!8~eP6mFv3 zsY>L45^H8;8SEPUSwoZpEgKn-znU0>=@$7hbTImdDQ)HQqbfBzN@a>{IjR>b9`{d$ zM@jK}Stz>s&5{Ry3xF@Cq%EP-{NHpDp2qQWlj-S~d~R zD(E0(-gi%%(_q)JX9^4uvNpI;{m#VZ8?R&#YLU;5dU9ZJIp*X=hiSaIe*#Ka8we%C zGo~!={kO&S7Z$d#R>8CySWkgRH?G!euY}hv!A@QlP{B4FjoG3o`FRXSLE2Ty_Cq@H z7zgKh5H)#LsElR`KmIM{jVPD^MscVZt5ROZ!&?X45#a5DI?FVuO(y8%m;8MI@eEi~n2<|&-~dFx z*TB<;WHCMKeX={`U&Y81!^<`@1~N44MYzUX5=eT6W1bwdhkC{e8<=!V(O-AaFr^hE z8aMxbq#vElpTumApkhgpBi_6(T{3`=F_0!cAeiD>v-xVPXnb=Qby+aP|M3ORYJ|s~ zduQ^Ss8dYsgG+ydu;57T4O~h?`qzhL3cqo-{6`j(FQ>>BC4sPA-V-Cl%Vkfw2_2zz z&@g3IvPMjCC|>rnBLN_rY-zq#Zj~IBOgoZ$TRWrN>F^#Rzqs$Sp>o+68M*|iob&VG zU39}L=sh1pXfJ-kAFuC91%3PaQ76`y)?V zn-Wb8MNDye#;=ce)^iJ@Z|T=7fSJKI8l+k$m(6%cIhI%Q(-t|5xk#*rBq4>&U!7Ho z?U?p~Qh_)jN=a@70PuDB2-9z*HN(?$$&K7L3JGD+`2~;3j6h6~Kfd>6IMZ-^4*FdR z*qR+B@&p8JlJjGw1J5w=v*En%ie`(Z4N(0-YUSAsqi8CYcQNxaaO5Xpn6f*SmOT=S#S)VN_q|@C5=*#dn>_w*8)s zYaSF*AG!b#i;8 zxm;Ty{Mwr2!okOx@$);3oTaduxb=fxHfrfUVFoW32nTn<{l8gM;<{go$P9-q;P=KZ}P{0D$qqc0HugJhp~Yc0~(D4TElGKUzH ztDxj6Sxv8QpyKnWk-wG9(<+iHPKf|LK*GOj*_>>g_T%GS?&7>uI{yf{<6r)=mX;6p zFQ{C!9Xe2gOXKl5UrJ-xFiZUYCY87QF)g=j(Rsk+TqO|tmwB`WDY^%DI%)R#7-a`5WQ zEV$;@4#1|WZ2p;@))6S|mYs9%$gcbm)rs_4zL*u^c0JJeX^d4?Kj)E-7@T6ZPmIx? zN?dBQXQV*QQ!)+Sd;f_HqqPwo@2NFz3rqbDBFg4pXj}^R&Y-)6{Gy%eyYe@!Jl-ai zVz|Gft*rLxxRqcz0n`t#wp(Y`@4^K6k40UCtM;(EC28)z_dGDO57;JeK;!dN>Zp=T zt39BPMt!&wCR|+)Z#tnRTlj(0BguIR+MGc#sM*)L{rltWph z3V`ByokI^J#@x)}wFMjy+CS`YEh+MIs0 zbAC>lSiZ?Obx|wxNPBI|Wm%?YA9m&r)*CDp}ply^|)(na{1~by8Vj&4WjN&R`z=nubqF-cs<~~T0XmEn-}SE zOejBB+P0a;oQ6k%!3{lZkuYAVy)bt0d$qwpyXBpc2FVZN?Zx!sy7v+M?c6|I*vUfr z4xJRbdF!-pQY}1^WcoQe5{T9bTp4OE{C?7o=#eg5F^?m2+d%~z6~E7jtlYY&qG`Nc zuq#Tj8xFAe@x0e|Or?vPb8phr8kt#lw5 z{?z0=*4-~^z}`o4B`4fDbbq_BA@9YdnKWuX0huHwBj1eQV=|#zN`00nQ3{vubV?E* zL|e8f$9w~s=(NK(k5dTvvh(>%zCn+;@^cjgRjWV2v~PB2e;)Kp8$Q%( z{!>NvMrYJzM-o;li=P`ggO1fe^7pg?b6$Ol*eUl0FO3%kwCA%$r}I?;EJLr{BF zz*te|%{!cZGTQKWj;UY(yg+J?Yy9u(JmTj#PJ~Tl)^@GBzT0e}S;K)i+jx~w%_hfh zdvBk$lmTv2h3!DWm49EqKzhwn;XT3^xp}3k@@@M1kb|(7+zK*Jts!45vN#MPBN*Fw za-OB{T={xi4ZewJbu$kJ2$AjyT8TF#$d3b?*E( zU)FcJav;X?AfUIm3$iWs7|>`T};m=GA7N<=*LG|tD=DMbut z!!|?&w@E{&R4=cuKFh$SJq?LdguZh3$|EJ(2-Sp008uW3jsad;X)|$n&c`9y2e1nT z=$l!N^HaMd{vmWYKU?~##tUCSih!R%@D!>+kPZ@Y?GESJ!$oJ2`&)#9F9+k7?Y~5a zzetyJ3ecv66GiG+ivP~gk9a~}fGSF~Y5L)*ZnU_zc#xWfFQ2T@`vU%=M1h-r75{l`+{ntSCAKKN9J>u9l{JIyXOBPU&UWTPI zeEpTP7{EQ!GG|!@NR(;@`Ui@Ek)q-4%VNudZGuk`fHXDQ$vHKhh4Z%mxdH7 zkJd8r?80YQy;z?{vMXj&!AqRY>Q{-r%x#AGJ=H3#f8GApoblvcNKGpo;DI`9no#+l zrCIY6OtFMr90}9Ti1}wMb}5;D z?j%nl-?DEYb3J9D{w1Yqm6GJBV>JMOy|AWyht@yziyCs{x|C-lY889P`&cQBRLH{o^v9aTVGZEp5fpZJB!@Q1%mU-P^z zRc{0KI{ol)H(vUrh*>?bYJib`I@(gWfn>^*3TP>T=5V?|1{D8EF zB+`8K>+DmV5M;>Tv|G({oMWu(<7-dt&`WM*qs0e3ds_~HSkF#XiM`^(L6R7E%7cZp z>P`^w5q#B&@w)~cFnw>q0BPb``kawG{_>j-SO;ZTv^$%BRi>EzvJF-ZL5T}428grc zBX>o60w4)v$d^-shFb*jNSZ<&Kfshx{=0f3nW)Ts$vkYv^&IevZjI-SP?b@e!JqwD zMZ8#j=@)Zi@L&fMH1c2Su=F+POF2J&U^$(-j=5-J;wP(30jA~spTD+)`iQ~2mcB~ zsivb8TXUNhsyq^04L|&3zaCRZEXiw$i&35Pv1~^bNG2RG~k6@>V&bHDjHtfFH z*7$bs*3*Tx?d`uPg_Gn&ArV90`LZ47zrwR^4QKv>^;Ux;In!=6K9FYlTcFhqVTjLd zqJs_=uMJ}}GYaJjA00fP4?uW+`vdmWK#RAYLg=LHm92k89+v5et*Y27Rt2l`4cpfX zHj~?zcWog~NoXbE#Oj-vOK;zg<3E#H@+U|#Y?U|-3#KpEdkVLu3?0W_fgw2n~E!#3;3ToN+<&B}hqLUx!0$#;zMN(aV57_={0rDOj z;+Agg&(m^~btIHrSgE6j>H7>PGMZ&1;Z_rI;<0I6^sZYz{H!xQbu_D{nCNT3;~SYY z0+4A~B)zXt_{1s9`Y`5`XCJ9b+wBg*oH78fZiX}##cX)y%wo-Q&r2fc#{?>atgsye zWsJUZwR|69^^(MlE&nd9+adu@(3l$DnLTW>XA_>11@fDR$VMd2ubA$A>fV!-N?v=) zM8{Wp2s&~=04b6`;h_Dy#?@8YsaS8H5}O=Sv2!LgwBys7OH=ZGA1YyU>gGQ3iC`O* z!q|36W2Y4_hWzYQqv(!yCtklmP|csA_6#-EJ5_w;pbk69>*XvNc3w*gnbRDm@&?Cc z>=L4+CLcrPSz6a_>a-i2*XX! z0_x@Un9OlJ&smbP>omuU(u(p1JH2+4*|9@K=*HS%BEgvI)Nm$^WOIiT5GJtGAE;>@ z_*W4l97A?pbT+;R^~7EI{$A8lA+5;YN(CPjhk~|Z@D%=~XiJj#-J z?A`m_Dp|BQmu)i`V_N0Uo}vAufAcN4H*4!!(c#x>sw$qL=r%j_;@Hk^?Qr1D|Psls{vqhw!5Z=2a*#z3=W6IE&w3Auk3_(mwqs4z0tPvQcFHO&H6u{%@e^GSp%QCE_yp*rkiDhv zsYrTFyS9)xd+%APgznf&&|F9Qp`r-Chi+e8%ROtdo<$#tA~O=MKv>6ov-Gr z!E5Y;Ae4Nx{RdM}V}UV{@XqXRhU=BPDv&j;%HOiP{h-J+kwcsQ{$?MCs2PFqt7$*2 zG#c6jYF;o)a1~cMfVyZ&{Ct1wRdspi1%2QA{9?W`z}g9nA0bT$#3LGo?UQqezLjzD z^-5nRlW;UhxWa5;TJp`v-TWQbNNwg?+?~c z)rZU(L=9}m0ZN8reM7^DB7({3|>TsM;8IJx`uuxp4ZUEYLVkM0HAhrHD#H$;duj2M+IK0PS@lG-yy_De8 zvF@A0Wx#|G26%|YUh%-b&a5TS;Kw@hE@Eh4=8s%Mgf=+ir%CN6-DZZa=Y%QNIGXzv z;$A9o&8QvCk)!LzK6t@N(?dE8Af1e+*}1aym#S}?mlV91w#tcBXR7Je*wQ6BRHEsA zM+lP1^jc|xY9zi9mi+rKi1Dy}D;(Jz&D;S&@iYee0G zM$=lzSKof2_rtL#9v{n$Ai)eFC9Cj+Kr$Ch1Tbipso{0H%U%n?WE5EcEDPW&u*u?s zj>EqCuA*!b0T22~z9Li^zpU>B%g-Khx)mduhGb^4!{Y5$nV%S{*_-YZ{mcG1H}1iA zEI9edy-FxvTJf_2m>DrvFZ-GK2x!_(Vwrv$?H0?Uec|{BTpWI0IjZW4eO`4|EhPKW z5XE@Edh9*9^Z;a^?LrEK@q$O?Xyp$J-bel!@N8Q3PXw^YJOA7w$x)yWk#YOH5T?`_ z`^5ide*2zRf&ISY>oywXI6MboUdq?9=$|L128fjJVR&KWx5IoSbf-{jQ9u2;Q{r$Z zs};fek#cSRX;*Q@q=7J-^mjF{dXG&`gSpz+G~2uf$VasKbH!__<_&MM9KZ4SGNYV#l+A$y zmc~;+1G@!un(z$g#-yFIeoup5_92Y;z(E|sC2!c-&(~&MBR1@8A2GMEch=tpLEXkU?gBP=B1RmY>4jO7+h^w2yy~|lNRE_$KR5ETZD^VRlF!#)ShE9dvzepj} zDjkc3#){_=m>0bTjK!j#{lQ;dl6>p%!_wbu`MAfTD{-Nr5sUoFj~^b`6x;r=c5i1U z)h*xIhtX_2D_=`~`sfS3rXFr(1Ns|{Naa_}A>+lK8nL8kSLQA+9<;IT+8TuI6;s4|!|+&%2b=yp$XjiDYTdaZf> z_$Q)No?!-MAP6Kit2tZg#A|fB-+aSyO0h5weh^*fYtri%dw(moG@ikk2EpM8NI{=dN#W{`tNu~ zWCdbWNlFM7z$zo_8)O+!A-xeWd?N;?^!hLY(je937xHyrvdxTpyAbf##5rzc?LZoQ z;7s<*vhG~DkY}Q$obV+ok%yDF3g6a@vqcz1b4R>QtK)#%Pk1e4^o&I$oWxLeHVXjr z%V8z%cj)Jrtx%`&6qmiGC3D^gHhDUYwhG5JE|@kSdLnU~d%@B}%i$c-W;5POu5kSl zd_%>TF$GSAi~ZG!QXIf)S;6=x6@bXxhub!oMCLBuYs={a2cNOX-}P*Y#STffB< zC&&s;{u`}EZ&3Rrqj3Zjc1+jqpyty%IR5Jegk4<{oy{WG{HL=s~;r5 zgSX0Q@k+NVft&gO#a9cl!)Z5U?Zy~AH~Yu_1@+>>PwV+o0J!b=l{AlpJf4U9)qb#i zY}S{PC3G|*DGmS;he$l`o}4*fyP*yVI!pE1dYkxgszl)m65}|HcD{rJlGXh9GopZ9 z-{Jh*e|ZTZtrU^us=Y|W8d^MDMTVPOr@MI! z=Hme}P`_U$c)5fKiO*&avV=J+5Oxv%RwC*m5eI-XMA$42B57<8Nlb7NJ3>HOzHI;Ch8t0jWNz z_~b*rIRp{*C_XqXU5JE3JX^j=Ejom`+R9dQRaC8dYck#~4^f*|sP1ju;wKlTP$9x0 z=y!aRTj!x=DAij{lGVi6M@T*f?jvg|%eOY5)x)R%xn3Sf2BOl(*5#o{xFxLoD48N z|JH>s@T89SwL@uCoZc!sM8XvF zJUL;_d&54nHGLb$x&`}^eO|xpRxvW*=H!Y*t207<{;B5gNWZc@>SJ8VZu744kEQu# z-bh2#_WHncmqam8*HzR-M!Q&nnHDVbmW|(Btiw+{!VjDT3z7vg2oX`cq2J^=(PM8M zK*}z*AU@w}v=Fu#3QQ^I)qH6w8#jH!vw2@m;r2!Z#z%vG4^M7cDy-NL`90M^9>Bvg zm#asfIQWK@F_WS7LVTPOr-9q+xwKc4CJ90pR^`+*3ckFaz~;TH%My#=vHc60^f&{U z1#7j@6*2aqbo?S2#JkQ^mM}L93WKAni=oW?(e#escX}iWeVEK-@`nDK5wev(J!^B7 zwbhH9RM_dkG1<^0ZbA7#_V5o$_3KJoyFT1QJj2@nUx6;a0;K5U8A7U$66O;VX0PV#5ORr=S;W^@00ge~-oBG6ZUI6V%oAgqvEz(}M z;$c?%i)0*X@%MeAXq(ty06qXQ63EWeH_cp8iKEPLL35s%nRkf*TQDCaX zr7W}6!JPNw<`Qfyuo`^uZNA?`J!F*JskCWN=+6XvNAMnIkL4!c*W50CvtfO$2urZZ zoJI-){og3Tp>Tbsh`oxpC#2b`s73@8t%7pwWQn(ze1`KEq50zUAl9=na)Z~e7~W+i zHIw+t;p>(_d)qmNr%Iw8XIp3e@|*YZa8GKqgNDEM0PPjY1@_iH8lwjBYh(dJZGfp> zN{X(&=-Qmp>>(0p60EOOAV$#cWx5Rm<;u_KJp+AGW+9$9yYmRhg9a-5&B>qA%3Ik2;%Xqq3b)+=g+ z5v@dLK;H*Bpv>nNrBNSIQ%v71wLXVGAf2lltH5^v?sM^Lr?^jQ;CZxrvLuY1AB|Yq zzbVS&V>aJwLwji7=cjSZpSt)753|$D_6=Yl0JBuDi}x9!ABQLni>!>7rY#1~>5@Rf zukJuV%YIYC_ppxm^O5)Kb28n-BW+=AIA)c@V9M=Fx0Ydx(fI{b&~WjIjf^h>5|Fa( zb;aFwcJom4DHpxfGAw4`{D^~-woatQqAjQdihr*I8vJgW9bR1~|DazHxntuTj4v7K zF^OW=fKZiCf{Ts87Z|?JHnUhsv^Q^VtNCm$wFpolD5XG2uD2U%wOFHz+x=FPRNMMF zpWaAk66wDypsbof)aNbAv1s!s40{a0GvYJL&Fl9$JerfnX<@KUrHK|l$qsXD%!Chd z|Cu|5=E?qa%3^+xLlpVN|Gu%;lw5EK^86}{Ux+LL;fZ9^F^o5KJ!}aN%o%#zURhGA z&#J=Jwjtbe(by9?2;xr?TVu{s6ScnNcQjw8>RCP|)BEp4Od~+lTW~tB7QUEq#fs>H z1FrFdW0Uf~>s%z2E<6cS>K_1YG`PIOPf@P3y1&JbhR(32#DfJwakGFpo|J(@OlU(@ zKfG<1(6t_KHooxz^!2n^ClX%6u~%;=u$cH(9ZNn6Of~NW2fOZ99+1-jo*1X(Oy>7vNXNn^(y~FH)v58K zJ%taCSp0xY25!ldfx6t8pEsjiL)Y7$D`EICjq!PmgUfDcVfVcq@N^K@b$$DcAU)^p z$#7>hcYFC-TiNaHB>fnml$z0ei|%1T>iT5EV-%fd;Lq&z#$~ERD;6Fa!f*gXJ%)#h zX!_M!ue>gRt(43+I9TDLxa5(~?l<2No_@ux9g4z>0@&|OvgrOW_^)1U(uZdO@Gr)fUDNov z#$Z>peq?J?7P2Ey*TXi|>(ET}GJA=-N|FKiW~e5_dsWlW8n&XI_uhI45nBWKI85?V z#zTtiwD3k_uM9iCyf@OvykS~GfiBl9PuJmm&g6!-<6T)wb^VkA9HKxTDZnBN#0nKby4oS1(-^bPAw=E&$a_KnCW ztth#++*raTW*5@#JWXWr?P9Pqh<#sFWO60xmcWR8*+ubliYK=WO&C168M@4B58mwc z`s}~f4!cPel7u=*O1+Xo-H?qXy`{@G;TyJOeFRgc5*Gaz0(n)5Vu=IbZ}_IZg34Nh zaNEGoHMuVxpRkV#(vao9OTdmaiX#@TefMl%`qkEt_|@fVtfFTc)iWE&QU3QaeQKkMN55gZbK+m>OBn zOVj!4l$L}pg83%Yf-EHhHdM=Kk1s6)Yo7fm2NS+JSy?MrR%Vg*hQ{b!^c_<_LJ4OsV3Y0)@UzJ zoN5cb3SH`ZH+(|r-wk4^SD_==+A@hkSsM9GzWv6mVDB{=Pky!l2EkNstPl=I5%EJL zK62kZn*zb|zlKmHD8s^`60#ZA=204j#N)cv8<v%39AJ8hvr)$eH#! zrcLqm??Z^bZJ7F{t;ZxUc93GS4;%Z@$D+oa@8CNqeecno1^i5JLB2eaWMT70$Nt(% zAtqmsXdG8A)d2glO3;XQ?kAMvEj{YrlttatTA%p+3#{y?MuL46#KJ}dGntOzq<&&8 z>0ecPhH{6MCeGD<<^~HJ-XaP+=Od%dIi$hPlmSYkE#dYt|RyTv0tPsb{BaI z;lVz*_pq}gC%&$!=I$}v-C?Ig8!_pEx5%t??Rxkl(o?9vFI{~R2WqRU##3#Swe zUC~Jwv(cVXLAgMRV#dv5%BrUe8O;OWoWc6t9Zxl(A5`L}IDih;}(_FiQ-?{T)E}aqPQNNymf|Y)*yak?p^$i?Ie%A?EE+tDq z23+rQd6uzPBf&3GAZAipAIDJLCb#K4HsG-|+6Z%aHiu0|s>Ju?S3fPepYhdO$t^$* zF(YyB@|v8mwb3vx|GeK>b+AaZ``_8DAA84iZ8Ub?(}PB0&wX7-6nYKdsNCXb8+b>z zCH@@kh{RQaSo?lPIfwN1FO@C{JAx0VO5jlIwtHL}CYk!2Rw65COo}d?{lV&la7}=F zzhXcODIYv4J@ZV1?C?O6M1gbTN5)%nKCERdu<2`{v{zz3hwn+UujFt*KDA%cKtdnJ ziNAhaSi{zbiemlyW->Ol(Bbd2f@*f0#dqA$%L6T2cv9@RZS}nN+QJ{VR++4@^3g|iCr%j~5g$JZa@~jlw z9u|d*^I;{=OMgYKe4ouuofk|-w^@Q18`HiWr)M^8E^xek5Bc2X9A_Z&(nRmm(c5d` zjTr5%09G|xYC%aoMGZU#MWJoa z2&VrBBn|+oZRuUz~k!NzX&Smr}nO8j1a! zkqtL9LiSmm#b+Uw`jpwH<+#}e-($UL03BKw8mIfa!%QjDjvX&W_qHSk^(MDG4rqc@ zo?a5=5eJ5R#@C{$=`yK(-Wvq@GW8C6FRHhcK-AzfHqZW-ewzdRQOQv){qPFYGQe#4 z6zRVkVMaBtdfb~NZW#NyByZmuOPYJSNs0c%FdkT}V~`6{vqWSa6BO*OxSy;ga9H!; zgIeWR6fR|UI*u0UWe?s&D2|Ku8Tj{ERcCcLlX)CRs@-C9A`vH@F!bck(>t$=M~&x1 zPr^iT4@ncjSP3qXUb9t4;QO@&mMUQSt*$D=3y~SLjQno1aV)Y&j|ZFuJ;s@vVmV|??gc*Vo#VKz4e2(csYDZlK5FqnNwIM z*7fZ(77W_qmk8S!-Mf53z@Ua{XazW;P3mg%AhoVwCc~{-#b844biOf^mU@^yv!yKl z{2(7RF8zQ*H<+kQpKxQ;JXitgy~jWI#p6%JYZEpb%^EkRG9+ovHfyA za7?Fkjb6_*xJD4q9q_47mS`$0G=wgs`?c81d8wj!#tCCMf}n{5+!Ns+f;&&1M(Dd_uqOL-=r-(gQbj5D8 za%vyW3R!@HIM9yESE{7m!1r0=P+X;kQn-$c=|wa$OmmP*=kf@p(JH<(ykljS#>qYv z$LE_fFc=TNDd&`iIaFc(B-X8Kl&f8&ycr@NIU6P8&7?_<$KCPS6)wf3fkzMkspi302f+2ww#+2po8xak( zTa!IIfR>`&m&&aXE1CvAV8a$$6shG5kLh$gojb>q`m?mQCG;GERO2$z)h<)+y|ldj zmmqOGTxQwJeDyY05uQWKC$`r=vrOhuKQ8o(&4va&BoH(~sBDT`z7fv;QZl+Upw-D8 z;fgaor5pP>QNzq(39(}`B3cZyv5AzSPaZn*Iy~!Q^4H9{0*N?Q!Oenou70g$Nn%HX zzj0o)beo-VDvY`bY~KHDcu{O8*nWprOq=iDRalmdyv9D{j6V9tSg}Pb@H=SR-9+1V zKFzu|FZkeu{&R2UAtrbq(J&SptM$X~9z{Lyo4p&r;;h|nY%NLD$}y$iHV^qt2A%m` zIYF6U%MiD;Xe~a4g$!WHH*`*8B7%bM< z;yw4Rdr5i?i)c*~<&0^FHCO*7$!XEzj6@Oq*1CKJN43-uVJoZx5beJM_*$S>>`0}n z;F%Ta9QAm!=zxe|DLzd+k|H_Ju9P4p+nAFQi0YfsmPQsNkd4kEIqtU18G`RtPs3b z#YacASD)V?d!og&&8(LxfoE4qlt_bxoxWX-3Osg#e#+K02O!r$l(i-}~7&5&4e zkNlz1+AY&@{=shsbKmCRZ)btL#}EAuF5u@p2*l zizWr~@QA(cuXi8-(hc~dkne>GI|filA9?s%@(#@6H&SRC$d3~Igo5cO2e$AsH7d9Wg>GBc@k6Q)N}FrsRLxfEbJTB$n(5%golmx zNl!Oh19Qj^ZN66vy|I`HohSXaA|^9YXk`hGOA}PN2uAlRjh>+(_ zLhK2Rx}o^41E>{|iB2pjIXA4nl0j08RyD)!r#0Tz|AJ1pea&55isZuSSr@EbP$TuN|pWPwFj&gRObr65}@W z)Pg3)PfcHwsgZ~j5a_Fr-fK0ztsCrakuO4%8BH2wN#5@$E$wI?C$Iz^lmu3dEs!^q zoTj8j4Yp}qmIKgeXfKHnq#1D{Md7Sb^#&qzzSz=Db_+JU)^l?y1XG{WYLwlCKa!r! z%6>#B!jT4($z1MQj?BQtF;C+!{ms4_h=bmIf5s*b2J;HbCns>zcGC15+ozodiGV}x z>V%ONxEo`@rSD|d(y{`TQ-Y79{stdG=1`^m86J+Qv_L%w?o%P@?GO(LHE>#h1uzAh z9V6V9Vo4eZ5JTSu6VvZei>T>?c~f@=WYu~vqBxT~&k@(p;L^F|$IA24H+JQ(AdC)d4-$`k zb!5r{AA{#!w2!eyr+KnF7U#&ISv?2|CRQ-@EuXj8EX_NKe$X@5lR~P^!tnemsge)0 z2v>R;@2eS@x_X1nP46LdL)yzR#@q|%b9qTm1X^dIO`Le^(?-t$EsQeZlIp0TOGx9L ze@uMmcKml?W_WK8BlmJc^?h0dx_5amWA)(?i{R8r2|_~JpzoQ;Zf7tJ5l*LTGQc#l zg;6aC0WfvM!}1$`Dld`kvWL0R2gm3Y6Q*<~UzyYsHfYID#douLp^@rKDI>BEl5-YJ-0ZrJ&_Ybm5Rp-y?KY^y93>Q!D z(@^5gi6H#+qC^MBD~VymkJ5&1< z$i2z=Pr?XI)`mzD}#Wnr=^7Je^E<|m&5&fVAwW@&? z2oStSJ_ZlO2>dd}0dx22V=&-cm@$y}XN*+3Pjjia+-6wr8kiZP2O@td zv7qr;{2Jvp+fd2auj~oLgd@h2Z1x1#4xPpKVVLonk;d&BCTq))mUCG&1HR~2U1x`2 zZ<#%Id-0Q0wM8}WNwF}t)-OpZRL&wv!&tPEM|@o0p%8(?4pMg4_x{y>gNdqoeL0=c zLoM6mef#zBLY7tiAMzjy)%jxPDw$)+5*7 zcLQ#_)tapL*Jeg}RbME+q~bV%w&9o*-xrR^Cru)VQ>ppQV$&ud&EnQJIkDO^IDmPf zqddv2N4`E4bfuy{?NkHO{b`@tswbXyi!|xr!%sWr#FsgQxB2tR z06CL~Q`0mEhu%IGW}Z_z=HZoz3_2XXYmj&-CE!9Uh|p~h=Oj8p$vz)G1?Ka?MHGmt^NHy`4L67 z>XsfkgT=Q?O+;Jt+z`Eeo1TSEhewH`!I9NQ4oZD3f%-0%zVv7sotB@*{`y2wLaQ~( z*|!~)X^^hyf-dBQ&ycwop-KcGEkv)$``5<{9^I>QIF(n@N7Rgcz@eGMr$gc#7xT5Z zc5Jo5&(#;-M(uaSFc2k=+j3kZpk>L8ecj$_n`h8r_R@NZ-)FFTyD0v5V)$(Rd;e6k zUZX>e6n$kzni|e5*H75*>a6PhjVNj~k(v=O0dG?Eya`p;p<6M3#z*CNYaV@1MxbR{ zp-%gECdAkf1VNEsH&zG6(%%d2L&%rNdG-6%!#dQ{ttnV1rasR0*t-tf<=Y0%3GLam z!6LGS#X`h|e6yQdFI7hwsopmgib(#7!|o-g!!UNg^d) zs6kLxal4Dg9f>K+sF30kD;XUCT;FLGV6dsURQNS+hjVcFU!>8Rf8sO#;>p-g*N`rsYwM@Y?qix>bLyxxx{7w zz}yL#%;1I=9^suh0`M3A=EO`@p8g)283S1x@xzmz9&gfBibV=Yj~1y#X93XqnfIE` zag`WYJqRGl`$#WNg8b427SD@6AH0-ed5r?3nxqN44;~YlJlFMkGJLR%EhIeYf4rAlJr?Oz<3I2lUteFfz{bJl8EkAlz-v-<0D_sV#7%W~jesM& zWvd4YA0JE3JbfCKsj}Zm-KHPUSO~(DD+P_9>UVagduCwdCtI?lS&-)Gp#x*l(5O`F znnJaoC3Y;g>41w+4_hjQ>4%Dj6q+0BNvVuMaV~ z<7_&OYaB0RDYsgA!h~x<(wy_8-FrLbQX%z!E^_5mVRQFWSezpfNXP@yD$ zMe4)Io`{mzJRP^=G?0&`Kb;Kdy5b0!wy#%vrzz4sF3EDsU8R2 zsHzW-yZ{V(zk}o8Df2bHXsw&0TKaTu{K*m!*ogN=hPaNWGy1ZE$VFC}GzZjGgtx7C z+C$4sOvS9m4teB?!R;KIy)}Q)u#SPxLyHIo%*h!3=YVs*IMc5z#!--uLb5M?fm+Dr0X$uRt6GF^HG zKBcN=>kqetI@ts_6wfo&S>1Q6K^55gnstS!o6(AK?B=C`w#6b?GB=jt^_kSHCD^N4 zp=Myao#fpJF>DZOF<44XzX``SH<(k{OCpnB8fi}ARr1&I^h-&?#wEE@q~3F7do zS5;+rto_7m%xohcO7ej&zcth+P-SXJDd3|Yt1-b?2flE?!CZ zcr#R-_=D2LuU?YQNM;DU-0;5ZkjnoyhOC(?JS=J#i7IFP-FBf_CU6o;y3=$@U7dk< z*!V+VgZ18UV$*SfqdfK3w6J&M3%Usn^~%Ua%(Jo>g6{K-1xlQKFo*TrNJTSjZXmr$ z-&ubA)dilw&-dPeWgc|~$Q8K}_bWm#?{$I%rp~V-MLUO@{ZnFG`31WT%V$nNH zyf6;Hba91G+SHL2dhIm20pa17#Biw<;7_+yAGGlCBjNUw%+OeX7b!Rs>D6*}G(X94 zi9%9E7F_ekbA-_iJr8A)|OiPiG26g@P-xwAAXtNOI~WS zs5c;*Ak!P@Y4MZSyb)rn=q{!U$bl58WFSwrsF^Dhs zgOYE*54>tgP!?>4wDQa>Fy$i3Z!>e7@bUHJmcOi##5hwhaB!gR+u|-*AKfbRXKdZS zp^333c~6gx(^|8w`~4YK+r5*`THe3bi2j-&;SEYQB3PEFm4c0d`%GKk6aDVK_Ss1` z5w312pWz8QX%93l+87E?BnKnv9<{j-Ubwdbw0u}$CymdoC+b>QAH)90FFyM8(yOQVdl*^-`@ZJIj4^RRxo{k&z5y{x z*$g4O#le?vj8rRgUW9@M7-=x3HXNaeBZ2N7|;` zq|XHYf^nkky(Jr*AC==9iCs%P?YSfCiIx8TcIw=Fh&f_*I|>OVz;56X8!UmTbgRZ3 zI{HwDm2Vi6Nay}lO6hU44QY03z(VhC0VJ5z{U>?{WN++iC3Do|hAFeIVv;R%Z@A}& z%nz7J@DZQ$r!FVO^8D&fDVg>o2rd88`9)bR0G$tDu_lYw8Q2DG1whNNu8%>$$7o9R zOMfFB{XU-}JUY#|208=jb9#EObunC(Q}QF787aOkUVPWW0N*}oN6t z9y6bhswZRR9py~dl~ow^4vk@O5~eO>cn{JT#V04FMH2t*-qJ@^T6`LoAPKLlxb(o* z;inhcBcSCs@)jqj@7@`3QUewUmZ90dXmUt4_f4dzORrNuE$`VZB=gQNQo4=PuV?s1_+= z`cLt>c;BZKRP=by%;Od-f*9%vS*DY}DhY`D$E}4?WOYzHfkNF(sH3Ck4CLH#RW^wBKe9_!zaW5Q`Vgy?sH?LEras&T5i&xc&Rqcw=8raGx*~^Tc*zb26 z*fIjB8sN>>F(L6rRTRGGqpTu3_Z-b;VF}nmvN?9mtBdm$uWzlf%n zb&ji4cR~ZVA$@KpY0W(Y9tACcMy_?725&E+(x&9A+5OILscbNR{V#N`Ad3Y6N^A#y z--ZM`Y_%czdNIAI&E+?&kaO6C3eF281fbd7UvJ==I=L@imH5QLr}|(O+;%}R5rqcr z;l+~ZGJseB3e<6kPthm$*YxA0dI~6UquaxaCp72pmDx1lgIW%`P0QdW)lx2OL@7NU zE~#BH$Hyk@J`bMOsZCLMuLMjiE995e?xM~B)z8@Mc=^X8?Kc8#8g{2|k(2L$g?J;E zAgSekNIil&Xi9O@TepiQOqT@@@-afT1DuIqO6|*JzS;DuaY#>(fAA?%^B`1#nyKM zywfFtDaLmXJT#!mR>~mLB5>Z>0m2RDh#zqf84N{wU8_$_G@iPSiDmtf#a2A7qG&Bo z!-kR~Xg@K<*Sg_4`8&tk*Z7|!oL4Hwq!s2tqZt_)L?=OTF~p1?Xo{Xy7g)N zIWTr>0Mo)F`(QN;Z?J$2Zj;e}?e&?|>o;__7)Qt z3%<5D)}+pI<%_$A$lxC5BN~;GRWVgK2JLrJZD^q#xv^#q9d`2lPAhN&n2jC=TJq30 zt8`jFzR`&BbH0f5M}9xzV2Ss)ncV-0$nQ6?1uJ&(HL36yPFlZ8vozBUF;aMUrJWN! z84Blq+aom$bJdMw`dQ%i4MeHgh1cy!WH#N>=q=AR;<;)m$Qhf>#r5TVhE#{VD-UV( zRdmb+eYCOe9aVMt$LwK12nu7+Fr%d$u}SL$FCS*T3WP1uZMWiiVioYki%K7{@#=P- zhs40~MWucT(GP>(X=ykzb!5 z>%V>g7#x4a6Ns_vQOa|jK8l?#1QRJ#D^=sGz}}D z)@jBEoF3rQ$7CaQjIA|#@4Ds3R8{sp0xf$V-|Th${9!d*Cd49+eKWv#sAx)C0sMv} zyIShMVk<@_yTZNT13-J%z$z!(1EW^ji-gq(t;!jA@6{Wo0+)9i_B(p7X6Z-VsPdNKEBQR2CmdvQL_Xg` zKJKZ8Qwqzn?xeMEPEdntPDKh!M!|+cC>EsIb}*a)=k*cHXc_*`hf>)4M3Q%fX^V%dN4Z` zv6i{f7|O(~U*LQ?c2AfB^3i!Z9pYPIQq($gptM=T_ZB}r&91oAJ<`v{8T;#0gKq*eIA({Aq6y71TzyL@Ww&WdQag&n z_-#4`v+b(za@&@wmFqw(7c`C1C&Rr`$}Y_usOCBR$~!!6f&8r~Qcn!EqZV&2N}-!u z=+`wRjBk2nmV5Jv*xc(njO7otFoOglo1Q~&oPXAyeid^7P6?P$rate-9PzTDL=)k7 zku?%_6gI!z=p=5NYfEPP@Q7qilGLT~VVPsoy3={BiHYOYB^d!93E1I7N0d_c3pKK6 z^ZDKdjl*cHFG$Gr+8+T8hoDjYh9V0-@T*SP$huw%)3OqHA z8X)6VeBP3CUW?-I?46&0#ge$zS_|zSQM5+%b@*$Uv!Pr5y(J{snt|??t`y4+ymg)a zjyb2xGGXM7@1M#6*)-i2SJ9ALsxQBF)i4AFxxAWoN<%g_c&;T8e^{q8c~9}cOaox? z$++WkNj&DBB0NR4s>`SO-=zS+??-RIw(PY6e6k5)p&Ti|uLEeghaMJk1i>-Rnq@kaca8ZRO=!rrlg{P^tJe@j?bc#D$sdHE`A3D@xNn%Ru=m04Z&?6sA(FA>i+ z10kwj?&YJRVAXzYG@tWEBRrxpOeB(5liB46bQ`yN>yd9ny4M>6-Qkp9c;FU{k5JMH zl!7XssXLo8$4<6rj!e35C_g0`M`k@h0m!?_t8%Wu40q0by;MeDDKMOD= zzuPpqiHb~yM(Ypo+g%t~`WhFnU!U>a2|C->zvYDF2IOCx>{1`@_#}q<`b!M=z@Y<7 z8ol1%P5~^HwO`v=igDP@W!g{a!e^h9=hIy(kHqx6{7bjdU^i>viZAqUfd|IRTaQWH zrZR(GQ+IWnR5qC8#K&CwjtDl_nY9djvUMCI8sQq|gixHynp3uZ{`#(IJJgw|xTym= z9t02bm(g$3#&GB{%Jv+=6scm!7%l?mrHZI*6FM=Q%rx1F5ry#QitOJv+E{Ih13RT! zm_INqfevB%5)}T1G$E&LFjv$G^RQ0zx~YFjyBsgS7HCcH{XF7#lX$?>U@`k&<_t;T z?fY~j^V2sdekgG^_NINkiSIB{P0~FcQj$1pXKz(gQ|#|U0-Rzd)s-ekAxWt_(%u~C zC>|CD$^l)9|Bz^95QGMsW)_ONs64odDf7ey_|VG)VIx6#o4bbI%frPG^%l&RK@ddCjiCxu^9prYv2K z50vIo9%UIfey`GK+o77En?0`v{e`qpFb`gwco`9(t^eHIwv{dU*rj8+KZVEIapKcy zJIYa*s&1a=eVRi3jNeEy6T_>|(WUL4%*18TZ>o2tnPI$NK;~xh`^gotawLB5qig#x zv?n0llAH`2E#a+vFQM^Tn|7wQp1H>fbX`)9sfF)>!)p@rs$I8Km=HfjBLmNfe9>h% zX))b%Rr*?RrZhCE4CHmbOoU0~=U$p*NZ>(`^TIkU2PdZ`?}}6N-v)jTc}Y4hzMaDM zIu*fZ#p&FMANRlVx1k!m!^E8l!mVq5^}ksUME7G>Q5H4HWtlW(^FX~0P;i^6)U@gIMoS(HRPJjE(T2PI3driJO>4i)p?r+OVACsasOFsL0 zu5z1L)k(kX$|BX*`J8UDi(0`q6~?lH$1)xuJ`T`g@kTU*46J4aL~t+abG5%f$P zv4237Z9SYlwCwd)Dx2*u%M(?w`3wYZFj&_7q%hF16HNL6K*r&o@LG+r_$4pkUlR}sM&03vOUK$-WBRpn%m`i z?_yN{^<4`yZ0J3=q6!~+??1^&5c0i$&X)))qTa%!QjFTjd8US_ZaHiD6p!dcy+y7s zA^6V;d@Nx5oh;RxKtaI2FIeNL^D9=XLfb-t0o{z590e{rZu^t^s^~1Z5d@#0u|oBx zJ;4Vu+sH_En73fwGr^e>vV2K%ccRgjN(U3^kbK8Uh;c6fZTAC7rvehr47dHh4ddpC zgFCaZCN>!^%TtF!+g1uP!6uNDhhTiuA)7wP%izg&O7m!f~uLn-T9vP#@rA zazM0fR;aQQq2REwb$#{srj^ca>lfH3QdmZvsFE1&hFGVlzZfF8o0bLaU(Er~hU$y* zmpS>6A~q?e!LPxM^gFYbz(pb~4`sq;(mO>L?5&m7M%>%r1S}Bj(7(-|(wSD}ly~cJ zWba(5iH_52Ep5z{MDJ8<1DDL16J_dW1Zrz2eT~_uNSl#$fk*sxmu0|s-`~2ow#-{v zf&@((a~0=xEuHe^%6&#|XF9ysQStTCe7EsoDUI>QflXaQ5I-2*Pgq_3nFAJsLdA)@fRqsACvg&3~#A9{i8&3hS-k{(5(dZKc zIoacCfAP&2zE0#`*{%nBl!i{#j52-!VwjG%AWh*RW`D}3ICFu)OJ_KPL1?}s{Dcr4 zYLL+wrk`>Uf`URliY;ZnTEfISH@S`Qw=p3VmTmL!`SnjIz0bblmuLV<{Dxda?-5(l zatux-AZV_T$VG_NXjFB%L{c)-G6c;7YK+26f`+3*25*O%BTckg}?KP!i~` zTW#ckBw|EOS~u6Gx5%_tg%45zG_e_ayjj>@-%Fhd`a3f86`v{qt@l=#K4iwrAw_qW zAkoNr`Ha9a{H^v&uLhIGuXlsz9PDw3c1yDh4ie~lI$}P0p{=}|r>J{ZVy=~zk3lHX&#}#?UsS@IEaIYNs-9iV;nIv~nGT&tV06iQCl3RlZc8nY_qx7~_&D-io zBOQOF8&aBHDI6|zpUoaFK26SpG&YLXlc+=P>O8!1Pvlf!-Wm$rWhQTm-=c@;v||p3 z)(K*q40r54*NIPu#117SgVHf-Mg{*2BsgHGV%Py_Hf9#$NZ6UM+k;@iDb^z3jn;FY zT1c*xrN|=EJ+3Hk5*4l8A>d?reFN@>?66VH8!Eeaf@h=J;vy;FiOi=5N&GEis*C+S62%fM`d6c|hc-AL_v+DL5M<{~ukZp*|o%-6h}1@Q=^wB+(d>v%?d5W6&ryfqWGc8ynLw{Df2hGg_*8hli1li6 z1J`#@8#^|JCvW1iF_jkb(9{!!E1i9tp4gzbv^T1_FsgU$7~Xy+RXn{k^EopS61%8E zRZQD~1tDM^Q=q?~wmvXcbM~QGGgu29B<~z=H-t)Z4){}IF)$&%tnhuk{%Dyd`-H>? zgG=ZSONZ`J8NSG`jcp1_o0hwb@MOx|^To8Eu7s%z;)It}iz}vK^J6kecC@ZzMtU*{ zxeBHm9o(;Ex3_L%5h8~sXNQwizD-j0n+2N-;H4k#kOEtjbt$a0XdKNf`eS9Xfbg!laEi4(|jleMh2iEhgK6J{mrpk^VRrB*Am=>&;F%d<3-@Belnmu z#BaMY91yvpgWF;LE3dfFF)n7(Z_PaGkOlCJ&AHU6*@u=5uF;8PBDGIX-^yR+i6Q}e z+K233=r|oU*{+#9nx+StjgR{Celrv~D=Xm_&iLLR#dpAdc6>kyt-scs41+S0OPhY2 z2KI|X=Al~;445nqm9>~tPYzh-M)g}K*9gF&cmAwS!hVz9>BEzv%oel1f9(gT6QRP; z#_OwPidn+*8S0oM1frm)52)?`@>u(}O-n$36){W;L0)e`gA^MWaVfV`z-g|}HYT_i zJ%AhMjEU~)kx~sKqlTReKw%T@hr!FYHsj&c;Ef^1w-T+Q=9KIY8O5 z8Z$N}T!Jsko}LS1Ut(gw3T(mre!u>MT59EOb7j31rWvZY_tqkw1{dP9h15^jQ$^dW zAA3${mE@Uln|Rf4iOhTR@q1%I<-rTb5NU?Wz_C0VFu#Y8Rkg6SfB4>#+D{(Q>diEM zOjFQGT5QF^?%+1A9Sy@Sl8!$!KEkFLv(f(J!W5Kj=dbkS2z|@kB`Ov`t z159(rx-qH6XqZU-TlUcz#XU2^$7xNq4(oonB!xTVaAS4Ci%&!wtror(_#(U!E~rRG zzZuLO-;U&yl%BwYcvEcnK#qn6s@E!1MeUwY#^<|e7$e_8%fs0C<1w-qFD=O-qS&$y z{#G{`L*B>j5D)|h{xvQR4v&Tf&`x3(_w! zm1;${Xe00f6&_|!^SLCVvyHoaPMoUW(&|ewThV#JrKj>J6pIcoaRJdIYdm*@u2NVP zL#B_r=XBLm=43hBXtmj@BF~{>$@p4Ob3cHc%HGID#Wp9q<#Q`=fh060g(h7RXGTG>@^6?AC8C_VhJvtZzPtf!?%b$>~si|fM783n6#3*b=>(A5WtBu-? z()Ou!&(Q6EKlPOd7v4lQNqt=LL-d9}*gL<5x)|Hdi`P%qSH43%8=0~R$pq~uu2mHdiedZ4 zz1nla8nyD*PoxCT;jxY&DgUe%+20t7cFUQ%X8_nJ<9ntp3f{iOVxPzX6*8j(9=+C% zK8kd1s__(ty*7sDfpA7DVr5T7Xgx2i^)-QVGtWNk!55j$9aHdr%!KTXeEV^9ZMd+r zCBzj~Wl`YA5_e`7|NUfaOqr#w5H-Q-uH&IdjsxY!&`stRIC>I*G;HN zQQC`q9W@9zCXgN-kB{9Iqi2j*Vd}B~;2sTP#V2r`ud|oGCl0=scIZa@XJWw4l;?%K zZL*-@dzWav?;9`q{xX^lnQI%9_KF%7Zyz!<@!^>$65T(;DW67bZEdinTI>uyP`j{F z2^cdY#0I;KEa`4)eAIEjJw4;(ZnZ1WmFTLc*eK7~&s(^GTPzdlhtWb0FoH)WcrKEm zf*bG~jOis}tgW>BQ?PRq%&e|dKNoG7bdKr3xei=S@vR6Po^oEXO?AF8Nw zXhOO~3=m;Ib7(?Xxg6*axxMOk)cTA?t&40~pO_4_VJMqg_2OOq=-2g?s-&Y4F7lDc z7r9q)yv1ZIjl<1$_nHj(c0->X@~2UBr`{UBe3_i^m2*bq z;!vPWWC?)hV9n#@;Gf8kt?WrF7}nui_u9+c+#A?0jg1$g9DOg5_SNYNuTL5M+7B1` zj`apjsJ4t3IH){Me#GHep3M%ByMzx=THki%7LrgRYNYPEeE*xjH8W*L>}Y;#f}m6< z03iTJdE{1udcaHTMjU_6_O~ZQnT9$4Wd4)u`G6QBkh3Vrz9nG8a@CaHOgIKSb~=h` z-gt1sg>7uK{%SXgy`D)mB@3=4E1-+2m50Hi+mX1<~yfC#rq($E*&aufPe zzu$56gE99vObc=J8H)j8BuLA?6Lkd{gP z_pK%~M;e@S8uHQLED2%0*Ocjurx0{+?bjAth;SNK+LW4T*LoTBC@e>Gi<&KO4-6#u z=ALcD(6$HqsGLjot4Y0XTe!!p5@5~_K`ihZO=a^TF5xaf7FaAWCj}?za$l1yyQx;l zR-#-lihIUFs;3s+csW|p`oAGA;+O4lww0#Dm;M$BbF+tg!BqdLGygat*I8i_744fYT=2$Yt381XXq~%t*P0U@&oE0L&CL#Kpp9N> z0s6CnNT4hjpg47?s6pm4*!gc#-6-5rU31jD}ClbFc94sKMr!HFKRat};~_Quhoaya3fa zQOj8Q5$)^jEs8$sMSv({@h#G1fTLrOVsbD|dklB!827T(`U4Bnt*uQo_v#bHsYi=L?K+e}WOj9Q{J4{YGg`hB~R3|q3`fUT&U z%WmwXd`#-#I1fVX|VU9kNS*hNaXPj7Z> zTax6{l7~oz<&7pR(2Q|znb0xh+mj#Z)^V#U8UX^btKtzDLkVrG`S7N1?eRH!uP8mf zHO1irtQsn&?V%bF{b<#8%oR+Y&2Ei27r!dB;9sT}Bn`xINguCM!S(LPj(TGO`W-la zFLt_-jW1_$e-6*l&~QQ4zc@HG;z4y=It^ni`a3m~U1!$BXR=3ysg9BQL?195u=20% zcPGj-BQ{J=VosS~K?rzCIOZ4dwWd$gFypxWCe2InB_@)mQ^Ju_#k#e%zJ^gX zZ>~%-4EKE^2L>CQAN^x+x5IY{L9S}13L^jGy|ZNeEmp4v9L!#(Es5NVj)S!IYXQ5O z`n)Z#lRd_YeuJIL6bEG~nHG%Tr>5&d|Jbrn&`PoORvuYLMT`dB;M@52P}1*t9>hu? z@dyNZ3RSxlyj5gM4nC3Gol_Jt64L;^xGN^u`l`EE%I&)LnB9-l#5ghRa zB&c!2fvh)Q&@ttI%#yo_CK#$Y&xeV+2hNRNDEi4TKbUUjB1%bEXfDUR`A^2D5P(iN z%x3K^(?HD(75iG}1Dj9JIw6|>QHVfdYsos<|#zgTZ1zL;c`4J~IS%K^X z5AC8LVJ*(vrtoT`AKmMKChI(h63NTgJu@-R$j2UGdzxFaNXWM_eFStneHUtA-=T(D zZQL|^S-{1osH$|DEkmEdL8=MtItW_vSrf z9vz$ZKm3e(y0x#^N>BCYJWX0BeO;Q@&zy>5i6oOBzlgtT!o5R^hznEL+4cgW>%FM#y+;qR)=crx+b2#vF@DZ>n@?VYLa zERPzQdXxhL*sCio=9fOj+Q7A**)>ouug~cl1GXwERXo?#=e<;1cH&=ufwWB+?ulg+_|&bGY)@9Wy(V%ohOB0e!8UeBDV|_unZZC~nD)0lc#FYwf$MPvbp@Y^{H3gjx|Af* ze~G)B&}iqpppOcSs<5b$No|b%c(dwWP%+b#ou-u10_JHq+ReKElD$m_R$Ki0-;Qr$$p@ef|6KA0YF|F~2-byuf$v%Y{>j z0kK&gN|f6>@&sPp01!Y+@7ZSkDc-ABz*GaEJpkm#fPxRU0e-E(W9zbd=?u)- z!I6x&;RmEq=ocP!lsB)ZVBota8z96rq^FcmPwyaokMw48Vf<2;BHD-QBR7}5TxuF= zaF6#jOptxUncWA8&h3HU2`G>SG3%je0zV@>b%fsQo1j&Gaz9hC<&pFbLB$O0YD@d2 zUyAM1ISr~^^M(C{Crk*Xqfj}w?JiWPge20s6!(*VfL}GU8M=ShT`M(~EItz5sy`?d?vO6pePr8&u}Db#%UZuL1Cq{%li$~i$=016zMN-``r z+I;wC(ZPO70ncIZ>BtRM0r)!07~r)jeoffGxatroR4JJM74CXnx$ zare~FtLFsZ0EC*JPOX+YpKz8h3%^F)YXK0?G8~ijTU$$8r~UF^%DLY!S@f*IiXant z`|?TVuTn~>{E+}t)zoAqY_lQ+!lzx-J8L&K+I3T)Y9z)jfE_QlPYRzZ zet!_WNh>u7R;^2#pPSzv6ruz|;DVOQ*76E5c(B(mQV&TjU9FK9qd%~fgMFJAD@W+h zkGxI3+FSz+EXi$v-8H1x+>0^1I8^e?xmlHcY+fa?;zE)3_oVyjTmA{byHfqnM|~^PWW^<`6)uj*Y)~_RwBoy-#j-tB-Rk{aB*{XW$8akkfBTh0 zt`-3cvR8r{L03uPz7u#B=2B7}g(iPxnJ*-!$#@Q5Y9MOm7Il7f!=HbxVUfD-I~XFwy!sQ-LCBmEAJQVf_SNf9Pyq5e9Jo)oRh~)fSCu|l{*F=_N^3Q zWPuM@_+MviR=_xF!E%?X0@ZUxYORQ`q`=_0{(;G@P1&joL!`!n38UL@+}8& zKDlVbP!fVxT5+vc(_FIDF`#~Zm*Mnwy>Xl0mB?}WBTNO!M!HnsNS;CtRml5y zJD@DHt9N_SmQ_|6F{h{t-8kUEK7)Mwk5p_Ve10Br(8}!6k;(rgo!PEzS`>z#MOzdS zR1xmfU7eB5C6k_xY@!r55eEq3J4FcyY%L|nto$_wv)_XHgjb+?mvBNA!2k}&<9{W%h?AKGnt>#q!I42+`dAK#yCW@ z=3%G+xQ!V>0#6+MceM>jxRVp#D!x0r$jLPk1U+uW1bk}Qdey$WK=1JQD&F-A+}exu z-n_QmqGvs%D>A=-gFH~?cSfFi1^_76d(n}n@`ZON7r(_^L4l<%k^J?KGs}FDx3r19 zu6<-I+rF}8sh{FQj8)YnlMwO?^UHEywX)i$F%1Xj-uS59-O{XxHcGTU#lKP(J}7w3v~ z_C#&g>6)htq`c5}?dW#m^n@sLao2MyJo*@WRYZUqdB~nw?XUsV?)`OX?{`_^QM&>M z{LMAjeURp|SkS3ELCTga_OI7KKQj_M4 zr@eiet!5sJmt-Djp?GCMC7@^3NjDSU5gdXqT8>vw8xq8icF4p?G1q@?9@&-eTIX)F z)l*Sg4jrAQIF3*9{!7?cDF$TJUAqxeIG$jCT1C4jL6q8vs$Fa;vxC=(P_|s$F0+5v zx%5d%PaI0gG%;XSBdOSl940l2XjSUk`)Y4%I~Io_(WJDs&`sj%o#;UZ$8dP%=EG)} zuw6a&`|S(g3IO&u3MXn^3kU9MT>0czJba5$LxNg8xtV{|^ z=(zE^6|8=2(`#Gl`Ae?sgd6j>dH*;Fp_)Xc%-U_dSqNX7M)gRHAyZT95 zT*)#vb2al<&KVg)S^6c35H*L%%&zaB#=(u^0z};=F#akwTs@S&YeYMLUg{z;tA2iu z#b6Y}Y{rx}L|t6z+SGTwzh#Iyx;-f2BOiX$>K9LS^0}PBJxec76zQpVf;BU^2Qef3 zn;$z-Jl>ezdp9d_z^!$p%+VmNarC!HvZUm%MfWL8HG^ixoZ0qQJfiW%gkZ$3R2r|m z63htWIX)CSQ_^en_ovRZ%bW$k_FcOiky?56#S5G5JVUtEzBJSA1(lN}9 z516?-_DkZALY$G7ZghOTy&K?ctD>e$4V}1Jpe817*scCO;rAU5MX-5Ibj#+l?`zJ` z)^}_0Ee_X44tC-Eaf8&aZ~k0e$SE+{HOOzB#Ipv>b^e^H|85pIzc$)XiE1lg5Sr)? zWeT+OUOYhN)4r@BjM;`tI)oO%$TJKa*H{vU^Mv2Q2WiTUjP@#B7*%}B8Tch`_Yx<7 ze;+Iq7>Yu0R4fd-_ul8iG>UKvw2}N(oAO#@B^;i3LA$25?;OSib>m6G0sE^26dbGg z8wrwmc@*XEvb>%jp?7lup^szeTv7F=xtV$WZPmZl(4X#AGr|3}*UT0hoFd5J&~DJ^ zj#T+&2j9Kps=12n##yye6xY?fGN^-ScVQk9=#GJ!zojo3ItH;FVV*fzUPxdPq02!< zDYa5lM!83qrSR=Mhih}We^sUQc6I4PKFyhplUaQUB=q|?Yfa4Yi;G&~uuuNvb(%OMTZyNfLBb*}8JAlZ}^o|+-L7oqm z8cE$z8aV@;{ZLMi&uLWCe^W$%IWoCYF1&3|c15>P|eFT>*mEIeeicg+Iy(Y#?x%RT!8aXd8+q6ro(=T|(th+N-ws z%6nudkJlkWvw*`^{E$Ff8a!`~IVvcfDfNrYIh-?R+awX=n!@BIL4}b}Z42++w>5ry z3YuS(1#@#j1h#oTB8#|H#UW0v81BaS_1nG0!Sn=X9W90i-`(&@IqMWBl=#AYg_SlM zoIzBtlj-&j`b=PsLFAl;;5)l`PIn@}?TnGPf;8PBBwgWiH7#|U zuAJ~}|8gp@54Y~dikm~W(xIa>?Zeb1c#9S+)DNT+_IQus@V z7cnb)iiaJGraxlbFh0?X%(?`z4vu-@Whs~7{{C|Jw~&JJyhLftyY;8!R4|y&Q&3d9 z3M%Ibi52q{qV;eazG4kVevA=hM+nLp3uC0oZD@wnfC?`QW;xE4}X zKz9W8^Cw&u-*Mv5p2wB0#ycn8a$bqXhw1-gWrq?F;o z_VtZg`9>|dNO5tS5AzKh_Zc7bu2mnKSd4h>S0zwXMv;7OJZX6(DB?Y7B0B5Ua^q>! zag)QR0{*7kR=S>M+C&+I0>j%&s$1@NW7D_IN68OrsS5rMqkndZ1rKyuhj-0u4fxJn zreOqF-#Y*nR8L>2O+Ol$;;9^;f74UAv8@RnW4OG z-bpW>+OEra*h%RJ-hQ2b-9Q=bxJZ5mu;PX8%`MMMHFd)BiX=}HVwlx%_~HYe)Mz_& zqFuwG`|;*OHh4;x$$sf72lk}1R7#>)bhG?CAJML$E)E!n@8=rGLav0BGmmWQM^?zrq`WqC=*htIZ*DSFJooF2wMaR@LADSj< zZPBUz!dd{`={qY0WNJ4u-$*%)<$Ls=r%>Te55q$e@3;`&CWQ2nKc;V{3OXG^7P*ht zC77{83JOHtj*kn9T-Ujjc^E`5uzyET8ZVAs)vH=!h9gE^27T)rSik+ODQK`mxG;8P zGk^l}({u;`$|9%XC$Aiw{Y>xoWHXJ?Cu)%eXYV*z-95~*PqbI^v{ki7F@eBq5H#axF&{^CFG`*ByqZ5vav01-(T^DS8~ zFJa7xRm+o@vGesUW~pGdItugUFWaimyFR*fNe2A zL-hw(Qnj|%ulYHSBPMxXc_DhTBNj}IMShRBsA-D-R?v!?U-C~|Hj>+{zL1SOe!$zb zo*-Xy39XUq|8^Gj6G<)Q?ScjAI&L1OU-QPo5W@84x!5?w4X1QM&R`y;Ot7lC;6n?8 z!-m)P4wol_Z`eEKRLMA4>+|N8h@4ZcrMLwN_{wd|?C5IfEm4H(vqRZwpD=;jDDgto zuZz4l{x&xhlB5I4|K0TbiqiIdr|CV2$0ohWA%gWjqbey;MaANW(z23pY4SjJhgIc% zTsAyHNxl&zLc_c@P*D%WhPrak8D70p6`k2FLeJ{5Xem%XATY^)#CEKPnW#VgYn~fw zem;W4%k_9yEO-gS+xABv{;4*cE|qn*bP@Y9q-PXtSZeEy!!(JG%?g_4i6dKS<9sEGmivzY?~!vpY7WItDd>?gFPn=X=T-13Hn$smUitlF3Kg#x_n?=!2Hz!D?#@?oAgBFlTI z)+|BYxJ$4ONF%xWTHm~1;Wg$SM~#01&nzerfeC$P&T&fTACyox&7KFvJ}Rd|)jU<_ zCD*p?EnA6v>tJH2fQ<`@jt-awj8FQ)QREpXXpm5i`$|ZPE`CF{I`dBzg}~4lEzf50 zJzWRFJDWH0_zVl*QElB7k#do8N2bv_qeKNuzfi7Pw` z^!D47&_j}!)4RYAg0xQJC_x?Q@o=c-mR7jS@qi>s0``*SDE(`%uSK})Y~N~4l+)hT zFV&D-8VOg%q4fx~i!;{p*6STBONjX6l+^3l(oSig(~1mu*sKy=uFTVV9EM=4j4kdq z=@&S^j;DAs^;YDQxSAVx2snAHYFZAo%7_>-(^QYqFmq^NnL*{t$vlu zR|fX9Dv87JD}@9A^jtZdB5dV}9i-ld^VK}wzqm`pXRnAxN?rTN_QHxsyWa|CoY}7z z;deOH!1e@6dh*K_w1$ygLg>!u*LPU}?+u0SxC6rzFKWwf51S=-SR9ao?cRtI8Qb}h zm91%XlwZR^;AHLP^uV5BwlY`2)xs&W>=mr(#ZxjpdbmL0+O!3-h=DEZKhcSfRV`dx zv}OcRxHhmKz_BJ%Ext(?HqxxNXev@o?QGxAC?-0Ndm^$n^uo(9!(m2Lx_NA`}#r%B{6x0Z8Slv}HmsOShF z7;7VXJRPyrQvGPWq7E9I4--5c`m=D&_|%)hQL2our+3-BxW4P~?$0afz%|q(lw3U?^X|?c~?_{l=ru@g5Xijjc%m3h5DaS@|qVADm7y z;pi2kgy<(;#I8r|xmXP)geO@oXWy`db-w2Psef}epJz2T=+=PX;Bv`1dZVX)TDbH* zdBEYmkDJxs{X zpU3?92)nnL{R8Fr3)o-cmMFY1^RNWG2N6ZUGXd{-N?Tum;*{UZNe|6L-{Be^+p9wC zzrCWZ-;7}iB}FL6B|@aF%U9$Cj{aMfigHbc`8a_ zd4=J5zU5*f?W7r!=`{FmqZiB!1%X#MxbYJ{ZYI}Ck1oF|xcheNOVg0+KyUDGAS42S9m~Ah$r4SstBR`>kpONkS-{&mH;)`9`+e2pO+i&p9o!?RK<1c0 z$r?wt!l_-%%rc>&tdsNufJO#u{H#iOB8_i&E#i1s0qs0_V_<~L*dOU?nakS~sZq8} zkO^bm!e4ts&ub_Cgx;7`uFx>J(Hd%$zADY>Q|IFV0ovS01UkNWmQ#h4x6|q?-B*rT zO0Pj$QY+o9KLJJ&< zYz5x28ZL>){k}XpG1}55p$q#;M3#^=Wzf{Bhhwc$Jm!J-u$ffNg>HrT2H9&;ise=M zP_so5RoU(MW?;$KqVzM>RsSj4@Ec@9H%#0TlcFf{{`ctzhfpPx>Mwt*TwmZ&mP(%z z$62%um?O3CH;i-f(=NW!$=S?AR z;T=_&2APSr@npf8iL{B8hF_^wCY(vp16e%XgvH6MIE5%P?yHF7!RR`lJ9Uv^3$mt= zrAwJk=@D~NxTQx@*a>wB;#pLEW@m@+eU5eR=UG{z)gi{PQ^&eQ8H1Aq2L{u(+?d#+ zwoyJEAN1CnORdtJLlqT?3E0mM^?9T z{xd{Ke>x}*R8X{*Q#Bzm3Bq=!G^)r#jSgeTkt5miHjaSXE*5T)xaLd7o~&wxF;er* zOvQ|8`^KX|S z3H2n+e1R4;V_yY^-|wh@WV}CK%%oB<-$TAS{T5@HR$gmI(nf~pYRNO_=CUEz_6(To z7mCpk3N5txa@M~B_k1?ViO=zFiym0=^o}nt0DtZf7&WQIzSw-|8FBOAdjo$%zQpao zf}Z83-w3yfqHRHIpzb&7EDyCFpmN_J8HZDai!O z``Y4`ypq;M?B4V@<2G=oml-iuv<30+pqg&E!MeTPO0vp^aUxkay2_WceDFe9mYMGb zk>lsyCWZ1(@1de@f#*#e8QwrI0GW{$lKrcc^ii{;RSjdqalcNn}#bgp>F25ibrk9ozN( z<|@Jt!m}mY3c84}si$^7dp_lr=Z~8I$<40{g0mn^oQ<_(Ub1tTy7W^;4m1d74-mgS zLJFpRB#Iqm7i;^nPLHoKoa$~I#m%7EV+pJS{>C8_Uei#WIOxZw>hszn97ws1Q`kA@ zCjIrsUkzG(5vzyn{j19^Mw98lew6~`Q?vBTNW|Vh&Xcg;R*XIJ-H21}zd(s9Ma-kx z-+e_0Q{k-$7Pw@{h&Sa*5TF_7i8E-k(CJQmdw70;RFf6<0Ae33nc@mZN#`_O~~4osv#(mIbdA297=6`)&o8q9#v;S)FLDY>ISqp(Zs5`P~dCO9px zC0=`~ahMiXkcgy}G(O9Kk-rp4tS9Pi z=;rqbZZUkweDkmla5c|IZB}IPD6i?04%f#U`k->B8lFH~>v8zI2alTpefHwtb~a;9 z1D+FxC$J;VUR#%72*zDR97J~Fw zr+$p_4FB!2FD&iSTqXGVOZ^!blVf&1j?)xqs4y;2m_<=fllE*w)~oqK*>nqK@@>V< z0Nn3z7XYXPeoX{)zxw#{(x>;>l?G8=CL!9wr*zWA639e^d}O>E0ca12>lI!}DN;36@k2cB0W0b~Q!=-gvdouQz)&O9Zfrq;~7n>7)X5DOp zm6)xy8jA=mNq2T?$c-d%58#_d>NFFBcF2 zGkR0qM8Fk>y*DxU&0IY8a`^aGWWtq+Q5!;J?oYfZ02fZ+EV>4&H;GywKaRlY4y?f< zS({(elx}YR?(@Oo45@A*fauT%c-fziXqM++{emnlAmuF);xTD&Cr7uq*+ki#6su^| z-YP5V*T#Ec^BL|Wi*B?$Q8+HpF^n49?|3r%)^NPi?}Ul_817GLV07;RW<`7%Ka;m{ zI=l?M^mzss0zjGa{8t?A)Npcq+0?Q9#7=jdbv!>lr6Qa^hhwVFF~!C}f_$Jd*qcFe zG})-m^Q}OY2w|1c`I-qI3Ln>WapifbU;mr8dyvjy2%Gc$ejW-K4MR#gt8zFeevmwkd*nIMQ2o2d3%ue*VOPcZqlzNE0? zCop2v&+P*F@!m3pv>nw|^0%wIktu^5$3jB(FJWT#RzYtA`{3Ggf(-TjjqZ+VAz3hF zgn#BXykzV~M#P!kqXH7oK06PeTb0_b+`{9`_OHfY3S*!HepDqbBSCGWHrT>K)+x$< zZ@lw>S7hrkL~RDEG9OQ!wsK67>UI!YrwE52g@XYp*20mC`DVW){7Lvyy@(FAFPh86 znm6=u9l0Z?+Lw&~T`!r!I3`XmGvqg4P7MBbxcNmPBxo+$3Jxjb!~R(Rgi&U`Ca29a z--$CA=kA@3y5PY(TQte|drn|#CQAi}IC)Iw%q%}92Sn9Yqa$B3k96!Qyv`x6^x+s= z&I&}opyb_n)Gs4DV+ddfNOX|btDZH_*EmxK8xd$m^okX||UiTLWPDb@0VzNdv&QY?)4F7M>ax~_4s@&y1m zF^N_6@0R#I)-}IQ8gGo3k9Dz|dC^k(aB>7fgQom=GRYIxrHCZ%jjA~muXAVI>!_iFxT5Xb87N=X@yma?yr#({aMbZ zJ0-eGZ8(nMx|o+(wC!MFcFtk|0LWXvYdKvV(=(V6&aR1};y3o`7kE32{L4N(q7+?x zHTMd8NzoU&ro2)1R!bZ!3g<Ms*lNG+wekn7N--E_EMj`x_aoP)b|k zyO*VwPn(@tTp9FBjE*-0qLe_9jlK;p(O>pP87Bh5GH}f!DuRfRv1ETXH;^&>ogPYa zW!S*H9j0+8<4E`3c`R4lX}v@3`}U%Md6WI~a!!MFgrak8A4{wD^F%GS7lzgJehfF= zUNv}ODWXNjqbnL z-m$A(wj!Ki8Jn&*7Vtj?aCjWAh@$OC^>&+^{&wqRek>aQT?PQ4zbP)ecAae$4{Ph~ z9XE#Z2!grg#)5BlS>$l1;L@L_)B0g|Tre$QITk+%1$=qB39Z<=g_YN!gFU{7^w;=h zV*#L!mX+BU=+7I8NrvWG_{G+*jpc-pvoxKzd1P)q_kJpkA?z`XbXv;?85t~xzp|BP zM=Fi1w@J2BFXhPC#m*V4tK+NAZ0w<`mU#_|FTI)OIakzdMrrIR@V#SM6`0S>@J@$E z0UX}xOP>QkbfPF0xSn8D;n_EnnUAub8qVIUJ8DnMm!)yq7%25Ix03e_=<6Vz^h;L+ zJG(35Ar79qdja4g2=7SDpU2V0&zRFnpuRr$H$Hjcs2#K{1guE>;t3bB{glPt#X)>R zBz=#8N>>F@)#*4#O{`P}KVG+(55qCBor8WdI}TTSnhq|uuz?u4t$StBGL%svpa~;f z0f&66w;1p;D2>ZXri4ISVI&h(zJbU@8JfTq1#L^@iy?Fg#h zrX;foPH+$)Ndb~(Q!T>Y3m~hJ9=o_09xi2}JuXYdsg6b2fW9rr&Q%aLWU8}V+c+)q zIGdulok#SXR2$_eC~^}=T;|zZo(Zml>KTVqcGbQSWeUiVSqX|ePXM6A-Lxq&X}w%V z%uwNB6|}n#dwKu~;n0yi%UJ?_S1!)mUl0%eGFw%IBxY`Bbg(b*2zzve!I`D$RyjN@ z@nUq6e|)%aK#qw#HU1sztPrRZf{3*gj1=S=ym%YZ1@=OeiT}*-24x$g3>2oTZOQ{C zo=4$mywxmTQZ`R5SA zxz)7q)-n2*iuwki`=dU;K~|sOBsPOLOWq01Pi+=$>rS4hkJuVEnOflwt>)19Dy+Tq zg)L$ar$W=9^>XFuxZA@ujWh@=GML$kd^|N>B_Qgx3qMa^9q6mfhvo$ycLU(~0e}Ie z*=I8}LXEgSf~#UaLzPbkOztds$>A!_R=8 z2tM)vmDDm}s2a?61Vfc}{rk0IAJQl^kn68)vjC^78+g_Z2HtAV6?^Qzw)`|#+Iv(^ zwHK+2kyP)_hpGiA#PY9K0=)&NYKN&gbsPM(3UFLOlzcyL5${?!Xx3#Eo62SWn0+b| zl2)rO_;qY0V7botY&N`gQ-RxqR~E^4RI5R;FP)pYi0c94B?~is0wKo@L)QLkztlCI z9rgudmBenHUEy!F{NC&6m;5a`E2v(M@uNV#7dey>w%?Vp+-6)$*mS`985{A2Dd#3RbxVT9EfSVUp=MV`q)2fw&cF*|S zHlb;XsFtPT@Z!bsyy&6C_>!aE{=~@{a4^haEJNS^`^TyCFf<=q2K=@*j_nrvGKhk@ z2hK?GSti|fRl-3)nx2sI^$ff|oSWQ@eZPfU=zYiMBaSh$taenl-CVGd!8Up6Hlw$sF z&vo-FRU$u^R4bLRHpRnr;Zuo3Z@%c6k@P1m_rZ$d^ssz{Q>zwwQc6Yod9xQFGBu%M zzaX)jz5~0)=_p#q5HGS&P%70>pkorj=PV7!O&Gq+f)NVFf)xlIas18S2SMh1ZhBYq zl}KKm58hza1@*Nt0jvPYW0XHST~D69A{FG(t3^*B24zfsC=B%(*x;=w z$`oGEI?y)*dcT%~!5sZ>PNT?#VUdRUIu}HM{oJkAuu+toYfQUaEJZQroR+mz09%Nf(g_CF_F*oIbkKJ zeh^(qD;&5Cv+BQxM+h}mHWB7J5ad}8OH~Q}2||dETr0KW+oe;YG+~uD=m;(+1hm|D z__;=!Pvvg_sLuxAbSqPR?=(+oa-XpgvE}SQ^PNRxwtFXXAs-%W(m-c1L%Ix04Qe*NU(iEhFW}_(vf~9GPS#t+cEUaHU(nV%;LnF*{;zCU&5Iz{qhRekjgbf-Qu;Mv_wUULjm)8 zoShbo9PU>HxA-*uI4%UaWAe>}5ht3xC@=e#)<8^xjC-}FM=HP@^OK8)l3~(_@8_ZA zgYh^ReQDDzL~un%9JJuX5*@sNM-gxk@IY=?IV|}GirYpRGNQGC?HvjW&KStwO~*Nl zg4#m)w^0B*A|agrq#pa%0CB=~H&}|Jn?jUc5P~9epny0km3o*$4B;y*qbIXF(m;lK z8h=+&$tImt5&N95B;-K`nfN&vOHd$8#x>@%l+S-;y60;7qCOY^MBJ}vkbiC*ck|?=a zeYL^v2#1eN2p98iz28{PO6LxKV2CgzM)Y#Qy~-18V(^!%^P&WQmkoViNvKylW$3(W z%`}`-bY6f?#WR-$>EoF4HZexZSD4&d&t7*>jel&47GOx&MW$MS=!rHw2n-&=*AL0iy*?emuu!F#l zi0ZM_fwR#BUHdW0yoIJ;o{BAM(b^1=#QS3eZwhff#X&x?lcdA?m$~{d18m;>Lit6a z@@~4BO}=Vd-Spe>zR_TOFkm=EtogoYb|OV-sDX<7$xj{pYf;I@|G+OQ+u1<%yl{C5 zz_a9A0VlKyM+ZNHy1wO;2&#bQk^tMaW13~5_&YP^!Mp7j1OQnWj`N-c3W|+POH(DC zGcmE{>g`2Rqp3jlB%~fIq5!9Gdj&~JKSK#kAn?pv- z**`L`#W}D8Xaps9K*-Qx4QwSH%mwJKeQs!OC z`8tScSfLMqYvC#~{}X(Oh|&ZlX<=UJC!2ll^kd9OP!AA3qWN?bl>iMChX}O*5AR~K zJOblE3efv>gkMQ#HV_Gj&OiZZ`Pu$xnRWONav(oCd+$IN&wyH#Gbz_+Q)z=!y}p?0 z=n>Fd;$c<<+w^qHqT%sFQ&4mN#>}KVD9_Z_F*)4BzzRw5rdERAjtLsncUC}EweTIX z3=?XJ6<1$!k-5f*$Yl{ajnl_Ek7IBVu3=eUWNtr4Y^dO+7_$Z1!pMv*(JN_W)0i|G zT|#p6DRsxQP~|`Mq$E1@3~ac`PvoybJ=XBO*S4GubequLrH__>A;fgf+SH!GNZ~3w zL8ndj3%WHgh^)$-qqV1&102S?)129}YXy6i<1SPsLKV*1S~`M`0}6O7-?6`%K6&d~ zn)&(KmhWnLU`5ZM^oYg;<$Xm^FjyXJhazX}+IlDiL#Ett)3f(Q=ef9ZE$92H-8a>k zIurn$a&x&9(68bdW7mG-#Z_8Ld3`2q0l7lgQ^y<)ox^12Rho6*f}qnxdy~tH4QD{? z50!~&(qkI%Xb z2y_AcKDtwmvYJgjXh=f_oC{P=hD`Hc^=2x3o}HfIeiu74Z>MR%iSCcYgy9v9r*Dhw z%k+7Ql|Maa%erX|kOc$SQZX<&L()jUtLIb__J%20dEX*Si5w!OD3qP;AA%p^?oBRg z=1&BlsN>@@lsX4;;*=0i4FW5Ndx=V^l}zur)-oc1yalnr{u^HSSr;v=tD&dOc0uHi zX-SY-#VxPyW(<`ESX{OkTgMh^<9rs4qcS8busBVac77W<37=KFA#*I$EI0x{_%QoB z?~`=v6J#5eKu-0NXw3cfPCnRKM|mL&M^=AWWuQTx5sRSG#5BA8_Pba=XW)oOYrWFn zC4!EC7YT13FKvHT`3TL+fr>vjEv=Xh%5g1yJ$X2zPQ>` zDv$t>EcU1Q3BLwc3GY+1!Ky}ALSJ>y3{G9dzm1vU%Yv94P2fN_EY$M!UOyGy99^=BoMNL;?hCwza@#((UzBu4R!{HG4v_)F4*pmQDcRKt8 zNuD6LifE(k_qN^dcOH~^s6MqpeWpu}mgLTv+PnLtHsdv<5H|3`>}5=(>R?w3v|8;q zJQl5KST8BeY`p~oA)*7vEO9Kot<_#;Vp(PuJz3D{DbtGz{<$YJc9f-+*fw3Xa|-mc z85F)7_W+a6!)0an=g2i8+45%{qw)nqy1AADBpFimUL)ggLZazm^oF93#zjn#tBMRw zjx_29V3-oe`U!cv90dnOFtO!u$$h^^d?zC~IdpCS&c6$}hC_svxi#}all(aA*hIx4 zpWy`)qjlqoBMj^^VJK1-e?7M}gK{7$}G(3#fl*=K*n^Q=s~u}Q26Cm@2@bn!YS`zwE| zpFn=%7Lx-`@8w@_wkbvq&5uwaUK3?&+*yrMCa-%L ztuo+>H-?GlPJIjuz|ZJ}%r1Kj{B5^&$`|X~?aKBN7r96|WS}PB6;yYrxz zd^wq5VSd6ER)~8FR{w3ozmps8m15K_mP9Pim{x1u>Li!CV=NplU6`9VelBX3%}f=c z2!x?$ba6k`Qc{!jvMc!M2dCJ|i)SScc8QX3x%wQKf8MGrX0(GVUu>*rH;ZtwQGQv9 z-H(dY{Ij26;<$K>djHu4rAS1sMVwPmpKJ_DBIsvcd?db`^gI>>wHL z1l}XqUxfWKo*w8COdP+oE%mceTp@~8S0TN`heM5w1I&VJ$1uYimeSAW9!z$_nXzq= zjplYCJ2CcTcF?LIzbcc&D$VTbWd86NK@x~AisB86)=Ss}fq&~*`Rp=HmwD;G^U}A3 zF6$_UpFM$I<8I&KJ8~`}sQ&GEq9ekOpId6lhfliav==I@(GhR7Jfma&^n(_F%D$Qm zoLt$H5LeMsQq^jiMyeJ62DT9qUv{26L+ej}tC^Vd?8O$GO8W)ktKzX}G&b9X zs7HgVSndSYOFdUAZia}(36>rhzDn&ixrWd>6rI1+RdW5ayVB^+9X;^9CEq2kTfYBw zjd?ZuI#yFFc-SJop)SB@f-#X$-AOJyN2955!`jN4T;A2n{I*z7MsM3PzlFw~j-UPu z>l+W>GZyU+WazY`tPnoOo3=SGvj1QNjoSESAk0rqD=lFOx@~h8CZe+~$x#`vhnB7G zgHNIb@88$%28oH)u0Y{_51s?mR#Rk*&B19t+vu+`iuWNQ;8*7FS``NQNcCGwxPd{f;q{lao!e#vGq_U^7+)YB7&~$V_zgH zv`q%MY|oktpw8;Ei-I?w2gW)_ryq#EhS6f2xpl^Djo^m%k~H++k$CRgOhKti{C1&g zk}{DQjcy68P`u-6;k{Uu%6$Jz8;5ebf}LH!n|I-hzwF(3S?@=8UUQ?Nf>=%0-gc7m zen*$>Yo^C)M%E4&ZC~6(wO4&FY$ZpOaT05J){B=CDdO# zhtjf4VBa-7MmPQ3L(((5Wg9#v)vG8%j9V8BNslM9Q%<;GVVI!9Plb$m%&pBA-zzl~ z7LaX8Y1t)2%8vUh6K1Rd6#@*6*LOUC&KBvwr^Y8S>Q-e)-iZP)ew{D2Bem2{2)?bt z()CWPY?q*@zG3q3m)Bke|5Z|Akk-7V?2r23os5p#8NKG(p@Z+}$K#LRt7Qtn?b~fV zQ+@!*C^W`a+^+E+5uxtr%uhmG`TC$bYt2IMG5}t_yZ;paWT0fI4jJUuBDpMslD!Du`p< zG$3guIE`;xUtWzV=nYUwSJ>v^lT#`0Ra2ikdn)tjxHs9oxm0|gM0-DgF%7=AW^RYS zeheO@E>l{5m-2*!$|I!){Tq8sEBkP{aKAW1M&;|H|L%-7MDf z@)16S4DqSRK$ev{|A*G_MKR9b& z>?*cj`;|rYskW5$AkCL2k?!VC#pCy6?v31qn@gBM` zr9b1q#kpDbkIFHQ!V)`No(S~A8Fk!^uQ8bl@z#ruOngk9Nmh3DLyb^khtXa4{0864 z3+guY_g#cEkiSrMI{f z)(?O^J~9~dCvRt7`_v4(p=w!$`8P6cek8i~v^6>6=>Q#|(IYRbvI)`~;P1sGxBeV# z@9(1dpD$0eZ)cHrWyKx(TfObhWlC8Qs@7n&;et~HtjwfL81q$@Ir?j}^HIBMJ$Ur+ zypgQ*)N3&JQplA3!sI1#;zrhXI*2v%11$Za0GTqed>;RL>!qbXm3)B#=VOt}VDHB| zP5d3Vd?V2ij=u4|lcD=sZ|0PFRUC*jz;b5lg_+MVeK!wAEfZ;V-Pc=t55hJ*rS!P> zde}UIbADerWto+)P0Y9$^Gx)?3Q!&-wHe(3B8cgH2ZjYtP`n9Oa+L! z;#SM|Z(W_U+PH9SQ-f&2l9pp=26FKrHv6(;Q%<`&KTTOdfB#)n0?U6JJ(5E2GUIZ) z>g)3xdVP)_a}gM1e4&k4tQzG&6bt+QBhsgpdmB!0VThu=ZC%rQl0Y4-;wN+i)YtPs zTDweocT6CpH^>t`cz^WUlGdi3D97(e$)Nb;mA}pirgVnJ@%pJi|C$uO7?0=0eakzN zy@BO>N5AkJE*@ef>IfmiSf^>(K~vMRC(YMFjm9Sx8*(*T>0m#bLBj0Y2cNYN%m5-$D|~-IO}|arL9tW1eYHnT z6~3RaJl2@&az~q}#1{bZlcTRg;tCBkxy<;xxl}nera;r-WL}CEf@_L71Wn4qK6d&- zOTcR3zw9%$&@XZ>y!?q-S?OM0r9>J?|8EMS8ojT>!}Kr?MLtNge{k!Ec^H+nzebsA@wPxpV;S1WTX!jAFbi)Qm9nP=Lh5KED_yO)CNom zEz^wiF@|DQsB`?(;-Sr-!2y`#d;6!jQEL?QIRMCqG?LE8+`se~n}PAIG{Sq|p+SV)3i3;$l)p-J_i zVBqc+%o642uuc}s%yj?w*++jHNZskIx3En&AHi>mCaP~#);b8WC-=_ zox_4zywqd(`3)=*VqN)9fzIx5mMM$@38CUQu9L)tA*lr)KhtP4?-aSA=_L!lOyTB{ zDz9@n!;z>4?_@Ojt9!mk4z{cE;cr?8?(b}9+KSKPQ3N0S+?W1-JS^nJu>s{tU3Jfo zs%Ph3mW%?W8G+^=T2{2-yGSzlmZszjC^^U#JZ_1GR_g`#miDi}aIiHM5=d5GhT(@m z;|13un&vkHMgCAxms3-)w^``K^ed!Gt|=D77dfhJ>_V7#-L%ofBfl)z8i0m!E;|i8 z@zO@j4Bu|@=uTS$5V96`wO!owqbr(5eg)52z^~BsOq7`v?auoaO`J+BJ@d{=>T6UO zU${w8R@mQY6PL?)#v z`J|@n!|bHl7dQ29XY(3J@EzO3|tk43sj-3 zeK^(bFW8~9c(o`77SgSs%7NuVJJheD-e$|bSgEq7&J8w0v#SlepFkX>oq-7E&bS@?A})?_Lk{iy~htB!bll2 z;NDJ>2iBVIzLb$T05kOpkUWY>4#q= zrM&9hY6y?qn$H9@qLE&9If!5DcAOV6f1_I1zES6h#fHK!UYMS3A!0`QxRms&E!;Tjb)7PG^(cjomHpGH;mh)0##r#h8W7#i?*bHCB<&~_F_Y_Jxo z5&i)Kth+s1hBjNk`uWk9#d3yFo(JcNoxnT9hGT6S9;OFlng?czbm(IQShl^Uj{jo* z&-til%*qVT2j*GC;zsO|t_mu{gf9Nb7xK zrt#8mk^yTzDd(#Mh_~(BcB?!&mHc+KP6k}`EqZ4>w-E1BMccnU#HyxGn+zTGNbXa+ z^%^`mxwEDzxXzX`B(o1Z^%%HU;#{;1_{UEWnigY&{tXMx=9RyNj`X?Z^W{5Idtli2 z4PS!OM6*jH-|gLLB8sn1+d}T%S#amH3HHZmVCnRZjmWJ0NVwd}u;a{u52^P%(=-2z zTS~3vKdU8sVz}7^0LEvBJ2{|_{|ZFplFf!d)G@!`GUQo72908BZDo@EI1;%3b{(f( zIAOElZGdDN@4nmz_Gtx_2-JywKT?i1+kYEx$4jCf(!kGq4(SE&6$R*uNONzoGgIeh zCpm#Q6^%Gbr@tPo)OH1}Pe?m<9t_R`yWP)6{VzH;ZOhy%4TbEywmH1vS8y>}_i+y6AW-!_uJuu=AJX{F*VY3Ym zka^@?VHrQ(348`gNnqrn75lr+1taa& zT;Jz~Rt=u)i8v)0i_8$a)X8Zrlx6cdPX|`^wi$F}t@8mh&!J$WMnNg;`xHrM- zi0KNrE|qqsCK;l^eaK>KSaN$z|C~V&!kcq3tDJ}oYD^z^#pAhtp2o9|%s-}*&^w{p zvHUTZk^jXAK$9M-e{X3&;cz2vdWHIKtPn#SXMk;tbcAG&vs>=hi`Dt7iAyHEi$8fw-LszFwM=}L*WUyqH~M@q<(4br=e>A+ zNTpo}eQn~wyMqM{H(K&%>_5-Yg1NjR zj%6hY1&Q2uEk?XuC)D>6V6I`C?GAY10+;c3!hT7V_pHTMmO0=%`zoSGFhDPxsK5qH z`Pf``NBuO2iM&!~cVBBrSuM!KEggn9U;NzY<#O?ZG_(tA$*%Ij2Q-kb{QYX=yEnpw z^5URc#0(`LrSGcxyvbrZ6Dc<8reD53aH>lJu8)C>SuaUdA?Z}VZd%YslbNGm_?1n` zM3h^e0S$~k1&Xw`rJmSAr4XvvCdTZhUetXOBJcZ7n@|jL>wJ&J;O-g-dC`m&5I*|H z(%i}0BsMjp^V1s|At_}#0P1e-25_5c^Kk0XD5u8w!#CUoDEG#zy27*a&R1IOifRrA zv;aV|_tEw-(E44?3KsZrZ_`~_uE_g|oe;^t@NJW#Q-%dsofV9Mij`4E6mo`G_+K26Hv!PPdl(v-+HE9XyP`7P)u?r&zvt;Ip=F)GU z$PHv1`1ddR@}zJsWdy#_-`~!}DS)RGIptT4b-;2d0$;56H*nrW>24~!vd{;BM!UJ{ zqfo=2?Gt+2M-(aUaS1-*cgC8|ttWs3{ocd#^_cMCX<2H_?x^jG{wfJ8moD0_1RTL6 zB!6}#zA)e=brT~c&r?|aK`>R?XwX9PMR33@a~S6=oc8JA9JinmzOA@HPRkFjQSuhn z$8F}CGZ~>TN!;^B4D3t#EWw*nCuJ^Jj~d(5b2CBA`W1M?1g0-In3OGohwX9kj=BRB zLcJNLU&74wNByD(rzud(&qunN-wkG$E;~33PtM=x4uylD4p)s4`tLE^hti^aK|(ToCJUp;@x{g{HXIUR*%9ZZ3OV*OOAB$!M>8*+&$aQd3rEDEM+^~MJV0J{*)fz=P#EX%V= zfRvuJ>@k?y$y4?6N4mHH`bLO7u2;R^kG`Dja(Nr}icHMqdZy(d><5X<;AgmdKP^f8 zdYpZ!QQWnq_qjE!g8l5ORaFq?jcH;QO_V4eC5Rl#hUu{fCmeq9sbJ}W3H{L# z*LtCZg;IICiTRA6JZ7X?D0FaDcKj9Q+{f2B$q>37l=;yjvk#?jE|{0#BV8}XHC|)i zUi|(`umhw|V_8q?Lio=N6?nY-UJRs8O>KRkWQJe1P3xDA->5oB-z|T5Wc*~BQs3G1 zOTN)#Ew3QjoQ^w0F+K)leJ3#B_kfa=w7kB_cYQM$6V&zwBX5rUOi%4MW`gDhj;8zq z${Y+slZj2j0Jw#NCJ5d zx0g}a8`b15-^LSa;O)!eWx@!BRPr5j>}eniUn2Bfo(l9N+)pIPHq)pg%3>K99ZX?y z!u?lbL!*u#saK3}isFt(=SyHXRCS_{rU__jI=u62z5Sxp?@|+^W5gA!<<^s7qDZ33 z!@4i*>D$uZ03dVt+4k4g!)u?>?@5+}!wotlJ)UePvsIsEyC?!L#g{|w0ELw`e9N1A zaG~#|eSHV)otRv$3WQ?qhksMz=#7J>qU;zx1v)+>CMoOdh({>Y6hfvX6<`V(9eZzQ zh?uZWy9~p(g!aiir3l_}X;iOk0F#fuO8kR&*&Mo7%B_yvbxq;eRmfa4%7o);#f2-U zvI_%0yeLnSTO>|u8XRfvte80NzS@}mHzD!qG7ah!K~A!tUczBvp6>&)e1x~^-QBUQ zB#)~-jCt-lO8iP@-0#Z&61~8cANp`=60BTkPSh6?bJoqn^|>wSHJF#ZuAG=OB;e0+ zpkHCH?*&4?(18FiY?p`6I&XyV_Yu8$4hxx!^ebA;4qcYQ7DH7g<sjirGuDDXEJI z8icm!-#bX0YJh59fPIDELOr6fS_>2iG31aB;S)972ViMMw>=5bIdP?jQ{E__e4*zy z2(qjIu$?idX)GU`zj;~v8(wix_9l?kq!!f6cjL)E61SP(;@{t)Fw}0A- z!?pnGVIwtcyeXlwxsS>b^F$2oU)>+#^6jwcc$W-8^zT#3yACyHuBxqg9aS5!%R_KA zk+&}FRZLijm)a;knO%JA%${dF{XV|ii}(QolO8m3u6v5)a5o7JM7+|Tv$XsNMOuK> z9Z0_zShi*gJDI1(SKB@ETS$|SrUPu=-$LtLs56aEgg7?{p*1vrH!6M~FOVgh_Ee>8 zO%b^x30c=C?kU{T%*S8w**I7MlK{Oo$P*5WkAA+(0?d*uL0-5q^9TdpKx=Zm(nXX3 zWok#v!SaP4)1r!U#|mR_wKvt4cWe+a&sB11SNz4IZpqvm18HGmO@l4a6s*_rkiHs(#bh`jgN zOo!T^Ttjjkr_NLGE4$hbb0kUP`=1e#s!E2h`^ZD3MiO-->zk zg+Mxq>f1q`yIG^C+&I+iYN(_R3p{-6W%+VArwpO_(+P*Lz6oVHnIrs^)b_EU^3htC z9^cWx6EF0J3J)uOXy%(DR-Zzk|hXaV=TiNwaX+fO$!F0X|<|+r3h(WX$u&y~$uH@TU&$us!8oon;UR&jV+tsU3oIBV zk^~)GCp5B-5U&J`6~yX(NC&=?8-sxYHd6{tz+zmwBz#QBSHnC9q)xb_VBP!Tgggtwa8BIk>s`7uUpGd%A%a#<)qekc zq_jRj5a5gg-j~_*67+3+1&vYrh)Iia>;>(!-Narj*X4q`KYP~2uzYSeSUSGc(e~v4 zANgutUweI11INW9L~gtHQeaTpBJ`Fo*6T^jnfi{-o*0P}0je=}Fp3I|ORk*Rd)Zu~ ziMrs#)#wGd=i5Mxzj#e*+8l;Gh0!bd`G~cbAllcdcy1EfgLS#*P_#0sM4X54^E0-k z5lzHZ>ADs&(l211+y<||pdtGqK=Hg0pDk%#;)rwB8X@$*>npgW;?L6qVUnCe(dw?E zQ53`Gs=Q`AGj2%}%ZVA!Y^hw?0~06+l)y0T6zJ6K5(~uY_T>U+JpYQS8Ek%$^%4yJ z{2^{1B7WbKUUnp8PaDB;`^aNj1aKCc^Ggm3CnM`r)`Qm_jeY0!kMIxa_v< zt?6I!LB!(E8bDm3$aB?l#lv4ni>qkPJ%k4BtJDjgAfbGC(%?h*7D~EAfB8$ zHOcXjmlimIR1ZzafA;p`0LR99Nr`BrShlTp0)J>dHJ=-fN)BE{>7mB;(XKj@0<)+@_CwE8Tk_wLyM zdWpZcYZafXvU9zNQT3|gLNNFG<=9610bZ=J!#T8QKf4dvCdX~p1@mqk@bE*er?;VLxE(LonHm+jB}Fpfx#c;_=gGFoB3Of^Mu+X{HNA{WQ601ZC==kQRAe;~79=|ou}l^njb zPL8$yQ3Z`3d3TymxRHd_H-5mp@0cBz0My<~)#jfGTLq1(Xsdf7c!n0);h3S!=+x$M zux4kUk67b}8*|=`T=MOE5Cl@}hLIFT@Hpqaf3G{sIi*vy&|_NZ*=Br-n8BK=yn3lq z8(0S|>|&vO-bo<3j4JwKT8`MUnTJY1V*#Q{q6<9o;p~c@L4EP# z14<58$c{8uxUML;@%A8Z!DAUBY=g-26?|%Zv+jd016yxuE>%S4K@7sch5!|$%xJf? z8us^N7q{QZAB}0T%heIJvKT~m&FoZv296OrZaTr7HE!i$J&}a)WJ&TJ?ralp-L+FB z#)eg|4$@!}VLJ`NcqU`0mVf3lnNP`-9fV27;}9z`@=ea)>{A7S-hV~c%TLVRippn1 zZdisSCf~k!NQx0$qJVmQdH#U>SxyljgdY=@Xh+f_ghS)&H7i9{e*LaLUWXe#)*yK~D_DI00PXCr zh0DHeSG1VCufx)IktRaH-(hs9wM8ck#w)Ot_4_%t0gln!deMYPl2+D`vd?uhim|^q z7T#1+v`EqFxBTS6&v%B0{f*rRuN4&lV4 zn5Nwer=_-XJTRgmyN=P-^tLwc=-r%jJ;ca}2D_n_h@|+o#?8h7nHcwI$3CUXD4>1e z{S$wp7BUC*%TB#GbHxz*9iCaAIlr{@?nX;+O_P(I^$-5NV0?a)z^GvTM*xV>ql>Y7 ze;$eA-Kd}$boUZKDKfAPrsXvzeK;8S%Vm~;q}QyLUmGN>AUhYzZ76HQ$tG~F`pRoqC-w{W6u^9-2b~} zO_^4%`=lw8m*nzVQI&hQLo6KeZv6zl9PvV#-roxwGXN*W-SoBaxz7s_B5_xoOL!A~Q5Tn8hWw)O2yVG*a5|M2hUDG2`# z21G$on*ba2{Dvba%8~bPXw@W8KIO4vi)G0cz^hD2U+-dF0(u)8W6%5g#Xs2$U_Bpk z-v}LEUakJf>rN7N`L9)(`dW~d<>owpm4 zL%W1PC&WeN0rSxiOLV-_CLyx0dauh~Bi*#if(9?FF5ur?-UgYcJ;OKZRQ-2)|X11#@h< zM?TT@J6T5HO~ z5&KCP2@j85i{D$YCEm#AXGX3J#xX3nBMClz;As)}&vB=$zr$i)c1^u;M^$?6h=X|Z zk)c*%)kd+cZN-|ORKIN5Ip!SOQd#K9F}{TQ9@SzjqtV|r#VhK9J~OD1xHfG3d;aq| z=YA%jR>cV$vNK!Z*>~h#NB^>tbW@5+RLv0}L>71tf8B)i!QvloP-NQL^Dbn<&P4sA zyOj3@biRZoa@$yV_ZG2ooxl$6FUW*gM2hSzX%cJ$wvwFyn`!A`Qc?Y za}_d7v}cbv?m$dLRZWhtr7GBYd1NU(NOm`Ff5 z)930~C}W108|Q5QzC`|GS02m-+--~x_Jd1zlc9-r#)=qLd&4nIXh*xxpDIo?KoEGX zXaVB={^S@HEA#ll08PY|sm3)o>7Jd;J6~4(>o}6ILw@!Kwh_t%R-tivBQL*=ogLS# zs#{Y_!<1Yp5NkQFDj3M^52dh!$JA=Kc`~LAB>#efI0?x zd=9{IXoTUlE!svDOuV}r>|^uMoy}Xc8u6{sxV!nB^_;UdagXeQ;|@5m0I`|;hW z^iDq$*U2cA-nq!C^ZzIBpk zn=rC$7N7PD%f~o*uwN1!yN5Ub^~TH|Fb&9K4Q>cW>lNo?k1tL|go1m{OTifC#M19X zn}ydE3*xnOu<{h>Tm{ea_nIo7YG&#ROMzrb?9`PIu>YZ&QwVH=4Qq>hCz7WDgyDv_ zkdwvyHgB+8{(9p-cS@}E-3|cQpVc=eit#{`=^>Yc8wEcL?Ft8S;w17%X{)-GOtz6s z%*qKnca)ySb`xK2Cpi@p#dN^lRw{5S+YllCN>1+zZa+f^?v(wWEnA;ti)tip?$-|@ zsHaIkp9*v$j_Q@qd*n~?#=W_h@a=={#cV->XqS72E-^de8p)M;u!)&xRV;5|K2-{{ zfr{`*l#Z#Pl()BVM~wLVGX0wZZ;t(JlzU9MV14mLaQj57?yvqQ&UN_|a6v>+dmJ3t=}1Io`5u`E#q<(=rYoQs6gRHIgh}ac?1F%RIpXEco*AhPp_SEmsDwBU%XoOsQ(d!< z%y)P~tf6n3Erqj-V542HGRPN~B7GFYY{5@8UmrJw)V?aq zlG5fJUNI6YNq!poD}Dn&x~FfSE(8U^7RSeMei%7hj0sgQ&StZW&4(wVdtid_R`amo z1|c+Q!k=QzB)|c=1k}F-zvTM9#CA(sp)e)a&tFK4?-ZGkL zY2bbw9uytwQyb>oUMpJINWy|vU#(fxroG)QYuFVTv^<`s#1$AK-L<kN^q z)U5=jfCWH(C7C7M)u2|`ZRK0RYB*N{VNew^ttX=GDHD1q)M~R&vf)paOL)v9)~k6#}TBi za!+VIof(8Hd36gvJNczQbYU6>%0l>ME5A*WpKS%?IAyevuvLXAdFPb-18$fTl}v%G6C#%z@bth3!a2%z3~z)xOd zR|3BRVQz=>+PO8`Uls-dgRxS#;wW8t&#_J?I$-1#XzN55SaEQYp(WZ+Guc%KVZ<%<&G-^F|=TQ0J!g zV5K109TJNWIbhKti!0-A>dyM%u8;F+y5(vAr@p~Zr?3Bt_O7`EfHQ6t0 zQbLvNwwkVx@zJ4&5vs!Xf&Wb_a_EqCl)@%-41!Uwx%Q;)dC}*fFfp8h6yC1u1)%Af ze)X?=N-&gE0r70+gRioHk6?AjHMY5K*KG{b5(k4t@6epAPxK2Z<{HHCmMb2T4yHCi zbEOX&YV2*Sg%E=ClNFH+TI5?L&V08n!iZT+?f8N4j^$HRUvhpW0Lc;Vae@PHAhYJs z&>|5d-5A&2W_879C5-c%*4Z}CA{kwKYpi;BI1O2GJ>4?NL-g`2qaJ$%!)>|G3YIk7 zPHAOD0nMCnp4C%VN|2w^4nxem7kbxDZo}RpTzX3%s%sYNLM2E-$;o7^>IPcc$` z3R{eLtBxG&lyu|X51s`sn;s5Ca$q=o!A}9_rU-Z(*p2g|DFtmUZ88vS-tPIPb|iU} z+&*a*K%T73stfTEQn(93T9t;Ex*U{Z&vKFfc zv%4v?dnr@I1}Zf2K}OK_F!3h5oQ7`}kl5*5gb2lZ-(n;A)Vd8Fop)<#>+M1Wkh!ln z@Xi?{Gt2@>NKoQi^&MS%3kizTr{?1XL2)ashewa$IduE;8mGb7Fj%XBV!r2I;yMRT zqDi#x&Mj`{)0ble0Mpe5E~iiRi*=<3n=knWe-D2mS;IZkXfXdB7~9EysCy zZdzGjmtBIg3nQRu6~ANVbE4|otu^g=;2$}}OQY8vdZ#SxX4p=x+oG^luDP|E&nJ<6 zsB7mXz~vBLLyD_G6M&Og!Pi#_+f#f=75G{JF?7A~3qGPX&@pMFJZ7$9jZ4_IZa6%j zSZPiA-nYsd9v`Sw5~s3fJs-$Oa=&52YY80AET)Z2f%*DetF2Yw?FMe$1%3d>%+%Op zr73>FDsjAnMLO}w*JJo013hNLLAy6Dhr)ng2>&80s)d0xQtkHhdB5Sl(I=p=m{+j{ zNDR;F{?LE|$3Gj}8+G@{*D{%KEYOYvniK6rHaQ`PP-Onwlo$&jwG7Kb&R+axCQ2;6 zgv$NNgtNj>CyYngXKx=+&g2S6)n?+la)mZ1@WXpMTP@`=sJ=X-1 zelwH%g^OZLC8|=mdH74QEaQ^GQ+E-{@?s&)(_lUL*&=#JIhcHDb4CPl^q^VDsi_4d zQbrp>mMk8`bcXc=$}~uNc#t#RTuBmBo4yhr6uihfTMs_m+&b(|laL5rsvSOKIqOBx zAo%KCyZ76m1k)9_;o7d2!S=)jse=n52sFc@qshpsR1S0&839%>gMmVwQJt=cH>)rS z1pe6=qcl!^xinErul6J6RX@(O;1Xhc7I&>VFc|?+V>#(j{9brhAhbduh+L<%;8U><06K z9`yWGrXU(o1#YQd{$zOGYr{;#-%CZfk5`Ax>n&cWRR=;Z_lx-P8qQeG1xAwmGRyfG z-0C1Dw}BRlS!rr$%{q*HWVft&`Wf6=%)!}j%6fY|P1lF{L6kcnZ-93sD(E7TDYA8NDBruJ{v2w;u~Kxq?Qj$|iEPQ4 z<*~cDhXst4ZI8f!Kt_t7UB=~UqKS=jR zESQMpdk-IMNZkt@sf}De{8}&(YuQWh{8kE(`NZ}bXn@c1bjC4H{9YZvo4>bB4_k6s z&Ym|!Q>KQOe48Ob;#>0|$76iE9;grxED?8ah75a!bMn;N9j$$f0}gW_1LowW{e{*a zJjD!f59L(LA2crmYn;lbqC{h>Z)H~=(7vFN!eI&RgMNKnG|d)Baxq)3s@|Vm)zJG~ z$tq#xi`0#i8}fLhw0FBn${eOQThGP?SEhye+}8O%uz(PV3pE@j>58}N1L{BmQFldx zH-(P`4qmA+q)9D@YxmU-uLD%=v`NB^DY^HU>c(+ z6l{I547o9!r@8b+YBT4VB;4eo{4AnPkXU=)-HZ)rI}YaftK_TeXIbI&V`0dIV&hCK1*wm2~;G z+xe@&#%xsUn0o3;F;-#ve!6`4D9->LVnzynXdZi^x?9CO+qVubJYTtRSI*9zlP>Ek zc+!pR1-IvR%ZJR{LYby4+$eDIvnzd{dqzuE-}UcuH&{X7t4nWN1vS*lyL?`Y$jDzq z6g`Lfp+0)!-7VWN>$%UDwvq*B1R4sAs&n!te1_v~b?}%VT z8{0zfIP~w=#~}j<wpIq?PBH4!xOx9lwy9`6`B_9}3_#|&7~fHgWCV#^Gv?vjs- z(F|PTJe5JcHQeURcMBp;x9qH4RPpnuJwR2ROJor@g+LlsA_r7sTxO9%Zek_MU=^122;6aYwreit9b2AUnC||ZJlGXA>ugt5`mrH-6FUv-v zmmzWz3PNbwm6nqs*0^AxnX{{hS%Ap%5;iT^RI=C~vMa$%sb}2!lr3D>1rxvFJ%e}j zYm78Sd^&ZhopCKG4~k>h@eRHyo%xuCe7STNIefit)@4nwMO>>{k@HLB7B8&A>PD7s znB=zM1%?a!v==&~Nvi_Tp>QMpIjWTws&IZlb0Z3+5)YiMrN?L^-YF=QJ6u_hbb~UH zHgOrIQT-&`7<*f%99-k6;Uz_dBi?vJ9qNUVeCVAMJjLZzqpZp zD$0p|>8Y~Nr2`{`H0BCF#;m+{1n}^fLes%K9~W=-9|}UTn%`Q)@-PlfC}*Sb4`@k# zwun|eUHDFycX~Y;z={N>GwIb{@Y2;i^qMu?jW#YV2bbfEw8RJvn{3Xpq>t6NRn8|v zRMhf1l}~9&Dj6va?_GnQUY5A$I2EHT<-j<#cTEpTdMW|9U}YLb1rj$0Rt=a6I~M@O zc8g44B?!LCUf#I8MGw~|Wxw391+U>5-Ce%9(CJhs>g+|dvCG)dHaVC*W>4nN^;9|B zDC6bDy4K9QetVCPg(;a>G(_E+gUh?1jrlNz$9HZodmBTU6|qo#g^)nk679*Bk!2)R ztBeZ6@GrOUd7DdU(NlLFWMcICpm^bRpXl{g^}$|UN0wMkaUHWZ5OE}A-Fgwxi63!4&2x>ONZAkKOc$l#Cl;m%v+R5Zf-iW7^ zT8VGhgF_TAU~zN)HY3Jr426oW4yu~T`0O#0+Yh%z)5@Yz=UHRigTHBacQ1%_c>0=L zcHji+QPRa@CA3R=@bGD_2%3N_Y0=&>^nQSJdf5mmP#d%U+^xWYT)5mC|FBGcaGw;C zE4OAYau0tqMZZ#3MD3^?Y6M)P>*9`5b(38kXJ}q2*H37Sy9^$L-Uh3tn#b#Yy~72% zD%(U?)DDyp70l_2yA2tnWaC_0tuW&2Rbhh;&NIBA&u|d_4sKXaJdB!pzMy9@Xc1bC z$XGt9Yw6@jo*7T}uG!^X9UaIB-6wWqN|SHFm{yAXVL)il7n?)_8Pn9nPRW4zcFKeO-@_H`2IyptpuqIFTBD&m?qWu|uv%CAt@K zk-S{#uNjntv_`j*;91ZrgS}vUZy|gcLo#lKnF#sFU| z>W!q@K9cRRB&xP{ZWQ`C!HAOYC2pt@inRkCqozdPq%C{Sk;gTRtA;li*OQWVNplqL zwdXyE$G!G#p_j0H&E?PKr;zkYKvL17?WIevr4u6Tu;Of*ZEmq>K^7e(zqqFcWr$+$ z5zK=TM_H6#QG5}Q<`a~<3vQ7-RXKiJ1PV^*bEQ}&?^MB!>cD%h1)Oa26ACHfGGvn2 zio#Tc@PYse*XrI0Q7-#M8VxT_yz=npn@v@t(GCWY((zWq!w}=w2Ja}Hv-Lc3O`71; z+P$F{X}vzcF#Q1NU?p_OkPLBEk!5=23o1kzl@096IG|c1+`*s?pa3pKt9=$(%5btt z=Q86COe6;9q~=CxB}wJS;g)9E_8i++(6#|DR+FeWu|2TBB-59+LTo>%y_jpFeQkk^ z$H~Bt)AO~?bgRVnytT@%d4i;xB2nWTzi1#e;^+YYh(nFV3X!&QvtD6a6iy9ZE9#2- z)kuxpd0HfqPM(|JaY@nQ7%9|NQ7NKw5gBMZK*Y%4fncwLg^-JSSbEX>XdS4U6#rRnFJZ(mZ|Lh9ce2YYi|?szpKVJ%5afax`ip4U!*GM6ii3i16Qs|{ zR)SrUjJ(Wk<)V2IL_60%@D^ZYdhXktRoJU?ffO9Z;L6x|8w+V*j&4Wxxhm0@eg>t2 zRiw|6mq{|2?`%H+jwbpJGn!WiddBAC21Poqzb5#OLv2nxCJr`rdmZSuT7&uwjYXUO zOjjmk0b+zN&Y05gy?s5mi~@Irnb-Az;*_Gf`(rv<%Diaat4+R%X0~ZNtuQ|!QzUve zprcsz05P=GJp<=IouA(h+yq<5(g08XyAi_r0< zsJ|bIfinb%Qimxkhv|j}9FI$)@7WbdV!#Zv|>g-2qSZTaOV@i}!=Ub8!t8 zs&8c6aTCSTMTaxs6Jf(SbDWH8M%C)!~w@ep5w`rk((OtQ1QwHyWWAFn2 z4HxyYV7+&7y5p>D%{#yXz=dsi(j9um<9JmnkLFMTc0Hpgg@K55XhSS80Dup$pw?k_ z@QMK+yh;ELVEYJM#jB`@FqSHv4FW`V11bIqzh@c%&b1;avH^hRj{LwiIQ~*$36$jZ zeH8bQ@6Hu~0AQKeF@kRQY&ehQeTOKh4>lqB9G9N-E@P`jzJ>-*@(%yHJqlJ^CRy?) zT=nmGPvPW@q6eDh&G<2iev5|_{gz{0SGLU13eBbS|07%p19Q+>Y)3^xAX^Iiy7YN8YqV8!n>Oe-yr_dx zed+U46E>Cc`1<9c#yjzQ%6+9-c)t29k7<)dQfJVQVQwcaVMV528Zmn1iQdkgDtjw+ z@n0mFT5T1{RyedzT-cXHPaX#fK8vt4EnlLc7W75B1kc7wUPL##&&*3S@pdaSXufS3 z5s&F3)-frVm2@(bIAkgwg}yHIkdG!$pEaIQL>FnnTTq@{gkIRXY1JHTce)B{e-H7+ z?;cj*0!}|2NO0J9Ki_%gWQY%?hO<4t%AFRfN}8)WcW+7Ee~eXJ6WZ7x3~YbqmZ|kG z6{PgOZhMWgq?XpHD*N2&)xy;KGl>99Faqc1`I7&L zj$0V<)6vw|nh}HUebx}$P@%vJ-+Jcx8VY}*M3rLr-e_LnGk=mSgtW!BqleoWSi9-; zh`Q&nyHqdB3IOK>jh)F~Zwu{?;Tmr9wa%n8%}Y^zjZTWXJ+sDRSTd%1m#*jPF)b5kPc%JMXKK(!LOoxgXxTQms2l zEf6~wlA;FkGg$dnl6I0P)OD{i?nyixKQTvReVA?Tja{|EAuttj%>~6N(UoYk`r_Z6 zmC_Kvkq*;whJ)b4U{!Pa=m+OHscNg29c+j}1J(3H!ReNg%0e5Kw_dCgtgF&X_DcdF z>r?}5@ADF&(Al|2pc~NLVu|kSAPe-4YF@Kngpu)@%}myYac8EhSFHVk?edbVCBceX zXuG!RxjrKM00dp%1*0Ky_@d!deGY~OJZ>_|&+E2&u1RgQa$nMvfKVvk>ZC(tb$n${ ziK9NZK8xEBZ}%q(xo%qAcA1uov8qamhEV1L^K1SnRoH1nvmFg3cPpuZ+%8g;R=BxA zx1E~m6Ro?E?%h%8FHs?AgV&o-NAIG=XOiezp&brLS2@eI=wEM3c$Ts=?Piq% zAM?ApuPP|&G7>umj?@}OQHC_R%c}^ku5JmX24~>Y(weKrX(|hMS$fIUXW}VyF`qt_ z8YBHyiI#~ym_AW_`ReaI>|y*i0stYIFNsq`0T|P`T|qWy)y0C!tf@9jyrtJy*2 z2W@7-o$7q?&Vj+(dsz_lGD(ZkNkomV24XwRbZ0W1VF+5iGIlEHEXxurf41WBvK3+SIW1ry1WU#ca3lL8+5KMKM;WSAm$z1r*a;*4~Bm9L5ssH}ElI{ti{8(f~o}KJ?u&(Q|Rb*M-;BluLD# z7eZIk7yI6W0DIH&b0wjzz)D(exyNX%J%|&DB?oXDKMs$Ic4mDiPCgP}-v$J}7?LLT zTza!B0$7{Vqb*HrFK>7{ltg76*26pbvdM8_nvUhkSCG^Mx4X$n??OT(Yhk&3YEWql+Kh5%k*AX%T6Npd9uhcR=w<<6j#5_uw@#yQ9DtdWn+dnI0V zM#mCxfFZy)C7{V5R&$U9DDk^V02ppt&vGDNnf+L+bI}XN>dP7pO1PCNtW26J-RS#d z9z;(EK-h9dIZ#*_QQnn=KS;x3!ArXt&Qd0HCBy8wBW4~h2!D^3$7SZv1MjhR0!>6u z2A#jgl4zKhmdI)fb-MS8qxd1FB@p()HH@yNrF-Y@pk|OIWR#86p>*CZ#(v45<*AxI z5J1X`I5vP{Gk<;Bb~(JCT>|nb(cS2Szu6GryiT7gt=B9hy#|&X6tP?QE*SwDMHInC zAlq(M*yzlB&_8}H6@r9q-1TE&bH%Rl_=sgsxj1|SK>~y-kx4$>Vsd7kS_d#I$y~`c zGA-GXyQ1EnY}TX#A(KV!bJF7~A_Cq37<^i-5a84c7*)?SElN*+y3geTzmPCn_`_vg zr;;Jw!K33|QX%N4rX zd2%?Vwg7M~%4`@(ooH9UWqhi3KJce#H5+d8SAMIW;q1iEa@}C*IOLe{aCMaam%lRVbRd;-@G0<9;qz*QY0Sb($vu=ogm6MC5)Mmm+)|#GAr0Q34P?VWqTR ze8=^)UXu8$J$op9*V0mZor|H~g+?MTNm^p@8>W#YyeH1nAqDU?nC{i{UfIY+9tk|J z7tg?kb{;0C$cMeX_EQpn0x=WK2_!U3^g(WqtQDBh!kfYzNFgyw-LiF#Gu^EO6zWtq zsJ3Op39Gxbb}-@!M|^@0I4ZwE1Uv6y$1G&M!E#Gp^_@2fm^(6n*y zxuv%0;#WwM>CXNMjpgpjtT|*7)vE{ZrMTR5{Z&o&64eMjz29KLN^n~9Bq38Fx5M(q z2mOlME?r^1&$S|=Hqb3LFE1-dM^kCuvFe*CXldpQYX_#`d#th5HBq)y0>{knF3&Q1 zi1Vf7XB~c=@lFZCOrC>7h?FTnWNdS;4=Y31h*PJCmzzSsZ>VxP=og9%K=BX@LhG_d z@!Y<;-@MZmnU?|QJX?ofdQ}X~<#uIp$dE`X^wdsi4+DsA)79t;t5Dfn>EJ|urQcZP zqQ=Cz`3cu-`}v>_W_ZaaaOtgCV8vOws8NTkFVkF#k)pl!wS-yR(VTCU-SV1Ae=6{N zG0`PIS&`aHce?Bfx_q=RjIwQt;ES%U3#{5-1ddpP;;TrmdpaunTk4k;o0O71Eh^z- z$?H`1cc5$-+m0YZ+;04?0$oh@qt^Q~Xz#5vkRI=faQO(IY#Y%C5`m)TyyP*9{8!>A zpPR)vF1wcV%{Jr%7LM{QZ@eYCg>RMLpQ1=;Gf4AvY!e;8k@Mq`UVB4k?0#P%R9HR> zfMlY!uj)BFQi(JeOomAVX{uP{(^?t<{_-In^SO0=naWBf>?UJ3QiFW`%4^r??Ve1a zK$-}F+NuB<(k7yma4zE@(riG&9Aw;ZU3jl7j@{Uht6|GqpMV%q)BB;_GE)FQ*P7Sm zAVHP_B@kZSBIT}{H}g$bvBr4_q7-iy^sc)T5wK^Hw*!=y1Q@kO>&=G^)Dh?0=H%!Q z?uUrE8xrE*7|~97g(JaxZKH<~66-Jtu7cLU;~{?pn+QyLdort69>nZ{z4$Y(^TJEwp%9Mis@ z*SGc}>GxOxB=}bFVt5|3yCyrkb7;mP+-1O|dowIKlDr&g3&xz#-k}c}r+^#gA&$?4 zh5ZJ@)9`LRmO|f##k)U=P@a&aqd0x?_JS}0c3q8|RaNjs25r`Yp{sGqMMec)-RaA9 zR*I|TDzLn5JGVUsXlyF3!fDqn>&>1Vl>*5DH0@hvP|xAvTr~|9v~vr`JKc1c(Lq3& zFW1>pr#o4+Lqn7Z=NiF&x83d?J8azv7{3loGSv$>Tg+s3oksMZ^R*r%G7GTo4Auq0 zIVUXg+2{|pSKl%^e5J&}W|0ATPFVer+h;7L@P=z`VoLcVZW`;1YtfIQJP5Nru(k3? z*NqgWyL3=2t-^$floU6zk9igGI_yGGBia5*vGa(omwu6_$%pXJSllPX z+iC#Q3vu)HWV4orc!9im7j2ae2-u#cUIF-pP7C4oAcNv{J?R}COzx{S>ASc`TeNCO zjzQHZ_Tf}hn+r`y2r$f8zrY&_tHzV^=?M-mH>@W6^mhAP=Q5DGin%%~^YrEZG(*r6 zZES}1d55Xg7WVvY#2$Dk;U#l4&LqHjdzAKKjYY1GUH?J9DkfW(_eGWu>s7J93LSVO zm6xEtn=tse<~Y1D`*67U=|y7omCX2vdm4}DY{!_Doy!Vf5;}0evFV|E%-R74|4!%> zwM%W?wb$JU`ua8JUDE{^RF{kMxI?@kUqhxwuuAycIM>)Hgt35u1Ir6$Qjy2dZA4lA z4LprV?ip;5%@)0&qkRm*2pH%S_K~UfJB6#9&nj}8okLK zbWqqjq3*CqTcFugG=Vh^&fqjHuB;lb^LZTS2~n=(sB`wih4{y9zT&xkgD*6$8vtFc zc1%+dTbWN(SOt!pU|^fk?DfQ>C&@A~zFuGFdquFGcHy;sz2HbALQhDkXQW))r6hQK z=ClnGO`gauf^&d}E34xkj;pL9o~Jfb?S(ueN+1u$OV^rFa`oFp4*Qs!U?nU8^$8Oy z5-e_>T$~9oi*i}#Ru2pozckXml6u3f@k#GWj*GDjkA`cbcdX?_PJvs8ajvf~;vh=c z72aa(7|Er3O$&GMi*rNx9g?{*1&!G~mlf7Rcpos~I+7Wzn1}>7(6(Xffs}4G+Eq2i zr%0Deq8@Zjn&$jQ&^Ujk573p{JfVKxR)~i3vg{A7Tc&)uI*+4)SS2IM{1 z0&66D10~lSQDqT$9nJ|Lpl*`$)8u$-mmq$VA5_1-c=mN=gTh!3Jvgj6Z@PY~ zj~I<}Ek>ci?vZHO5ERUM`A@g7dNszn=W39UHY|?(lKoICO1E?{Vvz8!+Qxy5==DKFosgVLOz>LRWH1l>VcYO$ae(^6Fu@yAOA}yN zC#@(?v59k8A(I`*yos>9AV4RBRHdzGF1?9bd3nM@J>}iD>KoI#JJ)V#ELq$u#N+{E z9Agz4 zm+JxX@!joS{HY^$Qi5oQy9#D$@j5N+CB9nV!zv+on3d?xO4Iff)aRSpG7n{io3{30 z1k7LwTh8{m+6FP*yJLb+c!7zSV3{0tpElxh;0`EDGT!&>t~joJ4>8G(ST7Q&O$tfY z>@NJ}4WZ{kkA+L|a!^YQ-vJ_qYJGLRw7BB)11ojgF+vA(OV~)Fk`#xx{Yd2Pb*+G? z$)G*KKRdCZ>+L<2Nk2Gx?{oSv%VHu4G?WzB5DV*ov!trGhc|*cqb3xjI)L+0T~Eai zB8u*xJBAN^a8rKTSdTosYiEPH8qK;li#^DAlJ%RM( z44mBTb`5N?5CR1ZcmGly);o}ZhODgXwU3ef4SASa*_OGPvNiB|M%l=qY?LwGAJ^rw zoFR~smLJy@bfzQCL$mLwJ#v-OzS{(#+No!0(SC|pylO2}Hv&84HV5qPTS}iDI79sD zmhU$y3u0{Ggjb@m*&g_w$zOt!GTPM+9T&URI~%$zB?|1m_t+(Lc;k-Stc(Nz1e_6Q zTYMuI-qos34=naBTzC|{M7qWRex|ziB9{#2j{_aW_xHiM?f30C@bcr`3?)^frpkv9av{CeE&;o-GpBgogu>EPQBLx8VrFW8vjXmH?oGI6# zzsWZdq@5DG9GXrTITB((rzaxs;n#fB-uRmk`a5e2@2N-g{4kE{`y5V$BK8#+R3L#Y z{y=-Zgq5PP2!Taib!2O0QEu{rme3Jk8k;nD0Guum%khmP#t?MMh1oe$?L1X&VnJ|X zkd<@}a3Bg<*mcAuT|>H9Lqy%wvHCL`Bou;q$hP=; zZ=1{W@a*b1m()S{y%>)jCw+}WyO5K0)JO=iX2+<`r=WZWDKA3)4KBV zlOLuXOeu#4AZdbhR$}I1yEm7L&m&NGF2c;`x&vbR~&+NndGm-mhz zzPDu$Re9W9p=*f?13v&WkYe=}&dByzXMeEc{h%%+>PE4J;9UUwK_0jht$uKqK(POR0tEX0r3=0J$e#iAXnO{nTpRLOgQ0o1^KyAxiq z&t$qtRwC*kY&k!+H~1{T{3a`(B49%!z)c{h15>QxPR<)zydag@FC=TZVSd{^I7b1e zlLC}q+spG!ObM>n0anAQeS!o3Ep(e=d0tS`rc(@5Z9A(~I0~EA@nd2XF0WZ`5`6o? zFnO=_d45qlV;~Pp=dRl6Q^)2C^doS;rN-^{*2LXbZqj7Jp@A(_SzIU=knV>!8EwST zqvW+q7wlFdmfa=ufXlp1I^<0B*Kmn#JkJfU*$w^p6!;(Gs{t{6}aS%5gu&4 z0~p>1MIKz-15c_Odd3;Zipa>4gpira=89|@xw+Y^t+RU8aZ(W%FSxw|j|AS21Yuq= zZF#pRFl0t^M%M&Cg?BGVtXDjM?$+Gb0ZX7^he#_WVP?faihPy!WoX!FXzxr15Elp< z>neR7qrRPNdDhmOFL2Cm*sG8pt;=`EqexDvH~lR~?`!(xWy~+VrNTNOTq=Qhvn;^& z_I&Sa_Ea+l{~Tu&Nzc0DivxjAW6+zXwwtDRe+^w6&N-Oe5AC7>OBwwd94@vbWG;)R zZ-qD`2TXR){5M5&HY3Kw7S+H$=775QITL3#Xb+d0?=eoe%r2O?_?vPJt=ZpK03Z$S z>ozA4z<~?Ev49Vd_w(OmI7TWDHV@=(E4^6hq4+W&(9y#KC(3Gop~t^_>X1|1hvCz+ z2O2U42GmqH&u}TI>1gEn(z~Fc0qh_p2T2pT>%H+I0H$#9${n9s=iI+#*dTjUdD@E% zoAUIiY`quXI#P}p%Ed>k3Ox*>hcr4G1ilrSs*P@~ROnoibyZ0{ z9^dVI&$Vi(;zy(Vhg3c>q&!*&j#_`WHEH!9k~(5Y(A@I&`jDx&hQOm&pY%u0uJs{z5&t(fO~f;dvosA2Hr6MF#CQay#n6MqloJL%l{xr@(cCl z_?!G6)^|<&zy9URv{(E;EoJ>rKeqFC?T_TdljUE2?EmKDAAcBr{A0iUum8~uUH65o z|BKoFh5qB`zyE5sy8oIFA26tnm-t_uqZ7|MK0JFU%MEpZ|qF{ujQ`qWI6B zq4=+r`G@!@$1C?QwD5(Y{)J)wh5hH_9~67G@7F({_R=?o=f8YD9%kzxRX=>`hPnN+ z{N;xqzf|p)`up$xt=)fYn=k+O@MHf)8NM^y|Mi9YBXt6jf4N57Pg>Dt6yG|A%*D5e zN(|s^Cy2jr~@~6@sfAR!u61N7E#VUU?-AcB_mrvcjqSO?9SY7RKx87-{k5@ z7Fx980pm3gT{I(>@HBvgRRX{j_cx4>-K_DHT}-Ms2^)S^0FhSD}I-e5xqv?vPC z+KHf$Xmn!TaixmHhHlQi-(3qm$Knam34VP=COYzPUS36=xf)W5s<98u@?0eoMk%*~ zaki$kTBat8H#1rCV7zx3-PseU%5)knDEnk?q>;rj<1%?Mj|?N_n$d%pC0riEfcK*$ zqXxZW)vzb^K+0DbOXoQf&Yi6yfEMrT%@9S~YgXR0b{re<@ks-=UJ{TKrxg!IQxi{g zS1%V*yj9q;AS>+i>8Q z1xJy?vAIml+RWht&FJUil7QImU|vy>an@P46a?;p$@NAdeeZ#;x!9n|+sxW@(qCtE zw2kc$f?bKW*QOYed-B1DpV{j?JvNZjt~vVXb2uemg$g`w>0vyYH#XHtl2!?5=W)ox zhLEacn>l`^U{n4);{@`mp<#xg#0KQozzburUZ?~f_& zG0x2gAOe_ST1C^HyEKj4oJRDu^vkhN! z@pM@i_7k$E?r>`$4yAQmt0DJSt{fb=;-}Mn*gv_J!)w`fKz_?toemKImA`)R)oW3L z2=c0_!}2XtV(kYfd*sw+X3*xxc_2S|c(~NiL znH(e!6!LyJK-p#$;p*tCN*YpDW+c8^<+(4a_m5Qc!Wfa-fi^}}FNuzCmTB6JDQRqa z9{WEL>8&be1w$~fI&ViOJldS2qGii-zgz)6W#7K(X~Y{big${n=dBJ;1b2HyalP^s z+TRh+y1a8%qMjFM4GM+DuBEuzDNLQ_H$Cj1A~lGGPiC-lZxMX}6w+}b6^ghoShZE3 zdr_BO^FWdptQ}nm-m-hSnXxpq&J_TW$tHtmIObOR1;tfe8FbGC3*z0Hcd@_hJLoww ziG_5e%n>=(-j1)S=@lXzfy(FQo6?9SG`6f=Yu6D(T{T1!ihr0P@1eQZpl|V71fIK0 zPGe2AZ^}TIgM);jv_D*>&!xm5HzBqK?8WZ9@-q&t$w9ay>1*wAgIv=Arp@UoIc48J z=~R1nb4xAzi>stSP!s879~@UrsKDVW)sW(qX87cu2h>CLhrUdrb((b|h&&p&WN`hG zxlC|sBFqD}4&q@ilXG!Nkayd}t-;{EYajT-!X=?oZW<%i*$cUbQX=?wBuxw546oS8 zsw5vugP$`ri6xDEYAV%tAW^UhSw#V-rV+gf=o;=e>wq{s0wZmhJ72lvRbA|Rwqm4d zL5kPKGq|&5JDvd#G2sG(Uu+_89_ZE2$b`GYZyg_`7y`umYw~aa(3yi5SIljAVO|uw zdhNRUCPd5*pFzPqT^FGSxVV(3uBeQXtO1eR$6~*(H>&FH=7sflZKI9d^yF7o5pqxI zs#NF8VaA|S*)>-k#}#wPsFbU)J?xCzJ zXy!@8^ZHpCLiF4NC1nM2NR`ks_YorGJ2Ic41Wq5#lk%m+c_@Q(zcsC=&}^Y$^+lA* zM|j20u*;+J1EP2$RoijFg5M5Zg^g};JltnYF$jeIeQNPMC|yWz4(L!B0$#YXu^h4h z-{*n~>Gl{Zh~_q?kdTeKT=uJxx4}3UmM({tC1;({4;RDAyKUSb&*#eArm<~;gdv~Z z30-~prQ1t=t98Euk)8!PV6m!})eI`OXSZK4cx^Ck$C-$@`En0{0Ko#FWIq82K=RWS z9nKzM&;71sQNIW>SkXbYs14L8tL&U{6%wTLfeqG*9cSaKS`u%>GIKy&E^Q4Vr>3H4 z82f4DEc#$r(MxQVZOaf^ z57W_ZudY{FvCrOv?eT)F=zei#xtsREVpe9Jz=H7V7ce(!Hi12D>Ir3jI`SwZk26?m z5qsPO8jcb!0Xui1XQ77PI(KN`5sJ6DI1)K#$?6AJG*f+jPK+j9#{5Gj5X;{$=3$&U z#*a#ILBvC;4)w>QS!E^ z%VgE#3J;wr5Noh(5w~SjG`GzJ6iZ<+syWFO98G?rSfum%yeqvGx0;R$!0o4pYb>jY|$%uFnXWU;mzJ#72r(c^H4*O(cBJNhgiUclaG7)S*je}uc22`9c_1l`aCGYuI`TQXaX#m-BR3z391 zoFXDnzde;PCzZHg^xl9a2P){$&|39=)88<1a{N}mrVghN6Rt1umF6G(j9w^iDy06J zE*IpRv*5cKh-(gh06blN2%(>jr&rOipy9&YDAJJSu1+CFWFRiBxAp$TBHw}|R zXiMmGrexlbx2&h0o7P-c-T(#B$k}rZx78Zda70oxM)Fo6VJeACXUpm3e)Xf&)gCuD z6AeYw?x+#8_;iKhz2$CoMpU6KIA@IYUbvbFHzThu)hq^JudFP=r+xd-{aEf1KBi|n zy)_A?dUuF$Bj^>In#gI`VpGRhpAaRA%Lo66+Bt;WH0Jx4&9zyprtG!#!3i>N4{tSr ziZg<1xP%(@x;yMzKaxpzwMjm8M7lF3m^wHe>V`114u#iCwJ*w67euyfViEKV2Loq>pih=N$ zvn`wRcdwpU8qQL_`dr2kq>aByx2o;Et}Wxa3avo~nLE1}>YIDNTZoQX&TXO=W)G34 zQ8&|5CbJCMzN9bZj3`Y4?WP;Wu}V!K@b$XpxRernnBu96y64_+9_}^a7KMgzaUNqz zQVg9vaVMCX49jCT86vFP)^nTQdS51MMCP-7KB!8>u z*9$=ue9EX(z}sgxyi?u8^G-{h(9an66)TIV(c2U8`*_L9Czc=LKoXHx!q0gc9*34m zOLLRzqxzHf<1@#Ty?ntH{Be5_%d?w@h=5E274i(s$;sx0&VffflH8xNCH|W~s-BJ< z=T-?JmMA)Qs^#Xg89p(~Gr;P_A6=2sKt4pkN2n2g9g0TmtWp+38&25KlSo*8Pgdl7 z$IU#G-1~bvvultdT1Wd`MAKK;CZxlm{K^IwMxi)@i^a|OoS$lD zrEn)pUo;Em1^Ui338jC3u4z1J^&x$@A;2jtUYz71+| z!vQe+4tfq|n?94;&IGB4YsO`~P<$|RBT(EEwzxm;=E&az9;a8~n(C?oP~v%>0Bqe` zc2^!R2hX@xE;EgLw&-ICbA7@X0GjN4ytk`*Cn%6;6(TV&QZkkv$D*BtOs8}@50cGN zn&KNTViHVyq=(KPGLdL{x|@g}&G^H0LXRHP(j27v&+6t(Qz=pWa(!1mP4bzjD>IMkd*9!@b!2>P1%A!mq{{+aRm-ng6^y2TV5<( zjA)yB{kjVDIUTdcnjELKECF*j*4>g*R*Jj38&;C^y%~{xDabBR_~N_24ak7YS)~=9#R#jNIGyWx!fLy zb+Q)Mw|q425-v^Hn`jW60j1+Tc8i3=uH360ImJFjtBoHQTFKdzkDFKy)|r)7P95_? z82CC=`0y2N1-}t=zkL7_TiSO`H)V@CwP*WWu9A^CS zqu+UX%iad6!=1%-)u_-pI+Rg#vZhA%2d+^ zjP)z!@`Y1WV`{4SSq8RK%1T9eQ;b^=rD_=!#eMS2H0Q1CrY`S#n$VFU zC}32xgj*<0d}k@}qH`p2#e4R-FKWFlUP?C0y(N0*DB6FfcjHL5?vB<8xzXT66?cdj z!?VT3cO>?kcIzr9<|qBpv$YXYS&%YL(F*g)?n`5OJh?RbAUB1%ftu##!ssdDpL z!@F)CHZ@(GsIG7R-R(}fnA9M<9$lP4^j^lJ26@=n@FU00WuM;Gn5&`!?Eec>o3m2wbXq%8W=PO(KYgjQ<#T4ziu2rPl$@Xl)}0* zc9D3(F->%Rj>VJHI*nKb|KeY%gZ(ArvrXUwJFVcGzerQORK)9kOZp8lz(O^+&fw8Q zAplC~r?o%d>q<#1+9{RS)0HC%b>;ZxK}9Pt-ntBq-ol}rHDNk=JCM|CuHMJ2ZO5E~ zxFZwIEkB9X;ky03eMH=yv_;^y^3UAJ?#}M}tYNqTzw3P8#+)a%9LP1V0rck-;mXM& zoW6Vnr}?$U19tVcLOCHTt`EZA{VHn1*K11wiNE=-K*yd8!Gn5H`U2u(rnBx*#xvI# zN$BnLsX2UTBD9ZEg9~KyE|ljYJkr~KPjx|PO88=x@?AcNg((08p5$2Uzs8_QGSp}6 zr+i9hhKeoV@3EFSAZu5XtHFd5yyf=(7}>&jd0nDxY}UscufwaRFP8?5-uT+BPh6AB za~u1;tnKy!hC%a&i(?F;!#}4II?L1^LFodD#mU>%ThN2P4(?jqiCQtunW6m2z185 z^U0%hOufxmKNWNxOh=<3JVWNuHRzi|`3Q}MzOUdm%TQS8a z+0>8bd0p?zn;fPEHdE&TU2;7cMbYizx+c?5)_ok)0azjJy=!nIRV?^T)lYi zWEzhTi$t&0i*oKrmviz)73jTrI86{oOgtUWX`8E5`}s(;9)h{Te*pFQMwP1#6r}aH zG`!jvgS@p=TFWWFz5zvVYn#;Z5t^qNJzsQl@9nu+Bu0e8Vnr7$60`KJUKh1sdHPaJG>+S z&|`fDy=ave(=N4`VwSqi;Fzv;MnCrr0=p0ayS%S{me=wF0a4`)-1<-EBH`xY;RG-b z+(U?7)jji=P~gB~=1>8?YmOT6tE^RROF(?6A_)QS+en9y^!%I%!$?jZVliUUdByU5 z)ZBriaPwW?X{NuzEOC&JfCQdF!3n&|?)c-di~)MH&8%wkb1XEK0JhsAsoi+KTJl=l5qxbfan9IR?N*tta}-S!4gx9rgQT50t-29@6sM8^W? zg{;ted%VLX=V?R=t+SmyRp?L0+m{hHcB zphQ;CmhvH-Vg57&bx*<8Ub9EuTsUyn3k%B5SI?(sxQKdf1-lli$y$>tv z#@pKr-!DZpZGAD6)ug+?m?t3@EtNRNt{Km0Jm$Nhn?XLb1P9CLhst~hOqy2=H&AG} zp7*GYHoUy?h)-Qb+B-3^yG)Wi*0PgPK2gp#!336X^Q{lEGeD^;l5tNXa`aB6>IpE--@6c4a2;D&;Qd##?#}5rQ1)YyxRgk5a38&wVZoIHvIt0wHo9UQ7Kb%lRJe22%(#b zC31c-Io#4OrptS4sLbjoSa~s{i=0Kzg2Sly`YbM+Sbz{EBuV>jg#bi#D77-p1)vLsiu8;% zM(W^&im>6N^~(8nS$VL6h3DnV?l5;rWyr_Hbv!j$rm4n*cal;MTDm?COyZczVceyx zvQm=cp@kz@fH_6$iQsWtR z)?pK{MHCq6=hp3ca{wyhx~Hlyx5*C{?Y%MXZ1?P}jMscf$JoR0no1qr5(kN|Q^LBU z_?85Vy2ix`8WW9Nc)D2HVSHI4uZGWO8j)t&VFNJKPXD?eBGlR%WU*C!d0C`2hm1}L zcybhb+0R(cZq)W$%$7X255*>Td$$ODxN#YR!_B3t23-~bk)fgkUleywy~d!*=aNU! zLDAa5xuRuMg&eb+BbPBXW*+GY%sOo8GT9bE?_YF@j5*v`|k-shV$ zo3^0Gklqq|!B=`8*YqvkdT*fTyr}2;Jld7&B_BOzFvknQ>m)x;AI4>>rt@vw(Gp8Ow@dy}It!yQ6R?To$2V2b=jEx_|4p zf}x6`CiOBH-bq{uxe))c)x&QA6#(=LZ{s-rw!r5idxID-QK$wSh^It`y`j%Ll@m*>K3u7Obc zRG=q6sDstJ> z7$`TPfc6|w#YjX$m3d-i>uOE#>9UX434gqbmb_(%c&_S3Z=D;L8*18}QWv~V2X7tP z>xgx>m^P+tE@>FqDI#SakNG*$oG!bI0z@U$n`u9vhObJTb;&AXyBn9%N?erPHUBAd zP42VR<)yp8CF`(!<~=z}mxq@@#+F2pq;(OR%%7`5eDpAj?~-x#;Cht6=&3SZ`ds3s z3a$9XKm`5a^x<`3bqiK&(irYzJEIS}2lJ+&PfcCmpQs3u!rA*kk?tT0R#^(jOiQw>$eZOi;L* z!?MT9VXjvcIXFf-dC!9>>85R>ybE~A*%6**9jIPkog5g^Qte(t zG~@y}2Hehofp&vXCnnu10{NaT2sjPjt%2`23HSSp2smc3vT&<@-;S}lfrPsXH(K#2qg=rW~Hs}FEMYsW;Os3Wt>wwId; zMVDiqEZ^v)+VbwCUK9Z&Z_$ZzcGR4n{d&z(iR!G{^X>=8eCJUAv|{54cTUe+nC5X2 zN@r~e?vs63Ux7}QUPEd6v&6DHZPr9HuJvUQNn;6?{o(Q&-+1;#j7a*7LPTK$U?Fy9(uMs(o>!#4Te3krQjC$s>UKXc z>&_-M^~&|^@}LKgKCKpRZ1JT*o7x?9b=9UIo0%v^;qLA9jjUlwQ(7;PS})!C)PWXc|3{lbDN8|K4T z?FZ)6^zgY~w>3YR0Pvc1F!Og=H20mA-y0~?cV4#OCYRM@y$-JlyS%~yU6O7U@W_#@Cs;`$~%jgYoAev2tOo>9M9bJb_Mil9uK;-Mz1FGW^6D= z;$;lz@aWN#(jee=n@rWU1T94&qpcC?&Eycc&n(^#5wjKbTXH>U9qw~mM6Xw*n|dug zsAr{5@#Q?`r}6Q={7dSJv+hjL*$jnW7xw%$zaC!#X6Qx~SFz6Y( zcTUjwdMnK|^>=V0vKa%3iB4V{5*mAQWe%f1Ii=?V&I*cklaI36<`1R47>Ob6Dobbp}z5`dH53f|=)Jd1M-?!+7qUX){OwruRamlg=3IQa-sk=gFv0-hFp z_LXJ{*Fk7K_tGfoMBs1~u^r~g@p~1izZPkdfEnLI~P4G!>_w=Ppw= zfEXsptd7)2R)Z)rQaareNOF95eUlYC@-kTMO3CV!C&LH;{39B;Xr$(5eMaONperxI z!K{seBd*3Kn47KPZ||;*6LD*!Kt`KNX9kCuCTn0AsHU0&{_L9i<{+`-fa2VVjcgbc zTM-m(PsG?f%NB}88<(wHWwyK47Jb)UB#MIl-PljIS);ILJeFL@W`*iIc}5N>&XX&_ zKvD9T_~ybCQf)t~^&)g!X40f-BSlzGFgd`vgw+$a4}x<){&BNnzLc;tieerVWjZF# zY!#1*i`7PnlsjfQd7zTmLZ5o za&w~&aMSd7e%IfS+Ov9HQxnxUw9z8Wz3T=)C|(G!S6of>UAH^S88W>Q-g#c40a?Sc z$rZDq*=*g@*%r1^v^n`2Zc}u%$ZVEf0JR)D@}C>}v^(r64@z;)h_k$QZmn;4@i0mq z)}aA?;ThJ-jI$cndnXUGA#KtnG8op89cB`R+p6GrE%mNlal2Hf^*~EnU##!NL|Zx?+0=vtiDiu4uLjma-@S-|yZA9uxys zk|z*dJ$Ogtp1v70`ra{>b*+Wmc1(tm!m}1OT4QvkGVb2I(50iH`_goC9iG;5YAv&T_U zjk`lx9Z(eww9D2zcHrWU-mW>z&RQ@B{2R?s_O_j_D4a$-!fJ?=XqM^l``Xr>kN}Q* zmsdY{5p={pKCKjoC$E#`q?03jV=$}XcZ+F1uaZK0_b7;Q0bl$ro38hrrCoWQfTX%g z+fm~7F6w}wF-M*r_-Zb;L1WUvkGb2r?4SJ?_*3^RDQ%?*gPAv9H+C&vm+^TM{JXc( z)Pc97DPWa$!55M8AZoS3>9LM(92d zugcxBHsA4XG4tL9l5-2&d)Ae0JdDE=NCEf}KZv%+nF+zhn-d_y%#Eszd9%p!>ov~QKFzE+ z&XRIxujX3E8LHe*CxCU^9oQutD);@l4R3maBX~uHfc81-?aB?z(CtuM@un4Z#C<0d z$kXzo7>g^!!SdO{!Q4Z9|giM)qr{ai}3s`hvD-p@!cruEX3m2jHyxwwAKfW&lju-dK&B70ca=Eti zmDu?-w&L?}^@A2}ptSJ}TlBqPyj`oaLA9w!3NQ=zwjjROSNd`b5AB|wsvIsc-4(H@ zPFKAH*t3YZDA|gTS^JW`xqc~*JQ|Cvw^E8&@{W!&kSc{nZcjOi?S8_UP!%)X z3dHW*Ji*A2v0I={HON{_Okug49Cx7e9^Y0dE7WDey{=d;G}dvcuzCr1@Bw;b1#Vtr z;c@y@Pj^}=7MFkqsu_=WnyYG87|4|?@KFcgELoLPg&VXnqim`L?ez^Mcm3U|BgO^3MjN z$8>pLdI)`i!t6e#TQyB!J(d zdHPbk!+S4e8y`3>VJN@dP>Rc=5yZAsYV1dUcitWWwFr8A=HMaG1`yQI6UO(+;n$a= zR`5_aX;u)?0+TzIYl?6|t{LwhG~TqT21<>qI^FDhW;!?G2He>BTIl?#sZ*mKZcQtu z>+uYh8@wU5?ABlBTL2e{nUBql&Tb9jBH955TEKw%4j<2?!!6-2=RQ7b&bbPdGcI@o z#%qrcYK`DU%x~-7KVJ473ChD=w0E4bmQko4uW8e$rd5osLzeF2mMINyMTAn-mhoxo zN=2{t5YSHsTh_Opdj;pz*?kVTm`|zOqS>oq`1ekZGgJ(n&x-O}Lmut~d}?!}T7+Dy;!yx-s6>Dl>WBGE;!Lvj_sKFw73@!VOS zNuPy0oi{7ofD`zKC@R^M=W<1_%b1$U%JSWpMs1fGKjw&GNMN$VZsb36>%`JF{DGTu$ z*H2tSZ`RgwMNj1$JNLlqHA#Cpm^gH9B$-fJ1_|h`T_Ysit`VQD0J?Mdm|&T&Kbp6* z_44aVuJ@dRH>fM+xhMlX1GdogGP50;Xdt;Ogq-${AY6Wo$OLyNyOyaVWJF$#KWq-Bk;9 zU=t{XJ3NvbtCxeWL`-)YK5ZH_nN91HV4#jM=lHrl|gCuR&jaOt&i>Yj(womzVe+@~q7hO4`~3wi0Q zTZphE_=R(O3b))eg>pDde4Qq+rQzAg|^FY6oIm<6NBq|eJMH8EZ(gLcDSH%V8b=1{lHOZ&%4 zjPV`98^Z`spfoZVn{JcB3KmGj+n$WXhOfJMSSoZW3S=j=j4AQP2|8ya=*O+{y=Qx! z3gHhxs)Nd9yDa5FHZp$Hzy=j=>UcYb@XT@fE~;p@x=k}@*)TL%bq8h5I7Pr zk{k8e*gjfQN?PE0t{%Zm{+d=oyX1M@>XbWe^TQx&jN3;F?wie@X2uLU`)2QgC&6=u zeJ(6{GUR>SckErY2AvN#-Gm~fN)JJ8iUT6;>pE~dF=tt}^t(T;McyL^%EIKLWz)+k z7xjbY%g#y)Wo>#yF7tX})`?ctYn8Krvq=fRKf||t6FPU?WT9HD9eXt{kiCjY4bDkj zBdtA588RHqnA$8`_qsj~m4dm>0LkbtEbt9Tnw|2dAoODxUvY_PvGd&Pr(qn3YdCkrJeLh> zTiwhoI`?%y!&J{QQrDUu!84B3!5EII^!JSg5O3Ju01&k2+mqL?@9_WpLgnWKg31s8 zkRhtu%TiksfHvUkE0`<*{^ngw@c6?Ui1^e(vAIcSq_Mq8=WCtz=d=&wJniFe&Nn!J zbMWU}1MurRo6GNB>-^;hdY+NC=x8jN`RB0$$Yoyl{eA7y1r4Nr-vPl)YhVYheE|ca zoZt0n_|7CnhUH-xok_x{xm=nv37sBE81Z~wW!P(6nGL-^?~2-h@S8VMzaHLjGms!xrE^UnR1tW*h2$@T_19BC ze$GSwJdD7363Fp$|9t!PB#@71|0MY3Fpx(5)cw;*AfF#>Yit(WLEU!S!9 zbYvd7q20f%<*@(ow^{#S$?6{%p8wT1v2uJt{rU^-4-7~BwnpVoMjC&i{ufVC^!exO z(|^Lhj-k`;Rl9%x!|lsYT^PRq?w2wAxrjdn$)DvkF*QH2)B_g%$^XLs^WQwzd^O60 zGpP= z|NZx=ec99g@Kc}vn)thN`K#D|#N-&e-%kEdDNmvO;e7to<5%9K? zul@P|lJlQN`pJ^>T}=3m&~#gqFY8cGzcSlj8~V2fXr8U%leK34dX z`-i`*>-YPQe_O!sP0%kT{9;|s{ND{f4u^F+I{BCNbemu8-nVN`7%5-m;Y0(@Vo54YVhC9ef&PGQEol{@Xz0P`p|xUdjG~#)jx*n58`iK|MBpY%sZZC+SBQ{)*|^@BXrU`TrjO_(S6B=`qNbZyn;L#qps%ADr;z|8qdhk7XJT0sZQG ze`tUB;TN#*Dd(Hnf0}?_<^CDe{rv*MREzRo<^1G5gyk5NUkz4Wu4OgMCzSnt_3ED< z+U;j3_^G!3zWEt#{xkiO}|gBMbY0)zyFM#f1T^d@TXs8`PcTlb|30*bjSabr+I() zb(fceEAIdPcLz53MMZz7-9P-e|D`@0+;^WeKm7UY*nZXQv(e{-{m z``4u3obWUKDR95E<%6z&O}qa5R}k~H_`iJj!|<=)9m7=j2Q$Tw$6vwC|NO(xVE4<< zg8CEc`I~$nV|64uX~2*D|NK^&hqnEu(4PuAoZ3(F_fw00)$89D|0&|93ceQc^}~rZ zek$TOjZ?n=er^vj>xUnH>h~{$cAkOx^T7R7?IEQk4<$*AX{{W;YyUH_}g{-y8#cl)K>+uu3!U$T7k{I~f| zG&mfcJdw*cal|i~|7srow!U8(j;~oh!tg6~In#E3b+`ZYv$6c9Xt#%m{LjBpo#U&Y zH2N3y{HtpJz39{rbNO%WKmD=(x3l=~_x6{d)KUMx{nK}Undfh(J7Y+n(9SRE{(eO0 zmuS-87V?Lr|I60^6#s>${)MCdg<`)3puQDEqJ9b>9i`DHZ&e>Te7AMyI&{eVrIia!qD z{WepNu2N0bbm5JB|}6{PEcTv+l}9{PP#Cr9^UMeez`d zpVL_Tb8O0y_Bfw>{q890PiYdQ$)7#h(R9nz{+{vp+U0t058v?*%jEBp|2Ks4cV&G; zDuw@jQu$ML|Cv~RBiXm)@>|LNj$r-=CH}2s-v5Q7zA2gCDC55`n$01a%hdd3`Qaaw z%2VK+$1j4I{~wggrX9tH@ua^gp5H3uzr4sq{jGp{<;u&m{aC$-X7v-%9p(mGup&7ytK3{ZG~XXHx%-WZ#nd zZzcOXQvV;6_zkK5+l>Q%w~YU))C<4I95w&vuLb{CknsNjAv|{t%>NL3{(I^F8)EqT z!v4?7;m`H`XM*^xbl;N1Z>IY@qWB+``3+g*zbT8~D&)T^jN;!4<4=YDJwg0xQV-kt zP=9S{&yaU~8rr(wzhQ!pNB{oAKYaq9r>#Ez{loY5)c*L@UjM&_EdH(Chwk71Vd?%| z^8bc#|E{dx%Qj8@@00DHs{7AG`y0u=CE4Ff_ICvPKPd4Zmg{en@n03|Z}YmZ1^@rq z`}h7fj_h0*{d?m}oQ}u8fYboc*yFiGie^lal*9~0G6X5h@%BqLfhO4_pc{j3h~gwU zpZ(Oj)~f0P3E7!k&KvIRu}Czk>$+-Pp7pH%PIld@EoU3-$LO)2v=5^;68rC~|A_sE zuUWtEIvc20NS9K74_{^eq44{~hF z>kKx3_9gnpCLb>r%lhWxW-`fMWcNjrJj}9mCt6+p1F@lS7kMsPaE@8_8k29MT1qE#&6ugxj5T7ICLub+Y{fR z=GLk7%|)A+vx`YRU)at?U)rXj^5pLwxErTvv!;RQE@BuL?R_@Aud?aY*BDs|L4`R%w82&+1GB5|JH5RXTSam z_UqTt9=G2OzVi>ye)Ah})8Kbfd;GV*8vOP*{A+IZrlg%o1@WF_kT@&F{>%i-9T6Vd-MV(_QjWfgnzmf{AD&T7mYi> z&+MNpS|OwefmyS zT)KZGmtYCe!3+K^Ip{CzMN5BOJMwr&|HB#$Cn(F@tYkchFWxxeNVv2wK~83Xlwjal zG5xzQ@WD@In|;+468WmF;g;C+o=-gg(=Yr)V~Lyp>&=T2h-Zh!>uM{`ah&(db*XwM)-$^G??G~{#UBQV98PUe+RA| zg8Bzd4?r+aR};cMz{z*3Q@WUOVmu3<)TG+-Tu*D_XVVP z_?KXVaFf8F=5X6&yFr6vYH$F<-pk$9A@cW{Y}MeUSIiePHw_J9MDi-ToPX2L=J{j^P4L6M zYd#TWYj+zC_tyjX-(L?nF~$AwZ}5MAi~sxk?A5X;vT=Rg-Z?Sq+IUs3+_{C>7`W{* z@hzVe%XvvKLO1%GWnKY_tF1FoIk0n6xP;29m0L5nRjynkb2p@gyO#kF)VfJ?EzR=^ zatiq7pW?htw9`(ymJ@0Xp3fHkrScK>av|w5nfnB;OM1@+y@hwhy=6f4RCYM@7x%XN zD)-k-3Lu8Cv(>aDHv5 zts4bS9^{dA=fb@Ofps$&81~lP!9Q^hTK91?Bc-9cTxI3Hmb=&9x}MGQ>SpD3-N5uT zzjER)o*S80*N)8WAS*sW77J;EYu0$4-$NN>1aeK?yK(rYgIT_SNha|GZ}*#)NB{qU zo$L%i{%?HvGnMBB z&3^Xv=qq>P;pN&R5#I0-Ptud@ZBebB$uD*uo;}N=A8DxX7HqX#)Qwwyw|Nln=T;T^ zcUR;es-kJ=96o`I0|wzo%How8e^cMVUaXflc~$6TN8AJ z#$SZ)Piya)@0ZaP<&K%#SW~-Esoiyrs3Fqb;bI48vk20q4UOk%byoF z`?J~tFvHgC|L_N%$OM*L-Dc$=N&`r-5+C;e;iu*D;ix8RO(X9k?WAO=*CY3rK; zv_@)dkEA}F?sjjTW+~f?F9_GF6Wudb{1*5@Vl<7(4PqS(@zk-Yln4<8O z0mIbJF+3uZsC(fA42?FHVDir6cp>mo1dMz>yUXuUkWpt}f)g{_TQiYkawrAc*mZWY zS}tKSK|uQ*;*D3?`?f9JKg$(#2o+GjMm+A+-U!bC|Lsf^&~TCuNcz-j5p_0D>g>`d zrlp5OfU3USHgWKuT-5D%!iE08`OFzu@Por-$N0PHv|| zb|~h{$*ub?FEpk7JM9PU7m=Xy>?=wC3tHS&=eDK?KGc|9n{LnE_`~{OD`QM`0<|qQ zI{zu;NX`p7Fb_0$Mj2FVPTnOaSoI%lW7lm$+|^4s_RDCf0egsYD20l@#aK#uj;Fu44lq5xfpMiNwIWFMiuSX*PJ7lXvv=}{5~1& z_S^3NI-4}n$;1YJw39*3tM6s{EOdJrd>x{d3DIPF7~g7}^e~W5(!WGQ$^MxygBz94 zL851gBl2j^FnK-fSNf!N`=wuX{}&ji(zX3h`Mj*)&wIthbubTB!>O?>C~vJqK^KvE zd=xb`zOULmy2X7{;wEzE4jzk4Xx~ao^7>Z1l!V^g%<3yQg?iz#ExoFoB{eV7@(AVu zTXJW2xvGYk{}y)U#K{`8Ovbkb1g|3@0DojvGF#xIWGXGn_S&f?+=#sAT|Qg!KeB*Wul5 zIl1)<#I`iv=QIe>6Qt8J!`aK?Hvd@GOW9Y@u{AQt{kX4HY06#ITW)Y6|<1mN4#T2Qqcxo3dJ<=XF|f|HmE~B5N{7XAi7K+U{sZ#`~Q=P1~I6 zxx&t;)yUJrX*v`5JkaR7w!v=hv=3N~r0>YdmjVa6T0r7&1Dp>|d9>z`+x}`umlZjT zTz5fH4;nkF+w%Gz+iE};a8rVl1?loN-X*S+I&o3AWZvM2)M>TH*4G3gE-zW*^$tPn zQv_TEH%T@d#8K!f3H%%nG-)iPrQ2#{15Uq=`*FW&$T-Ajmbk_=tJ>}H>c;Iq7|-z% z!Xn{xe3virc#)?~rC!aC27A$&-B(RLD^eZlwpBZW42?8k#;M8d1j#%S=S|lkDr3g0 zoDN80?ailP93u+occZn0UK`M-cw13slFovzyOT1mMY1)01!w&=IFR-}ccnZ;sbtIo&Z2I-^ ze#Z`yuP$*;tq%it@sytA+XdoIuw|30tu70`Oppqyp##RA3vY!{FUarR>Bj5wW9%%P z1)g$II&FXW=B0jtYpQZ4x4c#FX!!;pWRs*0g=kH1CWm)`6MQ&m#FoCB4tJv4 zWu&UrvNdN*p|Sk zF!K9H+R}C1x)nIh@;b%bQKSx9S}%1 zXDGtq#BcKSX{;-I1$v6OV82q05SE}Iv#7geNuL9XGV&O?{R-)T!8g@E8>*{LtD?Kx zL`yDB!fZcoB^4wkU2cLVg6#z;=c$MW0nvg`gy`|0TA&`q*FoTX?)E3G&(o*)1tgw7*lhT2+?HxHtbz!@T6GI*u*V9mf&PbH-X;=;nvRX2~h#2i!s^r zCE#v&-i|0Xu%o67yWFe#rz*yYBdK?Dx4Z&b6R!~qbZVcJt_TF8dZdnJ&4F=M) zD3*lv$nm~|IdIYq*opv|d{-bi3xB3%;})rr8K?-d;Ku*Do{k{mu`JvY<=KgUNt2g| z2a_hu`>%>g4kEG0m+o6&z`Hgnh6R)1+H@NkBe3qwKF1!q9WD)hsOr0co2pND&gSel znG=TO&>B#r3G{s5LA>&o^>CiwRE67W(#l=#HV%Em^&MQiFy;xcMuMdc9_7&}+i_|U z&(z;_hvX+wMs!uUy9^*tAIKNx`cLC&7H-4RIB)a1K?s&Kb4YNYsk3O@3Ovu?K>+@{ z`9!mt3|4s=oO*OR7UYn>DsQBrd|t0AG;rsuDXlD8R=}iJEZFY{A3L+EoHl~`#GhH| z?vyDG`V6B$o&5l@QD@gZbCWXlBN^y~VkFg>79edwet&?0+~r`j%moTD$ZqHJKgw6+ zzr*2h$C*a=uKSJdSsxsSiD>J3MkpTK?5Ic>N1nv$B$(#J{(UcmWsw1r#%BQ>ZkjJz z0zg*xnOnXo;|3uvFr1YiMB!;h8P8B6#vMRy{pF1Z$p%y{6alRZH=p+yYIORG+h_m) zEXpN2Y}}-R7U5QZN^rAVw|N6}NN*_e@-w<6YD85lF4DaYd)fjVv%)5@d#+c{sgKeZ z(D>aXXN7x?dgk`1B#XE9bDb7*LaV1xol4v7qkwk#L>}i4CiK#o+AQ5KwFil%8>3pK%g!eCZVF3;_x6SIR7|xJgog8V1S|lGUz5AXQ zb0WS}*Pg5wPM@2gq5&Ay4btt_*;NgGlDk{blJ4?So!2Bs*bhzq|FXFqZM&Th8=h1G z?%uR;iv!}0jBDPA8lQ$8aeuXhBMt7dmAkr~wc_524kqZ?97gTV;oL1~80f-X<34n! ztb(n@o6PNqvZ5G}4@Y9c3T6NaY)o?}U}NE|I$`SWMCcMPpu7rxhgbXU`U*(p;EBX~ z=4~JV(4PonAAnGy5Oae-($s#ZapxL!X8wB_LSuHM-(HR1U(yYj3z|~5w_O+9WbItH zjFBbrgK`AVBw$%?6#GaF#5j|=Y<}6tw@xNrf$I&Fx3+NS-Kb|dk;j*~Cjd4}2{Bjq zB$(o<^2j|jGPdd^_8I`L_yNBY&fGOL3e(~Gzghw=c-5LS<%fgAhOSKi?6wl(z%W)( z&*82FihNuJnjPxpgmqSMbXQI)Ku!~C+Rtf7gh5^>ouKzu&^A(qB1|}td*C6LpqXX2%w8hqHLWlDSJKc+Ptrg=^8Z|IGk>sw$=#*IYch>)3nU#Vf;!hE&_VTM_A^D?_9k2UT` zLU`kLmalXX9B_bb=oExm6-r&#)(4t7a(u#yOH?1?DyUI_ngkn6B@Cw9q5xgtsZ1z4 zbJ&uN95!%4aHr~uRqr`j9_;W}$=HK3tmQR8HJ~TE8W792p12t=9zt7=wi8|9z211g z1Dx*VlvGeTsx7gWkZXfqjlT9X`s4_v-#~{6%x^*`9K(1JHjIrZbaA_*+=|->kpH!Gqf4$V^K(ug7B9$fM`FWw|VI_Z;JHjiMd+gDRW|>36m92 zdSAMahd0$~2uX0ww-8+&<>kn&=ct&jV8TyOao{D4u;4rupr4?XFLD-a4Um7JY`H6P zDK2EOxt(djU+r&bmp@>FlZ}pf3u=%@W_)0oKL{9pvi4^Kbv_iYdOLv(y+U^cUq>KA zp?1tP@Z4k+T0l#~c23kP5&S6o2B_MID=h4ep};01e$Ij!941bs2Jzql4KN&|Os3up zAtiroP>aCCBR8)23K-z0?zN;rdRXf{-wEn>;Jcrt;5tO^NJ#(b&FmkCav-^rrRFvm zs2GM9>2)PJK2GgGZMFdkswL$| z=#;d&5}*!)wuSj#+?#c|7N64{jQjUl^yeR$IAE!m4C#p+Sk!I#E=Tqlof-=oh6<}}>N+%)YRnf82wam^9?c0tnT6NvGQ=o+Pd;iVfLB+6YRBU4X@`@TOP zYdYXwz>9s`ABcC5cDhf2WJOEHGW4c}o!HSWYA1%z>55ouSJge(a-aXEqGX*QEz=_i1LA5CEd|ZwxiM21A4l7|Qt4Ex2b3Qd6{9 zSZvWDDe@x-Ah_r$ESPugd{7f~$sn35rxLd>TSfHR;qVXH50Vb^naOOAnI);!Fgfqh z46AwafHecA%DRtx0n##D6ZgT35YlL(Gc1`~=<{{-GOYhAupG2`a)8Qg#O?z%>Qcx`gbQID0DpF2ycQ0qHR zSyv0bba!AuQ-iR4a*WS`o`};ZxV-^uc;f8!2DbRQeLA=-00jd$xjgJpl=i;PDZx%I zbk;YN^Z*{&WjXoaRCWj#@n0$8pnZ*&%|vC4-Un`n-Vo!N!^twg2IWUQ(Q`MMQ;D`+ z%GT~HHV^H7$jkxl4>rwB4S`mygJayAQ9oiM#|xzq&H(Hhus6*_Y=?eja)H4c(DsYk zC&WqMyx>*A2n)E!z{j_2^Qx5$b2n>u%%s6PVE-f3Y>TIG)#%Qr*avt(-E3Ymi(y~l z&nN?N$u+)j9wlnLewK@;8xX@hFOumx0_Gkd8t`^7x`=oz819ci#<-4%dc@!cpI$6C z=>y~#&Z6_;G{cW&y=pKz-Lj*AY(w(y`8>=T5?25+cBcqd+82%XD91o1GmOx%eDp6k zU^3MBK#sNtOjQF>J~TJ-C8#K9U7+J${m~XZb?w8CJZ8irU(-ejj6^7w;x3XKyi^*n zy{n0v*;_R-8bwdjE+hCmA^&JlaR$3)SHLtb3KZz%qF@YFRpd)%t(h7sm>IzxAlunv z#`!CN%P47&qiu<2pU|NLahHRTR);yY<4m9Y`kLy&0hJ49JK>}nQa=w$k$t-bbZ*yGtaW8F7uWXA1Qk;63Nsk(tk4nN z`T-_pG#dT5-PdV5Xkn{d6^-g&=mDE6-i=%W4O;&g%TD6e-s1g2H>Ttc0F@(#Eu2=d z%ptu2Q+hb^FJ~UzU-Xe{C)a?e=>Z^)fd{CP06`$lVW%^sid-set9uhYp)}-fENu&w z*Yc*6x^_8kG?uEBn@CDkt0_isHOs3HI0Y1$K;9&OSn_KsoCXY|aOJo*yvX5kHsI#N zNzBplqeBcN8edryx`jDufTNE>O(5ZGRFWx5h^S|tSbrAKAu9(x&{{C)$*>B-D?#{i z#oUE(9pzg}nyG z-!IEZj-@N7zBRMFx#deugk4U}3P+RM9;*Vw;PnlMmUTmaYU$anmg$$uIs3_!nF?kY zR(e2l59r8y6q%v|MUHuhb{gejY%WkiaNX5}PJd>uHlAZtZYpofQ22IUw9L=cdEP#W zJ#^0^*oN*?jDI$)Ly|fMnMd3PJVIkBuZc#&x8-DFfq`)f)yY$3+lL-qySvie3&5TR zbYBo}$wzqI)pN$YVFNJEf!lac;?>P)*(czSs7YWV8-{Aka!&$hMS z&Qas|ernydqJQ>H9UY%N)SQhPs;qJ?u`X4%eg(hh?I$rRcodIKN5rz%%Iy(fUiuc{ zChBX%lLBiPBFH8+2b<)~lOa-if$lS(2zSq#fd*s*|$? zfgJ(?3m(CQDH`4MB}z!wznYtnFIEk)6yA1T~Y_Sl5r6$P^?t#)%sM6J2g-H9u%buQz-!P=V60 z8+Xt};e*w+wcSdab_-12M$mzAxbmLSuo|3DV3%ChsAYr8+JDHh3MDt+^?Ysei9`87 z8&`Nx{Fj|9K^A1VpP?PPt(yY!WjJ&cbd83^(drcAT&taTkF(X``<9g5LlIH8g0MFP@5& zh>71z6XP^&+kPKLmQWKxR}KK#V6(z&*gXNbnjmi5*6cOn6KR1lNT3Rf2&kYS^5NP4=5WXg)6e?e6zk?!=0lY&J znsUG6dR+dZPo4n2h?C2L)UKHMAal=0Lp+N(LdcTwkBq`2o=?DA#C-fU7#=>YPj21I z;Se^8+SMlva&A^mKr2onl-H6o3V#45^pQ4&^W)CIi@k$WZSt_LKPVE(Z!pSI6!Gr9 zU~|k`PX{K=1gv2C#gSLI@Qi|`hKiFr@^5!`PmgU+Qmlo9zSZ`gliIo8u59Mv%;tvv6^{js*Q#} zAM4r5y`^3?K}Qku)a~fUfJiOKLx`4qV>QbwQ;BE<;RqBg)z!>4*0K0CsA55^2c)|O zc{Wt9{9)AARGC64B~Ih6Iu*n$dX}#Dpr!NyI*i2Pd|fK(mc8lZe4|_jkY;Zf@{HKP z6`9E@7!fuu4WNe=&I6bQnh`=~p4W#4wBeI_BhPe=^4WE>#ObzHf#SP0yg`EnK4)y^ z8q^ea;%7Jcq7icEXzsjU$C*P$hCSelx7V326@1oM)bDPn7Q$mwG3c#SgNs+ul8pMr zDCIy^PmtNDdv23)4M3Ad%tZN;ztUhUVA_MYDNq|pEx)zEYPrVHT}5ie!2QRmp7alb z@1m{@zf=h3^?FCJ**H1IzYxjOal8Y*5@^PAatjSP1g%$OOE^zF%ZFS-lc9ku< z7@v6oT@G*mM)%O=aGtHbl2U5RW0#ZKt0~G#dpR9fs1sJT_uz`C)uQyaS2sWs@v3%C5*fY}D1=N@aT=Z4Ab{&rht`9|8XSusieXn$<_J*-+ z=D=zl1b^%a{ja)JaS4N4b+-OiRrn@vw_yF(U9H~WS+hlc+70h*=!dTO=mM6OHou3H z7qB$*Kj9u;ciWmf`m?TEY7Z~mb4s*#(!lX}Z*K(AzDnKc6Ck&k`7}j%w zc)pq&J`7o6+EXkuGK4tjfiv3+oP`o<#aBYIB^#JaFiaG7VS})TMbc*#p(u) z$!CKwf-Bj&q2KWC8>c`ZdPah>B_+)~{1QoXb@RQN8{U9>t`#uDk!Wf%OoL)vOHGFf z@7+EJ$a04BnBW-V!q|3?8*+^hY6k)+Wh;(ClQ=Bpx45LCEKZz&OzEYmVg#f|ne;ni z@rC;^O4sIdkrH&maZ*NE9V8R5+d1MDZtH1p$mobBlohx&9+8%^XEBc-Cx`ba!VWe$ zRB}bzo&H~@m67DYe_v~pr!>t-yz)7hO28LF&WYkK6!#vw56MFvGYWSd3xCaVv}a{| zbA|Fv9@={y@ibefaW<(pv`_I+QC5xQ= zVj&cH)9ejH0ryxXr1jb6VaoYt`n7>1bOP2Oy(xXBlwLt?LB{pnnpy{;oo}y&=bTBZ z2?zmux&aAsa)6h~O~Hs{0(@T)47@WtlXVrFdWkxU|64xl{~hI{9yg~kV#G(5)>MzG zoM$+f`0pO4HdfO(VF25C$THT`7-xYf7@9IcK-27`eh~M$08?E%#jKHYLexyK0G_~I z{a`jTq?-)FePaLGvy5MxZJi$-{PX$#5N^)l!O?Jhe15vS4|SWjz4#=|9{`nE?->Tz zFsYuwGQlM4b*@<8Wm)$^WOo9Yz_*?W0mdwJG0B>pX_u-uB2EHMvZ>MvhC-!YDj)JCpJ(;X^oCKQSPQ^< zyE1g;%N>I2O*=ZEg9JPCUIFz6Berw?{sPn*a3KhoR;3Fgq!Awu{&lAMtCujBJa#;I zjd$PL6A`{+%N~OBXvD(?xC@lMV|8VI!|JQdY_NNOQ?0y0lemkGf!pzUo(Z*2 zNTbrf!UqgagIEe48+5KLn>Gwx1QV$_)F|YzyPhC{Tu*Lm7gIyln70%{(>}Q6J2^dm z?WEfHZ0GRMxHm#7I$?nGv;~@)Me{EY;pRLvvO zS2wvAH_}zbPXt(td(wg|mktn@h+HD55ZU{#|J&-#Xmt0o<{7Ei!e=Gdr0fd$ex#_UZ%ha_ zuae5UN-}DFeWj`O4U27KRE&9g1{11^y4^{0!XzJ6!kE~W(%!|D!e-nO^|+cbv)bx5 z66qlf+&hfyNdl-Wc4tZ(?=C0bojp`)K57f2o9Pvpb?&m@TZ+p#LPVrNrd*q6dT^b9 zi4X8^hX+T0x`1skX4sW~ZhZdI-Ady=0PmzFli575Ck6c{c3v$aEpN!ZrkAjSK};Wa zOtq43sy68(L0XOf@%f@Egq^bYRDW?=nE&PdQ>^g-|K2vQ7e|nIZKAV-ml0se7GTri z*{JcjBi@g0ntE1O36PobDFR4aip)GRf@kW}ecING(H!zPubw78b$@oBZg1Y4J8O;m z#xui|Vm?LZwry}vYDqOh&5Qizb@rhs7L)~`Gt{uBn0;f?#M|+3?|4iO{u=R~1rfeK z1yCu@Xm(XYVllBeFpNg5ZnKNw)#%CgB7VS;Jjt+CYD&t7MfJ{iMHNn=i$nHafG|-W zFKj)`9d5bGC|GVlzyhz=j>wJTQIi87|IqhB7)h*B(_d+Yn5=`kaRV6z>ApUxv$0ZD zZMk9zf=?lz^VqESyBgFc-)mR|H;K}Y_nbuduD+~2{(w4>@%HV`(H;qlSW1}1 zp)@IQjs=c*SO7a+!FMpON5+r}ob{@Jb|u?drw8cX=7K(u>QYLfu7G?4quH=I9#8>f zFVUKHzwh0E=mF5#*1J2J^zg1?J%EW7lt>4ILL;JQlZHynD_vDi3ePYvUoshO5+c2F zb(Jq)eEqw$(9jv&`k|QI)@m3gctT)y4;(>_c)QUZjWy7(l- z1?V9;5FqS&LkVVuwurN$SLE!GxE7azkkr1dm#dbDawtg^U9^->i-Z&8X%{w-aMNI4 z5(saw>Usid5UY<54)}bn2?rGW1kH2vlNjz4Y49Pgjqwn-MjEMz-OY0O+k1f`u^67~ zX|`|eIfs*;12jEhiZ90dXI5>IsVxYm*6`#6OE+K)TdYlb`+EQELf6k|)yJ^&?n+3@ z<`%+7+1U1qoBQAe_K1xIvR0g;G(Mvg3IF|o_k{dCa;OL7Xz3&iE1PRj>`Ba7!sbxl zlzGNFqs=M*R=V-+X145Fzi+OUEFER3o z_#A#*XY^emV+qj77^ED_2Ic(J6j?j(1Cq>=B^&tQK*jKh#~vC`R+0Wc3b;|B8GSh9 z9_Gs&y^=`0;5WIw{6jWkOifr~u^v3X-@e;9J=l49xc_ZGh=PP1pD0>-%u#Rq09UuB zGfsWpuQ~p{5~qo!YX@1`3ZqpxCuG@Jj-W5-p`IZf`GVvNJytKLl#Sd(rFGTc2jVG8 z$M4g8cVQUXL(C`A1WcV{))C`S+rW54%t@bWU(ct+lG9jc+lUsI(7Q@N5fcYMn59Cjez=@Umb zwK*iu=_P0t)9sBVCt#;i6co`eCPEy5B^W_Kg-4lfh%`(U4TM#TaX=~$ca=)Kd6sPn zIKJ6VJ+O{GEyE&00bOJipX_y_t|tI8Y1dTPmOm%XL_Wj9c<#Ft7JRuX-4g7r30aN_ zxE4?}x~UW}B@0gup{B4=zA2p$U*mk@qoEtRRM(7J@1f3UEK(qSfib2x@ga3-%`4p} zYxrArr;rL2uLN-%W1Ga8lgLjoc@e!XyCQtm7$or%%;L0QvWZdOPdO{T%{t3ktvPh3bqsaC@o* zm~D|1Zwi{QR|_X1Qw|Oygao}pDs4Y=R!24U9;>s!Q+Vx_34}T!YqdFuRJ6?L zYpI4+R9%!D2PZp8GUl@;=b~ZO9f|hCn&Lp7%iRiLunZWBYXL-*GN1&t)`(ZUkK291 zV*(u#N&#PZ+n5Am5w$g9nIUTByJHk14JI(jPT=0O_F93ZeJ7+5$1V!e0HtF*LGo(Y zfx*x$nU9W5+GK&&;97ZL1?t)KXYCmLw5qG&&19myn8|hdiCf;{ z$JXxA=I2~fS^$uRK4gtRC2lASyl(la8sAS{|DP&42)dJgTj&9Z@kDCFcEbDN3+@{b zpPw%bH{8)~|6X(l;diy|a`;wb&k&WNfm$R^h0hGq)C;FMTr&14)wSJMhdZyw(&V0& zevugeTyUdxpi~0+glu~)uIMjpaUXKFg@rw1DulhQz_B&3I3$1T136+zDlvYIa*`PK zhd#sI-9B<#5S=1tmtacBw#Jg}%T|;kWHlJBNhsE!N;frJehLHH9)BI*Vae!K)FUyBK~I z$ZPu3CKaiS3m;FDR#KDw*et()|C6`uFMs*pW7EEW|DU>R-LM~;(N{lpKAnQ??u#n> z-S7OgN;8Q~_!+aRH$uD#ADGowzx!QxR<$9T+@CS6dW2+~n$bTryLI!Y)Bh!7kyYKls7yNR(7uu${THK+og3P;}O|=c<|Ef1GN_m zFuN6`UE_{{mMBMM4Ul`9I2#u2LFgnIgWdu`r-yAH{emBgh3qd*=#5z>GK`bRSf+~c z8A!yH_mDf#?@o5k-t+^9kEAN}q$ZlhV4JSnFc?*q#kOJ7`0_42EFF$4HxZ^6rh7_A z0SMM&ZhriXhR|g!+~4PPm^AJ`A9QR3iQ<@a?cUI6Xarje<~%uj{Ki2lcB_#_;(7tP z^BIS+bK$W;hm-X+k+z<_$iAh2eJdZ}i^9LtM|-u36;q*=S8GOiReM9v&f7Kf zbaFK3B8Go_`HxCDUVK^zY=;c5_BMoiFili)lV@Ak^{V3d77ufKz;$g%2ZzXRIRSc{ z6 z0O6DEBA33Pc_GT?h`iqLIgmavuzp{QQEB8faF7aJy;OS{CQ^mT)jc~!c)K9 z51qUA>;NzdZ23OVt7gOpsd+bW;HkZ1S zx|b4MeH3_O=d}gt@OJgyfz!!iwl^=rCFx(MDZZ!9cCt^PGgwi$;gq zB(I(LZ7r{5Zy1tnc>r`b<(Qh`YXKVl@?U8~{rl6txc3m;L+(Zus_rFN&plUw4CB*Sg3k+>$+DS8%_AAaP|6M< z*ozrp?t`K%0dYi6VG>;O6*V`{41kapuBgHo1F)c$Qo^q#Ru!C#kj$pUNN>yJez>+$ zb2tB3mrk0lD(xU$_NY2ZN{Atmx24Ys9zbKI9^2{1Tttfm!n7t9?F7#O4s6sIf?*?H zEcodPB(Usptu27Uy&UhcPZZRkwsu<%leSFWChY^UDX8uv%0d=iW>@$_t<5}A5?PIhG9w}*L2D;Fi(h({`PJ+`=s#OKtjtqcWdGNWQC|X~K>g*)+o%ss z1PwQSk}#@D)AWaAPviNMSL;YsqoZG+**TPd6MQ&+|LAG*WBIS*`h$X}Kc~guL$d^r zG~;e3cc8)CHhO^K7lP0(QP6ZImglDL1)#xg+k!PFQcb5l!t&#>FDgw%wj!_3CF)Tm zIMEh}0gH*SnMI(mb$|snZBB=rOc~a~@dl{Cw;pO?Nb*Bhd~j(Et%yra)c-@slsEB2Eo0DuYhrY*?{OQDXN?HmXreAA#^n@0QEui_;@)1jF51J zv$j}Pl7b9oP~H$h;REwANI>JtCmVHtm zN-9mp1hZ7?M(`H`sa#TJ63EHv4Sh;zs0qnN;%{I6g7t@fLie=eQ3#;-^xa6w&mDzIbBE%=C|Z zA&-2)$tC1j3w*_3>kSV^vfSYRh6!_j8lewFGRZq6O^p$b+d@EwI7=kfDzAA{cC1_y zq_ly+By@{=oo%^IdJ7ErLI{yZ`k6C?X{N8xEV2xB%D;3~*p|6)AZk{X7AG?j-Fwbr zZijE0AfD;(|XQ*g69# z?GB3a^g0g*C8H^U9Aumr4&*yT&ix6xO!3F$ zi_#KjsGvM0ZMNyKK4_&%fLOVy1m`SV5GGm~xL*nAZ%W4&fso6a0JG~ z-~i=i$MZ*(v2N=-ILjIkxQ}yIqxMostMc9W4Fj}EepUu+aKyG)06Jw@|5X5MK$O2$ zo!qbozSE4{>F{3$!+`!;H?7Uw{cn+=8o{?&H#(EF+K`p$faa5fsHuC3A=d#(F@0iM zdJ{MS!)7$0cSF4~?r^$d0d+z3#&yajsEx_b9#A9o%}IyXI_K9i%m#|Q?YS=u?;CkL}+t1(Z@BWED9&fDx*fpgmQ1_MiIZhW+r!c-SxDq{7 z++z6sOL<3>*F?S;?-BeJaVCC6ElB`K-7Zr6Z&pZ+GepYzycaVKPmw{5YZHGZC<^S2 zbOwyOr|R9{96!7h&yNnqXL}cKvR`S7JFHF@psrJEOPUw5RBTQ|h=-6%LJHW}dzOpb zvf*kpKpHuf8o^XhS~jn1CY-6S z`exC(OD3pnk8g&{bPK&Cz!*g@q$HdmpHpkhZKqfF@rA_+412qo*n3F2B}C#Qg3YkQ z3kPeb91ESJM}=Hc;GvaeTep<%8Vd?#p4&aUfoAC?5(U%3Z2uK<q2 z8bmESRo+aUKk_ou_GFf@dVyAaL7CUB&xdM*!MmfT>jV=tcC$6hm#pf9on6z_m&a#k z$8W#wcg1hqU*gj7iU4tERulFf{sjGXoL&}O5C?r7u@l_ z&;s+!O&N8CR?%J|CeqlWgBP3ULf>L4s@c7f((uW)7=@lGJv#WkVSsu%xE26~(_7Xq z^IT>K6VNJBCXrAZsDPa8Sja9PaKRAoJw3yXh@=}0SVK;yU*a0B$>=$@?DR({T;jjg2XLksB2XXl9f{%qC4Hh@seZRDMMN%e)f z5(L>y5oNwOG^IFp6^mP(qL2mSo;!qhDAp6!-2i1{og{U_#TxQVxPf=`wES33!Sl67 ziwN)J|8aGy64;5qeQAKdZIP?a7;MMXJ=7_F^|@8Aq^18M)h9baK62!QWaAt8a1xESDTpI7wCtLYV?LYuN(v494ODhAe>9^>sNZIWWwkzBdf070Z|x zYJ@H`^q{UK66Sk)S}DCf%SqhaGzug z;gX0<NG-e2ub1 zj8@~%09`bg_SD8uE7+?od@o2d!Sz7gD24wL)2elw9t43QD3`wUfsktqdAP;hDn>UW z41ZD)EFe_2#j)b#hKbut;%8WP!f={6VkknL=w(#37{&PG!MHRu-I2*8s->2LFRl=a^hi2~ z?R4a??m}A;FW4ipDkd43$(yv~1gAhIBxcp+U_wnfa8z^Femc3mT>L+f*) zefeH@E7D&jnPdow%KA6n>hvm3Zvb5r5X2;8jXRSE_l&c+B&jGk+vov-kDY9+V)h?I zO2^q84Ld0)R8Y%=2pgH4=c@w1MNKqEnI~N)ZYnYvXF$gd$9EtKFx%cIr~9uC-h*#o z=lt-jzn<+fd@$Rh-#xV@>o^Y-4uP@Iw?a=BohZA`{)$#&>Iw25;SGFE1r3&XY$zCD zb^?<5^8k~H?-Ip_cePxHFjqvcxHz@OTyMx+?;KH9)zCXv?r?Hz${m3zmOv>S*>IjA zaqx8KZU2E8=0{+L@gF+HWZTj9pO#ZX(hH+#l^pDr<)Nf`9!6Vzd%#nco0NwV*@Pe( zh0N;iFVZW+PRLm(2usK*xJ)D`Tuj6DSHIQBUCp|%UbDJ0$bMLo(=oK*toMOid@c>t z;-obp9B$N8RCl=Pg7^;p1hKL*==tT%WFp}2f`{F`<^BGB>MnAmZGrFUh|N%=XE!YX z&=J!eaUO|jsls!VtitoC+8nyILJm&2n<~&rKSq^)Vjn+i8Zg9j&5g>`n#pHtPQvN_ zKWAI-_D{zL$47bs_C44Vk1S?!6&2PMNmLbu*IX6wQugS3Dq(8^*>CvAjn^j1G3BDt zzA1P3xTgcR%4ls@tcuP7hJI6Ys-4rPp;CgCG$}!*`{MN(DEOn3w)NHM_ZF>S^axTC zuU9h-Hb$zclYyX&z-rdju)f0VRcYv|fO4ZkZy}KVtD?OF@@1Vs*G7TmS|kH??ru?E zIEUzjXys<;gcci{AeWU0OE;800c{%T_P}?=CmooQb0WG$Qe*Ox7n$Uar+4X;GjlBp zCsr>|3no_2Tf}0Z#u~?`JS(;(Maq+#%2fHii-&mUx$bc?Qpe$R|J?!Xu53&GHN;FJ z`Qk1laYC{&zL{{&!IR!so6yvy6%J4UOYjW1Dx31A!us&jdgYYa;a^sDiv>5Zu4$;E z&Wcutft=|pI-o(9BI0R|^R;y(l(aJt&^g^5Ll<`6jkOpt27nb&fQi=~9`Z9&kp(e^ zawB_n-0jj5v%+ClXipOnENc-mjc1^FLcU3Lj+?rk0@y4^krI{sU{|{@ zLL$|2%q6M4V`mLmzfK5Q=R5kZyTP%p4a$tAaV9QkE#jh*t<#U>6FQ59vC~tNxhqa_ z92J1qXRzK>k2g=PEgRsdC79_7ZeW}tv^|5hg>j{1pLBWa%Tu1KXW3UH_Eh-LY_Dv!8BB(-Z~pbKHoMY0btuUo`)*k#s#DsMcUp=vY@rudp0szk z(lYw&d$Xq*DIwYTv zvOnFp9fw~EM_|Z4{nR2oW|vX3Q&J~cO^1_zZ%B_Vm%bzqg5qzN0Jiyp0YgVSZ}-0d z(~E1JT@_Ak#7r|l%Prv>=E-15qok~tXI6q(!}JN(rb+HFMZz%-00K%49?M)UA< z*Al+1liT?wFK^6XpQ$kjOE59H0-P2iX(};S3;b<)LutB`apqr%ZPE zQH~$^0i5+aFR3bsY3V+D<*b;XJ}D^!%-ZMnntc9HV>YX%+cU!`^PPJj(4o2$*@S+qzoZ8No zh+K+v3lIPpiJ|nWG~aTXcf-4Zc*fh3^7hJ>O(VG#Da!7zP{uUOJU$OwWe(<~Ts!d> ze^;#Ou9S>H>}4awdE_{qn%yV0>^;KQLaU>K0(!5XBmLtqZmM!<^Bg6EV9h*zP@oaAlB zz5U(8i|@Zb+kda+O&H#KNq@aKIX*Z#LzXXR^W5LJZa({Duv|J*YneR>V8v<%(T6|$ z2!_OtM7QIjeV2#(@1+jU>GAQIhF7lg##in%(42~lZq9(56`$Og6{+)_QiK2<<31VP z-xG7c+7nQP1EL_N9)~Z&+;~o|k9fmQCRpm>hSGfsMugMYT=P^n^&0;b`j3*1s^ixe zJKz0DEpc7-%XxnH0f1IF{NIZHOBe$Drxfo%>g0hn*OF7}UZd0K;i>|*g5yPHPt`9) zu`BEcf5AIWs8+K?NjZ54Th1HMex(sC4Wcx+Yo}m$*Kaa0uydO=7(ji2Lz5%8;;Zol zWzvuVHVn*Zx+JG6Oe2QE!8KbF$#vfZh1IV+PE93rz*JT;kQnOibxelfdhH`fz%1p5 zMh@PvXh?SXnqP5wUo?Gnu@H@ox~yqBy1heEICKrgb2P9!gs}OS!<%e){B>Wi*06g( zB?q6@9=MMcouwhyQB!#rQAW@t5DCF-yMGzvFNB&o8-aYJn>p1<=jGsx6#La~=rP29I( zLs&qv@mWwRJeX#g)c&B)0OQuV00*g?VnV`hT~2=aOH>W`KX{|Tr35I6PoG3fn80J( zLDT-Mk{?V%hA9?sT`Q?cxQ+fdx@@@j|MmCHtKa=Db>AeY#Y3Y7*}ltlf-AwU z99k{z+phoD&#rx?1XPO{Zl{q4Q*|~acH#lcMH*Ufz+g}4gn~Rx40}5W#52#i z3J%D;4Fr?D9k_Qag%C#`T@BGD><)0f?ema*h#iiuj$iTB!6QbI57$Lt{?LcXTOzF2 zidU)hj$YBXk_Xu&QGzC>bbSe0H@8;J28XMtH>n+I(?A528z|lDlx@V8u)+=ROeoz< zB_wmPw#&|9bfatev1Rs{;bm z*I@K~J+zX+yMfLx}dHM5Lnfa6c?-Tp@8I-Dz-6F4t7+{XdXM}b|PO-HscW^X5+d0$~ zOI~~Yj7k}VVPhm8=qfS$uq~~A%so{24Wj2bk(wauQKssp@-gF2e8y}C0C@eBUodQL zvmwY#4X+wuV6oI5_QxE49xH!=VEHWsI5u%14b#SUh};JFH(!fF+J{vNc1&_lte-VH z62*Mdrk1~scTW#a$T52P<-hV@|J~Qbv(N7BobALhY%|_*7cDS~1rHUVNY@T{Shn(ZfbNF>05T8_v z{FT5@lH!}{ClYnO9SUOtFpoOF$FX4kcQ?;ll_<$cyo^q1-=t#;L0dujs=*tL0%T?l z4&8msS3`DBOwS?4i}%BY&_%8fNo&+^m5hHr95Qp8HEP^T`~G?bf}vb7P#swzATmaA zAxI#14^4E`ef2uM`F6sGl3dMFJ}Abb&CH zCWMJUZsRvT(Y3Sho@bbfvskry0f?%}+(GywJ@r6}5MmwGkc+OO!~OSWZhW}Kpu|%# zB@%-4w1v01kANtE6tmg&tUr*TfTAG?>y`W2LT=i%ahB-hY>`qIf(h((V4fAzm!K`q`hvPA&Gx#9a~Rl&1dql+i(T{O77P=3VOUC1z*$H^%zZRha1z$nq0BSrxkANIP;%7(VxpnWg>}vR z43H9>eWkf-s7N9MX-XHP#py+Uk+Z;y*0Ol$L3{MnjJ z-Sa>@ZCh|(-(I(KPj`;o7JpDbq(|r!IP1inE(##)zvT?;6`*?zzVgheUxaaoFzxo* zGxYtA4=KVKx+dQ?Kdx2S9Qd^WsK>Y32rtNR>7he3n30sP$BfY#bK57KkJjgSm$ z(F$pZ!^2>Os4?8k@bV2H3l9MoEXW3rkZMwxm;l-5gmtIO!N7Hl2dIk)^%b%#+{Z&@ zoR)A0>LXru=ID}WAks}vxgB_VE(qZRyO6(46?=+gA0gz^06xRq!~iQP&MV_!=oy+c zHec2ZFvR~Dcp4d$y`fk`fFSKRnnb05*BmpksD>$|qk;LwH+3mT9ij;^-%-hEI6JO2 zJV09qNBd`c;9x3R_YF!oqJq6o>2F?Cd4d(MXINZ;W zm@E5X;QoAunFp_iua3`;_S~NWx#T}SIzFREe*DoVGvGYR!lNpO?J|=q-=BOU)Dn+N zEApWxhkOzD$liQT8YMcUJ$AAJbDfjv@jCV~4SxJ{2ft7KZ7fxiYqw80H7&q}vjUmQ zl-q`{RzbI;#7;iS>KX*LI%+Fy#^&YK*;nhw3EL{$dbe|Wu=Db8e}EZs$ma^5x{;g? zvUfX&=lg4iuAl12VY9&I8)QFZr~Ci3zk8PbxOOYZq3XO>wgy1?&EYJqPu+}CMgYSN zJ3I(3EBSV}+XKHVzzKkA0v=otjxvxfZ%^f5sIFQAb=nrvYnE&t(-XK%D7vT`x040W z6*UC-uxLQusn&gC75?frPr(HrNy)XRLMIg?<=sD<1Ll*FOLA74=#RF|&q?krZxprS zK6k&I9UmV)D3N~BZaFNO)WmN}!W;4lB|=}xi4NaKF*$D{W5zEp28Ky74w^UKx#$@^ zc8-pZ4t94AFWwxxDKHK+NW7Kw!fD>z`ZN%?*5ETP|LS%Kt2J>Rv)MP8w1UA)?*no= zBJ}G;`Rm{Rb_lu197}1bT*YkGW!=`P-y&OJkdf{`$e!86Q{;FE%msPJ(AW+32>4T_ zJA$<%;>o^z^n39ap849dz&TO|_XvF}X@Q6q^`E)9;zLL(Xj?AT2XEz3*b_IpAmW!C z%-=$?CWbTS@s!t6*(~ucFfu|j@$unXi53j^F{{gFJ=i=5lR>iyY&?|}p$(;q(pdYd zn?JuUAL3f!-Ma$}$fJYT1OsPbs?d5zn-XYdTkd~OcTT?_WI((L3g}N$)8SjkXK(gT zht%M~{@Chkdxh}+M_w+$7(9e6XqWd!=`v-N2x=j75mdqE<@2L56&OC|_p3Fe8t6snUl4(C6#Hyc@j-7oc6#8Uip-@IRLt+6fbVoG*mG(;P6=W1ag?7Ef-CVtIGxtAVeHHk&GLw;x6AOzZLC{GXfK<#z zSBH#*D`ad40JA5IR%^yAO8A4Xz)9%NV@jOK^5M(9MEhF^vXC^R_{*x~2se5};P?s0N8~6`&l$TfTmr*W_N<~uy zheH0)z{)YjAe3aT7E@`>G8NkXFdb{2h9EvidJisY4T7M>Bs36uqj(N|DLnNHbM!W~ z)Z_h~)7>{PvEW$YDIH|==OO<2Z?WuS3+5FOIF&SG-w!m~`$;I6UOQTL_Ae_8Ge^kRTsisp;rY2<%1y;%w8_PXsXE@{ds$#*sT<^QmnjjAlu!@DmY@P|NqDNDq zdqYWv{+X%Jy`i#hCQ_mG#h;Z6ouE{BG#A>>RL>?ur`Z|0$qH`q<7-geTVyM}FQ z6T$nR@OtK_$lECV&G!u z@bGwdC-e>*){sjm>o!59>P*;K;qN&nM!2J>Bwq%?Za810ff1GSX7gSSNW^s#@{wI$ zT)aLy-@UkC%*n;h!TY{&5vb6`Twn7RLJ?4)M_WR5nMQi?ri>?8j&n~r0^0{DsNY+5#3`p0T#Z31QIo(Jsr?o zL)%zn4BVyC$2A~QMW&E*CO93QNR{bP-esr1*8aOboqVU;-#_sUezclg^-VH*-4tGP z^VSMo+&BQJimOPwh}VW&St3i_hzO9>RAEfE@G4@|OgL7$I@5 zu{pXZ3-&3x759fWuDUm1a+DdCMQs&hPi7^qfX<}fq)s-8XGRMYqn#@~Lfdcw@OZ$k zx)$y|IfE*JpD^QsYTcO%Oo5Q>)_(rQVwvB}bM^1*6NK{vTxc;>EnUz!)lISLRTQApYIIoW0?wswuiHCJv&GUA0+YdYf-cycLb%;{kT2(3~ zP`Orjz<5<1kF(#5zS$mxj#YkT5*CYndcA*kc)YW>^X~Op&CB4(XSEZGIgmQt2$`(; z^fniYZ~VD*UxqK_A8-8F23BPXU@)dD{eX8RpOVX3eaQF5qrf!_w5tF#7x%vr4xtu< zEt>9u@aO2(x`cDNleq*tl_9&=5eU;2Sr4H$DQyUpubOsP|3Ze#uSSsKp_4Oyclr(Z z824VEzlZ;xzukGyu15IhHy6L|Q+7}2b-^FT%ZGCE>k;E3SY@pcrx0qa+2zsU!T9WA ze0F-id)5yd_%$|g*&u^lhF|YfN`bq-tBVzsu0=k%l!8g~Nv#8!AQbC7K8oJ(4ZgwL zy=Ji{ec#DLw_PqyP7mH49PYo~-|L4C6AzLslupN|jczt?&eqt>E{0Xr&MRwzK!UdgF zR*n!MdTW;^O4dk8t+z*K`$uP?(4xfBqMc(sc`eFz*|;6)2HO;W5f+D=!tGJ-v{W0x zHE^&jKV{zxvXis-^zeCAeu7F6VGTA~f{Jj<{+-g272%Og*3LgDl}}!uYAXBzy<%~* zT)64QqR>_CqZpW@aB@68ct83|R6@N7RDyAvscX-}-5{NiTM&0Jz0bgBP^@JKdlU`v zfzPy&GO=($do|E#7$pMK@w3@;DF-L#6|wh%t<#E7ez{PcBLgw0V%gWNfNxnl&u-W5 zzO~bg+r`PQ2?ToWeT-2Bzo7LpN)YgO@$ZLMAoTLqsZP;#&G+;-qpwE4b_;}YQhFKR zK(9Aa8fN!i``3T{(ql4?EA?uFE3u`EAQQQ=R>5WiR; zuHae%E<^Z}k0!aX`D$<7PLKBw_jk`Oc1~ZPeSfmA**Qu8(6CvI-6W6}$#9O7fiVZ( zY8EV)RBA?#pp3lV*c=k;iXbBw8V>MH+%M=9bnYvV9ns&u{`EH^N}^AGqwkNTMYmZA zo|AS{I_WW3*9UlC=ke^xqkRaz!uK_>^0}MCefxox>Byhv=gOb)&yqjwUA;yEsbleT z@?M)3<50v6A4GZ7IzZ3XU7whC&z2(P_oM3oNpW@+D@NYLT~c$qmRi*T{YNQu!z9*`aMBkiEk+%2)LNmi)GcW zZD8;CZFDPD7(qA{frVcRL4X zzqaGQ%ggrHzVnjDJkyi}aJ-|_m+MU9ZJ{@eG_{qhPO)4eE5Q?>aU<#W=45#O-e1Gh zIxUv5Z=ai~*$t$wiN8J&OO4xlG?3a$Mo~M7nLZBk*_oL(y4QFDeYYmw-xa2H_l63< z+%*zErIsKbj$(*GWJiz$o1}&6(eM>!xx1=Ry)7P7;gBcOggJRigV?;EaurbZ%B4ghg4_E6Q5h;{kb zVoFfvomI2 z2`-Ru5Pmm3kl&^%yiIhI@In7~+F8*KgiRG~px&_C z?&E;Lw4$4Y3(AQ$w22{X&^6@is613fMUJUV{R2>HETS_0eta=LcnwiR?>A;2mH!Bz z-8tRg>x%|uYRum^7tV&H;H8&$+>t5sQgsHXOh#lUsp6fKG5lPbtsZfL*O!j1%o7||1Qf!$B(@m_{B(EC> zg65Kt&`N#F#Jw*8EL1@lI#9AMc|y#CZcUy7VR7eCx9~^6B^f=t=F#ZMWQ$RAVUAGw z8L$-9e`9ot>T4)hTop-q-nztZ`}`Zsi1#~tgb#C+P3>I>>CX$Sy_+A=F80N9m= zeD$L)!mnG{RDfkNN#Um+S0)o2gZA5BRbA&Cx;8B@kz};m6zk>}DV7>&E@GC^+~zH!Lyr z#{j)anPxs23AdQsmkJ>=&Vwt8X{vLM*1{cRkVy8Ala>RB)F$v)H@+b_?nQMYOvC;( zxW<-LHUkU;2*wiev4og_oL|knun%I)T+)8&ljv9jbVlY`0p8vUCLhN^5R`?Hm7ZBM_i;p1#F19rP z;QlTxdBKivy*N0!c>AZl{dfK6-Ypckl%WOp|5=+|--_GUZ+CW2kJDfP9_jdO&(!{6 zwaERAKOd_)WK1%K;@XSD*XuG?L4f`-tK(MMY0+1RBZGhE%bSrQ3WkjUJVduLk=L_2 zhb!WFqA%#94D3SHQrLK07LB?KQaxX{k&G9EwK(aPw>%M(aqBkM7HK>ya%QgPXrLPZ z0V(?MxWD@w^nh#QJSBQwFRzzHK`r}(7QVo3F+kqZ-lkV9iy1nI>`SPGaS+xfbp&=a zyi#f}6Fdb$y;w!H@r(ku<;^XIK#?uVlSuK53XFOb2&(R0G7Qoexc4AcCLrrJy1rhF z;nqXe-We2C4O!T?2zSoj0rhfsTsYern#Fn;0Z}k|pQ)yrkCf3E6WVVu++$Orjk7+2 z?Pke*F{Na3OEMYtKTpEVS*s&NAW4gk{wdVI%SPX z<532N49O>0%!v}ozaK{lbN_O@_ngc&=;XX^T7MexArOGG+-ae35a#ak>htqPZvfa~jl*KZvy+%Le5GHim14MOeD+8GFb#qn+@xOL!#f_N%bd08#?E)R-xPk4#%d zJJCR?u3@vfc0#d~BwJO*YaivJCQRf6&UDr3%5zV~L7HZSrN)Ui*&YI20*{IHp262( zi2^`}m*X695Ef}~F2HD&ehQePJF02=a*>Z>w8Sk|l%6c^E%{VScuD3!2Zh;CY_8f+ zyJl^15N!F#9*A#=OiPt;%{xiwXrpY|EadO*MAqz@aKJb0|l42 z9*8vKipEuz`*wi;a#s;)5X-jy5Y`fMe`^+%0%*7<2nqwA@6LWiz5T!!Ne8vi2~`e% zcW^#J@#!wi!5tu?1ig_yRKEsz4tl7MGbr)NGsBtOtM%vk^a0T&^wO9Fl{#BJ14eBi1ce{vce&F^(;I zbo)Uq)0tQhzmHXFfER!qHxR9|F;z-P|6su28nhNS&A=Q@G%ROjdyfL6o=jk_qgR5` zEG=PbAvquGCBtB_$QKI68QyH@w*%fH_x(_jDGiw0t#Z@W7({8@s;+#^!Fb3VN8+)0 zrY`#Mla9>Zm!Iz4cX7Ex|K_+qLZP?<+MlMZ9p2s>Ih^e(H=;MP-_IU3G|1K zl#P~Rt)SHjh(&EzEU*mwZvXwk+4yYd>^v6VJOk!|EtvBQH{;t*3au(|ySfu#{`!YM zWWSGn8SCGC@CustSj*_W@^SE1^UL37U;pMe+u4g3*{{~TGd?X&R3D#y@25`;GEAtAS!a$JNw)-SWDpvTi*=@0XDeZ z#~NsX+~WO3_Ft$WBn8L$(SiG{I~4@);}28Dsd2BT@O7r{%%kIxmbRn(>H=}EKIbp! z1DAGa6z04}F9`p}!jQfNiQ+Sk7E8547KSttcHgpPq2gcF z)i4?%*nglj=x`nk+MJJH$NSX%Dc+sxHbQO0*e&i5lMZNnAXk4ambDye22O+3E2-mD zSSIk5T(UlBT2Unlnu+!>tCS#oGuw~f9BQZ;z zf`^fLDf76C(Q_@C0Oy9)6D(fR#K#jbxz7j5^@a(U+~f4?g8{%7~zx#*5c^8cZY}2Ju=zjV7C7TaI!~cJ}k=l zIM$4$kE~ZpAvdkB1DYieX41xI0nOH-wSt4Y5!TFr%%qXe!kVSl#Hbt_Va+<-j&Wv> zNz(vRM2L_xr#!etdJqbd!Wa3bdKO(|<>y1#BE@ECGhkThZ>|l>`bM2o#G`o_M$Q3b zxbVG#<_iS(v^vbbyN8J4anHDgK+vo~l_QZf=3ku<>02E_Kb-f~7kyF-4fmgmmxq5EAN-3wU$U?uM*0$zAvTSsy||ivXv)79o>L>8 z-YD%RZ5jLaz-An)F_(*r#D<40MD1M|YfQX(^FuCq6#PFhX*Um3ULWOh7lj?>IukEDJg{CH! zb#St6xpeo+W&2mal&npvJNp-)i`mo&H98V0O}p8yP;Ku@C>&IziC3cnRcoCRB@G)D zYEuPj7jZf8*y%Z<5buZ0Z9zf zWQ!slWXvU1U!;k6y?=&$J%)CJ&YFI3aVD9~D67D=hBnnrIlX8}TPZmQ)*Naqv4QY2 zwtwhwtGNk86i(zI3s94kT-d$0$9wL?Td6yDi+9ngn#V`O%Lw_Lld+*|Yg<2l^(t(< zzP^5_ZT^^>p4HXO`nFFF_QJLoG+*o5=8re&_W0oS(N2(G?=k2ey(D?pd6RjQBaP0} zIIMs0@?%|2&HZ({f975buh%}}6BfhJT_rFA&5EQY87E?aw@k_L7{gR%?yJhw8ZdrA93lm!5 z-&H5*O#h}n+m7H%OUtedj2d`M02=8R8Bx(~r;_h;T(ybW<_c+U&a*A}-$Ayw|7z#_ z@GN#};{Le`7DfjsMvmDbF06Q5wQ6`hB4W z7x)0kDRo`ssMA@m6lDbm9ZI^V;A(x$)npt^)-`o{ex%QyV&#rAr&+^Osoi<;^5FIU z(cZz%k=c$|jT{3R2tV*eun6M?i;t?JyH>C6Tk&6RaV28>QO6HRiSfzK=`MLqV6X@7 zKA7PL?{?k~vfY#Oge&U13G>-jfW^vR~x?ar?H;2(weCk7S55q+G zSz{QmMBve%`M3Zv`aNSA1KMD;pxEse4ZtH(-RJUVZk92EaXSw*KvD?&I2e$O+8bqB zpN_c1A-bnvA#`{0c!0a;L0oL-zCfo`=QQx5O4HUgpo?_`m<{zAS8 z8*shXExf8`z*82@n^G}1hQK=P(&6#Z>x;ePb5o@Dk@-iR)Xh1tt@p9hXF-&VF&fR%rn>^!OF2Ef7eAu)uf-f3;N} zIm-i|y*S^s8aoc(X{MmUz(vuBZRS-EHQ%_HhH60r)H_(!gmX!VRp!gOgy;BVAfuJh zKq)XzTL7bEH^BUrQ%_t6e&w2=e!}0pcoeWy%~08fO`&9I!%w+tsZwp+3LlT5M)+0Bcs|Tl!dgZ_guApN-c@M6vw8`Yq&-z&NKSnbmw>0$0JohyYs{$v|otN%N;V z4tgvTW8Z!-7>{!9x8FQ80+cc`jNg8f8isAfGi!tv%g-4GbfGhj$CUWZG<4>pplIK? zSbi)ghLqw#LtvdQzrl+iRO&xlyEiY?TQ5@DVa`5Vsqd)ty+qV`Bc)zd`hn{`BeAJO zZq3Sg6M5HXd4;q@?g2AA zQ%tH4pcu~bnL={`JUKf-X<-_~TyFSv`+j_avAFzzmFoS_eoFIUwN;sqYB{spNJ zV6zC#xItfF-Jzx-D*)@x=5`t+$_!WcEdpG9DWfxkmXFDAUQuNLEc(;()#H{KN4O@p z6w!%oQB9TUP@<=#a4XqsLx7IbX3AFuj3TGOtaItx{0_;v@J;TGS{`u=#06xhZa?;w(e~P#2kHo1{Tb+%39o`Baq`s2 zxl_WzV(zhp?nJ_U!9V!LsE*7QzayD;hGqh4Vb_HvQ!}6 zEwD~kK;mobCiBKLJR3K&`YN9x%nKtuH6Rd?b-rpLV-LKK&QgF}ORqi@mD^-kAP0-$ zfN8~gB>^yl$y5j`4A{)pW5-4&LUkXS#ZsyE$ZB6VjbL9x;0IJNQ~yl30XfnK@mM+; zoxv? z_YoZrm_S!#exd4vq(Sa zjwyo9y}ow8;BYG64mcdi%ybeD3Oo$5%Te)({3w?r*FAJQd{ zpElI>gX<1UR~c{?W>jvD9v;hEXY79W>#x^rxVLVS+^1dxdwA>VE(vyEcF8ZW^zvY?&O@rcE2?kgS(MBKr>aa> zlOo6_rh-d(Idht%_&OkwiQlV`JX~R?B?B{#Y^}Mp1CUZ?#WphmdKcww164ItUw5rI z^DLMlDrl(yGIq*_1yH>ZW-^U z!}8^{EPNkFWj_&FD3v*>=qI1ONB5oCU(8N0{M27J@a(dxFFyGbXqZU!)D|trrZzuv z&R&tPLxOB|n>!_9s!WoA7|>@Kw@4MeLU$%A>wX5^wtA2HUE}Mbn324{*d-N2>M+3p zw}y?89`0eZ4`}1OPgHXu&duT8`-{DU@yX%N_f95`$4(9fml)ZX6r3gJwi|eg`NzKdwl&1|zA8bSGW^5mpN~dB6+?B2AukHcv_WQ5CI{j_j zc~eM>RaA6vg;gFdsYW|3jrLfJf1CTycJJhLpF2m>8}BxN&>b9|?Vq{_&peUduC4Ep zOxeTQo2ZRVmgPcya(s>gK@Xh5+2t?(E_-@aR!=9*EuI!)7RCoO+m@CIL^w+`oj!aC zOfcTzB8h{HE1&hy;ayN&Ag@e*QGAf88vq(cw-bhU+>)?D^OA?7LOg&`(!>@}=$mM>hN^2zNWRJ3hbV%Hj|JgzBUU6XHG zqtx<~%nXs*hNeR60oGl_n!6g;a=YPTe0+Yoi}9l!ScFEdbGQz10$+|b*63@^XW3X; zjfq8_B`XS0A@GD10v39_Kx5k>$v*nM+cOvA{eKR7y?5^{gr_HG@3XCO@s|~>FKjL; zOg5ZBy}ZO-qUTnwlC=);I1xLn-IqM#2dB{0^P{k<@K@JMXEeJ5mAzi(i(7E+M%{(F zlRvq;KD`swY|4KiUC8O#+K8|8w{}>DXWx^a;ALxWSy;TIgK@;^L#53yk`8w#l}fz! z%+bkUf*Y69y~!R}+&ST!Cha&F?^5=5IJG(DQ6m?>dj#jyY-Y;$=ItyOy1(clhsmjw zTVgG~J~}r_9l6ej?-%@pR7cgou!bE|8q4mku2$YTMA$EMkTYQd@GO(aG5fwOKD-A2 z2$%)KNkjOUUdOJbyZoN)D|>J~W>hQzSlD{iWFN4`F;Lqv43OEX!vfn*w-7kXlIGAG zdAOWTeO-Vg(exrR<5o8}ZW@Tx4k!j{U+2~-O$~*Q?nw*sQ%F;XnvR>3mg6HxKf;~` zlh%x8<*Wd0K$5@6nMQgBrt6i--=S&U;a$RQI~56BEr|SX!-{v|^lNZ7X(_T@|+_{dqo63UaD;q+h@8 zq$xq7qwDaDogu(@H!J3Ll{#4z9Y<>bpAyy(++GAh>Vb29a$DGaz+WwwJhN0N2TuST zWRBA9BJ>o(zkCEKC@hqeExkiSG(`m!=6M~-uJrTR5^p}T;lnua(A7)QL;zRNLV6B$ zRK*wATrwEkF*+hF97YnKU?x!D;tfVR4L`5~p7q0U#-%^akNiW!}m;#k$PmU}V2VO&N;c0q#+fHlj zT{>TCU5-257<*W@(AlZ^ck~f|^QU zRdujZTOJ;fC4S(}k&Uh4(6BQnP9ozfj=}p8H-mp`xn~iCEq!ONV;Voy5yYt-?amf$5H-n;%P91KL;f`GK)JO-v5spL4R#8T% zE|7IE(I7Td4brod~bgokn5bCp6^HGFFS|heaof8UxS(0%?OSOC6y>b(Z{srf*cd^(I1$y<5E-B zItsxTGWqbAm6KBBjD=sDS>D|GP$ivW@4Q_UOSp{r7mm50TVG!H(!$j$y4C_GtHiU&w>$yw0BFPi2Jxx{c3Jum8cK;uGYO+cop;m8{| zvOb5*+?J@>KWIDt91OOgx^nAj&9o+_$;rwq*?xBT8XwUbRe?U`&sP$HVMmf}o$Q>Q z?VlbEvVcMBC(t>?sb*d|^<8giG~VAVyZ6#6!sSSvRHV|~-f&2|K46Bz)Y0lxxVbBG$q6Ke?v{$7 z(yKtI<)j1p=6JCN0V|o&g%K*Rc~letvnc2gBGq}1F@BLu_?5tnd8W`%gm?HUmRFe- zluGKP1>*`gLFU0vEaDAc+WczJlxG$o0GD|l$eF`~qd)c8Bo$zdG{kPBZd!`*%P8`E zb0KeKIY$iGOOp`pdLuk4*0tHR7hs)m*MjxAsRfLmL>{Gqx}RM;Hpfm7J+Y7`l-!5) z(i)|)p;TN|m?-eJXme^_81g)7j}KKfrz;*3g4KS}vP6h)qW>5dHZ^6OW)Omt_yeXe zE$`X&h~3sSe_QVz>HcR5eOMMV^85<$!8Id>Cy<~5Neggi=a{>oEoyBdtzRhiXHMoM z@v@OO8YL%=7-N??*IVN+3NBJ^Whv_(g8Tur1|o^Wma=%_`?IN++}hHcY1Yu}H*f;c zPk2?_<{wKc>Oi8Gm?UvHDARxk#yBlNCBSr2as@T+ud01|gj-!rOit#GyUg#@2t^1s z0Sv<|X{qpu$W2&q$ou3n5w4*-&VE@^`J`3lZgB`=Ov5TfE$3y)mb_ZsAXY_`-!Qdb zwmmyc@Z!+`&8k{81Z~k=Ca)-j6zQ~ZbGZ(QT3G!NFi7ZwgpbUqCiN0bcyoYqiOA6R zv^OdSy|gEe9#CQ|K#ML5K)j;oydb5niQqih_2gcq!`8H~~_b)|;>{VN%JJ9rT}} z?xxN%B6PAX*eSaVQV+9v4#~& zAgyOF*-A+p#j$M+R7_ypG(m|O4e~+IPcs+Tzusg5-Gsp;+@3kB^s1g9gR^=+H4*t9 zGYwZalK99(zynhMu~o(e-7yYlspr+bzp=5tfGt5y^=UF(&uRQz>a!36zkY+n>dr&OO{j%}5F>8`E^)CqWTM@%<4b zyEDv*LL)}TxprWIu=1b~>I;tuU`@eF_py+`EO5t4;3NZM+pnZh{2V;OA5q;~6g8G? z0Cyb-(3)UNbAsa)s0qF!6kj z5=~(rUWqvrH-{4k-xRbDT6u9R8_0rSsGbH|$DzW&2n~<`@+-YXrX*;s_gJ~A^M;E) zhlx6oOOS@u-L#rJ&O)KHiPv55ZtrDVsrcd=tjhYko>;Ny3Uq?~$ISwdYa)&w%V@3# z4LUv;WyC{Ywh3)OZ5B&BLx5j!+i;Ogb!{Lm8Hq5d=YuMQHnT25z5%`@p{c>_K9Aii znh7GZt}$3;!ws8A3;gnr5&S%`yF!D@myPSFm%kVDz7ZolAHF}nnYU~HyWqg3pSf1 zx<~8dk129syUhv~>@tgF;)MG$fSHrqSSu2{{q3ax9BE6`2Thf&7#heoVR!; zV9VuPE)%|qF~R_|3U)m>!^8okQ#H$*Hsoy&FRx3Hs4`6OSwZd|ib5GFZ5}Yf@cy#| zc~H&_y9jjk;_{;s6Jk>Zyj!TwR`r9c#l6KPgSmyFV$mXWYB0_odk71PC~WdMqAd>l z#(NgM`l9-Wze_tesd$X*po-MA1Ze3MRR$w_Mt!4lE^r;9c?XH~i#GKB*4;B#kQHXu69rmOiP(|jln zLqU0lrnvF-?48ay%T1)uKCF=>$Z+7U!R-WXpiVMcGeMW|RDVGDR~obX4Lf%^cP3`v zS}rlJa|>#)k5{nN;PP=JYq!Z;VecGnwKt>!_RuJj_mPu&v}OUNjLqdQ%4<@52)<{6 zBNPoq>4PK?0SZl|x4|3YHHu4wu|URIv6}G;<*cRABdN@Sz!uSE?FG_G5bc(tfDn;R zZ;DJ$Un~kW-E8M*eBe~D5F6@Rlq#FEdkb)c8f{3t%oW}A@1{f=mo(67XHgw!tOywN zNohxLotNI}I?dZ0yEHK6IpKc6YankkCS{;9bubOkZr>x5^>5IU@G%=L0=6jSfJ|ms zOUqqAmH=rv&xXtEOj>!;=Zs)$bK~Ok#=-bDOJr)7nIf4L;&aT(t}F|rURRKX-|C1i zT>yC`NCxOwz;Z}=6RGDq+#Q(seN7P;EE4S=%w6k51PBV!AZm8$u21%?^o9Y!0zj_8 zVPM_=WHTQrYN8)Hs1?<<$xRsOYef zqdb6O6_wVrp^PD1_g^6@69Gq=1@fT9+Xz8SaBPC9bM1g%8ii~{)#>=jAh#|OG_XV# zKZ2VEMeFmZ+UmTRPZsxmD*r;=K}ghJMm{2>jdNwjnJ^f zIPnZ{0jHK1H%QH^+*^3@G?dliEry^!0ymd}76?C}x$I8ebFwenW$BIutObN(#6|+Z zU4ypr995O7b}I~}Gu#sGgDipiRR!|zyJk!U5TEtC@oAplloJ+60T%*# z3fyMX8mp=enL|a6OxIc$Qw!o0*(jlOIY#I;-~GI0f*JU((1bS6+$h;7Zno_sy`g`| zGY`xtg%_O)vV&mh7$!sZnh`}hRmB%i>*PLAj8VPFY?^xCv$!@Iud{Jz z;uh;c3bVN^Bo8YHs<_E`2`RV}CmY#4h*JYWGDI7p6>jRA;1=r*RmkDt&6ihYi#TyS zP-Nzlg@s&ToKcDLVaOg>cC`(ceY{dsf90n>8Pock(XT;|($&TpFAZ__4w?COm3ey` zW5O5upcER>^WN>8zWDNA-TyutzS}uG-{<(_oN z%m0K9ew+gYWK9oufHgJjq5D&!gTKhOFhPS?1)5={n*u&qWT;G!W)vuni9P$&eaN$tckwMdI#Df-$KYq-U& zF=S~i`i-p=rnNIG8&9Rix`EIXC;_YFDNXHO9eA9nO;(15>h}^EIM4ye)_aAnwad{& zQ;~#Z%~o3&uPLI@fo1rtZ4D`7uU4(k&Qm0a(sz)!MKoJbUP&PV>qmcbcs_>zztJqb z7v^E%BI(S8G;=v}{rfpHq0>-5Iup>V|A48`a*3Nv#jD@_F1-(~{jjB-pSBPDu%(^k z=&>VfN58?a$2;$|^6_awY#~`XK`JNA5Wk-GkHLO+_LTD1MCB;Ai7VVm@W}^M-${wl zabi{7^^`UvK|A}rz%T~{Uk7y+j!*Y7W!KVEdqL;3P8(;~0)DXe93X}o3i(y? z)v+(}VRHT`ZrJ1>Jy@=-7bf3*@&Qv18&42#CmNQCk+e?NsY%O6aEyL^9b2?f%^^ri z(I~ruYnHAvrG5oDs*OR(+kC3qE}Peg)|*i7qfKWFM}pP<5EM#OLsmOubB@D}Iv`?S z#H<$dD~1iG7Uy*TpU)3Y_d$D*w)ahl*bgCq>)fHY(M^O;!xuDc5gA>2G z?-Pv*)ajej6P*dg>u6gFJA1HFeQnpt@@VRkGJiiw~ab$wJH){YEb}^L}FIo!`+_ z@7Ma-cO+7pGi;?MFja|#?-t+;#oI2Vz9vtVYt?gt+`ZlO!Wi$_2T^KpU;oa_V-Ltw3liu&@FX*es*$x*3YndkEQbr@s);09OOc^ zu2PtL@mMZ1!*W{rl6aTHz47;NUmhQl6N|Jv%r@ZJ;MamuLcBk2j@3WIp?BBLR{~o= zXJ6a}?K~x3Mae3RFGO;mnAuog#X3%aCzV!xnkHB~Nnys^=b~xzVj>^V0$6^Eh$Nna zkSO$k-<+H|5&I?ah(OBn)<+a$*VY)v@>lOpP7jXGUTt@r7GHdsPc9}OF93^h!QcKO z`@0uFliBeRm=|44U5CNp9=&Mq_~i8HY&$gadlD5v)|2C-R|l_^b5^f+(oi@mZ;|hu zhyuHWHt)0TpV?b%pbzj25h~Y#G%~J9NvPtt&T@`L@lr_eCea8fDa~w37&9&zw32 z?%S%kV<0UQ4GRqe9)L%+(U>)qDcO+zwK!(W8vIMS2N3xVNVEb z5IMJnV%hPCfmCFvTxW|xMr=*-gS>$!e$Lwgo|d9FJLmaF8^;IlFP>K7f*9d zl|?Xm9!1KPKaI`~UZ(E0mg0r;BA1I8e~b%g>{$m)8*Qp) z{gUe@G#3qI_No1(>{am}Mm zeEF~LYwhylcDnrcZSC>iO5^cJy*oj4ZFW`uH3w4^6>m~AEWA?Tj)W^}ig}4)NRFZc zQoJoTQ6d>~4nC4zkd!Ccd`nY2^*LQFlyQeZNFobna4+qOo+QA<*{52k6*dGL?g;I} zx5(|{wc-I-N_)4`o$Mt!hf>i%snJWomen7Xwt7|)VBX% z?Muui|7rbyzP|0ptgZ))E3&>KYf_D_gt^wSzScGVfZ1i-7m5&4-$Q5_Nnntn0AEC= zNb?0O3SIG(UJ{lWCn_mc5AgvJf_OtAyNjg4_d;G%dJ`8v%i6nIOogigA|;$&g{9P@ zKA~BC#QrPjb=TG(DE(^FdJWQaoI8ZU^BI;~3&=|23u=7+a(w2mr4B)K)v@6?d$A)y zF`LHd<0@)(;#kl}`Y6q&byQ?qP8@RO-`W>f6rI{vw{JXM9j1>_0*5gP5TnbbXVu=p z>wZGPw##p&8{hT`bL@LzXjd_BpCLr)E5r}yHs{;~+mW&nzboyEAkI)<`)_ZcG_PGo ztiYUDOTpXlfth^f(t7`CxWF)z&dPO)GF7h+Sw6N|Cqzt66PN0iO4H~)ST~cMjS-if ze0JrjSfl2;>VUJ<4rmws;>RO_K=n&aAn~k2IR^~@=9IL zS2$ytgD%y)PHU*HDXI&$12jpG;&rR1%x#POhOA+4+vq7^O)WrUYjy&gT?CeKhGtxw z4xw-6d^6aM@`uPM_lKP_bxm$iy7oFn6R4vpZO$K+EqMC{jBa~c&4TCjlNVn$%Zcm% zQ+V0aW>tMNn%|mMIq3v(_;$lQ(vNTT1>bIV6L&9KW`6+KUsWN@)nlEk|mva*1GA6kkod;|#B z5SMKPSc|@!FTCsj3v_)jv1p#`42JHl>9|=LlQiI8A(;qkm*PN> zWRlptmxX7L0NsK*3Fr>8ON4~Xb_&#EjPij@y3U(cF#ZyNo?28`ju}rZmUs>z+;)#q zyd+D+j?*76oOzUO;Xj85dxLEE`0d-BqrLI)?07idKN}vL=}lszc?nlEc}mMEnDW;p z33qANTBu$lQI4NvOPF3&3em|VC2S$Axx^#`#7UUBgHJ#v5{n+XVur)NtV&2)GGV>p zuqh!_E4dm2sky1qpC-Te0A3&Sx%1v7?A!FYWrUET%n|8ScWy^sCgZM~5Ja77!d@FNWU+nQ|b2Hbw=D7IM9s zsW%x;Mvr0~FkTsTHFry9zOD$#L7gG)0xymsz?sMBQa0y5Sw)1~Cqb8d|gAWM}tJ z?vM{pPTk%79(=~=)gBTm{bYal;MKt{rNsPjv9q^#0MUeqb*p{Q6v;?DuKad9&NhjT8RD-xAicN11pkuo{HW>~SG!yigW z6mOL#c7fUTfm(EhE_zWGias61?bs6bLABbGtorQ*pJMNK`?a)+uS7k>?H9 znRXp1m(rTl$GEC%Aop@J3cQCnh^hui@={elb`O#R&KA;nPMSH<=40n8pXp<%2R`d| z=w1Mc8{?5%Kr*mXGJhx1R>Y&q*DMFVwAin)A1r4nMKD0Auc`hyXGxK*axc0>bDKlG z7a>51FLmKA@_$GCo>U_8b-nQ|6iDNWQ%uaKMVFlrk()#L7e``4ZmEe)ES*8Wn zH-L>ig>1MsjWP56BD&+zQx5#&1oahL;8n)n&@<9P!{P3x((h77HB5k~L`$j4wYs@sjFum`Ux*QrG4u(wvcULM+w#@b(X%Ndmojz(KaLv{=(*l$LsFmElhI8F z2gmlnwR7OXF;0AxlX5}3C`bAX-*<4RmGyKGlJoL_VTQ4PGiTrslgAXSXmN$6_*l@k zr~234mZVl#N6D2NgG74h+qQZjp}KJflf<_D5XVX&G~LcG6~C^gzEvx*icDt1*yT2X*Uq_+%uIh zU$3YwLd4utQh!Xb6gGR@9~5D-nwepF9UvtNf5!;%28^&?0v!U>5Nq62GCf631Uhor zpp9W@@g?!m`_g$0L9d0b@6nqga%&Pd%g&X|Wl}vfh8={#VS@|d7Ccpi!$H$r!jIe< zST!786|DX1HuH#9<(D6uK2C-5v7Pl5zcncm!e2~&G}6k1@)cXE><{9-7+?v6tN z7k}%vUKCinVOur=o@rKtsJ!BB;R7c$R>tUtnMx>|SaLa&uAPinD3RE!W)k+euC?Bb zsS_ZXobg{???Tq|j_CKn+YoY~q?**ad1um-w5CHdQ)ySfER`R(s%AETjChC)UfqLQ zyq$cmsV5%_(wr(cLEGKly7&B)p1#G}oa6*DUweCTvUB$4;`P~|w!RwuYV`FW8xXD1 zSKEna-oD-X)#x8azX_k(Ks8?<$V_`^0-e0`f>h6?&KG=_H!~{O z80eYjQw4?^M0P2RlMtiUEk-xevf;*hai!m0*OhJq6WP|Q{hhP()BT|VHLIYYoG@=F z5_Ts{z6pQ@R^gFGSaFNPFI1~VCnrHrE)9F&Iuvq&^GpvosYf~HRW1GvGL+{O4CC|7 z43~k|o&%vaW}-##Ow2e85z=;4*Nwgr1VCaIWiMV42OH5!K?anxaA~8GQYlrn7_okV zd_w31$sL0p!{7fye+@#2rj2Y}j7=+^*W(nqs0X;VSie(@Tewkq5t%ka0qHiJ z9t8RZ%4?e#jqV8T&@GWR%nDoFUCsnc3-M<2J9YcSul}#!5BsO5$EVpA{%6zOpyirS z0%(~%+eaIYm)XK1KnZ~o7k`pkS8N4JGxU(Bw4?%2As~eqP^Cr(7w3=$I%8aW+_OvZ zz|n^N^3CyERp?-!{$Kn{GU^GF`rXbc)sTC6xc~OCS&c$+OD?1<^jn<88%&+F!ZT<$ zU^IEbtUZq^L-6W=UbiZ|Hioppzy*y;jwPDVf*mr*7>&{`HM9jv&~UZb_D*|+vpIz* z7t(b(TlZM$i8A>{SSK%@!v|JvrhwBSuud>zCR(PqFd10$t{KsiLj%1(ghnZ*+@?=us$h2JVQo@ZzvrRI^sa9$$K%3_5l3skfTVTX5>2!WHZ^ zD45DMDyIdhZ$<>xsJ=U0c(q*A90<=a+r~hXB{^Go&x_H`Xkg7x_%YM8I3KJyhOJ#(;+dqAIJl=osj(c>1c?mny%Sd<)DnXh8Uo;_LOE*T8LKUH?N^OZX zDSMdxab%-T{jHXbON< zgJgZK9maKwQ?ui4KTA0LO>{aa5*Fb)C{(-W&4B=$@iK4931boXY7K+yBhyHP z3DKYLFx<)2EYKkaUP9lgC)q!f;h3sAo59l7aGs1+jn1-Fb(f-KsOwp>WZSZMo)ji}r@yW*>BF#Ha_@F+xXR zD1iyw3B~mAISHJgT5JT38tg#F-aYw_zJ2 zrc_={-c>5u2wr?m{-YG@veM{|j*Q)=3AP_Y^J5ujqxmrwa5k&!4^3E6z_=uE09$W& zc2AFoM>}u#2iXtw3)F)b?*lrq|FVLfT>)EW0c=HZZaFW589YpV&KCEF0lm6bIMIhF zkbq*nsI;0)r`KAwg+9?!&>MO}Zk`@JUs(51oI1A5*)S;%+HQgB8hS&>FmLBQxsh)ZIFIQ{RB}~H|^|x=wV}t&LU8bOBC6XSa{hf zDGrf6OK<6ma>zX;RWw}#Q}F{&HUQszfgWa4z%HR1uZpwj8b3~aBS_z#WM>n-(*#b^ z30ic%@CPxw;)^&i*N|T$MD4NrT7W#T=+rp_+{480NFnm)I!w42AaM2Kh!x>$eqP6MCFybC4T=qcNc+Qo%7+*hq9`G?*+F}b4wL&H1#Gwj!o z0?gOtvcb5h#!U&mi3S;+!4=`V+>ru23we&(;-&`1f5dI^ZJ$@ZDa^(fHDJLY4kIzoechAg}dX)fYRHe$=DII@5 z)~_EE?YhEbJL?C)Tr&l-%m|Lc3UkxU){MM-w{vP950*EcKDb%cQKDxM>RC5|2yPjf z%|MaheD;R^gaUB&dbPy600msAZE{@{R$WblIh<9Dy-E(WhGatIsuLfu9WTz$4&Lrx z9GxE?_9Ze+1~EC^d_$Kj02uU5)yi8X1QR#ICAEXN1zT%n#|j9dyw_{JSzWn}-GVZP zcC2M52`a6+rf}Gu@KHFwU=RBy20>&98~|Pd)4XyH;hp3VYR6bjt&2FlnKdActH1Au zMHX3=@}FP4fBUDmulmf(YyQ4>aJs*%zP`s4MXwZ+lK6lv9Vw0$HJefyxn-{|`upE_ zaE)bmbst#bRP`PF-E#S&8qBvd>}i0sJf}D*KL^`qj+h26@1W~G%kRmPP2qB*WV)8R zj)g`qA4DfxL#8psj>SUeMR4YlThf1~H|R~oU71Qen$0U8?k6u3#@ERhnCI{kEILHL zc~YJ>KnhTj6-)q*63wGN`C4!4dJ1{DISiFz@R(Bhz{?fkjVW4yWQAF-gH;(wSu}G9 zwSp4IqSuE0J(;q2<1a6D^7^Rx13em=X+Ik4OcK3SPLZO-Uxu&3*_oFO*6<=tM9Xqi zjDRw9mfVJf_K~WeZFtwtmMA~K<>+hQf*Fcg>o+J6-Btl!Q{=rEF|!(YndvnHQYY@y zrm(PVUDAxTe(FwC8h@L_RHN)AKFUzM> zy3|;1qKGn9E~O06{bz4Kyjo#nIg=k1AXYQ*9B>UmYKdND-ZA2#A_91I<TKr6imIgxc$u$EKo z`bj(4r6Q)GekG%{Hw>l5?->1EP-akWz9%wNLKG{u^Oag-Ke%?>pSpDQ1}#y?gDgT z7CsHlSdXlr?u9j1#XwK8j7S_1=*m7)n<|lsk{6kY5NQ~nscpQ&KJyQuL1&8)2F%wO zEA_#5WmpSBHQPeEN8=NH&b)&?>G%_cr{KH(K?FGBj>T>SaYJdqMDt*y&Kku5N8kdt z)!rTK?e~d#jJ*ezjK!ADiNhz56&}D@439Ctok$%~=Qk#oz%gwPpj@WbC)>c>qfM^nO| z?uF=j@`aR>cgaSVLHBLRyCBqSShD#=0Kg-2<%F)KlFGRmwE;F3kbzXpTKhywPd?G8 z6yFP1@|E~%$Q5Qs_PQ~&M`9v12Fy;pCrK}qNFUq(TrR(Df`(wlkPQ90q; zXrVrPoWKY2E?1z* zKD%SRrk+ez@;c2hPQXUPwgxCh@Jq{Xa@-oHp4Jy)Yrq1x&6)}Q8~xc*oA)TUFGz~j z{ACJ^^MXUWw9C2Y=B5ACaj~i;Y5Iko{oh zL(JsfkRWidGL2QlyEhHbBNpuCn-tfPfM-gy=}Y*<5qm4dsbd`(4vbQVhx>aeu}-9@ zASMNbDBEch%qwXg_|thsFeZB`th)}RrA==Id+_)u1o+)s9IP9biIuovws*N2akY-NHl;y56n*T-V!EY0bFA`kg=cw0{>&y0vB5I~3lE7!rl zG7mAiA3&mDujJrR;xtMJ<@XWMJtFRHsjbC=12J8p-cPr}9s00UgZe^Ls4t!~_NfI& z3Yhl9kwxFaY}{fQf=E*c%A^-S?v&$~DUdT|;todlyQa5~j$uUk|w08#H?d_~e^JIWv0Yq^%eT(rM%xfZ&?lsJ2mM=Q9)7wSqj*ZBI=^=V6Jxc0Ttix z>s4<^bt<&HGAckiGOp)NA{RNyeNa%HEdhrnHWYesDEJL~SzX15w*qh~Cqwpz9uVN; zr7JRM!POm8Lo_z@WdPyEU+TV%)WOVUf$W^_Y~p!YRk&1?{uY89A}8jU2pZr^2^6^b z6s3wM#}H;fX3i-8nm~cSHnkU(W24*1nEr4Elp9fLME9eAiK{bp+MyI((^}9UiyjwH zK-9!0CT=uchM&;RgbA@H4>uguH767-+i=#+hlB65l@T~M%ZjpGGq5a8i~!YdnWF=Ct-VlpPtJ$C$8S$|j=mp`zaO9N zzts<8LT!oY;_i<2RnP(CZ$X3`uQ7(0#LAC3|&@eQ{HoMUZW@aNB%JQj1yO*}KycKR|&?GGpL1@@2 zUkJKQ;r03QUd-pZX@*)}8_Aa#Sp-N(f;fLtO48_Y=q?ty@_my6S7k+-GutaF*K0ed zx#6C?91g*MHGT2&{NQkJ7=W|P8q2%1k}pB1h=@|nUmgC`R>0D{oLxRPnO`sU$&tbRH*S2XcZzu2Cb(+wevYpMt<(^Se}A_N);cVBz>^=|eIYwN zIT(Z>{1Gug=ildTpbjs@2p|vO2$$1993=LV?d&5v0z+-QtG&o`N7$eEn6MoWJGfNA zO=hU@2nz-Y+;(!nxmQaD$vqWEUoDNerA#6!-;!c`lzOrOo#W0qf?VxikXLUg_t+*AA3Ad>SP1u9AQs;--Rx398phS0kjAiQr+r z3%Rz%r40g+eciR;5)BF6kB*NHc6SahRR6=Dy`UaKOw9-J?rsgWIuOqGYE7CTzU;vo zGemMS@JEbSzkW7Z#}kD>l=i`Kf<_^Yo^TBqj9KGAp?Z5OdEN2kfC!%zAAv=e1}p98 z#U~EJk_hp|nZj@x%dh5bQCqizi7fL_-P^h73FlU3xC!!;}5D9R3Nn&EakGub}9O*xJYVl}458AjuX)i7L z->5zQJ!q9PR^)Qv1SWFAC+y0`M0=u(5!{`iA4ff!ELPA1`o#&qX}$En*VLO!>MlQu z|MpMfulgX5gdgSK{KNc*IvOR!W+UkS*7LNW|6}IK&gD^JZJ;`pTA~sx+qjN=7&j)c)eQWW^n#%#zyUv{ zuXk8f=#1n$n3JQ#8S+tfVNhU608l`$zda}L*?_PeRk3tUSEOxf&H`+Z(Ji6JX#GbM z2?o+2K+}_9K%y2n6&lqgNTG2?;}kNa@#drqGRd378ijD8>l+MlGhn3T+T&7M(7JNa zEAYja)SWL(oyPLlzyIy<$^}CeUq!Z=;u>(SvRxx6t^6vt0%9 zsmOG#QRbdj+96(XXbdk#?gHmJ$0TD;bx?E`x*O_6HiHPHXs~WK(bcM&Ws)F@No(0c zn*-V!!eyAXV7bR4_dkbpQg|c3BwVEXDOKin+TXvAZZrLxU+aH|g2{9WIE*m5-L{)i z>RnZVMqyNDK0=;J1FQ4Gf%VL4i<^ObI@ln&JXiRfobC-qJSvn zs=!smY4p9JIPB0dD#@}`Zs8OEQ>aEHb~B)2xR7t_nUOJv9m3XBu#xWvv5Z9PHCDQv z1o5r)QbD18>GYU89Y#{><%fu|K|3s?q=?K3dnS(;U4kO0lRIN_pw4(XFhm61XmWKK zhGg~8lMPR@aYo-g1DbHy;mOF>E}*4MezGm@%QMZs?%8w#FO;4o1XAiAW)LKmgM+LJUd!1%xj>n& zA|jD!dbWbQK&5!wv3n(ukguasR#%00gdq8{ zy{?8s*!DxNi}k~cozvGphMzf6Dj)0j!u$Yk!)ZT5aFb9iY|N2S^B3ZF6vq}HYHvtz zqPc|jG|VmSed;y^lla~(xU&=PSf>stB*Gcaz3U%BREELOgc(qGA?}nHpkj(EPrfch>uE2@b(c01jsY4*2O0WDTW#(c&#&_&3K~Mp)ipU=3HLEeh$!`*`Gya ziz=>L#0+pEZ*zv9EE&i`E)RDVG{il~wk%DyCxi1ljOpd!T7b|IZMfiZ)OdPBl`wfhWQZq zhpIu;jCJjK$1Z=BuT@bS71z7~S00rlQn{V8+6nDI*wBRdRj1UgB2|u@ zNHI;6YG<25DO;Tcy!h_m?2X0+R@u#47C2#_7IEdug!YONRft?Yf zmYq*nhmA1Jo7>Rr^Z)}$EH*+l2#Wcbm&}2DKVJLN2FQFC4Rqe^x4`h5v@2Ur7K<@c zpujMcry9EOt4xv(qb&WzmLBnTiw0XjnANn5sWEU1*i6?HfK z9)#zRJpn%>%fJxGQz*pE+dr+4uu3!WFz7g2&8vpmaWW)u|G6=^rCaoUjTIzvZ1XGi zGr;FepFj)KcS|k6MXvwBp2y1{f_es*KlX#PX#sIStFwYimNg5YrASG%NSbxUS5jn! z#Kpw&ponR&48@WjwwNa3@%ou#{;{O`YQbb|W(al79fO2rV^D3Nl-2Z*3A77!%b{n{ zTOKfebn6{lqq-6aIRxK}`O5LKAy!)Qwz~;*KV-~2V9M}qTFVY>au7P;*yPr)R}A zMxTGOIVFAkdFB*Y-&kx^GZ6hOkq5(PA z-_Tm|whFZrZLPGi67GkeVXmy%SpRFV{EswPVxbb7CDtfmA2wW8`$s!35BERMFrl0_ zbP@E13FAagPN`I@e>($(`mYro{>x01&SA1fN_?*W8yG3vmB2{xdk99%2l6_fV3HqN zAkxeRhRA;#3xrlCv_Vv*WK(2A8-$v=&}EcntTFPLR){pwF-8I_geJ>wZ98AKN)}0? zSQ%wb-9*sB^T^wi)j3svBUM?Yk5!g+ld+8ddCGF66qBah4SjgJg^qIlptfu-KKrIk zv}FtubiDpb=O}3eSQA#!6A?oaw!v<5lARa_Rkm4S02h)dcdkE{K-!1R6G+uW#fmu? zf%$X_e1FseUf&at@nd9Z=AAH`-NSiW z6g4Oajqv+rcQwZFZi#aKrVuA~(1`nDB3mcurO)fppbDhynGSf_G=^?sz$|RSzSO5_ zVy1f~HPO6_9Sn2Vizig7@Sco;Cj+?$O$HzwZU~84=K(fGNtP`9uZj={b4h&Z9z=!# zCQ8PX+*WB7)`(Fta-%t+dkbr6Q49xC0|sbgu*#F5zOX1DcBcARF6#ICDWSwz%p>X%q3Iy77V=gsH~f&QF;hX_Xb~D;OMu~6tqCvZNIUw0p=;q+B^|se z;k?j`T{|}her}i8ZIoGIbz4OY_>4P3z8;XlMqk@AW$d#pS&C+RPf-;H?qy0N#1#>U zi-W;!FV z@L7d`QaHZY{R{2R1!czNTDicWvoGDj?|U5&WqNW_G(a3Pg^NaO2xi3uBH!f|(&h*X zRq^OX=T(I#!~|ftSOx)^3lkuNay>)JvSWc{4J<-5iQ0~MF_^Z{qvu&W^ZJ_*#N=WL z8g?h2J ziKdxpUCDhE0Z-1tuSB?!1bzjTX!#PY*eKP~K5G%&)R@>EpnMH(7klQ{H*&hNiOJa| zAooCQ^&e^Ib0k_Y@UBW1jz;BMQXnE=s`Ei4<%0M1l4OdODn-y~;+jk>bOT%GrVEQf z@zfh8y`4VelXuXNHrR`k)BRTm@B98}5)Uc;IY{<+-f5y)T|*P&^H;VBK`&u_feLVA-u{kH4I;goOyXoV22P0i6=**`)!Rv{u~W9b zu_?e(r$}=q5l;N^6NDt2J{6{N1DVYXCJ8~;_PHS>8Ms!gqIa45JaH{J2rov_DP?2{ zf=j*9E_WfIK+jpAu(eVZd}}u)m+8H{>8mkK9N~9VLlOW)I^%u}b;bE=j3tGC>C300GJrw-{P6C<-HR5=o^FWON@(5l~U^Kl?oCbF&K;R#pVHygP@53)2ihKDknSpjM0Kfd1RM}{n)m-?1aC)?mhUsL;yMfgB z!AS;ClhYo^nJIjoJuNLX@{nv`pJKvFfwQX9oc$+_g512lRl-AgRR|d`k%+P!_lPY< zaT$q@M1sU<4pfd^LO=0BaV{N_-Ku^r?S3Wo9|IRnR7J9YLo%D6z zP6C}X9dKf=%N+p){8FD$<(scj9Qgu&pLxeTc!!t^=rb-6Y;w&FqT5313$PbNKz@(g z5^$Vg(~BMk_Kgj8>hmwYO*iqaJjpBZjOzymKVNPg9F5O*4iCln+0N$o(4PC`3Ovlq z?WdQ;t*Y&s5xR1a(4NUv9~Fx1Yls{%`zbaz?-Wa?u&I`&(+n z&$~@dDTQmpDgK00M8Dk2?jVnAx+>`A!Z-k@Ke%hAfj+?WglauG zhxUSwmEz47N*>E|QNuMSPThPtxh*01hH*Q%y<{{rIEuouB=z+bSwjiwXtV6)ii5XI z*>ArC!Y^OWN;k#!I>A9AIS?h_A=C!u(DfN3q3VvE)|++%l?_l;ok334f17c1)5$EN zjBkW*DrqFuRnQ3}7Ot`21y4^82wou*W>b?P?fP148m@DIjoD!sG`G&z)p2X3`J@bQ z0=QsE1%>tr3dIfeHZv=@jfP$mrJXWl_Xn~PyeX-n&H z%rqRD@&IR-%+N4CI3wIb0~8lg{21m4-~!~v$-}a4c}T8-z?6I%IgncXqm&5<**M7J zed@IJW${#8I3<)DB9~Ixhf22xcRUQol_t@UBWz) z5=cck@IfaVnT!?ouN0S2hA2KyCISH~PmQt}m@ltNcR-f+AO|@JCsD0fd(;Fra4OmE0Bb7F^C-DH)J9=$z$lMB*?Wu^UJgg{&X@*ic zBJ$!wcaV5l-tF7EQf~g3&H+~oF%G0K_lEXr@Z?9ZvW9Mm(Q9%Ud9+f;DweZyx>9FEZ%wzR;=&(!zT`b1tFU8(NyyFyUAr=9DR}U=C?S0cSXWFh2mg63O76 z$K@Tu{JcP;1Ap%$$4R88<0lvB5%uZ?Ez70(>T}ZzW@2ps>BZWOAE$hnd>O+P{4@4_ zJdEdLdZFV1tfpi`5@-zji;q7K%&AavX<0x#PEwSvUYC1`{*~Ua!@OY<`gdO)?z|p* ze~w^=5laYi3@O^U?Vj*2J<}?1WXlq6QoL7FryhWJqAfWJ9Z@UwhC;4nh>^@|>=4-L z>i)I=ejiA{;aAtd76$V^a=|eS$}(Y(%+|KIIat)p70@EjcynBQ%cY@%32)$Jn6@J* z@DQW^z?Fk>B=LLU&Ms!xN{ZMLxC1p?bY7Oq5!YpiBlbx6!rWFaW4c)e!1fq(DA)&a zP38evE-N(Tp!&jHV{;>2zi=`QM2^OCYhSWR>uNC*mtGQd4X@J#hyfFm$c4)&WV8#* zE%%1Oo2Sv&#d7^HrRYEz{3|n6*(_~T@$sD)UXF-Pg7txK7jM#F=v7?S7innOV z@bsuz6g@UT{EN(VE@RRg>W)6*pWUUB8Yn_+HaGs@(f#5}8p0RZi|pw5Xg~Y=zt0{R zRPWgBFBMz?em5w~E^ZF?>-sH_hbe*> zJkOK14`@eaOEl(qB}`^3bgk!zzPw~VVqXm&cBT9L@C@?;hFJC2Vl?%eo@7ywt5}r1 z$K{H&ct$UUS9qB>&OWvPDN7J>U?&3as`~}fQcZ-U^od&)+8u=Liit8jMaCp}4lb8D zJ2I%9w-QL%F$Y5%+7*?BAX)OPJwy$F)TC72lMwXP;m`0OD6H;w#am?rNKKNmWS&_Se`D-l_W427$K!bt)O&NQP4?Dm+_ zc0&hVcQ<)@`P4SyL)?`M^tx_yNiSY64C5m_iaCQyy9w;E4i&B7+*+>{P>#(PlnO+Y z?NVCRn-yrtP%aBQ>%23`YeE=4pAr<=AOr~2$rQ8!;?UTc`-HPX$67c_Y1^rlyO3XpkIyL%cklU@&aQLmLcJ< z_8V)Pl2eVyEAi)2G*5!US#8KPf?L4gbJQ)<_XY|>3MLIuKT;iQw{Okp`ObXD%N9r(%Ur2m@B@*@ntnfd-3&%ct{as)L$bj^yy!ZRB6HL8~ROZ9KR2e z7+u$Hu*25p--6~CRPIf^;2YZ=k9i95AO;OmP1%(!AbDHBB3-TXHzRd|@lm%}q$_t5 zVId;aBz^rQ4=b0E(A5MHUv7=EX^>iv3A=Y5I416GuJhfy_loGR?M{T5q|; z+E@l|Yu`&1Q7+8A+zyrtSloTrs5+U?je~yX{3P5&aHNankiMWS_E#&VmBM723bH-v z;?kk9)b?^fD*7#((5+gwUII%&3Cn5?ia^aN=n)*xvO*YXXr^_N`?I26Qzf$Zo8!@% z2x}BgQbW^LhT54)1@<8oHTkxrmfFoNT6vW8F*x|m(J!R|#3F~ICl z7G$E@21kMd>XqHy7n9%rLq@TM7sKPPv%`az?jN&7-ISl~1whk#3~mdZ+#u!!F_({~ z#90U<>axDLr?cIY6Mpl7@ns1G+ua-`VMyPvyvdbNOIy-zEQtp!ie0bX*6@! zVbckwkd0)TMBC1~y@NnuyUu_H#!Z3(i~J?2+g&;S^(`Je-o29J*9>rA@%<|yhQN9x zbU-C>QQOLfS5@+ebGiB0?c~XY*NKgXPJj1J4|`Hx8X|~D&BKCVfug5+1MO-G+JzY3 z2=xoFu>l6Ay9qgHR|b9?a%8hcK}ia}t^WFCo!-zeKu9_cY{o>Sm0#WziyRe`LJoPBsJ`9|SuXSAsGD;8Ou{@N`|XdCy+XKpodo zo-h+3ED}{}oN1%49J{ygZ4zNiz}{_vJH3gyG1^g=MaX0kZY4@n2zhdehU8N>XEd zO*;K-Lz$KmT%D?9D$J4+@F79gX+9;#LOoll8y4UbZJ|mJL8%_1?}~v|1HQ~3CT5Xj zu*hmYL%6SaWK-Qpa?{E?Jr{GySl?T!!+?1<)e6$MaOpnvsSpahJ|a!t)JSPHIU$d(|lEFDu2qcZjQLf)g0Az9=`)UObPYAU4mh6L@P?xTMi$ggQ$U==gYNP-VkVA3aHA;og3L=GDxorAN$=OYUC z=pjiRsfW(U&#k^ot_G&2M7OOvsp7=~b2lZkCjrPlnd_93<^Ce zJ4%&qx$aHp_3D7kk;=|4KY8HLB$dkYO^$Oy)zPu*z6!6VqYvm(F14BjS5U<|r@UL> zEV*9^%&F`jIhUh+sE)AWVVYI-O&?K0of5?C{D8!@>#~?ljVZjQ&hWUPeI3Lxu(Y81 zb_CnSH>I0&;sS#g2$xmx&9Wi>6($IinmL|EoJik{>zNN+Z>Y{%^gjf%+c75~Sclw- zL8yhQ!=eKuRnkgSz*0T6}z3tvF`FSaAemp@h4(yeEmUvL65%FY@dO7mI9G^Lf7PkjO+-G3`}FUo1WHr-1))`ve!<4Mfi zcfAs#s~qVfQ&Z|Sw?(=FmB{ytJ&@7*A%NfeCKZe*p=*ttM0%{wE~C!k<+Tn&j2ulM zW1}(UScv%yU_?~-=6W?7L`9Z96W`}Sd~{#^Gv|0V#{5eF0z+6|Az5*5Ysa~M8-V&c z=pMdc6u*Kx6X;#$x?%K+u%8P5QlqpOHk(fl*d3;=dMcxc6c=<_r})kC#-m%fOb}y( z8Ki9QL3|&&QJg9~5M3oe%%JZ)=uy|ZW!+2$n}f=YYmB18Ub9&(rg=-?1x_r$KJo*E zqcC{|gmnm|OH*4*(a2BSZzMn|uzyupytA-FLHHgKRc_qga_#nZSq!n_x?N%o9^%w^ z>RR?hflWv5TtL^X8kvZy9@4Z*(I65~w^riAHeFq=B)c)FSFT3`pg}FK zee)ctx?zoWMA*5LJI~>4KYKPButqJ+6$Tj9nK>(*?ENLzou3dySRmEMV>h0(uI0T& z_73!nb90Z0Uvu!f^W5V!nN9++ynp?$`P!7^L3Jpl)WJqVRb&QHuBT`H7W~gpc?_Rr zqGG<;KRlG1;!HDi@xaimGBhOEWPDGW(4(`=luBC2)fP>qm2I zIQqI>J=-}uAKSjFpti)RZJcJzc}l==*I4{UC?UIDQk6}XiiMsh{n#c>DW=g zjbXBre&6FOP%L_n9h+-(9wbW(!?u=!54BNAI|HmK=0f*u;#rcp9sL8KsRG2LP>-pv zw?Oy+bXns^^8qkG+~x}=EtuDpxB&;~cNhuy*N>bM^$jXt51S-4^I_)Xa35VlAyP>{ zO0#+x0*wjN96Y5Vrw&glX0GJhM=wKaNA zvgx3k8^+_WLC+j%$^v&PL_g5kH~Tw#`=^g|S9=BtB$vOS1an)I`ls|Z=s^EDCdn9* zZZ7niQxuwf2!qb*mp4^So6H>V;2=fY2reWceZZo3OE8-|S0(qvfSV93Y7c-!p+XWe z4$5_y z1q6S4L-H1qKX!I+2dU%o$(t}AK}~Jy-|aJ4{`q34;6ncOnLgn<7upW;r2N?P@*>)h zFQk<$66SFu$bj>QxHIx!S=VQoVP*P^UdgxO-X(hF{%^}oezZ7>qtF6%;l4+|6Xi5k zHOkW7P~35s;Y%fXRd5=(Q-#m$F>B76Yh=KkFK(7t#A%%Y=Pka#h|`v`9jxskYSjZK zoNk{nt3-d%Hu9hif~>9Q%46=kv^r;nQ9Tw;oKqi~JqvbyYyfwjej z&NW{Pm48ea@hPvDjD8tH>PBfe!-1<~*PV=d*_Nw0!4&zblm$__{+Of+gc8ZAKm^jm~yfS|`LAjNAj>yR_nrbBRC13bbl zh^J_yK+#{3+{w+CuM|y$6S9ul1=ugel+|-atjyffh;IVCXHZLy*t1*njiA}1&04F zF8uERHpkyt$G{WH>N*Q9pHk6iJll#H@+HyPcFP5a1XoAOS40WpzHA`o2NAs?5f(~_ zj~Bl;^p|=B2E)}D@n*0cbju0fG491>LEv8z!+-3k5_z_ye6Q^h@P*BvjjLk_Mx=c@5D8|Y5An2ax9^n5J| zsdtN)z3a-Ac7$t#)IS1&!5|N#xs0B|@?d z;>NK4Cb=%|dRkye(BW>Xw>ZrfZW+Jlw?9M7cXwR8JJ$$x{bF~!MPghO`UAyEv+|rU z61-3s+r|zWybEnniJhW^PGbL{!|A{j_{*pHLgoE6t5(IQ#VoJnhA5WBI!_@Hs=`8Q z@gj5;axdH-IxV4O+B7>UKh27JFM~U}@Kp8EYb@%CRZUUHtCeX{LTE%z*c) z9NcctOlJj0Y49e(1h#>|`h)`T&-E2qcW%jn!3cwdp{h*2xT?4_38|FxmshZ8oF8Iv zN%$!-dWfqLkkD6528mE61%1OO?9h4t)mMXznZv2VQ3D!sKs0F6*|1U))-|O!&5%ig z(H($)0!7r#KP-pSwOb?=L~XikA+@9?FAl>TKw+m>a9{n1;NTLVifdg;YBuu{-Q{2} z?}ObakCH?*$L%?p2Tgb{=E#NvSk@)hl>w|4cEYVX!phDYSreE?P-$f*RaxM-6jcuQ zO$9pKJjYen4Ti|s#iAf$-Ydxv(}W^vl;M9B6h&-V;da9v5!(kJNC0^g%SA&J2j1;A zpe!(mO-iOIi#76C`aME2?qgZp=_Lv@FUhs!S_!nI0-IyHbhr+98i}0C^8;g}wtNIF zA^Vwq1i6Q$1$gT55zwz@c*ld90OR~6*T(^6edQT|oluuL%e`TEZuCW7_i&#xI|KSx z&X@#1YLS^1m|*Qz>)my7AY`w=r;Q#-42 zw;9g>2Sbx#qbdVtY!$+QEu?e?oX|F_+7aI`hW_*F@iCp`t68>xb5ktcBF^%w8vRL_ zGwJuicb36vpr=u662$pI4Gaby@$Nv_21P7I@i#UE?6r?QC&^fyu zHP|_Tl`)iwN0PT81*1@5flCMv-(<3C+Imh0pZtX+$nfT8DFofo?aRw9MP2yrk|&czan@d9fvyk?MTq9!$tSYxV$I0eIzTDo()=LQI(&015oJtEdT zpDStefUqxbY@R2UYT;RC{U_))y@s2o$g6^}F$qO-%Ve&oDcz4AE?59ozXMTTeruAQ`+~=2}|PEBoCxnC5flgbDUA-U6nAY8Vn931?*;!*zVuUkQq(# zY|wQs??DbVdJc{-q!ycNth4T1yV8($IHA=zJB0e_>~O3UZi?WoDjlR&ImOyzG#Thn zz@UwcSSQ;F@m(z0qwi#`-kFd&dWL2)bk~Z+iUf}peHY`U)1oPFszR7kq!8z>IePTSG_a%9;%qtL1{K@|bRcwJ1f%i;!fdkAe+V z;cUy+t_o&pTb%N?Vdi`DC0Khy)PHr+l;rAd?hKdx608;&dEt3=REPm$gOXr#KzX|r z#vF?Q=Y&KBE}g0Yc1Uk%a1OQDrIs8@ARFivg?;D#fJx&bc;r%@uE=K=dUUjP{vF}x zR7k8)SzqLph7TAE9=PN9l>@$22^LjN>*bJpH;uJ0Xb6gv+7W={pP`L=Qvjw|JW5RM zgi!`h{_M%Z!eNtW*;-Y&!uHU}kppgF*{;(884c{;!W|)e z-*B>t)FJSk6zyuUDGJ#}smbm5#%=5xph9b+j~b}fuV$}6M8A{hSZ{+sb)t9{)lDuF<1I6UElVfsK$7POuL5>`6E85@qmBHPr)r#u0j#M3i$G```+RTLGs^4DrCf;zbbl0_!~pQ!ayeK%Nr#-?VaC z2q6#9^pS7jyL4kiE(A$Ez1Ct^D-2Q1j@5R#i2hFR?6%nnA*50(Ic^W(eq=WpVN6jC$nf+5J$}6a)p<&M z1-Ok(t(s11lUjt^h7gH%B&A$|oXjVX7dWC&&yyp79tJxE-u>)Z#~W%w{}R9-finjC zY$N=G&KqsKzp2IUkuWpCEAMK`M|N6Uv1}>0pc$mh4l8M+%2k7+t3<}6on5TeccHY| zKHt*>yf6p{es`xp(k^GGGHRVt5l!6ra6iat4(0+uG~#v>C`nr{h^9gR;@;BdVhotQ z=7bJ9{h1O4^V)Dnpf)*~t#He8gbjh>B%!e^Pk<1C1JqqPDzd3-x9PdCn?F7lgdq@K zveZF(;BaWesk7k~D`z-eeoOps-$F|7x5CNxtz>k3%RFq~;zdj9iWQW-p(NZG`dVc1 zG*$p#`aVNm=$Hixtc5UaRz?J`75HsjjRiKZIFs*Xk;}GE@q)_Tx9%pJ5RS-guVoYZ z5zuCc3?VyQwk zzlIY&JzUI&oWs-r#VoUK-zZ-?;(xdTA~$>QUPZh`LM;_h?1;mTypIZx6%cz}p%Q@^ zA~mTTptg*{oy3O(X`U@|N+_i{*P6M2uJ!sRPEeAvmxdaQVk_O~kdhAiU~7DTTR;o* z`nS?&owYCL)S;aU<+EJ(`8~&F5^=-P@Z_TgY_LOwEM*WyFi(o#Mg{S8W zPltp|F299zrX2iPZX2ULhsB3cQi1x0!CsopO~G0nc@q_l@QO=E7Fpr-peTZtJ90?p z5g|7$AsF|BTc55nRQZ!yu@a0iL{hE}m{)VZ$ZdjYCrB9KHrEnNL4;s{oG9|9B-;si zaaa;XwN`7!=*Yc&JQMYa^-|8n%UZ6E2g%ZM8s#?gm!c|s&4{w%5ys&sTd6e39fERf z*(S|Jyfy8cj3O!B?G4kasHt8C#u-mP87&ALpgf`}2_TN7nhYK;Rr}}q3gj;8jWp{L z4+lvSW~}iUhM=j`XJg#?g!t54OZ8P#&x+RX2g?F&D7-yqZj)a_(iLT(;7Xb6K9#vi zGMN3Of~H`10ILBcU3fdV%d8}$|km7=-sppHbxe-!s614nw{F+)lIC{S2;r=A(1#M9ri>|~XGjxbkRdqx zS3<+3Qq^kdQd1(7I0u0{$0qv@0(W{!*em@h_#r^3S0$nk&=XhCmITa4m1E7~#;yLm z&^1p9VSAi9-+1{j()_gK6@-Zf@#HGhI>hmax>Sz&fyR2W+Ww+RKwsL82j$F?>%iKMHLi3B|` zx%wR<9@aw*Rn6t__A$nqMBQ7VO15-0xa5Y}<#IUB){?x062s@K1{^OIH_|3@Q!OgN z(hZA_7gQp~>ttv5^w{=k9lKNR+j~wHBlBBGWyTo6cMR8V)+)cC}ggEI;nCs33d1kP_ZFXcyBT9}lIe8_Bge0^{LQRmi)ibm5)!*9J+EoBZ%IP_C&RIWoI*~}A zP^inUeR=k?TiqIW0(A5xd!eYBI2WEk_XA_UaN|jlBFQzzh>GN*gM$HFV(MKdua;8K z5<2B?i(>8v20Q>54`jrQS-4ab8jG)Dgb&Q_AucYAqEM9D?P7J*Q)mccT(?N&jl0AR zM*o1yV3Gqb(2k%Bl7gGgq z2{Jk&dt95yTa=~A)L;a9ve6k9L-_VP_>ZaVc!|X#F5upaa^&tGe#E-4+5DxO0e>C7 zrs%=Q9V=a&Cf)IOu8B>1F+a>dnJ@Y_YO#6XmJD9)0A9Ft{?QC04`uj4R;I(H-8B6h zLFnJ#&bPJ#+-52zmME%_Q}kVx#b}k_@YTPqRPp>S9YQVPOJ^0F@c{qemOxy-^B=rG z?!E|Mur^>qJKU2_@{8`!4Kp*reCmMXioo^ok|yrg&2Zr5FDV$Bgwk7rjO;POh$Q&T zvqF`|3v&>)++ean`IPub`e>7~0fgL*B$t$CJS3}B1Xv)uJg60tiNKjyDMJm)gh}HO zV+8t5yzl3?S?MWy=CcJKN021ujhG1)HGm5BSdZ2zDvFC?y1@!S0RX(rULlG$R6=wg z&1dAxL|rK~@KNU<-!haSjSp2~1mrr$5s@{!^t>{FiN9mlkQhjT!MT&J@MJ51b&E^?~QW?ZBc;O+Qe2?WAO zC!vT5rKqLzIl?DD#YXm?FJNhR9w_VpB|(4$IEw%lJ-6n*R-}qTu82OkTI5>1onzRP zMl`)DNwApg7EDxf*QaPxVZ@32Q>l7=y#^v$BvfnUq=fnHSaS)`kC#sXUdKRgjKR!_ zq9urA;l{Q2mHHSZCDlU;!$(C3;Tt>o%SO0+lF#>J*aXbMhO7z|R~-Yp*z81=D63l; zx~$kgBz<#IpN?9=)%fa7=;&oG(IXG+;WCs6C*vv;1!|kPCpb#psFvM29m)4?zNvcV78gqO_qgP6LivQ7lcVZ-8cvM#AgLCN<{I!r?9B!f^#J z*3c_mNLn3Gz@eBXO06j-s}$%{7`pB)#spt+joX#0EW?n4v!TH7H*z#E=IE!#LC7(8D=RZvNE3JA zhNjs=b{FhCJa4XCtIn8r^O?{8b(0y;sZb^78)%2-N_8&Cw4u~1okGR|JczskG)XOt zh9HX)>`{-pNlQ#$NXn1-4Z#w4FWz(0bT59SYi3N&1SHdS-F9s_Dch<8Apt!{nOD$1 z{NrZsnr8<|0LU*Hrl%6#&d!F|L46Z=KWMOs z-T$Pg%8C&sK?3xonDMQ98B`c6rp4s8=JuT% zCqiXgVwZ|ZUJ5OKd0We;x@!OM4Cwx$k<@MDw-;<0{)<}XJH0~TMfEiK%fi_!+s~hG zCw<%%l7C6u%04I=Ci06$_?mbC2EqgI8Wd|y04!|`p9N(>;5qXpDR&8QGSSsN0fv)kPpui2RxIA&& z;M%CN0_@{Pw0c0Twr%>OKnVP`t#9`&L)qY;s#Wa>#l};A@ITWuJ=i zC$g2?n_Q+tOziVvaL;HOph86T)6|NWZ0RQFelJ^%k*~hWyC)m zaI&D*`Do5w3C9OE=8gx69&6v&AVQ5zJqn}R3> zP{gsy%ki59*Bb3PjfX}(gNkds$uPq0l+Oj31~-5??&zEkJ^GZ0(wG}g3Ea4QI@QH2 z7Oj>fm5uP~V(3sfC6}V909E3RD8db13XB#&dAdem*(UE6vl}OoIqI&N_EyF_0eo|v zyBF6UbrMu}5E+5h-4&n3!l7=l;-O9- zR5?!3iwukmuK!(8z#BFuwUS<7I?j*+k{L5PsGfO|U8M$!zk7Q%T?DLnLRIn^QA{u# zQYjhjM+G{;xI;D57FO&+tW7ck#bzo#d`O@ncX;OHEHj)Cs|x^W-QJy>Q?;dqWuVeb zDHoO#ETLc+ov@k36pt%>s%9^2aOI&E1e)iVs3l=wUy(E+O_pngc?UyGKc_W~;7#ca zcwKzKb>jyF7S5}*yq03=x(8F%z9_@iH6xbJ0=!a6js%)WhH0`l8R1`vMx%g2?)WY5 z56Vwo+;rzf7X!qWt|Kb4j+-70*6Cb}AW>xyrUsyKzD~)K_qZ!jgWw$3xE-0eRO%LT zv^4cjkfN94+io}WnhPY@++NJ`QCOhZ62M$L`GUtM=>Ke93bQI+a07`iQtOO-m4@i~~{AcyA0wWSr9fjb?cS2YLBYiMcU z8HaHz!pTCOcpq#zz{m=35N8s>a`m|K)O$<=Lz^}Pg_Tt2LYf><&&D#EfMP^C60Zo_ z{v#O+4l1sSsKelIChu36b_@HS7c}WV1-8wLMRXe^_#02;FQGqu{$KvYz(l)OK@znFm~H>h{>Di z*DkEGhptg}aYy^Rih5P=7geY*Bi?8mbpJuMLol*V< z781yC*<+6=b*v)0eC0nzSCyNlNiH_VTy$xvkV~mUBmC(d&&gi%igf&y;BJy7Nfbt{ zE-51u1Vicm)y{Frt@p|CV|>6t_TgmnC3gnef#nIWh06f383fFOx5txogcU>yc~dej zfCr&1ZVg~Az#6m{_y@fIC7wDtl@;NYQ;?$klHsE`9uS=cS^%<`A!Pc6otRFc!=jnAEJJ6)c9mHMil~te*)R7gpN2G zg9eQ91^`n)tiKb9m0YhRug*pvoX#k@&47~lXFU!)c$6_Nr79rbW>az(#nhaD%H#G9 zP}Pt!cRD2>>-?4!gLiI2jA2S)**cSyGGowP>UvHF01TBAY);-`OK^k>^O(u+SDwY> zeEwR)=hVxogVZ*kV3~&sv{;WWvWlf3*kCi zCC%+~?kb%jk)MtM|Ce(nBYRu8wfJV{)Xmt@w~@^{ zf^&20Z0wFJJj-1Rn{@6Y*bQrsvXz*Ea5ir5k0CqRz!X*$E~ zT%gTC6VMHyq6jfWgi8EJ*3>+LyyA~?ij%w;zLBb-i>Z4LqC}eb#Lt(JQv}Xx^u;Z% zu4qpSYMt?S7-0{AE$fqgfgC+Y3Dn01J?2wM<$4HX*o zWyat%!&EtDXGXpWthA$KZeF-rhbLxZd7mb{k=uAUrm$Bne=J20-MTnE-90ko$7p!j z?a%@+eU{CLvnn0^b%8TRE+!u9D>8#d@*6pj6xQ47O4ZJ> z{=;(vkG<<%d^JjqNPDD1P6k}w$_93^xB|M1wY^aOaG=A&c=z?dut!Se%-{x^JnWDr z|NQyG4ofcdqY{^mP6S3}`re7FgSNf(Kd4Guva;F~9FQ5-3xRAIqlAjyTv#?|&Q%We_~j63bs(kLr?7o%-J z9gz3{N@UVkTiu|XIlRpgGqR}8d$POVNnQ_*NK-J>B%6l6vDFPlu1MHfdXtY3ZBx>K zalgFr6J{HTP^bJ8BB^0E2w06sK95?8v4OoDiLr_tnRjbM?MTXvB%XnYWgGIJ;7~=8 zYdlz^#pDKJ0iNcQhijZoujasZ6s8e`RRjpu!3K$_WQcl#yetYcyX|b~r8$BK;Sklm zokYt-UuWg`bA}4NPgRIbDz30Jz70r_U9*q39=#guG5eBxwoL_6nq*)?be+xJu{27! zfKx~cPV^XR5{W{Smp1j;oA|)sGHsVc_X?dFrLM=x-xt@@ zKosu&@sD!4fSW5)0?5?>WVU&FH7!cYD*fbUaO4ve+N?wvwEbLJHWO|#jM z)Hn1L$PR(AqIH69@s88TwE+AT`X$kfwb32o=diwY_sHX7Ofvf2@C{IF;b}~|qCba4 z9_%LjQiO{FXmd&Kq2trq~Wj8o&HSEzbXFVo_A-4U(4VNue8Ri=w z6zR1a?mQb|I7sw_R**5Ew``z z9{w%H5Rh4mg{x4@&82X;tkG}5@S~9@*8#kR;(Xvy0?EFCVWwk&bX$X;Mjw+qRr&Y< zIpT~|?|Vd-8%18q91jKbK9k=Q^-!yzt8hg%;B|H}TY&3jem%p;BZQ?paB4nUw=zu4 zneET@%86|*Zv{X*FWM8XDo|ciS`#Xn>0bfhC}IvH8BRV-$YAiEpA4(Cka(8;aO-qj zN)`YID~z@~m|+n>-hg^&M^3a~GQE;}L_Q+N!f>{@oO5v%cdUfp{VOT=r%ZRuw(lfc9%_aGmN|FkXRgkb?8HE=#Ka#OWoFtKRC`C7YJwTWtzl zYqiI));Sp;aOMd|CzRXu{;>_OABcppCsL|x#7sa#M5O5bk8({ND2!b1!*!$tTRK&Gk{ z?10Du*P;~p!H0gzIIStQS)?k-algt*65#6FyhGrV!Rf2PiQ7uZTjCnMx}F2>mNKC7 zt0@d|I-OS(2l6nuMm!n=hm4@K;!|LUD%5G`grIpPp}wj=|--+Oik`KZGyi!DNim}>(txQwo%0w=(CV2G;Jk} zW~P%1*WF@)-Y<-T+;F0~TVQl2Hb2X*V0W=@@0UwxSD^U`DFkFR5YxGUho|U)cLR$o z_t0vqD;^Nc(^`CSXFi!xDV|Du3s;1nl;>?$^NXkX&!IwNPEqoR!f zuWa;Bn=}o@%pKD*4H5AMNB(7}dEqPJO!UbyqQRf|7`%kIg%_y62|ObzplgKx!(y6N z&hV0GcBk&KLxeYD4TD?Ca=AiEdlbf>GY_`TEulL2i8`wK1P-U<3L-gZk1QBOKpt4D zO@g);yEaiWy~}PH!)iQx<}~c!vB^q-cuox2ZVeT$=Tmuro)e6=cz6gT4y8;&Jj?!C zr-S3=>I6^5Pf90x4^{w2noDddfg#5qIHX7R?*Rn`ZNZFrY-itKiPl; zRrqw&Vygn3wmz%hNnGICLEU0q;)1tQqHrE?4=8%ddN=F?JDd{k`MD+6-v}|Xf0bvZ zf#(1zHql!^8Rx!9?mA=o)C`(C)>tqe+8vb!UJ7 zaCb-3vf(4h88n~Eg~xB)|BrWm)@zw8$sSiycEP6w_y%_0?i`<;9t`?#4tjgR18csM zdkzoWsUKY{pUE}Hhl2rgu|!wGH|EOT@$unta1Ai4=%;*@(>(UhJ_MH??VP-&kAiDX zj(2J<<4@&E7|fc^X?CW$_Ra3@nY(+hf6_lZ*x3);2A05@3*^?`$(!TD)1$#zI9w+` zANBl~;SKwTJ9|6t-&E&5{Elz%$+HbFGKephYQNRX%{TUjqr=mKy;nO2VV4F!56=1r zC%xmNJK69+nQHuC)3k|CX&ij6TU@!m_vW~F6kLy=RIl$J?1PdTt~vi9U$uX5 zHmJ^|d@2_m9=ti*J3M{0AGa5MW3Pw8&SwWZ?|OsEc-4H*cfQ;C%i*zk7rl+&9>2HO z_YY3p?&AL*R^Mb7dU{v8}^+ezxwVd+>d*Mlbz#}9k)zj0q(lvqq-`aF48tm+yMadR-H&V83KWKJb3%H zeI4{p-oHA1?Vk7E38CmL!o^y5g}>SDkso{2jR2p**Y@K6zxNJbpH*IoCYZjBF0Wg~ z{&TtTWaot3!-KO|$A>@m4(hftTov53w_7Wd_42*l;PT_$!~Ol5!SP?{rDw19e}rC! zQ+{%Mx_c6RYi~K+{c+HEhkWU8INs~MZ@65(l8fD9b1P=Q@4njW?e6a!N3#qc+N;dH zCvK6-X7bZ;{ByLy@G>Jbf=iE25A3D=cfEfO;r;8w;~%Tn>c?`~(Xl(CU)Nmdzu-%M+UcJ>s$Qrc>t)B` zq6Sq>K9p+?kN4aL=)dV5?DcoT%Xh=i`Hr7|KIwgM^LB^|MRiHg_k6?3ERKJ`Dm3JsZnb8vY#l zf(5Sy*w5Scryp0|9X4>pcxJl)0?Wd$?f@X`=anJgHlQHi>RvF^<>dAzt8L*d9p`De zbl0tFVR*Ax-j9_n6iYj>P79Q7w4{|KE$r?tJGS(vaW;2%*I5jN(|S)SUUDZE2Uz*^ z<|pI*zi%CBe2S?1n;Ki%hEt4x*M5+?2`d^|-iHr$Qu_{l`0!z!*I0J{IR*U)I#pHhLd=P7z<(6W-T@Yz7SDeDCY;zyDop;q~v_ zm#_Z;`|>rA)~$Yv*Trl;b0_!r-zU2g%ifhL2UsbM+XGD0j1OA1(U#6GXfD5Zr*g%hm2EVwQojFeZ|7v0GPLr3_JK5>9INgh z>>l@zns<8R{Xf3zy*tCO#=5&SQscNd&+nRq{oe08cHI43C+6(<@UU?dmfi0J#n&HO z$AkodoAL%5eXeD#-=GIz;jN(0Rv1o#17kXb%#xO=5sna>tOrLDu;Rv#0q z-+Y||w?=)05YjqFb>rMa7C#mmTsn12dk>80zjyr{^m=>XH-FRL`?|SzQ}@-nLNOk# zBhZ(=z-m=zoi=c4&fqjJ!K^(4KT)O46Zsm9;{)$WI^H?>U2>pY&n8{^3KAJv(a524 z_TM9X=V;{`T>4nz9{PQwPZ-e;duikq`F7R1uo_;9wCVO=XuKAiOc|8cfLsyE!b)>+VS@6mB@_5HQ? z{=Bo63!_1Htln0)vA{Lq4c>e zq-DkIrhu!r<65-vRARW$+#5pm`$D#V$S>Pmg+mx9s~*j>5I=QxRzID)D{RCwRL2ib zk9U{K@ETPF&>^*M^VN4A9S-^*&bC)PxB1Rh{cXMzLi_#0gLN#Aw-|2{H_h2v9^__y zWq1E@(A(=DpS?d^rt&m50Jy+4toc>*z4zvH9qXmJAMPD`2dfpYrh$C@{r6`FhcUva z(p;m`VlZ!ODvoeuxb5lh-#-MDn-iY>_x=6en_k^?G{3)V;ONcq(TaIo(!f=I-hRzW!UiM?*xY~+5>c!rm_%%W7Q&icsJZ>{=y>@$TJZ*eAUIjJmzxYf zyxUFVyMvQuD|yA^DSo<+-C2EigYRo-VAVGE&3M3HO;fdJKi&(_yyc5<#rq$CFk3SD zE2h5=78W+v+;f!Bb}`RXn18t5Oq zSu#rNtug>4EuZV96Aia7Un?tb2bj=T-hT4#43JiLoxGEOhaI)lSzLFU(>n$ydtWUQ zJs4|^cdeUoL})GDl&cyb-a`YA&z2wI%NrQHxnp!R817G(#q8sq1|WJqY|}IGw%q;9iQwf;4Xir$L(KVI z1Kn%*SL?i|%Y3eZ2i4ph`b_WSC5?QbgbC$vMzy2Fb-Hpl!OyB473B+m z?Z)I(;#F_6Ml+CSysDWKpz@1AgPbk8;?~t2SnWhwtC`haf_0kN*?rri47a7taG@)% zaB1&_+~cJ~vgF=@vpm1{-uF8z&{Pfg9vmL@cX#&B-X1PlOuOl{n1bBQ|L(Vg-s+Tt zlU~z)uDx}g4bUKcIAy!PLi&i$GFr2G^U@W+^ybrphExNP%|fohs*cWvOcUdHRa||@0GgY ztKxIQYxGVyd+6@NcSqnxUm?JHNN5GO#}h}vl%3NLXUmk%{!~FQK@!$i#b6{2>hzU+ z(}VqND=duyX1FfGQi1kymS2X*%G+&+F1ZZTl01Hj#A!y zg}q}Kg}%;v>sfS`KE3(jt1%ZV9{&2^-OkDG*TqvJQk}a;bfkf=4pU15;Jy6%S9sTZ zxBG7CE?(8Z?}#)rF$a2Zoe>MlLEUCp*}(4{gVi3~RSo=(V6Zgs)xqG1=;13@BE}ZK zGO}k`A-;YLeot&MBGGDUrB;@#2{~%IcZC3GzSom)edWEYUH;AY@(Hx$-be=y$-Elx ztAC;)?YeVs>E2baw8p@@;s5%|M`MikE8;4KvFA=m1JB&Erc|zdD&s2FkOpv-W* zM|>mUUS<8jHtP4xQf6ez=KES&Qz146I{AmQV^bg+r^yuNLfv>fU)&rc^?W%P! z7>zHyQh!}?FESf`oe%@=t2NwO4K6JuIbET8H{b0x^y&WczAw2OSi8Q?8TWfK`wm|X z4)=S@DTUn6A=B#8pv%3$F8P)AKBe=no@bK=r<{z-@2dBedTz9^O=`Fa&=DQ()*Q`_l}X(fTQ;-?**}XS4AwOD!!Y+ z9k3SPz0dFadn+w7Cq|(TP!9EQf^*go58qkobtAmLv%AtO(hv=HqWrYK8p*Px=Xn1r z*;s32?_SS2Ga2xJ@-(Q;XNI&5Tc05?6-ZwvRuzLv1?W;IyYLxUrZ|8XT?aGAa z$nUf+13_(H*F)yk-;4arU#F26is(CUfz`=REACyI0k!nr6=_h*?v1IdYZ+8xr&0B` z+NU=>axKhr!@aA#^-J#!`LF9+slIARg5B`!=G&IeO~Y-%L)~;=(``#Jh&8uC6|dFu zq>291G_o4Mw4#x)szl>^*I6$$6&C95Z@hPn1EBHVHNf+=i&1FJzeYA%uJgNYpfxe` zjrXod*=xQR7~2WUv+Q<{7#Q46=jj)7^J+TCWpD#%0-Ta7+GxZP$^9$Pa!c<&UX2#1 zL8XQzW7Y{ahxjW~$74+ezUKbb9+>6#uXZpjzn|(&e0~2{s|3sMKmGdtuf7$3YIn`* ztkwA0fk*duCVZ?8OgH!Z{my=WZ^s!Eh~?d5MD5wh=}{m6>aes<;d^yBSi=^m^--=4 zhA-*#$~buQy{kju%kEw2k!`+rb@BlGG$atLnNw5yaKYjLGzj>D$0(vM1IiT{dzimHy z^3Y%Q(=49{*KOs~-?pDV-F{%65mf{D?csw*j~`XP=TZZ|J$(4|@w58d;W58Ge7yar z;d`o+@Y};D&%b}FS2(?Dar4{5XV11Dn!B8e_1nYe-*5ZDAie9iN868|JhtP2T<-uz zCDM2}GJkvYKY0A)LG<~p_q6=>y<6Ll>mF<_dHmp6^~wHw zx5&)WT`u@3DdUg7)yXx7a?;qA&MJlxukq@4keOaTjx=S8Ddf*>)yqG2@ z`6P3nKYg(6KM%B3_vQBw9{9EYW|5CFppAfUoG#3C(AW3rc#%;>V_JT$$IqV|0q^#44z+c6(-OaZ^3-hf$PehgcH7nu87CCE zkDomc#Y2Dsci%e+8%W|>3)dYgj~*E59OW&!uOB~q@+|n;Gbz&9=dStw>4V47HT>p} zoe*W-DWlfR))P4Kp(f58MRM6_~f~OB2K8P;hUOjfA$UpkusA{Git={UseQt$GEhDDW8y4_=PuR=mX%36|sS|W&Z&wmle{=i$ znHdAUf(~qb#`g~&7|9%61=8jQN8@|9B_B0icD$f#oG!E-cb6&-xi6nQd0eB1sjlX( zaEF8+tygL3{A%p=WNJ`-@bv?9ALYo@abaZ9jYT)JQS= z7#Y52kFDZJ&AZ8aO%=)Ef+w!Wb*spI_0;N819#w%+?T<4_WhG*Pfgnyt5I(KI2{n?I?pnnXP z`*t5ce`@*$T1%O`CY@gJ^oiN{&a8n?w}VqH`;>zg1YbDi$hUH^m|TF4_0Y+WhrZu? z*}}<>Vp>exbGM&uKlXb&GQFJ9^5B_yrRE}7?#f5co|u(bM;q%ddi>04Z%yn7zd1GJ z!Baomh8@9u1^PK#gFUxj)go+lyWQkL;{M%j;k7T4kF$#>_uXn8-xoXUen8&P-EKh@ zmFP{}xM_%w!!X+wE1_n0V$y+6XfBHvdg3sf2A zV*KJMTOrcep0_V&Aph;^uaiUtQ0WjonRHL=QXg???FW$I0timZ|>WteeGj zgm2z)3t;G5Im(sjO0kjl26&}!Zk8+-M;~y4_QfaDET`f z-ODW@HvcLNTI8I%|#D~Sf^lq@se=O6$Z5ydgbC)NYkT5h_!Ta>~6dd>5^4)c9L5s zOr=NsW}jzZolLXOa6A`K~u-q?O}L_hcF>40N}eIkoen--4K1%uVS4oGd4oKKqcF z*eSIwo#Zz(0t>l}rdT%XHZ{VwK*M6;Z$V0ja~kRFFJ64}%_}D{+_^q-FFm<&FMN@Y z^ZBi?g3(TCROR9M_zOI$zA*Jd7eTF_uWz8u_*)^O;AA^ZBGss65Mz@ufURju4TT`6 z+QUdzxta?#gQ-o$Y-ud|yPyk;f5e?OaCRj7ELWUq!F+AF?97rDxhI0QE{5dhM)o|s zJ)Ch<-wm%jM~hoROu@?xvPs@eRee3T&uODr(#UEYiwXxtUM)~_(lHjkFlSaxpHP=} z%Z+y`l^AZ;%ih4=hM&4%jot&gb5qsi&Vclpf#rA18HWo)Q69Hy_Z+aS;qih7yV6Gpt^ zF_5R=s&E^EJhgMLn9Pf-4D>!~ER2v<8Us&Tt37XCJwlJ5eC zC_Fd7jI?76m#C9RCcYtd>1OdTo&-GNzz9mmpVM2EP}I>%WD|SrZ0wtxVm1#Js_Wr! zF`K~%4#}CwvssOP!a~x;G6R1nX^(zF_$BKWLb$r)sAxE%eG(^y8ZedBQnxGVn^n77 z6;|$RsCP;K>cXI|Wv^yja8MvM7v6-G6(u%RyILgHnSx99lg#A=jY_Akpn)Mmuo4%A zcie@tiTLrQe7vj;I|(>Me$y?z&xbWpjQBsX{(43$eaZb2yu`cD=k!;5=`Bq`O4r1$ ztkD@h9-~qjjUl_WBSkohWI`|4(+t)QeOU$&$so81*JEJCDTE)#i_sM?`4WRIZfoGx zpA1yQ{ZqGgbaPi@=Vp1xqnuD0jZrEUB-4l4%pK{|XobaL_Hd!`Ccyj24z_o@e=5tW zrjusLt=-AXh%F-y$p_u6_AzB@+FL?d+b6F!1Z zgb)o7b>5#+pRe=bwVw*MN%3H%j>~~99hI?6US-$mr@WZS;t7Bgl@ra~HYIP6yDAb= z3aY>(09UnpEw4VXzF&852)ls$cRm$4TA?xxph8vdbpNpX0*s|#6U2y!c=__T^|qS2 zd1^ruu7Agw(=CSZWuPfnb?yjI5l`SvMx51)8>lQ=W`A3Ner9b7x2VQtnzfLf!AKlR9cqw`9=j@Eztrz^xLR*zndvxXZk6rrL+x`3-&$yqCL~ zwMyzrB+$rxr0&5O`9U582%1x19$nGX$XvFT_CeLC#2>MBhv2Kfb*7~8O^F8vkt4XM z-M$ck#qKL~k}Rg5$%UPLxk;y`I&YSsON^NfuC;6Tg%*W`n;?8Z;y$qam$YciiWsK? zeeX?6GNtg#8P1%78pIrn;VW?CPw5PI3VE1RN)>!bu(IyO0GDXQ!?p@%x}Z7ZCT~=b zaR$f30Z(jLnLl)9V5e4kv8AnBi%FP1ABK1p842XzU2C(|8c+?U8zJ;5^k` zXf1tQwj;Wd4~Gie$F`t`J)a9)5fyh7+xOnau_&ENH{Rr*Vt?5<@DPh8X#2w_CG`uu zHB-UYxNr4Lt%V~=2kZlB_|Pk^^}Xqhw(43E$Pza-z`sbeLZr-gw7C%kH2Kl+-kuc= z!Qsp5z!D#0720G69zLHfhCVXq7Bz0SVXD!aTIiED;+NhqxDG~g!oIgi2@B9s(hxmG zR7v%kSd-H=?1a{IsD8#6M-{&rtpYeA0l|@>@1?@4Tmf4}F4R>!t3hz^?JFcY3fuQ_m2-~>;wS~)#?nmtNOb3+a|~CJp%%(bJ)PQ z(_*eM9XE^95yUAV-ubVzq%Bsg(uV3FunOTh7%1gaH_4o~Lz4DiwKEDWtF$Fu#f@lR z2qc>`;b3#(ojiOR<4InFULualZPo88kTm;9Qqr6f#Qqw$Ufm^I!JX>G43$r(Gtt>? z;sz>6z}p|UQWqQ~O>KzUzU>95+I7Btg1iOZdC|&2wLrzm6vz&u4`F}mwR8FwZ@y+n zBSvJ=44DO$9qMp&+M3hT+#yV=j)r4V*DO9yL;bEMf+lmvcstfZvunN*R@pQ~$?R^b zY)OLS;Y|=Ra^nL5QoIzFCER_K&BknP3QEsk4{~Zgz9mQi*c8S>PG>WzG=5Kjd}RC0 ziq9B+9HI7uTe47ga1ZUni+2Dr!RE*uA6ZOtK6tXUysbt>TdQFd5p+Uo$JfIEv=kD7 zFM^^+wjt<#UD+eI=aZZ3TX)X6IROMhl7XPhvKhe7HjKGwl>hAsD6r(L*S$=vUKL|0<#&4(_>Hu z2E(=K)*QwQ-S&EkJ#>pv8u~abK6l(uefjK+y>^*6xkX+fD#J7amE3m_Pp4VYoupS& zDE1_+d`{iMpgUaO!9@!14Ascd#04kp)>g9PG#DPKf2zKcA4GYhi_9H6fWrAm4kg!r zdY|&fEl7IL>$E5l6(r5<6JBNHj1M;hFB7=X2_|=#Cuq--4T?^?j6ByD`IR)3 zPKw18EzQYdL^F#49wIAU{KBr(`Oe9+0Nv|379p|~ksdoo`*d~SfU5|BPu z87!wFxhTMu@%b7Qn$KyjzF?9g?A9g!d0t*`ZMu~Y3!YAI?%pVKlLO+8>|kDq8gzvf zaeFa?Ee-Cfg*$hhVd0)CnBrstZ|(Ns#7$@zD8g0azI3~63QLO@nOhP0lwv48E{B!x zpgBc0l@!LMg@vQ)gsD3dp-Vi0@+kNl9_^RwYu8!4qGmqRc_0ALkq7VI0iigh}8`3-EI%In`^_t%*~?;Cuf;`4I+B9c(VHbftICp;wWmF0RLA%hg(IFH zqXIUQ6G!;`lAc&Oz6GaaJU%3j2t4T5mD<2_7|%JOY+=;gxQuVfsf_E9Ajr6!<(4XV z0XDFWKY}ouhEmtH^^r!7e3UTb5*3Gl25J6gdgRD!vb$JU&r?T4jv_bQ)~H&1(t!y>M4vk}#aIi+JodFGbR@ zy|}3kY_{7dbSR|S;P%!-Kce>zVE7HXmEh(ky20UwrN~xnMA5AsRhTN~cpD-#pR#dr z1B-o&pKo1Payz4MVLC}jkb>~H2F$L1qjzcUG;a#V=#IHq;4X7wp$y^lD80|!*WIh> zq6@iK<)0y@xs~QyZa%lN(E zOF~fqv@~qzM6D9RkFu|Ws*QN9!tQ`cImzaXFa&AHf*BkpPNfF%;IRVmI!2kSdoo0S z{I)?Y0&`*9d&NgU2fuZXB@NQ!G;jG#P`?A8{VWBWAf{WJFYS}rl|8<7CyA4#<}~Q2 z7={PwajzrejzqPIO=Ru-4}`96vwt0tcHE~1v})L;G%$Fhd1cIg8;7=|Hd}`T)r=tg zIwW(Q2`*GkDM;L#rgVV2bO!_OZ5I70feJHC%|N>ve`Ld=Zp&x+9Dye?G&Wiv_W5cSJ{=geAz0Z$9B7aN`8?Xj(fk--+p(%r}UxS zF|ni3e&;TR+~}19H zxsCs9Xxlu4Uz=tNUR>WB7w@m;3Gy*MqPw-?34g@*Z0r5n=)AbWcc^}IQOx0+c08^o zjz*)`{PQP!aovKk)^T;oyjU?{ThYVpc~n^i_kzy;vHn(fpsaZ2e^v)7hs7wV_n*QJ zn)!o^npfAK!V}o__K$TJ!KrkwVJ6y@b`w~bei9O10;IQ}_1~F#waN^s8-0^@ z9Stm79!<7OD*!HrBkjKUq4virH&>N9q^q5z;x}UNzp3TbmswLxG?jS`XF!_Z8`LgHHn?+x_c2bRRnjQew7no+I;_nZnIjnR>NRfwxO>b{;*C-9C zdzblq459ckr-%ZYpcl6yRi|zsDSfLTm;c2$oqoh2pg;pM^Z3n@UZO_cbeL&=ub&ijKC)~}3b)(A6YCnh2KXHadU*hQB;*jp z2nD!JaR|l*dAL;EsVf0ql2KV0q50c_R1DoGWpe%tdlG&%P9B7%q|`7zqJ;1W4mHXr zH;J%^!HW-Se8;%&Wg5v(bm7#ua-5dee5i@AOQ~7m1aiw`kzrK3xZ+5$F6b|Fx^`pE zbU*oo-CoLl1S1SH-J!7uq~a}#Oi_U%KRX03jq)%s2dDtDJ{N=we_@U`9%EE)rrtuK zXzV1LGb2#tdV3}I&|Qnz89GlfoLRCCN$MEn_;4F=3B5~xNi+w(EhiH*jB``uO|Hu4 zZRpXZJ1gC}0Q_7)C&hq6Egrq7aeO|t?po20eNzXAC(D|%K|qyNt|iu`^0}YEpLzL7$O$gRZBr4k z?1XY_1Qk*Vn}fSmT!*+*E*3eEl<_`2A5F(?2~`1vGMxcp0@mi@#@#e47FXB25^=?{ zBvEBZJH# zd8r}YZ1`Z@0i|IzjG&Xk8>?z-yO}oaW|+{77y{!zScSa>Qw&)}RT!-65qr~xt8p!iD| zod^+E9|Z6rW3-Cg3%m@%Qoy^4r?>aI$dG`3;jAfy7NIGHhmJwbacXzOtpnzy4Wix( z90L^8(4gHtJb2xI!&UCY#BbGexs+_%{u~C1P!mB{4&c&YvBG26JpnM8APhS%*lWZ) z(&Ai@q7x<&Kt4er&$SeLAJjj&)#QFj^&t{5!hvzSpAQoE;a`gjqh^?efVdio&X3Z0 zDxq*XVG!b_;hPlIFb?U_*7rP_q1h?TpkYp$e#UL83kuF+${nY~#W@l_l$Q8UXvDys zA*-PsiXp}Ul(O|<)@iOpJEs8yp9$C#D0JAkCN@ug3g`x(A@2=!WVQ6;7X#Kr>NP4= z5RE3_6DnV5zk?!=@wj~wnsUD5e4PKGO`ZTgh-;?>$wM)bLB^i9hIkh74IzoeU$PZ$ z@pK5@B9e`l1sEPap-xWS^KKUwirUpjj9D%hPCzT{A(YpWtqC7wUsU&TP2u>sJ@CU` z|5%&cFN%)}Eb=g#dh}Fz1Q*AW-`BaP-?kUBh3_6MsrfNq&1w>y#T0u1BYpYpanW_mk5G+8k zPhS&;U>%DegDMt8a6r0i=w?mz%5O$(O_eE>QsOkOs#8JCqGjn}`*X?$pv_1;!I!ym zOWBi7_BYC9z+ASvAz6nFN0FJVf)P>R(g1o`VLyObpa~vi=6QXnLkqrEZ{(3KP(HhE z<~ZEeDp0t#hBxSCfiW1Hxdb(Zo%qRBdQ%F0a5Q$_uj9-iBg2-s;_Y#!Qw86Z7R0+7 zs)cabNDO)_)!^V&@FRnGG4|L|)e~ek>YkfqTmx>T6f;q7@<$ph1LkBqa+O|4$3cJb{os2skK3ygNx6kEA-aW!2%N_G%raqCK1rr{sSc z5xhANu+j+0*|kox+QUcMS^FegeT4n*I~mLYP;)d;IJ|l|`19mW_BYunb@uoA#&^ra zYKE0&2xJ`!w+_PV=3=O0Cs3%9$VHuST6hnxSl((?4UyElf@bhqxF;n~^qlAjgLyT~ z=$)$|&RP+Y%h==j93AK^rqDz-`=H{zuu`!BW*m!4)ugpqc%>qO7MtD%6M5~O2X5iE zgASu7Hjw1aeP7!1mL}AR!$0hM82POL0cM#{Amce`VbELb?~TMP-eT;kz(9Oy2SDF- zLNQeG@qr=bni)GGSE`gNEXvQqDJxE#5IwQBorm0Sbq~Y!WdNQ0yo!qlJFmwd3PK5F zgCPym;JVx{6G`e+V-TWPQKv?pG)r^{cHp(T%EQ10bv2gHS`~XnN;`oX^MHeX8qQtC zBZBiok=AkQ&QsqjU8${ZESov7S_Hu#yF>q{PF0-3;8YzqpQ?(+NDNaMNjP&geTGx6~dUxTly=*^sufw%0p8g5wZj zkOSXc7AvM*DMz1l)LKE1VSufp=>ncQQmuiu$8N_B0jPWQbBB2gOv=h8KX}tFOC&YUW`YQmqx&}=qPo2 zZX>_sl>7N+B>myY%OMj#K#OYzC%aZL9+*1?Z=OzWU{1;MG(3|M&!qSexYxN5#*pcj z*skR$=QIPQ$n7w6s$f{p3F66OV(2YoifK);%t#R8pc~FCFK`x0s2S%nSV=s;_goYA z!ZYFm10mwwr#0B^I#D%LBDAe|fqTVAw-iXENDQJ$SQXPO&~btxvYN5RFoI(fRIMd2 z{tZ?#H571@&aX=jGGtgV<_4%hj4e(%g>~%eblRGnDPsy8M^0sS8mna6O*BN>dRy zNUC{p!`I@U7sb52xzrt?SVHm$=w(BnFNWx=D!%IfG-t*CO`ddR0`YH7hX9N~bH8pV zh8G@H7oFMBi4BMrb6o%L)xsqGmpmXL=v39QB}v2)ch{-{EX`@cVXp9cnv@AXS3;8@ zfhi9nmtH~LGDdJ+80Xzv99ek-FhY^oj8 zs;SZT|5dH|f3RxJYAXo?0lYtH0(slv)@^ah*>n^mzwypxCXQ~l7|yS#R)X|{E?U9x z6MeKG3|%|fxRh-`lsPcup8HxI8W!STMfG!^*irH#;m0N$rw9FiJMDGhVC?n}x`V^h z4C_)10u(>Fy&=*6j#KFIhz8a z0E7A#%voEH4b0#{@-P8zlmTy8OjX&wYkEytB}F)Rz0J_l&&qk|gAN8#b6Zi!VRwDv zI{6UX(#}SPL@%9FEJXX@rtj$Z@QssdgOi>8edB-#DZ+%A%cqlTjtz|qjaE3$7aI>AZd|WK zDXTgNX7Hw%73a%G<2c9rs^JuFb;EO*PILu2EIEYf4HBR7ll;=@eKF&PU8^B-C z7X6{Zh(n!$hDm+nR(uF8C-y`9@i@2|P=IX=(WqP@8Ug!^M3RO$ABIO4O*V=Nz~kFQ zErgZ269mnxgAXVnA_y3PH^?q`CiG?ptH;p#V{I`~iG?Z1^Ht$blX6{u=0V(VVH9p@ z#n)+)bF{g1PJPQNM@-(J1#^XCSEFr+TTvP!9SHL-lrxl4kj2@-hSm&Kv4Zi7+Un+( zKf@N3(i!XpKrLc#xE}oHlpJJsTXY2DONWqKH{@U#8?!H;J!{{u$A`0ECzuiUvZXafdHS~5wd><^|9MF)o+RtpYFOY&jq8)#hK z^l`_OY^Y|v#(>z{0HR4u@_6{B=0PDE{ zJ4}(}xZ~B`=C?HhfQH2wrItMp%MFK)IbkVtoNzvf%_vHNy2oMUioqchcu zunvbDBo$C8@hEW*)fZ23tqPUUR3U39U@a)&5GDqb9Oqme5G)hme}KnpM?_+Jco*~I zGV+<83;u4gx=epnS|WpPP$;S+Z$Y}9&ps=y%u!n)E9N7v^&hFo6@6?o+{g{%+^T9&{U%NJCOZ zyb}D2bdmH7R&A>*j_pwCaq9YltV;25GY_~VgKWH7%!yio(wflKLm60@qD&q;$sfm- z!qV3@m_Se;TM`Bn^%6rUI8A}BxV6bx4mUhCZ#zO7*BT8Q@qnd{5R{-%8 z}am)Fbx4mKTY48ScXhMzDUz zk>YPQ$xC_&>h5%SBjq@(R0^hG;M)Y6g1{;VBB@3k(^HUQq@sZo&KMG)@^DwFWXl)H zhM*}+l%AV)S1lWLNpX*>FSQ#YIR6inpI>$GG`ymoJeBTyTvyG3MbB(#(|yxG$)}S~ zT2VZjK-fNUrBWd@(s23x0qEK4>VfMuIeF|0zZK8&sc}H;ND5(6rd$-o z_ykBjZYX}>xoWMD!6MWIPO@=!!cZy?pQWGCu(+EFN$iFWNsgtj0cuoUQTUzFh+%y2 z@OgdEAN=Z+W3x1HGFWpY!zzQrEI?eEbI5dz2S^?b(-FK{o%yTAb-+%nqWCJG*0UMl z&maCNxqp#Q@0Zu%$H||gS^cxQ^W-`#TEk^VAdW`FsuRkSr6^H0(xMB2H%J0fwy1`r z6Hua+nR}a`%zU$TOA+W~&nWzAJ6jW-rA=ZANp^i$*oN4H=D)IK8**-Jn}TAt?FP(y zB~qtaTg7o6Jislgv+6_Kr`<7d=Lb#tM@P^lVq-Bu27kZay0-gz zf9K6Wn%q+|>bPd8n%B~+U1hY=axZ?1i9yQ%REy_9oSt1@U}|-21kUeM;CIPMqT_7@ ztK@(;TCuykZA{N2Mi|b7MlLGvv9u3c5X#ZY9Ilcg`iTZpFz!gTqSR#`6dSD!<)YXvI~93nVJy5BAc+ zHzi4js-gu)TPdypvP?=MuJ2HE4u)7?$3$V`kl9)x9%(47oO*4`6ey`B^`dU7_Vf+@v+YvTqFx~#_WQ5QS{^fCx4YlC zsQLBRGob1WBr=_Rc)u8o2N|<*?O_s(P0>SgEvX z+&0j%eyC1BOjhe)g?!f-*1q^FqGW_>i4_6ij%GGDv_Nl;+qCG^CRG0i3yI3A_( z?>4CQ&2}e*!_fR zhk@NYkZgpf$_x5+o_&G80v~|;`ECOuO8tY^hns%E-;eHC}A- z!O=&qOLmCZz$PzOZ_frIs?}uz9YgsR`mCrbCvQfpBU+a*D;TJa`((oKdJlpE#f9ch zqQ#axrqvBI*-M|gP{}MJ|Dma98FL6&zG*l`fP+-e+)!B42>R+(h7tx3xS$$=LKnFb z0Ury{=y(4?3+lh_x5aaU0a1L>kqTA!5UhciYEY3w`YgdG8H{9JPNL>9m#!<^o){nJ zG|St7`8deCYiVeS%Os)Z=998849K*_S^)NvG6HoU!aKLRQO0PFzVdk{1&DJk7n!7= z3aDeem}&>2zA6d|W9+9{+7M02Py1h0*xOhAX0 zAxlh)3GD$s@M^FpbwQmBn-^}$A)wY^>S-N_O+h77P!_WAGONOG8b1%%N#Roz!3g0! zH`7jlr-TE9gxGWjM~Ou~`9 z25ivDLPkMhtB`(LNVC3jZ90b*TQne4KJ`!w!yIWk;)6r0E2o+G)`z|}!zz8G3Ejfw zP9tcU&v2|q%)~(Qn#Px-$wLqfGU*#d1FIN%GJC4E5;fEkpQ z!~(KpJUX=rF39@hkv(B;$KmqIr&0!};;(E8;=atr?ppRqeawmfpIMxUPg-Jn0z;V* z{V(82TU`&=4>ciKNPPGCA6S2A*XW-1eH1p~eR)<(><}CSK!0Gi4YeFh&N<)NaGcIq zYug~_qbFv+B#I${_`zV8^Y-Qzr6*}0lYbG>^ryCXV#&<(mwYRie9MVS2c~MrZTvHzxbi}!v+{_5rdk2ONObQxi@ic%^STp3(B?+j5(H_A=r?XF4J@P5{Eo>U%WHd7?(Y~57R8s-@n z7r|<=lA(Ewf5ZNl5x;RY^%rwpdd^i+ftn zze&$#4XjqDTcVL^+qJ%y=lLH+uQw- zzaDHXrf!r*bOoxB5`xCz!VFOiF4X(s&Z&7Mq5(xyR66l6;r-|Gj0jduZVm5TdqB)D z+tiZ8Qq+SX#VW>`aPlLN$-{2VFx*FK2(G2IEg^I4jdTX=r2Fb9;1mNqUQQ4CgOk0p zx5)!-afdb23^ZSAZARllO1}kIhF}7bw?eoakcSc}a~efKIkycg#6K*Emzj(OgGBSk zULolb?965_ww(<>7toP4XQKq_n~~JCq5^2LcwIB$NNu;xq*bR(Kyw~`2ItZSl_5{1 zuo+>1gLD$DiLhBeyQ?P_2QcjIdV;N9evyG$BlK1XHp6BpoM;vLVA@A3g5E3GePGbnD*LXy&9=(IO0kp5<&XO|;I0m*vj zQq6{fO~Q$gGz2eCSqz|)mnO3);6JARpqa*55~gungNEU)iAUDb&-qz~ZQ$&W{z0$J zHo3u(xnNWEo$9DFOU8KGiwPnLc}cda&z0k^PCE4f_Ay zJA7?&pYhZE{;PPeiaF-zY{@LK?d-0<78XCr$;WVunMLSMnG@6+>PVDjj_FkVa#-;Z z>$|!g;|vRQA%P7OI!wIkRx2{pGca-gcCC2bi@8>7-hs=f7HSob6VvcW~lX^#1mYIn6z7BjYg{I ztRYvD3|zxWO=LdiEJo)B{I(-@y8vf_+nO94ErI0_U3F77NnbL#%v{p_papbmD^s2` zdgibUuu^2?sd_~Ptw6phL?vS16z85)W1Gg}7KbRzqP^t~`7-Rf8lX-Q)t)GG4;Mw*w*h#vo0fklx5!|idzyvUQJJ> z9RfazYOM@?C`)o;z~kUTFxsX;X-PS-g%!ptEw!ftrBrABY8`KsOVuv3zY)sv&3r82 z621OzPB*fxtF4Y{hB()O_RVs!dvCH^LgF8oRU%P7-{d4>L2`1J;l&Yi);Wz(sR&+9 zag8M}s7vR(=)q*J@Vm>7j8j0hp{P1&xaG))1?9zvP+(1gTam0JaD^*YMQueeM=~~S zry@mFPTE2W!CcGmn#@I}a8OEHu7rAie^Jivqc-3pV07%*77_c8act!6xWv@gxlf$* zRiE71MxRQ0L>H1b^)p_%^e6`GgT@G$SQ3@StH>|+f)kP?O(xi(RB_&Y?IheZ<^VwK zZ=9b{Mm6T8=mK++$o9O*04`HTW0ZJ;IAW+E!*2}af3O=nqQ`ww8@@0{+R zaJ{U0-W+>jvO#~VKp(KCvV@oz-i7X}DQ*+Yvp;B+L~n@12Y8NN5`F3ncLDk2%}PM( zP=3MMELn+5!?WgGz9LnOYEUy6RP+{?h?E$quPduAlFvA}1!Y6P5KHI}bb@f4AqDPu z=Uscr2=gT{!uX30FrR5Z@rXsK^@c*s%%;?I$Q0D?lu z-WApjxo6%?$b9muNqy;i=o?1 z9-yammAE`}-G9p1pYVAlZKY{Cj-0)$M#USO9U;EZKgVJbdut;lme?AGlv0 zJZi;E{LruM&i2Cx4-;nQKjFmhzH5n&`{)2<#T&ICSPA&Z?X4$IR34zX(BQn@4*3SW zSqCRO$0uFLN&v3yZtvja_~(|emcYd?k`1{JFgyIiVG*0#6b9E=se-5U4)&@KV9$|0 zL>Xg!K0;_4X$b`PvU};L9Q+|p%>0;5|DFeEc&7Ds8+OPv{f*GL)rhiZix+Nnq{TZgF!w*R4x`>qiV=x6lQ@L_Gt^_T zzu*m4OvNbo`LFg(Z!ssvyc!yo=|%CWGBz@tQd%2@m=vr zRAEJ6RNO^R$7D>eFq0Kc&(a}h@={by#RCGq3}SY?Mr0nkA7YSzXQ;KrL22!xGNl1O z$FKO=vohmg)NP03-uphRu4F@gLlwbOnS*Eq@&tS`F2-5+Z;N7%An}X7k z1Dq`}$0t`sF@j?+MUg_)?seoiT6MaZ!Vm!jd%ZM)6E3hzd5CuUEs( zrRscI*`g9MOay|YqnuCh5|0ycA({ilzgc$MCbCa>5B8df_m5pkm?|O6v*em4aE7F; zq91fIr@THZW{{Ctn1I}k(Ec&q6uyCBhx9{>e2P^H#*l!t)vd4lz+?tj@9m%QH9x$pFjT^vX@OIc3-sIb3}%#P+w^ zZG=q1FboJ}Q`=ocWZ?I%C0qO)4<5=`Cbgj+xV~djxQ>|9JabG?N8 zgh1>2`Nb@)s||-g^zAKi#C(!{NABMXD920G{HCSb}Y z1yMJICQN=6JRbK$7V_*^nk3hKl5PWMe>-ChdvO@$?Ljgieo1$n9`rvDUD0%o*AKv% z=nl7!3!J2IHapT@zrbEb9HM=j{sdYEbuFG-u+Y8K!a6Re-5a`755|)YtFp3 z54>D@NTAf^wQcCL)m*wRV86+hV1lLEtnxfqgtx zh?3N6YH9u=PXnT$1W2efV@#jH)`1*UB$+8Q0=eh(_%e4nZMfuVC;sO-JBIQ(n=5is z5qilVYm5~ed*Cv*%0#-gvgXJi#$ME@ppfM!S;@-tG<3ZJTvRA^-oWGC!mMd2L2QBE zuVp~=?lsnKO<#5C#*gL|+^|~RKh?(EmWMK7ttHs;RV&)4Hu7%WuCp5$%jt1$q$UHV z0khA*cuj)qlu?Wax=O(2O|`w=?*7@&KcDnIXk`h8_Mg+IXGe$qgA*hRbf(7b?c5Dn zo9u*hXW`6}dqGNtS|9Y~FTaBRz9Yb(N^E++_kr;gXUB(!CmN%^NK0Rw&7c~mWb1Mw z^*Hz5-{AcfRE|>sCY*zaEvF?Yoze(aWdN-;C@xtU zg56!e$i%KqZSrxD<^W`|41N(8iRU?#h72aGV|LRyMY3QR5k&;?FifRxmw^Mt*(kcs z;*o^so02vLOh}!*j44%Ir+w5OViNw%D5w^eYe>%D@FUJ|v$Cy@4I;zRFd>abwRcD@ zi4K`~h&pzGP+HP?_bTZgw)N}`dk1`!hg2+xGnTMor!?cbX(}rsIujZMGBOxy_nSdo zNt?~3Y<73gcFzvYpv}V!^!QPPffx$lfI?)x_7cZJkF3r2G5%C?pPFXZps_;q`2t>gyr2%i&k4rR6O4{vVT!M?;m z15}W8TTkGU2sy)^2>X>3j6i-iCz`Wq8B}-G@fEbF#1)|ZT`|!1<-^_U!fBLXpmnGS zQxSNeReiJ;tavtk@;CMnK)(U1YNk#PcRo3BQDv0K;7)qQiy&ErVwcCk-k% zfGMa+84UW20U>DxTv=|233tA6KK$b!@igK8pb!K>#wW_~%NHbPaEpRn8h(1QU>j9C zEf>QfshlNZ0!!qm0-XYx{iNgA{&E3m`rRM`rLC_Kfy^yk5rRhkbyf*MJF>ADRF^F3 z@Ne9u|41?T;loOygO@CqJAeG+Qpxk-!#`5=aDVEgk6UM3yWuw78h(vXa-;m;B$l}M z|MQZ`9jNXhJA3_;{^7ySzTCYtg7a-YOC?(kXTDZ1$tyceUqp#qV8iEydrwmr8AIV( z8puC7SO#gAUz|>8nQo*Zgr8A0ksFUT7${(vgvOy! z31CO6f26D+CMis>EF+3ZOHZwj_th3IfJK9-mN8xjyYUbeVhXQ^}Mj@ zJg})KpY;YgXiN1~r06Op7lBR7OoI|MdhD@_j$;2N&p4<*pU-`^4ca!QEV&Okb7AtY zuSo6%tSPE}_lo2s*b?C(x39th2~5OIZ}D9)fw-C|tkPbR+A5XbO+K%%U1gN;7(CHP zYFo@bpOR}mBmj+&A;_d4nUAT8mk>9>1)OM(+H++#pLDxSgGDD6d2roB+uqCq_Lx)y zuobBw5o``2V}v5T%$%My$=Of54?JQZ+`P>$b*2tjR z`{*0|)Pb)Gd6mvps_t-G%v)0{No@#VPPp=F5~#T1&MKy&Ix3yH$22M(P#`Yd@= z{ETt4DztxaHn1-@o+e%3-gF{Wx!&d2!%?E0vw^8DQA9-AA*KYqR{Wt9S95A26p<)5 zn+DExsBN|q_o!oV+s2|8Pn%!uc;~>4!BSO$E}>zXrBgTjPwBU8?mlw=QkBGQ4R;UjkB$C8?_>`=?b+O|UE9ok{A@FL%(vg!o_t%g>BwY+ zrjrdRVB5h24P?iIZ@aG#k2}fxo&D2ZxBuGxb$YOu{1VdP>9+@mCv?TH9z%y?E^{oS zUU`HNBm!)Rj0VOz8e89NS?Mece%QB8AbRBPY7bE!NHKT!ByAB~G}cE=rPT3<_hc{&oHKp$ABB?&SX%-rW-yA<-^dX%aZP3VI$nD9e zi>%hNn`U3;@k{trV*_pS;>ujb$pEBMtyn2KmgxViery(ee^dGRUD$7p8&NS046bw03Klafm6 zeP~S0iB$lZP>#+i8gYI}qo6PdRQupWpIpRMcL8b=#P_+emkBaAn4{RB3%cXUO`8(a z&nGu+DeWdr3x+rFfkk7D4jd^rPToL{@RSm7$)!Wnk2*5(D|4u>d|5kN)rXicLDRF6 zOE)!ahQz%#euTQ`Nq$OnvP+76O6wpm13nB0dW?DK=m>zakmN{^P(Bifx{viTh`Xld zb<&%Bo{r1S$dM$qDRJCndQ82Y#S{XYV@PvTWmbeCwra=)$6lx) zO%?`Kr49X3R!g*x3|(fxn~kbwsRyhZs}J+U{cC$WFsN;k2D&O?7R3oaoQpw5654M8 zwF||GChvyH8nF9h?_r}50D7D*K3k!62diU8~y^4#H|YV$5twh zO3^Zm#sjvmV|6o)fx*nBn8n4dSpp{8A2z+yaQBOo=Ot#maotLg6m!IYf;ilY$8f0C zZqymYF@-xFx#0mzN3R8W>#4gAqPWszeB9pU$TbMe8j!lgA#Ai`eKfD0fePnsbp_D- zJK?;ou2S>Vz0JW(Zuv340WJCtfNUbxjwlleZws&UW_q4|jJ$--gLK zIfuFlLzF)!LevDGr&w9VZ8%L4HDC#oF(eIaQE@xgTV)$WnKEHE>-pK)n}gHcvoj7F zobB{Kv;{SXUi9IM1W z)OF4>foagBtRu7yc;aGYfK$u67&30d#m)3xe20x|^H3C4MRFq~Q|*+avIwgl6aOfQ zD6cX>k$Y-uGJniJjSmU!;7}TR2OCDbwPiy6Im?20Mv-mP-&DU z#jVUR$9ap==k!z;W)05D$B47EtZzc461WP-#p3GfR&Lxfdj{+5%|Ycesgs;fCrz;d zloFY~6TFc1RI^HD>?Sr-z}GvMD?=>dfT&qaq8B}k--7FjQ06XcZZ~q3=KdW34!4Ir5SeBfHR^*IL82=j7KxeCL< z9tg>5CA2@>%+jk#s%|R1f&#S=*w03qiR~Ke?i>vI1~XNX_MTr&3w&qQt^=;{>*6Ca zKjeYoia+=7!2q~}$SKk@$wfBl0O<0h_ssUYe3S5;Bz1jDYFlzmVKEGTJvXH0 zpmc`b+oNPSO#XQ2gag) zs*0R@4hMdYr-M^M699V-(|Iv#)Q{fuPWBIX_IBRCY1EMnWM^DB@s&cN;FXYum~XFB zA@akYb9Xb`kbb)IqtmgT-H==|CzOaI0@1*^{KrhkBp1Az||AsFK|sG8t@d0h&$+XYl^`F&NH! zZ%#kJe^1}-d|>+-etmrQs7;W`(BpzXQsgpd|KS$L-&nbvVmvI=EtB(u{r=$OY;baX zx_iv#VdTmn z7Ods)M!%$OC&O2LvK4?a8&%Qu$>51Vf9PfgxCtXOLYv?d^tkDyuPw zzPPqi6XD|Oq}IEGlitBeD6}Z|Et^lU4x$!NI4>7cqP@)i*0zpHxT8PIza(1a8!kIK z`4ARIpz)p(+{Zq^xbh|QDl~btr?p5ad6}a($C?Y#r$^je&2HRSV!5?x;r(!k{W>}v z^gnEEi>9_&c{aCMcb-t(9a;fEHn$*tUwWPi&Y}!U`g`Qh^S=Fh+hJ&N8TK5Yw~>04 zkg76%DRmlTa}rSwl z7eBAXEJ`6LH2C_gdjS$IojaXGb!~J+0eAiMaNs1__SPdeLFnnHhw*U}^7R-DUSz0M zU*z3R^))7`eF;+;l)!{Ye1usa?pxOlplO{zPQ%ELFZv&Ym;*eixgSn2ynl828u)yA z$4-B-E7*yJPZx_zS-}`Fe}fs;Qo@H2!3 zSn2QuZrgMgL{jCQ;tscE8S{o_ISQxso;NJBXxU+07pI zrrd8CmDeZzcM9w=!rHZZ32EtGR=ar~x4oYOt{UtfB4vk2VQDA73>v7B#eVd#1I3hTL)2twuAv378f z0#7T3n>QO;f+(f68Yr7Ypz{0zzUP;uLP8YJbMJ}w5tFEhxs5QU5~SgmO5>hUm(2o7 z-P`5k5mxp1WEjTJflv=}(3oMg6x1r5`(;AkN;?=8z#LD^=fW11YS8IhDUd1}BKmyB z4al9%{_FQnZ#+189jpnYy1Hy$6Ld>_?0bjf*{HagvHDWiz~14}F(@oavJpK`C%|ts zNnlCKav}5-Zt~i6uKY3)||8ttpANkG;;C-yXJ*|Vy z6|L~J&=W?Q+DO%cnJqAVSLB?Q~Z?a`wx-nr(n z9t4m1Kj0%*olPqOr@{=EhifD1lgR8Os0|+%kQ7xfv^&hf9l-zFhP#S$Wl4}jHntafsAx%CEdM*vZv!SRhh^B9wcTN&YOhCvRG3Ye zXZoT*fTJ+fAq+{{Kur?VYfZi1bLCv89=gUi8zGO@aM%;|!Fr3B5%IO|u*gbYb@)ag8v;sr zUc?A@b6Yuw>+mDYELWZo3P?xv{qW(Y7?tLH}y(fE#yW* zGKM80gxo(%Mq%rlVW#P2JuV1S{wQ9Th1uwK6Pa_$7Qy3UM?{2VqBtgf$r#59T_pKb zcbADsokPHVI^XhzX6a)d5OblMllwp~Q@PYl`~jC>wbwRW8eLi2V$@s+NzLyNoK@{E zj?t>70#mCKUAu^a6;kzb1^A0#OVZ}kYa+rzk2F?0R|8+r744#At2IE*)|gAO`?3FL zZ`Ybqa;&)xeSlkNovGDZDt9zLq0&08SYK*Pkg5ikqJ98d--z9n0D6;#JP~FUB~zuA z7kGsXQuwV$SI7Xz=nBucz27_7psO~a{`feXZph!=KaI{{H*SVE*Wf9*Il7O>W34Af zj~aWbAbAshQ9rlQ1^!+A;;3LrYH$~};nnTlx!DzcUAvza3j#k{2!|^W*_GA_GO&m> zM9xbM?i07DS_5XTeEMZ1F%$$mJTODRfh6ZqCj-w?9DPOpSm$?pc&*o^4#z-I#( zdE$AJ@X6d1osRk-KJ0T^FHvPl_=$_I8tWT@f4hgthisaEK_SEE?vQaB=B*7ODaZyg2>Vzmd= zQaCm@%Sttd>w4a_kc^GaTAXxCwp2+0)N8l6Hb~=HkfUxf!Lk#^b|jr1F861DiQZjp zoQFjB>-ps@%cy0)(ZUC~B?kC2THEvpsY7ZX!X;#F44l*vSkdrEseVDRWQ4XMV}9u~ z+^+MhYYgupTY%^F;Sm)m;#MH2s%y#6Xr1BO1Gss>O=fg`Js88K*QJ8A0E7)l=Qaqt z$u&Q0Y9{{p5z(+CvKIzyN$6Q6hFu>8qIay(euLLNG<>~`oDP-eN0$)^#;G;MPP-3LE|q48;49NsHXmvbQ0K5*TsoncOUj$7 z;)RdkP!lF90DF2`>B>u=97>vIgmT1zHi&7CP@r?fNJ+d6rYHa_csb7gbfMDn=E7PP zm1+(b`6@;NTw?){;mxh(A(#`miHYDqVK!BL7V}WMW^FkyYn5axfSPnL%#tL z2B-8n$%xc|8yj$JY>ePv)6LE1dtndX?dCNUTwZ!0(oB#HXIakM4*uqjBGMpc^WtO3 z{OUd{Z>9Ft|5vwl7N$a0x_XY%J1#~?#afp zL~*&a)FZI9^0~-5_x%>@77M=-&SMY$23@+jRLgWG7R07wl^R0lAjb{-2yE62a&iULd(F_618D#nGv`HNrMwK zxt#XMs||9LSsejQrFz17`V13j^ZzB6t)EQyb ziE_+UR4< z&$s|_aK(M7p*Er!lXsEyjcO)Ye2AZiEu*}Xcp$+ZbemBr9qq1!JBxUx{u=3scs|GMvUF!HZkdd z#s_lo_iR?kre;tuSiO>dN$k3TujHKdLDPyVNzhERh8YdRJuPhzrf+e~vV(vK<*r+L zT?m?wO;!MCtHPFH6DwktIt0s6XLaUr6@TVhG6BvtIYTWL(1gNkAYgX~fVH|c5U{%d zz-R`O4f=1FfX2TQ1y=8FNX#Sn_~{75q=6b~2_#Hztb>L{R)qq@mLS8z_@*?_h!Lxv z93CFFVyFkfSpPRbrB;l5SiNgCj*4WD%vYT{Zdz{wQPrTQq>Vd)sG5*S!M0rsM`Zw1 z(#V}~RCRM=6ppoURF!VW7^+pWGyo3~^h3&~s$7jwM@>K?-&D)Oh^+Kn1|m{qMo{Ke z|8i|`$ycf-PB)s1;mtXG49C4!&wMeLmNFvu+$ltreD{n~2;^MC=Mol>Ied3SOES6( z-uBiR;9r^~qn>IzCy`X+_dXw-^#>IG#$S(n?mPv`mhqNqJg9v`*k+#EST{SF!!j@% zgakleAY?;AaxYe@E~{yE(5o{F@|?XoKK!wF(3C=Sl6{=d3W$cCx?kTrDKi4ADJeNcHPOiTHxfASXX zNlKF;?>f?nj9~$@mevVc(j7<7E%lkicBwt!z2&+JNgN>Ju2PWK%9Ii`MA?Xz!o_47 zWnY|1Hq61d9=vTB6APKU++qe$hpD-m2%$zNbjNT+RDBDs|DPZQguUJnEQQbh?u1C& zY7qM6q^+Ll3sWBwb)6i^Nd7ABHS`vEj|xu0TlJqYmm2O=lc85Mo`4&EUN)or;)Lv< z>NGDkg0QJZ8>sf{C7cxg6=UD#8c(g|rC8dNyHGq(g1h_A*{l5@2mODy`%5Mk#7J90 zGL+?B&d)B!AItpjna_2vPu!DsYb_c3^uygB2X}aQ;q>k`o(-)=sXz$6g)KvkRM-!s zmGx3m{VN>r_1>@j0y7BJuj)Ruxa^@P@9gtL;8gGeet-I~{mDCy*^|gqosTvkpuxoQ zQ#YU$e$FHqLG5fnRfLaG@iAH2bNA4HKRnRY_S#1eBkB#Q{~@AhD;Qk&6k=Y`v71lM zNJ52U%Y*7(8y;Ip4hs!UWc+oqZ8me~%K7~7fGBB97d!cPz;6JJKytsYYl0dbiIk?M z!tts^1&UUa3MI`N1!`UOX*b~l_f05k*UCCLYi?yJ!WvA*udi7S)sYBT4ejvb46J%3 zs#-?rE|tp3AJ(#%>Y8SfI!v|Ry2iSw>172{ZN7kYVCKBlt!dyNTbJA~6ICx2p+uMw z11i~|paxlPwR-N!&qv4(futEK_r;y1U!0vtf-VXs@S>psb(N3K=A@eBoXTl-Fw#0B z(u|EA+R18LV)@c+j#M0Ft(d~@y*u1<+uMrRiJPmlx$1Ph6TCo>?>VO!y4KkG;p^97 zhFbZ-_Uq9was6z)9pe3jj3AM*HqyUs3hsbX_SZU6`#8QF8KI* zadXB^CL3WG=0AeJwzfjLng41Y?|+XLA!uF8CR4uW_m{v_^OT;(t7Wl#wJa*Dh0HA4 zl&Sz!hJRi6Y{idIFC42fFlyiqb(|uLDLUL#^4-NNTQk~R7sHKtvH}0@BzwKrJE!|6 zu?G{^A6^&EK~?ky_(qVsYE7#6t?miRMuR$@yMO%SrgFXFQ@KaFwU7wkJ>$BV%_X5E zTu`f~b%}<(d}xxwL#JWEn% z(7Ki=Z8hjlt&a(g%vJs(<1MoOrQ_2Bz4mwkp7;}|9>Z02tM2So|4r{;ufKC(mf7cG zHlkPrA_z=D1%zqA6r;xHj?0VNxi}$_sp$9s4w6_rS5xqGB?XGzqp+x4UlvJXAH&^qxQBEtv^DPx)7jKybt;; z`F(&|=#p4S?LcvRAVuac4V!?)f}*NUuzp|7m04pEgGU%7>)=OnQI#;#km~~tXzi5t z5BB>9z2-U9sCF=m`P6CXz`y3p9@bQ)l*#3*QQ12?qrYIFVH?TcOt7Mz#=7pMcatO7 zyI9t=E}Z(M`*!E}?DPP1re4gQxyxDxhzdMwMXvgT_AG3`^s~s&!(ITT%nykY!B@3lAgql39(; z;W}O*$U9^dEDG_`NMOY03iz2)>WS;X1J?xg6Yi&Hft;5npla9*efDmDJ9#nZs=GHg z^l^s^kVq9a{BjBb@?ilE3Eeo5pI72>_c6Hm{HPrl9HTISkGSGbH1Zp6D3W^?qU-5E zY4rOCCuc`8_|G8Zu-Ds7cE&f?X|nU-C}#e&Qw+CmKXu2>$)I6Nib=Ws6mk#%+cq)@ zk>-90e@Hv3LmJQz`oobtL$bn&Pg@s%&AV?d4e8=Wd-{0U8{jgR*LeE4?lo*H?S|mN z?|BXALghVHMincnAgPGJf0n!lhwOCj6~rZ)Wn-){d_YxCTvt7e>klU-H%YkQVS1Ay zD6}E-3p}rGA@z=roF(bAufxiobvQ31J;%pl`S?=!&*4Ne936zBpG}hUKm1d2|018> zA40Kn0E{Bp3SOWPO)|+rhv0NJX@(vG5aY`^RR$#c*ur#tu)G4+mu80P)PPdFV?7<7 z4L_Yh!n^588&?~u6&F-**_1!H&B_?)q(kFg6{4ck!ZNzX1CK@Tl+K%LmI15woP_v? znH$1fpLe@ox)L({0phqpd2aYt z+y8;WyuNaPWID>TCF9@C8N>mlmCqSh;$kF#xY8#%B}5_)p#%d~=JWi^Ai0B>siCx3vQa`R66vV&T#b<;=*Srg zkfM6jGqbk%t*j)p)?v`#e>>Qt`#Tgf)Sz`9oi5V>nKZSGf+uWTu-=?HF4GT z?o4JXoTV>kI!6*a%4f8QC@t1&XSZl#xt^OI+a=>wt_(~|nii%7iz=C5s8@=OP#qJ_ zJzcr(%=+SFvF?|4(~H9nI{U&Ux!oI@#84FrS_B<#M+KM@iki3F$+6atPIZm(42)bqU0YeL==ae;X^5Jav_5RKqAugv4juiysmI}BS zDb{J>e5hfKDB}L(^ni}mfu|3rD(L?v#fytet;jKGaQMUn57*edqN>Y4opczXnAfU7eMc?*g zlbX83P+sHb^E;XQa~8_ecyF@nhiG zIa}P!r2;Vdwxc*@T_4tU;nk~ORb{P7>k96Vb*^}H$}Wnzd! z4|@%BoTN9dPwDWwgCVPt0{%?dpA3kq(dXu?rn1=2rl0azF{Mf}cqM0z)h$C)!=#VZ z60oL?8q97roDB|7k9W~_-+@Ue{M7P3&UWhVOBt(mhy@87~+@7+%GFZYj5J|r81>~9O0UszniFy0*_#eG$<>An@Y z)@bO&Ng5&Je(e_TA46A955lg(r>>XI2yh!Jc{59IuE7-?br-n#zq-2~`i(jtp`++v zc1oW%;wk$ZU&}B|`h-Z7{6^%%`16jdaPt01(bz(D==ku>nQIeY!fY$* zR9I0j++#~O*Sr2fJf!cOPXEP>AzmW2`KkjNJMid=ZM}xh{)a2ZLZyixlK&=gGT1!? zdwV~8X`xov?MU?NbrWkh;xcznt@v2V!2Y2JlFr$BVc(EUMmzRpd9QYyP8qPaDA5(6 zF+ncChSv6wqeiO=t}$T6f4FVo}LwFHHe z6E96X3i!H&8x z=sp_O9bP5eHWb%(c0WQz=HbI}@LfawOEYIz5c&H&BUdK{ZHQ@D`FDc$i66){VhM<$ zv(Eaxp(77n+jFrLk<*?1HW%4-P9IM?N>4~E-+KFH1;hw2=mbk+(>XaS+}usz1)-Gmx!Jdfl)^y4@uPEBOWv;|^O69IoQ)bZqws`%1U)3APE#poL$VLnOxtORy? zE>?t=67YM`LS+U=V@wAm?YfP2{YGK~%5Gvf&I&(>`AmnAoIcbU=?D*iklWn0qgVE` z`;*`oX|<<;6rwY1C`X;M1e~6TqvD3l7Bzu&T^5(~&oH((=@9t5DT;EDY2C#+jveIt zOo!=>>pYA%aVw-CyTDQGD}_v;c>U ztYoKdbOD4Mb>YZ~V4SuAIME`WUHXu{=*bOUN=y+q`TP>LiCdU2R?$v!Tc#y3{j+QYspD?5S0bt-JAfI7bB`Cq?u zR1t{R1RwqJiSPcYZzy&w)O#36$5G_X(NVh!`jYe5K)XUhYC4(BffsNrVTmt9tatQC zLYESJM`gcUL+B%u`3bfRz$4wV!Dkrv#bV}WvDUcfH%T`72fO>Hd%b~8>pVF=?L~>6 zJNtv4Nt@-HU>tT6idHA*LdDU>42I0ts|^_-y>nR#BUxWEI5vhK|F&=i zvn`mbbMG=HFjTsEBY5d5JT9gsKx8_^RWody}3WTOPEIU4A?a&Ok=U<_7+V>Q=w z{3TdlL5Z-r=P%I0E(VdAPG$Mo*H_QG^3Dg!k>6jn@nQQW$;Q#n$w}|{pp*QgQ{}y; z=|j8Go?xG3HMLusvKii(q|8i4=NS$5EW1Jpntg%z9tL~leRNUURQ$W-;8*uqkc!Vz zzX)KR!P_yNyOO8Nv^rbFie%8k47^Hf0)?&Br49$YN3E{XSV*3C3OQ63UT*K+xHTY~ zU;a>6j{4S1tB{1{S0^&dvo!zm12iJPPm4N;s6NmvHE=y0@4Wkc%ZwY5^x(NW=ZT6! z&lwftkQM4r5NY6R4ia;MeARN7PMgK7ewEd0x?wR_SL$7PC2EcWDi!V>g`mt7)^qsb z1AewK%5GqBpd}ri*Q(WlzkqV>I!RM8pUn=_m0hQ$vkRpqQ#;5hF3vO?-QHOvRFyB* z1^0cqT6GXLsF5qRMS4h$o>(s{(#Y!Y7CA3okGEyWe_BM#c)ZA=+ z%KCa`RrQfnMN4AogoVXQSPc`&L$n+@K@1dkuj>_mAl&~lSlj#kgCE;*wPSWM)DdLh zkFn>4D5Kj=9$+Re6`i>d^2$OzH^7p_S59y zgBK4UzIgn={qo>Z>t6VS{o3wqZ$E#Suvc6-I{L09T6d8=X3GaxFhIKSk=t8Oo+OvE zV#2F7pTg-G-tLa{oW%j+3%dP-*N5G`{&BZ=;AS8F4C04yR4H@7o1 zMK*RfVG%v-z`q~izaJ;BXHFgt#A)~%5H)OX^{0lJ?FdNFNqYg_pjkR)05~8H$kxxn z=X3#D$){{~;ToB^?%(8sZ%2Q+6Hg0D;D%_&h$WzO(Cu%hJTUwUn8o}<U9N4@2`wIds=MpF;vAodr%{oL8#xrIR=cHMl%ef?;t^8KKUcmFWNh+ zl2&8n5F`6`YgEYfU5(moy`Qm3h4e-LR4*YHM(l^~s8Dh3cpP=xOA`Vst6E4H&yUUe zA&Bg`VQ5-Rk=FWMHczQ}A>8qpQ&tbA6EY+qHA#IWTI0ZLsW#?CO&M1^#O$@eF&sj( zTaHy=w>9C=mPSSH;IU$*X4#lRMS_%a&4_agIMpBx9EdnmLn3V&4oT6lh=)76!de<=pkow={{8(*AyY14vj$BapuEkb#x)o zBf(?Cd@U&#hPY#xaChp@nRA+K9_-hQYB4OPPAWpwa}<^|ppHyG%96ZTT;Wk8CU)(y zAE+jJ>@KE@lCW@72FDxIB;;G=Qt6`L6H}r3JmDqrxZ`-Ud8=VD12>`BK&gaq=|1g^ z>cVV6W5EMp0dTDZh)%Kr0I!XqIw#{W_u`t1H;f^=Oqf6MGjd1}<`(0~IppI402>9> z`Tia&@;tl-69^j(kXab2gz*3;mcF*kGedzlLMpKCPvcH^G{ua7cm1P5a@-&6-ai~{ z`jr!@_a=nG@(HapPdZk3woqLZFg$euIiV2~Lw1yGxR(ylW9`i#N8hzH_F^BvmZMR) z_HP*m!>nQwohASbNI0i~70|$#4$^rjts)`YWC6oy{J&uS>gf_$!qO1L34Wg?EG?;v zTrFXF^lF=U4X4^VHnB7lo5q1nZ0%v)c5Euk8e+d%U@X@x6n2x)Voo-CyKfJ>C%q3R zoup~uG^`R?M9UYBO0TH`y5h78-N+q(hzcR9pD4-i$zh()1DuDxgOaJ~K^d~DA&&sM z5%m@dDNVbQfiKaVcY`-HM3`Y=6L9#;zJ{s2|3oFE0lq6MdNY+=g`anc8ZsYKquj4 z;8@`ZoR=STLaG!&el>MpYGUIprkyRWWHU2SSBFkhY?X02pBV=;Q<3GKU)u28XD%0% zm)2e$)yCHm@Sf)RGzG)M^c~sLxHP3cZ%ZQF+0A@#+UvuW6ZOYu%LX( zK$a63Jvv5JUPuwg37FZRP)^@u1=6X5d&lalG-lqb0W)IMS1-~cTo5d4WvGa8FtEU@ z-DO&}g)@2~Sq-5p-@M`U;@JYu0vP?zym4yo#fNIKa=0Hy2d)-`4QfX5ooj6P;C(z7 zn|79Wwd`DKR9-WI4!> z!k>-Whc?sXm|p|rQKPcJ;J%FQ56!I*=~Wu^Z*C6dYWn7P|Jq*e^0#`8cmJSAS z?X_x7q7{t`jkBo*?MyP7&oJ?BN=tEg*8LA!Z2Ryj<(5*g)CN$ij5eKM1X%lm1#6K> zoSK~n7;tjYXelwbRou}qL5>9V_Yf&PL;CpGjO0Dr=qh;#Q=Cuaq~T+F#16}gTl83$ zS~yroeVmr_kcBZk+0I20%WHyt2#IwlQ{_!*9g3^njty2Kz%By&nV8qa4okS-@R6kJ zPK%`z&%MRjhp~lMMZWQ?X~FP+?jfuVgh-Qpk4bAr^O_CbPS7fYNr&->oE{~ z!sX{=GCK?tMeP?BZy-lFC(6KBI4xk>QF@HvSU{gL%=4MfGm2B<*Pu*)!X)6t(==qv zH(&^vK{@4lFbX_$P`3LL{zK~hKj_#Prh06ED8Ad#5l|mUGyVvzjFcZD?^*z+k#(sp zt=h=dG6L1rlO9HDXI01aZQ-h1OVz9}UItc!DKWr?%k)+T zxLr}%%0^JEvzS7CDNEB@a{Qk)GG6C^tE7ydMeb&1gvE%Rs)j~N3R~P=u$bH=nn}g} zXrQYsvnyXE(`m*M`SR7O`C@e`Lv93j4USG|19h*hh5D#&O%) zTrr4r11dWX7BJQBy~pm&=9}bau?Hfz3Xz*BH;M(z@UR(eHB6uoWS{>bza#~Zu!8Nd z8Wf90jD!ZDH#u4ixDn5IU!+KSZO5ald@;vJagP1Pm6S(VwXCm z><=7%ct)l3gy|fp`~?gHwA=PDX#EUYYIAy%kz%k!DVbzAMvi`WI$9o|*(B-CE)!|x zUYm1?t+xOtpBD}Wy7;)DcCk91@=4sqR<6pj6~=OSS4DK`1jr>}9p>1qmrcrx2`-Y@U{C5om*|d$B|=5j@HGpHmD7u8Vkc%$ zR~)lVt4zJkv?L|DGl(#{?VEk#5`5?a)d+`}4ATW*U(qooTe$=Lxl@*nw+vCjd4JHs z{489LHlmN_cq!B}!L|v8&b0&PKML6?!KV1iAYm^OG%!Urkc^84MeEC`iW8UWB}QuM zCU=btXA`v{%W0y?4;U@RAzCpyaOgoU1PPisakMcJAwVuOEZM?ZAu>{K_!AEJZr6>v zRDvvCcdpBq)RV_VYZ^i?VauXGPbf&VM(72Td&M&?B{4bT(J@#E(gA}s(BM(?YH_P;e>l~j$@ImfAsR*u}SMIB+JPC`a-+Xo&d)HJq$L~0D@(MC1B+>oH zVm4Jv2+z;#6Tvrt>mDz;%~Bx2f>bkH-55kj<}+l{6-H(}4q@w$V84M|!%`UFI!2zF z6wPE3IY%W0Dw zV#aL-;wz#X&^G{g1$3}Y$$^i%NJ2kJuks-aq<}>M?RmG@w04tfLuONv!`8J{1=oQ% zMN&m5iHJZC&6Gc#Gc^s|D{PlIiW_1UmngJ0>#y|01!GDXM#sD?BZ{vxY>fPdfad@+ zfk1U6RBg}XT>~W^8A#X@25ompgpdu-d7U`8lnInghtSW9Z2lQs&jLpFV>$pr{bVd=W1gh0;`JRubP{ivKdB@JXV8Px9NbcM%;5JDm z{2sWEZiIO3+^stgk2G?Ebx+)ka$XS))x|8GV%F0|HV*0jo*A}3*Y+Ov5shj{`AWJa zlRUz%g`6+;g_vYpy$&GeT+q_{vE)9GMSN#5bt4ca82fVA9XMezPqoek!_hJQlv>%q z0KG&L3Avs@rWR?Yn^ZdqGuZH5&hL-1Pxq&b@fh@lU3C;haVWjT#IL>9iS)Aj(M4fzSW>pBd--pZ^(Th$}=w23GHZebP<& zu5Q8QVP%7N*u=|*8Aw&C?`$uJ7ezq!0#O;gkOxslCVq1nAecpk?{$)onG<48j7*5`h)Hf(EBqVfdC0p4F_Ub{ zuJan;x-aTbK|)hNRb9z!pLz$h_%}+gxJd~HJN+IXa> z63bV8G4}Q2tw*3t>1^YO=Y|A&hjTT|Ec5a<76q;#OzI>+y(oL{caDGf?myhWUv%H^ z?4S0y-q^`CvA|DpUm}up4%fo3cpaTl6t&L7ptZY{WCD6s;3hB^}sC%%FwSvAg*Tl%Z;i`as26*is$CLJ}C&IK|aX*)SP~ zQFXw;$K|?5FD!%eBEg~g!H&$TRrMA(J9TX-U8f(q3*ev)4RjgAz8_tm`V~=CY(RE!>?}x7s06%_rg$g;}*c*^EoK zj?oAMyJ1S>qP9V@4<4+pWa`HcQ^hp@0rxn$5mcXN1P6gQ+|HQJx6Ct{O=#nnKLq8e zVQN2JmNrlle22(>>M~D zAQQP)1a4<)la*m%3O+~H5A*`E^*%-a+WFQ{(-efhEyl&xJo;$=bO8Tfs|z25HCV_; zD&3G~&bM55*YCz)=e?FJJI;u&f{uSK5w27w8!6#hIA@4nBH%ixyjpvcc%|KT9ezYz zO)|Q$m{pZ5MVjJ=ZwZRmmwA9OkmmsT{^4;C)3hvyF-H~g2UoSvK`NaU18}w?;Lp-7 zG!7F#N?INGazCEHk3&Rd`pJW~=EaT4aU6c^Bs7ZBkR42z3I>M~7XlK6Gf{w!VJ)Sw zQNSP`MuCTLmg=Ub;|oAbOH_g$>b)$cRJ0Nd6HLBC3p(tr(*;TbAbOmoST z6K@};SD=R|Y_M(uj(h)h+CT2WIUsHKOvKOEuny1{pV4pSQwJ|Hk{FhG9k*Dhv4DD} z08@T)+h@FFsGXI$C&?17&#g^%D^5N3q`0(mVcCT2p0T7tMt$@U?ix0sb@OYK1)3D; zkf2nLoR~s7;D$c-?6Rm!?K;1u^-0T2E3&ptaO1os!y24ncA@g9Y@Shg+*f^e2o_JIe0wBZ zi}_yp+j@33%JmpfDz~CazRg2c6g#J7`J@~iN!;{{gsmt_Ab-WHZ@{{clQQAzk7AKPre6IhY-fjqrr~_^@7M7+!(7_&0$m5 z&bEY{(MJ<^K|4>WK@lpJv0=#25EJ0)qgZJPuz=F4PYwhnwN`R5<26GNWipY};RdK0 zvWOa-V@D|AfYq98@Q5ana={@{cHOSTl3rRsP-VlkUQNp0D2(O>K z#iuHBIOlZy znmpv1bpe65YSWZ%-wq0rrK(e(Lx801CT>cw)Qr6L6LL-?rayLAZIDosD2uT{03Bv< zC#sXsI2lwQ#!57dqxO*Y5Q0W1f`4sqdbYz@7@NXFCx#kNZEbPCNde$_g>}_PJEsKi zKqgPyypI%Trq~y{#{mp>?j%6+r{uefZ`)R^$d>25Ee&=Oy}XV;HF~L~3wa-;xH+X5 zRC5iKT{KDAmz#82Hqv5uyFlRr|MrU+78*Y1g&z%VCfPXu&P{>N5Z8yasg&-LbC{)& zSv4z%=?#q9#`*thLwe4@{o#p!sc-^D_o7Iivc1rv!BfK>OH!L{lBIIu;7?>Z8zE>< zb2RGojorNKE>HcYw2K^oH?(@n<|)=m+n`hN4D!hd!u{=c{~>?;*SDLiZhzA|d2@Vt zdNepY=_Gu*fRF9$Dw|_Xta4=&-~ETXZ9Y4@9?kyC7r)+HXuJ^VNQcA^c9H)*1p^B; zN;*$1223$ognKBnNseI>j`9GUb)K!GEio<@tov4w)+G5*GgAWirKaX26xCt^RYoAv zs%Ui$Yg*MK$F3AMN4WrbF;lVX)xQqfO^Rx&oY*8&Hz3ph+Md|xeNG^&^@nf2ga0Jm zvAamNHjxah(WIZxsBQm6<3r3M|GNIaY;JpHmF;G$fy|1?Oj7H+#tx~N8BL8Zu`i5K zt_TLTs6!J#0v8;r{5I0L%Wq*)=xield|1+#7;#t+!V5$QqK9@~NCgJs`Lm0Yp2W4C zlKJOCbmEH)Jh_|$f|a78KB2vMz+M^Xb=89HC|O)N_o|ZVICltxdtBgVi1dQ~(FeGu9`OFZ9`Xj`@&UIRPx1w|; zFU6Zks{)(U7rXR#uc0kAP9qkWt(i-~1Mr3!-f?QZS1_Dl7)fW&ISr92MTe9Nn`}}b zW}u7<&PyR(G?SY~va&GZs(Py@ed%oL_y=oG@#nJ4AlkBNa{=^~^j-YBr6yan=9Q>; z@RH>rEe*1HxLv>!^B_DN8AVvJ4FrFh)>dhM69^oq4YYMAEo@*wP}@+@dy^S3uZ+>{;Uu9^Li(7 z^`K>Pso1&bi!R^6;}^AFJ%P3Vnkq7k03U=8(?F}+e;{Q>fC-vPxx!XGUFilUiO}`L z_yh;rR5A@WLtYE;T0=|GfsX*j0^mob0RPZQ@vV1ge~UIhla!~monhxT1gWqjob`uy zh^apvk&c_>ahf}R3KbI^Ep?Zx(bNg#s!W@uXs3L}S!WM#cGXz0n7}bp3 zXQoaek}~u`bi03BqsanM06Ku;d*nDX1}xGQITxLm$cb?A72SXg)kmiY_Cs^ikVP-rtE?KVY~>2hx(XQJ2)2(NNz}ygig49diJ_lqX9w zoR(sJ|Gv{qGLV_djaUr~@Q&*6nq^n%Y&2#gI)rM~EM4UN$>y^>LvmZPiBlS z_(AaM2OXQfh z3d_;X?vFcfdflUAClx+`w+j7fUBc@f^>+KO`?~}d{^e|EZ?6x2(4GD6;Su~Y_?4Op zb5F_ZMFEL3h%203%!-fMltnXt4}s9Lt0B0$Qb|b{u7jI&=J#AsC>AyY_do2qw}+DS z;sVZTia$o8+W>2=3k^CaEf1KS74(R;AxA4U?7~7^d1SfG3VyO zvg|^7B;|0w=B1@>2VAY3W?{*k4EsC&2zL;AMroJ3U)&f<0P`FMQ)P3X;-+Fc;9Zfu zl6%dEq%^hT=Us==yaMeFNTlR|wtbln=Q=Z+3dM#}J#?liV$yBd;$RePFcV}QxIgG) z2|D2qYBnMSq}WKXLgmVz(DTFCFp=EQce`8g`8Ylp3dGX8Sankm?Z6-jdF_*pb7U4s z!CfxNHyh_}Ikz$IKN6ol;BwwS7@X|v?`!UJbx-+~d~2<#i0M&NI}^pg$$VQLJo8$y zh2=LTq|nWkE${}j4ub;;cODmS5L_u~sfy`_2iT1fI z;h`XFb=Bt0KHFT$GF(K^lJ%*S7@weML`gDdxPZjTiy3&4(X-6uM5%||4xgUMMNt5) zikmFpdcyIU761+8RCzCX$*W+w%wLkaK~&2)E>jP$ZguTj-06r36Wbe(ofSunB)-)h zC_7d^KnW3KtFu2}t2!FB$dcKSW0rZi(8wcjI;mi{!tPXFyKO$wyi-#ehm6Knm$NwJ zbHv*S9lS5#icg{V0Mq_6`Ddw)9QKw9e}|UQrOM$Qk7a^IG|G?_8+OSEk`U(g7!ltu zqSV~FPoHez0Aa3jsBnQdTB!=5;c)9vg#Oev6bwa0U&w+J#nsc#XBp; zXP#_wR=G%j9Ay`atE(s`q?+d-=mG1Tt!{uhDEx}TV<))9yZTJjeQ^3}uYZi(?NT3| zAHGHDuWd?zx&!Mqb52YV9(eW)`drF9#aQR z!4*^A$3MQ}fTLXj`;sY0P6Qo<+2G)Jm=(o@)Hh5W&N=0jEjx68@ujenMnG!ro=oYB zKnnp{9>JM&3kjI;X@iNUmTCc~8xpsm2FC)@h(;l$31I~0HrJWi2jw6aTFI7j9b-C% z(EOsFOWs~fHCaP68EDgH77+qo8AduD+(AF$+BC!Ag7T7DRQd!Vy&zmb@R5V4W+T0X z`IeK0$;gq&#k~~@0)mkXg|uy8lFhDI{z8C>dMuJy)^)2(^2F73$*HU z_iOPSf~E&u-=inpg|WZchg$WzR$Ql*o2$;#HS@)h2#!FYmaS8B@;;(R5(6nlmNn&^ zMD-2a{-a=^N79K=1|ULcn_KeSJzQO0%Hn`$KAR551uNvj17ndLrTS7h;Z$k~ShDU0 zmhP717EXd~rwB@pX^x$wb8mrky)#V6Lka4{XVDJbB3ljqW?}j8d~Fy<2JuR*X!4=d zi2$iDBPsrFm?_i~d7^wjRc1?eBBzF27oS;eA;xeScywR0voSBl@$^zkBf!19O7Mt5 z=glM?DcFMoIf#48h3W?U&N_D#T$+{KSSzkIRO1=8?zCj%b#Le7^tjjE>kW2~`)Grx zPnZDAUQ42QT!oEm0CX;`gWq_>8RLKkdpZBb&;w2%NQ zX^9hZaPh`rYMsCl%Faz&KSb+>R1xj$_M_#fMv*=dc2>ZSiN%+YM1a9$E+tqr!PvgY`9fkT}lOM>nfF&YM;dja{-q z|6OYd6_uDkO5+QsUZojZY-o(>Jq&!Pz=%WRQFk&ntr#7TJzySRu5}4t(v#d6%ja$Axk^6<>h2gu(Z%JO7u)!KJlaf=hs8;`1tTR*}(s- zyBd_l9wmTQCb50AE_N9$q(-k1C^03zFha97Db3JDo<@gg^TQw$u`UTYFtY+{1MxdH zZujI|%uiad-@QG2r@ks!r~eB-sm&#WLH%jxm`ZfK+V8zvHL8(Qn?~5D{Bz1lZQ&~( zLAwB>!3#$1WkgBKvjYm#BJ*kv@|6Jz9cm9Y?NOP6y1GJ0o;%3vk!!$(g zG>uf)9%XOcBL6+X(6_Jk}l*xGD{C?xYtzsar&`rhh~IV)eJTabsJN5 zEA{;L%)nGv=PEv+YGb@>o#G)P1d2a^SyL~(Y!z2u=1avMA9|jJuI}JdR}H&qz&IS+ z^57DMz2YiAqm0xyBLWN5i=C3WnB71m370VKGx2KW3OVob1EA zRBZkdbFV4iZ-~Sob*S$5z2jGhgWl3JZsh>;6jp|p(QWFk1?V9kG+_`{7e)k&jv}ME zw#1s0-OPSES+coz)~UjpfTL{YgQBur*EF;$shZ5+Rbzd7g3iG7(hSb9saBl7sT2GY zmlV@NTS2B7S5)B5jgIi4psgsW_c|rJ1hzg`$>t~#IR-DN8K%G=;p93aDZMF)kA&HG zVN)2_QAqZcdmr0;|I*1ixD$$GWfpSOa9GSb*`&epX+E=z@{-aDFS2`)6Z0lTGI~b);)_Ld&PcV z$wdA}9_>aLjVEPRfSbINHyD?d%slZxnH8zS5Rp~rdTVv7_b)a5~c$46^)NEXOnSJd@Ms=QV~G%0vqpkc8?Fc z2RrY2o#Yq#1L|S^%HkS5TYp+OyB5gZ*@JR9}kc28Z2!iT;8+nk}|8nL+ZUUz`cyK(dwE917P*LZLn6p zdkAO9d>C-9Ig!q>S7o})iCfP*Q={cH9phm^=@|&!gYU_)JWLsJk9FGS*E6hUL|(@) z^U%=da12#@ZFM!IQ}J40kJ2Hmku7)>71G(lK*3B@7vNFMnh2xZ4oIHCOGp^<;Sf=PxL2U@aX!>r zSyaQ)f$`Z9KI15ff%YCuHvyA{ua}fP>L-XYXYh}2yB=Lp(^! zPI^l>$|mE9Ed2-3GD=~F~3Fod0Sgyxy& z4JK+Rd=PuxGA(Wa|G6)O2xXsHY{9Gm9U{)v4h|@s59XXAyXxIbjVQB8w?x9z!u8_stda zq~ZcaH<6eYsO*(_JC<5^0KLYhly)l5lj3aff<1*M(w_zLahkY@NY(beL(~?{7-_qq9${cX`GAC4T~Y zs!fU1&;*Jn&%Lj&D)^{fbt~+8W*RvPB{(S;@AY;)&~?vNnsGz08xo7y5)^Vj&;#iG zzCa6R`fwp=xfJt6^;)D{Wc&8>l*vMZra3oUZg^Ys^!@%T`?B#9k9JPp>i4+(7GPng zQ2r3NgJiy0;?0PW>m1mBf<`X9U^aZ@a{1uo_;mNg45?QMa70zAG!E(DXJ1wQka!yv zO;(vdz^|DhkZDF>0oJJ)CARX+`TLz?b9pem@$kXPs$LJ>gHW=s3`Fpp0gN0y4)$lO z>vt&NyDk?qJPT03h1w<)E3@iq8cboYVuVtXlr+8)0=%5~faQ30deVQ_J3Bbt-)~Fi z09m(MWSkp1UqH;YZED|KD>a4q49=+?tTtfDns=;#AkIuZ*2~3(TiA0@#?U&o>BB+2 zCf5|cb|n@RjxSibzKKo{<^gNoOJEvT2Kj#$kiT|})zl)3^N&~qf(>)_p&gcLVO7e1 zfA-%lDNcXjugjLwk)^o)kS~)8+WX+>|h*?$xVeV z!Fer*FRHVX$&j5>b#HBTXIV?K+h|guBEC2q13|%k#^RQ zDNV^Vv58N?& z0N`7qdDJGy=~YpTAaN#zSEbN6<~%HUxaNZ5w{cTW<;r4aPZ*7!FfA zCSlabI^13vNf@es`4@iwKm7^T-3HJxxhgaKMT;-?)MLV+>p=AaBTd`zjTs6{mG_L{>#63{#r~w zv&6QSQ>f!M|2xX-`}a_;4&L+u!*^e<;*xGuq>V29<=2;R_3_~8g9i_MxlYIc`zvr) z(zSeX&=}Qp`_rE~b)EmEll*GC{!2P9@(pfg^X0E@7hyVrJNnP)!yj&uv?u;_T6i)J zbv$d$$C_+I^83L?zD31&uAWWkD9i&Ki0FiwWmJrQ9y4#*`UmM~M28y7O%zea$|dkC zoqzW9!=n`zmNWTL0b(@+_W>6np_b@T<{4Z3st5~QTsUHG*6R zzWu4MJ%ggZ^s*njjQc8we!31$+3HwE4MOlak(7%m9u?$&(vbkgG$QtFXA4t$O$+ucF#P{cij_wofF%i@=d4pl2%$v+4*!dryh5^J>IM&%9R5M@@ls{hzYMsggI_e5^Th^+zyavu>1?ww*p zmAZ%N1gLA!A?0KfSFKZ?_xfl`t?T-mZ!i-UMn&}ni^;<~2aBsKROFLG=mUpEe&S;5 zM0=(?q2Nmb!pD2bp~Qpb$zePuXbZ{)BkrZRRD>={_w`n0&5L^W$jYnm;#|HETiv== zTeXR6^;Uw9+|lG&CBSBipa7H9YsAXZYAq%=i+NRBt+Ru`tUvqt=ab%tleUOn$unnH zGXzvG$JrNxSivs{SOB0tjzfu6s)YV_zxP4PRcU|B?h$4h50>=wWN@pOpvNgAz*5Yy z8U_Tbp`ukOazGkDZ7r`k)`pRi%BuQUj$ob%3Tz^+On@6q!mFVf>t0QLyc>awx~E%R zsS<*Fo8VCPlET!Csi93yOt?n_?3_sMz3+*?2(2?)k|ZEh#Bin$iz}Z=5O>*(tJ;!Q zWuC!qar}v5O>nQj5TS>-VzC=R5KtO0p*dKn<5C&*qOiYPYVZ4dy*3ejuq(i(J|j;+ zKp`1~-9n&=khA-z=UTto+D`(Mv^{|0Ia;C*bIiD4rB7p#NWqkZiKcYxg76T77+Vmm z1Ab((aq_l5=+-QTV^0conGQM7A6;BGEci2zuJiDp*oPDPGdR24PN5l_ohjjg`3Sqp z1l^%#mbE&h5ib+Id(iIG2SG(c=Z9_l^4)`9*CqI>0D(Y$zZ2{v^P{83msP7hC)PR) zs!yvu3qmD@C7YiFfFg2cdgv$0sknpD0bpSPY2uVQ;_gWyntK{z;&b6bZi$bEQ~_{g zd>gAdPPa5^3ck1EE|Cu3dR+w@6ru=!GYT3tq020k-b@dQ3J0G~qhg3M%4#u5o%$v6 z{Z;SvVIba7pQ6+QgRW?G#j|F(S+z5_30VtRjSdJ~1PhQ>nR!fp$!FGCis5jfrG_Q( ztp?B;w$(u~f;Y{o=`Rf)I_0Qm)!ss?&729@3Vm#eLtB)+6C`YDS{+5XdBUMxnrT1v zTrs;c^FhIgFvW!eH4qe0_f_yRyYQ-mBKSmkqa(YWCL4u9C;7#UhuFNWE`ifvW=gA7 zS5F!qM=amPCn?S&LBf>QO1o4EzgriHtwb-H0uYe&W@%7;_Hot zsKx5xpesA1n8sQJreY>)9>uu0y2V$kuTc$ed59G)okBb(dOWn9Tpzf^tcj?I7l2S( zpR%zt8%G@qBc!A5bupyWD$0LGXdgzOTnGQotbgQ70EvRVl8r;DktiLM(?Ue|7BO8) zeFhdBWf844ITb#mLs~VcZ$*Xr_9X+E=HL|pJDs?M=`Ja58^Am3u#L4Qy__kBuLg(v zy%Te)fJE@;3UNQwdu#X@P#3JCpuH~)eFnqA&G;49?!>6Q>+aMIFqZBsi4lmj`B(}{ z_e2i9#0NzLs)LOMgO- zKN0LJ9x*bdt|+m3E;*T;_nL7*Y-xu=#@ug{BrQ4E*7mWu|jLHHB^A~&A7TFiCkm=^$|XGwgik- zTCCc8aVU}vYgzri2%Z9@DW@s6x<0z^gP#jBXu)qCCx4eVj%A?Q#`)>)ree#Kt&Ut+ zZg1j#Sxj-NC^0QWEJPm30i|HWO*KGm^DRmhpZ+d%SDYK4{~bM&N$~T=)bG(O`f4Lw z)A$6E>J2$DH=>`!MF1-8Q1Yy4E$ENMd`pBsYGNG|HySR(y=6y&cVojQ1miUvSkvj& zGMBq46#i|j$Z&EP=s=0%5%qEG7?!vy*#89f8ce~)C8vXF#1Orh`UZ)3_=l67<2Sw4 zjgmrv)bZ0>e~`@!SWp}~wa=2KZWMz*66wWWYg|fKxPSv{AIL22GJTJ%9Ik#$n8{Rl ze*~i;dku!D!-UFQt^=kmTm!jzIyh-tU0Xk%rat=u;L04UB_ewJ#`0@1W3z7`8#evn z(;jQE<1lK8aPp>bCiJa1wtPK$TA-DsjCgA_WQe^mSg8SKm+!@CX;Jig0o<&)B}0w8 zKpj!X10iR&Fb3wM9Kzk*A0|(qeRRFNbfSAWH1topwDf{nF$zTtuE3H(N9POz6?rOr zlNcAb^Y)Sz6d%8G$3RK`zqT-F(eMi8s(AyW|H9&*Ga2258DyJRGl35 z>_>}>HW_LI`UG`EV5K5^|sy~2upUBkeF=W~1{ zDD`n9{{7i5*yxZ!m@b1Af#O_N>T*E*&eO6R)*&hZm={YhXQ}ZKK1iwlWROn2Lxi5z9(oD(&!PBs$*Ch zUli(m&Lycj9vl$i3{jZu=2pgS7k4jU>WXX9l?-p@Iwrv@uCB+S~; z+?jChf#zk3=n)hGxRuOWqWV4P+s$OhoS)OS>hR_6zr63-OIJB=g_l7aXDA(|CI1(- z$A1T{az=&-Q%=w!zjTcqR+<1vbdZ1t5cJ8YN5h*1^nm_w!eUg+{NDxj=A63Am*VgK zO8iqVjmS#8e&?xlqd$MP?FY20!uKi*cpaW34eq&-{}EeP4I&1tiIq* zHbws&pIMyzBhG_QvI+x+fAuuLcO8N|Or3!~6sBLry9cbr_`Oa4>-yqYfVZGu!($2_>6H#D3$NKsO6MjUIwV0=iY)MB^3C))R!IBCmbX)YNn2 z@Qg!as6}uWIF~nO#BxWi0+!G`FK&`C1m#5IbE}EeT-C%Z?^WdB=AcC#qQ;Lf7k#`> zl^&h)^Iu!niGJp%?!TY_A1!Kjly6;c+O;M16Ihpq5a4ufHAdbMp7;T)y}|zTtX_lT zU8j@Yuj!Mhd-CkNwG+IDK_Chxf#hm>linV(m>LM!Fk`ZdTtp*WwYoPf4USmjS*ne< zx}M+W?BwupUqXzmY!__Etg8jp#b-zb>Q6tB|6c{A$)c(a`2+!+YRj#<@J+1)K)ERw zHxS9LkbZK7fnn6Tx__0q7t|AsWW#t;=+(GLDC9?}6>zd})_1Eb{wnkfN^U3dTz}zT zg&9Ml6CEn92I-+Zjjb-FTti@%3IMUV7sEiDLdHn7gCMS@R$bVmC!HQ}r^8r5G5Z)1 z3}}btEh*-3#E!Yc8z#p|?9TvCMARi2i2QuljwpbjGG`oK9#ZIYZXK9cg*_ySv9 z@}<={%&B$Ma4H*(L(ocUAh)9;RZKH)>?3WiJ(Id!SleALY4XbtJI8N+4Zm~pQoh#v zLYO zb&|Ke{iE*SE6|xd!>- z`HHII#q&)i?V_?{Q9mVD4}WB1@YBGtt`vYjSi_Cnp@syxuAwuT<(KGHfK9k44FPd#iUjkifLY6! zo|Tu^@%!s*+jWf=NF9wQFA&~R_)|mqW`B6)!r6_du>6Sje3=41JqUV1xfTKkNn5sW zEOwOh5zk`04?+s~uJ|3PbB1x6+_!EO{bhlqIGP}Yfs*lJGA*ecClLY{jC%(+5jSmJ z<~v9hH%~9rIE3#xMVp{e?eSRgRLsQB-kQ4D55an>;{#aI5cZjxR5g zkF$#>_ZRbgd|$NL`+-{9ecXb=H%WK6#-%T|xA1@KTsq4p#V2>HINR(KXAW1c+`sRP3YHl zXM6kM^MvhBnWDaHi6Nq)0l*6ebtG`@;3K!Uo;=ZPrB>GzOZT_WvoE<6UOU-2KI!%k zULSV%`p4bg!O8K@XuJr@=|!?3_d#|Y|8V7b6T1toUX7Ewwt5G9)d#eK?3WkRpzx<6 z1~P(=4+MVYUUn~aE3SpR;m2(H_dK&YEGU%lwvupDs>bYb(R=`*FIpZf#ytf^RRY*o zR3(*ROPSNy`G|wKtVwJ1wz}`yZgF!v!vxul-A!0T4?FPhNBHl@$!h@rh`HrdF=wQ+ z1EW7RJdsBb)iuePT!(o|88L(Nbe?;aPES)gi%xs1&6eql4IA@?217rz7T{ zf@!pGdW!)t^J<97Caf~ha2Qeo0;I93K_r!0!O=epLa9{Y0N%MW7F0`lNF;UGTX!&h zvo8 zE(pxVZR~zS5IH#Y*$==j8?sKr-l!*03rb_*EfQnWV5>_BoS83&2U`D(2_oSAl`9-* zp^z#_b_nBMyh+O0>u_ffq*Ov8M8IQmFBCu3eExBEiFk>xc9lpUf1j%ad}&yiQPX1m zD3Lz|v}33_WNWwY=+lY$%{1&4_*U0U5SH%yp#&|ry{0F^`yr^MXld0uBEt31;EITs zSnP1H?uJ%Z71!Ru&a3_2-CPcoc8AU&P@F1m2N}m)sa^m3To2TLEeG*G=6tB^S?hj? zXZimC_XBq&a6kAp1aI7>Amn8_#5_dwEl4wKxETJA@h#BIgx&=;FWJekrgwpw^8N*B z#<&^Q@h{M;n}w>~F@wPFf^=RrGntWB&Uv}phmt%Qz1=RAt@7Vw3#&-6*08P|c4{oO zhSv*wdcB8~p=v&ZM!eirJ_DSm~L>SenglUu$QgR!x+N45MBDN)LgX0_|5HUKf zl(j-5E=*HkTI9g|hs_gm*2F5a33z$Z(FjNbsRcxq4MA`Zkm`}EB!nX&hMrH~0sGkv z1ziYdflq0(!ER&@b{uQG{21dX^GYf^}6&F7Af zf3|nF1L!7(F~cV8Lw$NEX4p@qN}7+5falHi;vN+*yd{0_UPlf$lX(bx90HZr zJBW=@awkjli!1~iofGN0N9tijkdiwxO*&`3;S5O=$kB#v7;gFEK1e2Ru#ERMp6vA{a$~k^XbzZ5^X*3C? zFG#?cx48-Wr^sFUk@11yt&)ab=CEJr!LFSvgNe6O>=w${H$mP=!g2UaKZ4`-Nhhb< z_DmJ#WJ9K++}u;Fi^0^H`U-Jb1tRn&ra)%`rUCWyDzR59;Q~vLv`mlr3+3c8p%=8x zP!@UyQ6ly=Xum`ZE)k6CRN@nW>vzf&Rrs`HsDQWb`orW&z2^@y@&2nq%gBImM39d;+I*h}wnii`_rd?wnD&UaI8}3}pP=ZTz-Z+)$?1 z4vI$fW4dusQw>Y4Sc?>#xInrdf%+;)-YBxF5Qj(&jPJ`!Ksv<`NT^)TkSgs^aBm$8 z!>xsqM|>R2edruuA#Ns|_#3$WY{Lfy6@TaXT=Bvq|XKB=-ZS zdtq~7^)y!rI>*K15NJ1IZ>ehO#e6A@klP;~IAC8WDulpa`e*Y0;DSaHInY^qt zQ7$f_iNWb>+XOPojuQHGMGN|3U8MW%eQ?hm44n4wJH%NdB&KY2>%?Czip%eqbu+EC z(~j#;&$PxRbB84%Pi$Nheo>s%oi0S5K*b)pw2sYo;iN^)a%pv|Fj67jL7mI!UlqzW zy%`86CKsUM_#|^Dk|1*S*d`xKMI+7DL}2!(FW|c`+f>5Jy~ucMkYWg5x7T$cUBk6v zwYl@uXQ*qPL3l9AN2wl5U}ox-cDaha1@6xbC8`yj;8?uMxjOIpRa*^bViW&Nr6VCo zr6ca&p_p=}9K(1aqb?n}qmQvgs#!2R4D@GsDidr6!_JTO@hzk|fb*zr1~}T#SCrMm zbtK?^OeI8DEqAlc`NG<3aDKV5zrQGF_Yv24|018>zrrV(bbYKGUSOQ<<{AL*!<4E9 zaDS<@Fee7<(74&#<^BKP{j2*g6ZhY%EB(#wi1I%Et4&X)QUxee++=8Np~xM~={Qpi z1z;3#KFcx*orvxR-f*fjdo{XX?|>i{)k#l|UVrHr6MC4YAO855-O9aW>)EvcO!OyG zkE1LX6CoSI;n9*CrjsG52a@OqI~jmyPDLO$q>zEOv6aKvS&n;D9V6|GL`RlF;ywqS$SPZ)c$_$k51DjT372-ar7{H8 zvPauUS#(=Ayj!{Rp>VfV&ZLKJI|#JT^o48Ix||VE>aXrQs*&>$#gQ)sc*iql=^65M zdIdJwaDwQvkV*vX>JT92YJ-8ph^lOX5o3c^di@W7u5aScawX5i3$8R6{Cv03KNy_s z?C*<(vzbh8p*{D_1^9+%oA=MN;dQ|u|0hWL_IDflsLl4dw5i(iRGt_=&FK=|%e%GQ z>Pjv#Zr>2oWa3f$NKXNcB+n$2#zk>shmK!$@Wb#X8JDhC@kqt}M&K>9_1%WtyZI8H z@W0|KYe)3E?`|qD?LMn}V#{72;OzVV@x*ZnVhg zm0&n7;%HsOWuZFjuPNm zlKM)Ftf7Qlw@LD9!2||O?r-k_;g`V81zpl{#*jNMilvlG0NR5lCLHW3&5oztp@@O z(oy6kn&XF3gCOJqA&d9E)7EF%eeu)eP?(7LbuguqFe5OJa=lXqny*Ip^#Y4%;*@j! z7)~zqu@~B>z@|EbaU>;>%6H&}PBt>rE398BL!;bOyq`>%0cM^WWiv3HUF2?q%x*)1 z4`MAPs09adBtH%}>WI?c+^B&BLI}}~o3c4uNgVE+7^3=+gNFtiIi0W!CHd-+EPz>Z z;TkI9s(l8EaQ%zUQREYYmUIc5_NXg3aU-q80BT=#%e1<+n+7Z-sisN`+S7-C>K#3{ zMakT3ZAec=M5STvG0gCkvJ{c47P^D1&hl*E)`b%PXZBsC@&lq1NMUYu?a|6TX>FvV!{D4LW{@q4)l}Jy=Z_d!|>D3FGmUDCK zOVbOcc`X64!`h91Px-R;VGK0z*VyOrYrG`W3mp$&HPtpG(ZsO7c=^k~oC+nE77)bk zB<1UhrnFb|ue7=q4iiI-u={#{=gq+Ta|HR1m@trINDjwsw}koWh1QEBTbA%|;=LL< z^#HsR^PEG?5vfzFE3{6AlF2;Az5+X4-EX}QJzyAzKV1VG7_s}rrO7bz%2YuzTASYH zU{NzsD2iO;&2jN9=X0N>7@okjvDk{Bz)g($1J@YFH;JDMXLdHeR652vAvjR8MdxL% z>~vLbI^wN_8z#2K8FSe(kg>(3Bn03fuE{iD;$?+~98}-BV{Bri>$gs(fymK-ZQ<)7 zX$3Ck0MkQ)j^QRvfVej?e_vRXLN2|qFmtOLtVvXW0P{y$S|lpTH3`M?`0#*o+TsFZ z^(MUplcZiv#DG3elzLUDzNm-Lx1`c}p;TERs4_g4xS}3(9`$TFIzUYOp2M1<2eTTf zyeNZw;!dQQ5U~i*)HcO?svF>O^@W4heg+K~6&S&ZF>7&ZX|z-{u#9SvQfmdRo=EvD z7CRd$z0Wjb)3r{LXUAv|B&n~*FM1mW(w{2J9l?~xEgAX=ViX0g1d9R?#RBRru12J_Fbz%}@wR@3~o_)j<%dm?gyXgA9Y~K)g@bl|b#hlTgNv z*%;c;t|$$Je3EPJCMp37CYA8+h1jYJd5FgvVI@|Tc_R6S`~AMWZiw*+G9G~HC<@c)#TaZ z>y`;`;;LMr$5orF^`o`IKsut3m@p}~i@r~ z#kt}48it}i74_xZo@5-QEmPsK=d%^zY%ph(p@RuskVFV41rSFoF0;c(G1AGn>2Yz@ zw&UXKZlLMe!V>DJ3Qyb>Y&Kw?&Q)~&YzE#@tNxF`kAa^5glf*395Xwa9Vh&=6u}|4 zFJq(3wd3)D6*U4EXie%*VCOdYT zefBXIJly?r>AgXiVCX z;;l|Bk={Xio2F}WL08zmtmbGh9&Qn*D#Co)4YES7ezc`Z3s&CHJE?KJA0#n4kKN05 z=RT7WG{>MYZ`}hP+wOSOQHaPec#P?Yow!i*Y{LQa2QDb&CeNa3>Mg8A46c zmsct++XDXB740_wh zp^fZH8-_oJUr`~Q0o)R9yAMh1ai%fG-Arub0o;d4=Y~Qmpkhg-s3c=LllQm3dtK|W z*RCo_*qynL4>M_lv}@NsuJgLqGC`BY&~7cm^vq5Hc9n?Q`L<3ewVlExjvKXWszjic zFSf75Xilm7r2%JR7Hg}V5gz94gcMrB1>KEi-DVm*F)8-!dSkUi@xFC-(`a~3<4NC0 zE$%#fT9LB`M&2-N(t9BxCQ&n-bJ$U7Lwqp_gwg)~lfm!*kg;|DN&o0!_Tunq_+>P$ z>his30KB|MWVW!yO}tLz^?2thn5BU{ZS_-Yz_u`p+S+@tWwkqDT zqo@{%B~l?tU~v(WU7e!>Ce>c#=K z_*uz8wt$NWBH!*-ONCLo&&%l6u7ygKETJgLyokP^WoHMWx_+N29v6oM1dHt@UEJO3 z71_;#BmH(%4k#G3q9jr@uB$o~0>dM14@cVtzaS6r&eH_c8FS$P@RSati`Z(40h zdFntE8e$%bfhB^T$qjs}*=?3a**4;CDR8R?*Kj)}26|;;w-NV2<EbPT|(J)M?&ccqi>eQ=L@ulOo$^xKd$F$@Au{^%;v$6v5!0xZAjCSQxwn8^v@5g+~cjVV2weQy%yweoK9#cRc`InNbqd(Vg>j$7|emS6fB6 z?EZFM`c-$g)qU61O+`xs1(=c*#N8*Gu+{c&YP24iB{9Fo?lR_u!RcVYXjeK+kK{xswPr%O@7P8&fTct6c zpyfYwr zTxF9ByGq%b*6YpYmIDXNZ$BHIpoM9z^g73yaJ_E~Jr zcPaeI5rl>-kxTW(Rb_K62%}z1zSu%&N~_|o==+o{by*gpq0|1Bl+`^c_*^HZdsNah zbA|>KiB=mHouQ-X1qywXJXzL^>>+qkTJk31i(eP%M|$Bl`evVm%AKrkOM)i<6oAC#Hz2ZDzfZQJLZzL>-*j4w+hEv zu$L*EZ5!fRTG6HpDi$|gm|exE))9+F?;Rwfxo2wEze7=u2wuwZA)XqWLk|HoiR-Lc zCKS=;xaBBwyU`imAFVXZ8Ta=|(01WXlC2@}PrE6Dj};dG+v4MoX06agdU|a%qB<>_ z=r+7=tOkdU_A-fIeFWMDnEQ^cut2-K*}hifWQ$u$)8qg_Tt~bQ+9IWtuDx|4l8`DAiKtT&cM3a1jKGNKd5&aZ~S*`1E!W zoxrV0+`B(4-rb)p#7!Up%7{Gzg}d~K8Xcb0I00aQYunev@Mu#P<8eM~!ILyVNW|P? zzQWMk-xg&t-{RlvlJF4ukH6U~o^iM%SZj3Q2wRmrbvC(xtfNXd;XcN9)U&~`oI!}v zPG9JGT<(4=oh2&^&qj&Bmb@Vt3|*Pg+*im-N+*ceM6|! zUNq{dxz^rb1<%ERV)koSCWQg6D2#;*(p)Y^y+(zj4~#F1L1fH4{zJ0-YNv~J1f->5 zWrd+q=Xa=8)e0(WMVAP*xA+MNFeC&y+Aq-)id?BMJGB8L_C(m#ugXybl5OK`!m7;E+UYz;>IAsBK;GW)2q{0!bru#$L%NW-O+| ze9q2u2`$GMr2+f#U1T}?+S99ES6*#%#0=++sTn(#FA5*=svtn*K1M`On0Hho+oPQo zeN_AQTWroNEKP(R6)zeoSZq$D=#E9L3o)tsysX-};$TEqc6w<@(aVO?-ZuH#MCKKgtPr> z28S-InZ}>=4X*A{rt;pm2QOYIr#Q77O*tcl)#pQ%x!0jeI-dGPnGX z0y3!5b4lnBg!@omJ1DmHP*3+x-<Z8- zBFw9Y3Iiw*T>(H8h%$;OWCPPyXnIrXmhozZT_oL?K&y+OQVxBB;w?lQ3o#g)k$mK; zgq|isX*?>Dos5A}+!E4V?0FCJzu{^ss_w-1LGyIrHuOkq5Dhi)h+-X)4ZGn}k66A) z%#&P09AYDdI22~SjL7NipN9STQljTV)9ZXHY3t)^qBgl6i~zeDd>UuYsoE|o+%B7@ zwaR6d^x){-01=t!I7%p}jc_yN^R?zsNg^=l1Zz5xt2N?xI!-%Ewl)tt$hKWeL+bka zyS?K>g5Ui*1?;MgPl_CGhZ{kK#s(umpewQ4sbfC43#*A#Y;6PVQk=ea}5gtgYIOlI~^0`jO+PLIe^qjbgFTDDK(r~ zH(TQPq+j3;Kv0TS19CoY^x1UB#?jHOpQOzzrti^uB=xCzeAka?`^VG11-HqckE}%) zT&g>0Oa1Zpb^e894^lXj7pzsj;>==;s3Y8;x{(O z{PTq8`OWJW>`@!4OeyKHa=eEs{5P`d!q1Ute^I^WJuovvgs}9c3MU_4 zTb=?&c@v%nEI=#S18bLAh zn6`GEwn$zwmxjCxXQJd#Gs?R{ai{@5EU1~HZWYsXXaOE~#BedCn=G7SN@?x!*cIQZ zIhdF?I=Ac~i26uRhzXYG5_r<5M1j%)K@&E^ez+OcY+f$L926&vQ8&b>_&U0jkRYZ? z36V91)*xUV)QY+~7GkT^_urP0sDv)vGU2f6IP2(zTfanP1d(;*oLF>_pv(l-Y}h9= zHAN0engosX!blsxcai9F}@pk~)dY#52G10c5^?;+m&(2~oEP+sCaz##MYjw8&f$ zl{-{|NYqu6@slQ7!ki8bYb6HYquLJ4ONXu$TRzOEM(;00v?|_DNBKlKL@_It*##Lu zlQz;S(!ek%qX=i{xTK<9!|ZkWepK8>8r+hFhbEU^q8J~l5kkhR3|UVdW(-ER(U-c0 zC>0Sgm&2JEjtcR~fD<8Is;3ck3iVkE-u;qkU1D9YbDzoKnQrx)oN6s+IC$wpj zjo?Cp@GavR#4~>38G>BX*+_fJqL&!r0H@_i3}CnY$U>f1a^Lfj5W@PE-uG1v65klz=A__ zlaqFQKw6?UWs2yo+hbM_>Xa|$z+Ry+(iw_{P?!`35q2FBU2kgL6Iw?SX>}z{Sdh0A zlbra?gk-pJj$O9{hM?8yv|u3C3(ZHe^cC$?BJUZ6gZ$2mvjiPXGCA!}@(jAw*t+`F>4F(yi&BAt6F*!aAq8nGtu*u)NG85xWz;=!U* zUoL>RP^`+)U%UY*d0BciA^B6KK>sg_1YrB#$c25)D`N)-Zy(n5&)D@Tp{tIm3^0A<)Y9%NCB6be*yG&M{6jWv^pOwUb2ocSIL0Fyf`g$8;io;eHGl*o4 zB=r_H(OD|-m z)>fUJ|3-Mnmf#PNiF{lTqb_T}=?8g>s4^?U;USe7cciFGktH)m1SIn>flZD%g{d zp%>4=_Z}~(XSY#x5`@@M%>xNBlGA}84fao};O}&Z30L$+xKx4i!>3$C{8nJcg5C}Z zc1&@?a9rX_$}wcu69g7wLb!Z`!J?j5W4`!o9b`fV&M#DmhGWN9wq1*O2=7v#Pl6G{ zjs1{&qRcXNrcZ?=#C-RN2X$RSu;#mjFoK*5a;f=D8$wwo%ac;2#3@6Mr-Vn2c0=C4 zjT>vB_>_banr|_qvZ;j9O0VfA506V7J$t+l~0Nh~LT5 zJO#IxS3au{r8#7kMgB>K&99N}+0SZm(8&MLOeS3`?#j+%jIT!);zZ)d5Jbqn2{XFI zOwXY7jPrRoV~QahM;C}CV=1x)((RIZ&$*o>GeuJ+EvmVG6G}m+nJ9MneU{>IX^IOB z<@z2Vc5yqp!j#DB*jQ`dr68e$hzLZh4tfZWGw9(Y;VxWdv&FLy76ws+^pK5yQV(AAQV&I>0UEH1(zy#CAVpaTk22Naf^BB0MaO!VzY+P(g`*0i z^+i50_ko0AC+0YLWly*&2SH7S)vPb08#bjd>WC^%`WX=AA3?{xDkz*+ElL6;1TRAb z`;E|4>9m=&Y%eA_VS@QRA$?1ar;8ptnmC(3p&$|ECNoOhzSC!2hQ7yGgCtB>ax&lH^O@9jQLt=9Bc(LTx#q@S zvk2Djhk=oD^}NSw$RV?^9@k-yl?JhI;Y29DGu>>4 z5J)U1#e6ZnYs|6tNweAU+iLsk@r!U6JV4!B)5bVBgvA~tjN<^_&Grz_B@T5Mt*GmCX*8W~k5t+nl=Oco?N z$hL%)jqjx7)Sl?TOd{yyZ8VMZxRQ;S1d};DCX_SV3D6Q3{9rSXN1Rz;rP0{dOHWr& zMW!@iK$F#y)2Ai0n4we94MYbzr0`}fbnAAN^J;up%Pkk9V6~v#BpiN;HTLU9W}}D( zMJ(CI`k39a9PG-P2x3mlpEXZSGvQtxd~Z<~8_rqV0i*-|Gb5=`gd4%Cz_OYdIBwqq zlEbdU$``XJW%kToPjy>DtIuPrur}Xm9T@>opkC1b#o|h?v_uwfNQ?xQ#l&yV)03^U zj_Hj^k<9@q0*?mBybxBFN)Fw|@NV69*sx$*S@F^HUItt+XD=w>q><~TWP=D9UaiQ=p z1PaF*vK9YphX}^;9CM6+V?g_IWy%QR%Ru1{in(K6+4r+DiNJZ95=9QdGua_QPhX2q z)!M*_k=ooL;TXm!_zmqIS`LG*97gfdlXD-)8N2Wxn!1?YH3C1crX(m285jVE)>R^D zr7fBMx8uNe`1~QY80Z4|fD-U_*|Ebl(UbE)?|$^CW&3oFes$OHlIaCw_Wt}{>y6&K zUstN-s8g9kCvPfF{0%Z%F`Kh1!BRB^c~tW=4F?5;sstL(-aaa^of#x^OssV7Ex6ps z${xf;KGR}ChK#B8uGDx>+(7ScvK9!LQ6rlMj?Akm<0055;VoMNwGZ5mKw@CxUvLx& zlFe}Yt7d9S}?x823uv}#FNF1z9!Q+XjC9XI+jbv8F;4trC zPQ(5!9$6&$+OW70?IZQ=q}$u@D#pZ7*dncj}osxAx&H0-*CGi?B)h zm8*{szW?O!{OdpXVI$+>R|iq;?D%W`?d$Gtzjl9qy6%qO^y&dWx zIsckcm2$FPg<}lu4W(s4sYqCZYnNB^uAx~idebOK5XF=hExIG0=AK)0$kq`7HbNmJ z$_YoGSs4WUP8rz1t0W*&SqH7F<1flhkWvCis54l4hgH z9VQp4R^O7C@&RLYg`TR5x*8Spcpf~$u!Dz=c&v4PNeNY)U4or*?7k~2lWDM6MKyLp zlz$Nen7YVu2+XYH$Wl#x#F%eD-z$~zd2gGeFHt@Eka%1aA=%4ezCfIe&T`N2?lZK$@iz^ym*hw?KRu};NkiIZws*irbEa&Z}gWG+&wvb`8v?Hr+fQte)yE#Ei;S7b+ed8kf6XcwhEp!GLo=MjJq6K=Ih+&9WixPppaw)E)Tzj zcq4MC!-P5SU$29P>8NU|FuWcY23zh>Th9CAY$KR)tfS_Y$($NnC(#wgeoT6ZtWQ(sXU@=lmBG2*{*mXamDt4to*Oowei zjdbl~z=UzF5X`0fHn-`txman2hG=3~AuOW=hQTFvr70v~U*9o1e|GTvWGi*UMhPN$ zjW-yu6)LGJ=_)wlg!v&uS z`=rAyHnTiCg2=s9gNCGlWdkR5G_ zOE9(N@OpC?*|&S&9h^OX^J@QOyS}YQ)zyxEiNfETpU^&TW-;mHUjG@MIr;JA#nCtS zcCyEh?W>*aHyQU5qn(l%rwI6)0Xh*dZCeb?VhBvGz8~R$4bK3yzxfIMfNd3ekl_m`b? z;q@;qMwzA5TV0A`F@pb*Y-Touvp28)&qwCvvzYo$uS z6516*SSfXgjESux!&2$JsqfIZ8B_fHwx}cg&V05Ic0?&*QHdEdU_R9!N3GK!s8|$? z;QF<~5hz?&kSSEqrYZn>K!v}1;iLJCZJCgjQUxC}|L9f%2l6IUW#~PrV%tEBhUfZx zz9r+KsieCn_Dv`q%t$}NcG!|f+EUCqBcXP&O#ik0{hnAem*<;YH64+S3d=XVLwwNR zyt07h4WQec3p9%Ov7||(s094E;^zA9@Y#U~bd!4F>T}Bh5=Ys)GRG6g2mkTrkYL7# zmC&7e5IYy)m~+&W4jJA$g*uyrJpg=_$U?ijyIT=`v9heOqL^rDq%ELPHFfM~u{NT=cqFe=+z6r}$W}x# z&~vZtTd|{t#}%OlSBugrbBn{8bA~2YHPaQB%7Uz<&_0Js1&0%xr*bp;Mgc^HNGb#< z83^;+ktGhmj8~2+mQJF!;ewen`by%+!oBsuD%~zh&Y-7!g|`+Cgc%3&D>`_1Q%vrY z7zsK~+j=OBTJ>Cv#ZIqLJhl-yn8a0w-iFfO|h+832H5jEU&7mW7H&AIt%bFlFrGiOe5QeuHajZ({ z+@D-S^QDBFJCey55hp0lsSU{prjMmdBITq5Z%Nze43bOkq2N;7ROEO^uarDV5y*Dx z)bbM7Ss^w`=ofRC>9GhU619rD;Da;{4Yw_)o>IB!=7HT@gW-IO;M`xnKS2S7D#7WiOE5&ql~J^OWOh4&GP81wTY) z+36_15>3`JqQhkyapM<3gC?(lYfrK$;xGsem$d9~+j5Z{@)_Y;NZ`&ZRtoXtH?!&n zz!F1FRiu!SY9MphrG=p_61MbIQ3{NWD|vO^qL&4Xlk;pi?*6Y5n~d(QdzCz_A{oJ3wr#H+n` zU1(UvL2eXWO-GJxVq$4ENEtj4=njR{g1e;;@9kk0jBQ#lwrB4_$L`p5ow1O*q7% zhMo>7(FGwsVfp5xCXk~ReD)!lTKriG;%Px34ZozFaPX-JY^OWaYdmJ(Y(-2F^) zjyF0J>`8|pTMP|N=(UAZpw8|%9Q5lj8DwVTMZ`fbZjsl#<8TJmdD#`3%CL+A{t4#6 zC=>B)DR?5KS_P&&$)1MWONqIHP$zG%IF)dG>$@g-EReYU?@ltZm4QQQDzPL=+u?ta zOVs8Zwp((i9#T*`%t82AQ^ZfmVmi(l@gU6`-{^}B!Wpg53}p5Wo*yMGCw7n0QVfrg z`M%M&nT>BdR}NT%90bjNqT*dOddFH!n8{^6K!RO#P)8imBwjjA$_pGwN)NI#Rh7S>tDoszr^o4*PgT zwNrwSgD_XlOCmbaV~BxjHmx|dA0$qsQSq!Sq{8Gu5Jq^_3#zjvmkhq=AQvteMPf>^ zzdhUYL5u=rcrrm`GuSj4o^5qCYm!zEO)Bbf`!Mv_(NSutObQ~Bi>SnnCPn%L#b1U_ z=-6g27qe-g$l?#TjCW7t0|B01mto>IqFx3`1ThP!>1~lyLL9mdD=x(q9T6#gUc)9* zUS>>EbI2FrRuVmMmS1*@A#X*Z*u%?*;Zl>a;}zwdiN-JWXz1Rs{`qSnw&Ck=43*O` zNP`qGZ$QeAC1ID%!+!;q?`?!+sz*8OyM&Ao#@|=jc*(`&Uh)g1#SGY0SO~I$iGUZy zRqjIK_iwKziv){KAwzBuUqs8H^>LxvSqKuXJJqnU&r$iPuR2R9G zk7slh3ULj0cka0AhSgS~Vk@;atSNIPK~_RHiwW2j-fCF{+fsaIgIvIKBuuG;HrAoc zSjd!eSyAYdru})ztMB z7!jpn5b<&IsIm6R1x_hf%2MDohVycC+wT`qa-l?*+lyH_Ov}=GAeQSuU%);|G#AZJ z@l4TRN(m@h;hMAK9D?nt)!`2GS^DHmvZV;s@99SkZQW7?na#j z4FvZ(AHv>QQZ#C+7J$dWqr?%cl&^hAY8FMWDt?b-^w4pQ5#M>VWhOc>UkG;in9K#Z z8WPV&x|$SU2w0FP2>S5@6a|ZlQ_&bOS%TRvm8QSay_W;c@=t}n<*=x11E9T8@m?&R zev`yB6b?mkNnu-)B#7;0xU4*oII}R67eVp4&A!h$C;i)eHVRvN5(wag$@y_$5_vJA zfWk{MISVlk*K>d*N?4pLFYLjnO0Zx8!Iquxw<&39Fi)EHEeXW$3Z;!i@KL+&ZvZAC zX0C>`$8npb!g9fR6oBt9aO^Q6PT^|Nu2}p|;-2aq*QM0k5=^+fwqQst#iFR?y@-U~ zF-2y7HCcl6NHUbrMxTX|F~XGW{@UQA>eP4H@fUc(tKx^#oyRg5>W7XeO$)~WQ4<_8 zN3#bfrQ*{Rvq~{BwRr4h5w_IgKnMb;JbHmYX#SVrIwcqLkdsrfp!`?@JFy<*H>LD^ z)``iP`CjacL7&74&3k7h6(VgvVfUmX zzy#S1T&3ZQdU&~3G1(575hG9$I5rgTxEMD;t9onDR$r)u~nXCx0BVnwS(O z@qQFsKc*~Fj$3#=A_*Au1_`|ea#yp#W&4oJsE6z97L>`q$Z=#`5J8zRJDNkN zs^*wPo^W>vGKPh@Hxo90&Tm;Tco{Clh_;lDZBR)$X9bqbFmhG^XsH5W3-k^>5eruY zFqda{h}61mr4=;A(OAs%~D7V9i2oH>OuCx0cwm z-Zf&!jUg46XlTALl2#|&BEe$H_9O;8Z&YyvZ-EKUXdQGF{@@)K5bZhID*4YM0chZ1 zQjeo%Ia;q%c_nO61iLhZhB{K2pvV1isYJE^)5QkTC8}kI&)&Q`{DB2Jp;A3nVL4-b z!d8ed&^CDOq2!PXuNBLaxN_#zl^B%iniJIZWuQ=iqz6u%gyLV$1r+StDxAe{WSx+O-!Z{lSb_HG@de~vUk1#Zp-xMt|C*tfZ(nBX*j9Ir*Eg)8#*${k8FWsDNPsExr%l8wl}lMN*5g-7R|*7lk+TX%s^jlQ0j4CK|^C%*PF*2=Qvz z;ucp|e5W;@Tq5Jx`r!iASjA2Z7pjp|%J8*JZ7hFX-;OVUKE@KVAohUdOVrfk>`y^< zAqx`cE78)BX}}mwf@XSJ{J_fUa403*d6EQ>@;<70Nnj_lz{9Yfr}^!un)Mhx2tBB| zhHGuc;$Fnfki;e^$-sR;eH#N+i^SC%Jdr0AZJIQraPhFFbXPr&D?9eWxp?zt|Fr`l zhT`R~!v=-97sZURqw?Wj7uYd2G09qAu^Keg-`Id;0k<1{O(+nzrblgT`TZrRUTQjt zB^BE&e?*MlQ8ccrt;Qe<`HuA1$bjQ*s9YC|s|;n-ne6oY*=Je!Z-3*EHu6#Sc6RaQ zeX?)d*DG*8;UoPoH%Nrf`hz<(ee_@#|96+Bk}tGz@7}!+==oPKE7<9?>|yrccaOgO z{iDwx5aIkCrnbJHU!8`Ujq5@0cb|QhiHl2- za1KL9a#&M_>yzf_T;h!ncE9}6Oeq^l;+{PoWTsNM!pZ60@oE3?)$^nNv%};5!K>5b zAK^#Qlk+Is*5}A}AV2$JY<9H_8+L?Ps^H+&v-S%%5`2qC+#wy}SbtF`92Z(*{} zg0eS+d^Gq|G5NVnkVv)8ol=V0%xe+TUhtR_+7K;D8xD3bnWC8oMG}u_fpk45jvH?kVL zLD;wmos0>~ywnI&K@$arh9U1TbI<_>6|x*CE*4cnjxW`(#Ay`tmf1VTcx947@43Th z>0Qmy8rX~rX4nv1P8n~+em88uT0`q>rnm5bx~b)YJE5>M%%IrD$JqIdB~mBV4dS~P zV4iTOXwI#*C<(m_Wv&Hl2e3#Vw+8d@bv^RXyMDW1K+u|BDwp@%NV$|xV{LR@H~J15 zL!!{ckleY)S}1* zN^s9uY=skzH`2H;&dOo*;2Dv4u=|-}0!mt7TPYe$Y*HWjKBov928wi8l0$P$SfZ;N6|`w-;9%469ZgrWpN5*b!{ zf_-LV#YW#8lu8+23oMoyJWlst^s?tCuUSoW_)t3zM3?Dgl($v9p5@bWh#<(C7fi+# zEnjI8m{ML&3uL4)f#e}k1QkG_qB;X;6e61;oz!*hl4^wTntbJN6?J1JV1VYNd+hA7VfGwFx+)>;B4^CVSkk&PXN1ad5)R$yp zst460kWZ?%gs3twt%?x=VekW_9ueqrN`#C~a8yi0Tae0_myEehgBp^Ik^Q{5o+NVc z{->X+YC%4Zh6c!XW&{Jus@LWZ4M>c9y>@5CK!n2CTb- z%IgiGwc>LEpJ*?TeZ@|Io*ooq;$7ag&mc+Ou^L`^T#Z;je>wPu@C~7gv7sOeJ4z4s zvlm+TkfSH&nsdpzQ@pj%vsq-5R6NL2oPoHXs9Gj2^_-%IJYA$5U4-TG^?_3uh*wp9 z9hN(AF~kC>lDLs1a@pgSjjQQX-5F0=w*74Z%RWe1IT1mK_8F_lMo%fBDhIbKVEsZ8`CT-{*qp$nKDyaW@Za)*l=kra4-awO4tw4k-)#B z;|cy2cDvUlm;zjn?DT>W!dqvIxI#&IUR=x;WOtum&k%M(F-a_!-nAH42hWaty~VLz z^Nl3_Ig<8FO1sq8oNWpjCjTqNohzAx8#~a4FzTm2Mynkd zGaUj-=Q8))Fp&03!MF>rD2HrS9?TY(bE$9@*!l>gW{gu5C>@ zmyCvQ#E|6yI-%q!J2n=16HE$aL?xztO)Rc3)kB(RScOLNSI-&MDTZ}Y79 zYaZJ5lm@6O+c3b|R?m|4N*qHh-SfGux#XT?{Sk!7M&BRVyjI8BvZy61u3@a50%eaGqo@Px{Y}PTUe| z(iTw<$(m)x2Pd()bkx&hAzpQ?7A^)EK@(#m9Tp`*c2Qpv{)koBEOPW zTEk1<6_RagtX13(Ov!Oym6IgtPFr$A=#!H-Pft$6Rf1V5bQ%3w;-u=m9G@>%26_Xh`)x&};h%`Np z0c)RYf1Mz2#nd&60dqq881<*?uyXZf?jSYz68tStdG@z?kIt_34G~{cQWWcE*;PU) zOFq5`!>tx@eZU1i75tBI!1zgYKP#^2c8P2sk4vgoK>ei5E>;@2+=M1|OyGVE3yV@C z)ayoH&EH6$UAzxGpSXJrag+G2G@eKIK&V-~)~VU6QLb!PY6*BwVG?oZL%br%Qfm5{ zPZ5g6MC+LUL&BNF%W6Cbr48jHot%`aM#$GiMWG-QYy#_5qUi9w#OekmXI?_kMs#m6 z{PhlYp_&CQt-H{GLz1X3y=am4YA6f*F%r!d89oA6$Y&ktDdDou7@+MMNm+E3CM_0T zGt~Jcymo-B6V#Ep<=n$7lobIjzA0i3OzDeSkdL5el277n$gaqX4|QZA0c7lb^TH$v zdrh|%2-C~rR#FR`SI05K9=N8+1Zp^Ofae`>=n>`WGZ;?bX^)|Sl+Kw85d5t8YgG<7 zw`O|}B<+x+5(t8oGr{2>!PO!S^DV(D6!~?JG2-r8j<}t)A`$*hf3Re7xHL@YjrlK0 zR!gJDjaEjBH(C8cI2p1Ol4x;PIGJy?Ozb>Cgt5q3Z`|-N>D7DhM9W&VERmz1}w)fpP?Y&RGlLsQC!IFubG#hJu^>%ajjep?v(VJJ#p6ExTk~i8N%Q0VqZcna7AJmTP0yab z_!EsX-SX4pH~XiJZ~Y@j`+quF`hEX+R|2%rtxj6ni*Zl1J!*ES$fb>__ zZt3Up(3@`h_ohMr-k|eWZ@Tt1{Z1bE?)lO2pW1EhV{P{OII!sF9S!3b()9bi!_&{( z4eeuVcAOq+64mrWZF6+|EL?!YZw_8PJKRf~@28*36F>fVdhkQow<8D??IXe8%L8jO z5LYQx0wR#Y-!xRNwzih2Ud#L6SYCX`DP&eld%~LZMZsYn9s{$>v1B;orrAqS=|)%P zz4KEw>TLL*4%oZhkA0lIav%NptWc}=M?L=050{q)&-qa=t_Pd~crObY(DOraD8sUA&qU$1FY0%KK;#BtSV>t@^Gw&9mXU`Kq6{fDaI^rHealu6^p#kj0O>x6 zuOz^v+o`}aA?JRka1CkE#C4EiE=t>@jd121Qmc46!x*^MBvPh*W& zfRjR(ce0{`{rx*^0f$3<$7!@5^x)FX`=yVgFv|xVy^ngFB3b9HtHWKG3yO=TEa_`y z7eV&@CFfu3)vWGg^$33GpwJ&Mf**dk!yHyUewPXS!pB$5pTI)bFTlz!T!E7nJ+175 z!W-6)V#Ot<4%X7KwH>UZV{1EDN5|H7u#S$c>Od-Rtr@}6!z7QNJ=;57!O_+}F1qV7 zYOw6_KfOG7c?N6ps_`%9q*ADA-Q-st!WRd>h!lj!UmQODXi^X!mx4=Y$45t}AG&_w z)kjbNeck*|=Cj4Xa0~DH6d~Ts%0X+%@AUABE&Juq-+^>>Fz)~62Uj1mS7&$WV%avo zIyiVn#=vh5pRJ;`OV?~InO;8w@j0F$<$t4QsrgI1DINSOT)^N7<9jxJO>pNJ(*;aK> zP0!Zv;>sQT;p{H*u8iTNm{GMSd-Q-@uV<_8{*p)ULNJy*`ug}_?c<$~{(+c3gX!|D(t^FIyrcDczpKV(F!WRoW@gl$9idc zUqcl4wWc7dkgH~Kb{Ese@-aO7=FJ_1sTI#39v{3~CIodo|1FHS^0bRuxEq%wvJ*Bs zKK|l}!W6o;)e@GYW(qB)j!vqY$K z5f&>(pbsajjz{^}oPGNd=N8Ya1$pW7Y5sG20DN-pHh_+&k6s_IJa=n`AGZGGtJ4)n zcg^!IETg-J)z>!m5rZ_^{dBSoJWA0ND-Yh9;lCoXwS4Kh ze@=eNk3F{08NH;3rsfr&B8T*{*DiaC{L(9gk9KY@d|M@bZhAvE)!kWJ9W|p8*KAyBny4->e~HvK{bfR5405~U{Y@WlMy7q}+SldJzvS5Z7_vKUU2^bF zzB~Tnmna+IqTb=!EPeZrCwI7YE1qtJl&#b?lBe4-U0uUya=O4!nLI6hqU))}FFT-b zUhe%OjgX%I;%p^%TK)XVHy>u*PZs*!Wl;S;Wb%!-lPY+oiv0&u)SnaxOa;q$PiCxY;oLb^O$oAH-tg%TA_*`sxL))Z^buY>JoE2z7 zxKt%2O=;1IDPh1eitFC~*;cnvZEyVO z*f^T{n4;rv);MA5XPJM7o+gH}dcp_qxnP+gv+=`E4}t=-#y3Nb5>016nsH$!u{rMT ze;ag|z11GQ9gnVa z8osa^uI?ea26tJcMpRAA!nwm5bv?@&7$2*Cav!HhM=LMFs`sx`1N7NcLfb!j`I@YT z=ws>Q2Ug#^x#VoQ-Fx%H*$NrwaAKa>Bv|-k?7bSW`{rqQ;c^>VhhG-Co@@C*_uY+Y zp({G*esrw}#}i)dn7IqxS=+}Q=D)TNT8K4$oD$4j$3J9qA%449U6!_)KfuvTT+-YZaT9bh7l>H>=Jb|Fnv{non-MXK49~{rHMx z>x2JT`T7n4%+e57J{ZZ;vtkflp1XnjJlo}+tn6W}D8^Io5XX=P{&A#+v%x<~^t43s z4;MXMn*K+b@nUBBs&_Ac^;-A$npejx^A9${>+>J$!qex;`};8#NX}?Jc)9;_)nQ-v z{Kxz7I+IjeeXV=`<6Uw3{KvZD8u^AFxBqa$e4G=+rzU>%{C|NHrh((Iq?698cejv< zWsk1DaLXT!;13`7=vtHU@<)S0alCiDLN#xQw<(guvd6mL=Kv!SLp-oCVf=37uk)SaYyMDAb4-8!fDs?QTKXdQ<8+?8$i7Q<C?6Z;cL#4MD;j)~qjYoVTpzUGQRXHg9qpx4QIide8>tgw%6i%|z z9JTz>lW^Hrn;SYGJ$&`2b=k9Fk!lvpE#6fgzEfa$=gIhI_`L6;P_26Xs(7R2k9yRY z4ZHGmQ=;oU-@!w?bj0ffvlWj5zUHII2H_j5w>K`aH5!i9YJqb3!{H9T zd9iZfD;_3ThL19l9z8uddU3Ea|C^Rekk5F{^icu;`Z#rsvv<~RlFLmn(43VIbzAx( z_Roh~2^mmqt)0Fr+Rm`ZRzBVRD1nB2+|n|b(np>D6o+Y97lH&pF0sq{H%KdO;4;% zSzGSgs>jUcd zs*cw5kwW1v+oUd`z5^AuN|Mx(l8i@ z7koFFujBExR)p1$uho=SKhB`GA3gZBY|E~^CI>Zzj!_~$EYfLjlE@_BKQ zJ^V8J?DI#Teevjv-&6JPhs&yebM5ae`^~Sj`xoWpetjMOpue+ks6<*uwOb0VQ&~e? z=nso2io|&ISriT83f&458CLw))C(!HDCe7Noo#?ia=|j4fUC^%;4^-GSMh2pT}`#{ z{_th^-&gAjSchKF69VX6eQhoyNmaY)d9B&Sbw-zUiG`=-!pZsHX}LcC-*UOSPTLoM z=zaNx)S3^gNq@%m3}cW|Ye{*ncTt+o6fEdT`1K_)XP#uFIrFa@pJqU|ee%iQJnhufJ9uShimEeq-MCE|N%6j%2kPhsLFpj8#YQs-()ynarM!kEkTsO}a6RVz%tF9#xs0mfLXF5`I_2GI><@Knu zV)tqnuYR(hZHKnumfVs7Ylq$y-i|WVo1grh2lZ)q(?2$|C-g>K-HD9$$^K(16-HGv z`Gd#VWf`XIdk8O)=d-j2y!|njoO=i#(4Xi5>qeUdDfBwa-&N(X&W=u~iqe?Yi>{HB zx8~{(f)+%;nFLyllJQirIm>3_tUtR%cQmYfu45)9pMM#)?)Q2i@49siBGk2E+1+*v z-L2oT)w}hZ?0NYfY8r(oo}BD`b8tebS5zOT4&;@J_E9ZBE}#o=xDm=)5_wdXLl{V5 zfLp&thp(zhf1mo>C&fYAT!i_(`fb{me%jd~ z7Q!ah>=57b>|BTV6rcUiJ<;9V^LM>3Kl{SuHGvr>#>~YHiSZ1kQ#+0Qt6tVW>Se`z zu!{^oYQ~kpsad6w)R{c^Wb2dt*RQir6!~{czTw!G@a^CC_xppvKS&(@L|$%ypjy@5%(RPoY5N4b7i_Hidyv=Na+J*b@(_r&4 zGmZznhrQ2t0>!_Y71L~x{m}}5@}7e){DumQ&LEq8M`c`dq`UJYRM@!A`b96RsiNl9 zb^det^&l^&yR*goiWJmhxY$KEHjMrxlYulxQBw`c`~AuN_mlfNsP~ihsECw(`Pt{a zFN0WTlF|PS8~w@O(Ygo^{NtlH{nr_}vT7M=Smr0xYVhuia5K*a;aB>a&IZIae%%xP zqq_Jj{Zaj2d2G7q#h0J|K8V|&M|u0pF9HGi(w(cI(o?XSlok$*ia_|NU~Zt8kZG%{ z%`lG&r*U!s+MT&3@WEM;BY4Y;FC0 zOO8uEzdn2U#TK~1*7;AuUN+qx`>}2h^61kUu=eLc)@ZAC1uajGSHX+uQ64UzvgoTxi-u0v7mhT{3P`Bclsy$)ju||2qz!ax77Nm4TPPFd=!hkxjO^~HmgveYkMx|Q{{3=N&-2lU9Vf?!KV0iQcbE!@t#njf}%^ri3dWeF1lC@E}9R|Da1qornr#3 z>*8uwEvDIKc;NDK6MgMApBL&Fjz@T|TGXRkag)L54?HWFK<&ZZ8s~8-Rm`)eC(p<_ z7j~c|YYx2M3LPfA3>F}wNxn_gu$R%giWD#)1sP&rMbCg zCs<%)Fs@|vD6g;CvP{p1Q5ED2tMwKP^03Qxpf^K1`QrY6?b83>|1X@?d;f*wf&(hQ z%g6qscp&8iI$rm7lnQ_j=%xBic69Rm0bDL8`$yT)v(xPJ-OsY?uq=XGR^3dbGyqLd z4~s0Rtq$>En%$K&(1sWFFsla@{iPqd#alrDSge$t{#9(I--W}VulkpNaoy1mj61`6 zIk_JnIL-G0Lz0KWe#>T6V~ke`v~-OM8nl=Ko3bmcK~l zjQ@|)uA{WS$(~ho%jk$Z>Vk6_y3XoAq6$)se&xeUK41uRM}N@}x>hCds4ygF0{GqMf9U=0i?3V&6R9}mZMn`0({<@;HCwp4JXSFP~O`z%t)cAOzV+Zf512`DZ;J1}4Z+bvaR+z!hf&BNGN@$iIwkd+3B(g~xd-uFI?I z>;mM6!y<@1pfYy0n2ac(@1_W}s4lNCKG{9c=*T4>{Iv7rr|sSF&;6esJo)L9zlZ;B{q%6_ANQx5*-z-~kAK86 zU_8tX2jgkhud`3^(HVwlEgZLdr0fi5^s8`{|L|EnqaV2FpK{PrptGY^+&A^|ci=i5njLw!uR=vO|Ys6nYi9>{+=4lJ^lQ3wWI zk{&j!xV$U}r9|Qdv8w9Pd9IR?K}BqM>(`yiJy#N_Y1loTlcr9pRKL?SDURb|Hn^j zZx3A`+#k9?a)WS%tRkDOGS zKt?82Ujmr%dsxT?0x@F@W-<8Z^{Tx8!=p*{7x|a}NkdFO(J`LxoxVBw$Y|Lxw(DXv zMgRU6`IrCMN!I=+EJ1y?pu7_bK(X$KbpQU#uw`HV&Wk|*-mM3M3LzY8DyKHBB$`(J;3|F>V?f6Tvq{agO+>Zecc|Mu$sR`$mj4n-t6``3T{ z>8E`bhG-z~rr}fiy&&fk{r+iI|MqKa+}FST1poe)EE(ZLj<^b+@-OzW1Ypq@@~eII z!w>eA{2IQ(8=mVI&yy!8$T56K|L8{&))hXL-|UOSr}#Ad6F%x(y)S=+2oaTT1SN@h-^B2H9dlIiE{_byT>IfwEdJ&|V`})!5Ki0nFC;nPg zX!H|=7_#&Dx4<)E`qTSQr0Hh%>nGX!-Cbcozs}flH$~v=X0@18qdz|i%MnIz1bVhxL=7)!i|jiDF2R!zJC|PCTF-0edR&>=_xIaUZ$WMRA2j&tbDqPp5nUiHA&&Uh zB-po`CSy-m=Q59jpag=;I}A3lv%96;Ox}~Fs}2RHtM^T5?_SV&)W1Vwm{;~Bi{k0^ z`{~TcSoUf5;5@dVbNLA`eEg7(V0zl@{jZJs`_rf2#)QD)&%|J$Mx(;K>j7H8KJ9uR2bK%7A}M|Y&t1ER0yXBL3$D}B*zJD0tfoFKbSS2Gxt{( z*N6|#{ZD+So6^m4R|+hHrgWDCcilJucn#B8ItIJu-?RudyNC4go|%okaWVWc(VDR{OKpyO+RVOVl%y^(!O^$0|Lx;gP7h-3QrD zj@#z{Up@N#_XfVXX7_j}6ZWeuN_R|NuU;RGx!nxYL_fQ3l=HAb0P`wV*ro@eoC?%*el5ivmG)N@@5A#0#&9qZzt)&BH9Pcsb3vwH76%bdGOZIr2 z-vW7J4yH;59a_dXz$~BABJZ;qu=%5> zMbO&HYL-6R{1zu-Z)833$iJ7Eiv7;X2eM3GQZ&X>QsmzRxhR~?eIB>q6k(@ZkL$Pe zeDcPZ`6R#Mg1@682wHXWD7{L)pvS0|^&QVpJU4ufI`_m*6`#1IDE9h&Uiq^TOJ{fY zklhfv69s_GiwWJF<8p8vzMvMP(U>Z22acyJSux@`v#DZuBE0Z2^iFZzxUu?`Ek+yjpVC*l3;RWB* zmK2u-#Yl%EF(;f02&xzkt@n8Lpa(5aM0GV*a= zj;N(yrm#!5$%5hx&gACH0qDL(;W&=ENj%F{zrQQjSwIUme_YudUCPXsuZCrDGOVA9$@gxGZm=u!%{40d^)5YnI!+l19 z_-fL}SodiqlmH*o@t7gRuEK)M%3_|+Zc_rj9}W+M7CP-My1zFd@d7Nxx4Yw(bdJxq zBUpVOllEsGXdJ6wP zT+lE=Kez>uIl~nQyZGxY+djghpnFQUY@|j+cWfL&C}60~vv>K`f{wtT!XnVklFJiB zMqsD1{K`Xb0XBZ^k8Td&c zWch@U6!CUzt>d7Ow^2o+cOW_ioN;h3(O?u*Xf8@4xh6-q31=II1t~|h&JNRgXEI

03RARg{_X^X{8aB z6Z}EKdCDzr`3#=w3>)RDO%2~&^OX5F?eU7+-0?!L2}EKa)`^-afvllfF%GiBY$tBh(X2;zMKr%Ty(Z`|T`r^pK6UI74W}CBw_7!`hQb|~)i`w;73@}v2u40E{k8(i!#~`gFr3wl1f$Q(c7Z9=xsZDxfs^9g85#c;p&xxSTPs<9vbR(6ZA_CI>tT zu|W;)b&ZVp!OlH4O(((fhJNF~|J*@D0t8E3JaZzZ27 zCCQ1J!4mTnYPFndejD9Qemkx3RR#JPnvo7o?Ej+Qzw~pvK~B?U^X65v@a`ZtjjG#% zR1oSK1TTjSILga$G5a?@6Ju-_=i7#L2=_)w0nR6K)~^Cd`*mXTB6*f5e9b9|S2TTD z=rBMKo{DJ;P1%fXYVdL+WoyMijV9Y6Rm;mg^ak3bOK)I`NXezF^w1&Owz zL6DaiDm`1s!z{?SL#HmBb(PReoEHK=E0Dp>hj32P0$mKHbJ_{O@{L$g_ap~w2XR5B zC^T(IS16p=9i!TL{gxJm6WHm(+*Lwo8Y$F-o|=A5bXaEbNNgF)EzTcq!(dQ-QAq2W z;Gk()#UMr}OI#bAua0{g_|Xurr1kWoYPU&aU-Fe9Y_-f0$+ryo!+aCMpOI*`Y;Yy- z0~T0Y#tr^<5~MEOj6fN4lqOA~cf$4pEr8hQfS*%=xR%jFH`~9n z80pr)4oP#eatx9a#V_bs!y}C1u(gJ3%_&XU@_X#aV360qHW%*{kB9Z~Xava^>{>*5 zy7O703kMMU~uq~G%40VsjOcM<6{2)0-$zalpGlB9TLi?CBBD7pB_XzXqDW?DgV(HJI+YRPI?P;T8jef+lHN!x zz+PA{rsO%V{elT!<=t(Z80O){7gP`K`1oM|bPHbW;<6;Ed|MqO zI4firkS_%D46qPLQl>bF*J`GJ+b|7~S@B9tdg#X9P7>Ob4V8&41V=Yl`X=X;f&{3< z1T=!cXtz<>;5OL@$x$Gi0SU`Ha)5Buhp-`4)oesY9=W=g?kI+VPDeQ)J>>pT8TgUV zD&j#bkj$$&_B6_S^pcBW9=0y5!?u?Z>1e(yv8vL$tlq&mAJn@$BCBD56A~xvCg$$2 z(0pVqqL8UCODKDv zZcw~#Wb71cVwl7Xry1)NU$KjG%zV~xl3-tR{gjg^LNo;x-dZ|kR9=qq;8|;N<}5a) z(ZMGBTTiUD4O(iRpPaq9MIs7m9~db2qEJ7ui*Wf6Opwxr7UgJ|Xw!@p!0MayLQ6fb zsu8}gx$HUd8jL=M? z6lQ@<@@+DA(o1Tllslq{6Wj+>)+>tj1t%%yaP>>- zK{#Y5WGRio0VLFIkaH;T@aiqcOo+>Y4yuz(+}Qab#|e}y1X-`V(;P&A&<3$X3*#s` z!s!u73&J$$0oVsGY-fjFlhEBJnm|Tg*a+#yRn?q!Y-+x2_kxt%9A1jNCx{SoDdRIF z_dr6KR3I93*5wV3z_${b}?XqZPflq0eR8Vr`tUA=3ykhZ#CF+Nkyz*~5s^TsrFk z42;aLUA~3X(zQGyto%j4gnY$ibC?*m4+=P5V(g4x1__y7Sn+C0ia& z2fLt>m#ChG5T|RDzlG@Cb6x@v-$_`SdAv$-6xa{WDwBvG+GSx8wtvtY1|ULm&MQ*P zEQCRgo4_m+rb>j~gFR_y%CBvsSP1c(QFd4#iC7gie5ivS0Sq@E&!5d@fQ^95u2iJO&^96~z z8x29b(KsSDZc=+Ds3!A8z0T&*jJmu>WHO)l=opObk~f!h6SB@{lYBM{6qKwqiwTr| zrmtAHd@Sdl+Ddp{zzk* zWKF>Z_F-dzN66oIB~B^?apd!4$Vn8p(HqF8PE2b_1oK@PM2CBZ#c2!1H=fb-?<9_z zJ4N`f`?0ll?wf+Fq8Ac^YBI0{d28J1F5MeA!L5DhNVHsMxP}QjoSs=WmTLDsRgz=% zO0%B!L@%c|M^nEU`00dqyMa!M(A&Hmv?EesbC8vlIXF@NUiLy?)A=NSduwKTJaRzu z>2A;DZk*5YzI5Un>|`R(iO#p#$w{(q-D|}C9I<|TN(P$tNboU2SSaMusxk7iA!_kW z-F7x*YQYWfl)WFoS^#gYggcVFbk}%Z+Z8+Gw%T%{aPQe8x=e%kJ<{5 zQ_GB0NhSM@Sqkq3qIfSG=JT9QEQ?<`VVL6HH+Lf^;qV7C zd9Zb!xD~s`#D^A1>KhAkok<)Si|%s8sHfqqno>BRi~Z{{cfB?FE{Kkll!1A=5W#zK z(S$7#Cmg^R#VKl^J^0=4?s41^X?$E0nc@RSg>(Kz14RtV?c}_4Ot0G=Tz(^Z z$g@kuddE9N6YHrjg8rou0BJ(xDh@He#Ab^z!+-CNRF?fa-ObIgo^)!eX&@Xy6Wtwb z(qW+@0&~1S992D|^&&#*cC9j&H!Ror7}tn1P~eE8KS(bw3gNxH?hw6xE@l+s%pJw% zJ~@c4(3stTG@*;o;4PzL6|={h;V2t{Ljru@S{s%>OVCv|t!|iVJnXqwk#<8mGxZXk zOZ>2opni*kgHrW>Xbd92h7G4Lg=jCvd~QQ;u&z?La!g>76Cb)Ei*F+7 zR}<%U*PDTI)};N{B4=Zyguu{~J48#N5;CSJha-(+gN3$uKc#%Ra~kayN6F1&+VC7< zc5=>nAvwMg{$qNEO%!7I#cV_Zzbxj1>llcJhuLm{_wv^qy(pKAdf;&+CJ8&)*Z`)~ zftG?k1^PoljGCmO?sc+Phvstxzv8|#=g1|uB7H2|uGF7F1in@oqPEe~6%I1UPO6t; zwJyl)=Y=!Q=wnxW<-gfLP!uV@qpF(jT1+I6h2~mxD?Ia-glkJ|p?prhN;pspl4ReN zGsGilB(+eT3Fnpg!BEVZ<79+f9d2C^ZqA5XV#9}pgix~0tTw`&SkeT!r!Rs2IC6^# zX8>}cnZ%*ZLHc$FIp^}C@WMZ5_}C^8tnGr+_ZH$g{$7T-0Og1I_8vm zveVc%LvORgDWz;8k}3G)I!B*g*eK9*l!9KcoBk+J#E}yt;j+G{2V^RT1kw;zLO0tI zyv}UF!A((g&Uo6BV9=m)-6AIOGJ9JDs;ry2lf;PDY}LSa#0(#p#?51X8!3s}<)E2G zyAX>jB?m6@cy6)Epnb#e8Q6xifDm4KbMmxIrx=o|(a}^82SbL)KyrNKuVztF#ti9Z z`G`dcFx}{-R#zESqe0ZfM4U|L{Lq%2bBXq#&vRHgx6I!8m``nVd}eP>zHxmxv8R;k z9bsgo336ac9QUj0CLiXvwRbd2I1S5DmJzuw&PkyOz;Vy84K_pE zVor3s|Dv2M-W!u8haw|N6Gab--XJ1>^n8e*h7g@!)WiGS@$U83M&BoCoZIJ&Fkh<) zn-<@~t1_|kET)nZwt-+nb@Qv!L&wLaY+GrzLyVXpg4rF4YmNVu5Q}Tu`7kE%^!j z=%d_h^$4bBfYN>peV4DfJI&G7gg#Iuy``w`AaxcbEoy^3+G@BVLnEonVuLGeI5-^M zc*<)yuDr*T5?rwLaRY}(Ge)*LQ_;Cy`pKBBw z*gG|8PlhGLX+9JG(*V^aXfH?-|7@eL&uDXr+Cr0jIz?U#BaOs?1)eepwB7S6pZ(rQ zC+zVlMi1wwFJC`9Jl^slaT_r#?J=7ha~CETgW`H7L}~=)Ffxz^LAf7z+tyvpdETPI zHV!rqnGw$$L6)05)X?NUU25bI){f;G$#ao{2g!;OC6Q6ekp;KLOox@4AYklZfhML4 zh7FvPBaH06UVI?p62w&Pc|Z~O6q!RZ<%amfD<|EC^ID89ou^q{8mgN^rHpl@_|}Z# zO4^&LAxH%WNG9reRdL20^+jBnqPSEb;Z^Cep_fxxZz^x9Ad!(eBZDc0lFU3C#5uM@ z#HGfBBZX5in=5r8_#C{LdLo%zg7n0}sLycxBgcDH8tWmMT|jHo@opfg_yV*O619?i z%F3<@UzyE{2^3brgxWFg0laoicsBh~xHL2?&o(oGd-FP1D05E=!p&*7UO`d8qT zLPK*34#=Xs?7T!YT?FX}36{{L4aq8fETTP~NeqTUyRItZ0JN3q_z#++vj`s8swB~> zpePPHvLNcUodZ%sHY`FM#E^IMq6kVaBoJ)n`Pmlpom*`S)3$iM)FnyAqRHy>hOjj< zJ|-}ijnuH1PSf@tJV6AcoBw~@uWS%RH09sOo6qcMHGKl~uEzq1M)qgiC9g9iIH z26_14ij$)^$NL9;LNxBb+IxBMh(ZTn9X-lk9-N%)eRHt#J*<3mEBEbpZ}eMl7hL;C zcN<0O8_p*_K-*IW=xm*{)%UIH7uQ|{vrckz7sEsujnAod0ytv?M;7jT(>@_FlBKhp zCgtowPFczU6?Kwu#?j%NAI@?x2PL{_E7eB~jbH=bzVUQU>t(`ZJs=(^`Yy$CYqAF4 zT8o@t$fbv1fqZ#3$jX|zu#DVhtP|#N?zn(#Zefe~u;PeOkQowRQxB6qhn$? z`RTR73+Q%x7XYZE2G0)iDGCIPcq48sQ$mrX^K>V|c<)!U=ryr?&vNeHQA~!qL^-*T z%gPCaT^FkB9`&39*jmSod(_Nvj>k3+Z%%L5f-r8~U`aEWSo%aV*gHhkH|ZbKMeo2f zqG+^pIYmreg!^I~L*;`*?;>0kFw~}$k_5uxQkK}GS}rF7YeE(WJgZL)dv0<<*rj*X zTQO-J`cx(4VU*({B9`R{{$Rtp_H8F3+R^C+YA(r>Bg8f@NqJ=z%TppjUt!ISG$f#6 zNs3XWnHn0ATZdN<;2VTc0)t18Vo6cY$CcbFHO9oHac_JPsOn8w$87u+tLf=ivYxbx z6xtZt1QJ7}V^|Y!NC2J=mQR#qnWWc29B7ZlCrsF z%vC0eXa^#budX>64fH888f{Q$!EB710bts>jfrB{I5aX+V|DX*FAvN+aF&_B=e*zF zQsUVNn*i@hmTBU!eTBet`ViR?`oyM&Hd@nCqvJk;O0dzcF9H?$Uiutr zu7NrXT~JL6qYSiYuw{rwdl@vR$q)u<3Pa0p-MrKkD%nA{=q`>rah&ZCfh3yclW(ZIl^B%n?f?bK|w)%N=vL1+$4$u!#H8Xf_GwIcVRT#=bd3!KK%V zOfM0GJ@(PjVowW%Lq-6nbCi0d?x6G&{J?ctsF!>(Dd~D4$`R^WuC!#XK~;2T!Wgh9 z%Kuc{TeFF|xN!;Sw_a<~b(s-`jo#y3Me&H|qr5CenF(uLb2@sTwf_6c8 zK`#>YE|{erb6Ag%9X2``TB#XIHLh6qew*oNeu34jn2`7T+|AaGix5Zb1LzQOB7DEm zkAu#*?0jp$8vf?>|R#%ksQhz4nWrU&bdUW zUQgFRHFnHPmOx&@ChbJLgiy{L18ap~KK3Z!hvjSOyC?A=47LCeA+zn1Cx7CGj@|5O zH|Doz{{b2K>pF-j@ab|gLnP%xN4xFnYfl_4C7B}1W$K`JN2jUz5~4B?*ab~8nHgA# z(Y-VXn=BVrW{$+ULc^`anUpwkjHf*oVt^lIV-ig`1*8hAm$lTPWA``(&LZe1OU%SJ z<9Q6QN614?>N_FJ0J{rt1WyrmZk)&{^@B)zy2 z&>Gk_@Ho2%9p;{bBeLR;9}ZFr+xYI!pZ!Iwr%aYgDR8b1$9Q69ac2JXnQUtFgAHU} zCq{%*ON_9aUc2aV#0e;>kPv%EXhe3fXc8>m0vW#9`Rl#YZ@2vMIBaAYK>t`=1QnzN zE~{iBG|?aLlfjxh1cQ7_7XT{Jy_(zU*ZsVGsjK@9Nvc z%et}F^oDz6gT4pi?B0`(g=G_#OEO^ua6ITOQQQ7@ejDwAmnI%~B2<4W79=9^I$8VnqL8V=@fRkMyDf^wVUNt;$h>&NLu9{il>TW&pY*+`%A_{CE23k z<=I8p&r7DbqWd;>7EpAB@hwf_aAq|YW@te**3-(Ah?%Vf=$u#sYz7v#vfD*96ch$9{(!z*x@N$2M1R1G^}!ElNH1QGSz97?)8- z`J?rTfyElw1?6 z@HoR>QjU=?IVuyZVdr1$ewlpRsyy`7`kF#reG^oSxEx;{W#8`|AMd?7{jry{PL{rN z&EpTka&s~yxjHwoAd$T|d8niKjvX8YrdwQ$%0c!bT%}1}r0;x=vNu4&Zc4noz~oG% zgoflP3TByG7Bj24`$w;TJbd+y-^(9kTv|TNr&2#h5ytIYKtWv0$POGj90`i6lNv=# zye;xs&ryf#YBVHvtKs(Xpo!26or|ozwq)}vvOHWGTC-lfwCW5(CZ8;&mW#-vm`vrP z>p+cLS&A*v1@epxpeCb+HI%`_F|#bv2;sJZDGG3Pia-FyZz~JCteJ9AAF40Qsuk}_ zG9GFzqb==n*F%|V;;tW?tZ2tAmYw0;^AheEjUj5}DM~1-6M#9siSZ~q`LQZ+E7Uci z1WdmhsIlQFOA?m&RMI0PhpnxUtO zj)##;7gBQ}?xP}ZD*1*;B@h&XiVKfWn!>C=hC17$eJsc-9qJelaR6lK?B(9!i$D+h zd(WO7ADo=r)%(}*^0DjBr{Fozl%}6>xew6N`(BXEg5R;!=Vuf9)?mlxUFm`BTe?Uw z>&%Ns$nhf%lv9C_;f8L)PLyN2yNU>r8bUpS3P&b}o^GPT-2hEYBZ}F&g(Nq@M3EcE z<%h`1&%z}klc$w+QobJUiyB1B85Dko*9Yj@hNPOHtW4})?=pnMK7D8R`Mm#X3+iLg z_svQZ=I|DBBKzx8~6OaCrtauN+5{$SK8-&vnh!a8~kikxdk)VH6$ zdXF21ms+zaxis2+74!TGLz@=`{wc$d9*6H|9n+f)uFH2tyOY7R*#`Dv*KooO>+7Vu zE6&Mu?MB>g{6%b456W`g8r0;>bdBC|qpSSpt#1_QTt6H}*YJBZr1A)jW`Q5OW>ve{ zVqWzTo!TDT42dXPNz-Y#?z48&n{*!3(l~v4Kd1Beu`Pv2_HSnSv~I6++U-Tqe6Ntz zW-U=2gY643oPylsa=YRqz7s+o>(>SCv3uuJIRrRKv3a+LxX$Eg`V3%dereUeYx&-fDoL83JZiUB0a$$N0&RT9n`SR&Phu}*I1g&*6% zjg3gxbX3ljWF?~n`#!S| zyJjY8N&B?XW$4*1$RTA?_}IGTXS@2HwXblpH;ajX=ih|VURPU5lRiLg+AJ-I0oIOS z5Ig8a+!|00YrdHG$NB7S$2m%N@cqnPe?46dvfPki^mtW^K!vRh+0I&xUTUdfV$QUj zyogWB+Qj;Ec8R-3pS9RIH>q3QqaT@kI^u%F&32#uqz#KMruo9(^`2hzo~&*!k<3~| z+I86vf=b;UfZNbvnGXoHV$hyflO_yHC_;fB^#LH&et`VWuKDHVYH~0vuL8SjivR;A z)v=k7NNahrf`InAs4n}jc)g+~%-IP6X`&Fi>tghd@FwyY^vVLb=46`*hq|7P z<@}E(TMP@Uog)Gm=%I`m1>=XkO8b!TkI`+Mbv+=NC6$ilW{~YpjGPlvhiqVTi6BMa1>V#OE4bal@dsx_0D=acxQ`OGlw5SsBQ)WDFWspREeg%_%O51LN*8Ye&N>LQV?{LuAoHvP<|K zOEq)0VYZivO-?ZA$kdaan-#^+w8W`I_`H3W7Nb$3$#>AUt9+X3z(za#E3b+U0_YDa zFr3Rlo4PDU%{F!WRSijt7HQgUB|w9*+0UhK_47(C={m2k8}t0OwP1{>>zZ71lj`EH z!^K$DP8qFxCTxGZU$0*z4h8H2PMB`C^O z1;P=&@vHr}79A>w3AJ6cM_yhI6W!!l2diSAgKKnXFLHdPvB~@p$#;FkShY3Mj(7Cw z4lNS9+0*u())kc4uyWhGJUc!==4W?JN zFQ7CmQ6#lV-4DA=Hugk0Z}!hKI~o;Lt8qACv&D4Y9yP4Yjpk!A0fw{RTI9p!i;TVQ zvw5d2zI8o8Kv`Ymai?C=3)_u&Ngl@`xyvpO^(o}PIrLe@)Qfg z)QiB6H<~v$T@~cFyl)Cc(+=wO*D4W<|JvFMif-y7qHCr8Ms>LRD7xsHz3pz+6n)-y zs&8-0QPniCzBOxtsJ?NH70kA6OiC{)r9bq?>5h%MR6PJ8QOU@DgX>*&EF)dVesi>9 zX-lV-UR;wu)K;v<Y#I;Y@kck`BjcHaj{dzCkOolw~uEkg#2tn}QQdcK+65GE8`BY<0 zTQ*4!1U2vEM1Ffn|8fPmqt$Qni9~`hD{DOTG}uim6b@9lMG zZ$<6N(`j4wlElk3jRJ2NC+B)k%T-)-XDmRoRIElVaXynZIsz znJ!6(jjio~o>YATeGf11BO=f>o^>@gT$_H=MRC(L1o2w;fdrQFw)acgBjd@n`@D;{ zP{Y)(VQz}lWD**-odD0e_!?T0vD4p`2TNYw?E^3h;+wKvH0kx>l3qJyfRnCm=)U{u zk*fOBa+>z_x_iyT-S4oPUg2ZcY*t(q{v01KSw<>q-v89QxkwE70La zn|>G|RO7bx)o5JI%0ct|P1@&A8ZOFV|Ee5z3?ar+IFW1ezO`YF#|LS#-;PXuKi8jAzcsr__NpdKwZbRNQCn)QAhZ2+! zb+XjMhA3u`I}j4iU8>szlqDE7E7R}sk)V>LUdL(6l!-=y>ez0W-12F9frM)`JSdFG zij3LzqAm$W;)2YrHAr+S-gK2pIz&<@47Co3(yUZvB(D^iwcBs@K@hFxedm7cumUXF z58OeJOcz=oY9q#dq8y+SIV+ z?VWYYk+Y`!I_sdKQZ~J98BXO*&dunT#D^&_yk$nMJ5OgFE<}#xmL^5dJI6vvLmeX~ zEFLWGWZY~#>?hjcW!Eq$j<8R-RQ(3+J8thUCHLNiqoCcLxd}mYbr^9eyTF>PblcX1 zo=WE#=g(_jCmnN;tW@G6b-Sq(cDuqM>Ug4Kv%f78b^VRxps0BkiKr+gB$y>LKxuIn zv^E@(CAYwA*aE0W`Y*2QGl5tq{HRJ(-Dpe?|+ z`)vgJoOblf9OQov8&h`G;$yUa_M%?P~ygd7~|$ofHRuy%TXCpIhX5Ty$iH> zc*SMVi6r%qz|DiYj=B7XY{dzbc_y;sFyng53x^?do~X+{o+CC`q!BOQ3%cl5n@87x zE@@xbgpy3dsQSROXwl$ryG|tu^Zk6@KI{$MjT_SDFEga3&BL9hsFbE@q3$^G1hmo) zhP>$#D!FYd9P)N)TQdA6+Iok2!j5~FiNJ0d99POTE0Z!M+7W}J%nVUqQK;SP=VX{2 zbg;qZK*Ql>F}>lxI_X;3dDW)xUaq3})+Dg6?sS!L7;LLmQyE9I28~rhoCMNx!)D0& zNoUi=1v1V%*h)H8sxu{*w0f(n*oEz&dT)K6QaUZE=6 zjbN*io=1c$WN%H+{vGlnsY#2Lopv0TM1=IjR*WTy^I}fM?_rh16(6AXtgJO-`p z=Wd&eD;hYc%9z^~onHjkfDkU~`&FcDk%R=>ZKdCemq#TX%J|R{#wZrea+6%Cvwt79|B0HUs9FQ!-ri4rWGLcdZD(~8$qNwLIC-3|A z{xt#e`0Z_EpGJF)b8OFT3BP!E6*~6X;k&N$+44ny*B&w9kM_&U*0elZzPYZ*<$voy~xDSNv!~hxYE%T&m*|*gVsenBU&fQ8b1_&7(ke`U;>SbD2SAeMj6XE&> zLKhSZE$L+I5J9`R+)qRUA6!q$zeT8T1{@=?oGQp-*Kij&I-ZIsh7FS`@>saSFC$3+ zfm>l>gUVO~u!sTG2rI`RMW{}_#8g`eX|gi+0W4htn=_& z-`dmPhr58sP6&~oNK$BGMY*hx{ZSDPm97{y;S<4?=wA^$OZWT2&nqq?^qrLNnvORUB<_qhN1&9d&o&k0Kx295=EJDOQ|3Noc1 zl?^rR#E*(*w5i8;vt5x5-2vHWlCx-8{)}H@m#0ea*sxi4H0F~s&ZkS4n#i`nR@V7t z!K^LZzwp$Z*>5~ycH{I=$(^z*$vv(mm!P8s0Jp zD-Fa-w}Bo}o*T%FRBZrr(ei0l$lmu3`2l}Bm{MYL*5++7Z*)!-E{RVfSBq+sQHqDM zbnCiqJY_{~xh9CzA*=ar*`cBBIt4NrcWt$PVe%v(Mxsab0ZY{=7RlwT9gdq61|VR? zxV(T3*X4qKQVLd+8m3avG$gWhFRy}YlWI|GJr0ByQ_xNFrqGdl7w^j$1s=lS=y@wN z!4oEx_i93%U8)G2UQ0nrX66K;7waT6A#|l?Gr7>Sd-@>*Tx8qzgI-oY+|g@upJ|w$ zt;TKvP3+!%?Snf)x75wO`k`el{Jry1hTf0DS;+X9t?PVucUS-T2TzAsnE;}yTtJt4 z@72j6F-2JdsT?B9+YKwca!ult`bD_B=E~XkSYd6 zW#m=Z)fh;ibHruD_Z(I8`mDMT?wMu0s?6@bkQ#JIWbVd2l{IGlz5$FcpFf59sLF_8F4I2FAN=fSUdXfZ3s zfiwm_ab^}OSIo`VY9;ZPB%7PcMhe~%WhMegFSuNkP>!0bta6d`(AH%KHnmv3(1_Y= zooX_~g@YSzC;j&4zy2j~|LnV?!)Ifb1(Kit`mgMpgVVE@N6!wvN~s(Z6N!!R%2M8$Nav%GCk`et}0}x1y%B6mIH(GpXeyN-jXxbniA_n(+3= z&3NY{=N$OyirF&iFXRfIv|JiibHdSK43%W}=LvkaUn>%QY7lwlR>KN6=N6hckzqoM zl$SzdrmPfdvY7f+eHWH=wwU(+I9r@8$S}VQ*0d{iqBe!MwvBQ5V3FOqUU`HuG55yg7^QUp|eGo`*XKET4z%=rfNnnDDxr zHw~+eZWcpK32Y;85`6p!2g<`q_OBP+FA3<^)nVS&9P<}DjOc^nE-6GWiabnF zi-^#Fsw6{SJ8Ri%8@&cl- zkiwUYfSz+D0N8@2vB;=S&MMWnsBQie1TIjk9 z&85TE{*eA2k3=~AC~aU`q@0l(<+@QF4VRU81-_ve7%oO<`b0QLSH)b^M|*r)1tE^) z`FHtfQ3zsxe25^#1m{}nU-LOUw0gS+fesq95c6jS40FJ>Fvd9}2CMMDAInt@i@_*o z2N^?%=iytFMMMQ-_82V0HAkS>gFu3+G0a4Hea&(fmru|F&H@HA;fg!}_=eXkbVMBx zJ>6D|JWWrBLW83hpR*pf6^p-wqdG#xI68lUwUOv+ML{X())8hltZ)?|7IY2bddjU$mr9N(36HO&u$vCQx6xPQ&J30iDa?ZD7dK+3mx}My>o=B9H2(KJTCHIVgf{_qFgkI(^N)4u=YAo+W<9?cv+~Jp0s<6ndsciIT+UeRCIU)NM_4=| zf#=;&o@fqY$YHmaCDhh2^Vh^ImCi=RfA^Ad{%hhWzS;mP?$ICQCcu^T<$U8SJ=tU^ zB*-HgedSkCYjn`qQSMX9HTN7N(8gqF(zk`X7 zH1ZYZ_|g1Tb1~1sh_L@>D(kA@UvD8P47t=g4$G0hjYTNpP31cy;=?;JkV~1Uc@PkY zh();jICsHa$HdvkvzShGU91ElT^PJt+?DozytWC)7~jvYHhbG9D@Cl(NL`#)q@=uh z^KvukWfO(pL&MEvA^8?*`N9dAc4t!x=q)FxOOcx)UJG9|?2Q|J&*xPYFX!H^R)7y< z4JJ~~BWFYBbved-Hu^FcpwGj#Hjy%{^cpMRtFI}cD2ae*B_QLluu8F3Vs&{b#-Vwj z>qb>kF21=OX~DIWLyC>gc0)vhC56Jsa#>AaNfek&#%$ASQ9|&BWgV#BtvBkpXNcOC zlZA;8(Hx233F+|+Jw~yf<-zmc1d3N)S{yLf9M)O&w9c)J0|zuL4GeQ2VHRu?^Ed= zTQV_;MZVCJ8{c`4Yd3N?aRfsgzE z!?mx_N9{4z-Fu|FKwHb}d9Ou*tr?~h{3~aj^!_-dqTubyB z0p((9=aif1Os3DATub9+j8Iq2g@umz7nvbh?pxUdP83XZkwVvqnL^8ht$pUsd3i5Je?Z!k zikqx=gdRk3x?GHQEt+D^!7?l(T8vTj6rd6qZX-rYZbF(>J|L$%;#8=_%vikRM4M0; znZ)9-i8HMVMFIg_jN|H^dKKJW;!vYPW3myf++vp~c!k0{>H+F;gMl#M8_kT)u&86T z&W)$!O;`n0Lne`N;)?|HDWl`iJOvbW6$UsiU?OAP=sF)(H`&#wy1=GHQMPXOs9R~? zjM%ZSA`Yt$1#tdsAv>x9LH4a5MFyFGeh%*Djd zQC7s|R{vZ?39HY@vJ5DXl&wDJ7*K0M<(5(4mdk^&nhD5P94yzZN$L{{MKJYnsoOCu zi*qN?Ct+a{2Lt?2-o%@_9my9<#s{_W%0Tb zAi8!i%;*7tM#WRb0tj=EvvkMZY7G2?w$VN7Hz%c06jhtK2*Yfib7EdX3^g-AxH(-E z;xLXh?K&r)_6_o#bnI#Zvz!j=DpBAPfffGA&H*@8&ih=s_>`JOajtMflj^8#H>%OP zu8p9bASV)=@pdu}q73p+`EwBt?LFG49dbB+=GL7fFSj?}l`{hM(|F|K{dJJ@!co}N zOIzwF?3U7VI-iCakfr{6M|@z zMrFgbx`b*A>dI+GKbj)3OzG&*D%OTsu870)`o-zB*4v}1whh+UkoC)ni{wBiD;E_t zeUNR3VPX_0SE=prx+2m|l8wBo-?!69USuiyDfTmxP9RuvYaPfI@;fyD7!{|00zaxf>ETFAA-v)obfl&PhX&ZHh`+ zj6=t_J8?Cg3A>!B@^CT z2+2VfvCn11r5+}Pl8XXC;hZ&02?z1~arNQoQD~fO?#6{438&}J`)m~_mqEisCI&LF zTR1A-2g2eyPrAW&kPKqo`PFr7;{Ltt5bJ5xeM<_6pOrt82WLboU{KU(sk80=#ZJq( zxNI{bXE1?UV;?!6PWA`Fk{+W>q5(x4MzBxlL=Ky`RGAP-$zGoHpB5$eoximM3tz{Ne&OSpA zZuG5kwOptMCxZ3#ZOI-)*E>lo!=f%{ocneG7chz}lZk+W5mLw1bXLN#tbP`$wXRtw z8P_bQ$|9uwS5sGGJ#_N6m`#dNPwgl}tC)*U_RYS6($k6~h^z@opUmDCu6$nGDW5x=^&a#*z1lb<2c_n8B$~g(XSJ$f!3~X-oT+vMk zcf5F4q)Sn8f%mQ#G8IBh`eI%YSwU#URvq{?H66)HCb?!-L!M|avKyh4bjfzt^x`1; z%)$FX!1YC-j*^qr{8s`nCRxvL7lDISCyg53JwK$+jx`+VhJLYiIlHAwjRrsUNA-MTS@_)jJwt<;O zz>>~Ey(a)jdYZkX4BJB+)w7JvmnVUG_p0N16Bfc=es|LI z#|^#$=f5RGDs?K69l1pBM>}%qJo*i~G|DFvxt&a9H2Q{&_4Rf5>Xwjt$hoaqOn{qRUB0Xf2f#Dh2}IH@9`FUp^*C*Gb7q`~0Q8e9VW#n#Fqyg| z|7Q4EK(#lnC?+7HT_xK&Ed`kg<$R=)CcCCoJoJyG00Wd6J+xF(H}nqz_0w-NsTGA9!z zxm?OCf;%hoiH(lKEEaXLN@>vexD3blZPB#W56qtA?1mCjygkUCP}m>I+1ooi*{`2u z2S?AHtqDe~ZIVvUB1%{<`?a-ra27uOVj?n` z#)Kf4U|X%APqB7_B|4fgZ_;J!F(=p}a_CRD_!o@cGhMoYlr6`BEe4K}#K(K^PBH%* z+j-JdEx6NeorV!;&b(qtZrjC7ls}s@lWYC3->%f8FACenfZl2}z_73+#W|q+RF?7b zv?lwJeZYK?70d~QHHAVh44il zSkpEO!Oe;0qO@~KQO2uG4$y{#FJjzmor#Y4oI{8z09HV$zd^s1I$xJT2nZ6VzXY5v zzfH!F2jPDY!~Z@{E$Wh(m*!?66V4upxrojX%P$UH&jXDN*J2Z|dX#N??@6mwIuL6q zhWx|m(-zHzaTO{=NxOs1rUZ+dNp0FoRIjA$c7jES}6)|(S zjgWvAEE=@^@J6pi4bQoDj@?NhA@Y?ZL6t})-3AGgC2|14mSqNdGtpNu;z%O_{g`_G z$yc4Px1JwXuUTOT)HON|c1^X!HIU2PF;pCQ87ze_DbosCxWv$gm3dLtQ%)V9&d75t z9{76BhQP37O&L4Jo6~Lx!w{P!pkey{UIs0O;!s%u6?sN;BXIpSDuuSLWGa;37 zU}}iCnwGLb0VzVpG7h$cwmWC(AxOKAVW$Hx?0K#7hH?e~=K_^nW(8tSt zTm(3Ipe9o~BxGD?{1~9i+=7YRsdmZfe=_ z!rpTM5iw3Rv_7webh7-WC?arhazHBVmqsJS6eqeHkt8xzDHmb|gX2#?t6JRY9tv1Z zwwzT~9D_qnVMVAo2ic25>d=KE;z#i9VjKg-&dEvRGSCndZlyO>C*_iBFJ!b`)L^NP z`HF!eGQtf_0WN~$b*`CZgEZ4lgS37 z0*OhST8p*gP4+ABJtR=b-?tQ4JPz#;$P*coEr2>1xgQP^u_%|)2Z2R?31c?gBec*m zsTP7r2KWR%Sl7|^qOxDi?YO4kyGfuJa|KJFSgm~cF3=)Wg*8-L2yx;2aHWAnMGV)6 zcXCy@H0(`uR$j&#z?aE^3LS2!PuR}-(4%AY!ZJQj}bkwW92rxWO5U-tc6uvgc0Z@5-33z zrfFbEgr9|7s|H*C#J!}0kVv0Q5P^Yh2Lj=n6@>h7vb-qDWY9chEX}~FbpBr74JX`t zd%KD_?QV!Zo+nS~Lp}2JQ5p}SAB)^0)ddlaUoS@f2#`3(y8g0JKsr+LrCBp(91nlR zK}~$12J-wkh)Vny>gx|wYgSU`oMc3`_bxL{%$Nf!%90$&A)3YHYR+j^Dw4VT<(G;B z4?35NH6ohaZbXt`RSrLviI5vZ%C>1_VfViJBC!DM^t{@p9o%cEZ1>WuTU{<0SieuM zp~c+Mm%3<1yJG3etA)~kth0D82TZrCxpiR<`878)G?Ig_h&9u}b0E-AG7u~Z!+-{?;1k>W(hhG2$xI&6wwfq+S*o|26F#qs zSWw>YpxO>vTW~q6#*S(7pe@J>KMWC{pbF6{0r3yOi6gZ#sZ*1cJJ5UN+R!4tmBfun zL7@Ufn4^r-7?VqnApw#&3(O$VtWP()aV&zyL}tarayD1oppJ=q!$&?VlGE?CavkDe zddt5|>^FkVk&hzAyS5KRLt2fenKm0wTissI_!s&uSzjVo(_4WjLA42=H&?Lep48s@eBjK*7{T?jiZGoIO70^m1{}B)Zvb0in(eoj-~PT>*2_d}Pn;?j>TyJxNcDjHE?;#2YdZ@=Q%qdsxS={1{`DrW8k&6Y|8>sNkoye=}eL>J(+-D)x`rr4kt_40`)j zb(0VC+h%SD*H9q=Qm38H*LWgDU==sMETDj4RJHI#&{9$SAzt&YnW6HTkL!i$xw2@g zyiSb>r`9Zed?Sa@lZu3MiyjR(Tr$ZL%G) zpClm(!YSt?0j|*`lASKBw)T1L+y=M7Ef%DyZQt&FcW`!cdc6Pbar(WigYXnwfwTc~ z-&Xdys#EkjyHmGaHftVLBd9-q>An@?Ep5k5kvO%^-P~p6{K#2>;Qim|drhLvpY zrxn+J@m7$sp5q)A5)Bc03PKehFGWR)eb=qXhdbIcmzXWtrb!^5O&_hde0CTyyZT#V zz_c|chI9?BM(qux!-#|aiYUkXIj_9s@vHILAVJu&ok@N1Mo2JnsMI^A7%Ljr=E5`Q zTx>^25&9@R*oxe$z|MYW!iM^6 zbQIg0uVYCW){TB!ZvosuFBfdTC@(gz)14;%&q6j5Nrq>K~zLAr-nGQ_-996()lQIO5w4zZ`dt+gsuG2HBB6Nb4@ zxHd^KYytZ9lk7qEZ`o$OnLWxjHzSELNIZ=m&F40pQp4pnWJUg-jutb*fnY8U^T@@m zBJiEpTM;dWQ2KBE`Er4HidfW{nAawkU9;Z#$Z0#KWTu7G=PAA?4PIlL#RbMbU?L$Q z>+Z7gvN&+jT&4O3wx~{SyD>_cqMu=NUNjA9maIef{1Z+R1`*AXt&PFO5ZN1eNldE2 zqxtH=gK&pww6-kSv5pC~9`Nn&G&MtzHremhgI^G(cADr5>Yn#;7W=}E< z8QvNma3=)ukyis~el;sNH&sLz?JGRL8Heq{KPir)42qWBGZuafzsZnXjaEbwDhLDM zH$;Ft$-!^JZ5xX>f3_Hz0U-#CzpW7+OG;U>`_p8zwU(FtKN3FP@T}Ax!ZE~MAsS@& zWlyfQadtDI+tAd_2`hkviKuUZy^shHw`GkPSCit(%nR`T#-*24ua&kiy@d%cR#}ON z6bc$93)%9MHD(cd;d#KnPfz}}x}eq1NwB*N3i@nF;ZqJ7MsUZ8*{ziFTIEC4?*%0sNNAR6JEw3xYy6y_%Z72;dXW{swupq%&n zh#$Jt{^$?^$uW$vN0FC-Uj#Xg{lSXm!AH!23DCIM9E#X+QI-)Txs^_Yiw248IitIy zu6)u!M8&;!A=MH!z0ES?w{MQ0?f3$zsFg#IDHDbTbO}RnRPwy%66OT@I_4;_$SExs zV>4XLaso#IvOdrEiv{ z5nVo?(OK z)$rVuQ=S&@X)0O*ftFX9FAAmSN%3OpgMnvfLiro)W^zyxq$oC4I|jJ7 z6jlUwC2@kiNC_;=X_oc=f z5P*8!Tz$%j7#8p<%m>$nI-b^Su7N+Qvk&;cHl&ffYz`06h{7~ zH&TfZTgUh+;$$Q%N9*QV(pjSTvlJs#X2TS%b+jYoO!Ei>8=74EVyI!Y6e^F|N}Sx3 zxLcqYI-KqXfw3$py4q3-4+4)ap#~}QS$Yh$8k-lv-YG^ed5r~V@_`_U`(`3N>`F+3 z;d!pU&U7LhtI@<$_0%GC%mtF@3p$wL`3P_3(;@^01LGE|D)zepJP4+zo zt~VwZlVl>{+^W0L8#udcq`6WGli?$Pp{x=+;~i1oV>zRp7jHQGGppHEt_7}i*y4{t z-YRhw$shFaM)p`~wGhbodvQza!W5Sx&Lx_kr?rAS61Kb~qlUW-^QGBcNw09|x4MFK z$&zHAt71Y`(0Y>6o}OGrhGC$m@csp5z|u^^QbO=3q$p)vL4r^zs4fUj9}Af!wrViI zoW!z($(jT}ydDQmutb!`tL|+Lw-F>e1jI;AU`;y!%!ni3==;44lLBQesZPak!Lh!u z$g)egh_BK&D7yr+05BH~%3v?+%6w27Co*JFPKX5+o1+N!JWbWk4X-}0rEnzxXDv{zD7h%Y6heQD7C}S_-GPETx8B{6k^_x7N%oorimS&$H@K{w4Fm)PUYi?+bSfu~KDi|{Bs7o(jd7x& zmuzzyL=yH^D(tmZpb$Kg#v;b>hPjX&L}`m9$O9R z(^@s196|IogMvi>ox4pWu&LrIA8oRa`jU?+B{5D43N7G*$V8DhxGchgs85U@aL8Dj z<>XyHDu}WNam}Mx{{gf0fP9vA?9 zDdlJ;w>u{IGIo6eDHY{i0Gn?3>N)hGP+$VF3G&7^tGBF)`h-%cPQ+T26vKs`K*=Dj z><*ygV&SMscK)?6i>=g)9#p|8f^yhsZZWl97>|hORt(66n)oU(rj(Mj%=L-FlZ!AR z&LM%}7@yogiNWWHk+_7ih-Hy;6hve~$U#A|iKSE;CbPs>AQN5;J@9ywYD)r#VCLkm zT?_$HNbOmmKC|J-73radTeT)y(a@TuB@|gAUr==+LXI>T6HsO!*J4mS2nm609EX^UyNCH!2x2c>GUu-YpL|xpD7YTY?8##uPmh^pY)8tZ@^ZKFHn` zN~|Wsry}kJ1|4qEn9cB%2D5?ee5@peN6pyrz_Mp4;8!99R*^DdAdqwU5Z{WVsMH^3 zs;O0IHjsSMut^iCM$-FZN$8w&Al*jab#JJKoCZ<~!c~kU5XE#c4F`Z@Gf5DVT2o>7 z5K5>+(poP!su&eF$)Thd$&%vrR5&bSt0w9M0}&p#Uc-X{#K&tSA%K2|vhySE4Ot2x zAVF5KBC3Tdw5GmbF6f4ff5Z%*^;ka1!8Q9o`#B=~ojdSL&aUfdi3{LQMKR5CIZvb@ za?XJ;2_?FE+$b~$0n%zsL0yN9=v9SBAwtj11vN$$MPU&^4kL@i6+FhSAHTNBHIh`LzV@ z=Y4bh6<2E%XPkVv@9ORNZ$9kU+bAN8RmV8w+^2^;IrY|0__W{tv0I>6n{3h6!aea$ zKqZZPnr((NRDm*YnhGZ#nHqaTRV1mDg@QgZu4Y5U!%G%3F5(eGXJ7LriN&m1tse8H zvLTV9h12me*(vz;j*Uj5{2<~bnQGl~00NU)|2!hiU|`jWMfF&ZUSod7?NkG*}*+mPFHM4^@Uj+`LX(F3kK#UE&tSFM*A#QgPp`JT9 z0S5=(T?THWpA!O8qQ)|4z9@Xa6EYmCy5+{rB{6pI_1s%h^XKr10)(hlvPHFh=1D zmi617$eO;6pm1@?lop#Nj*GA5-FV8jbLdgxl7bMl_`J^SDP&79ZR7~{im)aK(ef8e zFB8Kh4+Y9LcXg}C&?IlUGcr;)R}_|+@aKq&)X8N#8EIGd-JCSC(r-0`9qeK#P7ZT!__b)1rolM;Vg-`z+DtJ$PSY6bk0(Mdl$lY*hVkY+0aTHfxKzj&Uxde z{++LCPwwJB;$_@=tP0=;W0tEgby(z@UChJQNTl=Tg_fAE^9DKCa%HBm6r5y2{2{Ku ziN+i)CbNPQ)H=2S+~^{R5^tpfnxqrWZz`5Q(P~yuRgOeen`=T9cbe4GXh=!2c@sHn zsOlBpX!_vXAS)&obx2hk&4wb|p`6TkpSVO9aFCNMs>252`y>waLyQnD_8~^Kwt^Sa zRX;#UOS^Az72Cyqxgm@l8RLVMpE@N77?bQvH!%>cHsJb>C&Ti^G}gOvvYPToJI515=L%*RXlEOsRFXx#Bif@QEDnOXo>^$ z4Cm}&pU8-*?wzBoS5mSj@#{7;wR>1&XxexFQ%Di&^%R88J}GUeoxGJ4$lm4b2fL+A z+FgssPUVZ*CztRv{m~U=Wy8woRtF#jDSelgKmn_H)F7?YQLN7HEKk>NSbPgC+S#b& zbUI4%hL08+=w%3#@{&f1Y^*e7;0yKN77XD;wGH1E^Q2N{q6}&`9r?1#T_VVQEb(pD z3|&1xppAY4=W31}Cv(!I=C{JQ>$)105JjZaW2ypCx#4l3w0}N1da-wWc=GTslr+WY zUy5_qo$d=ln2dVK-rLS^^c$PaF6H#8=nEgrf+GL?c<<%G+4qO9o*jLE_Iittl9e@M zF@$kBevnotTU?a{m>KD05r(vTo&7m|;4gvCB(K>a=LfxBdRegmER5@ZS-rBjALlf& zvte0JNBQj*$z|;BbyJ3|mqSg-aN?01dlG8wT@l4NP)!EWl`HA5)49}J#}r>2K7FX4p(juiLDDRIz~Jh&VL=rUdHE%kLUbFL zD?Ix~U-mt8!#La>`$+lJRHTK@cNpZa8I|Q||4#>}G{j>;mB4Yo31WOu{2DkBcZs4g z*B1++otZlw7LL^+G~DTibBskrG)AQdf=#h>Js+W#R4lAhB;n6};Hb6%m zxF^G7gJ5Xie8QYtk|IhtK6a~S;Gw~FC1L!Sd;}TvkroXI%?{B^Ap3DS2Y~DDvAn?H zpZPqkJET2t^kWJwo%Is#bSZ#Hu_R2va}!|GXASptqSo?kV*M$U+1CCoe_g*2bV6bIeQtOROi`wv(pe zBKJ`%qnPIGeFpKu5m)(JW2bD`42o@Dg9rtwr;!gC)dS#2h%m5mU<{Kv$3#quT%wXY z;+kny=_M|M%{Ex;#_$mUN{AYF=;<_Va06kp4A8QeQ{lEJ1zHC^pR^ zh}|`njk~g?)lA4UttBj|vxAK#A)KiWst1sY$X$kmgJ5}8otru*FJQyXqi0Do!CX#` zx5vf;5aPRX`f4qi7FKZvdc4H7@s@CyGz+8o=&A@pI%4Dz+fUbdhGZoyfJ|Yc4Uv~2 zgp&9WmJJ1sZh79N7&XurtGaBx%mFR0v7}stmOhhM5_V>qm=pO0X^-Y7iVsm~HJ5`K zt!d2TiLIk%#s!NSnDipUkBK z;u7?B;MUPO(!m=|0O7nLv_lbSA~y$$gn~aF0g78L2>gFb?WP&=O(t6XGt>Omb($E;7$& zF*;7+-AYSOdVcykg|w5@CFxIcKx>Nv9)%7UpbkZZtPOzA21*iliP{kq^ zLk(k1dd0P#xl9zg*YK8jq}(OJN*<29mGw_)`$>!JgeUiXcnxC%}LnG;MTu+fy8&i}7m@L9RmU;_!>s&30KfK*~}OQbP-$2q|{T#)V@2u@94L zti`}pJIWTAE-gxi@SV6oZOP2^o^h#qyJ2C>KFTFmckAPGi3Nmq3-i8WOq>T1bJ3}aplt|#T+7KN4nXzeF!@@jX?y<=(UM&)Y$HKI4! z14-(K*`~|Uupw5c6<%i}WE07X?Kmo~B+ZyUZvPl{U)Hu5iYH8OiC+NOh7X%{Ji*%K zmQS^f@#;~3%(7rnE#(H*L{^;s=d<`JDJ5LE*|NiS0zk=3)T;U0gJ9Rs_yQs%GGebK$koahja; zxd!113mxT@eo&58o(Ef2KI-2@BBU=IKw+5$vST#^2zn3U%*TC>M^OB0Qa;4;)xzS^ z7FwWY2VF_m$oyBWoX)1E!wzDS;yHD?E1XXdoZ6(-ofjzthQp$ftF%C~TS0u#D>Ekl z{dIyiu!K~~Dhj$w68Z^vT&Sq(;_hwSQUCriMkkV~tE!K0_OC>*s038mq#$ZIHv7jqLyq5{yNZBAR z^(Po~?1N5+6vuMcTZ{U}T%*}!Pc4Wk-Rkk-ny{*Ebu(KMGUfhRZ}KY1bL@m}+<*P1 zzkl@d_1>!=`zJr1oF2SPtia}M%(IiA{(UYfEf<6*_|@;<_Upxj{#Vss>^|69J9XOQ zTDY!?4Z{KulZfUW1r|;Fwvj^g_!Rq?_M?(GW=*xO&ci@HkE4N%V&oV})l_#ouO)UG zMS5c9-}$@zeLoDQzZeCIGZ!_o-EeN|-P%b4p;XUAbC05#S-4-aWDWQPg?8eSw&wezCLD}QtVkxPhRhlU-$Ij_%Bv;M0MA~_Yf~3k020Hf~uL=n>iN}=w#Z_Wj^3?>#`s6QoFVk zrd^A~6f2^r?2aGn-Lht*86))b4JTvyVc3LR4bt;TWwk>QyeA{+311_!9_B`c)rp|z z;Y#?zFt4h(a$72Ns18G>#(OMmgV)JG9eTfZBVeGrt2;yiQMi!G`9iV+*ygYOToggJ zEh|onSA^ax1=fO2zX^0s^ALAk27N%0(-gCulM zOt=4fZ~sqw-yGQCI(0`%zOx)@IaL$}CpIrVh7pKg`!NuE;_T9q-?P^$ib?6LFmipJ zUZ3-;$)cavTc{XweieS(>G6l7;g+HC@(1Mw6<9pK8eY&p@1-!-`TPF7szz_ic~UU) zS%l2Ubs=n<8?tDudZ*_6%B~LyHfj%#$()=v7D!gDB{S+lHI1n9`oi=IsdPJw`!l(m zCfg$Fq#Aq}V>r7URe3Cat%35sA6mH;{p59Bj4!Cfco_CKdnY|JjM_I*kFr5u)D^+? zKNj-fq(wbhx_b(QV&i$gZdUaEAF}Vm@&+C&xc z^My^_GmeGfi%6BAD$!Hfq(wD=jq{qpD#F?5HG};Onr7CljEdfxYSpbBRYV*x7PjD6 z=!6*r!`Mkf6V__j0(~HokFCXq#)(oIA={QA-_FSgl5-VRvu<(;F0wy_Ws-G?i%eF2 zya%2|)1fF7?y5q}XB;tZY#g#w8Jy&^S#|S>m*O6y-Q0_4V1hZ$r1sV@He`jYq#^`Y z*7n^c9TtIbz?i@=J!&+ilw^U%5HiKKstzSxV1~^4j(!A_2i+xwX+b}jH#7Jd%ruP3Hh&s5}ehQm(tdh+ej z$?55juMebDk7O?`@e-&i7MDeq%dDG%^JALY27|EhcE;M`v?8~YdHx;?q+>`5`R2|g zMnr)yT;lpXt*SX8)=j4p@|i4-4|$?b#MoL*qNcQ=1)~fD6!Xz)AMD?QBi0>my$VVW zm)uNRT*i18^fI=*_ZeY zHCD3WX>a--SGX6K_(a#lrzkR2Gz~kbcs@FkOXe*_{0#&A>GpIxfNfMy0ebl8(XW2> z4P%h{aiTlx91p(Hl2vr}?W^#7_ZJ)NZRX_U?=%6JUT1&cB`5J7N^5@fnb}iUJbcK) zARk|SqLi1PsPpg?6c3L#KSM8XYR=)gr~TQu_f0$@|MlrL$vsYF!KvplYwpmw$fqXS zuKXb@<0IjQJu)TqqryHUnPaXWeDG=J?X`p4y-9X}J5Or(|GONGu8ijH1dam)@!H#B zBu2!pqZl4<20Z!p;KhsVNp}CDoZPRk`J1^`E}qY-1qrR4#gxzS>{c|Ps)>*Y$0Rf> z5nQaqx|qBxXVpZisBf#345R~Bp&Q~ZU$k=)@3&CFm52MxAWHbF2Bjn@oAET~w4{1* zd0D;}WJksjD}4nSi=~33uGuN@9GpCAf0FGEvfXOKVw4z*7eQP=PvN>g zjRCW4%JJh7yQr4<7aK9NSCLB<^qMSE$r4+Xn_2(kR<`Tq>~0AR3@^d_S}>NGRB%=w zi__mTgn=!a#3)7SUsKU?liia@pP_Nl4Gs=U>pj+njb6^VEads_{Vgqw`vH;Pbx~Qc>iLZbnj_0 zYf(!~-{VS9>oI#${FQKFA*7-!agNhAiPU83%ZB2Iy|9X*ObiK@kwJk;C>Q^mCi}boB%}rtg5^-N zk#okno+%29{xFM6bBH;kpqe@Mx?WGG^%hkF7ny#pm`iV+1}sZ$@+)8 z;eU4M>C@*g_P#j@-wgP)O7H#TYwnV~%8ZC! zu@k}XJN8!cVxbv)uLoCFbJNgvcjhewK|2OM-s55x~qfMVW~kpvFzTB z#Z{Z2MQ#ubR|@wUZX3yU$Uc^&abCe+aO44T+GlYg}b1SCK77 zd+##}$9i6Eds-WJiZ_{(98WnN9~3^%I0)Tkee z?MTP&_e^3u_>E1Gm>!*Sz0;-BR{n(<4O@3i3gFj8Gj<&snhXT z32Zragr0y>08BbONgYsz-*}o0rm(YR#o)TiimSl00o+8@9cx1134hC5`;wc4pV1^6 z)!F!McuzKdmrZYm*=!vCpZ+EyT#pFH6&?f1SeO%SpI5Zx^Vy%P=6<1W$+GMJH2AUZSmqG41%ckZxDk7V5&swmqO#}`%L!HC?(Z5Z3NqnDIi z$DTq*x?k9e6(zAu&sZp&Zpw;eNOL+nYFN*Or7cpgHSdkO#U74%=WGEuG;->6p)Q&0Gf?X#UIl&!L*`iu?Trq;D zxD$!$Jh2!HI+t1%i0lV!a8?)>wI1bjrQs|%q3$pY>0H#Dp(#ZjQHueQ0701*ylWsD z1|81IrIoR`KvJGSfP*4 zNA$+?*_i%2ez)b8uZNyD`cjTOv&yxQM7YXW+#xlLqO<^WaJG}-YH##iR5Zt3K$F7M z_=Yu{P+3~(rH?==TjO@JT#T!*M(UuKT1*o6J-W4)F%wLx7ww@~U3L!hgl39Gp4=FO z#&%tamAo|oY5;}V3t+t6{061OjQV)KFYnc`gMAZC5dQt6`=? zWbrJ*B9LU%+h7ExAX~g85f+=^0)B6$OevEXvOSSpaK8WgwY-FNJQJEko>KmV>U0Z9 z%9@geOhU?ds9?%3o>^DKlqR>!y8;IrX{E$i+fo!w)&fL`Bh6$qbm|CaPKbyVS2Aus zz2P1uE8a8i0ZNUS%Ek=IZ|B4HdK##s5r=cGz+rp1o0*f4QE3{n;+Dc;dp;{96kq({ zE;o+WDM}Os>xKn(=r`$scC&SLnc)AXWs+C+Jj^J@?_4{E>)qO#nz42`o>r;{O;R_> z64wsDHxRnM)$%}>U*u?#EEszWfBmby`B~++DLe09 znGxRYn1>9v;*X(&dlHQ@yyuQblBgOB8W^GvL1`$_cXSBi0HwxK?%EI$iHAuvw+n4h zZGs(hvY{xd41ePOz6)s<(~!li*=4bS*#6O$*_0Z*$Q=oN&V`@^VqxDRVQl%y=t4A(Yxak)-N z07`DhC~6zVnHD+Q;9{=!`Ln&#J>yS$lC5l%x$SJxH{eoJ6>p1J$0^X?8~I?gj!rhO zy@I2Wf|4iab@rarH6WL%JUSuk(8Pa42uD;eu@LdH5pyiq`rOzhRH9(i}8yQQ-@{#2Gk9M+ZqWxmwZ zk`ap{zd`rrg!JbKTgL9AN~0MxCi;%*MYj^6#bVMB85jE0)=54@u~-qTvsSxERg9#k zVeF~lIJi*hJ&@LSanLo1;Y`6J-Ub_9;Q0;5&~OJJ+-i`d2P1IiIgnnbo;J}#_;HrS z0#$$>>9GwUf`9;QD5l6`?r}0#h^~AV>EOwC$6xfaFLu9pdh)E7y(lM(ASFr?*Sjxz zVt!?^P5Aq>Nh<&_EkQx|>ZWp&&_Iz{Rn1L&^(S>Vrhel+O>=L@o^Tw7|Dw7~V+O() zvnml9xhM&pHG?uI$-CW6 zp9B+@mnSq8Kj-%s_3ZvAaIw*rx;@Rhsmz%27&xFD8`e`9{IWE2poZ-e9Q`emd+K>B z#`CAv7gQ6u4=%vwo@j?G#Ge`+d;*9K+2j0ce(~29>vT?Z`s|;uys5DiKk*peX_@^< zVlpv)C>ivVZT@b@&3oO1ZKJ++oqz2Ey)q4qql#wX9j+aFpH2Vp2VU%i6M+X6n=T@t z`x4GQ5U1m|YV=JW8M7ecVZ4|T?oqu18Dx}9+Qwq{2eucvv-oM>8xlb5wb6va;UDq# zx!W7<%p3i#i^zO8N%x72vLPE49j|tX4IHS0pP-vsG<=#@fUS?$jDiQZ*z(`C&FTK3 z@y8q%o}{}Z^*?3WVh;_I)qX5w5ne(`&7DaSVe}|P&}ri?eBFoRAiPt+ei%o6#}%w? z361=C3ei}?di@%9cJp=JT0~0B30?oPb*y9sNfJm7zcmSqVF?Hqw|v%gY2v%ui_}5X z@5_+eC$6UUdmk#;O&tRkS!N+XI$^4$;>956 z66HJ)<{#<9JGHnAD+y1ht|I*77Y zv0L$1EY2y5yshcoAF-Hmv9e|{sN60i2ZySRrItY2Uh-?i#F->*%F?#*^D>8h3tCCI zdK{|M1eqh4j{C)YaG$KXH$(Hg7{^AXX_|R>0ibi5*jeguY4Ms!S}dSz?_~e*5J<4; zY57n-6$aeRqx95JgY?X3H>-J5+|`EE{7lX4tZsYZmP2}5tFR3>hSs`_l08mIUqB6L|XF6ZnJiO@Pr0(O#c_X&!%yK;+BfJz!W_mJx!QH5(njO+zn5#<8 zqi~3L`Rw-ZM8URwZr3rlz@zWP+Nj;fFt%hkslu`PWUz$OCEviL#otPD%rj#FtLUDD zJ==9B0T?butg&B0PwEuNg2xywA~J!yD=T+XR6fdZ#A9)*D4;7?UoR$Oth* zxZrm2%y$-D6paH#ua>DMZ6u7}CY78nJoGWgOD38eta^HP$~?K{62IAt@L1!@>-@E+ zr?+>QJ}Bb-g8IBq+D)IvldAMx%hDxCwtDfPI%^loTLR^fU}3&y09hyQIOV{#LcF*u zpq9ota#hH9YZ`gvK%J%4^!_6JNdHf^KKZ*)w12ebnLMz!e|GZb>B;G~JQg#ZciNqap9pk`85yvn(OI+Sw{|S-c$F_T%n{ zu2Mrrd|B0V^XS$d7=payBF7POAfxa3#f!Th7rSe2oE6d_G`^?EJvj!-y#21I2MtHi zA~`o#5sBFmDAAcwV&!NASQH||Ftc4yY)0^INT^`~n?-N3yRIdU(oVV`VSLHd8Yeu7a5rbU2EhT})ll6WXSchPE*t!q!RDaK6UffGHI1p)iQfEUtXi2Xo*2fY^ z(sY1wA!hSNT_h6#d>H2}dmjDzIvj~UCBuaqJ7@DkecBgPjrl!r0g|a}KVgzy0}09MqSUM9zq>e@Jiolu*% zIG$3yK@hpp0fd3kQFjqw(EzD+4!LZr#;pa0zk4q(dGUUptayZ)4Br%!+Sd||cgM}u zakI$#v{*w>`O9i3mn(XN!hmK~SZ0PexFT*)&KsR17h*R#CJ*j9=s4i6)9KFL$9MR! z-Jw5QF>Z_lcQgl{)Aq6YhMgfyL-C-EbPHFAWJLjjAyYu!k-@}TZQ#BeCXBD>A|C>Asp3fz)Tqz z11nEJnf@|aC-TB4StS0^IBV9B@VycG`1a_@+?5;PJ)cYZZ+K3}#~qt|8} z!iw&FV2Stis?clQN1IXm74qGR*F^KnZoCYzZ1`okFX^`2XAxX2q;$FCWl zX2n|o&&YQlIlG}D!9&5hwV0Fu4Gn~cdrIXo-miwR96A;*SKOXOfJ!=(<>t2w;} zp)dUq7G(aD^O+=BY ziG^HfnPwY1l2YpGu7R^1!Lb}QyBs+#7U}B@x?LSXyArSN4w16tWK4i(xntuonCV!e?TFl+PU?FiNG6A1r#49i08#oko{a%0K``om3kTV$KWd7ZV32 zRY>VhJS*Onqy9L*?GF++rbIPrg&kY+K6>8L;V3w2K5tmtt*A^Vf0C!crd$$|rjy%o zVb@}~a2$DUS0=5%w=P0W$3ktJd1F}B=?+4w-{p3kqOi8Vs+E#iSFF7$+>XxnWU zXQV*3B4?zta8UJdg&u1=U=4_9-bfefgCC@y_O}ENLDNOMGo-B6y5s3QQ%14?Yd1WG zTLxsP-QkK5%?8cE$qxywbyx+o$fU`~THYz|shbrD8V5@jPL)OHxs-4aA(3MiOMSqU zt-U0NCpk%5+4eoa=6As9?(P^=*TlyNCxiq}%t!&Xl!_qUg(YjW^d<~_iW$?8B1cUx zIEV35Q<12E6n$FH|BfW>}XcD-qbz>d3 zynJ!Z0j)-VFjSid3`%}J*?xU=a(bq@a7mlrqy@!MsvE{_c|D!MUA7SrC>vDZ-Oji4 ziGC2{>R;M$9`mjapX@%)e(HQGD+u^#_{8wy9*5U1YuwCq`{a|MtwHw5*UiU%lN~RN zjp1Mjsv(XK8>n|1PvCx+mlm5qdkNxCp2=bYqE7eUQt|!6T)w-aXjCpd1*e$YYqntf z(KO%vJ;$ns%LCkBN+{k+-EOd8)Z#*HJPqi~aL@;&XgDol7ST`%*TZu3x_2?GjeC8z zm8@RBFNl#_%XTx%{&;^_yt_XML&zTf@n0Uu30T&=(S0}oeL8hd+#x4Led*i$Pshbr zc93xB2pWq{o4a7hWb)|bO(}#eU(neGqdZ70m$%AxqutW*v>BKpLEKiXY?1?lNV(|{ zvq7RaTip03Vj1_j%UNa+=S0jy6A%zIul6-0@fpqhHG8Z1N2lfo2jxYwt`- z1VIo;f#nIXAG|B6)T}LE(0gpD1^uf-1&Z-~qr%A{j-8IVP712?4Y($NsI{)Hq}LxL z*?>~HO}#9e#?Is(V_+?K1i79JqSZ)jezMh(>)fwbP#FJ0H;z}TH{V#*8bdbV1)Cb+ zs;!y$Y8w$@^`fCDNP()Lx+Yl%Wz20V^16ai$%)s-&gJ#RuxU~ijW8y%@b1+xb$LN( zG3n}p$k>gB9Xm-8vPBrI9xUW3bX|3cJW$tatM055vtzv*CQrEIu-SGgJBHmj?849!788<5i=pRR0-#Fl zhEdlOO<61QC}bk6xA4*%Od@_*Z;n&7La7D4*9f=U&>IVzcPeFj^#~MebepaplSclG z_npMppg_(5j6;iw^Cy56#Z8)SA?4QbV+V${DJ`D`3PRSRE`a6EF$w8JF%v|43Fw_% z1d46F8Vq)Ghwq{YZRtUKGR~>Uvkg@Ee048 zHj=D6aA|574O9}MsfxFv@cGiiYz)1fN*!}G7?=(fU(E}`!Bz3RP@RB94bSAGY~RC} zTOV8`i=Pz8vw40+Op7gcO$_J;_8JQTOt6Vp)Zxf%wpM17aZngPYU1+RJrh3{Jj=$a zdl^T!-MJwPQXI<|4ArQj3~mD3tssQ6+$82Kx707IXw12C$=r7yl$pvrO}0Y9>~r)0 z=wwIqqcyD^weGFBnCDv!d%B>SgA7>m)#HwX+i>H{fZgd~3EpQH!{9z|?sG@iazkNX zi6Msy(?cnhW>U0g8%1szD}_>VHKR$>Z3%fvYi=85m2@*I;8`nGk$dFRLOpfDF1E*^ zbKnK3JF&{U*!5~h0wg9PdnlSc$k~Cap)6y7j5xW*4L|Y~6hTPf|G;B-UW=HplyKkt zD$GhTfG1S^tZXsfFq*+ReRR;<0_#NcY}YUI%=AxxP~lI>NwBZDr} zKyIMv7?+hj$Pf@r3B0k-Y^rpFE~Ned;&RPA566&WRoyT~a`u*5sFFWYYZjpbQ~KHT zLHzY0eqEtmC^WCHJs^+hQ$MQy-U)`Koosc`+rwsX5&Ko7I!9umbdgjY2Ei3#4t`9N z$y;?2SYG9m+OBnwGq$cX4=33tzS#G&ngBlI*mq;zKnY=U7D7!s=2O@N{Ew53uaN30 zbV=AtnvhnZspW|A!>s74_TwY$YpFU9g#8~g^xd}8jy_h#J!PB<+8F0*LZY*n;HXi#C|LBOP=Vow43fF z3S%L)M*DfN`^9I%=_5Djh*%N~;-LBT>5;9bnC9x-G(2}PFe&ZQmM}(vj^sTOxi^|{ zKIdS%<*hMth^Ng=8LD+Ocdn@OFlUKn_wV&1-;^+!g)Y^R4L{vms3)gU#aO5KK3%5f1Oe7gYS2I4yDcWGK?bLg)AQYFRQ#1axotxINV znMBk&8Yqr0I~vQCn(2y?N$mcHz-FCZY7yXW42-xhm8l;7Pea1YnxT&+EGqysJyx=IAYFM zSq+jSC{Ryg5-bGAq5er4A=UcT4xFo-CZXsMus?rDnA0640XjVEOjG&aj-1k^1F1%8tE^!KL znP9%^Z)|h@hD4HXNj<+0#ed8jw_1*0C#gV zx~>Ia)%hMjxC==v+4%2qmU&T5+#;}_T&OX(Sh|0a0L8FO%D$RYBuAZf#A=dQ7v(}O z?0H)JU>sfi;UI_WPI0Wi z(6#)_y~=lYDBGA{DSC`NIj+nXqtK9=Z8H$1;IDjtzS>q(GqnbzsR`-n~g z(CuneU0`)uSV|;z5=q$rh_=5;t&t_(=V&))Cm+DlE-P_H@)ohn=!mh$}!LUj8nT)H!@Bjm1)ZB&?eh?jX9PHS*FyXr&H#L9ipWLR4>? zzHg%Vjsc*Hk0m)UB7M}=i2i7u9S$sx(pIb#)|zBoaG+7L&QoeQJ>s{9o> zOuq)?ssbdCx{=#^5TI_R1!x26i)ZGbq$+_Nsw!(TtAuE8@BZs2o^^>>k(nU6J@$Uj z*~a4*R7FO{WyOkheHJU$>Lz9tQp|i|-^;*xBC~3fOn{4|AlCes4Lh z^%E%FG&`_?lG1@;2ao9C==kJt=dJ1E_pNKRNwq#>%NM(Bkg-r3x!Fin5{r-xz~VY5 zs$xY~fE;QG%NFLeaBNcH`%txB-{`s;Gn!X>SQIxDZ(P?4!3a8D*+gtt(ulj{O2r{S z?f#8^f7G$n{=vs?cHE0>_pj+iHr)2}`7J-wTe(Mx9UbF#QnIZcLP*>i%YaB^7Cim6 z7T=7`szZi#$E#~9RdcG6vAX(u3#o8fZGgKO(?6<)G55Kt)}!_m=Nft9p}P5U9acpT zyd?k;Abp1Ggdpc=l*_dhW4j)v0wXGLP~|V>zxheA=%YCM=MIn^c`3E zl~WWbPRvc4MGl|l87-LCXn`X5o25|;KeEvBR$dkmN!izKu;=4XByN)77qxJ?>TIjL zpw^)sg;KQIfv-r5A)3Opm-IPV6Wl(y+mK7uUM;3S7w#YTAMF9iqmuAh&y96}BYbZP zstu}zLAk2!Xscd$xqm@O{&>NV-0{*)seFZx!|4G1DwSZEU{ z--K5&-KuB(qGey=Li5OMp!$*d{JI>OGpa_FexE9b1cBMtz*|_j(4vDR!-xPaUBU!ruU;&}qeCz(VDkt-c9*eONCJo-aarIs_30t+ma^7I2?%2MAXc=)LFjuh9QV zFZrMd>T-#VaZUf*5~1>ize!Y9G)u?jt``#wkqsO?X9j9^)Vi3L0KcVc=T*zICov!r zKuOYLJR)24Kr&YOGISzmIo28bK!IQ?gq1-AT3NK{y}BUX>rSQ@*HL++35e{nZVkWF z5$Th5)vM)tTFmIj}Z9POBV%9+pfKlY%C!q5q*gX$9&n9?)^0!Lz}7E}OYi5-3&rf4hA=v_dPEKSH? zqwKGg*k^++qvqhoZg9jA7kE_B_acu9XxO6n;obKf->0;`Pd|rzfDr-x(gU3Ye?e>I zds<4Z(^ZWlEzW8WuEUAn$b-BmKc@(JWW-r9>~pX)eM0VGlyjQ8OZ}t!`pQ}# z8_ODZ(?JEy6lsAF=Y@gX+u5`|-||`xPcJuVortx010UF(m5b{*$Ay zByw68)8cOn!uvZs?e86*V$L$T@L^;%=Ww1c4Vm`5HJoa(1x&t-nFyfzFdcqUJe8Kn zu$L;ln zV;jR8MCH06Rg+;h>)D9HN!NK6VG=wuXVflgi3BpXYI>B+cI2C5L{84-^McXBO{{Qq zj!|(H6YocGBhmO5b>`45!(c*r&2U1QSvNZ?XTN;) z<(K|%r=VSC!~B@4DhX+$2*XEqg`Hmdo^SfW3ZM|6cO-|e;g{6QL^#+Gx*M0oU zv#*|S`6j!NvQ>EdW%I?0m;S3gf(J`?Mjs3J?iVj!Y?!AeGsm8(EY{sGFE?I>vA(Aa zqJ2f5tbh6P#g||CZ+DJP57OOVHr6-33cZQm@z$vm3r82fY;0^kdub-m)bu(B99voa zvhnPzXJL+~xl>G>@=^b?@%+WJ@TRv4qV&s#lUu^)`-F_}%f?shbm!`z^NJRD2qHlMxN3JdhchoJnj z`F!)Mmv&L%gu*Vod=Xx8dgpGVp_`#q%zxQhUpHHI1eW{D*7NoCE%O`!ue@{DP9__* zwfS<>Y~s83@wYFwHeNO#f8%(Ryz$EyW}9iTrWteP;%EBhmlw}pei;b#aFWd&*?jdp zY}THQY5&Dd(@-K<#32EI*1x>?a^tJ#p(944J*D&?+&Ozr+$dbLm(SL}44ohC|8Pn+ zk6&Is-`ohF?{Yz*x8;?4VsqUPUib!U3nMpLe7PQ`c}hsk?)XQYyx4mAA~azDEpFhx z{Bpxg*mXN9#F6V;eD(a}jTWq$ecxjS0+ z?IBLYefQ;a`)u3X^UGK3?yR(%yhd4e_wB~!R`~Y)T#Dj>9edEbU%uLW@$5xJ(-HX2 zFJHM`4>ZyN@Au1BU%j-&6mP{_ot)4 zf)m7>ty64Oa^RHRPuuBDb+NVP*yDID6BO#T*rL|oNXV(tA3mn-_Qrtz?@?{59N|x+ zQ%^7TcDmx9M6@vffXfU^I$5D#kipSjyEhha@W?Jd z;yZUA%YuZt4cf#e}>$u~oo#v!URybD4l z$LB;g2wjT;raD+NS(#wJ%x_!+r(sNMHuZOG7u%&7a4#K;_|r2ZB~aSt+UUBvespDf zA)1jS*Umi_yset5cah~7%NPd8c`Y9UDsn``hJ+vMVsK)thk6we)_WUP5P&T1g_RJD z{5?+yCs{a*S2LW-FL`()@TEgH8+X*UWH3*iC^lVe>mTyE?d>N|p6pzdg3H`>lBs#8 zpzIz#LC_X~T)2&TM@c_U^l-P8x(Dg$NQTBMcZQT_KD~;+;>JOcpwXQWAPKc)`9Qif z0yf%3AFvbTn8@Y;(ubF+`01{@-F0$Lr18^OPQcr~b;?WhVS36|r61hEVm2Gg?0ASJ zfBmGE@twh*vrEqe$(Lpx{zOhdrCnm_bqz=!rpEGzZyW~FB_6v+c9C>V*lLj8@Fk~@ z^NdMgrjFfj=+vMKdy$t8^BXayKW%9?Va{ZwRypMjM?cmwx>$uZ)!%w9d^d!m^xYEX|6bZ>ds6J&4n9!jfvX6l>unye5}HNc?4zx zJ2iYNJ1E(}nyx!-vTl)bg$KhuiXp4$_7>qZp&>mSX$*K&KfolSdHRGd46N;%dib zr4>Jxaq1<1)3^PDdt4Ri+UuhCk%vNsg|gt#cdsq!A} zs|BUZYF7V@$Ol1$Re1q#9b1XVMTFwa&bmw2H|$AtIfRmKvJ~z%+f_K80P@aI(iDE- znD`KO)!L+>xsKFV07ID6mYMn+S>8hYL2qZZm{ZU0YNQf~bft z1Q_QOkFDl%jNj+y_50F0~lyTwSL80qEP)N!pY-MCHcLyfvb9k3v zRDXyCcQztoK#o`X&%|R!^(D1TW`r(V*50iqBcA|uk_?SuS}<5f%gYH(eEgLhx=&OF zAn%rJ;d(LB#Ur9Ax;X{&kw^;g{3CFih=)8%=J?!C()5jRByCYSQo^6X=sXYp~{1gCCe^q$JQtd8xa&5dAY157?FwY=+(QXkZjGBJCPg4o{X}( z%BIE7f~)9T>o^cdN69|H@4{ioiH&k+l^5ph@m<7BM{KFm+0k@9dKtH0I@O z+KoVJY|x^!YGX98D6N~iTX;JRT@D_WiF_s#H#1fziz)p9<%4aO3>3rLa#eD%iCLbH z6o$4J8}rqlBgl+?IV5wIL$hx3d}cK>qs1c+MBOSiVFZX4C#kCfe9Hh-jzJV9!}NoD zO|pt|x5hB+%&#X{siD(UDpYi0NGeB5?wthnmQBN22ULZ9u&yci^g=j7K5_RC$yf!~ zgQvQ~oVp5+8_Lq#p`ohd3UG@GQKQ8T;hNP3iSaj)s2;NW#ugVqSr z5_$1=_64;3lDZGatLw^Cz!Kmg-XjdB9Ay&P>=qf`s|mrhF}a*|YeRkNP}2s%clN&x#HMC39651uX?%BlRn( ztT?)xIw5>WFdIWXexcl$dKx2gWKU+D9=(67QAy%xSxmv{f=^F&DUc$$T`B##>wp%>sCr;CldJRrO zxZt2(;-G>9uasJ`AD2x!!=lbTIJ4VwTu;mc$i>Fp;^N2s=x!vQGL<c`%N z&D&1yz@Yc~8}PncGnT3ESEfI6_qjU<3y-r**lkW~8gY7*+xo&W46GGhc#@DWf{X4A zOCu8VLHdLsmr<8TfRPv=t1!m89o+2+$7)6iEZ!T)C=5ovM zFIh#K+9*E|8?DYz5MZZgcJe+bZCmt|Q`7xD&`6NL#|Cj<_E`SRw|EBa@6Z z)_1yMA1G`>6kHoBfL>JAv;^cs2yWde(E=>om_|moC~XKTq!E6u2XDBO7z;}WbcA|5 z!!`}FydH-8lh350wx$(#BqA0tN;wTmi>uP5EP1g>KLjjL;TAI<>dG6LMV$;mEqBrT z!vO$*hisUqecGWQ%~NpMgbQ)ijC?4##Y46Z@y#OP3(adQ(&sWGxskL;P$CMYF9oNY zgH_5CstX*2{rW2KT~_Y+RTQU0n0wJDdfcR_h-NY<2`K1mAzAoX;H#3D%wkUVcifT} z{r;t$8Yd)PHp#TCmZ_fcxV%Fo0*4%dD-i6|aGW{yt@X z8zE1gjR!0XKl&Dm?iu zlsz98PSU>NOG}|0p`3*r)hbue$w=rXu}p8#HelAgyrL@L9O&r{QP3OA8$FdtF#efF zaf6^rr`N=hkV#+n!0#H1;!eOuXgw%UCueZaXsB_%gHLWJ#wb@plmYb=rb8TuYLJi9 z6^29T>u0MFxJezE7NLCW%3l`~N?b6_G^Ecr3NL_!NuA@DKJs(ByA4mw^G|(*kJD55 z!*PV$hI>%Nzar~-LZB^Hl7uv7!pY0UEyxk6!L=#U=h3*46* z=@9_gh4wneiu}{T5P<`ZFP*!N&$9}Toe*Oq<#sU>C+x@k{KDz0H|O*6+>JZDmvdRq zkq+Y@bx(0cL`NUQPu`#ILt~qUYCvvn=aV_!j{Kdg>A54_N&UH(LweHJi;My}#IsbK zI6CJMYv?$AAUuF3qa!vNW)~Okek=rn%&|>A4vxcJC=>&dh87of{nhB*bsoDQS<0SqYAH|-WwSNzXZTXd2HAS<^96^^O zl6)1KhR3TS<%i~hg<(Bm2poIdmnHBOozg0ZU9O6(3N+2Pa50CNzyRu=oT5<)10sluW7&ZaKk2MVNA3_3X ztRBdpiuXoKsO6k5vNC=LPJ32g7g__?bmTb~ zMUIC=Ch4UY$a7k%-mWeJpaFg?MpTeTxShg4n=aiV{Sha?J1CjB;^KgQ)Kbk}QuUV* z51>O+xqIo}RiTrnN0NL%-r#Tq9(Y1ohgrhQ4_wfQIHs2#K!=bXY z=iYW%d>SluvZk9(O)J95PWs-&tAU8>rHRW@3b(BnHCY!WrHr&Cxo>a>kZ+yMGvptz zJs1cu(m^OmfTT@UqTHN_r#S`)G!r7GV2#bESB_tt% zfSDxXjH*S8@tlE;DHbI-&=)h9-od^mSg{) za~dF!$ZrvlR#Cb4aR|+4`k|ybbi=>g*Gq$?kvg;VoK#Pf0=7X`s8cTx{I8i@IOcW7uN4*Q;D*h?%z`k~*? zTmz03==Z}CA;XH3z(|LLxjk&mKIN;#C zzY@nebrTecON)@+AlJ;J12S!nxH8X$l(R`!q{@xmhfo5Ec)Jwu<^3QS#93KZlnO7$ z_0o_ZYyp5;Vt+HX3N=v1!kkF9WBi?R&c(RASj6Cq5MbRptXN$Evn{AvRxU73)EQZT z2CHJ|WpXK4)a0|58B)P)WF>-yc;zf$GSm3oYldSgK*=>;xgRGtg~*DXk_?Pb3T zGla_p4a=}=KJKFU6DCHc?kGNhOeb7%#GLm% z&!D6ji9fbtuQzfxPIQoW6ha=HSQu)9v;r z>0p=+N^X31t;my%)C!fdPSpis1}u>_s5v$Y4v-ppnH{l)w{Tj;;(`KgVV;VX*n_#X z5p2ZHW=jkVY-s`16c8^fA7YQODrWDbAJsntrkbY)Ur8hLK`VTLD{2~7@8n$oC7A%r zD7n9wb0+tP!P>G4SfQkZ)RLe`5gQysoj{5UVEF!N4hWM9;iS%CB=R&{lx#fWfMtL7 zi>e)}=J-==L@zQ+u(gavGrv|TBSxCm40=|V*_uzYBhO7VU~5XfjT#cC8NtBIvt)KA(-xggVoOe`Z7I<Zwj8Hj-lXnA4&dl zF9rW5DL#U};a7kOQlA3R^%wt)_kQsQ?$TEDEED^HGV0&93U*=idLJzFzJrd-^bRfBCxLiYFZ^ zb$Ue!C-=s+r3(uOh6ZU@#}fj$nT7g7wS3K4 znj&;v#?qyVo*q26B6M7BHl8Y|Z3ld9fUET#pE_oEqY;21fLuU}prg-%RIYcgPtJK$ zvSD5hO~5kxz=P<|+>V%;Y5r1f+}D8T7w?r)qC$fNMz8t zbIM_`yX_?33&8fJ!(nbOtlip>+q3=^;RYGa6 z=ENdE)s>wS@b%XRr^iRD!uG#ddGmJvNBrx-$G=#4yGQ?ZpND5r*L1Z}B=uzH=Ik#-2tEJT?W zS5wYSV5>XnYl)AFlR6=qM+P75gcB!itrV5fH4aYcLi>SSwy3-)r~~oO`EgPzi`NBP znEhCmCNP;y4-Xo~aMg8dDzmB`jM*zmw5P$3aM%zX6O*BPh zygqES@N2vy;8?*7Y$CnlqpDT-SPrH_N5KZf9e$9?4D_?hj86UjMb)Z}9{eG5%2m3| zoRB5&@o_2CQVZ3o8%l~pGk|~O7LzhYp~8&z<8MAeH~kFaCZ9K79=Fj8AU_dLMpVU- zHNnP^)i+$epiz&nb7gF-HX%5$|G?v-_kt%$>I9UWgGxVgXIk7l)l7WQo)a(%Nve|| zW{z2=XmIYu>M@kwA(u3C3&wqgE^oDNu7G8$t$TF#x!Eus!a@Q{(XTDsc@TijdZw;q zsNEp_aA~;G8w8YD`8&wtA4_zwZm4RV!D8kU$}+JX_@d7q;^PCSt>XRg-~5$l0D78fGaZn|(W1ycj&1G=jz_NW2wOeqDU-1j4Cz|A_R&7uifDppv&t(50$UwR;9 zLpL#`K3hgKj6zN0%=C1^d|GOe9O%csO&x}mZH=Lj6UPT6gka7OY&coA#WFvD`c zp1LF`)&%l*1Qr`iOTKFR@zf8gT~GJoP5`bEUNLRfxfK1X_O^6CCX`vbwaX9jOj+U~ZQtMfcYN{NxB)F(HTR{K?vlGGX0jHmBYe8kd^H!kr{(>_aF3=@}cB0QREU`QFaij#GnIo}zwYmn&ef zYC?p$l$vs+MoqQAe8h98b=}>PHCozI(V{JJ5tLCeXUe3xeIUab+dnw}3JDXT(z;tY zUnw*WFG1M$G%V073h~c27XIg3-dR#_?hXxRSqaDJgMdQgVlWdGWz+w z6zUQiF$H|Xe&n&S9FYxDN?CQkv98~$_d`E@FbG@<{Y(FC}E}{?OT=k&w1Rdbwa@i&;5_boJ zfs+$SBk3=P{2co*8SU8(Du_npvFC%!E*3kQ=DUC3%wKmp$YldF)w0(*z|X2!l$rSmQ*ORK5V>ZuW9$<#2yvhfzprbCvdyda^vXg#lwA zUW6m~HP+bOiQPb1t`7q$^vfgR^CzN{`X%fQ&;epib?W~PI}uji?}e-#`8KNi_QN7! zFyc0c%=#OXeGU|TLawz)Xcj*hy<7vA48pLNrTJupsVddGKR)Jxe9ea5=9LL9Wm@l8 zJ=p2Sck%imUqq=}QFstfby*PicY}3B4#Eeg)m;sTgKRmNAoV4z40z4Tv5kzXyM|gABr*}&0zmAU+KNf;*T^SA z^zR`ws&xxrlITmHBREd5v*%Ud%ry2W_Asl~?u&t`?%?IA@M>NV;vnW|NFh?7YiuK= zF|I5^KON;o<{9E=MQ;uQtWlhsLa&q_xJAa(UAoj-nI-n&WD@NVY@Ur3wp?Ae*ck04 z=FOiD^OfW-Ryi3I#Gj<)W+M~7v>p9gFxg$02?j$#FxH}|xo>!J>pK-PUJ_Ky+> zLu>Z_hl#Mf&h8x7)R&s2P(cBnq4M4^OKC;jd0CFdX4pI|*7j~$(0$v-OAw^kQ%c8S z2S~W)Jq@{w~yxF;O4&T;{Yxu)#I1ptuE zt$vw{F)Sa8I@+_6vTS(}9EO<@JQ|^TH=Vh zP#V)y3gx<)q%yWczgp_*q|hT)N0ox;9{Sq?#?K~!s1Z}sAwHb#d~@nq^?O!CGsDwD zffPMr-oEJ6UVV_G+4!hiCEnXga6~S|9UZcW)En*DYeCQfZ2oQ69)3XSjQ)rfRCt9b zc5x&8`iy?PMPq{hEeS6^h&P)+hal-@yiS7@H)Aif~m)H(g9FViR^tdhT8#Hx`J^+Rw&db6tyxc?LD*O7pVBaO$qvF8vaQl!CFmr^g1J@s#5>hO=dB!V~(PscIC4O*nvFkm71(TK`lK)#Jo@byD)kGRf< zH~!GP%PXogiMm*Q*c$6}1-Ts4yHzEW%p=*fcL0_k1qUm6!w6f7sY0 zhUGAVjjV6D8qJ{EzzsgyF*wNlcu0j-b5e)x{jAf+O6Go#ikjK*ekVcDvG0i>P14 zJlR-ujDwMQ)hiDvAgdx*pZ6|k`Zk4kg$s3@cL%T2&+iS)p{ZaliKb>LR`S8sAoaVm z+UUhYnXw{yai@jC*==+gOc=3!+AP9$8m-AaB8iG2QQI&s_nYHa8U1>%ExYsQiu*$Hn4JY2grs)4{NDZh6-l|RFcl79=}6o0AuJtHFAoQ= z_%4XLPsx9L$4HB;>m|P?@g`(B$=ay2_Az=5FcGSP45OONtEwfem!)R)c9@I~rY3qQ zih6>;N|vKmE-<3^`~bLmDGK-%A(%>RS00*JBxYe%6#NFxfS4o+kxBaOTPOUjT-01{ znSRYNd&|D$CEIa|xp&TTI33s}?kx%^w@Dm+NCxy5yEj3xCywk2p;6uuGR7M}R1^Gn z@^RTLUr*up$cmElkg8nJE-T9A4?CpEDwLbc@FQ#yAoD>I@C!7pk~j-ZEdot91_l6H z>c@SOR{a|LpQY?m;LH zjY3Vf27m^H!N%CEJE&Bz%$xW-tB%A`k0?}>Gs0KxFjj-6Si~)%P zu_zyXi0j*(hFX>+7o;SgeU84~?)k2gzJ^hBcSUw{#07FKRv#52 z@Se=uB(fG!)Z>wn`MI>JL{IGc$lI`Sc*9f3G*7)rkU|7WY;VjEP${OkY26dvn>I^B z>IN`=G+kk+Rei~Th|(vRTq4<8>4LL!H@ z7z_ucPpu2LEG2;q@r#fq?(EQ;`|F?moA=5{J^j$X@+nhh$9l#;m}$Db>)@%F@J3G! zdDw*+1k@Zt;}~(0P8MPsJr5x}IC**|WMuRefP>y$H}!o!lCq&-rJSGX^kd!vyh2a{ z?mWV#9u}SVhkh`CHSZBa5BN5+Y^7 z*ojN*2KFg;wkA?h@0P=NrrdU#p(Mn_+L4$yUm)4!{%|gdmXXuNp;Vt600sSbjH33# zIDdC?{LRVEp|9U-BVasRS0ZYFWYl@E5J49T5%J65+Ghe9A#IqdAw+~>NSt27vMxcQ zR)*{eCb^GFrO{5EFls)ka&R;@vSDc?*uVM44vTV#{E_uog`qNt^RPCy+j5kU6W3vj z%!1^;rXTSecE(PYs0C)+Tg?R2H;qk4JzWyXy>)Udmp<`np>bx1EL^A*pumxqj%dp? z%uEuqV>7^Kj-Y_F-z8bv|>N7g4! z@}i$WM~_-3JCcTX=7ORa`McG~#Qu#5N%&&LbisB!FJQNVxkWnAekK|4CiA|8ln=%D zwxa50^CkigtUI4YhywRX6RUL7kE0>`v3T+&!+;zaHng zvFj%Nu5-Y*o8RZNC}E)?f#e;prj=vu*a=O+)HiM9*VvR7L+n5sk#H$N_7fNdCfj)b zsId;b{=1A^gE&IecYxwYBrFe&;s78shrG~W+x7gJezFm&3=#gl38nwcBGi5rv>US+ ztyQS)GB_H;m;bSqC}j;Oz{FCZZ{ntNP4!r_smH1E74Q7J+S7~}kjz$w+}`%qOtqy! z3(4l097GMCu?By^^FWBbhY8_(x8STATntbIe1UAzBit1MsUW-twLK@D@h!ffufgYf zCCY%LgM19@*M4jTv5QyNa%2#ifs6plD{C9G+ZqU=;LdZZ0pB-THRot#+UR`dK7zqQqCSD)I8bgg)0zEcY>enVKs@B=nPi&xr#kU!MUVPB!7V}IKy3SDC>T0KBTvI*Q0d-Ji|-b=4yW)|vFolPFIO-1R;F0b zn>0<*q=k9YPkb$C4yAZ59>-IVr`0Etu(Po?AAh6ysXvx8f+{Sh(4IWQ@LZ8vLi!{Z zm&7@F%VUqAd%N<51n))z*T~;zv#vfk;zjV`Z&;2n-BiMSJ$!da4r0(2l{VDqgAIcD zIYj5!$m%S0T69QHJfD;EnLe^|@s!!;Q0Zb#lc?k~QwqG~===?}DI zBzaSjql@7O{@}wCcTRT?4v>LAkN5l6UKVb^-4})KI~qhG@@3>)w^CYr{43<9MwYp2 zaVL}aBsRr+!Uem!tXNL!d0f`yfKmL??r;Zx2Z-s4XHJD)JhFJfwa8ZVYVq;_Sxw?< zwHCxV+HGaVkznFZ0?{|S(o2S~u+!H0V%fPqI;QLo0kLQO{BZ~2-n%N|fHFS`8VDkX zcqRa7K$pK+aHf5FP^#=A9;YuoOgw1dB`G`c$4$_j?|Ua;W@zT2Ui+9SKy3HwhHwO9 z!IvADXHNH~2h!%Xy6>1$;-rL62eS0m-sM`aY6L}ll=_&cz&BAjn}7GCQDc+ga#tmh zl3pQtXgn8XqTN-F>BO^b&rF^4z-RI%HR}{8A&oJ*}Gh8{Wi?f)8 zYjT!Q?D0&qmf4rYV}HD8{W!7OuZ>)XkE8dwrmcosi9-l|Qt4|?@7^U)%)9LzYZTZj zWshwefs*p~bF{DYP#C=4*^e9lwOe5gh4bm>60a^=O-u9fH57K!55Jez%aK!2-dB9o zoRj8Jy@!;wvxn5*Fl}yYZ@R;haq0!hrwkezC;JeAq6!r)Lo|0ohaCeVY|G}p$7?6< zaT66n0*`3L>KdYs6j3uS@S!N5Huz?J`QBs^GRMw0d4bu-LtbD$a5_tUSqiEa^X*ASJDRXK=a_=La z&kE;VKnFCP@(zrfQ;>q<%HK-sK{A6}1`y z=6r1ZDUmf=L?ydYc1}CqA!=T#Q6Ci8Kq#7?v$U>W?PxI_=i)Axrb8-j<&90*BsXl- z#^+S&o3fd{uVF<{b)bSQv3#;r}<} zf-{k758rkExsXaa-FWnx>9jV&%9(zi{px<6wfh+i1|dbtJD4>O!h<^KR(rf)IlG$a z*t}oDP8U;3I%R%LcZJ_8vq|=tJmm~`kLfw9iV4*41}+sgQfe;L<>j0b+%8Ort`5Oh zrOD)77?KA0+PdWS2>g|+z0i-+T1{rJORXuUk=W4yN-bI7qalKEgjhCZ8;2tBBoPdr zhE2^s&7(c_4t7%mqv5K|M|Q5}vI|!uW2I-%&x&#s6?{ZTCKtmI(G`_rYo-uI7v~@* z=*JE^4EQsY{o6bIkC8au`=3wZI|yVbrtH@tDpUQ9ro%;SmPjpIoDzz4l zk|?L9HfEV_DD_d>>{pbZ3q%rOrWzDi6V}?DSND4gsVJxFb~PK<8Bi?`9UY(TZ#NBX zlrO=-@V6SC6-r7$0MQb>!hTP4|hRo8;6%^r(4r9`19JRYv9EJuK5LUIE zUnK0Yxct}!D}+MMb4Hk)28NDOZxX~*Siq7pRUmbY=Q=_wQ24{p@SXUe2`!lD>^ zEN7I>*$%IdI5CHTCH+Rp0+tB41w3#Bwx*GIYVD26gp${jWN9(nvU`Q`?r@wG#%0(6 zym@I$nw>Q-4ju+=^L;2qKJ>b=_n9NJp<0PDlMkK}USW3*Dg#P!Xpoemi~`)+2;`*U z`3wXOOm6z0!VLiLgF*o+2B;>YFu~`;>uK?~MOSvN>?hFto*F4la+W1w#gEDWfW$@O zr8KSyh4<;4iBFOUP(#M|R?NA8ij_^&e4?NxEpQdLz`{31QXJc+p6dd5j{9q79Vl44 zTsATLX{am576Sj?Vyd}*(w{~l7gJn(K28cFh7JsZfz^YNH0BSls_Uk;uD^0s-7RES zk(iXZeEej^*bzPmLb#+e#d(*ZoyT5Ql)}=MBfY^mHD7~ ziclvsq#%peNxw}S@D?Ah@A0B)v5%~@xbf!E<6bg)#KZ4kfo?zC*e?H6siAJj;vY-8~`^3q;D z^jeUZ)1SyIDD_u@Ak{%_k6nmtNCgypI+-oN19qW>d%oT~I62xm++Vf{K~}t0P6rak|NNo-@`5mpW0g3 zJaxm{SnvTJ&)G zb6%AxpB7{L)KZ4mIY-Bf@Sp`MOeH7=JeHe-%sHH-rDUk3Z+tR~xeY1cjcZzXTr0}8 zyv()uwIqjWB8)$pO3V-tDaD{y4cQYaykup0kTZ59~ds7_5vV?Tqoh0|}eSi1(@ZHYQ zPyN%MPS5rayG$02hSJl;G<_bF&<~RrU*7cV#T5Tv)|{H(j zroW&xie>+BLN&kXNv?^c4KHd0R}qN)T?6csl|D8!QJkaeMA9>G7+;_65pz|nMMC(^ zE;Lb=VIxC)2`#ytkEAaZ-L4iz-2@IjGuRLI`cVW3y&e}A;;6Z^_zi524dLyC$&Y0N zb5_!Glvr!LXgP%-fU>x>I#&7TLfCq~2S@oFn8VDq*j!BNF$F=A z@mMRBl~XYr(%#1t<9^(zE&9L8R{l5QZf9LG|$^M_dez$YtuE?|f zlfRe>3PQ(`>C+!VgRCF!U@m-6^~d?g+}qVIvmqz!%YMj9{jsH7HIbMo?yD?o!A{aH zeDA)TQ?RGFe!eL_N`kC!=qF@-u+!2D6GNp#3tik2NFRPa76t{;|ZebglDdP#AL@@@Uxnh78 z-Y*QG;Dhe;(t57N?z~G|x7{LwHE@9p9r|KUu6ta%{dYUN-|c*}ADO9@q~trFzGJXo zY7^O&+E^UzCkl6vj_jVjQ&BAB?da=#(k_Z2eE8G{X5dXR#~)YIML(;TQRv36)0O*R zRlXaKwAHw{7)q$=hpW*=SEwduMan|hDw0+f4c-iahX~FE5^SQhc-mEtqjfB+RI^_TU9@exw#whH?*y_`kcBI=}?c~G5WTBeudl4IRxCCVfD=%COK7U+R~vbxSE z7nCetr{CJk}YuY^4qX;CRl_e$M%emtK(H!HmV$MgrcyzY)Y zZB}mhEo1rA9EK>dZJD5MYB8>r7mt_tURd(U+oaL)L3D>qG?6<7KUW%t2 zUG~(&+hnY=cn@=3R%Rdp5r70&*7nUI9p!MsK-q)i*=K7w$#f#tGL_tu{yj>%JNnkC z%>76V9Ca5Jm?GxErJ_egS>H{E6%|A6?AxFasL5Recgc&O9N$6_Kywkj2t%&i@cS`V z!@*R{s8nHv4?BYT1y|c1Moo&hV!c$;@P35B=ky8#nm>nip`oWVR0-52DkbnSjLNf# z9*t&E3;s2GRlGHXbQRn>wTT0m1a(Dui~>>!SWDBgA?l?_Q_&(KtB3#gys?LqMvNW% z$_CY*W>T1oL@3e`IOg^Bx5uYvXFt8$UuL_G1Ss6&4^Z_hEQ>6cw`gh|XVuOUaxW=h zqFTH$J4bZ$j2*i=1_i>T#cC7-Vt7#aUWXW1DYsk}Kk3_; zKR+KWB7bK>pB^{q;2>1glhj$9 zRxTGsKw|_z5bO$%hIVWF3fYJFhB6H1R5`;VOT^B`$ZzNQVVZh$23BFVnTIjOva;_qWsP~zRM~w-->2AYxfukMe$ENE zW4{_9H#ER38WcviWn613!g)iv!MFSRxMSK?G1`C0io?C^cA%SxY zA%yt!I+F|l(_OG6J@pkdGY!=>>3LyfCVy0kRNYcRFQh2$%BlQwJ4x*%4n|(E`Lq>q zPLDts*ms<;4!$q4Hfa^>5Ou<>-WK&NocLnSrCL<>!nby4gNJ87ZSP7(fb2f^CyI6V zYK{ruerVz>UD6w^@rhMj@zPzFUd9R*LkvN?QJIv{deEMwB_BKHDL2f+$$gG7MU$sm zcQ$lSw!<+Fci^jh0yEbw0-0y5&lRjCnWC2Bo+W5ub)f59JKguGe&`Mi3ahWw z8@;rCwwlV%+SBxiB0iY58oNce!P7PEgFB*b(aqEPna}wDx3ufW^?p19$PJO%=QMU_KX$snd3ky6x<-}&0XLk3m0m$D zqQt}O9RKv73_2Rl>J?v~m7t#KKE<&cF27wB`P$e*+@oAdX_Se8(OO!e5v%2rM1U za45SccA2hxO8=SA*H-R&>CYD7`8vDK056+Wf7<*@`cLVWr!W-e3GM#PPK{G zqT@Ec^MCr9-~2P){HodH=YGHO*}vOA-Sxkyrs+TZ($-mIO}`wgAu2{5A~82L=<_QEC%hD>d^q z1cfce^I|q;@~i`WhC;MFCIY?@WIKjooZ4!mczH#RE60qR+wK2?|#zA_w20>!{NA(UmQ zB`OBcn^U z>WG9a1iMxceQILzdRvVM3|j)5z=q-8m6wvWZh~w<6yu)RRsHCev|7yi|57c^7ZhGL z|9D>K!>1eT>+6o=w7zqDI$Xn-c9BB6`hh;`Rv%&gkZPNaMywKx$vIv|vO|cy5^7g- z7AybpY5eAS7(!tA+-*mn?+C&n;M=+LZW@^?Q_=N-ONp+HtjX}{M{c0ZQL=sgJJz(t z<2bp5;Rzx}Hk`u(uma_@D#!h|t7NAseBGZAC`Hz>cN$^rE^f}jP7ce3=L|m$QaaKX_7|EbC{81(soI10a zlY*UmOHof#zEdQ7Lvg2RmHPd3J$3)>CkO68ecDcMs*9~Pq#~}t$^~21TCBeHpCw@D zKxKYJ+wF}3{okY7x{Id#=;r41vtQHqlS4PdKQ5+e`YhdexxMw}_VcZD}2YK<7#MsMTG&8<|lNVNy}9F~^0YfD%jO1-iE z#$ap9rs#4^aN~It#1awW^lazktd9a`{k?;e{{GR~$xqO5eLaS_2+u%I2n;cft&*M8 z_v;?qKiX^e#)k%v?D8YNbN9jQj>U?V-Bm2^vmXBYoc_C+zJamoG(?cRLG+@S6c46D zV=zWEiby>*YF$qyGDTd8qY#!&1*R@sC$Ln_3I#zUf2br)ig!%o^>v6+xtm=oaM_2K z>Q@zOa$IuQS5)HnJYuwXS97!;en{$B)vCc#WG0Q*EsB>9MUrB}o}K9(8AQy~G}}N; z-)_{96{)OhRbcp}my^X_M>8_-a*Ss}iwA!~do2oFq{P*vcmPS1zikcNeLt<)o6)gd zoG8^W&-Khm$qCb38(mk|kFIP_45KPKb?&iv@EH1rjDT3iFhI^Q{TQ;^A|f^<{A&uT zi1A8NcHn{eKOE6674n}^{0VePF71t2_N-+rU$}IJP7Ek1gZwh9uf=1n zl`N>Jht$Khh}iCUEZCvTQ0E>h*G95paCq?twxxu6Q;PAz7mgDzp?-QSGsf=l!Vw!c z8J(f$L(eILWR*O@Tpgsj@N5P2NFKzO=HhCGC~~V6?T|F3!)Ir=2ZQiF1Dbw*%d(3W zUUxi$SWrNkS?w{vHL-Mt^$W>%sQ}1Hng!3bxSEm|0K%5cUknR04K*e4PQ=VGP&brZ zF&hN6pQ`iG%H{Abu+fctK$-zU`7TE1W2MA5_qZ-TsZb#BdXd{G=?AQ8eOALmXT_X@ zL;a2s2{VDAl=v+Q>1JfjVcvgPFi20{k)IOHMpbb0l4AZla4hSWuV*=P2cM6S84Eyo zrOkxpx<8~75YtlCN0voc7>%8s)Nbl?!X7o%`?zt^4{vkiPSwnMC;*(>>4s&%CJzRK zrPas{XL(mb>DnXVihk=^jwjoQeW@j39eQjk00`4~*hWG?x+ zH}I?+g)L??T^FB$o^etQm1ax&=KUN}Zvltr_Wk^7Z}VPa!vq@@B&YfahJvH_hf7f} zOXNRv4VO9sqZRICS_Y8CDI}SB<`K?qeNtod7vV?uL(E|)uW8+Hm7@MkDNlsX7lp4E z6Pgc+>KKdt(*`Gj444F`~klE$YZv7R1Ur4Z;|US5iUc0OkmTMmeHBE_`195!32 zc|(ew-0y}IYPqM<4!j4FOoF?~kz2Kx(#^$8GZX-I-0#jBR?Rcuw#9VeeI3Ci086*_ zcuqYA)tcpv55IRDuekI<&5{r(v+`n^){@B>hm(xs#KJ_-%f?QZCe4^b@abKvsYmwY zD;k-5gZOaz>>85tV#!)J!Mw$XwqVq_*q(9>u3%cDpL|;9Pu*MG%*J(o&%`uxDAWzm zcRuB!0NhO&!N^l2#hTw=@A>z|QO)Zqj@j-*awzKoCyw88b+tO;thA=7!MW&Ao zp5VYieU_q!pJQaA4{lUWM!#HcjCA^_p+0Juc8H%3Z@EXVW~uv#3#XdODI%1|GB%*2 z33`QmpSxOap}t4Zj-_pp1ESKrkN`QKCP<#J+<31l0w9(<;wa8#3Ke~R1K4c91{s?Q$FBgQZ4?N@LNYF;S0oRL)JlBbOpS6m!;#TZyl?a)HX zI5|X0W*vnOqPZY>CXi7`&s2yQe<%2QL!6K_oa>d!S`n}mSm=sMfI|)UF>t=FH)2H) zxWb~EkAe$MGg8j!9MVYPF~_Vpqs9%drg*(c@iXhxjTYX2-R?I;~&R$n?CA`tddKf?*)M+?CJndoA%|stzOx`!via<@G{He z6}7dZSRU%Ue%Xu2w|3Ikz^LGq^xjr}Zt587<#PXn-013q5Rrm7j~J!UPNfN!V5FWE zn2+K!yZ;v1vgZ!A-jLX&@bS*xm4-wi>+T0-!rw|}hBQ;3TQ54JJC*6B+(nj)- zewy?4F&Ct8f}?yupxiQpS+dVD#8u>m5KTLdlotXZ#fGO!3m}(+(9$D!t1<9jwTsccPKO>qyELnr?fKj)5U zpJJm{;d@^<>wcNd9WPs1`dCzip)koOKu*X%T{}6?k;0N5+CmqrdjOAk_p1ig{N|x} znlKobd~GhS7z+TRAq0{SV~D2%F9owrh@trsDfOGxEd74K#-Q!LLgCaj4$8?Pu?IOm zQk{!)^l;rRsHzU-`7zQF`1Rt@qf9Fj0K5&E*TOjI8!a3E+)%<7i8XOL?x>koKH-@kPJz~H5hP1zq*~Ej1k!6 z!ed~v$j!MB=VWF*=W-n9m*ebe88kcca$EGst{dcuJ5!JWjb9?v!xY(Z#3p`CYm`Oo z<3jOCZ*+BCFpPjf!SMDQ2CWF@--d%gGg*ABmfQ#Yd7n*~ubtY6YnX}CvJW`7gjbS?>$d6wAATJ|6;Xe3A%4H0{`%0mj;VU zU0mKDx>A*lQVE|Fov9}f<3eoKtoY&g+zXhuQyk=6I zH#Tkjhg&D0hWEk^LbyO!WXJgCi(+0baLOdc2EG7I)BWD)HL6J}zx*&N>*4hcBep?j z(d@zk_mBUUfk<*NN-8*A&T&lKMoblvXj}|&lU;h%nT|Yk?s1uo$Zbsy)%5VRzju5p zT0IT0--m+EE+k40g#)Hyz!xfaJtQp?t7vrQsg}a(NmlW4H%khO%EbNQe3{USZ*tMa zm=+stn^tTw4wC6L1a@hTM$$K|!&ehT@gL-A1a^g}W(nQ~L?CT5y$Gl zsv+(A#J3ta(pvlg^EE>h1Zd`T`kqH#iyarCdZ~$`&BZ1+q+X;QDPc!8P3w(7Vmy2e zdMZ0qglsV)`1+vP7)Ja%fznmfqs$<=hO84P27W4RixCSZXceXdKwg_y42V6=1xjL} zkjrsD1sAx_)%)Je>0>_@lGf)QrNZJpGFztX{wYO#s)5+N0~|vDAhmp*=7+g%v=166 z_o6vPnuO5>sTgE6s)L{x1oeWY=ClSn@*lHejOV?Xg#01Fk)l0O;F~6VT;@2o{(Q9y z2mS!&PUQ}BLtz#?SL;1%Mmwt<25qPn@Tnj@q$QM8e|vDWzbxv6 zFUOwES)wFyhCuH=%@{TYzZatNPjTlj3$Ot=W{>)qv6DcNZ!G3s|rPX*;UCFa82cW+Oypn&U=(eR?U0tF+i1vG3SG>x-M z<9rBKSQRZoO?FJV2Ap(JU%TtYn*+&HkC)Ued9I38k+YcHd#@JD|n1BGq#HD6^a7R`vWI&=ho5WVPLsSJlpt!z@ zM&4PnhE3-ot5fsBY0WsgE+lYA?B+nxG$dJE4rO>IuLKBh%D~j1b(@jxsX)W(6>eH{ z1chNL(1UkIy8d80bO|x;f5rpkml|eKshD%!;S&(*(j{zk38E9okBtd1(*h)5g|UaJ*7{R z4l7g(U@PCE99DM?hwD_sc{CfI0?5X9rVB^)6m3hz{EQo3;8r6CC)pn^aeq)OlPAlJ z?>T(maO8gg@Nb@Vhox?H@cV_^M0B-h2*ia{^nw7& zNlrNROwcEO=L=7}9UL=yMB8d$@?~N4(q#%o*IuIy^r&3T9SAT=t?Gc<5k*SIND3m~ z3y}U;!nPyG6$1fBi+CgV(3BK+@MTXd%`p+6{pDq!z~E|eru&#Ak`VQP)bnEOAxz}% z5HrpEIv{T~-w>hQR$_Uvel8u@aCXPPO#N>F2#}Amd9%Ia6w+!k(^ivNtJmv_f5C6j zqUIrqg|P^7lADdCL79kgU74NMo&ZlzC;+vgA(1?bDg^qzS9QvNsQvn$Vrefc#$b&}(cGP^hsKhcZ>|UvgBF5&iL}FPITkk(0{Na<{X8ecpf9*-NEqQ_upNB!! z-KP(mgHT37cEMRzRKb!@N|qmt@MJU*N&Y_7i?>{SYBTshJ&q?mt^L!$H2mPYDi>Eo zjSz^mqX6Nxa#Y@CqwKC3xfg(=b=qQ$q@OVDRSoA96Dau#OYg-5*txl|vAZ0=&)o#7 zIksGZifuIbvG21N45InOuq<)%f;KcmFj$STK+R|grOVsvz={PgsVi@U1WJw;rFvgp zideOvGNz+$>WRt5Y*6b4(U9bCcfQ|0KRr9y{q`jOUe-bG1R~+M0mUOf*ylr?Qm@sc zx{dx2)EgdEBjhT4X};wK1o?4Gz{ZP-n7coixy#Dgk+aax8}AL}B>lHdnM@7A%;RtZs?kkp!|NL_Uq1CV2a0NzdVCR%qPLR!Rq2KW6t6vrR+kya zjC+(Ys>T4*BcU-=-aQQt46ofd_ZnK5Ls+U^(%W-Np%I&mcWomr31lwJzo(_m!7mZ} zAeyX_Lm9?II`uZfRh63 z!H{z<1?wQ12J}_TGeeq^p4B^B-1d~Zl9P5%hNX-Nv}0Eh{paD(9z zh-C@UG4y^%s!F3&f_qp*J}V68!MaUouJ$~PC7IqoPl&jo5!)9facWXBhv zYj7jc>eVaFI@cl|AQFlmuC-zDGuu`n#osd5c-Awog1ideN+o`Lq5(gwBdBkPaM+HH z=$yz!$)%q|k8I6xjH8rNI`a~4mC$DqjN&wZ@dSh(Jg5nSlU!5PimPpTmUI@joMoaWUo@==$!7)Oq6JAKISeNu^hM32W zdLM0w)MY-0%AmR$J=_bnTmG6;Y~+wpv@wk%uH~nc%}OH&4wh5mPZ?PagKya7^G!T5U_ljzd?9@x?mUVF-Qrl^7!4+b?Ccw+vORvwVDg+c+&UTCq(jYLUl=S{|!VqN%zz<=xfmioZNK8@Y6nrg(^Oiv3w!n zE9^c>cO}mdCa?m&LQcDDq-MIRxXKhO|*#~SU>bA=-TZISKA3! zCC#F|sE4r7kp$8ZR$Mn8yMV5RsO0iuKAH7WF`$ zn?^zit5O=v=(?QI4Z@ND`5Hvf8Rc_u!zJLlG62MqL2c==vxLrk$h&SNfm0C|^2~{> z2eCk;4euY}cajt);kq3Ef+C&*-r(*Ej_oQr?$EF`JmQr(}Kh zw?2;5(~x{`9~GM>okeIze9XQ~FF3h+WnH!R^x4+dDn&kvJ%%EQqM}Y>%qAJ*+13jg zuoJ1YnD3mqkX#~Y(w+>TC5Fz^TY~oj@*d#sIE5%5d5-v5 zMb@jWti`@1A9G=nl&z+FAHFqpk{UUa(V{JN(xaDVsry?lGu>?i1m(zP=ug78W5LdVQhD~4&B$2*_?9Oloc_ah1|)oh5n$h8Bt*YGQ10q z6kt24a?WdJDnMj@#pD; z`J<*L4$z7G7oj+xN|B6SqlFbHTO6ImwXHk3bQBCNNpq8IB;ZL{6hC`0!E$&tXILZl zisZ;EN+$@3d2~CdqGzhCXl7e!Je|y9>Eyl=ofI@lgMn9w0WmyhjmN*=99;yIqp2j0 zxZKX7RmJ7x_Pcu{991gtB?0KQ(n6Wz}bdv7W2wvSmSr%5e*(m>LXT~8e39Zyg zW-*E=Uox?@OS<@^!8@s+DxY6+kzB|JCBw84aB=swIJxy`gbGPf11aS?IxkjQ+RkcWPh;i zkWEOB!lOPZCV1Q3x1^N^9iH4oVU>on#d4@i>CprlJ-BXnw^2IC>D6s(JP!Vrv1J=aQu zh^NaTz8FF#+qYqx6>Lo=gM`BwnjS>NsVu{?rq&)QsvS(izT`RiOeSnT#hHXcMN90% zPpL4UshKzpfo9+jVtMI>5^X*Ptbnai?wqA?bZYEHiYZRAHJ3w~a&pgIKG*O&7?*o$fDf5TTue)B){YlA z8hj$}n`ZZ^fY36+MLOG{nInjHdOb%Y}P3 z9HU;dp6+d~1}Y_y5%^JED#SZdz||B{F}g7)O7cKy%z;nUDuO!Q@1|o=?thh6Wli{6 zOiZGDg>K_;KTEY7%3sGpRqoQLG|)Sg2(E>_Io8FV)Lt6$%gEvtstE%si@MHJ1;yGX{u$TrIc*L?R11Tm< zml-nwvW5y{BbjVUTxTA5J$nos$v%HZX0bLc+i(sTrzO0vR(G39Lv-d46@G=ZK@JLK z`>lx&0d&QOBZIz;||ao1dntsNKO?>V9OfK0`Z~uV0`v)j70dT};5b&=t06wUpcXuFIajex9Gn=i*%BL= zaC&-lOOT6z+_^|1iRRkOo}=Xmh0Oettk}SWJbm#cDqxT>eo~51MDc~{_W)gzq%ZtCl++Hx!nPk+NhK&B;7PudvjpuZ3JSx>Ff_CxN3qt92OvHWO z#O)gTFeHN@By~1chUwREOG9^DSzS$k_jS5|{H9eYhCpprAhw?~VCIZU7yaX~mu{Fi zrY^!S)J~>yfzSDwjqV!n8>-mw z#hM$!p5jx2F?=(`xX9ACttFcGU-0qc1~QiP{>VZt{G_GH*s*W7z5>mHSRCvTBi|Ac|`OA?H|0 zt*h?KT!yT4F8xHJCcQsV*P2&T-O0F83!q%8^RRRqV3P_oz8mj{6R$J)6~QLBu!3}Wp9 zNkbkan;2cYR}U#VjzMimVshe#<7zAm5JwYvFD#9D<6C#5-xi47n0GOI{e(^r~ajm4-+ z$7(sF(Jek#iU(Z%N4{Jj?r|i=-Arm-%W^`4(b$EEQ;-`B*&d|3`XvCW15^_Qf>I;B z%$YT4>ur!qrIKg=`NuOhZ)2OmFN;|&ne4ibe1og4-fxn4xWh>2f|sF{>ODcTcFr#( z8jgpmn1ZrEYI0I@lJ;*bqb3RZ&XjK#+iTF?%Ek#4dV#UdQVbtJA4@nY>I@-O3xZ_$ zFs?bktiE1$UrFp^3DMF6@!n>fzrd`N!;3ijhT{v=BuaT1RN|4CI;ZD*2Mym6VwWf5 zOhvc=dXU5tBVK#;;5N@hd=?~iGm8AC3X>dwkfk3e62iM_7lcGgvK39-mS%xuqMI&n z33XG&o=W(reXdN()}V<^C6O|+3@hsfkdb$vQO2;46ylIxE!oHsSa+{RQV+EMe|j|n+f zEO`fJ=rN>Cn2{vzC84-U`k~)nR^HW!+a=b`%cJ0B@Sn?ivcb?JHMDA6NLV`*!#=08 z>S+Bn9wJ9Ylm}NQf4*RwkvUNEh2`l173aJr5MSX8STyoUh-LcHso>KQsc#HJZsw&? z5`vN97u{6)jUu-!I*(`4*$8ScIm_H99WyLyzolZ6_uv(XJQ06pK*}-n6dfBr+y?Le zVk{vj5>JTHETQ;QS?5ds_T(5@qtuAQ7L`g%;GL4ZmGrsN1_8CW?X98lI&zTimO1TT zZEg~YMwomg_>k}27dGJVZh}}Mq-%l@#yF-lww^c*q~Qo<281}#byq-@n zB3H0BHfh7m#LmFLt{O2V9yiQO2Ye>LD!m@CiX`_5+sH|3ILYeH<(TZpyxqxg)@(x;jcGXLhV^yS-4$mOnRa7t zH`xrW>S0lQZVdy(X1TXr7GLa7W1-CQJd|N zRTMzI95qD^)2iL{Hl77q661pw*51w8{8MNP&qV*W%4T(YmE&$Nvf&L7*ZQ2cYns27 z-6IkR&E3TlZ{B6c=3QiS)7N_``S#7;>(F2^dhmO4$C$TVD8UWGONfWJ+YDz#DOrE< zR2>)T&rt6QJJ5P8o&Yis`bbP^jnei%Z$47D`$e{=Z(fW;dw09v^a)C{^^Dz2DpA-P z1zeL*w5-lXa-{H0sxIVjhz~G>+OZAI*uZm8W?gwrG|J&W{gZiY*RloQL=XeoG-;P- z*xv81Iam}PAAc?yi0_J#d)w0)USCx+S!*Yt-A=>X$KV2&mRjDlxS-R%++EV{wsB_V z{%E(W7sMMsEjNf+5CF^rqmK0<>7%tqSB^`iE7P)(h#D&xd<(AHu3!~6FZ|c=Ldhh) zj@~_e7^0u>ObUpdg6CFtaPmJ@+zt^;-^lh79ah`g9BZba|5lU^uMdQud z$FCYd)n*qF9W17HaDNkqd|fU_O`xhroMh}}1>cUW^6k|P8%$ivH($*AldQVwpxKBH zK2?U*C?z+pfQF!>q+Bi>$M0>NsMU>egX5&k>EqW$9fT=?xekx+weEawQn$LN zeq{3Th;x*PZ1-vDb(DAAt#2(~=_ym`$?EnZ@vU_sm@fNHnyK3ZFdI55vSC#q`n|oj z4gND?SFgMK`s5I9KLD-PG{3xjnDvZ`D|a=vC50hh3!#~?W8d=h0cPFn;_z(S$ z=z&!2D{*Pv+RzA6U%60wvs7bI`IJNNmqXXpMCgA!U1sQA?VMbVgwRUIizBxDtF#X> zE_oQj55U}nd=!h&ax&m|pDj0=QUxWuojp1g+4H=D>%Jd z^Ng0Eylk(-CpuHU$*g=>;v~l-!#lN_X+iq9ElW}@N#C-f+->-*Lw++th0`XHtk8$C ztW6U37$T|h!5Mri=IuReEQ4#)UvDqgVj3}eRwn!N?7}Ymylb;Qkth-0_tL2wqG<pwsL!h;3Qy8f|h)>bVki)U9a=2>%ic@G+&)bdag=sL)#(k&lkOj;% z-EVE|Wsw8pkprm9z+z`AH(KqnLGzcs0pa>x;-UbBxxXfJdr`bHs;^s0)~mIj_N9u~ zNTrb$#YJ~0HG~7>L1~xRMUyPgIu^eekHsscW{oYY!>UX{$$!$UgaI^#Zm&HOc%rU*KhFCF;4*ZJ@*KTYwKLpvSPnaBSow4H`eb}THk?HDnds5PL zoK0`Ywb{|Ut8aLc+vlAG=5PpK1=6NIB7HILj}vlRN5V=k(z0<&6zu~j4Y|NxlYt&| znO^)8#k|=+&+K@dm#xN*!m7n=-X1lXc^l0qFy%SgZ!Pk{{fkU{-DfjRTR7@^0^wg> z<1th(S)c7jydtL_M4*>b5}gA_~3f^Lv6ll z1a8}Yp(nS;92u6zc9;Gm#ydEy+p36H3dWt+OZP+bXq9jd?AbeNofVW3>t{|8?b=IA zO5^gXXv@G>!;p9Yc0h^0Xy4|jBu~6RK}HGZwfFBc_)<~7@&Rz{lhjTG-`t~f5p>v4 z;=@NJ2gLzytTPzE46Q1gj<>`1B{TsAgccKZ6gb&?S$&b{B(%RF_Ns=Iw(JrS%tXtF zHE$}r&=dG0AM_7RvQJH$+O$g_M!TkjbZ^7v4L82Gp`(}wDFuxHv|)RD*V$WMU$vRN zmCYn^{WFbF)*>SFQOC70A%$zP$fpet*kK2MX)vrwES}@$xWT0=d}DHRSzMO(VG6*f z3Xi1Xw0g3ql!MR#3X9emt2G9$)z59 zqU&%hNRWkKrS5)3BnnZp#!YNWYw>L<^?=-3 z9i$XL5!)d;i5P8KYKF!ROlFOS$e!$9#CFJ8i@{0Tmd{<~!ggC?hmGs3Z1Hw(Ti;Eb z6j!%btJyMI(OH+6#RzHbR>nE_w?$sv^%1^on*G?ptF)Z3Y4*3)Z2z_>@;0NO514T9LP+y}xfFYp|Pf))Vh4{Kn(`Y?4p0tk38itmKLle-V z8ueR3%1PJzhKs5$x_C!dWK9T&ra88qZy~JaaqfKIzO9T!_kB|w_d(8Dy(|{YfgBN^ z;;Kt{bj@I3YI^ccT8tPCTYl53TYjvXa%LC1)ZEJuqwoirPd`jL`%*)X)Jv&ZgY779 zio!FwVKb2Vw6p2rVgdxS4o(|S73EnzwR>y$W8>!iM*L8)?8N$6y_mFLA6p+>lSx)} zvH*K;5S(UYAyhswZ8U0o72UPQMA#HqkjmJ!vDPgSsJ^Qka!uVOQgz2IiaY(DggHDD zPyMXL{S;oI-H6OK((@QO1OBZs?LQ(V4^3LU?5u-aBB{#qVzC@VX8Ab`yQ4CSS3Pd? z(|H+3I1F3c&)qf`SK=3|Y&tG3yht9OKm>N??QJpJ>sn|*$#y$-F~ZsVjaMLh^ms>j z+}xN|Iz%djAvEMc^(aRoyteBj8a7UKI=inu8#gh4XWJL!yG+rs<+X zhDL?>Ms~#e)*5T0Q8N~I(Ngd^>$~fvq=;$mCx?hcgN{6s{}CCW!x{Oy<0yR0rp0)i z^%+ztmIJ@H-pK3?zjv;i>B2?&0;LA6V~|yPH`J_ zD}vI}UT_dTQ*V(Uc$yyO)5W&_0k{B1lukvcx3|;g&kx8L;<89HfZub&0e3@xq^F9~ zmhR;U?vZXzwTik&akHT7+{4lS52w6F?Kh|Vt<*LQm^{rPr0)PQ(%AvNoe}&9)#6cL zWPbESYC|vqe!;JYcgkiSClf`|DE#wf<62Hdu z;{N(N{P5SQ6s_=RMjn-idjkB9N8L45k{GRrJUN6)#dE{zpy65m2~!btAtD_OVgvqh zo=2_tS)evbv0;JT>Zj0-giF>;lnR*;p#jiG38k zg=GT>OFmB*GeJiIdnjms$m&M`KBzZ9GfcIn5%#_(8*@noJozLOG9_vmX~Pu;ohUw0 zz2{<-b19@S@}wVapkmM9jvOr*(StzI7_mPOuhKV|ihQKnNqgvZR*(>xQbctYr@1r3rgHEXVE30&%;qT;|i6$5$GG7Yb@86+SOR3Ma;U;swt z?NmvamXpzB$yUjjSGgAVrQ(iszKM#HKGif0^%ue-%{h0hXEGlTt34pHOG@Zo>#{ znX=iUB4lNIiiYr^a}SQ3hrSY~;{ktVSUZNS5t>UF0q@drx10cYx#E~7W@OP$5tKI9 zGO>Vpj>qI7<~j9Q1}ZP`aB;%<@Tf2m!FCHoP4KZ4h)SgkCgEyEFVJ?lEU!Gz^vBp~ zBYU^K@&L$~N*3Pj(dxoGJszkp%tr82P6bbwX4(828vjzN#iBGlALDDk6;ChuD2b(X z1?5XXV>PPz5~F6wHTxRZ4ZUcIL15XOjR=(#pK4(`spD32Y106B^;mJ?0nvbE2QOxM znKG6z?hzpF>o=ArqMzvQofmV|XUVSe2Azj;Hi8Idp#030ob+XV>|N=DgKu5n zE8r(n0Q#yI+T_J87%{CXOY&O4aU|SQ<{}t_8`=sDtR!(ZiK|o0@)FGBHk8RD+qJSM ztPF&PQ&Y+dr{lvPgzYRVZPCr-4!!#jdrz!ZuKa*LIWof(C{~N1yQuT1#E37;09lWq z%2N02!cB=0unEDGKDj0D8GSzG5|o&4ZPtHt z{rqiF3~$DFUM3-!a2}PYFIWk=%j`vsBnUZKN?;IIkfSj+p>hGsn+_h=e4}Y4Tu_H4 z3lD-UXXLT0+j3^F=dniXdG)W?{J=GQ&rNP^#d)n6Mjk`IPFl=!c!LuV^BsRX5i}%T zqS$+K4y-Oi80jAiDqJf#*MMKF+$ox{9iZSsXl^L9j??@$m6!*Xp9(5XBZaG-upJmK z4TNMhCgD3dO96>DC-_(9`=tWdr-Go7mSgGt6}0+~9#&q3ChGoDYmZMEFj30*oC#iP zPgSeM?5bk=;{uG+J7QG%M+&^uA;FG-1RJdd5-*Y^rPn(SSu-F!P(o2pP7thh z4cr`bR3r&QbTm7ZemLgduuRN8khiW+i>8jcFzOKnEN?uTo=@SyFcbd!Ho z(l;pACCqT>F~4*paJmL-uT;Xsj7FsltyWJh5-zJ&TTpC29~fPz7pGOZV+&IaQJTW} z0?M19CFy1+i3f+4%)N!v^CGspkoq5V(ekFlf;*k(0{%HFr!2qd`+GDrl)^z(orHw?>2KAFGVS6e0*=D3_7C~&567C zmk-HE>s6gR{cCx_;OySkbD2Axro0#zSDdKtlS>n2c z9Urr0D}vn2=$>Um@JcZ(cYm@@BB)ozV@Sjj!^HDkJL&S$%K@ zsa8BMfJ|Yk4asOn0Xkd@k(N!syJ_BxR>l@2!9!+M+R2@DFIB}4zzqDExaAxr(4ZRC z3Ah}LR_n;aLn!YpRyin`DG^!w?0>i*kL4xEzWVAV zP45vMJvm*#y;-FjFVbi0+s~eDZ*I6>)}JR$w;V>c(fjIIDo#2D;U^~t$#YH4Ga~~v znk+OihufQ4?JcZaT!bA5WYb8^-{IC^v3-#a+z?;o9={FJ~o=Bx8;rz`$R zsKNXLW z-7!Vc4(16^FT+dqtBTnv=YNctfsN%oj~Fd+fW~M!Q^kF+rCzo6T%pPun{Z{Y66V4D z*v|Bhc!!yqw>_|o1E~oa(q!kU3Jjkt##AFyM>8_-f_0N?d|=M4weXSNth*ItjQEXf zfU4g$*Ej0eF0M@{B2g$Y8Ai&6kH*^Qy1IUJWqVOUm3#JB*dy8Z$XHC(eZl}?pRB-b z)K?G@u_58d%NC7jfM(D@6bs;30k%*dN?Kt6VFyIJ7s-#;T1>ES%F^qsFTNUl^@43; zKn$5-n=-D-;5rgD^Rg`a)NtUw8(jUo9Qj5UQ{W!*d}<(np0MVUSK@69Hd$Se1%UK4I`(xSLe8z zI+U^r1Rq@P33eI)bf^ozc2z(R+14y4U?c ziY=Bm9D5*GO6}oyJRY$#_6Q{?Gt!@zR4IX$SkO}X#$q4*m={W5&8`zuL5S>=5q-_M zAkh!G)NmQ!-8*g;ul-F;KD1u?HviOf8pn?;Ve0k$ig^wo-fAuUJN52Fh;mvWt)Lq6 z^V=NdG@VLqhhB&2aV?J_)g7h7lZZcsCL`v(nio&23rb6~zs;SXt|xRQdW4t@b5Xfz zUYLVRV#q^B_bILIQ>GDG#qL82d8JgfbyV65qPgllU-1g}Kh<>hKEuU~4cSB?zSNFX z@`G~Hd?_!(q3J18eOb8}o$%nPir6VLzdBvXKn&gnHNCTpkV-UXQj(Dh!1px_EnO*x z@Jho$n!bGba@G4$-2Zf^VaqfEf<)>o77)uLY%oM-b$wmTWNS1!xs2l;xM+w&YEUR1sEeTVl()GC?A4iSQR7?9Sz%!vN+@Yh=Tda!=ls5O*WB55;BY7#mb) zA~qEEVt+QvN!GQXDXrCRe4gJ)j4VR4a4Mq*@cBB7?IIliHMx!Mv$ zLeingXklF(OOY^N3>1z6sX&KmblphCe9Q3XllxDO))AA_x|kM!Taf+r@U*{o{0-(T zlM5e4W|PGXZ}`%XX-|BZ#O*oCf{%bm|3xYFYG*9(L+Fi&T;4)s657g{f5gX*yy0A# zh25pz1H*6eb(SG9USt&qPz@-PgkpZ9kAZ*yn+@WqCKtukqFmG_enbZ{VsoH>cA&|) z{)2MahH8w+%rdmK6NU5(F>=Q|i?td#nMlr{%whNMvX*3%5zG;O!$qNRh(0_WNMm*g zbyjKR8?lOf$YQsppiNah{CzJaBq6m;osg<&@9`4cU!u`W4@ zq(L{HJo_kgJAwI19O|JUsa+8Et+|2B=X^#mTG;c&FZF4Ls4*-U*LkON=Ys=>!T>p@ z@w%jPn_Qau1_fNnyTt^r-=u}{LH zL^dA(Bjo@=K8j~TF5}vWnWqsrB2>XRSPQyYWy#bzJL#hTxo!PBNiD8a*sRH>Y@W3gh&cm34d!66rncU|7l+eiHI zyR4`X9;8wUYW-3zOP13^Ab|z66P-pNzalf3Klz!C=@lp!bTfKShptPlnjuGG z@H(mKafMgoPQ20Nv4t=33UV6J)-!iLoB-!0D8v1j6=T&d-0-$QHy9?qy_h@kX8XyT z;uB{;JK~2qoP!QH6-~TV3}9m8EyQ5@NgQ-%ag}a-nQm-tZ@vJp+21=Orq5)i&!3z*`Sy>Car*29X8Qd3_U2|ZQ`s?@DUf2|A4U2+ zh2>!H?s6fBS4`aSb}{);Gt}%v1svf*taZck6D*5lE~BpLIi7hK?S_o@*^^WEEJo|t z`Nqcf`o{Lwde>+{Uvkdo#)bqN1;1u3ngO5h6UJk4%QjzB)AZ(Iap^9T#U*?1++vQ? zz1L^UW);_ETpRzvS3AD8{bXk}N`Eidopc=DEs)FT-}dq=dE5GvA6%cb3eQs#f3~+e z_Uy?nF|@E(#F8>6)wwyE4KanQGv<4=8q5xRGHBMgMhkafN&S!ug_2@M67WzFiRg`V z!mG&oHqJ*%Lh`_zo*l>4hGGv8!V)G-q^=7VT)A3Embn0zCs&=*4^&v|>v}w;UCkS8_A(i8w!Zt8@-3b2njnRbqKjR@_hErA**UFW%u0e6_vq zCh)vt0`S}{sSRT(ttoMe6RMXvzK|EZj9%b+|8o2Jm(dGwZEZiO_2e!@Xu{VVub|Tf5%gnylT_ZsOYGpITAG-z@A$!lci zHR*COlhn4niq6d1@hNlM$a&ybVoO%y#gp|H%>AO3aMJ&~or9A%2WO`}F&EN_4bqp` zt|<}1?Ze8u)jvJ^%Rtm5mi0Y<_q2vv;x-%Ka9H1^6?P}2>V*#ca*z@rDknV;`ea6P z;RJq)ErDcBo9*YfDf8QU;&j|YC($>kHJ>w$I(Ct{I~9`Yn1Z(;@7+za3HwLw1uoRV zREZoB_ZJP0UN6i8at(io8wmM^PGLjVBOecG1hc3JuZ=RpHm`=9t79S%BA-|E@Ds8E zQrJd8j0C}C_t2P}$rqd7iS!eiVfMD|JIy}z`Lx;8j(|jW4hWpNMG_9nmp}Aob1qAc zv2~KrIJ@$BEIppEpF_G8?i z<8OEj-btkjgQ&qgi+|0lGS+8sZ_yItU_zgwJ59D2c6HVh-6T&B{&oNS?EG-&M?U?y{#wm6#?2pP zA$)$Hg)r{RYkn!|xX(8r<^3uv;pn2zhC(Mr7SsEu>)F0*)NL?qv=Wowv(L7A-eEYr zr>`e(sv>=pUpS2kLhbXfw%ws|3-#=tg)&`4kAAhiwY9zRk{|6_sm(8YThGI4;m=K8 zu{3@1#mdRf(c6R9tLYbiaDTi1K?dJWzgTgX-+5gP-OaSRCcc9;eCO8rNi|9Pm(&t{ zjHhY8e&C68pgq&=EdLHl_sHql$^Oa7@yYq|>p!|7thkZvySZ_%m6cmPpCS1-0 zXp(EpcU;eVr1%HHRYCxq_}JopPS5ss&%fQ@+1o!k?e48o zt1xN#WyL9OqdEjk6T|?fL7?MPDM}44E&|vJd~)ew>7Fjf8C^rC?{-dh5ynVg0sV&| z0KVV(akVkTAC6DmZ*k&f##if0M1weo#!KKgX;)gpb_! zU!FIgh(2+DZ@g$Vi9d25Jb%_|BOmcfLuNFN3DhFvU_?lTjh%9L_VJtZgQK(0?Ya|6 zDV0tI*hWX+?tH(0ez<>lc>MkTXS=$Adw=$DSKpnU?H|7TTvxS|7*Of)!M>FFeXg^A zUQC?;F~Tu1#NE~7`=bL#C}SaI@Pr*m%BUJvSfp4sPmQu(Rt9%fZ=->v3?s>OR;#K6-QT&H2gu zxBI93JzxUP9V7bofQ~}rlk=UuJ@Y9`1?Gc;qtmmUw{Q8A-Ea4IzdL{P{%H4fMGhd| z`Tf@U>9;#4`+Mi^SzPI-{Ndrwcl+iW$00A=IC~p|_1<8x=KkkC=%wyoT@-XSnvT=G z{dcbYDdXoz3@0##+`aYP$?Gk2cCvGFuz$+5IRtyncW1cJJ)?ofmLq+OCh|_h;|kpV3_3 z9K79s@CfGf$DY8b<)aSZX4e6Xy6HH7zf#bC;QRqJ&vB>6&ad74w@`x;YXf%Ag1j;qT6$c*t{=UnoD`c);vAQ*^%DU!WycHDN_DgYC+zv$kK!typNB_QK*iTM-# z^;I{iaKH2=9VQCsOrJh^g6{ca`oMkiMBjQ(S5M6#JoR-Gr?hb2UY_eX{UH6K&>KHy z<5x^}`lKVy30bjMpdgi(E6f7Y^VYjonXvT)(6f%R`3#72V*lva=?m1(i8fB!(5Ag~ zy_Y`n4f1z5Jx+#t<79(x4xF&Dzk7CYd=$4MqjH$Xyc*}z6*`Llw9y*0HpkF;Rl~W& zhQGRJKL1XyoL9ryUECFuQDf*dvDv(G!=m%^wbCTMa+>bB-yr{p9yQ-ocM5}-gKbAm zjKfjuQ*eOJgMZ5*TXet`FOVK+9YzuGVD7HH=b|c0G3dKT^xq%yX2dl+-Nf1Ui9)9t zAQsR!(_A0)uA(P=TAzfO!}c})ICeAN;MK>B!!Gf$lpP^ja6+UI!ui43{>k~#@#*__ z@Az3a6C{h^b-GeQ`C(>|q^czZBwf5InG zsKC)n{%J0sV~#qmFv}+dQQ6sqW`1<6M?fDCs1@~|+wcYI9n3k@y( z$A1(eHq`fPUep-5eWPV_Zj~%M)2G+N@q2>*M29Aj&bmM7d=~t7I^yOt8b{!%j$V`I z<2wKB6YGIa^=*E+e)9?)9DTp@_F%7TnF5m#K9Jhi`sI2Ak=y5(l9`OVN&R!w9Vqm- z%(_K@^q&Vv!cv5YPwh(|XRP_+Fp&p@Jber9XgA2GPwf@`Z;czatvDFk0FB~!8u}xB{(9Fr=hzCDTL|i>C@2kiPL17a)Zhj1XI+61qX>Q7Q47=*SJq;^L|6Zr?-|yjEa+y6~>6*>&9&HMWn*ImOKv6#( zCZOkkKNFC9)n|;&%_beL$c`qPO=HhJy|i7Ao1L!5=JRA8qP1Lyul?DJ?Po9VH}E{$ z*y=rdw!v$Y!eDxM`VAX_501WB`IA$U^6AIFtnzoeJMNovM?@=l|M~FaIe*`CU;oK{ ze|GZI`P+k|?^crErGNTMPo7>`dbe}-?NV=P?V^}2_10Hk{RI!iU3`7#RO!Y?({fec zj8UEJpT2*4w(>>X3Ju`FMEpnND|cw8l&=r4H@9d!*=On@|1X-X`x-xsY1H8V$Rf0; zyw0bi{;YcJIc_(9)LGu@I?L_8{!`DhzV0(;x~o}-Ik&S}w=wsj9y?6AUv-&syZX3) zox2UWFPi=&+gXQO$^Y-y`#|dY(F9fheQ2qEn2dg9zGWbz|9_AF%P#9aE#vO-yPr-D zzWMg-AO7w?>l^FqFE%&-VSRo5<;xcv_;-DS|HjX=7n?8tVg2Qc=UXpcY(9J8es|xl zKXd>7{fE;2S)d$yz$(nx$VPNx*}%2<-~xyYuFB?Yq3XK;jg@C0sz}y%(AwsN69)VcL z>9vIgs`E8PWI(-y0O1Hql@t6@gP&&5(+I8swe1+9lYoUPr*+XcNf;!*yEZR3xXKOu z)x<4oy7Tt!F~Fiv_V?5Gr~B#goAm74gVXf%_|4f5J16_;!BKi}cA75joTdk-OSo_L z4xopmJ4buT-ofea+ns~MQ}@?T>Dz;y*9UJ8&VE8K_`nHhd+D3w6Z&Is=Wyqn{nPY^ zZ+Fg4kN3adKS@|Da#Eao|M8)FarYR60KePu0lPk|m(mNd#6n>d?jC@diL~|r!acl6 z|Cqe490$j`{BwPsjmq0UjHv2akqye~>R%+Wx2y%(p86`?b{7oIAy{Dvx^#^GZ3$2Y zj-5Iz;AwK3>V~>=GcK<{Q%wZMFTYYkKg{Yn8(uFEsa#Vfs$vdeEiaR^e0V)AT@QDr zq8D8xOLa9|n-ufDC&Iz?l9YA=RO#H3XIzGZ{D7tmNJc~SKrl>iLj?i!Gj_*hn$rrF zi>q`WlclBEsjkZD6z7%m)6GeB^MB(mvKx-GyU9@f))6{f!IZdj@+*{$NciL z%J0&%LHg}t{&PN_WYdHTI!MVYvz9|bvwW^=xtmqf{Hkz^iu$8eV1{NocVm$fHFawl zhm*zmuU*C@`EfL9>?@7s%P(~-Kf3RxNOLF_lR@&I#{d2O|K0w{>;04C)BesLAIj6e z+dCe<|2MWa*0=s){l%91{l$y*tr!15pW)xX+Xx=``S1IGJ8kbh2?EIY{OU^x0_#rt z-q?P=1wacc2%Py?jZm6{F6ohCc)EMlTf8BRZ$aoQX> zj3fw=&kl4tfN1Vsd|OhMv(GkH+(f=f0VzoZ8#VeBaqt|swA4966n0c4Q8n(!dfV5MDsb@a%il1zVzAThW{Pe?sUKq^V@%VfJ$}r$;aRb%HK%l8 zpy5(_QHCu1g_KD|xJ<{KkEJ>hfFdvKsvyyq!K^gy1)z$+iR1cM1ejg`XP@%~5{`4% zvajxlvNv2maby3MGGlqzC=%1tDi)?$(t6OHF>`kN{tb*q;nvQ!jA$fzBAb_fo&KAn z#na=%{lUrp&f7!z;0Z5-`|F=+8UH1LA>941`;ADM`rJF(J-XhIO+EQsKdsSqcJ|H>c7?sZo(RwnrH?6X4E?tHx9AZH=aE2K zWONMGplz9ic|SqM_B+Z3&#Q#nIHFtfY-34cq#T*+1O)k0yP@;S#iu;VTp~^5t^n6i z&P{L!BVvbhh6H6Eaex!Xx3(z+}~N8WwXX2L(tG<4B%}fZhC? z;A_6-;U!NTL2i;4)6v}x3LnMaaH8Wp`gH5OT1?MbQ_#MduJO@1N-Vn1*A{iPMzZKd zF zp&A#LITgS8I^7th8`tUjBweo)0F&gyoAbXdN_Ttu8M(9l#9bINlIBaLQP*3|^SF4V zgN{LLUVp9wCng=LYCjwozMh`F^9WA1s*~jVtfKl>z{K`;gYUPTh_@aC{!v=W1>lOk z-N4onNg|PJ;NcWU%p|m$n1`npn@v%r3<#j5nqygxXmCKX+KO=K?R1GgU0O{VWVIq^ zY?Y*`e)>&5Pru(xl@=*aS75%tHwYc*i3(rH>91=feMzr@EN#F2^kjjsRM+nkeY@1` z*Bzcfxhu?UR-e$L@9>dZH1qHZa_NeR)J4xntMSQ-r{uc$fudrEs8vO9CNj5=MP_Eu z3)Ax8jgV>}e(@8jdC8!44m&5jb>D;s?E|aRj%IE9NZOPgp5fYeDp>gjLYwhK+{@!b z7Ohx6-Q%*cPJNhHrLgBJr<;+Ao#2th%w2GP#oX{p#<(gO`f4&^91boyKv{ruXd~@I z7~b7_@y?smlpEn~`jYV0&%VrZn-*1IidwkMA5UFdvnTw?|BI;ciPPSyyIE5Pl3sS^$ZsYj zuW5c&&dH70SP3l>^VxG<(^@9QEDVV-A!&#DZqF+?MXu?hGIr$zZ)FpJ~Y ze$-xkoQWs@2N@`tiR`f0Ze&Q}GdudAK=$BS*y}h4Eve|&aSMiMFE6CPW>^qIaKDL# zKp8ohNI5022*HITx=VIYX99MLVerm!sV7kfda_h=snV`qGX^uK!&GqZNiZcds-V7w zAspPRVe$}+L${~gv#~!L?I;oLi11K-I=%vnNl9|QbaNgRSAExfFF`gZkVvi1S=zcA zf=X735~Q#dhv>=?t!sAIb3_FJjg5+Q4tJXdKs4vTu2 zkH^_Ghr)}hrnPLoz}jk09_Q$xI|6#gq)CL zE}JVGfj;>e_cmzcj8jFoV=p~GSr97!p_-_BAOYid$~meEg`QT$a;P<5Yg%kPOSXZ< z3`Ke9bTOpyf7}25f7brz{l6#sJ9~%w|0zDkhyA}VHnv_q5Ak0w$%XoSb7SMb{lEVO zKji=Ay(gdV#`BKoug$j8SDXm^q*k#cwgrfG5!xvz=*?;0+`tnb)OADAU=mg_Ej7N1 z@%`T)9lv>VuzRrc7VVgYP7y&8D*8Ebf>4^vDxt`o0Pu|)q~H=%P6#NgTFS2;oUuS~ zJj0wE__2t2(-kjTglJvlf!J2~EaPpK4$ zAN4;;@Pl3@7(m9THAJ0|V+ixZ zMHtG=o>7^DYKYh;mVH=|GlSrd-PC@#zLUZ*jP%dlj~J%^f27cPs9MfKIE|oFZ{r63 zmc;;UmhalfTCtrN)u6Jv;1T$$;atz^HUta+R?e3VSka1d`H+L@SRBG~cFc@S;bv+{ zD&H{Q6(-3dgINHzq|bqh%Ca0)9;@>q;d>`A&LZ4FFJ+j<{qvjtd6Ho|mX_!*f&PQj zk~8+r+*i+O4u`<4K}OT!6299!BVh6#l?JlfgxZLEd@G{DVoFt;+&vHHUtSj#YaJxr z(RtzE#!BG|!tudfQdnQW2&vfROull$Frxi>e4ciW+;6*w@A-&wH6NCeA?V(@J7^{z zN3GRLbt4=BC)}8HE&f{Rj0$p4{D=t7o|vO(k{0)n@>;?oXp%A)_}9ZMXm{M`EqzEO zR-ke6RA`uv&0IiA_h@+hY@StPP;cdHz5>6UzS`T}Pgb1Xbr0=*_@JFnkTT;uNX(b@jd*=fXjg#Tcdx%?M(VZAe2 zv#%v?dq$h37gdp8CK_&D_;Phc06lYO9l9fPwkJ~RP_WCyEmUhQD-x_f7N{sM6=DU( z1?mQR@d3zBp!xc@a@}IL4_N4rkWq(Sk;l@>*|+=0CqF%5JCYkLf_*RY>p}vDBMwWr z?ANX%!5N?`$FN9ZQ`gTyT`!b2skY37U}d=gC&lIy;=PtZb37q|Mm@_bsz93& zZJYNtsTVJ6hhC+9>Ln^4Y|6M(z=#a08AXNXveBsSe3Lsw=ihCeAMG6OpL5Bg&Nsme z=;TIWuLPS&(-4;CV@&8#e=sSmf*3eG;a^TsA2I+Mq+3t178ww2;XNQ#ZG@}IN#u8Y zN4dRs$1$UB@Lt0sHwNp27ru@SK^8lD;=mm|eod9JymO z<_U`4at)0Gg7l8P$Mhf!A$S($RNY3=?Lg`$Zelkr%;%sgK4}R?Ss7H(#tMUtw$88C z;`5d7mOi1T6P9^N@#1nmU_vS(rbo(t;A#Jmx$PX=1Yf++QrOfB1`ry@1s{|5z6vt} zf|tTp3U<5a!@)6Lg(AAbNHyyGN#9gR@umgB+GiJdt>T@DVW)MLy4~@`W^t*%DWLdb zNQ1rC>+}r8ZhClb(_@eC9X0@y=e?Le^cK{9V(=n{Y7qg69-(Sb^c>e*RAG?x*L3M- zbg^}gv$7;R@4lPg74M9%Vs_InP)h{4T$H!NfeG?)8v^R zF7GT|x^UzEH^<)BaFefbuHnC94P@0|7rbxH#A?{{KspZ{R668tS{>2)M{nbk&P24R zNR+dsrCIk0-4S|LA9n>W(*o(JbB$D?!e1@F0V98<@6Jx09ydq*1ff81j=Z><^7Z0N zin;Y9NjF#KdP(U6(V8sbvn8V`@PdTfyiWg$O6XiOgx)74=N>uv5#)wSk7HljbxB-t z43&I9nI8OD$o2@Lr%6!o*$H@olb|uFB)Z%-EjJebgrQ(sWwD0w{((z04yLa*4FrGm z2I{K#WTU<`vv$7Q4ZZNnz2ar%QWJcJ+#95s?#0ZPLQ!oO_o@%Yh6FC#5v6c+vboY* zPu*%)`QH|(rpX75Scf}F^jgnC)QGRV#Zm2dd%Ip)1YpSW9FmN9JW`QQTpOvkQbTfq zBMP{p4F)B>uMX(R1Jb^UGZd(&HT|ovtAX`f;x$ty<_;!-MG$AaXR@59IkgOe_DBdn z@*(*_JYaq2s|gHHcLG0pNy(n%(*ZZbM(fWQ3|3&eM4O;?R==Is4VV6 ze$O+i8Y1kG^!)|dlT|9TjFNbwyY)qzk>Gsgi1f&AoWygO&FATEmEB$fkKDcJ4Xmu= z?7}VX;lVd2JCx}4)A9S0^z`6tf1A?1_V&+q4&HXCLtWZY&HjLu3dekWx5~6I&u3aQ zPUT*`3F-x9=AxA4U805-z5@JpY|Sc6i6~4-1_L(Tz(+Z~avfN=BfSsQ%7TLUy?Bwh zcmxswmGm3~0rVgi+6vA+ZQ5ICBSZ^%=V9vA>AEI`|)}X?hyg_uReWTzVVjGpvNu zDFic-%xl5OkJP!v9P;K!>R{sPsPb6$ro3r>8J#PNbazL{X`Q!uep5?zIQOR$_UG3k zvO+t^rMRIu?`ouOj^K$PWw=geP8uJhclVVs)g-59`|r}@BS(JkPTX%l9G`sGMSMxZ z^|s2(%O2^=M6EkVy9aOIqLAm_@$UOWr^xR>{rg>-zGkfj9vf6NW8)p^wlpACPqoT< zON(!40SD&3D!`wj_JVV^GeT_>36jr@)k`XyhY@P;gq@W@OJs2gR zV8%e2DS59^NNPSHv&2N(7;0qomh{f}rD{pxgw`H;z3NHHrX!V5uS#TuFzKJOlj}U{ zJs5@R`Qq|Y4_9kZ6P958F#zKuGcG9ub1Ftk_vb)1|Llk3?UZn%y&|7(J-~pHO&^pS*ITmOAf8D;vKgR)(e2l;^r*y^$F;9J$J5iBTjIC&#!K zF#@?5VZ?|{fk&*&;3A+UG3FOG=F?Ta)He4l`Bdsw>YO?_quGR1xzsOA`JC zG=l@^he3y%<;inw`*{);PWl&rd#MykDzWbX2M{pIVnJpDOH(b2d+Ok=;$(GNwV@Yd zdmX$Cw;0tH&ZIBSFAEt?DulWhYfn8VWKch3KoO-4VKs1G{b4w{989b6V48irbJRX& z2k*hMQ%L3&nVGKhF0=DH8}Ez8``PL-4*>BUGGAnwoXY&kw;;xtrRTkrtb} zxce`1G9TMB3E|(D22VJ?9NVuaJEE{2c+)7-U;%9A^&sUAwPXB4Ho2uMa`J%Oe|oaJ zcW}Z*mQk++(FAYExDDPmgirkcNr$8Ki_qA8z}x)K4PsBs{Y3Og;ePXLytB&x$`xJJ zW~lD9U~nN@w|n1BHkuUEHI~oT@Yi`Y8=lu6hl61mUk?H#llu#|Ll<$|8Tb1Xi7CgB zuZ@l~XckwkSN%T5-_I^)b3^GWjna~Y8yw#hWe<2oH`R7?d?lE47pb+wyJeE z=%|c6z?4l)%*Z6Wkwq0q%{@Oba!pY2#tE`YoyfuQf=M*8SSTecS&PtUALXS;N!I!8QtcjP^v;tJ{OX{=}WSOC5`}WK$E{^a7r;TgKR1bA*XD4 zt_7oMsSEuILF+%L1tu4;D+UtwYBBin^h9(QLQT8 zSG0lwVWLjR%c~(7n<)|x0T$Q_F0L%M@(4&+GAE7lOx2f6MMqz;#SX|ELc}mUU*+@0 zNk_@zAjhN}rAu_>+i1}Dn&u)<^IjrWDOuMlxZ4|IyLis%w!yuPg~0GL*;IE-qhytm9iWbDG4-|IY=tMS} z6gav~AYZU~fMEO}q-*S6 ztn>L|=GN`q7-m#QRvej&XDjbw53OzPggdqkM7@9QXAdrb;ov@4guLW{8+#*!sZJHdUO2#L>LeV{fC3I zZy(8tta*!VjbSk~u7Ilbk_wEdw>jcE-5G>!^mpmX8@5)j0^f^OHZ`Ma^ruLeVk}c2 zECwz>kS4reY*s;BW%A9@`*cUIXQCM9fe5C|ii#{nRfesX^W~o1$MMj}a4fyQ;3S+f zaQ&^Xfus54t=1QBN=gd-QLqw?cz5*{Y9uzTl-yWURf=2;PrT+8Iv~O+P?q`ZTP|rO zT^eCTq^YQ>d^Ipv= zHEWIztJ-(F_%+4{J#T#9;u_%}{jEUc6g7`-=q2@MF0DqLmluEieCHxfy1psP)lp%i zqzluZ9|1V0TOG8$e;k1=;v1tH7se3~yzp6V-vUPKuEIpKjjTMT^CF?laK2@Dl<8IW zxb%XU?)e=yUE@1cuuVdO1t&E~^j(jCv04sWBev5Om`s01<_0lulYKSu_ElW28>{KA zxEI)NJ##|Fu$Vz-oyOZ>T*te(uZy`mf5;d611#@@-Tk*n%Rk&FhX(~LN)~~y_&Leu zj`6(mmbwd7S#i|g*MtK!q5&YM72RCX;c=`cz4qgBAjyp*> z%q2KZf%k$jLrxcuF&Wd7C-j*6dA?09ioz}5U@!=uZ#6!L!UqVm0Xk!Kasc`rr~SW$ zS)_e>ek*M+(o&K~Mm!CZ43Hmz zl~LpzDTMGpXyQ0$qkEYJjLUVSzO0KoLuc>V(5=FwUQ^*;;Zw9WZe$62y5LDKHTGw3 zw+B(5bLqj z#qDNq6-VpP6CaVMP?zCx$+W7Wr6}qa zM?)Yvldqsi*;wU%C3`12!gPx&V#7{dC3VX6qr1{92dj6-V3gi z5F#4N1A)rbH?~}9JPN}0rdQ*};E^sW5s~_PIIf1g6|$t2*DGOXfB5{%(_Ji}<1D)~nIv1_dc)lB zXqdCXo*nrJ2X(F^bAe83h@{CIXnPu8C17Wy@WG2Dw~lgs^m4#)wpXb9ee0BTae^Uy znT7UqzM086JniCN;Fg>|uE-Qctzikca+fHn41$$1Bf(u=le57ZUz&=nDyBLr&4+F^ z-iA(YF&Bi}VOc?78{aW~h=2#(KZ?HRdd-p5z{p{G!@0%bX}E>YuBK&;>m!|y}rp_&>R;+cwoVw`s?B$6Pd!dh`H0G_ZA4^llp`*!E- zT>QdJtxBPsr<0`@1x2;$RzVwwU3Hj2N)Q2kR0{myHKL9Hkn}s%#1Fn#Q{em4{gYJU zP8z8`UHUh;)OJJE6YHZIkdRGQH^WDQDFM?-lq1zQ#Y_k{W1lG54&~nZ$k#+Z4SZ3f zeWL8|W(Z4@Z@4i;hDun19Ft)SujyDrUq~9|X_OR47iR&}hN-2osG|PamCz{sR zQWEeTx1NPsa8vDhfK&PwH$ur~O5LW1rPeT`uWgORC#UvQNciF;Un6 z{hlot(HlKHfL?lmitwfzI+;)SHTc!P0!K@ow~~$>y4Gb-iL2Ffau%Yx)uzY7N4;v6J+M|d8$*`1l3&PvC6lS%H}-s^P^%~{lZ%c*sYsFiGtj>gwU7s1pp zppYN$w=icQM0^MD9UZwu#o(~+#>&r(Fl7AjDK&wAveN+ArsDz4F|YYbT()UXssoaN zU7v;)EUeoPH8H(|qY^U0%I!4=Zl*U=ad&vgm7a=*HUU4W3q<)Lo)m5Y9QdftXv-r7kj;?>Fm#7c@#AIndXx7nqXd4l`O2Mrf>nTQHaONX|6kfy~QYAS~Jkx3)mRY3O-?JJj2m z>OQb2TdT|A^x#L4bKW>AbL?}4_i5+t>LX%l4{Ta)5EX(}7T`-r&ejxJsq8NNvmB2S zmV){$UN;g1eAxX8+eaBeLT-MknM2YPMFuADGr}A+SJ^rai@?%Jv^IN}W?X#0ZOxJm zQg^!1x8-fliM!%H@efj$5+lZrW=vp7dDId_b0>?Fa_Jb+lwtKy|I^yQSTk2!+> zg~qiB8P*@2JRrjSTo5|+2B7MV;h;dy?R?QWLU(`7>k_5;mG-FsE#~YO{dftDPsKJRdqHw0YB{1B%J~85_u6r%9PgDEWWj1Kq0hk2X@!)x9J3 zFhq|;43cI>%73BxDMkaC6*+;RxutP>h<7fI?`UHHIYeP7wGSK-)eR|6S2>oSa%K&v zms(lD9y#V@=oYic`@;qNhY0h)%T4_G0mt}|p5tf1w=LV<31mcpQ>Z9c_7PVhF4(>w zv%B9F87zd+++xt>%`3n&5PAhWCocJtU$9!~R*RjfZ#b~}K-C|&U=u>zxIq?-I+Qpx zhe`suLD<}U*u>b+QcmdB;l!z$YaE5xW{OtU^y!h}W8-l)vIZ1w3c+w2hL8^$48iz0 zDda$snQYjZd)`ONG;9kT6bW?>%oxr~@im2TDTTRRW0YY&bx5&sU642vyD7czvDuHp zJyHi#9y>^bYLxYe_-2w~ZAUH9${a-WU0z>VvkqvJW!lS9(BI1e_A{biS@fZYm!-1AJvq@s&Nz2J- znId$bZ~&(BuquJ$5$(aaJ9R5EWbPYmoBZ0T+L%UE@fu5(eO9+ghWFv?R>9G**tvXmZcV33qB?BG3Se4`qq(0&J>*-gKO9bx_JW2{5 zmJYNdQgd(>s~qmSez}TKlQecYpDmAKRh%qeD|}&wa{z#0ftc|~tgGI5FNQ4g%}Qco zWH9v>nAV$&_srWgFxze7`rh2b4mCCUXm96^ZqLn4j;?t4l>A5Luj*ocg@bxo_k3XC zj#J@Ic^AUNkj+oQqIJ#4EaN@Ei}_6M$S^TR1lu{?JviXjg2CgiNirG{VgNx)urlw~ zrUu60U7C+5#8|3FvVmYEq7~(nqb&zX5;4aU??GvI7eASl!(`TW;I3%7?|BK<;*VRc zx*Y#mSAWTufqX6~NtF~OFPaH?!WtSfhDW9ZQ!H0_Zb>TIl)wahCr#0tU7S!0CAPPr z6dEc2&&iXNS35WLJ8Bg0uQ)CNYER zE5fNx>4~3;2@4jNkPzJRE*Q}FtJU<4i01^eE+j7(A~eGYR@jK&A= z8YPkq_j=LEH61yk+4SM>TRKPlcyvLAgn!d>f%}n5XR&`2auu9$mOIdkil6h5mm>7E z#ZnU2L8L(Hskw%?8vbN5xVfFk`B33@a<_t_J!pnE?*dkLhZz$_jTp!g85SXQkyD@H zhbc(q&B5EZNZ>v=BH{I$op+sC+fBU$wi8EbMSU$Ry9W!b``uTHwHA7))QbydXHWo{ zvVtGZ>i!;>g&2_Q6S=1B&jM6b!cfymQT4r5P zT&(_E>|zSG^>_|$=ut-qz8)ki2dn|o28Yxn9mvpKo)eQ`8TGFbXuwZ7`1bHPCf+Uo zjAI}7bWhH4)Z}y=>n5MVbn>GI%?YX=rM@`=A#t2ohlt0De;{(*E2+avu9E}ES;YQL z0`i!_1x$*mn5S9Xg40Iq8NeCRTc#WPtXZNp!dmi=vt~mN3ht5suqsqvy|@6IC7|vI zM~Tx&Ef!O{^n7ngk(e&ZPXt-l^Xp7-!4#M>4#xf<%y$kMgs!Th-M{_NZ16I4{rryq-| zoYLk2#!PKTVe1LN7`wQ)w|}(v-tCxAM%X<$K0WP2P)X6_{?XaN?jtP@4eNsw2Ea~B zEH})d6#gY37Yef=5dZ-_sBu3f-g4|D1iCwgR)gV&QQ^O3^Xs*SPEg!Pq`_mM7BlUO z-^kwn_?3oQB4lz7k0~pXqdB7+7boYG!+D#J^HN-r?V1#_C>AXd z!hnn#6QPqz5e|-z_W!`Yo&9j!`qq8+2j7k!4*5?$-yyc28si<`zoyp{l~>)S_|GS#Rzzx6Iylbqs-vV@yY(dH%DAX@(*v1cX!_M?`&(4kU*w0N^=T! z*89iI9$rr875&Q5vfj`4*<2Mrey)WI2+c!HHJznANETZNW&vB&VZes;G%!5s? zlKe>l>};tjd>hoLN33}&56W}`pg7p>)iOWUwXD~3*RnO*|{1fn81azdasR|TP zH=y>!c;-_H9Vz(I|@+pUK&|X;yR5kn3miFptzpc`J2dG6n-J;ER#pCO{QVgnd}jT%(~{6 z3qjPJ3V7)LyMwpK-@M;Xf@CCqhgdObyC2BPKOrTX^Ejq8cnKL&s9cjl63E$s#OD}16*u$=ThS8o+4R_TL#XFf zIVozvog075n;N+WsT|&ERVK$~SX!ChAUW4PNr>}pkV@8_GP*dzs4-xOi8y@&_uNBB zjFNjnAR_DnUdbrhvUbZ>{cctGtGt7xC|_X3rmWZQW-27%$@+*GiSPR@jN^O9;7~At zRO+MM(;X?rQU_o?pe!oJv3j*gTTD_j(oju@4DHivnEMD?NEF0Ujo?=}73{)GRWURu z01~>3H_$?r*VFWm+3==jR{U;Jjif$1pkfFetCT}OigBx9I!hqgO?i6ryBUO$*)<7~ zG+4YL2K-|;jemxxBzG6!aWF12Sgzy&?1QhGVdVyc?AIYGu`Fi4TTPPxsVAbB^4Z3E z)QhVt|FK^<6k*{}UxRB*fY+?`*2zl(iu=y(<+o)8ZPMxDM~=Y8=}FE7xYM^z%_aNc zUDAm=lq6rRJ=Z|1c74d(*{tLqZ{HN3ydAR<|#>UHy=l`(&;`zqQ^^L8~7n@xF z1>gUtjHdDP-}PU%1pGdTq67b_y7s>Lab4LA>3 zQg=brBm_y#iyr%sZwt1zRFujA@H$FRCUG) zpmPZv>O=nyxiBOJdx?M~I9q{}a#aF86sez7)~r7-`<$n%#W-3u(c%IOqQiJCl!akc zL*Zc7WNQnE^bmNBmkFZ7eSf0ZGaHx|S!N4mn5C}k58L1wlTK&mQLiiEFv)o;xG zuarC5ub0`vY+R~C(MQH%1wsCtfu&_NK}Gfx-!UhUHTId-NGkT(L|i2Qbr00fBYuTn zF1zWSJ#&=z=lg$PYl?bEfq?gnMI0~zG4m#`rumqqNCO-|dKr~ib<%ToMcK8qq8-*1 z-4n7=YoVzmwjm3j`7N+F;6sN7@r>eQIG{^yDCKath|oGM3=x4+QS1#f6>`;i*pY3! zPB+>4)8PJF@hA$y)zE~vmIwD?U;@C$6UYUG(8ZLQWVAHV^>)NAtcLfvR_|nD^1Ll5 zeP`zeFi93Zsxw7Z5bJ!FQD$FohL%z-mM`IN&Nyc@_vH{g35K8#v_ht0#e2-M{N;k2 zQHz?31BDEDL5j!g3=?wi<#btnWpqGW@AAa#6TI=I!mQ_?3KZ{5;_}knT&=4zl-B4{ zjJh#aKH9aYug2j6nqk#EMw~xu%7*F0LU9J@Oa}9YqDV>cjb$Z&;7?0GrrJlJ!4vF= zP-{c_d@x%==vD$gae*d^ns09LkzV7?6GJEBJ#0DdR zx|`*;cxjThW`y1p$#W!EqB$&bbLg4ykIDH!e*HY3YULKqgIk+VW)e^y_D;e|&8ab4 ztat&~DY9VB1q|6I9^s9!R|pSozl!(e!3$WU;`k724ItwybT3)`Ew?lVXYNz#;Yl(n1k^_ka!r1 z?XdTY&b&xUnFQyBafKn#Ud$yYE@n>rZn@Ni81dR&y5|r1p6ArjhLR+P5(@E}qDI~w zr_s)`O60PT`_2aHL_u@!3CR#kVm2BPbiIM|WSHln8*;NUGtrH7>oF@>l=PWs0aQ*2 z9w2{_9p2R1MxTqCbVemi5-C(fR@cf1hD_wQ@1LgMADn!1aCETKV@nMX1l$tt9670m za7OnJPSSTfr>8$0pX`0UWJRZf4Hw-fu4c`V+EMtLMAJ(QR5@i`vx$MRw3|(n1E17C zx%0V`jWp`-xBiEw&WN44;A)f88_H>PUHz2TzjNHdJZIv6DV?7L1BSGTZOwfA&LI<= zd*6Q|Pz_|W6>Mt?voY~8op*5Hyad12FPysa{gx@t$^JjH*_@vo(z)RtLx@{vuN3g2 zLC)D+qPWSNPKhLlULR3#2QQc;7!dImp`>760S$eIb{u zpROEBCev!#_oZWfJgvM&3)Y*WPex=u5QJWfECbiptrR(OL*U3I>&a;7LNL0Pj>WG4 zo6e0y7*LOczhTd3Jz_PuD zvu9iGKd1!``|sAX|F-}B7yOX@m-n9RzcBiK_0`(?*4nczD*wH{z4cY2{I_znOp!wz zsT;;dT3rY-aWWhP0FhJ$6HGJm$!`siNMN;O%vZv#K`u__CsiSF5R`eq=Zk{zke-wt zEKejp7G>}GFeayGCt|w%ZvUtBaA)u6UIyrx9%2{nEAZ;gYWLo3e09OgTTc*X%=L9r z13$>o;w&4tA%B>?d#Nm$OAV+@bw3#ma^o)U;_^}qVxnb!AcYilVpBor)g=9YzZG3i zgyYhzI)eynE&XXC@`lxd@(MJ^l(D3o)Wiug9^Z%WIO(k+ylByAR z^soxXOX2Tj(swB~hc9jbXx*)>E`?&KSBUq#CKNC7O8W$s#kBa8Qr9c1i5DLV0aYrx z>O?uh>my>NFJG^aAwCz8Vl@FVnIOiZ7Sc`09Wr-x5tL1@$40C^X(*g9v~vhDZ&6-r zoCRe`YML=c6Pm&-egk%n_Q+~O1_o4068plr2s#|0dS|W5XKG3FL#3z{UsfX6DB`i! zy!YR4_8iTz>Sw_R+Ui5DrTd6LWlFTxky^IM9C#1 z?TXGB3+s?ebaXJP5wH%$Fi4$o*ty(h6J*x(&gaKie7*QN#p|O0u_$XB98aMD)ASUw zwtI|XY<)C>JEOZehGe^y2sgT{$RFPuuh~kn9hyzawW1f|wU{iU z!0Lf50z@&eCNIiOiR13vZim$A_BfMsmN+;-PtG%krcshp&6SJCc~mom%uDWm=XK{o zQT$Re-I)s|w5O`#P93XzWRMACop2{B`NX5$%DS&Ij4d)P3g!n&Fl5a_4qfdRiao3kp(Ili zph0O6r}vDCGfY))SEx^{q8sU28T34CUW9iP>@=)O!N6gvYfc(HoUQ)}u-Dmo> z#SPw;^d$Sy$Ia+ZrKLbRF)f zaWO@HSyTqW!lSF`;mrpDgS2Yi7=c1*867#=r;`>aXDjSnl5k9kfw)K9{GZ_YLL3WI zdl&b-W0X)`RLHQ~{WYh+0FDboINd+_e*YwCsw_L~`dZX=a4<#1To~P7oOycp$2F{z zdwr3?deY(1^|u&B?)v`7MdRW=S?ifeX3_DBn&O;_Kccq!RgM;~QH}I$b*oj+{GP<@BosI&OF!4y446t>_}o-FH<^@fW{9eF)E2?%Y=Q)U zvf}fd+1t{<++n*Qkwnv4M{cPmHkOCR;zHmt99c3CV50_-UMusBa)g%J3h-7Ez|kQb zrexkO{+?R-Q>+$tV$z-F=7ACVSbXZsEs-lOB%fhb3~BEekTBFXJG(4sXOkpm9**&U`=l}LqLEy8;t*g2rD z{FCGK^FdVC@ZPEQd^jX$6f)dFop3%AVPQ}*+>%~wn#n@(Y#c?xG$*w+SqOCZ=xC`7ix7&vJ!O37=2M@lYOSD)lOoEfv38*|iGxYE3CoN;spB4M+SMOj%x4cGe_ z1N4ff$oEXbh+@jXgj#z+_OeMT)Z~A!MQL_wok$8Rqf9;BH%Hx3smQ&eV~ga}MKAM0 z*mW6|RVt_PVQaq>`{Q2>`*B`P5WqkumR^v|g^5Zh$USv*3ARI6F}!LuVJmC3+c;U1 z10gI)^*VMsG1+wj_`SlJ>_E5(iF>*LG;hri6v%truX6qk1ST--eJpHU-~xPK9w3Epv8aig9wRfuuv_boesSZ^hzavU0Hql8#eMvWiMy zRmI2~MmZ1e!lPI7@VtOeY6joC)C-Nr41pNHiUb&;pjn>P^Hm0gR;)CybS6e)rCN^2 z8d`XO#WJM&wYM!Swd5p5G$+%b;5NzJ^9w-fk^V$U8MRs>E)oxaT;*2_09OZ!+!1F6 z$3%EVc4V{j6Q4zE)8}H>bSTf1t^liyWcdA^y~BM@a)P&j{lA2*B>D$k1FCrQ7D&9b zh6FkVIvQ%qL7H#@#j=7tuBWJjUVJ|&-ndfgD*91iwbb|F*z%|*iJ7( zMM|OeMVuSi6>cg_fZ!V-p;MfWx5QHSda;v~cuqAa&yAqP&w6!XlhL<;j$+E0&8uQ~ zb7xjwS!JAB-Zi8oC=Ic~<)^KA@)TGC@zzP7qJMkQ8!@yglkw}HoKW&pdhC?Ilava~ z0Bz?p-u|DohP*BJWoG98k-vqu_;{pXw7VS&{|kF0@oe zGF(&?(Lyjm;iQ}DE8a*DLyHmzsW_z01WY9%*?L6*7+3{uM96dT+sk-%5?=+k9^J5H zoA4d_^0fpw{KK_k?Xlexxmd*1!uU`us& z>%|srTzucgJ8-7?nGL1bG4qh@>F5~Ao?LB~RM~kzUvN^6&)JZ>BQriZ5;fdp&%fI` z$4Nim{dVW*oBcT1ipS-NhSZr6YJNKf2sc8;MnuHI7{*K60^Fqk_W%4};Q#UQKXo-+ z`%j87Szq5=f4Q}FPyCOB&Afc^{Q2hk*7N5tDE{a9`o=$O{U?nl`uV>+{wLc1;bd`+ zvVH^tHF$72e$CIr@n7p3FE_W4|GT-h{$hRe#Y-%qBZlYy9sl)T@U!+bNuQ>>y6Nf4 za1{|?&(qzkn&wx9=}haFL%9Wc3Lis44RunLY!2j{koLg}oN<4K9iv z)r#z?zeJ$wq_Uyd$h4R^-_$kwiID^fjz)4fC}o5oP0qW8NG2q#Ccdv^GUx>A#!xHJ zA^tcFPQPMxzhETJfL{dx#&rIesgksNKwdL<+AuDZQ7f{fo4prAaaG8);>U2Lw!t@7^ANlWsVsx444ZzR{zRxi8=E zrkly&^joryBn-p#=YD!DS*`%B?Q(aE?>eDJPk%Z(es_9snhahGkXQ1j6o34=KT4Co zr1}Td=`nx*3}jf_U|PW}(g~X&4ic7KR>q9)RttT=q0hRz;@IV3Krv?WG7j7~d%Tzi zQprCJ^V!@35hmu?Dv5C>A8-}D2L_nChWW&lHp=JF5T=?GY$B!6DTKD$sa$GmydJ%{b}CK%S=H&OHhfY*v4!dCnh37|4c$e zi0?sQN?*t+y_7^}CeDm$6O;*V6&8i>zIRnImEyJJPZQ55C-agI1i>M2J|Ga7p=aFI zqtp$R880sr1kzH$_t=Y-r-5~bO9|sgNH1j#NIaP+ax^tJ9|YV2bH*DW5hwbw98)wQ zDHs*-{a|btquCup2AA^$nCFa%&@=OK_rt+EpP?*Eqod@W^~fgz&<a=l-aN(kvG5kt}ltNWh$`4AYY}__I9R_3egJh3nHzS}Ab)GP~AoucfKD)lF2)uq+ z6;ig&&_27{6L*yAa_W6zu*^@HY)SzX3Xvv!fBju&iD~dGeVNOIaxdf03Ne3cy%P#v z9y&@TM6$a2*fm{yrdcxU5K%bNS5U$s(;VzIvNI(VfKHLtOXEeO$tz*VS%x*32>H%? zXNfyN!*$okrQRpj!aneoRPH!+xGpO4i;9sqL>zek3-iqwzLN~gQnHXMS&;}ts5j^m z1uv#|a0Emrdz74EY$=6D1sWRV7mKSas-zyMMn@XTAmSJy_leL|F$#8DNif=gh1LBZ z56;rvV<)pFoF;(M1CFaNKn<33_#Tz;^hiS4CRt=FSx-*6?rz%er$|5qBJ!1#9m%FeF1dFLYAy8`w3BDasV}GuuH_oL{tin4EM-4~ z$kARrhj)k%QOQLeVjd3`B~cMRt$^eoKY^W;YinqbEl*HZi+ufpD?)dq$J~)hdLQYm z&;WEA&nfQNjr{#oo$bKlVNh-3hoVC5wn<{y1($lr!no)*mse~Cc)Zqo7@ndtcdBrKkK18=O=TBN=1;R-UaUvX97Jz-jTQ;-M-h zcdsvfnH&~1rkYK2c(MD0Q38UmPz9s4eR1-QVT-(Nn&?lLF2}lZ{^%s1aBLGFmz~3R zZ{1-TTvUh@4r}25A*P|E?2D}z$7|c`FzRy{^*BV?Is3tNc)>7L zBG%W)TYfHPiJR+bE&w=lsh^f+^A@TIU}Hwmjq>EXt@FKuldlJZKfC|op!Cu8cPFp6 zo^8@MU#xJGRr>bX=DjarK{Z6FaIk{~TXaw2o9Bbgs>$QV0MGf2U z_>8763lpC6>$Lirby0yD5VW}uw5<5fUdf&8L4RyRp;=X$O-btBX^ElCR zHKm67YnaU{FUZ@2*RD7B-*-D_-)@IB0N^<0fByX0fWXI{xKLH{ha=X|5=8oEIahyn zHiTK$Lh`}2u}z;u6|GWF35lOGO_s3-6&9z=8XSund36`T+&i;IfO03*!W z9WKV{h?l)NK3!Bi?QRkg!7v8?03sv3{+`{rw?Fr+h<{zZx$bsN5LuL%NNRTgKTx{j z<7TI`xBuqg$nE~xo?EUxcv08(-kt29y9Up$?luCJKwnP zkLz^pUyF3@*hx4)Ja>eoqz0mrUK~X+W6D3}+wNm9*i~k0+F!cn5@j*bYe`9#+w{9%{D7GuDalSZ$?e{I zwmykCBnKGG3&0Eqz_X3-)kdkLMP{b}X-(zz00Fx4=YQ{>LlXU7isu2y86Lr&h*MQM^*-t&o zfc&Qg;eYAhitoQ)?A(v}d;I&aTlG9j*Q>Q!#r5jdGV6bo{!{<^1OB$<%ued-Z;!wJ zR`JQSvF&=>ZbOybXO+q`*Hg1QKDjF2f7Qa#p-=q!OE|v7$6uUt$gPK6Qe3;L+2n7) z&DYIlZe1csW}YFV`bu7O3dD0KMfLU9$&-t{7YC$M@VA6E&Qe6G6t&~9(-f_=r=F|) zC$w39H@6N^)m7B)C{}&=ptvwizSgh4#gyFYeV2Zs)ziZt5o0;?E}zkb^ISV=g^SCV z`>7__JOAOLFfXb(QPGcsrRRlWiaZ0&l);GsP*NXFX<7O!yEy>;g%TF>AfU)t3es4c z%3R~{m!LT*7I#x1VcZF$h5XZ@_O2uk41nAfN~9{?buu7Xl=Qv{dnTQQl`(9_2lGin z%i?wa{NN>=kJHMXZgXpE0v5rfw6vlC@PH<76g*Ol0h^7&4#AD%2`RMEO43tVNYX!+ z1)HGwRG-R&9KWSkN%3wj$Ju2GCpp>6r=YyL+00~@LK283ya1bb0==Bwj4h)9ne&6% zU5Rz0*d6g|((HPg^IqcAoTK%GI^ZhLINp)z#@om%`;0WFtY4X*L|@j61K`o?12|MT zGlnJBtW^f-GzzxV#b{F}!;~)N`5|WQuI^H1&d}7?#$GS{zCzNuc+bUDa zRk}ZHclUqP>s!W%7xizbxWN2%-3mW)x*H104J$wGxxT zNrG=+Ewi+vWkQu2jLe4S@K0PA7uWQa5nqNAy|2>=eQ<@=2(h$Mup$&+5)Y&cjzz7l zX?w$5N*I_W5=*I+h_E8{BgYK?{QE!pm(l;X+A|2@Q51a9GCs2Z>sBgdYyVL#!%oDj zu^-qkO2q?z|K<8Wn-Wzg!4`*c$=Opfxp+FPwwtsz1FQf zZsxAccLv{ox@G@={AK1pj3sd9+fH+jH3y^v*N4mOlS&*8j#`;G#?8Y~YL^YpURFxkU*}3H@Co_(_K+ zY2B+#U`;G}SH#c!PJ>;tpP!V2H>^YDaH=-D#kx#vBKX|KOIn46?f2?$>P3VDl|C;d zzKwf6sb1fA__$c;Z;hhc@8opYKu41@5qJ}aR(Fnu2Fpqx=qr}G~l9G{;5oXM{bBc$`2SJdJ|rsUC`jrM5Jq@0WSY7VVk7an4X z_#Phy__>VTQ#mV!<%|A!l#WhjhsQz)y!6Nf7W2uVni-$lvZBs)T1~;-l#^)%Y+9>Q zx0w4ix7Ou@P~AdzGaZJtKk_?G#${1o5A#^FFA$C;GJGN=G4G7a?^V@!fI4=w`j9(wX3o6TzHzVx@_sfP**%g@(4XLFQrHa;)>{|#KDcj!QdKgk zO`07OjsY4*+NTw@7-zQr8^n{tu71oXn3_C^qhK=g`{o78A>t6zmQwUIyJIvMbx`0{ z70XH?p4Y|C)ybQqqfJ#B;FjK@F5#wnM=P)85fo3R-LAUR0bX=}aO2{zP8h`qKc@0b zab6Al=)LSm;Dot2vbr};R=7vyT&=08K6R?{+?D-ccsnsWmzhz-0N0bhbgn1)O@$9U z&A-2V(frYCzSz4sXdWG${BZfYxNGSDfrF)K)9;0EUr8$$k|;+lW@+r1Lp${1lhZ{_ z3N7vm1!;V0K5l$c%Q0|fNv{=_#uJSV`jcfZk1Bftb2I%)52>#iQ?Xc7*ai4iwgNOO zDC8H0G_``zLygm!ay^rZCEh|Yy%-O+%L<;{{kFPB)8W{U;-HC9v0N9%PDFBiOrr5u z%#hzfoSbbJ+@KQhOx0RK(r*jBt-HCvyU^5&G%gBKuI=GVw(0YY-whjeAwTK!G|Q_3 zu@O0zJn+R^g>9d2Wcmd>Z;G47d@#WRR{=b23+8~}ru}Y8?}|ypJsGko>sXF%pn=`u zilOXXPw1aZHO$l|MP4{T5UdrTe~GzWxG5~`-bBmv7{0iMaGgBx=iy*FU}mHWGd~J( zEHL#V3hsu%9iJ7HJUc}3JrDO3XHtb=JZkp{&iZ&yzZ}BzS$Ca%wf{#6z4$lQPEKQ)SL#*5{^G{ov|iT;(Vr5$>kqW!Dq%JGWo zuj%?cQ)RDOYgF8->oPk1FKOvBKEZi>`cj>pAD--MKTid}ul?F1<^~Q>{%eXIQ;tr2 z*E8XzLf$i5!BF(<1IeQ<^}_Ph`3@#TQVVeTl<-){8 zvGu}R=%!EeTBlZoh6lh*n=>^mX$-D+Yj0OgR;v}!zwI${%!E@ z(@j-&p?c7-$H-pMs84)(yh5}J?JD?i*xt(J?E3Hd6Tmob-EkXFa9~XgTiNMs%y+1~l(;r^SW zy>oT;=KSpR;sCaLawLi1A8A|TrB!J!ty1To7d*1V?m2{iZ=Vl7eZ0>Ihu?=6$i#$F zHz7ylpy9TuIaNzC*nK`+j*O;vlUF7ah1P-h$i(@__!+gB zfxTTI`pW%+z4UTc-la zXr(2o!UpKNXfeWsd9e5k0d-Mee0<6Ad-27P>6chIxs@E+FPJuu=77_QR|P+bF$k>F zkcGK#HzOuV_z-_pVd96@H?@PG@WlzGo1d21BfoFma+$8+a2R9TsMvym`6F+|h~rJ3 zyli;M_C_LOjdiGY*dXEQwFiL3cXng^S#EuedaZf+^VxxOym#{E)!zQ)oAZNn=k)C0 zd=IY2nioG`Tpk=#Nh5Kp#>SiIOXE!euG_mLnH=UUkE8wj!THI-(JJiX2t$1F!YfM~ zfnaQi7a7alY)z;g2f_2VoHf7U=G6y9 z$;?;wz}FvZNA#HI$Ui}T=w^;=&YS$qsi^wAEhcXAOz4LU{0#6$kw}$i9?3Rk8Yp+p z^M{1~t#zpLQSO@04ZmIKiKs=8QJ8D`5nn>;Udl)Ea6jbo29k?lQVp*Kar2d>W6QB)Ux6%0JK2 z4tr=B^YxtUfU%YB#=3HDC(2d3@S3m0;qHb9FURQd%mDhJZ%ar`RMCuaJ!foB1;4=__TaE&Xm64Wr}cZ2?>=c@`KoK=dgv6%Sq3#bI-fQ zbXC|bC-%v-8X`4O-+f)qB~<}BugF+S8R*GqB!0H6ldp&1nHV;Q!@1^(-L=+Y^%mMV z%OY^v{nO(!EGRIjPcJZkj5xTUl_nqKEJEZXCLna10sPG^s~OTs2`J5z7JO6kOwN%i z+6tPZSjz>P7a|p&#M}S8E^L*qi_Uf7>YvU{$>HDY;>PxMd7C7Kw5EZV=|rSE{~FFQ zkohQ-Lp%^SaC$y)+C6_1<8~C6onXM(v^ip>?C7CEq&OBUKVdigO+6s~Ejm5W2^2gM zbO9ejC-58F29{d-N^NAI@Ku9AZumV5hm{SuRdTi+g9dwn$hJ$Gi=jymhxK)J6d+1P z(s_F8K$pj1KP2c1TN;Y!gqwcW8{wmrv1l)zNm#3toaqE@?Vif1c&=+Au>KTq7%&D; zif63_E&{qfA7+m}MgjYMy9*c%b_%q6TpOEZndDZ`AKh)~Q6%GM&55VO5)BdTy%JlG zAWJ4`-*0`Nmp@P$dB?+gt}(nwbFsBGYTY%5>dZWK5RQ4=IWb(k4kw((7mr9d{kUDL zlqJJ$DAy5`>kqJ>b^M6{>{MKr6BU!-lL%76h(`FRFE><+t8%4!V-O(5;b_3G!j@dw zsTR0Bv;HuaQvETi%BlWDrV8L?8~4@_K5R!C$6d_i22>K+RaLymEzU z5`=R@D?dTtHM))lq)|%UZt+Wf7x^pOruT8y6yE5YXCR5ygC5d z)_^JH+ymnDaARVcb&SN*c&^f*lp`pr&H;`O>OpSL4YlS{}!( z`F^SZt#=SheRPD{Y)EAgjMJQ894GV**tAmd^~yD4F-z^B-gr-P#g9Ub0GS1WQ4wEC zI8eP2q^*D=_86O14zt>vNYkvY0>Qej&aG^p*vLk91Iq4Hi?gwNy+$W64ran}Npu`M zUiY?U?9K2Rljv3$*WfXCXnO|Qnz+vZjjdb;t4iN1biOT`XT`0wGWC`+x{Sg ztQrhGw=7gps=_Hi0bBX$d!4`5;95N8%Jdq@CNJiVIz1VW+bs|Sg~KLT%Ei5wTx`+3 z@fea77jMh8DNm=$_8Fz_lH@Q2PHibSKFMJq<7)sG*tkh5b zI}P*bE|9h##$Fv)J;zb$%8tu5;2&yT12RT5!ZF0KPT4AYJ2e+%b>gvCpU;t_Gxl74 z^>i+@kyqD^CBuUftVzfdN+vn$)lnqN?9`pjJegOXrjiSgv#2T^o4!pIL=U{|dyn5| zan#&Q9^48J=#yxi%2QWg<{C5}V=U_{f@_*2K5^(Y*PK(cr%9@%G0Yk@AZ=F-%1LiJ zXrXOAcZN%aFWsnuZ2k;AMoRaPG&K}F3EK@bRLAeo0q^=ef@@rtUmEY1nN*gKkQU2P zLp7VDIqP{ccYAG<^2+u}Sp@L0){9lW@p|9$w!QMQn0>GuFh-nHGetJ2NLTXVP`@3wpQy-}JyUo}e5*@;f=q_Z6=>Cu zr4`}`+BgYAV@=HQIcPBgh(ft&e0U>Pu;9uoIGvO*k+dEI##V4k;smP~?R;`AEHMKi zHqxv^8(UnbE;Q1(jVx%Db#>ZecWtEB46+^{Q_P$xqGC!;$zgfK((Z7$YDfP1?S^;# z~pvn+339sc9^;F)6YFvi!Z?Dp~E5z>e9 z&HTB8)d&k0PNDfEL2^bC#2q;SStAJu-IA3zl(fP{L=V5@dB-UhL!9c)8-molGHa<6 z0unCtN)oL==N|NJYE}~TMiTLz$f5;Gh_CQVEt{mK1SObA7IA{sz+*|o^`+V{BbG|g zNZ>?GSD_vG_hnA8_|mDGPC>F|QO$KR_k2yi&@Ij~Pui8Go=xhyL-OgwVpSo-ga8qO zskCR)<woo97}EHBZqsZWF?a;+b^Eq_TkEs{L+q^K_Zpc)BN9n7NQ@x>=(_RAnvocSP|fN&=Dk4g)_0(uec^<7=V5PRUwP16_;JtX0KJHW;P+RNe0k6 zed&udS;g?pmslf4BmzY0+xWqW}t>G%4}5D-@K&Q#_;o>`dime)GC zIu9+bv)U@>mFghX8O0w3L#Y}pjRZqL(9C}q3J_lXANJn7F^wZ>9RB?)K1BzUAP9#* zhaD+6k!9J|M%N=`$5~6kBN#~&0Yezj5!>%)f9vRTW;kR!*<{z=jhN}_uD+|Qs_Rey zNW43FB5ajqZ3-8%g%6Iyt_T`OmyAT1+L&FeM~~D6&}R4n{&2WO;JA zT}zP>)ugmJ(K=PAo>HhjtI%>>C%q*5NWso?r7?4;@F(r#38HL}~-o~qe z$SRlCFQV8c6_V#m3j6lXdH*n_T9W;b`xAEs=Fpi*^p8Ju1o)$&mns{?3@F)`IE{R%pi;OQ))u;8b0fax+BCU%Th2P`PFj# zo%30TC1%jqK2#%Q&XJK?} zl`hKCManawxmIzzcK@sw_9tU{b8=BeRj7L#1<4YWT&BN?eZ)6(xHNgXd+;*}IdNW9 zFsePG={sm{vxqT_eEq=b6T0jVgLV{!3Vnx>f_Z*h2bd{T1~Q!P(Rtzb(@qC&XkYD! ziyqqQC$kZ&#~+ht!9|#c`H0d%kpN}KJTm*`^3v)O-4^N#CAXwvw&Yb|ChfwB_{7Uz z3UXi$GFG-1+2w8l>C9K~meCWJT%B0s>a-f^W^%%I;*TlI`Eo#f!-NHKIk2-$K7%Qr zyMC#}VGN@}X ze2zx`VA;wLMkySQ(-_9H=cY^=R!o$DTxhz@h45}d=~m!R8j9o`T;PGWAU3wc*(TzI zdY106P{*;!O3tKTa^?#{8I}4EEUUdv!^0CUA>I2;jeZniA}kA3 z6m~zUqd>m^*415wg9>3xIKuEn7L<>wQ29C{G7W#`;`A}2D$gV<{;Z^7ZzKq#3p`C6 zWhA2X%20~WO#($}{7N_L@Nq?dqnleKOh>smLF8gB0SJNtE%(ze*_+^e=8^Qy(&$DHNO!(VBG9!DE!0 zWRYU>0v+Cpd%^y(`u&J&^#vA67R#iUm{yjBmhLLjN{kke=^*9+uv|DwyrRfDsY{eU1NC4f30%&+e4tk(n$9er~tmEV9~xm0y+*FFc-4n+@>gMjrb{} zfY(4P-SW^s^Skx}(IrWt4}TsK`+`r8^wW1~eV~CwZAIOb8>5SYFSXRJ;3UsEk2|dwyl+G1tM$=u$Dy!(HQw;Q3K}T0) zM3)Ru@8XL7tPu{og=0RYJF5!MTg71p5dxN5W8ErmblFWEjkT2G0bbY0=QNTftqe;N zSLx?U{_x!+);)b=T7Et)5=RYKLA*`|wJC0DYhF4VcBskNe(1x568G)|DXp1{@nAIKcYtMoDD#(; z9_t(RNsX14?M@A8lVBj-yA#nQ;@leLbP9eoLDCEi4bNoTJ!!gO?+vPFO=3%;0DYb+ zQeikE^+Ehe6=tKVi|Iq;)xWE!L7sSTDsQePjE=e2qP!{0X>>VJQ$dJ zaZ3XR5Ivkv{9e~3#woNVrpAc)XjGp}qd13bG#X;m-U&yI{F*{0N8^6Va*}5$e6+HK z(ejL(1RQUnmYrfLS9a;etVS(Qs_kk@UCWc|N))ncT1l;mPu$5>t)y0!TFR~~T^N%n z=E_{KXNWf7XQGhXnW`BrQ!wdJ<_A1%hoRRQj{E&IzK6G&DSe$nB%%V%q#MfUuGjNN z!<37J*anVYOplgRa5bvvOsa|XUZmDb%4kWw7#CMsXb+W%(or7i9J%|GHIF7|cf=7? z0M7>0&Y`n24U;oHN-QlF02DaSJ)OanWbc)-pjn0EZme-YPw9DHKdLc<+Qz38b`Mf5 ze$Ue9z4mTX1eK`U*-2v$uhZ^>+}zh1Eng1?#rM~@@PB1jYW;IToG&lc%ID+Xf>AV% z=Oj>!t|xO+lQ6q{o2c(Gquk_)n^f>-Z8c5pXl=E8(@7csn@6ZhI+-_-Hg%a4mP%Xg z&XU>~^WI)`-5#n#_BKs5;&!rXgqn}r0SZW1k1_=S>sMYv7w>L-Iyh+88P z6{j0yJPkRf3sRLE#mVCBb5$jhiZcmFR*p!?#!3?=<8_+8fk8P$P@_sNW+L}ZLpGKo zX8>(r;(RuYe!9Iy9zR3!mF=CQ0l+8$n6-Odj8A&LDNF*X|C&~iYGKOOk7*o6mqZC% zrk(JYapKW7S#c~HOngUvCQ^!ld zca$s+(2fe8%kVVm_CRXJ(cp8j!Nd}ZE3^x>Q|SgswULHJF%;Ff^CF@ExRLan)I(1) zvccB5? zuq;<8R$)^ZmKf1~uNQXE(Eq+5bx8o)KI>UP3+^aLOHI3vW#xD&)qXSK455XJ2e$>`;RmVy>#>yg?_6>cDXf zc7u_ujXYtNgm;b(F){yerNW~@&L7UA4!gC0rWEB}Y`_j9NV$!kkXMk8bW3h)N0y5~ zi?f4?c1XW|r1D1Wl*0?O2MQW&en8Weq74Xjqqw?0d&EF#H~n_UeNVcokXiJC#pk=8 z+ajsVUDVGV`9e2~^u+g9vNohXIdga(gM=UK1iEygyw|rtKguT}&AIQW2T4zta#VWP zF%V>8j}Lg=X4)|5jw3a~{4gBx6y5SXI71c4abSxG*`<+sL~~H}jBdZwGu9Xf#U}T> z7Q*OOf>QTu*xp-NmluwuKb0;|OX!^iE-0-@1@%!iX?W>DbL1N1kaK!U{f-L&)ATfj z(N!>#gRl1OK($g|-njr`&YH@Q1^6m{gz9c}Vx1F#ah7$_H7nWy^?Y`m=TAdrGY}c$ z=ij9th)E;^HCx@Buob9#`)jmy`lB#M3}xan7eDDELi(`MhYS0iVU=QM58twyKi~PO z0p+!G{piuq9aPB(%YnM3b$T|wkXw|_DE{=FwNjkr<+b(Vxsk~EB9Q)#q!xx;u6UWt z%McNoHqb&4(@#0b@Sf_i&fYl=$B73cqx97o$3Epzr++$CkylN%%dN~ar*5EeAuT6eWh&n18@`wnl zf@ze!KJ?m5I^;$#2h7em zhNqEowhyfx`?l+k*bfhj-?b%sSqIvrOABMo=w)$s)eY z7NoaYbQP{5%a45N3X%>{w2PvEljL6^gma_AvO_r1mA`4b8X0NEOY*H43&(iZW_Lwr z;WavVCpY;RcE{@)r`^y{cGx$&29$tO9UTAb#?NB_bBt?6{3|(jN3ZiC#%at<5h%cE zHtefC$CPfZqA;O1>=juXPvx-H@#t&h_X2~UwLz`4#8+RK8gh5DG||_H)(GBbeYE~1E7cTHb5 z7SS1@N_MVGiZTC$@vq@kFyYJPKz*=mgo?IanbI3m%R>1-DN2L(B3=jbyR_&o+GdMI zO94BDo+zRVN8MG&92!>fg3q&1^m-FMoIz~F1BS|`*d zY4lf1!-Ga~WSWD*W2@`X8z*_1>#!DtZ|r&+qFJzr$Kr{qAI3|cgur0$B+ ziZSuUl#VX+q@&Cw@tM_X(x{uF_P?1Nd*$Rp-hvA0>O#Ki!2>o{12alN33+xA_?pxY zBqrA*>$R=9AfV}+2!JkAZoCg!g1Ud?CF69T5tn&q0WFkqbD>ue%3a>qIB)IGv zcYr~gDfnb~5wKfoD@%q6hlaX1nS2UaB7RqKc|l2Eh)Z3N0O`=81maXBC*_syN z(#QbX@exhHyBAks!I5?}uDE3G8<>KbQVrTKvC@u^&aBF~;1~_;ZxV-_fcC-f2_md9MB!vll(fyx~{`at4t0$xXeN50iNB}VZ zV?pzf>;fqNxuAJCvKTn;zd2~$)R1`(zQoK+#LWA7h#s!{So0w)_$T4$5*j1EKjViV z+jkfJaZ~{g3ghK{T!=l|II^!EBfMxP#uGqZ1}I4!g?ijDqz5Vtk}G=|rj8W>DS{OX z^lTV9upRrVeLyj3q!-pDSC9ultdBL-a^Qx#fX;$QhZ%_oznvk^)$Q_}8Tk?SGO`v6 z`Qm5Am^%^*-onOi2N+B%=sNl*pB$+ylQ}SYkscXnA9Fo%!VY6bBDPsE#sJ-^Df^0o&65tFQ|XLw zVe(E41zefVxYxUD(BE<{mjOO(Ao9bWD4&ZQrB>SNAyf}TzbhZ*c-QjK{<^5G;zHZn zYQfTNJ$bpa`xGYt1%j~7hJw@q&+ZtTnLyhw0#paVBdL2=5^wF|c`m~tP!X+m#M>7K z&EwYAR=$GLvuFf#ACkA|Xw90DD}YXWAt15}!%Jv?zJBW)ZsZ&5tkr?XZv3s0I)(YG#Q7~=01FD|`5 zf*<=~yD}V)E>LIK?~LjEC@(!K*H;R-&lYJMV92T!prw$Jr0P;;Nsh|l=JAV04*#yJ zB81H7%*15cbT9We_qJPmn_Dk-_O}~v7r77RUIBnu}g1Q;NtSxabp&0$ZwV zWb9{fViIwIr!yU!w?LgoFpKI!Hk*6r4AF;mmB4K_?{W-Gf@~G+TzSS7*Z2JqtdsTP zIxCs&lVYP-M3u&Z73+mO|rfF%&w#; zZm9W@-^GXybZ^lm-`F9?cpwIgNe7}}02+O~QMN@#1>Fa@J zmk=dgEf$0$p_D6Rn6_3ACr6+6muR7~tKUWCmty{N44o@C+gX{O(! zZpC}@kNLiL-9z83@2|bv_cT@S@s0;mcq-nb5+ncKj_{Y9jl8FMe19u1A@O2BpF&l167TY04*?Ikg%oj!t?Qcq2 z#yQEXKA1vs{gzF2`LI>#^({~%y;H7HJU%K&YybdsyDm6kFK-Oj}T66@cUmKNa$uiGkc zY<9zov5(q^6%xxX-L5?JmzFz^mS8KQ&>5A@PI6S?d7`=Kf)2}5=`|}qiF|MnIy?w4 z?wN^*(8YRcb_{o8<3O{h}8K;P+uP8eiYs-u;2-#zl6U*qaj|wtr@Gh1UMDqPJg!H^3olotgln zq3y7(iW5N%(KLzigSI$4XzsiQitCI8tv}H5z!W-KjY9Sd-{qnR-E@#+B;uEaxIm>d zk_phT#bbh4N^q5(CAFM{wcQ`&0CVIgpv$C5O}w*pyeqYOy1u%!j!VKSj8j4;O3Rhi z#8@FAQ(S+!zw^4q|4q30M-gThT`i8SfmXvl|@f8toPjUUt zrgw@E-yDReZ<^7m4RI39Xq5V5#~y}+N^P17D`cVB22M&k3e zExHIkSHo^DP&@4NHLVDAOm+FYB^#1*o9Y_K#OJQJezeovDz4Wm7^~_O$|DKC&dO_6 zs@^`poRJor)Nh;AGFd_MsQ$xJZT-bg`Q_{C-r*rO5O7=b2o*`(WK~1VgCgml^#+3& zU@3LNj^7p~)V-Z%^1Zot*m}BER>_3&yer@T@n+BoqNU}^&A>Z9t9a*?UeFbb+ujgZ zy=N7%dF2;~bXE7?0F9XK{hi(Iigl8{U97T*ip5;6I0g?{RM*wVEOk)@093zHlU5S_ zsac4w$CJmMKx_>4YrWGBqgyqGi3+ZVD~aVi?ytO9Z;ty1&GpraH36(ded%?zJ@#x? z;n&J(kxfXFl@#qt@L=;ggRtutC)W+7K11EXqqRXhtrF?U<}-J1O|7oYHtdg%H1jaG zx+RvtOHm4tsROnwp>NL&GD(vIORraK}Jhm!f?2)<_eYaGLv3@qLr6 z{$q@m5_rCiF}VNo243F>*tjJ*qO;uf(&N8ALJhv6;S11y*SwVO}rJ*ufGmL2|?yAbcG7xAToU3mHEb*~XHWC>V`d-+=C&Q8SlVdFhFi{dEAY;CpMw^NWNc z#ZK435Fp|GJQ_>g0WJXqvuHhY&_#9*A&X|IN6{#Y0xI?5XVFFwB?2Qy@5xj5v*Az{ ze=Gy)7G&dWwUZ%|_;^Jh_CyxD1$7`_oyE(2dY3??+EEupskDOBX3V12a#k#2)9|LB zUa_iYtcRe=$12VqA2hR~<3lffQgq^Py7#EVPs3z}0h}2dyO7gK}nV0s!uo0B{k2zF05L&Vv}f9Z4y6Ae^FH`R;^01D^+Pz>ZC09>GP%6fn&+3 zS|!<4tF$RqQ!>mg;T3i=;|Jo@!9p6@E;5LKN~c@O!%DO9!&uE=>Fj3MbSE< z?~&iP!8vzGWtm|XJm$&vAajD#M9Bq0X+g7AD$D65U+x|s?YvGc%jT%F8t`iKwSrQ# z!AKu@b3&;v)tA<{cDW_6VCyT(=3RkQuH8tOb20P=m*g{NHaZwY#Q412+c|8C_a*^{ zfWnR_huRA$Q2YLSVau=EnFqmn$3GXXRvUfs;D3-L^-#Y@)uXU-`B;c*kxp)w;Vu^N z2pEOrjH_4$E>H@p#Ueg=!;5wa#a}~Fgy-uwrv>pY^MLs}la;e!hJsMVHk@J`RIJ|# z&Vj%+dNpG4GK@woa=(ZqnohR~{uNymaVNxLR=Ze~UWvYrkOe*I zXSrE#YNrLMW3;$bKo1IOZPDOg9j(j+4-Du>f`{$7vRpvD2KmYUGOJ$LBy&_Ne54`+0k_s1^!V(;#t> z6oxbIC&jvmnAf*nS6{wfe;CKtvMf5UdYD=cm?^*vD{d*>c1MOAD+edy(ejjX2^75f zDhLkt*U{k7J)0khr_Z7FVo2A)k<7^9(SeCao+=pmWP@s4{P8Ru9vy6LH=74X4Z}Z6 zet7UU!;V;Uv8=$#_1cdfVcgtP+&+_Y)F4M@!DzQJxOc~!N6)v9TTgcOH;;a4?d%_K zA3fXL+Wv5h zBrc;unlhq*2or080wTT*9z80qKV`#rxdBjHMkN56dUdqyEDmWUpT0H-94#m*EP6`e zhoPKeWYE<*DRuzd`Pba*rwkauBIoH}VYJ!cmOjKmzl6`PQd&MzrPAwwQY*_Qj^sLm zNmjUm@s(356pM_m4asJzBjIM8?%j#g9x9$68OYBiow-PgXMT|X);D)v|FHh1RzI!O z*6Rh@oscBzm3pOy>@vU9;00L0qvPt~7A7fKk<#Kp^K7-bl|G@k2(Ep)dVeG?G0Hgl zPeIf4!0x4R{#njq)}^9rUJ1OSxB0Auna5V;S-M$#w1%BE!S7M{gP~}N~$fcC#pN73Bq)WaACnB0PmtIuj2Ok1rUN6_=?oqB3%~0 z!#}90`c-V4(r!MAaxr7zH5hnYI;b%-Tl5q{88-k&bq9$vP5>8CVuLY_^tTTdZ>Ej+Ii5P95mBL4c!Bfch-2HpB}!h)_+)9T7ObGs5C1HAqW*rJ-fdH zxK(t)3nw4c58Yj_RpP}j2WclUDRb({B0fF^T73evl$led*B(AX051;9FV!f#IDGk< z7xP^APL(%HPt@(xEKOCab-DI~a8}2QL*8{P=+-*9RtK&8R_3c%R_u!%V%uE^s%@%! zM*H3VSHs)(Ng!y+$FaeMKf((H9d99R5k~D+doXS(OTf2@!p$v0ViG5~*F+NlUirhm z-))@*qbMC9tAhgdf83l6P>qh;()2Onf2;N7f}V}63}2qb&B%(Qhnp=F0@Yee69GI* z0H~z_s7(T}TrZ@5aRAgOw!rDOHJ;PDjsLJ-r{VR=5}NL9OewRrk}PvGwG3XfP5Mq( zaLMHJAXy+KE3IML3VgQEg=2QY3Rd)*o0>|y#Y#S4S&?YbmTMloJlfihXR(ES-QWy~ zyh%C6{Qxo%85rx17V5<}?7IXoE!$dbxmzS{uah<^E(jPO!05QK62;=fE#+7ffWh7p z2ACjd*2V{DDJ9uxKrBMxcqe6G%6_I zP8pavYffE^sqLS-EIyAvL+z^*520Iqo2r4 zZQl>aQTI+sU!}BiG#s-l0T*vogn}W{w9vL44u^hwB#RII2$nO{dajM|XSN}2uTL!^#kTZA z=*b#HJ(cz-O2Eu+BmiqLGMl>7osiSq3w`R%&wa%()2?kMG&+^1dT7`&i%)y>!<&cS zo!TD~nzpHYpDb*HbPFy`C|LaNhaZaTdxzWAKwbP6frVVM(^4RjBg!Q6iJekLS}3d; z$o}ZGl-`i%{y3mV7NC^sQ_7Ht)in?^{1;n%0k199nNA)50Mk|Tp{`o*Dsee6HGi56 zY=F8w?c(|_1x-m+q8@NWmE>>?yi`pO+N3e1|qGncXPNV|u#0GDlaJAI$;wkpuS89AM{Ytkc$cntHVPOYwDi?{M8&T`Hib3gtPa z@GptNcW&XS_E0AkB2#kJ%Ij)Au?!LZo6YjSPucKcicQS4`c5(nc9jUVQao9dfKLi| z3!gW)n~>|SI@vC(I@v0#>HwLmcgIb)W25huKI7OOFF$p`vu%`BLGS95tJqGd!oObq zthF>>)!bTC%<0cEPUX4_90AwoSpU!1`F6~ZjCbam}XMYnAuj zCz}JR7Ao+~Uz!^F;1i*{qgf?xB3>Vi`~;T7DJ@u~UXQ0#n6U@tgYsTpHtEot59SRZ zf5=YKvSCJ-xtOjkw$iYk- z0n~3VT9vtq@2W5JfJ%chkr zeD2q`etG`$&i;&<@eIX&1aR z;&>#;%y)yfaz8m3`eooDjjc|2E;f(9ITkNrP%Flo7(v|Mk{A(BRJ+S}u8YCjFA(wlM>mVXX? za_V+m^vAQBP^!v8spxVK;r}IP8T%se@L3MTZ*IsQN3c4so&wbZJ4LT-EEdZm9TPR8g;?+8&IN8+t3RJI{g( z<1)`NP&Pr@wE#k1WwJ$5!IZJgkSCR5xusgpgLZOEl*35?+ppFpHpx_E?Q7#XL!L>K?%c%T<+7Z%UyV7Inb}CU=sfjs!hlt&sCtHnd zH#lq8$cHHM*_?*2lhwWwOCt9UizSUKNXlWB21$Vi?pnd165*8+ven=HT*q z^Q%|>Kn0eivJaX`Ma>vE5&3<0hEoEMO5tffyFpV-HNn^D~%w(d%j#RBVCC1 zF2~#Z$D7AHueKWr6(S@^^xS8)`7-%?qw@S!8!}G^fS%zHh+aYq3kVI}$mzz+0S5Cs zU=T<)i=`ikZH@`y5si(@kbTq1#ki<}gxyZJQy{mQ=y<0u<2rOgpMwIT&M~Yu8Qnq7 zb7j5;66{zDmBGI8HF?X$GLl) zERgm=^7NPeo!8aD=yrWYohI-iR)AHejj4OhCp{=mT*rnP_r4OHOU?BG!C`eCoS0g5XG{95*f9go=8^Vor3SRo^>A zMN!)#>SdoJoJ(hgfYzc*JkfxEN4rApNgO?xqBazILzP{zph(9a5%~`h6c8*>0a@ym zO2x{$BfK7Aw?P;M6uO>}9-oa^rH(#)LvbzGy)ZfiASb~);x`Obsv_`WG@J@KydU-= zyBhLek3&+ak8hv_>{S3NqQoMD^|4QtDU7g&5ZByJ9cXkIVu>NyMJD+!E4n^Jri)@p zio181V=01C_umh%k@#@b{qaPJYy0bGSLr{6EQ7IUZDp$+A6!d-Nn_%cNM4M};aFXN z^YGEB;U#Uexz~!-$^N>>PB*e|wX$$=<T$U?!$Mb1fnmTaQgs9p+tKeWIJ)bt-8jICR z@s+#+uM!`g2I1|r2?ajJxLnP!g^4>;HU_sI)7rJ@lzi{g6d$nzR7*@&DK=1#w15pu zEfPFh!kIR;6^u_Ddo4^VpI57@q83Ts0Y-#!65{II5XBEWJ9B|tyH6v<;V`@h)XAH) z9lCQmdrvQ?n)&cbeLDNfq!)FUSV)B z&u$5cpB{+KPDh^U`kQoLABi)+8{S}C8Tfuj^iT&);(@FnPttZnrr}&BU)Vvr)qvz0 zMsap=ed~DVHJ-`ERk;+=0a8GYjkD$wa;dgt1@4xCreik5Ytn}J)tl9|htfGC0eyXN>+(_qFY-J^FQ$81j%y*4cS<+wV;O2VLwT}4giGh%JD)0WYX>1i^3#c4Ys z%=@+dxQX9)oVwHR;pc#z(#FFjdiG6ZMC~=!JS0kExZ=P(Q zHZ>y{x9RV6{8R)RhjX+CSP!FMa*B6={)7dBMVmYKEEF#is7vP9R+~(cCV~wO z;(iz>5Hxn1EZV6bE!VH~$F#HNaC`rF=jGn|)*-r3QPanaHk1)>w}2EL9(uqSzt}qz zJFmqGtg1Y5zQFVe{~So2k%cA_{~iF<0)W0h3Q(%msq9sr0K4sXe{8q+yr5gz^83*^ zsyshUpo5ICTI=Do1e8|Fu+Q2eSiDsX4yEXwHAKZ zzbj*&Fj`A&7(8rZ^+%mtsds}f*iaaEH@s^@ixI)CDq#NpuaRvh58aJ1E1+Fr8kOsH; zy1cU9e0jKiRCbqNbi2YcH6HlG+3OGBtWJQldLKA+CIRlh^afGbxtr`>Zzyxj)=x`= zmB7OH1^Uz*-UN>KKdoc=Rs!o#mf4_?U+j-UwdsoM|F{2o9i6c+uK>~i=)2RRBe_YD zWuqfs^ne`?T%*n;CRiZ+`mubbbF|zj=Ic zC=Ctmq3TD&^2qCV{9d^qB{YJQweN?03@#d5S%eyBwf|o3hy4h0ByXjkG%*_OI%%sp z^uSq!AIeeS_uv#u<-VRatMLPB+7gNh=E}4Cb=dX#-)VV8R!JhV(zUM@>WxGRXzrG4 z55{zDCAHrwVj0CV53mR`lK^Evn!h6sONTQg1s@Vf`_8@_zU5+}4lgEU;kLhfRT-@? zfS0wAdQ3`0%`gbu{c0dha}K1?JjSU0E|u;-Xjbcbymrn}xN<{50;N-53RuYtJTHSP zZ|}XPn+I0_Bu5M{&7tfajV4`+PZQCHQN8T9qRTn@!uO`in)Y4B z@ui8BUcpULE<@=S9F+uaJd|N(&!SG&)}qZaftalbj0TQJA?22y!_QQ-pH7MCtsNN- z9;c*&_g-v8?z-qC!joNdIvzRszSwobg@Vc+`(`je$iuv$UcZj;7Fi7=(z^#u!(9lG zUCFAOdeoB0#BI}KjgWWO^y3a%tK|)QuIp7u!f+_@MC85-cAMjYQ{p{Osf~;k2=G@{ z+Sr9_`PxYiXA01L|Mf91g|DpUqQUvj@iv9oYqj9J@}Cj=BB(xV1g*IBxJk8}8S+$1 z%5}DP(@GJmN22#qBt4zFyfK1917Kxf`Mp>vBorAibR_+O^*Z>PeZ9upTvDwfhXJYj z5CjHU$oaucALYH5yT?0wo3CxZwPLYfTZ`?&myqX`GoQ@j!@(R5St>GVlUPu;_Fhhg zf#Uyk7?Vm&UP{yV2AuX!non{0SdbM_IPdzD`UJ6YV%4ZPSfzW=xr5y{smV4N>?Q^@ zNOpZLP^sNkNShZY@bu&MNJz{KM~rlyU>zx)pS+Ad;2}V7YtYe^Wr^x_^OPHN_Mx7bZXwac z1L44_efQnc(%N)bL%$!U!83R#y=ZzFse@%bCDGS(AaOOWWH}z-WYH;W9*ANT!n$W3 zinQD>+e2)o@d(ppl|x2@#2D9P_% z2g9(BfmJJ+4BvQ3v6n}sv7UFz$bYAKh@u5d2X;_8Gyfn*W@!Vq64c5z+eT}PbcY5* zzvGR3Mag1t*T}bw;b90f8OKWjTXChcC;nc;~iUi^uUH)d#l`#wQCdX_+!L* zyZ$HH=Ev(~!|4m(z@42OQoD#`ya;PqAm1Hs$ z&pm1ng8}gDT@1X_3t{O8ux)aqpa<*4>kUez<96-^UFOv_Gm;@Yw-`$s$v&ZP99h92tyr(+#~2M|B6140ZkhI4vVZS;>%_9I8yVlSBLPQFT5VtXHe> zw{p=RSHj^%bud1w!gH02R5O{Ka~U9>A!6f(W8g$`aL8c0xq6sXjSX_x7I+X|RBLl+%qk^gc0Qh@uPkF$~bwA4HKE{2@ zo`Og{KD-V(9Ou68`yIcNvFkvkKByb!5^5XD(S}_u1G(|+>PZs~YX&nJtv1pS`pTzQ zaPMW`^Fo(g>swW3XqOqzS0=K{MDvxow#!`4D3eJzo2Sx=)Yz?-tG$K)sFa-=E0NLc zg8L84sZZ&ZaMVS&#FT)HnRxg)yIAZ~T7~o}(M0`eQf10-Z%SqIQ(DO+_SPj6pW*}R z+RQc*va5_Eudp&`$)qjd5LN~$^2j*y4ePsBI^?4qF=!2swA~QS0&(pP14Nb4I?@<$ z&aVSK(dm>g(S9p`GYm$487*QcArg7qU1i!{NY%&$jeOS4A>)#Z?APme z<*%3OJ^a&&WdigAIjHD1JZ8S=|9!gtpLZUWuZCx<)o9qR_JR={se`*AqU_4$|NBh; zmTEwYudMt(VCNn_T&v;lQjOp7Uwx_e@c%8XEw8LDtu3uQtV4Qjt-iAS|CT;i1E&2O zi%oc3LI1{;qttv_!g|Ga;|RAxj`01+#vT`X=DfPH%O9bTv6!Mo>0 zKucXh|3@QqD*zaNGzO9cNReY$RQ<3UUfdxJf+NKCEn0Em=O{cM(e13?8+5}vq!;{t zdw4hCAd7hQjupJ@2YBbv9C;WfFg%xVHhbu&z$2OjbuJaD_4_!$8v_$|yc@LrKAbBt zfD()Z`y6!!nd}#m0wa?=KN{fu3g0SVqmhsSN+m*KYbap=Vd4RK$5aOf8paMWiRW`~ zp=IIO2qn7F7)~8eH|op>)aFY#oEeEgHC{jO9K%Kw$1gUI#TMST9c}LHAD6HNy&#Gt zl>=j661Xu-OpU@XI!1@`9aO5MsK+u8q8f6f$G8Lj~&Q(+<@odAVqj4c9OkFy#&wHiwT&&3gNPrzLB0y4dUr6(KH^RCEp z58ckg8dRN#q!J8OF%CwaUYB}obj`83)XQ4WRu=7WqO5KrtUjnJLP$_FfF+Dv4Zy;A zzQZM1&HSg)(U*UJ@jvJM2PSWH<=<7>pSO+~=l|;J3LKkj57(BKmRDD5Yj}jN)@rpc z=l@^uuUbTWklO*uTF-vzTGT3QC`0|Oy7Z`8uZ!BF^`+YS>XN`w!V_NPpcs~vg+v+X zgnlp>cj>hC`eO50Q~c!LJp=wgW_>w8X+nn(*H8ZN%pZo4SS7R*yGS&bs5-gtqwHW* zMZ1Jpdgshd!sSf<-%S#%atwGAgNdnazuT4ag2XrImoicA<89^P(RK^EwY(b3*9nGX zey{I#$yc||O&z3wM3%*IMq3jyI$)dU-Vgz_D#Ds6Z4)@Ks0qyb&^tkv8;0%jMPA9qTJJ+BU!AqeZ19z*Tc=@7aP_byHkt+ zMqFA=9J)GNlt5*ZDHIiEOPz+chd1&-eT)LH8~nkNKJ@({@?S@Jy6iOI;$xw}!|K7y zBx$K#0z#nE$rc(7zN5nJ(IO)Db|mEQhD@gE3I@RY>nHUIns?R>+gG9pPbv|ebq`w< zHErmRt|>PzY@AM5dJB5pebo@F1?5WH?KG~Ol=U~qdSa4Vh46y4z>UJuQypCVMn2$0 z)&hdV*%^fak4_!!*cZ6z@PWs`8%BPM?f_+3Y4pAVL-~y!7c7X~lZC%hSAYxcu!rNq z6)Zs+&H>YKbBXRl5Iz!}h#)mIjxlC;Cf2H}Q48g=EjWd)fgr}|h&6Bdv}E9wXbMW? zaRZ$X?Qc;S)~DOe*4C4)*4EJ$^aWsibT6RZq1PU%j>u-g`EZx)3ReN2%8$E#{{mP5 zsOJ&aqt?PtxXbyY(N}pS&GsUwodU&w-T8{tM;4Tlu>~}xT3VQ9H*R)1P|YH4J~=*I zp2o31iqv3Wu?dTH-IDr43YISs28O0pv#d-`wdqVoo-?!G zwe$7Frf1Y@_B|aIyfK}9xjboKGJuq=nTE8J-A&(Xu_<{akomu*wJ-eN zU-8f8|Mct=16W%Tb>PUW@c-IF0qkFGd3|{$$pLP$*1GVR<=dn?VRZb8n94Jp-m6uy zSgQaMCAWs>hA;eC3e3*#Aah^52#2WK7xatFuZ?wwcq!)~STUEfuDLHDsNhK}2Q z+H9KYaDN1nArdzp>C;Q$Xa|8m1$rg`0`_0x$^5_>yF2^GnFwW%ZRQ(??I`HHIc;PXvLCf3vbL&V+>6&_E}vMq7n`rPTg~IAyE{)> zFEVK{-&|i@lz(q~@8IYcCx6fHg~K~1zxo72(hp;@0VOUlDU$Y$=UYX83o$7{r@MCG7T`ZPL;9oevb%U&aK1O) z?-72_V6-M!l94x5H!HZO`hL6ZM*-iZkQ_QZi`rw@26q)S#&lbmJlK zK!|0<*h>P>7;1b~t=-BcovwTp14~^}SJcRWtaz@39$`GTIWTPXPx1O-{}e&amwyB+q^6^+6n z-z@a~(M>qK0$Os6cSvG5DhPBAEcIHTxa{SX$1Yu^(1!?g^G~U2$Gey4n)Ik8MHn$C zTthSX!{2bAV1o#gaE20fGP()|1M+PGs0}rd@Vj{6!Uf(l32B%VlgkRG9<-0Zpu`$u_6P65|7LmJP2plZF z0z$3RMSFKX7OREy*1~pqQ(HRSNCyuH1lmctu%)*nT831Gu?302R1JBfw)QEH0Cq); zNZk+DH)fkOHSJ5kef27~=O%Brl8DIHUZfT$VgdyHVZ$Jr?fv7UUu;Yx|G^om^BitI z-QC_7iGPcxaG3@?JYT%>0(7NQFez%Oj@m7AwGImbv(%P~D~0(`)dcj!yCM}k;gXE+ z2^=msIyzyGKhvCXHy3`|eD>^UdwXGF=@v--g$2keu|gz5Mhrq>2CK}$?$e*Pe`#W= z+LBv}E^<)}gS|03Iem6<9VOy_12kG+EZ3y@Wax{qRurnzu{EFK+BE-gi?;mRLBNdT zhJuLcQbI3T%8M{WREj=Q!JO60?qGESOHnC4dEa0F1-thHgVDA6evo*VaZI>?X$wLwVPHo{PlfE;^4 zgoKz!p(oX5v7)NVJ@L+Qw;>zWKj@-hF^VHh(~@vJLg4|iC-IdU0~V&hq63>2DY7)I zoRA9V10bX(5mpArhUWr^f#f)K~G7!XkB;j@9{fF9*!f=!}0MPxR^jNA} z3CFna&)erA0gnBP?J?@KYAiI9YE17m9daA-)?=$SoRQSv6r2yVUb!Svt4d`A*xf$h zUD}+88cE6H{0dfG z5a;UONwp?@@rKN&`8V)7xL4lr;drWX*}x-|59g;OVEMpBP7*o7*uf=#H}DKZe&ktj zi)!r@#YLPAQCq9y^$>+sggEFUUk`_&^uT`6ZleWyIKH^lJhSxpy#JCMKHE{MTR`i# zT8;rICSDI$(8dnM!9aM0gAw|tR<5bvoT{h7Mh4Cyf7mC%F36?1FJ!Rx|Nj~1f zhs6D*b$zLurye#k@!UNR1^TTkdP`oD%FmRrk-S?)!B|V*v1S&yqp*9T%NB7k4YB`n zcXva5>0v{NPFEk&FJ`T4R)Io#`40PzwgUQxZ-}K5-a)`968nI1cvTGzUK z#Cx}MCigCP)QdW2CDDhaQbJLgZbn>8p1Aw9XTZJeoORC$*dYNj?QWB#`iqNgXoB41 zM$H4jT&;K4hwHtSY@r}8Q~-hwB`q6){6&74U&ozfPm0?0kgP*5bLJJ!Ok;6;^m02b zPmlAY&EljYT`q#7wCIj3pDnFXC?|bUHcs9#Fb4QWt%O2>du9eW8wZfpW6cnkO=*IN>hD6ZZ z!Ek@uHmqu`d=U5M+M` z|G)9>fTJ0b6A++bSnfbU?1B;5f<*}E%>PP=&EW-xKA{6IZROIvnSEv?dxXeOUzXuN zN|1lQktd8=)00ug&ve13?jiITz*J()`$>us5`6hFw^1VT7Jv-oB6AL*ip&7rOD{>a zn3KR+&#@BbBqFS2pG&Y^JLAEW0vqWd^$~^;?ei=hpvkV!I?{ZYK3{4^^h&n+TbMFn zPq&|KzT7=-{q%IJCGSKx(ihD<+km&g%vHhHz5tMw)@AGzDm-aP#2N!6T7+B6j8?KW z`cp}V*%9)b2So6VO{mP<AjW6uJ!Y!f72?78$W*yMZ-8sBO?Q$2ua{D_QM;@P1p;N7XcZ0S8U!& znBF#S4abH>kKLgJyKdoBL;;Tib^$CQ>7qV!>JnTrT11T>h zgJp(u)qzPJkAkj)X_5S3VnV8tD5|?6H{4H0PgY^KJ!v&JcaKR0;nm89lM#DGe<1gw zWQQaz8qX!~Uzo`Jpp`o2sTH*}C)cabGs;5qD_~?cVc0H$wzxz&KZzT0P;fRDwc|0g zD(U;^FWv*HmCR!Tx-qywL?p|a-xMPEnlz}n;9e=2p%LH8drB`A+x|2uyR}~w2<&4-@B@0tW%|$%u={n@dsi1 za`I=oMDmAvXrYDvm71Ehm6B*~Z~xS4ZXc)4G3CDBBr9$$KFf-on>x!T(|u>zMtz@k zj_r2edydtts6nZin^rSr`XgN-R(e4{94guM#9VX{7ESz&?ZFLw)Hq~kgsN>m zNxYq_afK=p;vtv-cw!)=#J91*Q#5U55VxLO7?jN8OLUs(7ldTQ>_sr4*o1}g^XAe1 z&i?atj66LgO3Imb#KLl6u*a8ku-YHffDm)+-5 zDzsI{Z=;(Gj#?Q~C~$f9_s}fxoMLlhIdry(1_l@|uus;5eA6r=bSsC8-2j~&OINf| ztgTeMx?MSxJz7uPnyMN&;*TFo_E>x?^v=db6o`iPWkUqwdl_+0DWWc@;g>qNDU%>o z9fMOI*M$Yx^r32=6b#^B8e`2)@~v0UF)_lR=O`mf>$WTyh0;5s^f~D%0tq{F8T2?C zb={g?S-))1x;@?7no^UOQgnu+q*BvqHao0X1&VbGu$M_h|9y&8@^Nbb~DV8dF>ixf?|1G^Jm!r?-`h)(V{`bSx)d~9FwOV~; z)$;#QBmM8?r7!y5f5pECU#WQVnFr*vm{x!&>nBe|p)P5+Xc&ze)*h*FKj0%45V9{R zme;k~(Q1XDZJ|p+SZgEWR85#Q#?A`-b3o*%LqZw|{IL>UmhAA@55!w^n2=|u1?>Q6 zzHwL8M`{2R%Z-%+WpHfOe##Rd47y*SXshg>UF-o&EW(XFwi_8)VHnH-jm{+%Ts0VI zpoZGvQY9P!QH}5!DGdaT4wX=O@9DwL@!`?IbL<&; z9Egg$41T?v9ry|DdZ`bXjKhT*`4NiIkl@B6qmj*;#1_yTn1Jh`-Rl4h z9u3)3PSTwgi1=hL>67e|e5QuV=V6b_a-&8099nwq)&Mvfb9SN;{RBhRm<-D=-(XbZ znv7+9x&aewoJZzr6f(8kE(p_fp0X_4Qbm`+`G_AiMT^Hsxl<6TE@0678M%7}kvbB& zda|C0Ktcqf#w@27$^C#_AP_a!IlYwb2LyOKGfO$W;AV~4r~!1gUNks#GLUc0gzkk* z9JqHXq%#MSUXv-{&gK9Iumrgsg_Q!!2_r+mQsIn};lovyt4TXTj%f9Oaa23(0ud9? z)f?%Jdc$yx&L0K)lU7FwAjJzPMHj5FRuwSx5IVVSR2_Ql#7mq^CZ&>HDZH6aR;!1GV1;FOsC_`#r>VS9eNUxtAH&Ydh>@{f|smcmU$1oE4V!o15 z-Iw{xA&mq+p0b-*=r>~pJNlWPAHjJk9y-d(VN#+|R?5;~cF1k4tOI8SKB^^Y$E0@V zyF=>se92)?xP~cP!p*`-r(h#?F?1@X#}DsB1_R~X)T|~BsLY3?axV&?bYJMy1TegC7`Yw69e)zf0GRN9D2RsQ)kSE`f%w?Oxi zY7)_S=o@!n_Q>i%<*5d8;en7|z3{#Qmp%ZH?%(!9?@~O21>AvFR3r!C>e(b((KF<0UJ{S}TW4Ilu@>OCv(UU!}~8~KGyK7$WH1Hex? z_s)F$fK)(eK7K%tlTETpxJ12EkI5zSJd3%iY&?S*VE;v7ze14nU*|JO_mzc;;m+;( zV2|~W)gQn9@ggr@e*GHWVVGszAy=M3LJa9qjMA!)`rHFi?)$(xo(ekY7j!Ntsh&UN z-qirY0;62H-sI?*Oj(4X)llUc%xOBw&6~2l(yOj!8I@1Lx)P=5kZctO_u+c{=9`Q` z3yKzSv9*xp)K@CF!D4)D9E{6(K!O_shsl9SaQN$NIEo@jhoipE(;g<2CbfsZroz!j z3yF90C_g5?o_r+IUMEk@Xs`-9(Ql9GTDL?;&aj7;C)!6I#(%K}+ooD1G8Q&wLj2aS z&=MpWw3Pl`Nd!#44Xqk?o3fcgkt&?U_V?~Ht5UgA|m*d>>g=UWs~2n{ zXC@;Xk&yu({?kIT|Kfj+{P)U3N8C3a8UlVsA0X5Hf7F)iYby!=&r8c+E%BvAczK=&=RN=;zXA6A#vs!Pl0$Fjb>zPcjFWd&wcE;_6tD^z3+U0*JJC(z5q z($abz0R4739{qut7k)-$s=f5Fh#N2QhaR0`=Wuded4gRWM0iEi^T~{jy@nA8D$wbm zM_$O^3%XR&$8c+rwBVyapEm&v5SuI!frFem4eP=irZB)Vf(J%ANzp_A!M|ZEVjo+g7vI8R7Xyb2Qoljj6dY!^ zI2Y70AtD!3sfOI*9a8neMGiU_oh1p#uG5>5??+{(l73`GqdFm~iux*3*G zQsIeqH$WpkXmB@V=hl4!gfqiXO5_-P=%bm9^tE>pva=o?d|gnOYXIm>EdfF?gA%&L z7b2{&r8+r}k13fpv2y1Ffv z9G|y^jf}CMEa5LO3d+B3%z#q+UwHEJ*|Y7V7CBm|FReTRs*?-g+F^4=G(v7^WZoVR z<;#Zhlz?-ExV!~hvM4h`QL?Yhur49p!$bB$M%e&Dakep*%7*xH!?=&*5Ni?!YyV5g zbGQ+fkjV`p!yLEp<@~0D?Nmt->CZtT;!f!**y<}grq$7a2^xnpb9m^!Y2U?Rzf$<6N9J|TtIK| zE81sCJnSvP6fc)UdIgN0KhH=>=3$ejK%Uq>cYY9xgQmIF5PeTa_8|~c3u@!1OL_K1Uo#t%QW*&e-#)@C(N3TGo(@% zFUyZFskJ5XjqF27tSIeYxfsz!B^S63iu_4mFGuu zsi#bU+SuQi#iLa3u_oB0@i9dm>wYpFg)-C*U5W?W%Fe57LGDmF2(=C4Ki3|dB{Mj4 zdc3y=1#()8)?L@G8~g7uE-thvw(DU(XUCTP?SKlOitll|KYml?w>S7k&$el;Wmy|{ zF;9my-h;@)W9gJX$#sbbjBFs^%}h21AFLZQaGF`i4x9~>2WXgVfsYw76Mm99>&AL{ zBGwQ3WJfBcydwW~J8z-E_GGWf(zgiT3Khj=uUE3z160KFb?hCwmXl;!NTdyH3&hNHfTyHPK}AOraEz^#ka~ve8ZsF1m>2|(AWyd z<;AQm%YYf$J$T+a+iL|dV z1u-)>MP`E+bWZljIB{P}$KBkxZ)82%cLSqsO)wCvv4}&oeRKqCUeya2pr^e=M_u0^ zm{Z=;*H^?#9FtSEhJ>lg;7g=7AjeDbg=c6T$lh#*thA3MM(Bg!8_K$&Fegd?CeR9o z>fpip#^kopwIn~>%rGA-P64J5>$>y20(kNUa`w~*o`86FUVHQbh zbgvC>MAn?S)qZm- z8X5MeZuS^?R9{7BcJ*p)sak&|>h<;7(t7>7G>7VV7-LncZn0$hCYQs!^C}+0H^m8h z(&4#P96sXBoax@)=Ihpr=JEcXmYC`kQA0nr+TA<3$NPC_|LMWcO-sm~^{z-7oF(_I zbOGdsP(i<&+$$BA>njN*CM}=aiMlmp4kX!uW^40ltNHJk)v-kw7nBSbKub?FA-B`S z+%Pq=m*e!XTJo$%az}0;SK8N zBmt(M|FzmOrmd~4qS4>l3detWxV-x1{QnF7$@t%NG&$2xr_(Z?yN{|%wdxX_PD|^{ z%j-*P;`+w#woMQi;ZhLVeBi?GlWS!L%ig^eB~eK`?Y~9J*Fr({+i>BfC)mpq2p4qcm@PqvQ=&RJjN!yfzALZM&wqX#m1(7%5#sK)r6 zapL+mYu5*T(PuZ_T$zX;XvgfF*OUjHH|ae1B5H{|Y{f{3EEr`+c8 zQ}mQeZf3h(@}#+FwN(_!!Fq-S4H**W9dUSfqz?tfOy9+PJyZuBgaPS~QgC&%qWE+j z4^04U)E4#HZGS)-&k7J~ZNP$p()}?Uzyysoa!AA>7iNXC?~yNcs~K1oKX0F(`|XkW zvZG^lvZVzzimh=_<$`QS`=RhzTpF=9EM*EJ1%v$zlK7Tl=hB%idgxT@g0-W_;3ra= z#iY}K8qXNmhnrlL7v{0C=HX3@xxLoZG$D+4`sk;;4eRnVAzj|aMy`_pmb`UxowCE$ z5UZH6q#V5HO4X|pagekYJ+a@BL>Bw@2N0x6=8OIy(bhyN5m#iq37g(j{x7lJw(Co) z>nM2OK_WR3Rx@F&oY)NStQqrKY+OR*6u766p1x;S|xfk{F;>rw``XbGZ<)ott zsMUhIbE^)28pR(6YxurhAA<*X9w?#rzUSCy#?JEftzRmu8Iz740;#EL9O!72A_ zUq|eoH)|~?a!BS`yGDD0Wy3jHA{aRaWeQswbZILl#O6l2c9j_{{)QHmR3M6@DLh4? znH)BC8j>=r);XdziV~A?ls+8K8HJGkonXjZaU^kzg?)B+Tg{hSTieZMMQGRuN(Z)N z=Xweo%5Eh+4IU|XByz`Ott){-Btu(ozfYpI{vI@oxnJ{TmhVN#{C!~X(Qs)Qgoyx+v!OvmoZVzsB{c3QHrAsKoTR$H)%?3 z48$2E4nmfOF(Y|grTfI5*B*u{f(D}pi;GcF_KxjMhbkq!%RQ!V$Qqbqo=9IYYm9+K`HI49F!XAit>Pu@W%?qPKW)ws9GrNB`Y^Mi(~8qi&>uJ@y^0>(knxy7?tx3TS;$LfRT^3L1!Owvt|JTD}jlxiLhRW(=8`=p%0k6cT!A zph-!GX94>#2^oE%{~X$4qWt$Wx`3N?|GQR4`@j0iat;2h)};J*?Th^PFZee}{(DJc z%Q~Bk)oRt+s;Jl2S01g`SCb*YRnQJZoXSIUAbrStmK-=5DbXG3TX`4$-&PFV=Pk3l zv;WifQ}}5fw_ae(FDU{|e)$yHu^#o-WvU2yzPXqsK$cB6w1QZ&6D1ZE?1lEk21={bAd*Ypx zNa*ADgOuZJB=Zq%U?1`yYm<;8AZ1VN?eLW+=V}?R9I<2 z&9{Bl_e-6ESX^A}7bM-(AmX7|SnL!E$>U>|G=Jmc<)9lMC7aloM$bF6ycKTG=o;9h zwcEEzT}f|eq8(gI8U^np#}EmA|10sobN=%U{&?tr-a4lGe_g57>#K0qKU`a0t=CqG z7C`;4`WOALzv7?m|5ZFAf2wK`RDid`qsUI+lc+vjX$f6^Js+cC`?c2{`)uIN?$gR0 zA04fsO~AD`4Df<3;&Ymfhm=cJavS!X2nXpN@A>{qj8z+AYec=Wy28|jT)t?w&u(0g ze6pK38()x_?)TWLAKSh2N`Kg`^u6o5N-yX>mi}pNs-sRyX3O+KG;BarG{f`J4Z87vh7uB~Qnu4?SB#5XIgFN*S&}zKvLyLvnFtKPpx6Eg zSaEc2grhP*M@|tLRg?Rp!ClD^KrCCOpwM^Z8uq~hQBM0O9z4Krdn?hUxy+Qp6Zvgo zIcU@qUpxtcQn;yIi@YUar6|3ap z^BKSE_W8+XYNyE`Tqp)%6x>ekww;Up`)LOX<34^Q3mW(w;b@c3yTxY*2MzddL*{_T z$?(0XMY$UEHzV&vb?Ui?30Nd`{%yq29pd)r4lTllyK)GZWf;`8y&-gbr@;j$_6 zNPK&{VP@*>qK_(WIj*y@wITdl8fckPppknEJh>V?Sd~*tWTemobDCi>A7NbC!|4O1 z?a)!dkd@Ohno)p?+|#8M8yDk{u9ATQ=*~806@(46l*NE6IoS^ZwPO+t zMx|IiSwshw~^J4?pF+&W@UC_qVW?;q$yO2ce;0&Q}rXF7b@`#<2tEue;hG6rt_h`hbf zT(pNRAZjsQWh3vMwSo4(xD0-~>h}8K;CEog#@9EucYow%*4^#nV?c6^{N|Ibr`yk- zzu5WLPrG~j2Z#T6)I5Iq>gU(L{99+0P;*WtIR}o+N`~Z6|5B~Kyt2CX@X>b)h}Q)k zO@Y{TKyaZ99k(i;9?%xu8}BY+_P?UfB|y+PGOgzJ;pWli@xhTq(O;3Bo;iNV^{gS0 zvf?qG;s~NbM-pWaS$0#Fh1KymmVq7WeS0h1WZaC{fJV032V8JVE^9^`71&}{#>og= z2)Fr-{6^l!JF&0pjCO=zhk$llXmir8MP9QXwrY(WFC-_mo|?Mc0Q8C5GiQ}&TQ6%L zy@fJ7>bG`28f_=3j%Q?Q=4BY$WM&j_yraYXSwM_rC_^d1rrr(1EA5NX8(rd%-{@;% z)X1V#kNimzjG+&tM!;Se`{4)=e0H3^gpSj3REuv;PGGN#0uDj%F7mtQ4fra3R~IQc z@~-_Bx^K`O9!Z; zw?K|<9qjFG?mx{lebtxBTQrC=#Fcd9c;?F+WNU&dye+J`=MIpIPHW-YL$8*#D)$wx z?yObTD)&zAX8P){vyL6Aul03bxzGlz1nd+kvU#zX34j5h>B72)IYzTe;T+Qg3 zn#4tO%c&hu9D#Wv6_w2Jcig6hV-mkMH`SdQvA8m1(F+M<%RQoucQ6>*7#$t4nc z@Vv^-hGhqJ;~=G4l6XY&Bl!zxNu4q(%{gBP zZ|Up}O+c!Y4RzgP0gu5=2kAg_0ND$%5uY2GN0zg*>Mwp9YPG*)nMTu$5am1%Ht@bm zA``whLsUb544xtUz&^eNZ^sG`H6jv^UEl(tX!fxbZ{mhDi{k-sIsvkLfQ+Qon)ahl za#Nrb&io;q1;-@sM}3SuP;YsRf8nFwIgg-V-ZJOqa%cWId8b8>beOOqoejg;(UB0y z1-$ZvN>DHyf~-pBlw3aP?dJFMtbiO04P3iYhN0rj@CRQ7;zL4?9n?n{2qGYT+k6?C zLBYJtZ{%z7*F06g|868$J5J+`$T28vesMd_ycuMdGpsZLH zz%7ylL}~FCa2;1frRt0gf!)R)ORWLAsq}PsZMyf@?xEQi3f-L3E@9vO*%5g=zBp+E zO+hKOQoXeNw#1*yeIYYAU-`%{wu_~5AIQV)trrKa{RaPTHS(D}KOQ&o3wfr)FmF)^ zofiPh+$yWgSCIHM4)dg)w{tSS{ru7d!${`4EDgkCI|bU&?Td0`XH!6u z=c^<~+jQAQ*K2eaN0{U3zn&i+ZqTv7;Z*Qk^a_NABXL&1IVRVYbom@GZA)@y$P+-H zhdwHkNd?RhV{8#fKzRdpN*dku@Fpn|i~ONpSz0OBM5^vTcHAN~?EqfTTjnq}aJ5@; zw$R}Xfmg&}x8DMWw>=Q$fy2q^Pc(3OCND|Y2nllzqk_@xTNCP32r%cFQJg@E3IT;+ zpG~NXayT0ucg~PZ(ww^fQdshAfCJ}m>d?G z0m#v?)gAyaJSy(KF1oUYuMb^m!`B(4}>|bc8U}e4Lpo22}46`w(s9aN`Pgr?I1#@xQxTd^D$Q0?;=Lw&>>J^w3nW>_*PQ3qY*CL9!(b zdKUtThH%h-Au)=hFod?YTdD@2>UCv6!E)|$zu=1D=-{vY{uceg!@;x$=qf|^H|})> z-WefqsjAh&*n+`rgIFXq7U|+gzJ&qO{wzHEO>#W#VHm-zguMZgRt-2ZfSke*G>y#O zv)#?-P59mXX!cc zLEjYV<%GVpA`v13>W`#>o79NYeE1m>p}p`Lbff4w9?6)X#M-~9puU0!}l{SX$ zdFD}sEYu3-Wg!)mBI&pqjrDvAQv`6NL1m6RI&ChO9B( zRGJ!Y=(+gHZVXBcD9_&Z-oeo?G0<$L<$xAx9)nZsiw`F2cc`%Y-OpBE0_`X{t>ZFBVs#6xO+q-HU$yt z63+?!L$+@%6R?tyDmt`;b32m1F!NXzA5rIrKHZUj3VOWsfcwPt=u>7yp5`q$W04OH z1U`n{j`fBT2R1>H`IuTIH4ycsg-4o zWo@Q}Vz^5`~CJT zAmIJWtzKQLcOfgATeWa=ve=z+iOsFp^L1tTzRjJId@{X3aP{C>;6V?a#$7Z_En!!wqe=Of|RJ%O}XQIZox%vDnSNzF!fQV8@ z@Q*P8^dDx6KH3#j7<*hM20BbreGrJ&cRW44R_bRRvNTb2fJhhWJ0g=5*33a{O#DNxiB)&?A~r`=AKv#N~w&6#S@+krI>*Ay!(;{J!Q{ zM^3})CbG(fV#BKM%SI&3ghrI?uhbK`a#b~xg;WR6)3woy27$y5ZjI5}>r0am+fzV{ zG4_Kk*S{K@n&A?Kd1OivHQ9ZgXQAk07qBiu#D%r`PQ_$#{!0y9pu3R{2lBk-;BT6C z@0619R3ZUp$kcAnkxy1QPl|ZLVSL?vY!hO;N~ zyyqqueB{=IQ#vGXz^Ivz7hT~?(`i&r$q*SCnG!lGi+`B3OmLn z+P`(K3(}{&ka-TE#6q={oJObFR>a^UTgDmuNb&&~N(r7!(XS$$qgu`gNFccUfkt7h zjt7(8-)`qICu2%S`1vJZ1wxarCmOmu7Ne6q+>q$S+sh`*tOgd^2!B}FvWUM5WTlbC z8gE0`?L~u->Ltx8Nz^%2lBSA!KNFMpYC(&W6< z6AeH?Yg;PN9H`LKKfDv#)Z4MX=qgM6dneT8XkXGm)In&KF-vtz@U1ZwW{7Oe5D2?B zO-rm=B*rD&*2^+#Ph^jJy?Q+2y*u-*$o|5+`Vd{tT_~#Z?<^&;{sRolX)vNT7gxhB z^@#O7b?yFePWa!z$ZLPc8`*KmLjT^NL5z?ft%i0;EnB44CP_NN&|W)}`Gpv0#B)v> zjCqAhGJgn)eU!HQc`wUvQwvN^w3X)>>VSd4I5nmDXIJC41QkR;NF`2h4elPzm*xo% zYo;FSnf3^N@uRK`|3A**(T0sA?<0zIz1oB)geq`niM>B(kO&+DBvkqt2$SXb;Q#LU zH;O1Zmckd1h5PdBOmRkG#gi$-2)%Og|2#{9Ds1n6eYEwhhGOqaMN@=sDZz#ReBGlF znXY&_yVB^cbZDfU#v(&Sf532O`cRg;B-pj7rSz2kR#^bE;@+rRW%^)-IUAfvo!US* zh3mT{YeQ(vVpDiT9f=C?G3=ot9iOhCSpeeEAazmsYooL9W7pqa5WnP5&U(nMyU{HL z{_lR4QUARkGeJd0lDs`ps*;n11Xn+kaOwXUjnW+F>A!)y@0>v{x)!g9oVYD6E=jU} zSgClpZg6vL2^8?P?!glKE-ss~czM(%zD|!C!TTGZc)o9=e}&akLS-kEBT$uopXoo1 zxXWP2?#EMJX5XlodlzNS?6@d$;i?$ly#R*VLQqnQYvA}Ly#F&gZo$Wj+}r$F7={Ct zND@CTjoS)HX{oU8O=XAw`TTeKJY!(gEepLg08UEDhLfI|{L=L<|JOEXVLl3Q_o=>H z#OEw2swI@9R3x0q2`N$yEyd!|rjgy9wKJO7Sx@u-ok-82o1aH4^=u)ph5x&1-YLu{ zG)1=Oe=~8}KRl?dOWiJ$o0~koKy*bS>bHYCoy}Cdju#g~r(P3cjYX?c(nb=60|=9& zEXs^=!m$@-*f??V@Fbx^eEMI%mc-^&&Hm+gk5!T~SJyC@_+#L~U`arn1CPtEetLwk z)T(K`l2`9H%rmTc=9TkmtWghfo)}qFA~TVbkdnh3e_%3Lq=x#!?5#aSGrRq?4{L3O zh=f}j^O-cT7%4-=R=pM^@Y^0WEs2}hk&BXqq+uB8pcBs}ICBf8*YIt3)PHs;?&CKp z(EgOE+;P(t599v&bx&kG(=ZYzyb7x5sL_2%_To2iq39fFQV32N$gie->T|07V`rpD zn49K@CQH&zz)>>ejVu}z4k7AYUzh>=e;Z5}`ZPpN?5_EBRHq(Z==?!bd{0j?i>*k` znaU6gCoST0Xk@ef&4`yk^SF;honPYV|M;dOpWv~$KM6*u=)N3qoW0XB6ei^)@elqJ zA7i^}SRpA%{1+Dger?PAKt$5XX8jnR0`LC63};(aTEergS-2<{)l8NH z@9C<0l`KI1Z2I2}$!$_{a@1DOfR-Hg|Kjngw-9NBuur^!dHnxn(RaN;+4EuMlN1R) zCAzoYyp0s7(jmCgkC$AjG_v*|qrBcuBwJ8|Ry%_x4ZUws`!ErXVRk6ioRszDI?56kivIX0 zXsz?Z;xBFM^Vcl(F2MP3QlM)nHcuZKZ8ffTA)l1?aMi6Iv5WXJ;Qp_14uDN5R0vI( z1S0Q7h<^if#?3w>bNGLm18k8ApFP9Rm&B^x-uJ9^Fw*BXwDw@AR@05nk*f=d)Yefl zpw{?d!2u|+G3_=z`Ry5>wPcO1Y~n_@5UW@`O(It{dN#7KO(VL12ROum;s{VFc`7`g z=ftbtF1dW3n@MSPT{L;3utZ?L&XlwErDc_x5#L-{=tN@T)1|$ENOS=sJeM{0+4VWM zHnP*M3XhJ2=&3(p&+{>%WdAWPY{~pov5;Z5NXjfM1G(cv)DhlOICEqE4~6g`!o8Ot z?f9hk8-8@$kn9R#sbTh4mDFneaxvC%gELcprh_+4^PbUxqxk?P5v!kBDs{7$JQ`PV zFA^HwN1A8A#F1b_i3y?d=0o`X^sn01dO{0nRisp8e1kI<`ywG(@ZUKh)RP2c)Q;ux zYyzGSeeI4lcUrl59G`o4`8uvkDNF!05kI8Qn8Ui^vg1T#xJ+G|$(E{0ktuBK!&ZTI z>&{&^?}+2+aINEu-BPs!uaWh)&FL|E421?(Kt63?UTi0Chd;wKvr23hU74I%A*wu5 zk#LS^dXl>*c7>;aQ)(IVS_V8*wJ(ZpH1_D}+(t|tT(HDBM!;DyuBzj8F3vLplo$&H z6Bu3z@l{qcBSh)vdeo<4VDN9g^w;rKTq;lYXcG3Gt2wT&C$fV7I8TGt>7Q}n;4{$n zU&*qahU$pTcW1(Kt-}#Wke}Nm`js0DTVUrVn|SKfuU#KCE*jG#7*v%l2in%7T;sJr z)d(4j2l=8*$3*<0=Qpe6(Os6kl}Gk0Jk#a{6Ef%DwPuWp3~^H64*dxG;ev~X8|pm^ z)K~bG2JY&nXU+-{XK+B91y3GE3`;RMq;k{&j@rYG)n@1i#3x*qZ^mo}uF)G*u^T^% zu$UrT1@u|QlqJJY3DAYDo&=H3>Zh3?eRgOlW^v9wO5tCU&9ay^W>D{lYIAasE0zmf zQp~hiEQU~Dw!+>_j?-a5ytUeLPaU4p9v{t|fxOu=Y^0uE$-cM^Mj&YZR%g+{73?utFOm5BUW7+14 zQH@kk#Tjxl!k;bFGN6SPeA#$8TsZ{JoYKO6_pV)+32dNILR%2?WQAL^)>l_}bunI9k&dV1kgrs`f%mbDqkSI0a0d%78?8SaS*l zF(YNCcDk1cgWcAz$U(Exc!r3h-(5)oX=y%gf?hB#ucn5w(r|egC+9ae;;D|9i`0bj zRXskN24gR7%OnN_>=jRRQrGEWf2zc8X!C0BlLbeZObQa9P6E5Dz`9@l3!W_cB-pe0 zHye;7hZ;2D(*|#7QxC;~zXZ9SN2Az^_eUx?0U|IeHCjh6t59SUJPy~ANqoLJ4%!y)bLeHam8G=>F2@*vmr`=Ii{2wT%MBbEto;y1WUK8vyA5(q z7!OR?D3m){>V%lZgH?4ICkg+6?zCKddOD} zR=)mxt(KC6!7oo3H$7jufH-2Qkk&H*pNJr+LgjfO>9CEPpq9?4DPrOXA{IJkt03QA zZftZPtmaqJIFQSN0Xw!{pev^X6K0j}+gUGhBXMZ>A2TO+tsbiK=KarqAoF?uw&~9$ zbLF$swtDQrjC}=8i0TC@h#OF>|MKhXz_;N=MMo;qZp;%}RbYqkr@vSdD?>n^zuZ?Q zI0vR(2EQ9X7+!rR`HmhGAuA$k%!2-PTnLw~zl_7?TeWCQpiJ)47>vJ;H0JxTGIiAy z+f>>ys-rQl(PKF~#4-e^<|D=~Irajy^;24sTq zbP%$r1N7NEu?27m-xSodK{%ysNs^eEXx$uI-rEA(csJYH<_xe;|Eq)Pk$4PYXwWty z1gF)f5IWpLf#LFe8k<%4NkF-zh=q~5CCYa^lII~YEu!ra^uFC)kf=E*#@FEfT%yB< z(3===-K8ls^f5DOa}`zpa58_ZBJbt6O!{`5w8lT9*l&?$u;QEsUXj@$Kc-u|oerON z@HIfuHGd#Up#eMQTy$9BfqkfqH_T;NPlq6ELzHz2sI4ZJ{``_qcJ|(VjBTT4`7Prb z^eg|9ffR~vz&hhljVPyR23jBnmt=M6uvgd8XB^@%d6sLGAed<`Qo=;mF;;~z)TdX&EpA#u4w_+M$z`4v7_HcUjYG#B zV}GS!Ws6#xd&ypb3(00|d>8t3sp zm>+p5(YJD)+c**D84k*x$O)eh|9IlQDz{b0jabt1Di!1qo~s|2He)yM?) zKtlLKU-0vq03fz-mZD~Qt$YyOE8^T@rTC@@q>$FLx}?Bx6mFvYLZzeu|+1YGqIaN2*f0I?;oG6O>_XILL@nRU5rH zDPAY!11#e+P55v)$b>Qj4Vi|nI3kRwUsNbUL`285&bn9LV8@%R#j`fqG1OqQJwUVUI zSJX`;Y#BgUkmo}Nv?JDGW&ub#PLLl3qH;)83bH^|mQi2Y7;)@Rd zeU6rD;AYqS=vKqKBE={nL$RsaFMldhPSla{j8o;Ao&`W~^@C3BM+MB>=MK;*b5ga( zF^B^8$AT3*cu?EJ5cF9cZK_NT0g3-FTryuRHAVrakXgp%ckUthxdZ|}do)g~k{MgFQ;5?JH$}G(a zGPG=?w=bgSmoC7)Aioo_kJo}%M_)I~ldmJ|CV6d|7^`Cs6C$nSsM7G0KfN`Z-z}n= zGYGQc5oTm6@$K6%qA3Yk7jC~W4NKr86uCAHkNYscvp>dzV6JidiJri!j4c*xz|t|Y zewYlJXg#U!7HIT z!{%xY0WG#Vv&QuZmf!KOS;L4g`6J0+j>tXU#bqC2yrwzDZrCtC?DeB@2auq2O2)5- z4n`WP3ek?+toNubGA{fJZVGKiqEQQh;|W57Vih39kx3Ky^A7+3#=h4K;NCM9vLf~M ziS1_D{-*+W=g~PmU)zLDH+_r-XUv2p?km?B#&8*pT1a=@Na3E^V zyan-LQw#}3IMZ$m`qpQneRu$y{)Pj&X}Wh2&C#tS3LLo$E!*mc2UZlDbqq^Ks09pn zlk@R2Ue%^DtmpDxI~SXpO3-JQ&^M1;OpqY9EhV*}`;WbaZ^{k+UNmwhm9+V{2uF<8G?00V>IB9#Lu51rGc@9+$vdm7l7aKdfyKjU2{nz+mBCbpW z>6@bAI%4B-n*P}SkiPVcHcP75`9X4DX6Q4d1JpY@FcoQI>FP9&+e@&ab4|%dOc^WD_QyDQJ9dz{2RF{(O z$oAfg=!h>D)gG2Rs0<}X!Unt`h=X7XVU~Pw^5BRQecH`yfoEtZf8wSDj4oI*@y(+X z3Q}kk&#W;X;T8pUrWv#-3{hyER89|aWil}yGjQ)N`P~(<`9P1g>)_aIqn+njzsXQ9 zL2TgS0h?&_797*1bP_k%m%LeYkOC#W6o5KqeMU!DGF=gl%uHvL0WDEw+1blUV&E#h z(UBf?hZ-v;viMT5qoi5~j@RB8+^K#m*3OT zTOGWpJn%?!QvV69$ah&E{_*Z4j~;Tju$F5Z7}gurr|jG=46HTF?L%ZNsYa|-cT_@*>nKOf2**k8uR=;??_<%AMPf@C@_YTGSHEdkTF zj6Um;hXNycHh_L<_#_jjzV?dvlqS@Jl_?UZB(=O}2DZ||!v*n`ZU^&aeJO3LJdD6I#`7<{??Bv5OPttk0=KsB|EU*lj-cC5N^UomXKT&v`|@K>uLVsv2a3d zIX^Px%POB(cejLobz&V(Wx(*H33mMpmMw`@Pi~ z7e<~WMikT#(E7Ry^{St5Zyp0eK?I49D=N()&+Ts!wU8;RNZPUkl2XNxT2&5*7KIA5 zJOnNU8}|DxP%h{7c2+f?*in!2%-k1TTNPFqWoDypW5`G@ZcN0!G2eJnY(NQtABGvj zabe#0t3DVysTVR8lGl{qqPcn|=SH%K!I4mykWu`uus2%MpUZ@rD=`GrM~pdTIs!_@ zF43x6rQAfwr97;rK!o7WtA=&-WIp?KH)I0mi<`uf^thn0eFV8ffy8i==Q zEmK29Qk!t>q#V9xIxpusfG8N!DEekXao>ozcr{c|T}7nNDMeFDzf&}m=XdkFj?%*& zszg%svsOJV7bJb5zI+`}alkYEIZ-b*zF$Cd{T2g;01VEt& zig;z700M$Zu)WE`y5k{LwyfFA<^D;u0a^~jRC)UHEkmbm@br9+&B8SUrHjgDw)6#W zL{Ih@?Yf4c0!w)#k!o6J>!PEhE3Rhw!c6wf=9yI@ed7i)<0NG6srW2-$P@l?0wqcs z1HX8sLwf#int+%c)rH(;-t`@S2qd#SNdo>+y+V!pylBYhvqPterJ zEFx=r5~H+&BtjyJB(r(77$fV-?Xa4)6N*5|c)nEf)of+?(*AtNq0dIZJ2c)uhs1h# z(iVyp6g1U=cOR`B!+30Ny3tR`&huXN2xgR73wfn zU+*6NG^99;u<>f5liE`_42&wM{YUQgH1)UB%0_M+SoPx=zqP_ljnl_Zmuz#znzpSz zR0SaS6JdGGcP0h86OT(II?F4UrRo6OO$FV3uyrfI&!|$y!N_Ev-zoV8oGp$ME;FMhfxcPdp3)o+n5{?iGzdpM^+b^cQ7q=c?4a;Q7 za#wlEohx;2O(_*6d@x;%v|JWm6WAlh#7bpHN#gm!ER+B$9PvEiv{jAumbX z0?{NU0E2Q&0;<4y9+#C!eZRz{{ zwqq?c(uGs9N}MhM(`{f8jHd{mkD@0Gn*xIflH*Y4My9BLoew*Znc3lK3Is@J10g|( ziL_DElbH0-(^QeMz?$N8jR10IA=7*GFc`*Gyz}<;ZeOKN%(F_-4p8EI5aYC(dh}Q6 zsF;5@2*EgxKc&!AdU0Cr=iSnFTqll{M#~0(ZkB=1uq_yOZ;lUVmG0-VLf91J470+5 z!~s<+QztT3cEdtaLig#OP1Ks2zL{ZqHy6;=mH1+1eyECDk|XaqYcXwVh+WziGP4?p zys7zk@7@*L<2z7lRnmk5`4K7uC@69DkD=zbLefryd3PreeGzv%TUz}(uY>JRbW6j< zmFe~zq}fHw%Aw`)N5k-9Ya2#oua$1*aqdFQ&>MQ@2?po(lvC3a{)3#CXIJD=;ts~GzNI%rQSBskiUvS4Cs zA>1&ueHfOaATvPQ{v~S`3*Of-REY&d{%7%a{gMf#<0$hycUGP!LrbU|FCQ$?E`Q`Q zm@C|HuIRWLz!FDICECPIdLG{!i`^69Z^3I($@$~npsh~USkf2nXS7vKEM<8PiD*yE zk5eF}%8x>|J|{WdnP^%g124kT+IHHiJ&+E$HkcuZVi}Vt;a8zcghTj5w}28?l9*TI zqFdJipkHFAUPc$Y(TiF^$RF=2BZ)wmjlG)DS84GOvRy=9bS*|j!vfrbgK*xwa@Q=E zdFXyjj(lZyVfF(aJd<<&xDYqD=nryzi_`4<>FTDjVoZwjGqTF4W-TYfW~qxmj-_0V zhP!T&XE)7Cclk{);TjjVjB6H4P!hOviB-xLX6&zDJ7idb&ZO&B{4~}fEUM%S^xDRk zMw#R?W)j!ne6j4=td*2R|4_1Z`tW;oYin*+v)!J1rFnI>YjN)`eGPcm90>E>45nDe zDntiDh-;Gi8`8li4z*U&yp8<7u3{Ou;ac_$@E>69!70LFzUJN5z+ssl_|@IqV)~J? zxuOiE45(tc(5NZNYXdx&DgjVuO^mWKxVW)S5`Lw{jnWwHzB$rdG5y;P7+=E22Li=o@1~dW5!89J$PWp;-`R%Le#cRffnEs?Sh$> z;$X{75t)%BNy@NenG=(U!>R|u&PPl&QAW$kRE9Ejht2CXrhA76t#gEJRTDa>lcB)hNEzsa?DtLXJmc+CBJlJ*S(BJxhwJ(Ez z3<%m2wjOG{w!~3TDE(8ao^SG?{kl-E;axenm)vGNRu& zmn=G4*u~`y3tw)%HeqLH&&`*@&sqh2!Lu2^cRr0{ab{+YWCc0nHXkJ3s>8~{e}FFSaz%N(G$~FRlQLsq zTIpAV6jRUbFQw zm<=^_%58Uy5vw8k1fYlHv!593I7O-p+F`28`)gx+g5c_S9=n#`BUooxS7vqr!CI|% z;K$exH{NVbWw2Mg+7qEruz0{_qp@$!2zR8$29QTjd<~cBonAj!Mg{0WFF&~h*_0MJ z3_~P|`T^+|qm*P1bA#y~vm{KhjX}RE4>hbHt0wlt2)6=V&UBn5ui=L1RAur4ph`bs9^HhN}5u=2B#b`sJJINEZn)ke~72DCZV zw-)}C6Vk58(2qUcPg{qpGj3F-pEFKblp>KBG9!5+OLX&t*noq&pw8A|GSVDWyQo;3YC3@ zZF%>;bTLlnxGsiG7_oJH^CD=&&;`S3l!4p1K5U}1}Tq~hP9NZEA~b zl$sUhiO8|WILFqSdB-AH;e+#Eq5=_k5ZElTHps(7*y6a~Qqf*M&jjDnJ+o%d*i7X3 zTt~L;KB0V0Y^_V=RC&;%O)Jg!4%r3N#hYjWj-|J^&5~hY59>ubTIm@@Nj?&3V)w8X z6~eA2BzM~xfuX?JP=92QlIF?-_EW%CEGAbTmOM{cXAcaul#!=rCYk|98^(g7syKWd z@+dOlZd_39(20+usMYilUujY{?zV8D%!eYq4kAH%TG_b~%SCval`{>|Wp_(y;lk|D!_~Gbq;4iWUxhAZtH)4gzeHWBnN1TtZ}kNBmPV z(_Dg|u@atH7P3C`s!kHpg9cbZ)AP@T((2mZ1Y9dvQ*1 z%BN6XqPy$s=YM*x{?m1;?S!cUOwe@^72NBPw{e^EQmLj+(r;bf8;l&hpIj|yQ7Wgc zSDMFq8w|cLsqGEkj**v*+DjyzkkzDx)$OrihSR~Zwl@4-&Jv|myZXoCV+q*V*&Q1b zl-U=P&W1-;KW-Ad$;MBOAXhj>qHl^%4{DaeoRDl$E2K`*@#o-$HfWhQpsv7CR7Nvo zIh+?MnK`=1z+a;yj)S>Z$vWj9l_5cF!{oSHXwkp!&6if}clQ=Z7hLL>&zN2D;w6LK zRi(TccD~XU8y5Pq`)c~|Ar-OnKBdQ*s7Gh6TR|nKJUS{ML9Bn4nhtAYFKC)}2Q1>| zS0Rl(#d37$jG%TPDINPbhWRnO*B(bB*#x8YbEx%ru#@Oty_OFG%4mK3O@gYv?-xo| z2qBUDq^X@noCd8Z7tkC%U2Z2}XK~AGN`;Q8u~80sqosC_a>>U+bqt9S3qV!Rd7Lq~ zy;2HZPr>@1o`=jRkLwzgznkd^vk$R?7cPN}c)AY^;5g5GR7U%VZOQu{ltUhenua6kPq`9Df zUVDuYdF=U0`O*grd|^H9^VdyTuwt93S*wrJK}=$)BR$iSM$wi)Aov+JPnj56I})p= zGGxBz+&b6v&+RNu5B=L1yS%^z?>L;Hsv|!wmj*l@ET0~W^mopVKa{t}5o5OmI5)UM!VDalsp`<-e%WrtOu zW0(nk&V+zN3CLkgO@7rNn;vJtme2w6DFwr!NF`V}kWcdEI4hp&WQV?F+qG^bsmqvT z0dI-UmIge;W(oD!3lE(}+nxu>wSr!hg@;&sCG{$E4L%Wm^5U4s6h`csDootCOwJd3 z!k0xD@g!3+jAnyf&@O@=2jMnG+x`z{dDq8D5K>1Lc1he!i}$3subs zRtTw5Ccw;ryDzd*5s%9pJ)=6SB${Hm#{H$MPDYz%h;`A4bhCj*)r=;7 z3V?#+w@Qz&p$U90#*7im3f@1f!YU9Zt7|*mwxeqk^o73?3((pJQ}dfGhyhxJ_zJUf znL7}DOTHDtNK2@3^@qi85P?jQ>xAL@vw1gZ*@|UG2Zjz# zlYP@wP=luJU`JU669b1!TU;O^!ca2RL&vF64n(O@ez0rdSs4*Uu0Yf@dOK_-{8hr+ zK5im!iDyxcn(Q9b)#v4h3BlZvVQKR>EUrxObJnfcUymQqjPJL!LMN=!;W32mkH&375dia%;;bymgVv?DWw@|H7!h|G0o_=4;=u}JzU7}XpL z5Y7!6U%|uqT^nM#EX3Z}!rQlCX2`m5G>U(@vMzH*68Ye{tZCJ$|CSu3iHt~x*gtF* z+PSF)2v%O%qu_9wD|}>%M2#W(t@hm0ZROU->_gg<)n$c*+IY8hJp%Keob{T3^reqexmF zIo=p8gnE$_TRHwSJH1^apAcu1AM zW(ytL)uxp^U z5LroH;^buMwv*zpU1h7)+A%lYh=-rNeKWd)s<^7nhFOBIeF`JX6zrGGb3S(VKuQJoqAVmt_kHDM zW@^J*01ru>_}QtG8m-9uyYMls{tvP~l_5uxzl~9H>K^wPAWz-@pp1f{v%~FLUHO;a z{7vA?{NX%@>1ptw{gp}W*J@~az5@cB6~ZG9CWp*xN&8!ej|NaPyST|Uh2+j z;hR94RIQH0>bZhJ^FYP`hs+)hrp2V?UyNut-KUic??<(fs&xB&RIJvZ)Vi zmp&F>q3Wfu-%e8SzJI|}H;=l_@_fz|?sIoddD12Oc?)p11YvPOnp#cDXov zeJvKGG!@Bckhrcv94VCg0l;z6Zks(}4c9`IKN`y_xT#YDv#3jz~P4UK%zHp z6T8?|R`NmAuIo z!ERIW zx4F!FxCtdt~-(45ici zj$8n$9}8*DrJZXR-?q?;V)b1O@vbMIIu4z2Ph1VgX}Ny&kL<5=c7GKoWr}_8%O8UY zzhfPS#)1Da(vK*{)PLNMUZ?c(W^%QEVsABI19JDj9L9#CpG>@jTur8v=8SWYnp#1A z#x@L_0QB4rUE^QGO#LtkT7?(@v053683s?E(t6$cf)B?>2>cL{tX1sMp86@y<~TjC zPG`(~Xs{6n$B5yMzm`H!)oOo{-gdI2#p=6U-M<_=RnND>WoGJJLdAaYI&+O?M{?r! zW-B=Ha zxroN#W(`aYX8!NDuoo=vVdEa8PZvEM;qmqD^TfY7+RyVH=snv}Rb#}u3PUzv3LTcl zJZ$!YleYVFwHOVHvAip$juOg0+A1bGfLt_9pG_Nq<;;f0^oH@X=ye zG=EnUmeU?M_RQ(Hhz8A=SX8)w;BhP2ZNN`}n3NM7aMoWq5O+-fWH1VL8yvj93dnme zRQqedm#cz3kJ2J9^QIR_?6%}4d&}1DJKo+PBCLrKaKb6(ZWKUheGPS?K6hrPRRiM2 zizuI7dX1=DYNly(!*QXT;=+SM!QN@9*HmT9@he8xUPGC|%sj2}A31aQ4Ue&PBTf`P zCVJANzZ{a()rUw|lJ;u&nJTvwSI~f!#)#Y^y zuJHcj-l(D^iC8fBL0;^)LIL7rF|ZS@@ZeNV3D+U`h}?kD1f2VrIY6nCQ3OPko7-Al zJLEn0-jNvGKX7%PWDb2(W?A-#jhjQepdH<#bZPE~FW7YN0>{=(Kr3eQ^ij|#44?~K zDyXQ=VYmV=Opk1U)UH+PL4zP#q0K$RkT0n53T_ALNWmS*TFg_N@wIih;5Uaum=9{E zs3aP4_(mj()wQraNH>f&4&#MWL}` z<6)11G7q86M8y2pT@$MWKb2%YnP@I1`e?$cCG~+B`|PGXM~PSO(2pthxG8JHE=`bS zj3@BMbY}bng#$-8V`|q8Ra+RGRprSsp2RWgQ>KA>*I3lVEDkKqL6Kh&zkg=;M^H#5 z?0miXf%IUl8QAimrFi^AcQ~KrLz;;F!aBR9*8VSEAAZA|F---y&yyRj#D<|^eqySk zf7yaI&oUEkGHt)Nrk8EhYnbd4z1IbPqBX~=-p#f|5C!D8Y9Et-)Ll364{pK)SM|Zz znzsU-wMWFWTzliwklqO)0QF{e5&gWx`!=irVLaTN>XtX$Te>&5LL6(hf8U#moplHD zIOy7-f&RPYQ_8w_HC->0V52~Xb+x|wTZkP@a=_-q=UH(&+q2~Jk#MFYpAfCE@ED}(;r;-+AcdSG zh>O?v*Puo@k=;Kg^9NcnORbHyxH|3JES663*%FbACkcROONt#XXsN6FW7?2F+*)?nxocyU^^S*f9sFEt|{dm z2Z(95E8T`;Nwb}os3|}*9|I{S(R7g2$VI*3)w@(6-V2Z4jY97q%xRijo?}!0)hzMi zv^q9)Ui8;Fo>=PP;Mc}&Aenpvri)#LYl>-M0OJxmKvCh(& zi*0$z`;z9h060JxN4+mWt{n@6Qm{;)bWMAI{_Jt#;(jf7 zJSTkS-CWv+6LZ6QIX>CTZOvz0EOBABC~{>OUQoH7#F^UYp2VTu0HMBSz-Ii>eQHz* zkXK(W$$HI?fKWdSZsS6(k8%S9{BfS4$eGjV8yO~`1U!wZ9eqK@sD}PS=plFQGJ_)( z@`Cq~@(C`hR%Bu}*tn|@f~sf=Lw%I)X@-B(B?zUy7`pPF7xGLv3W+~F0y%nKT1Z;? zghIAW=1Q;Y4VrS?IQ=WqwQ(dN7Hm=66QNJ4mJy)3SoC)F)?F8SfTZ%$`5aOM%et+9 zY83uqX_J}Y=vFZr^)fdT(&E$M^31!$AqlgJwn?R`JdTt4V?Ig643Bi#@Oa8pN%eFW zDZSzws*+kb5rh6MyO=1tmn$s$O{lz||Ls{Zph;{}J}_BDul$OP$si&y@$fi&QhC*s zh}@RjiYiTB3OaN3i%m|5sD3q)5o1hZnq$aW!VbOrUH$}*%Xa2QoaRbZoR~V9WM{1! znE@f$<8|T5d_ceiSHqnZC54&Ebi>?1Xg5FIp2He`U8gPB{K1*GHbC(W0=rbgux=<3P2Q;rjYw5aja5iEEO+*eqVps+9?+I_^DGLv>X)%0^|Yq@|o)aYVf>N z3K5idel@voWIos7smpEI6*)D(Yv|>gp;@4#Ua=G`KstWMjr;zs%hLnd>b>!r(>Oli zYvDxhXP)`Gl&x>4spB87BWwv0F{W8kST0TFZ&WezMYGdrXV%}a8XF)nqVigV ztH!59iJk!d2odCg9Wmnu$pqkk6wyJfKLzsa9tCm z#}ELbvlqo~Gns)ja_|(D5ZB|mY%y5`ibv;J@E0T|Sx)x+EY%9tNdNlf2DeQ^6_`xt zM1-*<+f161lhFzMKi1e>n`Rv=Tb^wmixH6bq8(xXOI6BAVuWpB<%EfNDzG`gZY3J= zv_c|Bv1y}6UUI`^E+jB%Il4S_p2ML1!U7B?doU0f4X!fesoW6OY88MefM&71OQ^ke z2Xmu#+A<&2EXq-;(##io0&Qg%*nAq(?ohSV%&*qOO9Fs5e2a0rV~mdl#h0f$sr|LB zPXgWA(#EjQD_$D7#*U}h{+(ZfA)7>AX%dqCS!&b|B@FacS6TWrO|ulDsiSWreKjDc z;UWF7_~IbSU$UVt)4Fnz0(4|ltoetI?Ygh>vO7h(6<+MZZ&KBQt%N?yMxW*^cXKF@ zl_%dcXR~yA;F&p2;1ydZR_DA$NTQIBS~i`YESjI8MPb=wmDrD|@0)|UQ|6pi(n%`{ zZk1sn25#bA%!IjXlfM9Fy}TW>GRFj0=lZe=_dn|&P8TVk4luX7E--kjtyOojZD3)_ zbU(~}Tb^nGInBY< zZKV~qzuh0qd`*Aax8I%73tM>k^e5J{4P}%AdcH?gu{=xa* za%zkd!m{Izi)VF$zXbfT-r*}Z;MEFce@laiAJfXp?-JwaTo_zw7p*k)e=FNJ9>gU| z_T(3O0g#)Y`|-vW>KFSf_W!YUPeHatU6z2;wr$(KnKy0QzG>UGZQHhO+qUh@%D=m- zA}XTacbr%+J7S%==lI4PyaW3K-tBkWL|;tjvrob)dDM>#ztfL=_b{*Dw~Usv)bDEr z`|JNigrB0L&e2ol>naKLl!kiCBYx!*z2hq*E=lA#WLEovsRcDeJ^_d8HEepbq`Pg) z&~a%3qmYKi-q{p?r48Q9IP2V4)kNT?X)^f+whOa#xB8l=0rET!Z-oyQe!c3GgZR3y z;lc)Ja!i0BzJusr$IUj`>MqJbkVe?KRic5`VES~ZzPfrQ(@1P&4ms&o(VwUF9@djfeqi12Sr^*4R* z!3(CIxJVWi!PgH@Wv%Q#(cxq@jU!Qw(Y7ryl5JsPMzzs7e$n9!^yWkb+d_ob-bmio zL}+236TlDPRZhjy^aG(G&Y6Lqf`ow*Kuu44)83~bx`%hR!Ng5+(8KTU4kjR0++$RO zU+|xAoPP3Dy7LO%0ev~&2YDugHUIHVw4swLIv4mPpc_Xw(568(YSG2%_N2uVu*tdu z{nyf;+w-L&gCL+jNEJThFPE^qTvn$}3o(8hy*#w+r&hgKqe?cFm;N;u>=tKBq@*v< zML8|+o8r{c4}`a)RL$}JtU2%M-vZxmPate-5R21hz(`-InA+F}0M@?Hl@RW>ZUcv; zzd5RgZD!TQIb^J;OB=R60AJs>2=}SM18=A7P1L?O_ef9+H9SUaguQ?nwPOfg{C7j!4J0D z^e{cAQAHw2&%qM85zCu5LkQ?w>gs|AI z^U*^!<{i|(Io#$dPq1iVOf)BlUm1*En|`#mJ$$~V3|u9Svmj-LkmG`6En7Y(*iVJ6 zP~7amR27*&4kCbI`N?gBozroc0`rOV;qwxBOe@;<`0z9T=&=YQzrUT)KtJb*n5S|5 zGr-8A=C@6oIb&0E*d?Zm!XCF9Dfq#3a?@yT)zmcV*^G_YEDZf~Gd@yMd4w7v7bN`{ zW{C7wpsJo&6LC5ZKFwwh?7K0eki5M62& zC%M$tBUW;UbEE@?MGGVl^$agBuo(IIff&Hy0C0>MYAERjUgELnWQ%_quXg1$Yvg9v zY81jeaB?#^yio=6V~d-yR}#@CFq)w*t00!tmgSyj_5=iV>kR-0=kKcm9lTd}O3K$j zD>5%!`8D^-YchJqPLDNUK|1=%cC70e1VaU1KUjb1TLI7nh2E-QH^{{+1)KlV>t9E~ znCf{^^J_`_%y6Z~(sP1Ws7Um^veShwm|hO}j^Al<9s)GJa-%vKE!EDrE${%iZL__k&LvCoi^nF9 zPBL#|;;aJ)hv2unta?u(zY&+QV`yoGGiz~wy@toKWwVI`eiTrLT*!qg@gM1URLGP83h!zy|jM0NqvKr&ddrfdq zU@Jc?@c@mTRG`zmsQY>@>B`EW?KC2kw1m*sY~a7hM6~K1n30nQff-fp3O*ecE(7R2 zc`A!w0vZJ9lYt35E5ZXvMG$EwAUD(m@iAO3E; zVF4@mNB{`i{$^R0ILdrV%Y*;kb@F_g?j7u{UBkwHj>!XMX$bh73@BFGP|%81t+^Va z*D6sZdHi{Z^XD?LY4Ro;THPz~;yHE2@d6tFnOls1l#0W-5CaRKstLD3-1^b_tkUuQetdXsB_sJv6-kr zg1AsP|Avs+b1{FBnyTAnj{HCNA%UT*8~FUaW{!C z0y=TDZ56F4b)Z%kwtE4%+auEbet}(Qt5HZct61<(hpfC3LGEt59I^Ct9xSC4U_@G; zH!p4;!V0kq3B*x0HrYmHQpY5RBt^X8g$Li|9f+RQpU(|>$NQ@;4LV%gV&s?D?r9T< zv&54S&{DXq1Y#qjPo%1}=2QFeT-=LehU7ZL&c^@_fxyJ-5p%r;t6}QVo$UG+^(yCW zgHh)=4%~(>DHI|hW`DLa+3rybr8v{0YfO&~jVe<;TF+_MOhyWtp0*Gg25Zp@& zK?PMpo{bG7Df@vFW?x#vq6&%*a4h@DROmgxvR2vF2z1DYsSW_YPmu8P-t+Vqh6fEP zerpD{^qbY$D#YR=CM1u`LPjLhG2KgLgOl(NIx*oYfTx$~2~4;A>;!Dq?4Y1S-|%K; zcJ7Rt^!R)Zn4KLSVpAX`$!w>JQnRX#AMKjO&RqsB1``dMqEzIYN}*rji9}$4UfHc+ z&*M=iOjxaN_2TrxJ%yl(^8tOZJ?fE#4j**6MM24P6m<$gCgrxK`%w$|HI(y0ZLq1GT}i4I;c)C3aJ06@@bE*=39 z1XQ!561N!P%My1^$i+alSbFC1YNsagXE+2 z?ws0YF<9rau#tYg1ap(QQSQaGC!K@ws0a*3JlZ~E^9bnHeY*==I-mYM6aSrf zDv(F$gbu(1WFC}6HpFZK5toRu!5g>hXFF*o{xCz^lQno;lEgfQz*x?1c2os?nQ+hi z_Q+2iq)dT*q|CycfFs4_8oD39QHoJuC#DXn;ZagDKoXrS#!X4hKNUYolSx?np^#ov zs;{u|GT=G!sn^HW2vxrsc(|Z1|2XvA!2c<$?(aq9!-@I`b~BbqW5;J!F(lYf4-3FB zfvOH0YF=dJvhhI?b{e(oPI%Qh#xuVwMu8;_7Md`_3$*#2DX{?j!xZauFJQ}C9vUfaWy$uPaBo?as3lGx{2rdfCsPwB1SzeD^h9FhsE4&fd zd&=^o&z3&*hsf|5uWZ}9^`;Z_h3R$4%Xj~sVuNJd89lJ!J#g9L4rF-c?4KiBx4&EK;|KoUh~?b1WAa=DNvz=aX(COPNV+Rp z4SSh!H4wLhtQ6B|!chJX-l6l|*+5^NKOsR@0u^!frD|Z~V3P7p0GYvQ3AB(2e0*Q4 zZgYsgFd#wvQ$@h0@6!UQ#1!e;6O~AS3yMeuV<6m-@iB8YGx4kI8Mst5wRJ@BX@Ylj zWQ-)%3$xST*8bSre3+U*1$t%;Dv#f3GSdKF9K16h>t; zq$f9e`Ifa5($gd^yZq_P!W_PcXX@oXt zk#zPnX3*rWka|1xEf-f0it#_fFs^vLJsDgmUFkOzO5H{@vZ>gAR!|1j!gkojB1{2| zacdZS1y?~m6@;b3>=)D%qIrOD{Z7)DVn`jgAxS|7zhq9XG^(s6EW4`xDV_A|U z_Isa-XPTT+} z%=z;u-bEoIzcDU_)l4GPUB`|eXVgXat9`XAa>x7rx#?V zc()<5!^ajMYgTxgCnKKgwE^!%nmZ1HS=9BN;P*q1>D=M5BhhjFO)zK~@(DFM{z}38 zl0?5yaImW)UOhpuran9pJOIpi0-ZfnM>l;lwLwkSiM9YX;+P)WB7UDod8ezx?@k5k53J9ZB~8ACU7Kujd~#O z2Tmtnr+NutRd`8ZB%{F{>>kqU2_PmpAv3Z4?>4EV@c>Ws=rv8#hEA=Iru@?W^ayA^~pNh>+Df{#Ed21UGjT28jpLT(2RC(M0 zG;J5-31863rDvXr5(qV}6p3QQDPz4FA}mg@)(ZoleOkRjy3io}Em!kPNL$uxyx?ovRXeM=wjV}Vw;yzeqvWk!wfG9#zzezU-e$ie!)oyoXG!0QO>;&< ziL}^Amn!BJ05H0V*a3N{ib*Ad*UpeF3Ug`%47V$1NH9}}E+@uo_N7$fEYggbd_`N) zKyLiX=C_t4A7ZKWonwg!A$eBnlO=gz|Bo5m!W2kVV#E}9vcj-T^Iib9A9Sbh%FlwVr`!3G5T3FhXxlbCoi&X^*a|emAtnUrZC;E-qh_jy>PJNTXV(_ogOE zqUe3suQx)>by9gK0DLK`ZQB_O;RUY z#ff|RZEqH0JJL#uFX>#yh4iaTjB9{o4waS-@F}<}O#%|dDvg0(`YgLj@}VsgFx3lEq)n>q3pQqt zt$k1=aPBYo(+TL?cZY=3lgn?#pnuts;^^>H8<}j4P0VzP9KQBbagLd?To{1$He*(C z_lCnrk}~3+5fzACCUM2d$kZn{M}V!|2cyfY>{odzc>%xGliSGJmnbV`d>6aN`9O=k-)Px?(Bv;U{7M8ZEO?=wZD zJy1u4%JZ?ci_Kgf!xj?Gj&348L423V6q%ne#vcz98}n7rUVfAWG2Bn0_l8j3F&Ihh zp4xXCunpX$Rs|OJ&q(q5z!YO4Fc? zZbH{$5-fRQD0tCAG>KG0B&uaF#n{GywOzK0wS1!xuBg60U&6>3R1qyPb#l(wmN%c8 z$_-s!W-+Z|h~VVh+U(te0HB7lDn2o?oZf|B91G>{YnK$K^<5x9z>pYl3wGVl(dWK* zc@w293Mp)kG`cTN(!8a1o{n5k5ml3(-CVe;_G}awOk!{D1x<$ae>_{B^+?R% zaHGQsP!9EaqA*&5I<4yvW6HHW6JIVep5gHup(QK|N(M5)Uhzy`5b}R8k8V#oyy$ml zNwpqH4hU8%5($S>xY;pEuk{3Nd$dO^a%pK}#3=HhyhKIJIYLtxS^O~rb@dzp4eiOC z!4C+dex#6WGv;HX@8E|r;j%B3_D!;ZT!QVz;GpiG+4#3FOjbf+o#K(?3BYR2f(dhR z!s13P3UB0HfBS~^0x$SL37PNWg%uuk~#w{ zfA5GL*!`Tl`=!^lNea5wpv^Z$-%s=LKLN$Q9jeP@!FdeTA+Nc&<1L7=LniRsf=igB zck}v$4~O7qKy|e(D&8k24b{%kxM$C{|Hv0P0g+)RN(-(}@5L?+*XJ`hHKlu=*QRq` z@#hS&mG?gxJ(NsdWfq_!c4LN#|2%nQ@3!Ws1ythN= zx#B{dDBx^A-s~s)q9&* ziCKhpmUGzETxjX1Dk-+&SzakTUARbQXZ13dJcw52LR|&YsE#)>$BAMYG(66~?*5n~>v(@$_ktNj6 zr-feVc%#Y{)k^o$uZ}~}o)}0z9 zEYI;_VA!;66tr-q2Y%kE-7nA9zm;luxc6nydV< z|GQclOw}y5W}h{iC{%L3$nc^mW$hplE zZk#|FmZ?CwHBPCB#F;T7%Kb4@6`2`3`f^AbEd1NI{hJzR$=YB-4f0&hn9k!Pn;+W} zwJ5wq(4=rH@-)MDY-`Ak5s59r;X8d4^9eQ3ZSTWmi{wj3|LQu3;`ye?ftlQ#_vIdtZW&9T(qft?NwVVX|KC51)t4_N+)W3*1f5tD-3m+3FyhOS~T;_6P^0 zY^!%FP6Ocui!(4@teP~V?o%bU5v`I)d9&6#w7Eu&r4 zgcG+X`Xy|w5)7=MBCTV$$e!FC^yymy&U^&Y{<$#ZbN ziRtT!&tcL`4^Lf9CslI zY*HR%A1S!fGHWDVB2(Bv*7x`uPZ5Er)Q188Bp5xHFK;C5P(qo3DhO@XWV-q}a)=ZyKA z%@q8*e%-tw@WTEbQ6~A>sF%Vh9gzgr;aMcD`p2mx42D0i4jjTaNDD+x#AUj2(#wz|*CK>-I zi|ai)OQeWQXKSg)G~p6A?oly{-$kp?A!_90i8g~cwtF(Sar&GE^nxb~mO=B&Mei49 zPm;vZK!~R}w8E=%GM&Ctm_$iR%RlC3d5XW#sA=nd=!t><{n2G_dx;NKUlfvTDxR5Nt zwiHxP6Kxnd*zfP}tn+J3PQ^mU1f8Qnc92bR!167{IyXrlFJ8b+%iLZ)o<&-4gp+2o zdLhGd4R<5|hhx}xc9;(Hj|y2X5#4Dp)ejXFSHlnmuPnwiJmKMq*$%9A$C2m`D}7_u z!)Zg~5hHm3ZFZ+|PA2n(=@mIDPb%BQfZOrJ>^LcdWkLb71mNY!L2CC?REDvkkCGYF z{U3(B@u3SXY!b=((yHmHOfi@WgL`EO>6x~)i5f%mqZK-qrMT}T02Ixt%oHPH@{`{> zVs^$a3UYUfqMc34p_DzMj{MexuR5xs^c?I_UVfi6E|5LSgn98guLoa^U`}#fZ00Q; zKUZeE_q8*|)dbR%IGwA2y|ZFw3sreqzZYDETc*!WEo}LqQ#fuce$36E`fQVCND7gk zFU*F7I&e}8COu^M&T4b0lKryky~R?~I`BZ=&CDB5fa^J#ZiRVFa#d*1{n7D$(O!2r z6lWL3n9zk#`D(f|TC`CxXM!pR*Tio}wkb5gd@)u|){$A4Iotk8-doW;mq61YEbsTe zYW`a`{I^3FCC;I@;#t&DbqT2$R$*;}&K)0hGZqQ4ljC6yRCLlPLpIl)1f-tsRQ9;C zzlXH_xh+00FT`7F$v-?Y+=kM$A+=w{N)&@i2c5&_UxEV!fhj9vf~G9+i>Cc)XJ`7< z0`&2^zMLLxHhkd%VrQD9 zxdPd$(kaps-pq0U-TabF3zkHLHW}h4IFgNlTP}a1rQebB z!8Vw2akWeolX!CAgk*|rg3qe6ezzG3DAF5Q-WF{U%tNM5hvazc53OeNXX?SlxdCN5 z-wROJYcds)gQb!pknDOh&l@*D8j62!ZE(_b7(b($A5r!^orEWo zjK2aWw{WAMqW3e44?0{R%^OYj?yDzPk+Dzv?3Kvp{YWVXE5>azbjDQOM!)r22kF6C z8m0`p_AWQ7^B*;-3$)>0OQ8aOY8>E26equtJovu)esKbybA3WVhqDAWHc_}&V%gHl zk2gwIR&`UX(1?{yny|N9GcL@TcLsLx!I1k8kUcjIiFhIpWXgS@4#RZ|l7^9clMm~g zGaSEw9w&FX__a@#pY2(rc^fmh;==W$;M6p2Xa$Ot&fAer$){K*Aa1$Y zJ}un4oa8zY;>}lAi>E=2h0CXuoJ25#@~3A?+VvxiPIrzm5XKw@yFVo*@A=v15!XuW zY{%WwQoA0ZQXHWqqJ&25rh?1>7kZy>qS54o@lP|GQ0-eBWe0JQsei4Jy?V@eI*3!s4*JVccO5x;;2~Dcr5kR1-0ZY=y?7N zO?wMmjH|GRAJq@&F-4D(WCxf$g3n$99@4<{6FCFkpp5df5ld9l&wnmzVnu{%9cF`6 zK}X1(zoKTNJYIpfA*C#XT2lX8Lz7C^FDEj2zDb;(rx$X)^7*fEh~1CUcI7siN+NmMA|kSzQ-9& zC%IddunjS=8=zfaY#c}L{No7RcKPbDsrV_0szTFK)!?X9ZE?Ox zYT5Acc}w<*kc^1qM;jL_Vj9fJf)A= zX+$;r7GW3!F1;tZ%#xi(ha>Y!nbtc<$z|SYj{9lv$;5S7P0#My-d z;$qkfRNz2OQC&itWes#4GNv}yjHD8_061-d`}aFDMI0{m8?vEUA6106X7+@*MDS%M zuuWmV1P(LRu$qOOUYwA>AmRXo>#~KDmDRKZl?kYlSj9u7w(Z9=ZxIK4^Bzh78>Shj zMPFjeA=^Sdth8+aN9d>exx6(Xe~@8g(3qK$BimKFML)ly93AGxRtYZ`SxTSB@Chw# z7!KzOt5*N{$n4~{yXfC8nI<4QvOaZ!YZ_j%2LJjJEurXgT?m^S?Rnny)2N_P@rC@m ziy{-^yMZT!qHC7B+c?KR_s_bi^c%s<4k`+}>KV2`Cnz8R!4TGwn>+x3 ze%G`G^#eKIo782O6WefOtgwwRonPh`cW<<4%BK6ILmd1nCutY*a64!_f#)u-3yw0zWR`%^NYDbJ{~cN44255joP%^=h= zx`yP?mUXpdrH4MNfu&*qi-3@#i2+T3K?u%t8JYoPKdInf^-MLmCVEZe_XN8()SYf< zAa{L&riV)Ns9`6E=_JzVemomeXf*n&(I_9k+J{c1dNTV1%^>c}Yn9^rwS)pPGK6c3 zg6m3L*H%R)!QaMK(shirs&l+6F-cSXG z!H%Z_jsS9)3?WZRa~S_cOiCWGCUHH}_TBZBLv7)8@hAA%XB~_AS?#N5r!%h=e zs^f3N`HB}S^iXY~31W|$zfW@G(UUd82>%5R13L(sSI5Y^ZefKpO7pY_qLNDhLpHIO zJ-bb`?rKlo?lOedK02IJVaunniJJ9UIb$IeR3~G1!@FNWTO+h~<%ud8}1b*=z|(=woWOMSyc4bxZcdeqCmJL?C0|G_lC%H zaG^Dh)l#~2I6#Da@tk|5a=b|YL&*z%IFd_x{jJHTFOr@%fU%1;VvAopl;wtvXI1c& z`EvljEhhE%+9;b8O33e~X&&o9}`uG+S9m8@w zBCb%NT@E2Lr1EV2K&$YoD!B3}4JYum3GKlVNhH~;rSo$f_*Bv(61_=ms|rO0Zt$oA zLDE}^z;+!F%~#amt*p7!K+3w-xD0(GB(^_`Byns9E%SeS=vVn;hirT|HzTo^*jxTu z$nDgY?pofO`Dw^v=LkL5RR>e0dc=H5fC)ClosRN&snzxlabKTtuk)dW%h%Q(cjbS%J)%qB4pi7kTM8Du)ZRGPQSDjgnGGK&*{0Y&fsB*QIx%LTpnPlj0|*6 zy_SVxEmKsgZKkIAt%=E#2l#RD3^^bFW574!*S;uKt}Qx71y@T3Lx+4h^?d=?aDdWa zZ-BbK5!!~L7u@Bsz9$`8f7aYk{v_-m0sZ@Lw&&uy z;rN^SiTm4n#h3c`$i7e}|K$4R)cQwe=9gbW{lMXQ^<2#I57}R#u~gx}2TuECczdB( zGZNEkZ8j}|kAYLnV%{GS8`kOU;ppzF+_}msWOU0Km^bAYDDd8-xohWHxQ*aV3!ShY zVZZXukd+g+|$Ul2Mtnm>>~ZioOF^y>6PlQsJW&SxNSBtFCc>$N!SH`lkb(!a~oaBuByZ0~MP<^e7JnK$gkWwd)4@ICUnV`8~q z+j}L`!PtHr;K+)El`V|-P?RY+7@RoIaDRB(X0!dAN|70shrit@j$Bls|FQOR`ME`> z=ew~oya&F`x-!x62H3vJj117-T3f66y~6}N-(Se06Qyr>HvoW)-_R@2aFM4zEY9s+ zxL@PNFm#oY!p1>&;N<9{%DYiY1O=bw;@kVgegMO8*MT&O)ODIXTSKxzHA#6(( zM9&9~Cx~N0f45Ou8bFWouf~z5@2YynTl|($c<77iA^gi{zSx9qMr{5#qJG&|JP_dg_!L6d{|LPylUiLvG;)J|hXIlEeV7b_mY@ zBlC&k_=L%&90@H4=M^|i!V_1NC&jDMVd(#p87Xsg7=lCg5>(MapA&Iz(xk>>(jnj` z9_{ZK{T&652Rfz|79x$rx2+m={QR(0KvX~U+S=r$ri7yoqzTzNlmvi7;It-PGS;I{ zt(ExBOAY#||9qM1>(;0^qP{x?_ZxU+YK-LOmAGfdUkLgHD)CNB{Y$%Fx`oLm+k+`+ zdd{wFFRT>=AZiAcqDobfrQ+-#bcGF6X9EJG`_*iXk!!6;K7&loC&xBzGk>-WkPdOc zvl?q=jE?M1YUT8fVe5arkO`tASICB})1PgT{N+_vScoS14nQIwR3Q&eL9O@2wiubJ%YfX;;L9dQy$0!TmX3?Nl?W9CiGS(}AI4W&j{OW3 zc$beid|An|d0hhZCI=W#^Y^w%P06QdyUgh?KU?mQL0zdg^Ny<*iX4F|&MB+G$~`APj7BiK4+#H9Nd3Byp7BgBSMa>YYsJuitkOhV@A8cckbC-!{ z_CHzsWq=7L2YfE_XW|mN@vhQIRD6K;j>D0lEp@;dKl)wm4I7r9ux#EyraP=x_>UT2 z*u_Cb+{z(3?h?4nI|Lse)8G+aX?`_WH5N_o1^OquhZaz>f8n+GELH1gZo%SG-F0}g z1ZAnbb2?Sy*Y)(Y zJ?i&jAFHr+G6|kCSxn@JBC-QoMJr)aSxuyPvxLcDdt|biNuHAI*BVmG#dNWLzkEE{ z3z9@(D+-xNY#K~mSXA0wNyP(OvZqk;F`BGPJ9KW{GR?k0bVWKM z0UG6hpUm%%pAUrisC&NN&N1;;)75>S6x`hJ@a@OY$69=V_uyFfxVjZSKgTp%IO*nV znxaw;`jvwQ=(sLJE?KW$iTrtLUm^6_7ev}o*`sk4Q_yh2nD49Bp4;CO!6?tsOerWP zuJkfU6p^34fb`bx85fxeOf~OzXEP77pfK_VJ()?F0|-EJa;M<9%;K}s&Q@^`ur5OP zY%kMtZkJVKn%weggZ)_9qbGUY4x3(1%6=`9rJ3V};d2_zdsi?vlMXv|G1fN|r=_o| z;nmXpgnSh(1$(GZg*r-Ab+m>!$P;3obIv+Jl&pih__=v{Cd{9$hQ#qSa_X>Iqg zj;fGgkP@WLMMiipcsQ-cmpm19{E&?9ml5RZMRdLsBt8cV zkm%j3ZPzaM6R_wb&}J?J6x`I)Jxm0w+@woJBpnGa4fm>BH5MWU$dklEh_J{uyw?eR zxq@U7JXTfL(EXms{=?1@H6F1tkjSu``!KH!rk!JNPx>DMcZhWX9vP+cdh7y!WUm-! ze1Jk(LauZ=w(4AN)>5PJ21}|2gI@}M4gH_Sg)$LFWP~bx3SL`U5%HE=kUCgslqt1! zu5b(TXwgE1YG2rPh!BYIDMlu&yMz@mjN_r4d03ptjtS5EW)8|0BCT3P%X2!T++brP4?WM8i7TLG< ztq6_u;_9rhH*vu&Fa%5cSdUh?kRfMy8h%ml=iOY;VC22+{bTJLM^ACV&$E8b{=m)k ztPdOSZ{qD!vTWl{J5~bk(I<6`knJ0K|Jf??r~H&8(2f6!StjWMhZv1V-?y z=mmCs{@}y@gr%9J!qnkC9%Y8ta1AVTrj?JGvnuW`slXOghe0BlkRaTO#L3KBLZ>Vn z`ppa7dAt}0+`Ynd*`PSjF8RbKGs1izw0=|OI=>t%f zpMU^yNTLi9vSVIw)EaPrC(+G6b3SbAfz&p%c6PT)Or$W}6GjOXms$voB4)+deW-my z%903i{aa-#v+^UqCu%3W0q=5|S@y76B{gw?r0o`GPefDz;p+n5K>Tc(J$pOr%f+YJ zO*u^Z_b##6cI0SYu%W~r1rkv``$V|tYg_6r*A?6&rIvKjkDv>rU|(7kr~D*6$p43{BP&yoGB-bP8fOf??d>Om2 zNZ{T~0Y2d~oMUnOxvGj)mrRyu^>THWVkE+Ku$~6kp9J09wt7VifosZ}vcA?UhAZAR z@hNM{PZ?g-o8))41v#N7XWzHwhlPdp&+him4~DYx6&-E(xNZK;Dc4Xm!mTa18``^3 zy(2G5*m%2Lzg#KT&=!~fqmfp8l&`1QcT9(?q2+xJ$NH3&cO0`}phCc5UU$ zv!)AgIzMv?M8^XW8Tn=EMa_et<*TDU0Ow`e0t|k;xNrZcsBFV}U_TRw|Mv0F($#pc zj(UlR!zEk8u`AeuuOQ_r{EbO3jI-T>`H+_!oFl7RG9y>?tpeXBio*)|5i5e>dMAR6 z_7IY*&R9)0S~p|oh)4)?om^I6{)y0W>_rP%c{lWot_1ZSs$$84Dw&m`mST~2wd_Z4 zwi>8F;6uKGEfTo$A;tV2feBfL^BjLYSD!zQD~NLZM;L`rfu4 zj;=sHQ?+SprN1qsA%8!kA~h@1Du;-KX=8aO&W`9BFb}lXiiVF)yc4tWcDNkE2JX&^ zN!|3?lCK8e>SlTAeq9y=QQn3Vr3j1^m=UbYa^!}uR60Jgnn!1-HO$<}%+3ndM-|U7 zQMl>-w&W;h*Tu^246(bWibqSkZ%35cV&eA0*39^far>HAOH(u8xJ)!6f{%9Z=3JIK zX7}Z8e;x_QwevZ)`=_z-8KdXt@w9{#q_wg2{gyE(TFXCj0s`3^pLdW)aw5iCqi>m} zipNu^C|L!cu7;qss40ZnVs*DDBqo{Tp=i zwx+U@cCJLZ6qvjI6T$rz0Uz)8e8Y*Txx|w2h_mDO14pD18eX5Lgg_c@ji0ZKKpJmn zcLO1-Im)9A{%$HO%XqX%=ef8_YwP#>vJun}rdF_2eInIgjm_=;Q{Jujw}gbBdj~@y zl7X#9qVV|oxG{Kt@>i43@1P#TY+qhWP{AINXAg5QtR&&}X-c`}}FtbSZv?RzumC#_%{5gbL0)JMtyTP+3X=8c` zOT^+w<3YlxP9qiDBRG8&J{{1wOiM?n(v-0wG8_h^HkCiKu0rSO6l7-@y1U>bCl0%& zqf4|qWB4|p7_)U&$dx>MA{GS@Q3@U~Uzt;~I{vmb5eLsFP~WACO?qcjBw+aqF4Lav zcV6*&7L9htXS$~hyQ21Do6|x0vIc8sQA4xWyZG%B5e}XcnWH5U0G|7E$~Wl|>u>fg zULTzdV@CAKJ3uCA(&XQa;Oce+r^7)rVT(kjAFuVQMKNi&zWu+;)OkL;2PGyX)+=u=|y`sj*hB9auvt11QZ#{ zI_wfwZbnfuqn+s}m3q?e(})^`$p8wmxQmfci6> z)A_C?0YSt79$hj$B|6LV9XZyexwSplc86(yFq68ex%7VhojpBcBj=AloY>a^uMLz# z$oHS89Q3f@V`9<2aTAprw7D5f{Y-?QKO@Jqxf{0zO-7^m4zRj( zE3RqMofoj#vhc`~)bGb>&X^<<#%Vl^lbzCz#En%tnW)<*#|xP%bkdZy|2Zk7vDQqc z(>1V_O$ydb3Thwk6*9$iGQ~KiiCSZh0tWbs(nV68X1@35`J6GLCw!uVvc6WV!CydC zc;z!FRd(5|`5_}IaNRTdRm-&xCN?%ny-#6n<2a7xVQxuj2OUxbU4!OXl@LPtBPy&~ zz*--wz@{l85h=2Hp%Nk)HSWO1&jt4#T9R}0LAL;W2=I!PrCwf{Z7(wjoM6zPskQLhrUP`RPAoGR zd51Ay1lahKD}P008pAJv_O!v|`y=1kFpDTKy&h61SxhN9*%6f~jR2@Kc1965dFTC9 zl5oU$cQ-XLkMk9ZaTgK_guV*vycHwF$6n0>Oh(paluF^)6K!|m3=NRME5zcs!xD2T zN1M}3z@Kds@f5vY<-DT7i3W`819oC*0!|Bl5&|Xug=guAY|F=nIAVffU_j$$n#&72mOoJG zglei9r{xa?&&ixn8}HIX6@%tUFHK3Stlpg*hUq$pZyr&>h^u@vzffmwbni9^(1JMHS1 z=R@WbMLcv+A)klFFcft{&YU5i7}HY9Pyi`JfeWz)+MlrmswD~+`>55yQC7=K-)@Ui z0Hx{6C@Rg38<=N?pU|^CJ7)x5NKB=`!OIXB&`e}@9aG96SXu&Bq49wEgxz!EfVJl~ z3SL=lW=L5Plng7QpQCPICF%b@qS5bHxXGKNi;Ma^h0^@u2(c}bU!?Q?ifj;0WZgfXuvQNn%dS$oe1Tk>OGsxJW2_$W> zOBq|gKpE4-%i^FvMu|9|>w&u2%ShMAtZc)r{sC(Z1TeWZ{S>`~iI(-Xk%Uv^Y_pPG z&bNhkt>GDlxU_1u#TZ&oTT)_~K=DcLfPMlW_O^ggK_BQn61(8A7$8Ooar=AyoZ_Yu zFjhb;FReFy=6TxmE-MNOf#&Gm2-^ddVv#bUi)oi{Anlk8wpAsv*WZ5O;lThngxFmPb zrev1%5Ykfe?O_b#z+>09oDVWd)vevN=E33iUTyoJy3^d-Kiq|%-D=~N`aPZTRs9zV zhbv=6v{+ZZDS2M+y<&ir#osnEtaK;|2MlvMgTKA^e81$1u6~RwKgLOko=es=kmSmm z`D~1EzqmC#6*JIF>~`2ToKhB(WagyTx+I_U*`1nGH8Q!!k`~~nV9<%k0~E@hfXWSl zY3kY8j0SJmpd`ny54CeZNTKO$r-yDFZ&2_l{u!}!$@L(0ndZp&RLjm@QAbPhnNwt< z`a3(^ggl7}ZM*X_h!ZPPgqMF!FM)pf37=az3*Eg^5S*;^pUw3w^L8|-KCW?FvkS)~ zCn8-PLr7AMo{Np(*tB1{4!lAWQ-%Q07H%$k58l>ZR`)Pwef{vwcCD`P#+~*xeaugm z*UFZr(iZAvlD#h;SKGcirqO5C6`4~n)PrZpXmoa-MRE|aSBzEmGb+gT(p*IU4%7ro z1w+;mhgE#v9???mD1Q5)X=Lff0(C|<7AA9K4%+^_%5L!1b^~2uylrBD@T2W_-@ds= zILdPrk{32|D{VqZ@H1#%A>*$0(0g@Enm{#*0%+6@Wz+`ID1%Sed?YjRo=gS zPj}IUE9`*LMQ~GcBDt9JKnDM$3IYqU^#RBt1vH0%eHx}?=V@ez;dOAj4Us!UZ^fmLuhM5NGV}LYkUfMM;4V#bo zVBm`N!ka9?9zGZi8f?2hG_ar#w(=6-^&0;Dw2JyF06Xlppox8W!pV$}o=(wxpYzD~ zaOfT={4>fRY^j!JU!7x#)9jd#+Y7InF$T|$dQIwx&gFMTdSmwLcGyK{AzII7!#T<> zx-S!tX#U9GZ|RL*FH$)7npHLUG&NX%3f+%0z)rQOZG+rKcxzgjlS?#0hu;b9q!Sd+ zTsxL6(J4w52fW7kGBcYod9$YIV9~yTNgAPHKl-!2VF%A0GGw||qz9*r8W#F2zc8Fh z^?8G+OHAvYq!FYfLN2IBP>w>Ego6ZeG;QBBD*~7*yHGZgxlplHzm{aqRWSB8CKhkW z9^Wmyt4Zb-%DEJUoDb^est3tA>Yg@-?uCOmK`^mW-mG%uGCO=erg+stZKk;kYGrZJ z&NIpI1a+`z#zECHQ15H;5{~+8LH8^gz=n0Hb@wsHLT-kX%;sBNVES>oTWzxqagM19 z@)bA{dHUJ3q^KwbeNoPsW-cv1Mm1&5TXta<$Lv(wHWmsg9G%9-t-U#g>o_TR5Vp20 z&XKN%I0o))bV=M>V2mLwh@RDHai!@U@}6;eqk|TRiG!Rf#biRCRx3t>@Dxo*7y{nd z$Bz9C0%ji?+cZOs4h}_Dy162;mvpk-D zgTbj?b$Yh^5Dy2f%YH$qS037$Cl_6)@q!(pk4)2yLMAy?d_6wtR7k@kJjX=Lf(6tmr5Vc6O08;Dvll1mIED<5?Db&r)LbIF!q>P zydzlrT@H9427FhcFvtGtL2d5mhOv(Mo%4Lo1FS6O(a5YT0Wmhh%*YtQqVLp9Qxx=3k93Dz{g|^vc~fK zMLhst)iAf`CZKGmj~m4RAY&E|cb+ z@n`DcWO8}iTeK2{pDhXh&YbxKrdh9$e(R*wlneWUZms@xdl1Wci{aPzYKOlZ9O)H= z2gQQaEZ0i7zWmP`fMnnnx?_R}<>MSptNidRKFXtNNB(Sh0S8%`R~pUeToCgSXEu_+ zB4U*c3j}yXv>P=uC1Z5x&}4@OUdg8<-jbZoz-FNzrKo<@^T&Nh<1^TEcLqJWUe@p`fZy9*En<|1QOmY-e2koh)A^1oa*>9UG~_M(>gQo^Q6uH z+wJ{U!8Nh*JG<|TdU7w<8+c!?hj|OfJ^R{>VMaG0yJ`M)Nf{W|@8OYsX5njMMRd`Sc(q7bu^r9; zVQbQD3{66cbr{JUjkF zgj9FA492paJV^r?Bh2xP-m(Quj*QH)ilb}RDtdrwHvaZt=>y;KyvL9rI$^#)jl3r% z=V^@>>$DuPPKORbdU-e5-Qr@FV28Q?e`NCh|H$C{U7EbItO@4TEV7DTpK@Z z!p6lF`>QI+aJRJZmPeHYJuz@|bo#Z-_LuY8)3YdA^4Ow%sFlg07))mFj(z6rbYTr@ ztFCuN4{K&Yd1HNoCuV?>KRbHS$P-adHz9#jcdo8l9IMV*FA^cb01YM*9LnSLaJ&`C zQs5rEjg&!XSc&8bXF3`Vf9ZFV*WT2fFA>5cW%cFn08MVWEj@DQeI97z@Cl zyqK9sN?WBdf+;6r)W_o&FccWp;o9gFWpC?;8}QN3W#Si`}M1db<0 z0rR0`-E5Hoi{5XvzD78-(iUH+B>d_?q_MAiXi?D9f(!jsXlC};cw*UjV%gTjvaQKw zk!Fu=GApYkzkXxJ4mV|2_GK755?WjO`~yw$#ScYuK;Xt(0rxaaU=2n3omdI$=a%FB z#)vj}zp;`TuWd#agQax6S|zK(PMgZSH|0M1Oe@f@$iK79>$<*D3A zy>qc9(n>`2I7aS4LBEKE_+*6lW=0JZcwMX+2irYEFvmj?oV_tcI^!xZ2$4zf7A}=B zau(tnoF$eNJDW5|?5xvRb=Nj+ z*poPiqgLR4U;2>7oxWp5XRtYyRmKF}8^x^!Xz^NKB*u;q9)&(}I}D0~wuYz8+a4MObr^!0bpYK1WN5k^1P z%6HbvlaI7^x)>zMHj>p=V8+63J64NU=T*-E&i?!Fa%3?2*m`*oQBUruY@#n!p-n!O z}lX}4qcEY$Zs8>SnbxYC!6s(7cyqw+VdYc8yh zAGb96mYHL;%2{)Acl$_GT{!$Zt2_kc6|&;>oE$W{nYjPiJs+pDFirPGPf#PFA%`w& z{PAO46zvTW1y~IfA%3*HwW9pjB8nYSqC#K zl3?ERht+H3no!1>WRl; z+Z6Tfq=h+EYMV?AE-I<9;ZQRY!AXyjj^uUc5jrGbJVY%XEj|u70Ka@*)94s~Du#L! zDHm0*tcfkkUX)FHOd;c+bA55oD#%u0C^6MTqxOhZ==p7TL=^97GmHA}5gC1##7cu` z6`k%Kw=m-6xI>{g%|6w>6d$CiLHdEB(h*f2c#2l2N5ugV=lQ5bD*R9?nH_3$vg?m> zAg5a8^H>OwX-Wu1S4hpia?)JK_Nk+RXSLP%D!?eaF|9QEd#HtKI0K`9<7n~m@i2A< z&e*iTQUaV+RH0{8^-QdKqw&`oQh0U4Eu4jpS&XBj2cQ;yHtl@!^k>_JC#m5ZKXx3= zlE)4nS)KqnT?;)&Z4PrxqNaj>WkR~QFiy2E_VI)iGdLRys5?bpH=qPAU2>PGS`Qw` za-YW>bkSS{q`-s@2L)0GD#E9tj@UktK)eWtL%R(0a@FDjw^2+Alt_2(K(>=~!5J?3 z1hfK1TAV5(wQ$Heiy^dKhD(a`WStZCuktj%G(%*7j@OFR18x9NNYmt3!(dIbY+|z^ z5Erg)V8g{Qd|^e?IX=;_PpF>w+QWUkm};gr{82wA1lX#q$lX*E{Y~9z1CYxA+#8`~ z+{U|cecCt+yJ&5(+z#r4n(kgd0K%6b%8kz1dC4e8v%C9MN2Oh>OD8qbGmLKBb24CR zX&EmzT>(D|0etj5@Wj>79HU`P8Xj3te_Eabs_Vbg15n0heXv#B4l2WC=!V~CQ#xUa zcgLw9WB7HfKRGo??8tVS2gKi>hhc0ys5p0T(V%3*RH#=~G&34Tt;lga$5)<4;0{gh zc3QyKc~ICk5AD0!kvMj{n;E?K+>$!mGG)^}On&ud0v<+210vns4lvy83)phgu4T$x>{+ikf`s%!dSn`(q(w4ja3j`8xbk|;}N zU%*ei@eno53|+wtJwZQnLbcNq*tt^6uemH|!CdOf{tWpZN8qV70Ibv#kNqjE$|bpf zi(>ZeZ=@fPxZA%~u~fvv?knEsxbLJ`D%PK}`MNR#a#tFdIf?-_unDM@9rbibkBaMn zRh+*5JG2Ny0pgmoGzX|CS-{s~;<{0?;L7qcB}`2ast~D?#)zIb!n(4wmZ|sPy8OiY zRyXPxj7Tlkbu!AQ^!1lxgNHt9$hp{3k`ELh^bt+~OEkkg1>QwtQJ6F*Y-v|f(0lQH zPscdodL6N;R5|aUYM$$M^o4axxX7kjb+5R}OU`OFNQ1UrFSk#~?8qPp6PMPI-}aLp zPASoNiBkq~mZilh+zhqpj%u7q1)W4MTG$J}#gFdTU`Hn>-P*e-=IEx%rZf)certK+ zBoWh$y6wW(<6^}^HyybJv^&o~A(Zmc80vWvosEp>K>gTWAg^A@6>Bi*-Z^_K!XeS5 zc_YFLc95$N9x(gy^4eQryg!jlju!$Qt-VztvAkC|66t!iEG9ps2*xLa8l?GbCXZ2G z24}63f`31;!)Sch^l~1PUD^l-XH>Gncu<$*uE2yj)H|x5rj?ly$D0^(VO6f3Jydy` zNSdKM2nHAfa&VRqScvUH0gk|=LjV;yvjL?S>+RF^?)qhaeXx$#KtI?uBo4z{=PYwV zMWwmc+&WVzHvorjJ$*PCgu%sz&fnJgiMo;XZ#vWI+`4uRBopd9A}8a3@II~*z3_ZQ zJb0j`Qc~XbUi@WN_zwMhMn)a)Yc`fxA)Mu=V|L-e9fXESEG|edwSw+ z8b{X~`l?Z^pR^OcXHvVR55eT1i8sWU`J;u7goUGg#0i8eMiB9HTe< zd=hQE95m|CTjk7*vvf>#><@g#pFEcuC7M_*WzMm_&PLJV<96o^>XUURzBy&x1;eP5 zmaaSQtJnI3_nL_QwD7E>-j`b>l>Y!vZT#od&hs*^4ovIXfydWA zQ8s)U@TI^9do7C8h!q?Xz4Ux?Mg6dc`??MwR3fr^u)S3>H5Gj#dOnPLaRFb_;*SQZ zkn~xs8fEBtA*JOHh3a$QBQPFW1LZ4QFAl4_=r7Nn+G6!HtrjPyg!SyoM#cgwZ;q3l zUIqSZo(7klF3xkQWW)Q4*B(VgGgQsQCtV)$RQ~ zokI#AZ0irrWk3kCMPD#V*yf42D5TsfdV##`pjcPS@-H{|zU!amPNT)sf(nMfsogS@ zR3YIACcZ!yUWBdM{@(L#j05qGr19K{w8k)p8EJ=XK8!(BuSxit@Zcloy{wjG`dsh$ zfo{h{xFv>StKO(6^abNykU6njhmn?!-?obT$c{E?2Q(v;fglUdq{UoGsiW9*sxF2_FA7-RD|K8WcXg1zHROgs2=8v@HBd6IBEqi6Z@oNit^ zZAPi_9on4b%Y1Abvpk$D?c4m41hjUUDc8sOShbdItw*%OCz9-Jf&PU0$ESB9%lZ*r#g&F4C(@ma+3Q$z}i5zYqazN>`8 zXzo$ci|z*wTL_yMbHDJ=4#LZ*S6D0=Wr5^)zzf<#nE@FF>~5a#ABH#iaa3i{Z!yn1 zfUPL%Cx`$YNj5h4?C6EzbY-v<*asFL>6P<$dhC=81KBn~e^{1Fo`hT>3NbDlq~E{= zgPY4{jr19CUYrw?`%+!5uozavKHp-l6lP+v^-PUg{ zvjdd58-{&*g2YMG>5W1@0vc>#2R<1Ej}F_^cc9jUOht9zw5QuaTxu3mx#^xzJ0JL9 z;-YrRJ#_KJpfg&E>f`nlowftVKHwzBjz3;NB!*Nc ziD&A6R2Yv2r;%;&;mD`uHl$3-o$k3(bK_TvY3!@$T+A@V2=Bw>~H7e{Z1gG z#FoN*^2e#OsW8}g69`67=mh!`IdkKsYNYmNY+d1f&?cJ*rZsr`j)@%J0JioSy{t1E zyGULO7hzdl-8`^(}tZb#;CS+JYZ)v?ZVDBFw2cvt-;!#I=PGblsZl!c{mgk?^Y}Bv?)Ge z{%PS}QO};4$CV{jcoq&W!Y;6=>fyrb!cQytjSLV23t@H}mZAnx`lOZs$nxUi$^!g< z>5*DoT3=dOUs+W+PO5(0SF?E?KNSg;X*(@7JdJiqGQD7L{rfkA&e{1;6H@+nt#G zV59XPHU+H~@MEq@E&`!l!3p}}Y-yw+5cmVU zc9<-o>vQyc3Sexth925BL8Yy304&mg)GC(K4S@)u|>RzMCNvbI=51xxe>Hcy`&?jbX^`RfQ)olVfz)bp~C4A ziDTF}Ivt{4c4-!20xIcugPTN8fb;7`SFn4Xg$Q?@Cvk^b*=7c<)g57=Bn=Z5`KPcO z^{s}QH^UKto#Z8@S1-qiftiln0(CYTkRFU$t*E`QBU;N6P$s>0dXfE1b1n%>_Z7NG z_6{ugfn^=xr681s9$jL*1L;`|9T@=lwpKYy<4snQiu+*;*AZR;-~t=q3hMD%B1J2` zYL8xSH&kQ)`O(|zVO_!V!QuX!?XCKjdiD!^tgFNNi~8PCLsj>-RBeCn=y3bl>!ba{ zhWhxi+JFLcbNGqkF7ExJ>hBH?>y3umKUCYh2RqvU2LK;d_l~yfjgs2ltL?nr+TMEs zSblw^fU^MNwYz-;*^c&0SRVpPmsI=D)o%R|BODx6pKb4KAN@iNdcJ+Mht)lY`l{-n zdU&*5d%aUVR0ppQ5B3`b4g0mV-KgzUw|DDXXm+y)6|4Fi=$2}{tnTc1{RBu}H=os^ ziPdL21dHl{ZfE`N~&>CuWjQ){aqcpQa${oBw!n;nE*Yi?jW?S z>TdM~bgpm~&+C5Jz5a4__Y~ZSU_DDGc}iTfhu7whE=U2+8|<)Mr4_{^2hO z7x6)3P*QJS)*<~6aY|ULA}$($z1k6l2DLe%R>0?x(^<7wf3dR-Sg+Ob>plW{yWOZ4 zVaT={m|>f1ep~&8`uLi)K1f zzUZ~x6QZGhK5g}e-OBkBCu!6JYS+dz)WXP#q=q6LN3HXAXF%cJ@ueHZqK}Q|gEq-P z1>p2tqkNi@~hsAa0*lzFhW||~qThwPER?Qg#4^b$J22BzkXZk@J ziJvK&TajK1`Gvff2is29DW`3^T?~7W1t{kNhTzJ>05%V|-X5}e%4!=3$o8ne3SuF%ayfddOxfKAp^=>cuyw;cZ$*}VR_}2W5Ndki*dVaIp{C` z=fr%5Q_i*3U&k{$v4Oy=%G&zUXWa zTv|Y++t+}Na>tZE;sDJQNfoiESvZz&aribGoS5xBP``d8p${;BnK47Kcx0@T1Y~#7 zSOT_FV6D3$%FQaeHPyox&9~b}FAENol6tRHxs21G>?CgCC-`pG$q&T&oyoMpQGaF- z`fh`SJo|@*QIC4=qEz6c_m58QLlOHg%Gso)xcSkmqFm-=D*7?U;c7Q$|C-Y+nw5CF zG~RCr%)xAD9->!1>+WbOG*^+kgz)7b3P2gtm${VXGEL+(`Z zI=0F1F!OA3&~7P-z->8$P$&;IVfHrw_qim{oG6;_6YX`vX71IG z1XJ>)%3X$&M;C8M#h^jG5a-<#ee$OE``12wlwO{W(BDtg`#_U97b7fZs1xHZ&B`Z6 z!c$EZ{CjE6xcKQ=!{g-`J4)>y%#s*Yl;WuSDSMz2kfs_hzc0yQOZDp8jNXJUPaH(A zTw*MxEoMZ=jvipJ8Hd3DmFTH8Ho+M;CoyZ#?B}l*mB! zvW0FLB1;kX`Hy1Abd9RyArUYe~>O`JweTMTAE&}!a7yT@V; znsjvd3zXcmhBouK{{Kv9gl9Oe?zVcQ_`W zqxYzniCU?w@i_{`@wljy1A%eW27@7al#Bf7aEGd3WtF8ms>Cb^I65}r!^+ykX@fZE z^oA?TG;3f5RL=DRufI5~A2j*?ykPQ`Qd4<>i^!~ z+aI(~n4>LIUtS)RU%yj7RTkIq_zHNrj8oJG%Q)l)7D$=Em_M$8ZN(8W)~3mXMaL+r zF&-M-*&t^|9RBMp0`q+TuvTyG?H?R&JtLHUC^@}rkl_DDUEvkkO*Eo`Ife1{yj4rk zI=55xJrr^mPDkBtnH3?qb0HD%vQ4MX(TSbBm_YAvP!`zNjW&YdO}I0FE)_(EiQYiU zWx+}Uo(4xc{bZ|#FrSit>MWrC`r#%{!Wm8kT-eWF@9c1hb(CY;xjrG=l0R*CNw}ev zbYsD`D>-p*JBfZG&CC`!#DkW*W9hU_y=S@7hF3;CpW*X{m3u$K3mMu9M8-TDQcvd$ zly7R0%D4{;n2@(Jhw?xrG9s~r|Jo;&Kp9rVo@qXYt#dd_*^|}p3U9Q^p~}biVADFe zHy+--{6`c_d?;q)DLVNzg(paxj3K+T3v6SfRHIBAw_K?Vlje@=rRPZk#4IVB5>fi<*`T;6qLIS!hYgNv( zq~yAV8KRs9>iLm~E!9LcGl#tt{ScEXAgWPt>`P|Lp!uj+6tqz7A|7^H+!4BSXdDr5 zi`VbC)vR$hZR^=uBE`zwlBo%Ja=>+OVepc%QP>SGLL7Jcvj6(%;Pugz7l_~g z{-giA``-XvhBeXc!Z+0crTbsH8qK)>U0PmSU0zMy|E{fm*Z=$@{wN^KyrR2Rclh~k zb@`UNRZ*a_x|O6?3I8la+TxRc9qz9a2M8o4J|% z7vjNFMJ2`4-+xzBQ$n)__R3D=Yu2zM0za*V`&=U1O}v1qF(;owf7HwBn|ky0-ZpH| z&6kMbh*IJP=6EuZm6g9nb+&0o^ee; zV{X*!MzH9ql7hTkC(2$^S^3BwgeK*bc{+9mz!=(3updGiHs22TVqziVo~b9VJ9qWF zk@(p%=w7)wjDTvyNUUr+iMJ_QUS zpZKj>pQ*XJG@W1?uWL2bhh0phziw1t)YVcl_x^7E=;ij_i^ki- z{k<1zIq{w3;EA+X^+VVa_Zw<8@!@FyReevbB~qVNw@BgWVIqBZyHQh*EMCxn+hoBP z(|4Qa=Q2LEqPGl4yVZA%Uv}|&q=97PFl@gJhHABPZ30yQmvYGg z4+s#EQCvRq?f{rsv*6_`%Jb$H=4NKlM_WywWm&q_?w|=m48Mc0HH=UZ!UYUPQSBH8 zBfpTR@(p%!M1~b;XGVq;PKh`BJG<3G7#20RK9{I54spful?N;>7CfVx++}arA7(<) zwXf$VRi2YWyf!9f_iZ*v#S<2Ln_!C{$#2zU6er)DA%` z;)yi2(&lQ#r5f#Et;^<%aCjI+Lkujkhn^^k8_66Exl|HZI{ zO*+DTUuVZOCrYUnW>GpZ2$%+iscG3|(v>v6ppxJRDy>=my2<*hLn=WiH@&>qrZOoHwwk(K!;-Kxs z=XozRkaI;5{FAGXa2OlaR&oGk8pAEX3Rs*S@eK2Fm&VS)v8N9Sd`xSUT^I)~G7BS# zsTQS*Yl=vG& zPaD^QtXQ`-oAXLN7X>LiQGUMsa(bjm9t9i%7G@EsJqy2BWYfBQ#`n za5VGgBSQkhKjYC!>;b59nE8t^B*%)w0XlSr9{e-xpWnbdfc$?=06}H3>3~qqWbs}^ zxBYJU#zm(u8eLePu!{E-?POWrGEG@>HZWuxP<0XkZgA)6MeQ)zaab2|IP5!^SLDo= zlC-{uUj$Ogg|%(wGmLHw>xG;EcLl?46CGZiP>l~%az_kJ9jubtdt!#VzO^5lh6 z;`D{%N>Z2y;wxgWFr_H+r`E=c_p>v;4iafZb#Dg)rR=`8@c?wd5q;E$oRAUG^=hrM zT3M1=XG5&=$&8_^gBT_i^EnIi z+I#G%7kAE3Wo-sDf^UB z$_YTN?ZIU0E4omM;#&V!^s;zTK=4bEY8Z!DDIi&MI;uUt--1laiOtlxeI#n1txET( zCCD2Ny3F`c>mH~jiyDj#MW|$(IUTs$f}gauG=}hl<1`&Z>~hIZ$1AE+mU)eD^$Ik87fH5ObPo99>!HlLwcaXF(4} zxZ`*dhs;(GE6ojn#|^`!SizcYmB?k>`hQ3Ww8+Rjyo7zC;G$;HOca}{*N|j4bIrl7 zE#}~fB6cKY+1A}z!E^>4^-3@I(ZrNBbepxE?fTwPvwl=-!YfKX#PL)t{uY_zDJcwA z{A0Y1A%EtE>Gb@0L%VSk|R^cstmnwbb`*@i^BtfYot$GjYiro>_e z{Al!$IkIh8`3ZNoM(U63W4eb#)?%TQox9`>yAWU@)c!%+pvRM5I0qpt={gae!+R2D zqAxp_KsJ#taS+ZoDSX}1YvYX~N`{bCxg6Pur{dAVBaKG$g!vkrlj%r%88RG~!rU^! zaVYK7#_{?y&2FLAIKu9*dechAL+wQv^BVC;#EE@p0t<;#6VP`Gq!oU)DSX*bctk9k zy?``S$7QoPbtK+O%6g3&T{b93Y+X>h-;oc;(ScgHqWtk~y(cYwwu=N6bG!ZX%07MJ8M z4&zwNFBmuBX@xr4}D6@dS@onAY-inm1ceFHdVi_A3PPXk^a z2iUj>M_&)P%=xrc>GV2u2Er2-%-IC-%&uhR)=Eg@5aT-NxkQo*8;&@WKBp^M9aqt_ zpv@77VF%#Ybv?5E_WM;Z;RR2^Gx*BJ{^~gYRj`R08-ob>PTi+ZR4NA{5 zVXjfpRw4$lXy(VZ)FV?RMXBr*`f9>Ajt9-jsU}OvX3qr$(?aJ+pqV}KGzN=>qUmVS z6%TV-WRF9WVC0K@O+p@)$f1*gVF(H!FG6Jkiq~xE3EvRW(S3ybnK&XKQk8S%3vk-b zO(0zyEQS^`M$od$dw#)0(Mw0pnP*R*MDT~~#tA(@a#%h-|4}Q8au~Sf$bs%k0Xhsy zGVTEiE~UdJEOV#V8nD2Vol>F!0xvLcTh7?B4E4|6G9EnmP!dpC=W0Y{5jU036DLnj zbgXuwGjg3N+lP)cO?@Y=5s~MdgkjGLbxOKA$3a{>A}3%y4xR>}NJ4$pi9=+nsg@4M zp1ceO7cw)3REYyTM`77{a!feeq7VwDGAU8Dj&f8|?s-=u8=jkHZ3Lb_HcvsAaI--k^I_ltPYRCBa<8 zQih69T~tpMUB%ONrYmp8lN|a-*Q^X?2g(ZLc+=EwLEochfGN2xspCp>T;B2Jan+Cd z#^)%-fgKnSh&y;~8Ysj@Q5T=1_?wi_+Z=WV3%p6e(%;hmUicBZuR zzNg{AyvZ1;Cmv*z?3G*O=Tl7+N%McVn{71 zGBp?rEy!v7UnB1e=R&*(N4)_#5Wy@nys*O(vZ!g|2mxbTN}z3Q$E9D!|M!HuLhk!z zU>Z)2y)$nW!%skEVL~_qO@|8Tr3q%k%p^x7M_(0!tSd7D{$+AWF4xO+jjUmy3`UsE zIJyiuGB0~NNA9N$810dNBB=f9JfxAKdqNxyGXMiRa+c+a`!Z^WY3Z1Qaeccw4&6xI zc6OT2tJ^!T59<@<;fN6u%dr0JXNBDHw27*THpJ_6y>;Y*e{^S^ zs=uIUUWIe$;t<`fh)?1K*T)AqbPF@XPXBQkh^{XTs&UQd^QL?_7y5uK8$t}aF#&18 zX+Fdl7PyH@;0B5B#u|`|AKXA3EsAa7aT0ula-x7*?571ZXn%m>?;)OWGT2(K++H2b z80a%&(aMt{8Q8)(sqx)cLIKK#T=539=*Ca|fosp~3N|h&X(JbvII0@)gXC4n_(eZ{ zB}`rl(*0>hXxbr~BaI^Ty=iw=ZT*`Vusor`A2$EoH09V)c<8sGnZp>K;%9vk@q~3r z$eB4?j8rNL=PXU(t!Q+n>b#SfTeTAN0OAYd%0#M!In(XH(S+ogThB2bT%&_0T3X8lq({OjBsB27gx3xf z3LagYvo8VSQX=ce)3{ux;1WRjH=u^k5`Y*=0a)trI@4wR$f#WBJ z^7Y8NKWWj+)S^rHh-FV7`8*I44u3i@{qY$`IOSmsI4MJ-6& zx%1ipA@4eQ8iVLDOD}7qpNMRVz&$OtGwPF=x(V*a$9OW}o>T|q{FRm^xJaJB2oYyv z#JrC8U2~s!a-($X*X?zpy-&QI@5vlNkEz7-GaO7D+Oh5&OvZAPiE&6Ulsd$vEzWID z1y6OVHSx+k`HZ%%vulYdz6f|L?#4_Ktyf1iyo1=O@2Rp{VwE4ih@D zwjn-!4xmhr(92V6pG`AO!af4ynT0lKmX{_iOyw>XQy>#)JMmvrNW%p=-8ptUVQOLSy5Srh z4>weN(dnbXNkt-rPerUnRJq9OT5g?O&ycwpW1+HSjSrJIDm3hz5nHbnoTlj(>N+Hh zU04JMd}E<3mB-;w>)y_2qBKn(Q|(L$Rs1UwX9vehSiq7DU~X=sQhV?%ic41E*1Mry zFZzO%TVy8_wmOv&z@BHq*e%YP3HnF|Q#f%Sm$*>luF?+S?jBFMs?-M`YYF+zZIh$Q zrp1xWkT5YnfP}j8DCJI%l5#iFX(mf5i0)C)y$}uHt=GHHV4Hw_i!a~U;+dldqOd-u zT?@_COli-^QV{rxnpyZu-3HQyS75cQ$+A^Fm=jbMnn_>w8h5@6W%Y|TI}U( z>uZDl8$zQK#@J3Zqfr0{{vY@#O_8c(-s{hasl&1pIk5l|FyOXW%b1H@9bd}a{C1E# z<7?%GIeWZGeb?uCM?{gxNSPMqHqsCtBp_tUPRDf06ASxeim~JE)wj=%l0LJ5*HqIn zMs``o`>e{N*H`9(chwTd9RTZ&cB696BJ6ZGy9~5M3b3-SZOT-;Vs3^Q)fufoNXxs0 z+H@?YU<_^-L5>s_iYnc9G;cT!?NnG1iDsJE1N=vK6Gc7R3?dhT$Uh zQBHLtZ3<97h9p@nzHTie`n#yf$ueL;$7mR#GDM3aJP*P%AbBElY>k_QykpTjZ1b!_@=)E|-}_~E|8-+~i}@e1tw<~7q}dLFic}~YTydg~kJ&T5 zlbjip^a2>uO`7~nfu>~ytVnq(IS%Vvk{qv0=CnLU1LJTRc6BSo35KH1t(-Gx;)3aR z*$g_QBi_~?uK8pk=XeV{^F*$t@w$*b$>$BT<3W`pdxa1+=D5z-vP`GvcEULvX_YX2 z7$Vv`0l&y=+IU?eqLq_^b8+Y3SlWQ1o}zC6kh}-5M0c_r#@iPhuS7f^&Jy45u^K)Q z2fQM_ih3B47VSuldj)+#=W-@QEQKp!v!fG{I?GivF-n@t=!vF`6pXPDVF5@8=cnr` zzRPlXF<(i9OLsB!uccLqgM;VKV`*pN{yAX`$8B}D&Gf7WIW9k(J-O4qbrStZ_hEJ_ zwFnS#WAJlu)NrN{shIv4JB+xRFspPil07!Xm4x2^$EUrZ9V54GwJY0b&d^IbWPviQrOqpVRkg!7)mo#Me-V6?hn zFkt3X3r^1>QJ6!L|AT5o=Jv21C4#y~{cs>un?{+MS6D9P^QA?;!)uQ&FK?vTeEFA_ zWPQo*Y<#K+fz296AqrFP)hSv!>6*mdF(z))6L#s(nP$N=3nBn#G`&-F=xp1zTidp6 z+wQDw+qP|Y*0yciwmWOvUVYwg{ae|%M@GiQBzJP1hn7fQ_M~ypsw#C58x;7yH1d>% zLOG*(e1-ricAs};fWt2`W%Cc80rBsSLvwrgOG!r~pKRR=jrm2C3tBcg4Ta354g7Kc zv+tET_+R8vAm6L>r}+@U$t~USC)3a=hQ^L=pQUm%tIB49JV7OLp$aGnT2Sx~MaoXR(SaOUgP@cS4;o?6~O4(RuJpFy! ztI1=?BUfuMnQ27K<96%N&sB=IU`dK{UrJFwcEr~QmyF0D2{^)}I$b)hhK3pB9O%D0 zJ@N{7NVHHN0z+Z@;2<9EHbK(Gl|8(0#S;Y)trtluBfQ_w)P-DPIv_zx8n+OGU0Yp7& z;xI5cF&4-?Z0gG?Cas7jfj_JVQpVtBN@bJlM(?HXc^V0}QC5A$N-eyw_dKjs-%mSG z?=y!N<^?aj|0S<)@Fn{&&PRa5ABNj{!9aHW6Eh4T@K?5BYlJ7!8<+CX3_8X?>l}&R zbjwy<`T{lv0uPzNW|E)9&s1ND4E~B92A5)^uM$j3KhAjoT-d_2ROugnD7ey)><-{9 zl0<$e^IY2EwZy|oXk(?a;A~FW>%(Zf801K&)eJ)wGL;qwO)~lrFN}Lw9#1|^i<00+ z*X5i{O;%TbNhXJRLOiHoaR9a=!ms&gJKPmqcaVOabGa$BCX0f<1UX88-1B2xB%*}< zV=CqP)M)h-q?;Huu3_Di$jnRDX}Ifs$S`G{F5AF_#u0VY!3IG5q|afHud+;Y6vzyNs7+2N>oivu6@#-Q*A|+f=EF0uADxyDn07L);L{q zRw*nGkQZdIO%H| zs?1GmLsn_(t(3AbfbrpGts&O=kPlxtv+4pVZ~Ji)l7R#@_qvQ=Y4#EJZN$IM4rq%J zxqPv{Ea$#0WRZV>qP?o0wH>d)YFWHLU1^mm8fwFIO`1KvrFGxm=%wU9TRSx*$W&Bq zR^DdB7_}RPz2lY+G;W=!?F<3~GriQfcj;MFD&WaQnT63Il+0^kSSF(qZ(>Z6b~Yoc zLeT|^h$3ygZY9xUzECET6xnFbA+l)#S<=t0S}-uognr-_Fr}`u$-0TX9+qfhHcNqM zn6``s^`J{=Oo3B;Nf2O=^wJ-MlypN!$%86{p3oqgL9(Z0tn^;#$dpPe(VVk!5p!#1 z&Haa?HT#XAa^)dsR8q9MSq&jj9)S%{AyP5|izP4XnLHV!GzX);apWfmeCN<(pDr7+ zgNBI8IZkT7tF5Q8*H8YFs1rXzKE5pwm4)%lv3`hBEC|obD6HJP)k25q5o}yqfH1@Q zEv8Vmn=IxXa~Fk0&|C5X2zRhQG*U3lz1)%V4tsim+6R(mK)Tky=P64v2|h<7)Z5&K zXGR~4+i1dEHOvVrgMl~5dCGm#{|k3&D?ynv$OPniaUY%`WImVQq!1pG4*Tc5GjtCT zBG%jk0xzbM$E+XIc-#`z7_-L?XMia|n0kSC%iX-;1e=Y(<5pl7;56bg_PWlzh60y1 zlwPQpqUo-4)7A{%bxp3II2cmKDCDx^p9UNQ83**nADSt-kJ0%kq!yIcteWM+gD2lX ze&sk`fJpo=#k@Rq#6CU2q-?^6(nhQ;G%CW2G>TYlkzn?027hG?r48d8 zI(n?+!_U%x+1o>bD==d5h+hS}FX1|NJ?NKJ2T3Lc zLlyR9b2xDz4%(@kvD`d@Qfesi@9tRO^e|R*TQdeq@o)sp=xR)(T%7<^PiUYV^zS)t zK~=}w7@FDRPz8b#_dU}C>@^r(B6<}RiY|u90rQaW(qm397gYA!DL>9s>J4^51I*1dk82{DK ze%x23JmVRFcJXinkCdE^osQsBt)@wmb0)JXD4RcQDC8HTN`tW@Xz14E<~kDjgUd?U zjl9VF7ZE{2#nJ4BRI;4c)~kTdX$#RJ)vM&NVT0kM;woENaTTLn<$a?}BR;y46)Qdx z-;%u1j4XZlVtus)v$e~j9|Bsm3wQ~=Pw?QqNIzhvZL#H2_3qEW>p16k$BDX^2NPXV zilncrI)jw4x5%mF9g(7Sy`e3wL}8*G_2Y6t4n5Hw_30aIRNp}99i64PPdR1Lq&ejV zZR;5;&CxUn>$1NorPNVkBK$qp)waAAF+(CEVgkvL>tHtLs?=qdzq#z_!_z?f%~@ut zi|N`c5!l*Ev~%@SD8~325DyHQ-I764lVmIbBD_6D1(o6Kcz#AFd)U+L7l#?kc6m@{ zgj6f6QqKljs-3goNmFZCY2@9HSY~IXfE?xU=8M9rU7!iF?@#u+5s1EA1g4R!Bfju! z)f~r%uF7keN2`C!ETP0YiEpCRFME$W)N{kN&y6}Q(*Xy`Sh*MzS$tlv6M1axDrgc$ zBXdbhMni2PF`srI*Yt(5y3BV)6-10vTaO|9$5fdGdD^z)svqs|+O4fD_TZ@z2e;w^ zQ$GzRTZ))TDU1c%8GE}7%f1a%vTvsQW@E!tiY0c}PhQar5o>kg0TP!2DbQjp>adw} zpAAo3HrnjX6@EhaeWmBWg^&90t_yHAusqwpL&W~xKT&DshjvqA1_rD-OM)1|M+j#ZAkp-kk9(TpWjF2%%7v>j5Q+Qs|Lg6E|Z^t8$pxW z0;g<^4BKVc{T*Dhh9}en*f91A-6!1e-&fi4LwlN#Vw7~kRs`(fNK>?a3N+;(9hM_z zlcc{_n=-()5pwtR?zLb6XUWS)VG~}bsSsL=$UwwOyq0RK0;ay{2lLQB`gv%9hh0(h zRA4{K|7kuRB^mMO`Dppbp#IVhFHW;E; zjt4_T%zHf-0?gYa>*+wlVb5F+3d-g};M5s{owz=9lZZ(kYbj+~=p);>th+ji4|WVG zc%mQy4&BG0t?Hdsp4J60=Q8_ZRO4 zz-feaT*`yi;)e8!_llVEDQYj(*pSEN06{KiUuB6!7+X7-e+bc;xV9SCS^_ugnP{JR<*GiHh^`>*JJxAdroJmFFSI zx#2Mofhh#B<0(S~+-z$zhQ%HV?ezz(twWTOvVk`IdpRD%TTTsl`bg9PNiT(9eJ5#- z(U{Vgei|yA0}?o=;A@RfMqI=_5gG#6&4LteTuIf9J9B9GNnntX+9?^)A7+}O-S7lS zr300_FcxCrVYpMfGlwk0J|=Kdtuodpd+&0mx4XiB7EBe~)ueKuvoL?%ccf!v@&#fu zBTYBB;mR=B9NgMc=(Lw+r=0Pu>8v;#G+0M2LS2$?n&(v*nihZgqSPUFkXq+<8Carl zSn+yJILRHUqPB1rvQz~^f{kJ3>dT^xyxoxKVgnxrb7z+2t*{n$@Tf$xZpia(6z98X zZj-iXF{@PN)wnRgix6GR4e~GxBRikiH|Vwyh*cV+2>CswCzm2vOrVGkAXlyxv08sL z@?}UE!tuw9HAjOML2T@o)$NX+-h9WnLp=aS>Yr_M?#zPIVNT*g-JiQv&T0UB7I&X! zICFMO9Gp@cWYapWE%s!!+c%0NsoB-NIof?%&ar34nOU7epPv|4rvNfM{Zi5^#Qhn6 z=(Eee?vm`PIA?#wi}NSe{aMX5T!KH-5(d!U&CS_|Sz=}V4c|w2jPk?z5EXu4LuL=- zWCjg<#IkZpA+`QEp~_)U_=5s;V`O7k2^@mq%dwPs`^o#{@6A0WLRwO1AP^C=019#t z5K=bQ8{lD{?-@u2?UjwTW&R_qDXhIg+<@oO4nN5O#D&&QAZIs^4{eA9Ov3F=bZ@{B z*>;wvab6n26OhNC=VdPI{{}n=Rtv@{6)~!lxzoxFe|aX)DyhVnX<*BGqN zF(-1=V2_7GjXG6+7c-tyGnf#4)B_Eik6Cpd=*ULkG77f#OmiP;=Yn$NGD_DvQ`59I z{@k$;CT!8yL@w4!O5pF&D>ULmiDykg_h9f!y4MLR)8ix{fDAkc1k~FvEl>&yeGY8= zUZblyk?QT>)D9V(neEMBu2Q5VIDL@FklKn!Dt3a3o)0SCpY27Hc~;z+e&F1usKh+r zkYN%6SO_D<=6|FUA+!5E&L+`$C8BQ-Q+L;4-&=eGE)r$#gOMV3U-%-7s@bsa_F67d zY&ka03hoat!Rkm)(Wp-&u4FB)0$16zs#HdC0m!;Ib{5;1eltSN*CzB>QgFI4u&}u| z5~Mdn(NdlQ#xEwkDl@TzrMn1sOkwNNBvYP_r(o_1Jf+UqAarn&??Da2J4#`#TJS^o z`oH|mm`ZvzGr8n)vBQ z?H-O^9IjjJyGl-nWws#4iFF);lhM5I)>yfVeBUDwyOB6VN)GH|P`HL!@^GfSzPVg3 zv*v!AV5I?rvs-4f^;V$I@W7`NyMC^Iq;Zf+dcfW9zcd?I=*4o`C^HY{7k&O~^Z59v z5U`&MuV9j;e8Gt;^S#{VLHZnlVzEO{TX6c2LFzl`6nQp@BA1>N_6Ak;qSEGq_US31Xi`8FRW)p5UOO*7x%Od-e<0&>tg`xS$*d)yu^XU7|lm&D~hvs%5h%-Ipm9Z>$Z(QoTSkViE zdQl4xhMYF{o=X)}oy=y%*@W&Ay2Q$L)Ta}`Z$CCy=Rmcj6u_FMkmiH3BYF_RM|vuq zVF#x%CR40fbW&{~bx##`bijuPQO9L&G*^wozq;kGF%0|Y%8+I=594nG{Y5tmnAV?2kI$QI_j)g*B~Je#%#LDw z&yqANs>+UrhmS&rbJ0>%m-i>$_ZQyJi9^y9pDubbLJHJ3C?Rm1RVs-Sou#8LZ~b$` z0~juKWAQ|HK;jY9f5l+hK`c(is?1_s8wn@g7+!;1Gw2w3)TpdTk*9=oz-*RO&%B8! zu{VoY1_`Zz>dE1`KCq?!#c~`&NHZS>rx&UZogKgT3oU1|uHDN~P>FJ1CUxh-Jq6-r z&KI$bVi($qNv`K{-`P7CEc{(-39q-oKu$5ZS>nF5clJCd09EtEj)4`SG%LFr8KWT2 zGe;8fa?<7CNRexJFoM$$Vq{q>D(gcr*RrZpjE1#rR;NC+mNwnFog8%Hi6IWc7&53I z06tH1xwgK+_4u9wt8QDj=>4fn&m8yL`(;@>bgvz1enlgy;(DvjQ=HKf;`Uvt9GDF^iJ~V#@Gw+!`*y;Y@ef2`v$%8Cf$I*T4 z+5;23%M~$3ebdv|)Bsld{Wp(|nS;+Og7j{0VR6O%^#lBk^L`W8qvJ~refv`^4z;qg zF!4TN=?Q!*HK1V0jsd4)gP;xgW|zA3(0vYfn8|q>>z^u;=m2NT7ae8-6=c583ogB+ z7s5X4(q`uBiWkp>A9yMz*cts4-*_UJ2}~A+ZHk((b~0Gg6fV48Sz6K2I=ELl_)n?SD@cH1aMIjAl~MpQx1wA4?)7x8 zKsWsObTC8~emq_Ve5DeZG|_fHWKV`anlrtrMNf5iDf4%5;A>DXgFd?}b&u3OGC5&9 z_se4`ahUW2_p2T_1PkoPo>`2 ztfrwh^DvzT#UgYOLcGelAqa=CO+r-Cn5-B4B~!W|qpF=$`tcs(6fA_heAuSRp)?TReR}n1(eX%oLoaU$k4qfeV8+CZyTK{|@I&h!RF^!n4 zk)%`%FcclvP+{J_Dp8xjfTVt6AR;46LjeVB3^D$$>p{Y~G)};pCyF^3B-0uXK|Acv zd7zZqWCDELPRP^7`J9y?4tQpAK63P>5xuNeoY4ey6>Hg99k6WO3DaO2?nvV@h+O$C zSdiYZLZt#xus60Tb^=Zchau=yB+pd=NAUpmA$;V(VCx4@g5vAM4Dv%Gv~yG^mA2%$ z>j$MdR=u@GetdhgWAKeOk)9k81$G$EqF9G@d^T1t17M~KlnEWsvY5#S4fc8LxO7Z+ zMZQ|K6)lH04q0JOvr@grh<8YDLap|+u*otNcN0dvKjL6~T7 zF&1~l77i=k8d#f)y?;27F9ROd*L#h5{SoONQ+NGJn?r~Jw#DgPrT!3qD}(UTfKV}h z(ONJ^FdEgMZafA%KL#etGAGe-lAKx#cIY2Kb}piVi65SyKbN12zoNFWE!e4E7%XxZM_0O$)rG`i%R3fivW~jy3bDT#>(UL67L&4JFG^Z|(LF$*wjrfC8%?dQ-0Cs@% zM3YD-xxRzydrBP6$EZ%7%kxvH;AUm3l|2q%NbmQr5zAOeBV`|WL01|CK&+4vDdoM= z=DQQP)q_FSaV4OR4>dHYSyJ-vi9uP|0;&I_a30<{R!ZQR8@?P+Oeej!PS>ya?3Z6D zK*S>#)B#(SnJU31f*#KwH-h3|6D=pIh0CpG)wAKXx>ns~b!*98WgpS+U&ju?=*T3M z&wVb_!_X?>fUDZpz^v$8GzDhmj5Mv~#0}n~W&SgZvk{DObe*D=#ZjX5bh5n4E$&~c z+1R7T{eF~ZyGLTmZlA?S$GbV>Y&1olelStdyW_T=!X2NeE&*BP(U~}!kjQuyDml+p z>T1TaZlOAU%4kefmApe>4Y^PKXXfzEbK1YhKX7NktRUxj3-hA_FG;R)kG%3gAQ_%^h;!>Q)7NMzdM7=~Z0| zVfv7^hZ64!r3k&}p`(f$!Yl}7265=+Rnl!ij2B7E3=Sp}2X!1DgCUKK!Ev7;g_*vu zEtcj29;|UWg#|PY=P2TAkwn0}4iTl+4&7xU*|~0~1gnHyuPig;Kll}azqDvBBW(C`+Q3AI*M@J|r8ARae?&oq;x4}Fm^I|L|B*J>nS2(uF$;5dkX zY@_pzl8fFm;72=G#tT3PPEN9R0k=FwohetzY5c~nV=YWfiJ1?1O5e3-3~JxjN9GUR zFv)l(7BTt}IL&m;>X3*Cn4Qhr!UqVF)touZP3GGy>+T^CMW#q*F8}1NzX7X)UIoSO zBNxSbI-FF6p-W!g)W^8==!y2$7$)vVfYFhXAY0{B>ajbvKW6PwH&({;{)0M(^g~_C zS0Du>m&(!10!LzOg8)Z@4ezeV+K~{E$LsX39VjZT+JHH-m?J47f=_4HE9<+v9erlR zQ-vjdH!Xjw+9+dpJNKd=v-;cg1B#=3n-QN4b4+6W9HE3= zdWAt1^f5MBgoeHps;)HCIQClGCSj>U~4kt+DB%te=` zJ_NW%^Ti0>=L?N<3ih^-_MWXs2@%O>4o#P=^RzVIREFjBGbzA<0?XD!X;;ImtD!BbV*cS5bryuEn6&*x z>tf&5t(G*l7m^3fD+oWn>6BUoa~p@K+dho4k>L};>=EEY6%;>qK1e2B$^eCl5**^@ zrsMRUC0yzny^Ff_%SK2=4xFql2I*JV?CT^87`TeH%Yy1EoUj$+`p{4kv4a-pmcb|| zi%||twx0}us$xW04TYQ$t+XBnslNY5Pp5Yx^JJ)>P0?|-$^a?bzgZX+`G-NdR}U|H zEvn`ZRYPV&iBcIERk<4Cv{aK5HF9kcYIywDFi3FWqG4KR+t)ZUB~(aRKp>|7TE0d> zdA{^ijOv({p!kkXa$8T2-~=FO-@F9Tb;kA5!^mIlCUopv;M-_Z01}kfR-{vQn=MBZTPB}DK32RTW)6f6O@y7H7q5wHu*UMX=dFj=&_P*qKJ-$Gzpbh z7>4K3bY4zc&S$YR<*}P!`j{NTBS8?Y;NUPjubn*dDc$zrW@_Y{x?kaq zN)C4~qWA-<~JLfsV zMxAD02r9HXWz3q~oEKSeI-JG0NuK{iFO<@hfh2bd5y+Tr1qju-20PAH)}Gf^C{B2I zOgM$|;9-dSICnsUxzAG0AYh1JQ?2h<;q+f_dQ-szl=1tYd3C=f`{ka~Oq*?bWj2D! z($Zx)dmc*-{-7MRZuRf+=}TQOmJ`5*jh)VKC0v(90pOz#^5ZD)p5ObRXalenT8y}0-;Cfi4oJe)^pfMX8j(bZK)I4 z#Acen6woTcxo_vk-PRv0*uu$WgE17-J*~U6zI}Q=O)c!vALdQz&!2^j!6TEEA3g1_ z$&FUazM|eAhi|`y*C@Y~SF4M*qtBPq`GrX4@3bBe3#r{%Kfk_QoW0Yn(3YKQL5U1o za`uTSup)*_4_u6@wO}?Pm*>g6kW%iIfaA11!uLbWJfCbj%*VMiRh+EQZERKu`a-!^ z+81Rq3^3}at8ck~QwZowAIaWE`Ht+WWPrtfLDsIP1$4PhLBaZgc8@ri&Ue#}(PrB9X99&iSc-Q!B@THVOw43WzY$X#g zr9a1=7LNNR9Y61Ns<}PuPlfEWy8K~EpPBClg*~h;{Tq{CtzK^ZGxOideR?aET2F&y zxA;%ph2_7zM&QuA=kw=J`pl2oI5=H7P>qbhJDd{Rv1{8W{qrdbfpV47aakL za^H`4gn&gB27`{C8eG;m*BgfZ%0&Z1zniz`D6;cT=@2Lj$%C>tnB$3G#p+sx+TLG@ zw~vd$t8Gu@zlzrlB~~AcN2O<*Yu}qJi)v=Oe&605TP%QZm0kj$B?G5cd8kTmj%FJH z+ZC&><}xfTdY9I6N`p1h+gE1dA0JBj3HPgTB}5EaZd3!J8g6^)p`HEN5C_g>gd#ou zPOrW$mG8&Hk4;TITASU%X1g-Y;^!+}99w=q_NlDl)Q5H-UadFPaDbu0x00nk-~)YS z*%ca1f8bhLOSDL(1534uLEfL5@=Ul0d`r@w=%00ozvIqtN^*G_KxRvW?82v`EZSP7 zVCtEkS_p8rtG{=@m9=%N+hLV0A~B6jc^p98(ucw6;Yu|Le_t);5R8MZT+%?rp9as| zwKCG&@=|ACTr0(Y->2-h+=_gO-qJgGr;^m-GTgAjMjpeDTtb{|-@83tmYbZ?8;Dbz znOv^f%Upjo;4GuR6|-$q|HXPfT1bD-rk~;evAm9-opKTj%K4TT-HV#}Njl`OB3F8| zWSkOtn>}BcK$`gUe%mcw}4(UvP|$3ys{cA}8PNYUU(?ZF~-#RQGUbJ(AktzK!nBB=R9 zvtuP~aI}}->?Wh=(lw0Gj=l@E-m{+$)4Sc|P?>#|d%fIlUR!$G4kp#d0g>*Gq)cur z%?dryV8MD?|A9WzuW~y5#uW8C%9)t`er_F^B!iM`d3nJb+Pihi>EaGeEu@TOlTsi>)@a?9|FMxA&3zg3ahuY%kHR8K5TsmZ3Eit@xep z*)#xE5}3KPlY+l*lzYgPq8Tr`=b;!3a9@CPU#$r%V9b^#0lU=*yH zFteNy$lA;r+-=uhd;0jS%2>CE4$zEM=8xoFJ?OkTp2&7}jOCgt3&WR01>_qIzk(|0 zy!H0;L;l{3$GPRe^F?5%TqXO;L>AUe^2E{yT7gFG6=jXl7vPJxNB|r@g&(;8W1`UQ z+u2=8xBu|RRux_Kshi!hwWC}3Cr_WwZBBh7D^tbkwyulwB^XbY{RFQM*fQ{vMcEDn z8)ede6--81Xki2Wd+p* zqCBEMSgF6{<+;fKnW!G1M?+rx^j`gcrt#6ykIhb&?rzRG*b8^gq;F!Op`k~I8TGc{ zQ4Q-L#!*G?8-mcy1=hIYoR4}J;|p+Cw+42pA4Yw-WAh22d&@D-bu`!Hf7S@-?8M4L zdV2?}Zt+#UrBaBT>8ZuL0Pv~OSY8t9B%$ms%ko^u(D29lZmu##{tQ~X%PETXjo)1r6{dhGucDDN6{=i|2*Y0-tyiD#&s|Ijgs4!jhCsbX{ zXqZ7f(bN6%Olx?(A79B~Nlu@|Qn7|&!2_X>By1QD1yIacm%E{C4MjJ7hA*WA^3G=R z6!^>VRO6oELqvWA809aYg9>wd%{a=sJOi;g1Iy-8L@<@{U_q9MJpFwV$L6@ga4{%i z?~@!D4T0Gnpv_eRcSr)%Hp=>toS0(C|NVKJ-p$%fb2^jVzu-#3Ev_m^u!W|T)od>7 zU5m<)%53CG=vq3OTKYR32dbIVDC-eRcv4juCm&kxdv#1~?Ik(cCT?n~3%FInTqyi^ z*PPjJN6^fX0qt@J1MNu`MW=126Y)qbzvp;pO(YphUpbzxA0xO-{EjmDm9K3tsW)|9 z)L&RV+t1G%#!3ej5j2(E9K0D)kA1DmH7D`lpVHcv@6K9Qh#wmY?^|JhD~GZ{NXner zP98-guyA3)r(9Z{c3>NX?^adX4e)~xAS9~UJS+=7Lw45s*f(*Ql%?;lKE=SmCW87H zn+8-ikzxQn5JR6^fs3THV7jco?JfaR?cC~_{*tiMcwArX^0S*;rI(h|l%7XT5x1Ju=1YCUNo;80DG>L*?wo)>Y`@q2cVhT4&_Dihm0z-5A5nX^eNYlZf1{T zK5QD~8s+mAXf}65A>I8VikUKRdv6x8J*eiB)G+KYyg+5Two;P&dH7VrT?3pq^mIXc zd%^Wcb}5u%zDR6{0?(MlcZVctb7C{KGBh!C+{xH!|HDQoP#g1t;39{FMjCxan}RDJ zR2~nNnUbt=gWoBr=5+yblOcpQ?AUk#u z_%!gL?9lY#ngkx@i7Bhz0NT>I?>KXuDV$L9LsMhG_j*X$9DV}U`{)8@0X%C8$gN`) zL&f?v7JS1P#fHn&^Gp-L)nOYrc{Uv0o5Y2PHeXZ-Z~Kl>l!hY^)}N{b&VM_{@>X;> zFr53Fyc1ez7n)RVNI3;&6ikwRAbc64gqOHB0Rn`@P1IC@fg6{Ke-D#`_!x-lGd431 z#scb8VYFKnL-T#qZ^PnkpoZSNX5q^A`Zmspz}eM8P2)4csiL@22WRX>GW<~(;9J-P z(b8u`jjea!wQyl*L!(l?0UzgNdvpjfLI(e>3gA|x0{RbcGvZ}uJ3!Fyd$OOj(SrAv zRi2w2az9!2p}B7X!%Id3JeF^Z=J=AssB{;&YIXK=HYM+DO`MW6`3rYQO9_7gN~ve&c31b;5Jw5YO@iOnce?Sci|sJ=}MpGo(Ms zz>ke8J}5pgd9@QA#CxxsY%ET!rYOwF@eXs!Tu-{(E4jd9L4E z{{u4^QyfSbOZ>7~h9`8CCuFQw z)GQAeU!Rfp%e-{dByvCMcXBe7B&2X!O)eio-6hTEasro(DI!0b1A!NJoFvpFZjY3E z1k;mTto6{oppwSDjj+z;vc7CCNmMCMXQrOCP5q7lKm<+`#>ycH|@mrSqBPp!?Y$?3a;`QxoAoCkw6H(kmk zbO0&aY?XV|kRCDvyw>BbENQ#mZkB#L5>vCIQlLgL{=@(v!u^O$psUko`PmK0C4q&H z%DO^YsE4-;2=Fr=YaN86wfA0haB%D<+W6$y=i$6DIL0MO#L=|Rk23}qh-i?x_)=j9 z%efqp`jd7DUIRo4+zssV1yarAp^85I6zZr-(Nsy+uhCfU=n`Eiin)NDdq|_f4e}%` zQqBYM+YHRh=M4LQHcu+;H`#|%y2F<-k(;cgOa{4cdy_**m8l6#Y44tTN7Q zksewGL|Q-`0^Q;u;6`urf({s>b1SM!s{q>F zsjw@KWnaW`10p}i4TB~L2nNB@&D62dRg)<-E!d*;5XM{*Ud-aq7UHy#tlINvt)^VV zgoeBWz`p|lIJ926>gIw9I5t997yA3hu^Bv%26rI!p%C z9IM9@M(6!(oT6Ae7%zbgg!H$LByRH6-4#7$>@O9aPt%+}lMatU8mzayj6}NC&S) zCcApxT9QPtBs`2VQuEFcPbeEx_-5Qs=&N64(_)dZr`>uk4LV;|@ZYkSOVCp2{UJ#d z0U6Djg?*EJ)`Ku5Q@TV=nS=y?yGy0B#kIIMXUj&cF%*p&%2`;p=9Hd-HZhVhND9z7 z^0Hq+v6_Cl0petqWj!QJlwM?1tuL`mb-QP&`A`&&BrozM;UWVXANIpq`#os!M1)hV$etygW#pstu5tmUfpfZeo|d z8-E6K1&oTzV~(5h@hl&4RNbb%3SHZL?2UC>E5ucbbuI?Q1h+(S=VN3%JpEo#raAwv zg;fN{)HAI_+z+MrPt>0(jm)4_kFK7sV&za9F_sO{C|%)1z@BAg>lJa;bF!y8z4XPu zSXSBvaDR=%wqun}CqQVMK^*pM?y}hJyUTJg_wdv+glm}abEQu047oE5B};&d71dF{ z=;QV0piKrO)UtR9m|N%t@S?fIrU_+c^PWiWPIrHGd)A<{zBzYB#Pyv;w>faKC*|yE zSlpem{5`G>o^Er7{h1t|OWv_Z_N`}o#;#8Xw$2h^B+<^C_7BKEuwdLe1hGmx)6(OD z=sn>GyeR0LRDkFBqmD+HZG9I>MfOnsX=0CPX(a2WU`LlFhG=U<0u*Q`Z08&fEOP2> z8G(60?j0vRqlYUGaCkUk9q0@eSnVKkVvfgbeQVVfB6dONiYU!zEH^*tF0sSS!KN84 zSY===MTOHsg`>)A-aOC~JUYdgu%4CqHEq#nW}I;Bc$XH(=+o>>`B#u{`Y2f6089x3 z60MJoWai zC1aBD%6XA6!~<92wP_q3xSC9k7430%@HXd?o9R;|C-1FN8{$A_G_{6qG6KC_d*Vuq15tasM<(@7R7pvm)W1(zm?g8KCiwL6&u7+kV}5C1Ls#_N6G zeOR`lpH1IM%yDLpBif%_kN;!MM6q->d za?Kz@FFw$lrh^=^K-0Ik*hW4QLCx8YvdAiVrLNM$^z(gVqL-HBCR#yqm`gBm^Vnt> zAjw)oU7NB=pMlKL?}-CJ#GW37J^?))!rTvv{7@&Z$WH!ZNiq~Vh(Pq# z(Bxt8#b698G@3U8o2xg%lVm1`a(ac*BOo;n{a55K_Q=lGc8})ALD=j0MPMtqUR8k+ zz0t_5KdaheW(Hi}bHcH!h;lEB>&fe$yEk*$F0qUKW!R%7PS@j$pqKB=adYT!(&8@y zNoswLTno?N{W-d%w6VipPrGX=pu{iZ92N^_tu(SYv$_N$-;YUtQ4QS>B8siN&M-$z zc+<4>RD>SZJsCNO;Baxlz&*Y(`tK}klFcL|_VaAW$TJ@XI|7c`XN8;@@CVGk!|)eM zXTlLUkq>M9qcfhFKn$fv=xzSw8wJ7>LEo>pgK)AU(s+V{1O5zhUh@|7ku=UgL>kuX zWiKbasi{4;5A&SIpk4e@qU$&(sB}3N()4)u7rpH9DavcJlXX5z9!^x#y@+BlZL+uj z<%EQ5X4E;~!<*#}=tXz?f0@t}b24z262$}aK>nLFyAtCgHpz`gUBG?6N$8?PqGT%7 zBri8%-1BRF6sEdwYuqvAGQ3W}SrlLQEO|z}v_#iO?F`NV%1h(JrM`$-QUI!)r=%!( z2??^bl61z;`R`RC5})UJ&cNSf@>Z=%^w*MjLx@2nJ)){$<$t)K!w)_((V zJPwnwdimHE@reOV`u|e6p27svhe$2mEwAJMWv-jRM5)#e_fhxKx9moK;e4IA05 zMkf8zi0=^Kl=Q4bX@==0i|@*p|IX$^c=#>2RKHKkGxij-5_2+xAA&_p8w6JzMnc}4jT6Jdm4xf2iA^p$FQvpJ4_gxolqXYQzP zy0W$O`zuj;`9XtOk%^g1@#{JRWx}xEbPjq1w6mY@Yncp;;rW5clpF<5`{`O>Qe+Gz zOOJ$UfWta76M3VdA(a*rVLKF(THD$3Ej-OnoC3MA>6qUF{QV?)hHpSvcF)qJ-$SrYsVj@n5&zH(SZ zhW!7>{lCWYaESJI7ewf51zPtDdhadT*OatF-DTl_-Ux<~@J0Jyw0sDTgD{PI`7w>Q z=MVOINa}ty4b5;j>2Kzj!pbq5VWLrp-u^3xPqGaL`y!ZvO2(T$C%r7Q-x`sY0yi20 zjm1Lwi}CPZM!NExZu4c3|CW11&c=IDt7@qM-~8{7m;2j(E@n{0ZMoV1odq*vJ#Eny zA?`?%;QhZQ{Wf~jTZ%q{@sGqp=Ka5p@f+(?zP4Lt&pSw`C?o__Y5rehhVq)P;~N=I z%W@JK|7+67d|h|N8=8VvI>4m$d~Q+rv|t)iZUf6WsITZcQ<7J^kA|}PTEp;kWG1Bb?2|K%=*rmxM7|LK2em)oV;EJj$>-|a(!XhyY)(Tr8-Bq>I!m;{-}+aV)&__y!; z=g|a<%=i(qxm-pm>!rc5RkQ9Heg%i*vY`%Pa3}E~Y?n_5SB1Og%Pe&{7@-b~L5P!6 zdg~6Cv6%GTrXs3KA0f3r2NZwTYuS2fWA-g!Bi_MKCMx3*%c#>6g?z@p_vfgz3VSV1 zYZ`N@vc=&;N(^ROcdu4fag_+`X^4_YZ2~(LHBh8~e_hw&-P+vos*hDrW(6q;F5**H z^p4YI;>i+>n80z}VWnDxnMeyg70mDSV}W!qYpTYD&1Yi4A)GaPP3+l9h1ZBC@pUZW zu(`OjGHHmdrtH?Btu6dkE9c6B#Vq04U4dR(`17>A8|m&AC97(fmk4F21gjns`VS zuNLEMRxP!U}i#x zff>({jRF~?x0=H!>gxNdoTb$+n$b&=pV9eT&gH~856g!U;mGhqA+cJvc26|Q;`9PW zcQj~8lvfHv-qk@*F=7+4H01E&w1ZZ=W*O!_N!rAx(Taez@BmJ>JwLJ zxMh%uFS~0g@mO?*Fk=5udZDd=yX2g;QxhITNg6^SOKY(Bsx>eZfsk1`vN+tY2fTn z>-eLsPFz}HztDxs?M;?hqR%P1r5%Ovx*Yac zaPn-Hm6QC8`@1R*@TWU~%*dP#6?0kYE)Z>k*G4Cw0CTo^Tj@05(pfVhVjh=o5P)uy z*FrC^K=k+yTlKVHv$BtYjQMIc0amMdErWC^RjWB*v$ESyUI|Jg^J!g#Ui@14yDmp> zF31VR{VXX6_)W~xrM$d(_3Io`TwWdUlR+dhrJ+y@#VB5PLtcG6=sda~^6qx@7BIe-3}bTQ4xhcP#@GjtFKaYm$U9!9_Ak+I z4RYC?9!4dCgAeQ$+V6@sGi4t@7oiD}sW6Tu*{9;cn|#XbcV5@=HJ3Yzv{^8qyEBM-mwxz$ zLRdMglvJ%&5^oGps#p@{l$gs)0FX0Kfz@h+=uNR3UC}A89WskaxWooV*7XoD_@^T) zu)|hwF*}#6)o+5PTx@YAgqmxS1;PpBW$W1(4fuxjgqPWL;k(|rsUip zrhB2kIKo)BKjnX5aZ-vYDWm6t&N*qv@578Fb^zV0;Y_Yn=JXtnOD;N#>_+AV#+aIv{8rJF=xY8eA@{$JFM-RSh>54AT$~^>Nm7h)bx&4yL0d4po zWm+wK%GUOwE_CW2yr|9i`MtF(7k2UZBOu~KE+^|Txjr-9KXk&Frkz%|JUFbwdET^G z`*;Wjt@92ZexbTDG{}TYq1I!QxL`u|DH5f2n3Yz30*C)w+Z!2G$KoXAw0RD=Z8TTabyJb zA>BZ2zzm3UialB4%#)N73GE0L`UA9IHjigt?(f#;fWAD394F*Wj-!V}-4Y2qT>3;5 z5A&jP)!~Rv*h1#U#cSs&BN|!GT!lY!WN$s?#p=C`5Tc6*JkBb}(inPiBH>pjqsTnk<$2U5mo2(X!yX+OCi)b$F zsM1>iHSuO93rp81dAXpkhA(9k1y9N6eXo4hYN_|Gj}l!s8^3uiCnG%VyN+kHt^YLQ zl42v{cNq!A!jC6wBTjuFiIX!#q18vF< zueF|MiMMEL_>If$)9MG#@j07P%bL~>37*%hN3Rd-f&tmM^ew;sSRgM;7-LAA-OHEF z9+{9NlizPv4_|yxDLC&T86|%o+%mvlb<4Qbx2OqPAc)DTK;g>6Znp^M_ra%5D-_{8 zdCe{e=`4CZ^5JQ4majpWPY>(Wo!u;;4#EzE&tZg--h_BM)BPhVsNJ6>dZ(3G^j8nT zZZQYBZXE`-l!#+3oXRGJSlQ9SSeOjXN0FA=g3#H`>hp%3=vXyuA42hgorABkzyVW( zF!WmAAGA;G0udC`wu!|E%bh;p3JDAOC`X0+ZFyL_3YPM4~EBY5_%b0=Po+UG!c7rqQo%Z*Jf9Nh( ze<~?FjHvR?Wp6y^y^7V&<9F5@g6#f$3%D+6>6cldTNXgkty0|*#8J&N*=Se(MMRfMab?ER&Y_UZgo*sk)h}o;S+h)?ISkM<0c<`Dw3||Hj z&p4nP%Iu!f*}c^u6pv@*ptXdq|3wCXSEu?w#z!x?yXZ%Kl2!Jv+9)KKt69DsRea?r z;F{#B8Hk4o4AJ5M8Jp^Q9YwN^dn+ABqpc(tda(7rLozKJ5~nBnOHhBV2%#aA>o_0w^Ad&MN#{qHCWkNf>(Q$5d_a zWRex%QqX2Gh50txPz`#$r)tKv{n>~^ZWv;{!Drd4PE4M(wHv&6cq4A#IdH4LC{CSr zFW5{_(pwrh)#Y)P{nd^umKJBpGP$UUc+ z1C8w;9Bp!E69e#~T=g4-%)KRA?l%dP`*ksL1xZTd74N@Md1LK~h$OqwSq>5UYxRs zZ0KQ`q=dc41x=NIxS@&!vfbE`us%(z6;`LvSpKNfgbaX{L^Q>QxwGc$pzO z-`3X!F7ZW$(*|r?eZ1%LZo@D~!b=YYfD3QT1t0EBqdo-!MrYms7)3*lK@<$mVpkK8 z?Ite6VNh=A=)mkc-t0h4EJOa|5c`X(S zh#EAmhOjrZe&}HWU&&QE&FEOPDh3GTiY!n#qYhDrjp<@w;L%z423Lb&+qF8s1gIr1 z_jIL`gp9t^B`6Xu6^?T>g6#;BBbX*zuhm**5m?qv*lU;g7L+tli_GEOduwCGwB3u@r9DpU~oM42;i-l z%fy-|=@^GOSBVD0J>QPEDKVGEojZ=51QJ;u&<;=I%K06!mw_7#YibT{9NuW>UHJR# zLObt(9p5edaTMP>XFarW`e9Qojx%F~oeN1jXH`zATskjFD`uUY1T!&1tCSAxI0)&V z%DkGd&>K~ZUk5B-!1m3X-potn$9a~9;nvNwLN_>7DR*NI#U?zfr0p=VmejIZT2V_J zJX|T>`b-wKRpnl4@T#vu72YvRvGcGnSuqU-S0ZaVJnZN|}Ww zDPIauhdHwVCFM&2N}Mzcj}yKWoQ<<)A)2(jdwAOsTR8HSM3TTb?4nu^8a{SOrFf`$ z8u|%C%wJ1_AIs;60&IELVLCMB z_E9~bWf;hMZEQG*Mz#)Zb&A44LDcU^n@U9I73!q^5)NB#IuafuB=O8)$KJ0ppkj^V`R#Dk3!fwT{Vh^$YIrz-StgIOxE z?*9A2?`mN#*+QYwsZJ9dU^WE#R5C_P`G(bvmXwx1*aEid%RBnlm$N^s+Rocb_<^V$RRkinP^9Xs{NA26LhW2IAns zp1Mef=0eBcLbWM?L}xCR1W_fxLhuP+$8`2M$&aaHne!)S7M%8C5(4Lyp#0Bj`ESj| z@=xgLgX};m^JwnapZh3FSu>$gw@u$E5}BBX&>b&S{u#eGd11G;c_(E=pvc|kv!PP= z^9jH<|Cr3yofJ2@G;5orry?fn)7-eZBG!DY$c!QB=*EXEup>#8_Rr~|G*RFNqh8j8 z`UW7EWs$LrDKRV7^#QVkGvSN+N4C#|sITbJEkLI1Los>ob~aOsDQ$snr$<5&8@p<@G(?nA`GCS7&Q97_ep`0dcXLS?A>Z zZk<^}t`Ei?SB47gSrErrjofO%)NqY4@PxDE+4ZIH$p0n}H?ijA~bpTixg zvBAP^l4I?u&V}Q)H0idEx{~+RCP=IdiPnQ&UK#N+^bq}rpo$c85TkxvQ51a?m=h7X zhP{~W-C8iBLF=Ys_v5K#+P1p9N^Q=>I*HmuVh)%wx@EEQqSB&aPYD)Jlqk?1M3)`0 z4k6v62`lysq49M7?Y6eUD%Tb|sQp04`8kxkFOZ!RoO&JJfj%gh&x0W;lul^%SHqR% zIMFK+?yuLw%@#2q{r=`0T7W8JaXQD>Q>0gc-)gGdQevTNbD1N3WtQP#r>H0@7E8Iv zXN&IBZwzM$TOpjAkN>dXnGw1sgINe>SWoK*RqdiMHp!Qj> zF}bm0n%xw(&IMMeR`Y22Z!}$wK1;fpGLxa8`_l{{ocxd|w&NB?t7qHR`!jHe$VE>M zw=DKAT-$%5rL24VO&7EVnz^hEew}>Zmw5IPx48Pl*0r7f8SO~zkBMQvWu@Ek&RXy8 z*KfD#(cWv*z}8^R^s@xOx8eL}f`$#=Hk&pP?j= zql!`MWC7-2%Ierh-i=YI^X>gx{`E9R_i{Gb)Py6}d#HuY6$a`gIwP}2zD5d$ z=Lxl^t5Eeqm{Fue-653#ho$y87WBo^IUPFlcb0VVP%+LyCe;sEK%H;Z?wp>6birfY zMGT@#7K=w`Bhgc-smvDS{KIX~N z$Nu7!YoRtuTPu-IIsy6s^#uQ-Q(!iz?_0-rPBFQVv*+CR)8H7^Q27nS0i{mntnK?) z>XA4krs)I?@2xcAYly<1i3)r_NB)_qgO95}jwt;1ohCCHY{>?9J#pj|Hbi^T_@|{c zw<=BaBGf$z`!w{Pdomg!m_x@jD<|kj+y%sKst}|k9(}^~lrjbkPS7e?Y=)_ZN;Wyl zYf~|w+&C>0HDT^lU@z@AKO*^iCt5y~wjrct`C|@SjjBP}2tCd_r3Q{G-M@^Av~4Resu~8(5=*KXOGpBC{0e`KUuK zbM7HG#2PML(28H&dOU+xaIlb{(q?TN3@^&d@|rI}w|LHcr@m2OWUNon=T<~N4UA_M92r!6=WgI5DJkT@uM|8(pGz!cQa{lpv%oT%rv- zofAAf!!93ObS~XyWt7N`X)-j}zT4=4S^Os%K841~DcTB%LOt#=St^scTNy^z#VrSk z66)^wP|p!XR64i^`gWL;@E9;I-MBJ=oBU?*6RhT=N1E4s^eCx!O9MaaA^-N1LCT8B zJs23HCD%a7GOpTPTI_kAzY6JiJ{X~+(Ct$sawQdZkfHz-uRP3q-T_PK?*j|Efdy~f z;;zoaA%_m|7BvpL5x$w;d^r>5F!p;+b)3+eyL zjrFs0Bu~bG?2%QOHdmd1iA_cEF$L62b}UH&HFGPOkhP2BVdjbTwp__csLe}Y9f!;! zI+KIrO<-^eidZ^{TzvC-ZablxyDSzzOr{fnv`i8q=|COWbAiJ)dphct9wiv>1m8`} z`k$K8T(RHd#1fv0)?^n=QJY&Rc51$7QSOXPFh*0H7ue&l95OVTZ#^qymdcWbPRr(x zW$*tGwjL(ZNi;lXAMBbPWrG-#G)H6ku@B=C_Ta5>6?VHNj6)U9~E;m!#h-P>B``w6}1oB~5Pt#L3x7h8M zJ(&A?__en@|1K$7Vl*P>@#NQOX}L_jNkYj#fTAa;-p7JNWfL9SQ0}*R&rzy&ZSXIm zc17Qw*G!;H;s!LWLf+sU%J%O(O^+o=?vhDTq%R?Gx52wRVXMr#*iO@*TbX08{3L2; zb3DxLKl?w2s__@3YBJ`t{QZtxDTm2Jwii8x+jH$**wb+^Zl`y?&FG(-?%nI0_TZCh zHldfbW>c>rXx~Ms(1}XeYj;kkr;oE{?EWKYqxED*i$zNcTu*+9ZvDrI4g!B3(t-aQ zk-;SBUWC+P>`X}0lB|WYIhz2Ro0{bKoesTC3Lg5Sgxr?beEBRtEhR$(cfN&>Re8E|wO?dPC7f2PdG_ZfQQt|=eNOU$Pd$+e})gHJAUHds&+yh=&6rJfh47vz65;DOwz z^8T{#-q4{$uEV!!A!dWSMSAKh2?CYk=xO90lIWGH?lrbm?bZ|MgtF63kGME^Cx~El;%eUUm zDJBF5EgVMOu*VnqhqZ=Ut2~;ERXku1mzDUu0w=YFTs$0%S{O?aDKCa*zea+PqrmF( zsxUuj#Zf=(6;;8>IggqG^o9+>S14KB$l+V3h3=q^f8Y6ldxQt$R2BFET5?v@FH&F004*t)Mn!_gNikOQDQI>(fTU0I!p?vSpGy5A zreN%xGioDz!vGTS1;G|2J223YRCM;R7~6*}rwLl1K9t~0Jwi2_YwABEWl8;p9}DxR zMa~u!H$L0X%kF0>&N(o-A9My3^OB01PL?>>{d{4*c>7S$zj{=t0fV#FMovJ%%cqUR zZY^B|gk#tN$WT&?MZA^6=l6>rD7uRGdC7iW`miy6x7V@!U>8FV8LAxg;?9QniGPzX56Y5IKu1BKFyrx@7f-svu99bFX3GEQ2EDWHr|u@!0Libr!vUPS zQEs^3c)qYSQ-;;H1Rq`=lwZG7ON*7|MV2ZC!*DQDu7>7Y)NNb!#27vWs=U>FdGPvO zv$6mBuvW(iDQ^x}vD$Yn{MLlyZha3u3OC?5W+RoL#3r9te&ZCiL_v)zpN5@>#0;Q$ z)=1W>y+X2d{1c?_-x;g_2*!%`9T~P9s}p}CE^8u7#S*n_DRt(g5#45)XgM2XmEBGz zdL-`mu7AJgDA%{^VE52^FKmbHOja%N{h^LYItA#=*4@qx>U-jw%i73tzB`}j})y2!@2;Gz*1M-V=UATTit*>yHk)n zmf9j2M6`_1CA_gO)O7(Iq&sx?XYNi_jYwPqI=S5?)(n$Fgg!+lf8WNDg1q| z{@2dcKaQVGP16kic0Of!=uEqW{UPj8rwMjs&I{mTWKD^^j{dST&hahWoO1uXjL1^| zTW}Tp7km4)GDI7FCK-HYg0zy0V7zKigm{aE_XS$2e2IBC75p>Ub_c_AG}z_tH>KfU zf5#-sCO%j`E2iS26zy3#vo+eN*-g9M5?t_34rI{S!yY96myE;5B6I?j31{tZVL7hM zIhqZ~6K$KF)bd=4vL~j+9gNG96Kag8Af4@7nwvY_Nmu3!Cx6)dSZK4HIJ5J~z~VWc zKK+4um$`)2)!aMO$9n(wg%8KYg#~)R|K=CwXW@AByA$4D$X+*b?Dc+l*8%s-O&H~L#woyk@px)D|B-{pcdtnJ zg3&eY5c=LgZ#D6tg^%*PfP1)kg#RbQ&T)tl{7mZk-EKKP_csDvk>u0KlD!$9^A0Q7 z95BHDcC(pQ(-bY_m4jYw zQo+5RV(f2MKK&+DOreiTOgSF-n`fgiMrQ<#m-U?;<)T*%L@7hwDG`rOCgq3EPVUhl zoRAsC4HWIW<61M;Zs0@^E0cvx%*pOOP-jtO5M+!LDGGd_%~JwZGYov;G>C`cph!X3 zBlP>H<1IpcLCnC=q#aOy9u5G`Gc+Y5ksx{QV@C_q#L1aC>(K5yHUS?gPtK;v4C9V1~`CE;4F%chL4ndzc7R84e}g;0z%= zmktD{@m1_X(IDJ-?11g-4xpcJvSYb?RmLA?qUdnY;c!{nNumqjY!Hordxiq1r|27_ zk}NG}H(X4;FdD_(8!>%umhDj!Lf%rB2U|U zjic($j;2l72R?!H)rvKL_(2M$P^$%J5Vq)-`?o7-ForCLQ#xOM#oZu2=SWvr8*CpT z-cH4poE%K~_`=80$^slkD+~DVLaVlb2UFxoXpP~EU5e(-eDag+q&7hGRGrs`5^|Gy z4|Nlk=#H*Y+gJNrM`&zqF6aPN(N#~eLddB@!lf|lR*?Hsvj};50$A%K!z}A~I66H= zIyHdxEihnKi-!k>ns9J;rb%Snitteb+pwYTzwA`Yf481(u^r>iwg!afTNdWAZnGC;V{uRn8zeQhUqbpM=-qTJ?*Uz+x8 zPHenk#q=Kw6IPrwacS&561V0(Xi)=;9&(iP?lcibnaQdrozOe0(_fez+P{r>w<($J zDDFmAz@vl)xy*GiI@wW8AV3g2Eib8-HdAs@BSDk_Z((Z~4Q@)XX|)2bB4Bq-dVLed zh%Etlt&0F-|5-a3t`Jdy{prM7w04S^1$$odW+EgCbno55bN>|Cxf8H8^G*upMpX8Q_%e^9<30O7qKJEZFSkD z6_ik6ug#yd#~}sGXgur;N4$bl`)u>zaR0?&b(c1(MB3)u>~E6vc`lbxwoyCWJ~;A< za?-6Ox2i`~uN)@0rBwM+JzQO#%UKsF+VY@W#@ST97@Vw?nM1}Q=2T$Vybl=P_6$b4 z=eqIu4Rbazo3QAaYX&n>_~O}Qc3j!c>*lOv)oev>X0puPw(pB1@3#1#MgD#pD(@_L zcK}W&b9aX$?-u_qXP;iq?j!NvDq;7;6&dYg#Eoe>oMoHTjJz+a_ttE7;e>qNt#Mk( zyw}RCO(But+ezbRblcx~3usflGZ@kSd2V;XGwRXyF^pIu;}Wg$GMveUZj;K)uqWCL zB_oB0?s)T~*O_velL_`mQ~*aBJ^NQ1sezMV{6Z5U;r8Bob;vC?(FOVrOmLh0?+Ne; z7`Qv2DP&ayv)egIBLfrv_fWx8pm`CrFUL*~_*O=*FyY{T3N<((vJt~m<$n(?lgVne zO*+7{&b&hMr7h_)DDJH#ZgVE(0iaQV;;1chdv(d&w^h{$hvXRbRds7u?EbL$Y;qN4 z)_j-3cWMY}#u!Lu#@^nD2?ZY-vuC5E@KW13ku|_60%BHO_dv4vKkjTLk|E#cA05R5xdiq$7!H@aejK&z-7#6aG(x#7NM z_JbaoaV?{9SvcqgU0W#`chZFidYDE+qd_M1>T*_@T6?O1I^MEX1T{{d>Ct%Y5}n6F zr_mW1o;5@rl&S$LNVZinD7-|ecP-zV3` z(9Q%__?@lv;4Pt~3hg~IPDWrV4}!ss3{%Xmig7mLEE|$Jn_REJNd$djk`S7P2yxcE z3T|Q|(>y#dPa3~8&{_m-ODqhu2Z5vTD8TW?b8VZiy&)IMGS003W&+b}YD@snJGg|Q zqO)*^M3h0d6U1hGq~&c@;3+06qli|2$xluFG3R(2!If}|ONc&ge1-p!40XXjx$C_t zwRvrS{$rGRQ>60Sy9987PwN!GQ6&9hKLJj?lWfBh+3ZG={+_VD#~YjsthveDUq@ec z*7=$zf8?5VL}CI|2IUx18?4D;Zl)c<5p+y>&!_Ip%nTp|8okpw(Jt<}3jnq``y2fG zd2Y^>{hb64!$C7X|2X~bjLj=|8Q7FNwOb@>*QQCIr|uo+k7s|IHNBv1`&jnv{1@F? zLjSQvgaQ&S5r0Cwjqo|TX^Pd5^WQuw#Q*5t>TjmbhwmH4fAWUGtJSViqv);1Z0KK2#3AR^1l4F-V zSrW~{PLvkTB%|O>*o$rzW4!i-m$JGwA3H&8aeKjO{3BXQo)@C+ommA7x4QJgJ?ab? z>nI+c+#u(C>yGB-p7IFlmH8h%iF!ErejxQX%@lI}r_ZGxHpU!J{XAKxR4>Q(!|Hzr z?=g<3{)^76ejR`K(RJL;lzoCt<<36H`m`p4!5E9!jIU!(w~3~VIpns1tn}h8sZMo2 zWuJ2skiO)&n*edwQ?HM&yBvPUmi&GO{$Jb9{rx-r{rj%;pS&x5KN0_1PsHgB>l+=6 zCv0PPJsl%P;a|{!rGvKCfu}vG0<0}&Oo@2*%wj4OokH(TFnYkHwmHlkTfL%ZqBk_*S zfGH8*;J--J;b(NxxqzQw1SgVmcW`|XwCNZA>0b5W-*%|Wq+l(KU?Zpm`P__l=!oj$ z+P7nQ+ZK@BQHaFtbE?M9Y;ap@8&4wG>){}r6oK*9a?@xMRA24vzrY|2ht=l(v;W(i z@=jo@GdLgvX*4?4J^!4<)f86*QvsSNPC1R;%N>FD4Z`T$qGK_3etc)EzUt~gPl(KW z1NY;1w(38bt;$}u-}DThUBkCH#0w#Ci9~*ylYM53#vJX(=5?sw_1J8i@DUkRz12=< zam7A{+2wOT06d34C|G)k`^rjX%?1;iXn}QCKo4PGPi#a%yA4!~Ow=opY^7h_i~b-i zO9Q^N{Rt2cr)6Uf4(m-Qx3cCiGvXWZzt&ClExg2ebcMUtVASJ4Er?rK;H@x@qsbAG zCzecc3-{E14_&9kC6-Tj(9;y5nVn7r)+LPPh{>iO@{socPH9Vujh1+Du<4#I$O(a$ zBRkd~WcgYKh5goSacH%FjG`erf{|^TdKQLlGXF$BZ`XZTZ6cw^IgA-P)IXRO7>tV_ zRCzcE+8vzrLAMN(5xx+6gO53OH6&FB;XE)IGjtqi>K+XF)0@&p&Xs8=?gESW&W1Vr2(wP7o6 zp{Gi|dcOLXudi0q@vVvL?E5PEZ(K!o;>V*FG7^end}UAmZ@Sk>k7+9gLqPw0=Z18_?JNC4(a3g&JTIMIW{{aSPTd3~o*huyB#4TB!Dy)ffZIv8Jc z`u(t7nX10dsdnct4NgSLVdwwK`YH4|p-tqNP?$*m3Ms+QkP+J06ubSQ?# z6q7FZ?gV6-o4)^MLE}{JwL+vXx86xot|@%kA{$D1zgCimnqinbP`|4Jlfb%~D+Irv z6z7Ubzve_K=yomHjLkVIJ4bmCct#%j;T%(WtWH9hq=)F|dYDu77qB`vQ(to`_pL8U zt+sgT8h!yU{c)>v_PT=ByUE_E@_YqGA(v*U6Dp4vEuG$QWqG`-`Ki?zn%jFvE6e^p zKr*Q3cwg52LHoql>7bMeN*(xp8m$h@M`|6;1(Rf<@RE1c+<3l!SgSYp_74uXo+WNQ z$a8B(4?|LsDWf?7bPI-%d)n^A$@J|0a``6aYf`@K)k(Ry=cy8TK8tR6XfP$d2oX5u zM~A;OpT8!D>DzlXwP?`6S6g2U$j9qM2k7yjmErvyQ*U#94tb{bdk%RKg)@AW2Tg>p z=GiF9=&X8~j{UHJ33=uC%6Njjr!zT)sk+i%T+y%hP&C3jZ%tsYl@7M5X=JWj0$}n=m_dpd`qY4)MBLxmJ1_Q%qI5qilz*E;1*V;pKb@s~HkI1iTHd z`G3JRN!FVBI)M>1y>&hqFD+X4ueEQ(_dK8P?||R!MoleO7Awn2lan-lPX}T6hvQe% zwy(qQDI2-`yRb{4Pg`_m-5zwV%d3FtHMC!#SiWW2np$)`kOS7J*Tst%4oX-KdU2EVFM$Cm%&9qbUoBoQK7U?Ro16HwyjaZL)5pi{#?JoR z`e6Y$`odf=r+(g4_&S$Jwd_aOfz^{hC#1a7&?hOxLFA8};gUK;7!1(=9&2+>^rZ_74lN2Jui> zD1=nY4~5eros$YbND3wt69+~`r`Zl3gpe63bYR9TZm5p>SuL+Ugog(YIQ}jUC)5Ht zFe+z=S&Jo&PkbrnoE{IOQNPcb&{|LW=4Qh^w6IJTIJBJ>7K>v~VE;*{E$5I`S@;h= zUX9VA&};yf*0GWpK&p5dlFAxo1pe%%4R( zomK#h4(gh~2H1h;%DENpzNGqn`K};t)->iz%OyY{X& zjwS!M^(i{CoI$cQ0{qBcX=R6CY;(hF5jfn7FpQ)@$d)t{&4@=Z``NdCRoyc^;+;5~ z_#QY1kh-g@-}UZpAkZ1nzJBdImyQ2PyZh=^gV~++M)AX6ttv|1Uv49_y7kRa@r)fy z@035yPNwnS*;MvN?P5~jJxycTLbqARQs}Q?AiG41rcGoZ%-Y&@HHkIkFD0r8EycsK zXvokT41&%drI3GwaDC&1^{-rwdRvm-Eg{)@=JiR^_P~FA8}CZTjI>0rO=@6#cH=-_ zRp8Qa|9^0q2PX54GMQwml5o1Oe2d;R_Pd_GPZ-SYLiD>Hy$`$Z`_Ex=ZS3Wof{?i--dWq{A{{+XtR0Vf;4BUAeYt*;xVhfBnaWi*N6!tW*_Ak&zgNKfLOdvGs|)aE+u zjH94NbMkv8MALKCh6PDqn3W7$_a3dj4bATwUO6rVfqB@E*fT&Cjs0II{iq)so)o>l zb2IOO@7rAte&lujlk7lOY2sIqy1!Jru{qG+P2ZjhA&ug(oDh8oB7F!VeF!3b2qJw5 zB7F!VeF!4`%Y#UhaL_w&SRw@y+*v^zh)l?d-cc0a%5$$TdV6drjEMyJH;W6sOyl1! z@2oD>)Ut-wiXfA36-|0Qs#X-i4R11VH8mYgGd!gT)%GAB_fLtRg%K_l5iL@9h0tNe zObunh_rQHhmx6?lrEWnov?0lN~KWaT3cFF%@3Q; zIgah7Mv~MwAz>m6(8_cCIW4O*(ib?-i~F4{h}8OX~rps{}OE;jdp9K>d_;x%dMyP_3uhH+6q&7q+kAoqt&43S%^~F@g9FIr} z1O^fe4lDjC^vnpiPM#bE5H$`fAu&&IM^xnrUXRv;j>JjeWmuE>P^BL302MENo(HxQ zQp)!|1Y7mgYt^gtR87qmb+_MdZ11QasJEH%C8gID)K8!42?CZGR8cAwm6^0ok~%f3 zMa2N;ye<~k)iZbg`1y5nXl6gIr(ZOl2*FK=s1k@GeW_(DEP{n|xl;V}DaS(5w~M55 z5=SsG5J^6Z#h2D8O_pD()~5Yw5Yjn;cGqE?{ApXzq=y>R#09(a5fwA3bTpz`Vy_2xyU6Wc3W zo69?uXY=aAGom#!oBpx-M^PP5Ew5y8B{j+X%;^>K`{lt0_tjtSzDl|F*MI-XAilTL z>aM|Nx`LYm%`A{hL1sG7e!=3-@nupn6IXVNTsEcRM*SW%?IYUxM7M4}taEeG+vPG8 z+?P^+Guh0FYfnSyGDmc{)jF&iZqgg_+9b=}Xhi`@`S=po&@vT^t ze|4?)PQe$&WMIf$R;o;5i63a-w@3r69n!$Ge_cXoW5=@jbEu(J%S{w<3hZU>DvEcR z;B78#HJ9IQ{cB_Ciuw{dco*d~?05HX*FzcVj--uY|7Mi!%0Qnfnt^j7+;$efiy6v+ z%&7mHPxM}3irM@JO7jg<8lKRvFK}77|1_B^t>acAlR#aPywdFJj%nSEC~%m z$xj+l&ubT3cAw8VH}pzRQ`D;W*~h26b-NbR3rhfethU$*fJb`CR?AD{UCD1$;O6o*lg z&ez$NiTwF#nnSgR{0v8>B8e4lpo_q*#4a+4;BrE9#J(c!fzG~s2=4|CI1<&0k{-cc z(+x&WOlVF#5`E%8efIsZ%sE5vj39@kY~xBFzYG6JOf?d)w87P~TEuGSG*N6?Xs;9t}~Qd=E$?2TEo zj)=VaF&apt=Ep^`SkSNs;uh=rFe1^Se5?k6#}4+`%zaspQ;Ca~OdX8hpz$KGMxQ-3 zgyS$641yD2VTC?&ljEDbsC*0Hgocln%*nVPORZ)!hW$unewsD^WWY|T{zxM%6CM~l zPJH!w6r2FVDBzn`y>T#MkCDd{9ClX@TQ)X7^)*@DqB%zI%SL zM|BhnRU?A7=4_!8PSx+L1}$lc^0E3cp+ME|E+GXvYB6v%TJslG(-11|X#U3w9~`tZ z3?Ty*IDxsAO7ew+s#@K|Mkeu&Cw2iV(9&GZmuB*t(fQLPYLlPt5&k|2yPmx4#JkWg zq_Jxt{o8H}81d^jeaeae>#uC1>vp}~^G z5kOk(-j^gIFe^TS4nCVFedwRx(YbDd(@M-Bw$d9;;aomlI3VC3HWs$tGvAXChj=Ux z3&|l-`1?^Szn=uErI}-4CK`8${uM#{3g`0Wg7^K8^5sYIdkA`(QAq_A&%60DA0iAD zEm>wyR1VB>?C}A38m$3`7nr~aT`B0~$x#5)G9)NMD%jh;T)6KK!}yHw%p@@h)L^RO z*yj)sX&rE0BO*NJA3tVAs1?0^lT?MmZX~HTFgk+@8u3 zJ(=*nS$f+9pW7G*xOH54J%~iH76ExdY0ncjCKk(tSGbWYNjw_}r<}%+KyVmPib@0+ z62W3-d}CBblqW3 z!ptI{!&68ET!*N0(vSQyi$a0KM|!%kELDIJg0p99a8o&&#&MqHG#AZJrD;QZ4cU## zvKk)qUlH-~QRa~*RXv*7lfNbUR@^HUTSc7-N?NYGVJcegA6x17A#Y@J_KY$${P75N>&48PZRW2W`4xF zj_68w5rdFm*&@1&kc0y-=8eZoYJzLfoTnW+plTGKflsl{Jd)$bF!%$;Te9%l>0nId_I$_xTWqFwAe(=6<{+zK8o zPm|*$BS#yxaK5;{_ICN*esgPKYrENy`zR8{^MdUqxanSWe}0Bkj+>;3Q!v_MkS3@? zrjC5>x=3(d=X{1KTi}Wi?;Aj0)-QyfX0t2<<#(#ke804^Li^yIKk~<(4q_4Hpc9*u zQL4m>#w?pq6s!q}?-JU<3N%08iDHY!xh`Y?cB$^9BghkNyKJloSm0g1J?Zs?xL6Q< z(II6j20;%?l@vUFPy-q<7t=2YaaS6xbSCk=B0WrOo!UxtX-E=#&0|%$>PJ0(jJ(z7 zq^&NGNYC~L{og#z@Fefra{QWt`Y9l-OinORIg<6V4_}`DyZL_q!_sDRd3{am2)KsE zA5QRQD-q;NH`Avk>jZ|rtZlEXEUvz3)OhFpo0|K~J>`v#i@!pD42l_n)RJ5f4*K%^ zYJkVU=bq*ZKjtsW5~RxI`%&huD(V6bzV>|T^c%S$TrUq=6Kp_H5>cuuJ;c0ej84PB ze<$Y;vVHz(;mS@!HL4Ip3Znk$_1(6iv@F&{aLG6p0}UHvkR4&PS;m}syT0C_-@1mN zkJsa;O~6nM{+pZ=GpYL7D!Bsu7jQ0ZHlY>Cs}}FpK67W)_Akq8>T`7D<_e~;T3Y*{ zRu`66_zy(c+(wg>=K?928_oHK^NK$_Z#YjCs|#x@O_G*r#77-Sgv=5mgc72nm4&r; z{AYXN-I7{a++SE(!N0}zm6e4pPFZ9(41HMJUR~N;Uc|@MrDl@~H1TmKgFEURFE~R6CMrFkI4LNLH=x z;g`hIYN_C;))&>vJyJUcXs0z(t+tBSTYDo25MO9X?)US1pEqVl-#|}X07Zu+EQl#!(1rb##!$lGa9vDs5Q{`da#Z3`+ zv^&luavH$EwiZ~J?)o7d_AoVsL>Cv0IH@+hQ4hOMOi2SjhK$*8ymp5~x!zI#)91l( z6okK$+BG>oIX(N$(V#0!TU$ir8qUH`izG(Ad%yh8pI27b);IoVv$?hX;g_9%{W}5G zSPPj-3K={awA=6XW2%34ZvNTx7cYPKuYVXMY~?a2Rx&80kTD_Cc4FIrK6)_58H>!N z`52k~=F-N(=EBzcrY6zfUEwj!lQ6+I^hJ0wJ@FMWOJV?(XJ;3!5T&hDDM06F7<7r^ zsBAJeBO1`iSFK01>TbSn171(SmC821;nW?Q?o8#@gzQ{8^h|Bx&B?nK+QcZ>pKEAg zEt5KbW$LpAkxy*Tf>mBURdYpqA3;)1MEMj>TiC3m`Mh{MF9ScLvAqloBjY(U^S6Ck z>nBHSQ1Zs$;VV$iwY3~~qF~5ReB-@=JAhMh$agSc9Ah7kw2Pl+6vT3IB@X+}CI;}` zR*Uw!Dq;wRXOTZRY*21u2}Uxc=lx~Urwa6^uJ}`SHVlhn;}r=f%p;jWF|dWh422xi z<`OJL$j648pNS6n*g#ReZCd}s`F$$!FcZpKKE_v8zZFfv)j$yAG z1`*4#M5^Yi}HpuSUrMt;pB&BGIS(j`$%96xIY~Zm{Hu zmJYDuXP=3;hTbe|Q|>#g?z~mjDtGHsTly$2_gaeAwHHku)ue8=qhK(JrM)-2xAi+P z-S+5~?x-wCTMLl2={Q9*IQL$FplwqS)k!qIBKeOkRb4B1JRhw*g1B=8@sU2ifWlAg zSRb!9jiZ!msYri?WTvZJBg*4pG3Q&QUrweP^W2Qe3XZHuK&Zxjnwoc+v<%l`YM6jG z60y{zU>Qv#pTc`J$_%y)B6}e=rsqb(=yEn_lH+%%Ry!vzl3$`;G2~&NNYo=kqWFgi z82?GB7gL=@QQ@_kFGCITgwqZoyOLAtP!=CCwq&|E5KGyIA~}HHJ{)+R^cn=qvQHdl zD=|bnBojKYFZpA{AutxU%?YfOYx{?|iPHCAm8OKc7#4lvNL`JAeW(&F;R#QI*-%%d zA+^bnO@hvv!`4lY_DX`+t~8fC3Cu?%IfJ@`ED;&K5CUP8I!c@hHG>}&&Rz1$M%uz{ z;=YoDBvI&h`lJ%^<|P2`FX5H9hG#atPoCOT?>#~bo|~R3Vp+Q3NLz5eNG(y;7#{OL z3^CFQdyr%RXi$C{KvP)peYNDO)y}GSL~R6-0T|*)@W3y@)hb2f=4?2)yvEGGEzs+Q zwPrl9&2iC~{@i@_1*B@SS4 zm0Qh>4x?Q{k9BZRUmRCPeI9rbzX=Y11Q1|wax^S*JB>DLgQ!!_Tb;bN^v{*&%g+wV zl3f`o4UowdaiY{Il`A6>XeC&*A^#T}PR@~!TMg%tBa$OvOG+iMgjhoxPz_hqw0jz7 ztK-;^Ld(Ct{UcR<3I+YorB!1-vU{Ef;+363?HG(qu%%8kNG|hkEkJkJ^TKbVr_tu#No}p?$41CGzX)7Qqeo1 zs)QNcGs)tCb8`ABDjCT;4x_;_7+DjVsW1}=as7;90*9X=OjbhLXV=ul5c^@HX4PiW z(iOyO%Gj+aC$9%J&-PirYagMc?LG8D@J2p0N%IAdrk*^!l`Cexol6q?EOe zJlV+FN1oK9C%YfBAwN&{pY-nC1QWHEX-9OFG~?-$Fub8MxZ+9Z=hY5-lj69rvZA5k zH9PW8w3H#%;!d9!?wO`xV_c1cDn|oQlpJ)4yn0mN6z<958?jrZf~utCa!lu6;_+Hs zT}{G^(8Hj|G80i>`2KVNrfM-QPpGmQ%5%<#lYvMaagc-B&+@56c*uj+I*mR+9m13*A()YzNWw+eutl){M^!4vG^dyw!4#?WpIzzF z3o#stD~O}^K#Ppra#WA1ZnaYF(f^OG>sAr=i(dtoBqbE8$|P0mVf_@p4!gseKdtZN z67bE*Xe2iXGPg+zBf)Z7*lTrwCy}1RUlTsKGcYdD2 z!bvHFwqP_Z2$MuW1=xZLKjw0JScK0~%MWIbf+%JQf;6THf2fR#Sz|I!<=n6K-3$1T zM!vpfPpSk?XF`K9=0mRwqsiFK`qribx2Lb*&4hWkE`hi5`AZ(d%;P0fb?7_4uBk=m zX6w<3_pOOJ%{BFKUbYrax^EqNy@}>`-Sv&F<@L4Zp4!ER*&|wk zZB;oc6Ez}nJJdoMUMo&+Ivj*L9*X5kg8oppXjcMl5=5_@D$+#}_F*R)J4q5I?vACoTfU<$k?$)-JRyW`$+%t9q z`^Oq@ed~oah(hduC6`;glo8c(h5uvk-y739l7w-1|AkM{Rva5-kU)|zkw%%p60+Io z_JABKPm+f@f+LAB;xHVrtj+lS>~G!rb}oPvC$sxoGZ_o|Qe9nLU0q#WUG2`JVzJGu z2py2Z;QR%?R09!pf4dsZ)}qPP_iHPQ&gvzbc|_<7T=GlNh*@7UfV3?dp8|Gps8!T_ zp^FX%>>E9s<=`+5g z^A%P9?z@c&{<}&4ZqdKb>E9Rh?<@NEyNcSV)oS!_y?8KzEqo`soZg~^_yFy~MCl5~ zBw6F7$M3auo5F{iU~%WVY*EPrSHwFL^mNkTh8`^$hZ72H$f^>WhbpiSL}lp$EwdDb z0Aml_;f0NrB70WuiW6tCbqs@cc(}XrSiUVBTYGP&Mb{CC!w^T>9bOKsoe9sbtVbg0 zSLDPNeZ&Z5`u?2g9cT%;bIZ|<2M~EILdZs+*#bF*VI}Pv9E1ML4x4;E=^L~H*4W<5 zcG)^_53AMHUGaNIcP3(^-M`a*ZROMBI-RqAvaa3aDy548Q>BWs11cL(Y~lENa5<%; zD>}ByBf(XsK|vQJ~zCE1=k#O(0kjcSPuuifdotW z#`Ww}nMkP=b!jKz*(*&jS-H0};4S1^Q62SmUnc6B=CJv~0|=$%=)WA9YQNjB=9~T^ zfB6qnn@8-f*$DNctI^=UK*)bdp8EZO7qFG$zT@e+ zQL>R-;ncsFDrpKA4Xz>wLOd3Hq;0O=7Z)zW;(P2tr}Ow!lgndO`uEDn=xPb!u$MAp{J^5>SnUWQ&m?Rs=le}&+%-+LBAB^ ziXN5~!ZtnN5rGtbe49Mi&yG&_TkYL-NdC;Y-i&wuUYgwm@ds6V`4Ta^`GDlW)uj4Q zATd{2@5SfzS@DnZodbHZ1^~PjGIv zDrVhX7p{QBDrrLM`q)ow~f5BmRt37 zRR#ADJfA#JYdQwNHJu~#r4*jNd}KCKiOU9hBX{lDWPb7F;EHpYlDr*u5sFJUos!d@ zGsZm;g-JH|!5qhWZg#C`?sQcCw*I%jt?#IK{cjcht+F#!(_bF1{|)~_3V(qF+VtX$ zC9~xvSFac=Rs_o55D)@~iYaSC!ms@&^$_`LE- z`^+h7(oAXRDk+q6ewh*`GnGy;LAq0YPqB-ZS1Om4Vd`BBMtDiG@|eGv^w?y?iJal! z0ukd(`@`h-gK5B-^3B4$i|IxbgEc>FJ_WWwHVvhWmtZl7dY~xUV%~2TPlKbIF2Q#= z&;Bs^(Xj6o@qRl{E+Y+szL^{}iBblCv6P+-hW#$xn?Q2gU#0{a&P@UP!{oCXVoJC_ zO&Pqu26_0$r19x8r1BR({aB|T`{`#o-E!w)>ovm0KPGJt;qFr>CZld^LHff=#>BhW=`?Ja0D72}}B7(obIhC#Ull7Z%T%u1pCA>Zh5~V#(^B zwol%)8%Iz!k&-Ie*=x5>&zypskSe#|IBPhi@TVz*W=&B#p@{R#r4|#)(gB4Ck^%p^ zW2NuM@sR0XrbOeQBLgbmY|amdCvUnyyLO`sRj`Dg;*0^Nw2q0n^!G&W{_8F_uM6-` zQ|6%YL-U75S1@sYnG!#=Uq9d2Vi4xL&E0?fT=Mvv&1vi(bqzZ@zx)!?viWXukDF(b zC*Le>^%X;;tp3iqtY>I_LkIkxW1IO#b?|zYzFBKL%woP=egRv7YD^o>@gVGlvG(eU z$!^UqVfenKIWaUYZ#SU#VsP0HAu0*`=r#ok@JZ)jy-xb^+tcd1bGfK_6MX6dQ1Zu& zceh?~DyCdcf~(y+v~tXFF=mmRw4iP(^)Es$bU;3UbZCiqW|Ry^eY#NTwFos2u@0Xa zlSj`y7`U|-RJSdry_ql{9+!qJ~h}sBY_0p0U6IG7?9a| zO#D?R+Vl4=f4jfxFSY7-zpnmm{n5o!x>JpAogT%@&PY`sI}?L0b;}7_;u$&3kye8*xO_^! zCDlun4_Ak&k&*OkyDiA6)Kb8NyZqVxcX9i+N$B?dcUux?_hV*an}`$H)`VYBDK)YG zZh4vvBFoUppU^NGMTz#JzHv6I-Y%)Qq$ym#XhhM&=$gF?CV9`E?N6Ck?ez`Rm1s7_ zVn1(#7U=w4TU-0}*OiJksPHK*9meV!YlG2>y;ft9LL(=P=<2royNy?Dz7by>Is>PN z-_0Q|U;UUO2_^zX@fb1H4Gtzr!^%n^QnR%5E{ z_e@s+VydL`dvr6#qe~qHrlS5fjmBN`i-PHh4)!-*RA(33_%Pu3Qy3{|FxmZkNxQ^a z49m&Ok@j|`(+$33xweYeB7Z5budkXrlJ=&irbR|Yytav@mn*ppKy)4T3oUi$(;br#^IX66=QuDzqbww2IMgzI*z>bWLtT7Ie)JMFkQ}q2e zkptX3ok+Td);9E7-M2S>jLKmv=sbO?CtmRi_>9I-=JT1{ExI?GdG+RTS*qX?;2zFn z0_T4uip%ZLy1iO~Rw`G}sC^ySK{y3geA;lq)&bYBn`>pn`8ZP5 zswDH-Ah7*=)>sLGxN6ZIiZ!F>uqVx$r}S&x$ZdSZQ~Nb)UUf(3PvkQ_k{}&=JT}WR z@FcCIa=rIo>aW}8rZ0|+ds#Et3!#cn_MKuHA5A{%h|<;?NsN`*G$Oawn1essZ+ zGTG-Hs2&M{tSkD=oK^X^MAtsAC1L2H&uLmnk?v7wj(D4ZnT zx}!%Y$CD5}#OX1}7#Pb$VAhXBx~{IJ!CJT`F?I>kEY^OXLkxM?2)1b7>wgQ`NFOPhfU+I;?`3Q)NpD zM<$m{9OeC!PBot1Q4r^tE~sxiRrCd@mB*JW_t8M;rk|w~Y@aWey!oH5wD^+0e3%rM zh63JlVT(EUy0BaRYRPnZZHCiL7x+$tLk||qy7e5GooF`cg*iY?RTp?1`Vg!toCNaU zdRXWpy7Wn3Mn?_!@61qH=k!Z@Y_icbkWjG2$7JTiZ_C+uwx`8;CO)*^Cj`&mDoIgf zPb9@$U{_3goMhHm&bGhpd7Wc$@Rv>xO0t-r=AR#$Li(2n$uHujcsTjR+>{hvX^5G{ zwIPK{$q&w4aitzgMoA+sptX|WsUUOO9+(Gy6#sq!@$wUB23M4}J3hfgPpgNei|B(|Zv0~#m_k!Ut zPWpNzUsj;73g{3O-HuGOeGU>j*72~s1}K6*dNEFCBUqa;h&`SropdB3U@#cQw8*&8 z8@2B9AskO(GenOi_%R{lD0#0dlBFw<8{za&0Qta8cMxL$Az>!A(9jAA+LFqDiVx-!p?Y>X#>_XJ9oCSe)7fM*I6 zNSg^I#}{dR>OGA`M4@yqg5C#9PU`qA?iBRt2ZbCLY=e(LO6oj0__*=8Mp2iy@5J%$ zvnT<17{{|79>kEkAvY*Z$0133nEN~oV%o2*505hLVB$LUF2)Oe6>?yF@}y#;5+m2s z<4ih0Fh-Z6KqB}YPTh?&$(k$m+Ojsigs!6i4`O?%A2nlqs*)VE*w@&io4?G^_2jSq zfB%#G|Kvi~I;?o>cvI|V3wF^I(SIGE{sjuu{^NIkYV}&}#n#q;)M|j^i#qjF|P6T(Bh?Ad}2ITvS z-lLjz9z`^uNAzxJ>1QaD$mHGl(?kZ0=Dk}JAJp6iZGNIb$#_Vc;?0`drp-^ZDH#uG zlO1Don>5+UCOP9FEgJvY+(x|;PqQ-a)2`#Mi}3J$n5FAJxLTHXFM^3HpWuH>17as% zBE#d~oQ{0P$+t*ISuk-vocLaVtYdK&EXiFSoVX$jEQ1pI7vH0E#$`DHC!F2`72l~j z0SPt^_n?vM_nZLqF__$o*!hHB9*lL9P9P&0%R};ft_c{0;k-8-@y$-5a~UlUgWb3j zARuuG2>Z>0)-ed`c4MyzOaEE3-8f7vGYeq6?Vh|lJAIe2IIXX$eSYjx-sibQ8{)_W z7KfeG7`C4j#ea3Z_zgdceV?`$;jb5_dw0QE@lw5r;A?z$a}f-=j;*;j*YlcB#I1r@U1@)vuu6 zpU|t3hw55y7m6+wh%RQOpD=d$? zzGw444fY?22H!BEooT>tc76)OPt&FA^GzhDK0kYvSHE7%z}Ua1F3A4 zfinD=wpLN^Lpa567!9<`Kk3!>0({ssAa{m#SM=>6RUI;fmAqzOZOv~M8>;2lYx)^V=nuD@7-ww|GUN*T%wce*{GLqXfhzJZu_?JV-tj8^C)A>QOD!7yJ*J2ic!b?%BooUPHAo}XC>nxK(HCu&(XKs!r5bob#*YI#Z6jTdG!_(t8v_EsXZkz zkoW}7q1JL()Duh~6-qzPMuT|TU%SS8JRk|-%MFao!NP!zQOlyjjJF6Cf%rdIE^!~0 z9XY+*X}vjavW)B^P0{kBZU(dj}9=*U@+wOA;L+l zO27OaCeKrRcJi0Mqj%xcvfKS-Q2NfN!D(y1n>*UyEg->o(C^M6_jjq@bA{w+OQ&GC z{q^6Bd7p~9J)Ph3Mm@P1lMp`nHBvkKL`a|fnw!a*CeTlQos=2Rjs25fEoH}Z;sNE? zN|{?tl%V`NFH?0mdQg6i)c)6rD3o98yUbd1`?Hy{{)+J|zlNh)JMk<^KkF!}`8Bf+ zPRy=ebYxJ+qKkjzpBiNV(Ls?6h^YmVcEvINpP%|S>wl1sVXd}Rd-?o%j{m2)O}>1w zxw*Abdr>DB%FT_J8~^eA55mX${4e+a^u~YhI*KqNf6)J;ZOr%ot!>n{HvXgbVsq+M2Kr^X)! z<3=A}r_;d3!6@vn#@Es9o5^6jUEo_0k5)ep!dvtTSi6oUga6teaA4Q%!bZ)@3^5KX zra}`Y^_E-R@)C8?=WZf(@yBpt&@nl9yMi+ab0=p)#K4;)sY(RSBNlWVP+uc=!6C&Z zkGBioL?1!L#@MmH6bpZOJss^wx1;a33!QLUDyuzwGU5GThylIf=Px5E^ltopX`{Sd zX!LsF7zzq#F{JE8!`Tf2uS+^8wY~5_rwTF`(Wi_t=pku`)aAEG?d^i@k(cL@L(-um zQ#&|yq`2f0}Qfv9SlaV>6gizM&q0uWIvtN#t}0)6COV|3wV@>k&U{O$EY(P zlaY;~WM*I}IT;vAP9}!B$MZP=1{W(*Sr~MBcn*hHW3x4Fy z66)*ckNkM+KkJrXTn&7H{0Cu=3w+O`hd4ikt9&< z@i{TeWICALY%7O(Dj!vSZ9{#xxnBEjedCp?Z*9Y-e50nW2E%?BsOG1!dQ1-kyr#Rn zA31_(MZs!(tv=~y(dG5iG{lRbd-9Mmy{v(eK)x}^4d`CAeOk=Jl3)yC3e-aPd@sUF zd?O~9P6LX($`5=PV0_z|UcATK-@%;<6fB+n=!U`JMP+Irw3y+&TfE5rjd|-EN)GT9 zq^rpwyu^17de?aM`|-O@v(49|rM-XS8k;r$TQ_36_(E+g+W&2!YFtu{Pwmwk2!7aHder( zRc26=TrBR5$M{_B8F^TjoZ=Pw4qw)K<8h_B|GIUIH@F{{_)EERJR1&AgGq1`!UQfS z0NJ)G`m4Z!EiS|1FDW?1!@=kSLNdry3|5azPM^zA_M1Tl)g<9K8Z|$KJp$#RV;U}J z6+DLxDMiJJ7ZudVEhrYyh5xKl(Bb~+B)URS^m=8*e3@6;T^`);^Xi-dJL+=o_XSu@ zXX9?IV!k+~zoDok>HZ!^d&B7BBAhHuaa&_q(mOSl8Uv^N;=%BMFFz`_+5?8iR(`-Z zc?i!Nuu*?-`E@J$pI57Y&CJk|8or15+%< zeuz(fVGtsGO&frk2c-jD99R@oaz3OmZ=cHZ+lYl(Xjd8X4!x#K`-EVOL4_vt$acgh z!z)Iq!*!dl+<%o8HE<1qo-Atk)Xx z@~i$i3-PHCDy($rLIICEQS{)oJiL^LPgwWY@k!{QH;H1kwzj50>Zf>n?DXI@TPWw5C96C%nphn#+yWiK$NFJ zJRSyjF$bfL$I+?(GQf`9@hNSh0%V7l>k(*%Z8cO-a}! z#k8=-;r^gUfuy~TXdGbOm}H^AUWjQ7*pTWB(~h>(@=s+HGLGsPbGUDgv8jPzNYamk zK;GICZo}0|q7NV!3I)YcGR8-f_4}^4Kn+I0Q1{^yw)vnRQYSbb=3p31Gy$lG6%~HM z16Ycqi257Q!E^-!a$25e94Z+85|NK(YWyF-oyU_NVUTs0$3jA6BY}xIS|dfT&;_v7 zuMkCnx7p{Dc?Q;FP{Wy3Xdoq5_Y8@O(^k(eYFq&u$Dn7%{G>I)Kw^?^%un9ppwYXx zF{-lwgJ4$(ROSTt;a1Xs*?yh{ong~s!K--5weSt<5=alq#YfWvHH@x+Hn+eZysxy)u4ctszI@6=K5&R!$^>L@_o3m8bI@*-8`38CdA2e&?M?I~(EKcBsov>HRx?F0q7c>0~Io2B51oK7Ch4 z*#f1)zC14ZEjCEEIAKUMo~dt+;R>xGJM2fYuV1b!lsyGsB1-bKoI z7yVK!>`f=bzx)v1ec#^3DKeQ>WxXwx*{2Qj4(i)DL91f0t_G8<8P2j21-cF{!!kzB zAH>&HP&|fxscJ#f^@fLlSX@0>P50aNY*d>%^=cA^7?yck?H#t7$7gR(Kz)=vRPs(i ztr}0adAZvDrM6YmxrpYrI;3T60ODtYA`g#=@O*9WR3)1YIeL zi}I?4UU*rneR^K2J==u;qw}XOlJ;3;hf9I%t5sYvd%z7d zSj=NwcZL^H^r3nY4g1wWbp-1=tmUiKjjdXBH31{XK~}Mb?Qn^y#%`O`GQeD|-oRoq zyQxlWJJ8Z*jsEuF|ARPs_3HU|)w%((#}BhEhra{2{tEH`cgv-(pFii5x&Avx=U<|Y z1?zvkwz27~{}liG#mkpp*Z)7`ljZ;6xlUxB1#KpLxCjdWYffRv8dM>DAFsI6NysFc zMtB9!t3ankWI7UqvYZ#$trKqSVU*;hb^$ zc+kVv8V+I}%R|PrC}bf4E#D}9*&DXUu#Q2SP299t;Jl$=x*1wTAL!}%ZB8hhpGjdn zb>FVx4m2EGjbscUfvLxiG3)1FMgRY%PpD5yh?$#sh=%X|@RdcaMJV{HOizmuh3d`G38>`8+lMH(q`{|NApO z?)iU85)cNn#XV4 zm$31@s*tSh^xpJjqKmIQetUA%TwnX7Z7~dU1v2C{rYgP0w2lR;p70Q5)Yo>E&X99``B~#F?O0bIL+8z0dW%U;jxRGA<@z@S#|^9PkTv z@>2CT_^@alpz_Z;{wx?%l!hla2((2*y{diM*s9j5H7KyNQ!LOMkNoT|X~DDcZh|;P zW3#=y^{c#M#t7I9evG?dYZx$2ox-O{|3X!VQPB5FQ1_)v@eRHO z_U~ryub+jV9QjWkxL>M`MgCtK8)^No{?-5MPx;K1|Lljolp1JmYgsuaW?z(Ks>(4? zRTVbAgUdTr6%#N>nUNyXuBzgTeJ7&>5RYF4$Dj7en*Z*VmoL%ABKzO-y6gYB$@{ z2uUCpRbj)*`YRgr@NJUWB!ueTCKmUR7tX7zedB~d@7`YADT&(w6;o}nj|?iuo{ckB z+qH_?uEUOX+FMI@ty^2uK=dJ7vP3;q;*mHv;i(z#ZYLr6LdkJ3`cBNo#)1mFScxkq zl0ORzT0*v+k)RbNs~{_&rl@oGD5EqW6;4fA$5*)cC{cRV;BT?8s&S&MXwx3+uzsB= zh@{&?zk8S-`c(1XJ&_;y@#O!PzW6Jj`SQQMRmYf5I{w3pmvsN9zVY?^=g;^obN}~M zU3@@l>l+)m_21mU72rcK3@^|EsIU3H4L*jQ89rwho5a%~j`#NQndgIHa22bkd;87T z@7_@8zTL+q=U4eDU5KTt#OEI__J)ISG~Ex!hl2|XE}5a$S21v-I3T2|XV=ZBC`CH- zJ|N_u_ix^yhlM&mDayIZPtokDwg{qSgTf}M)00l?T%vt;$hase&9nbJI>mx_AZ#$U z_B6aHVsu1_ciGvk?&HtHlQ*qnRo!nKbWR&@;EM-ww`NlaA|-JANDM%}`^yTw&PP)i z75U)9FuM9>MLjMt1l?L0svWlv;onvpfbBI-8?Rf3t+SsPr`GY_;k*6jZnb5>NqlZD zKyQgu4{h#nfHna9ihrK>CU;}#Y<1X+Zo074D=7=|NRi3I!x6aSA@paIc^w7PfH=W@d;s5%V zk|wswZX@b#5Ceb)bfXB%M&sStTTOGd3*>&==t#28rdNx1QPaY{uSGh&)82E_d&yQh z^jdlQbgu~i_uA+*_ujReUC9#olW|YrLz=+WX+2DXA;sE5NQ^(GTKfS;*5g+wi)kEM zHTKv>vRV?*o$>?=WDr3EQw0x`>NlGnt2gat^Q;Rz3zf*_3CABx%21eL-XB7>NiexH z!)sEYi~XT)2R-fg525SrM*AlK>eS-`>;xt4IyB}Kv?@|0_SPPkkq!}VYdw6L54N}P zg?zZ6dsIkh!G$7SD3U^vPXp;0G8_*2bL4RJ)8iW&fCWR$$PgZR@8jl zK|kQp)Z^qL29sw3v=|O_*o=etnjH>CvrlfdtXhPcrJL=8ZvNeHIvIRg)H*VPSKUs- z*110kpFB~elg?4_k7)9vJc9WBuG%bTb}AF4^8*-!S1+VCK?EuT5A2};%K$@yEjc+} zclNioI`sBbT!39e6sZ)52DG3 z;*SR>?H`h&rc0?_g?Djy{=@6mh}XWj2tT^)apqKZ)>WR~8UjogJaMDYwmc0@qzbv; z$}2wG^UaG8op-OHG(vt{GIO}B=*q1DRxTDrfN()qq?C*M%~N`|3UlE5`O!Q0S(YDX zCntx_Pv>RXCF0yfcO`>~L>N z5NY)4CDhShwZJcHCZHbF%#GxMv&e>pnAVw!vAbEmx zUT&mlwtJeA4{Q^P%XJA@n0!!fUZnG625$QDf%We5;MPw_Og9TY1;VdSzuXz-uGH{J zbYcr2;m}ROt5hf4yeO9%@_eGGT84nSrnynViokM}thj{LsqvpDZFx!oKhS7^qj# z1IM9z6G*M`txy4{kHX1XXroRjveThQK3-)ar1ARFI6xyE-wYd1LX4%SsA&xiJEXyi<7FLEo+9n@xieT{Xj47Z-PGJe%Sj2E0`l26W|Z8eFV-wA+thdwd2HCKz3X z?j@;5QVeL`<&amj+zMx|pHl{@(zu63Eu3i#s>#J%MnU*l8RzWs;>(PnJK&XB$ZU+jYXP*kD`9@^bUd zEiB?WS(2qz%PpELLL!KU@3jkXXt$edakTQZSR~VK`012i^W~6m-8#kut2{0x^vF~I zxMR9U;ngkab)fC5{?WBDJ=P z7~MO$_y>roHcYdU3{(Z?M~latUdAY6g1coZXLnIo=PquRE2LnMGJ)Ua%ly7s7|8%+ zjqz9}eO!`0SgTG(XHe0rBs-GoM@B`~Iy0(vk55icyV;fWQj<~5kxSWiS(|+juB7fh zw5De8WMyxgs)HUrN?Up`ZeoXeO_2x1pi&W|PdS;d4K29^!~nA(|9XD@>6`-4=kCQ| zdJ~M@Ld-)7R-JSoaplo=0MA&CZ^g*>5|Eqs&Oj^BtpQwCj%L;M)uLL3g%~|#2h7?# zuxw7%IE*kPmI)q(nUfg@UEVG`{1A9i?6wiobfL)VZ=Ci^Ws)g_Wr81_}@{&0a;!7%Vlz|s6Dj0T2Xi7uzN7&8yg+=3XE zy#a-t=|?@fv(4TU9J;TB@@=IfHCD>hNIwMKT|%koEORjdB;Ry0=&_dv@7)jwojn|& zF^F2AfHBy8+Iaz&R0z)s5DA1F{tc;H39o8U9$^X}mscGHB?;-eIG4R8jklqsAM=rd>RN zT5T#O*t~z+q$GgffdBT+(3k`?0J!*&;#mcH)jor&imJYEb()nT>{vQTfP?l4fJgE{ zjS~WbHk&3xLDDL31fU51hCQamWxv@t#5ZQKvRfENugS5Gf>__=4EyH74zmi!k-=C9 zdhlI|!HiTCmnxW2R6Xe9149Ffq6C~op*e2{amWUb=q8#tARRtQya#8}+9!h*WWuy?xUEAWOuKa9AN$-WmnuYPTsZmnslJ}$T`3KakE@@Ph_vhvrk^ayUrW$cjw18 zIvB_y_Hnbh-+g!1Ic^*^6GWU%W1K)qybPS5IzJLNZo=lP7v&_G`P4)D&U=&29!90} zOWDy-W;mcAZ49KI45F<#3`Xlfylz%qJ(6~C1wnUskr>G#xkwC?W~hP7nD07=8U2jL z)7WJSk2ktqdV=Irx9is&_16D63uj@fS;&aPo515T2hsJxCCwf?DGEn}X=^l?qBu~c z@{Z0r$7x+yh1@rx&D3}~4kQjJ*i+5{g*#3Ml%B14#G*^$3%>;}caHmhTbS=aYNx40 ziQ{*NhZ#ryG+5RP#X;0~t;|8!l<|=Eq5tqaNdk5`$pwnpS@3utOfvZtPX~L^Q2j=S zDzgzruZ7hnzQ&uTv_5r*;pl35y+Z|1MJ?bL3gg3RhzX^YRy8tZYz~tc6RJ>J6!-@uT-c}heIpMGGv9v{c|OQDYM%64%&eHDxH0{TmQF#iiK&!;oXX|tXfGj zTZJ0*CaJ??8SQ>oQ7fHy$JPC2$26AWzlut-8}}}wHQ~9e9&SNXNW~wT?bprrNvHZ; z+H<+Gq8uhnw}Jy|1pT|Cu176Z!k9&%9hJO+Evt2vnelV&SG2CpVUX1#wA430OAdQi zh}X*xn+3lab{*`n>jNI3l?K3pwH-B3e@S-^lAk>*^VLkh7lU8doCekIuG>B=XGLoH zCcNq0jI*n9Un*|BGQz1rd%tmYc?tbVvi?r7@VV#|C}ond4BaYzE*5_TrLy1fG_o&E zQy|ZxF#udZqrZb*3AShLcg-Ca{e#9~r%9*^SCBjcK6t~5W4IW3AMt{RH{o3H5YC`i zVKs1sA@-2|B5xSJp})dA@HySla-|1yHPMwL<+`{;8E0W`LViaUnh0gu>k z%$$#c>h~;vE%%gGA<@YCY-m)_)CB~1aDcrE(tU!W*MuA(gb(JMwheV)Z&dsA?I%_G zw$DT35?KBMklXJFN-!m(h$8XMDrKV|`TK&v#(aVxy zUwX)O+bj|CXynd|-@Fv~qj&TK9FhoD{z^;AYlzd1C)VvXdhL|3SXr}c zwF(8)UswgH5=c?i9B5>=`Rc6DMA*1|?+0F3r zC%JqgiyaUF`<^`1rZqsu(KngydS~!c=SQneH;$Tz&ErCSE3uu`85_@^yMBg*DE>t@ zK)(7}3jS(FSxt6aj1ct#{&OJ`l1xI??|bCbX!`Nw380)zg<(d9*hN_QC0(zqo~imy za*e}(3n@rL*};4Fl`a0TQ0u{Ap+Z3 zI^prsxV)1BsNG<^)}AVvy;hl~o?QbT`A~f&_x?iwUFnVQJiIC@T`)BYg?Kyxez;83 zT=_O$|27r@2c)f-$$=AVLbMO2ew`=8Kw8tA@GeD(jK?I(UyG;R*`Ti;i2x~~#40O# z*v5xft0+_B3d-zQNEXyh)DLmW*IvFXr(r^_4>MKoWvxb{f@tC*OD13JL-Y8gd3=Uo zvD-HvfCvdZ1%|FU0i}{Vp2;hPg3l?qkH%D=0}9N7D8uHBP|hHkZyS2J=HP8`R>)m! z>qb&Go9C_0nHj;%zN8sny5ne^x<@>r7IkO6@oii^rw{In3iCSWNC_<%Waw``Ov9UT z)-?5$Vb+ac8R($@iV@mIFNgsGHy7hU=nQrWxq{p%o4hEIz8NQsUj#zSd~_;erM63f z-)zyFApYR|1Z16GdTWV=fZj9uTcQb&EnUcnpS>z&3LYWhY&0B$H-<>X5#uP|5dAa z9cog&2=Gvm;F*Uh=wdJKQehmYgQ2Mq@RQ%eh|Ui&?CVGZ6O#JH(FyV7Ff>&ps-PW` zI8qcei=H&WAPBg_L$|3|>SIu_HC=z*N=8Bvw$0v7TYb+$n>Yg|(0gngnUu?SFD>cDwyKB@$83jE&&i zNtt-vVrWH`E_q5GW^yxwog~3zs~VT{x@HQbKw>KPEMZ`Us;o{TQx-}I99E45Jz>_* zSPmTA^1AO1D7T;~kbr^aFHh-rsphN{iLug(ac(c9XgRrHB$57y9pt6(7v>dXLypln z-N#CjArhuc)6Jj%@$A{J#@yiZ-ZJXNKgtHjEOwXK>NEL2^6ZC6iu_~V%rvq!Jsb5R z#jSkSE+Qa+GCVlgV~j@QQ~%~^Y_9Xzr}K(-JvrAGBb5@#jFo5pf@Vp8H7~+mfQ3Lm z#pvbNL5vI86?@d&g;R<^bgNe}j&?h`!>5(@lYP)oXUgqF8IcY_u2=MUVMRYae=h*C3Dhdv_MxHGlwsb9$->#Kl z5?&4BDfC27Ct>Ckzu0|#-XT^>W((tJ&Zbp5ad!1x^2Ew3=$}@q@60h3RzTOO!Dtrl z%x|H-wWx{YDJ4|NYv?>p;RG}?{i`fw^!jh|P+>_`aI_eAj))-$HPQq2*pxH8@V3j} zqG5kbzsF@hcv|K3Rb6DK$h(78F1d;sV`PH@F4eq0u$z7hSX&V>Cz!f9D^)&}$lNv* z5<0)GhFR3K)$|>Rq~@Edo~qB<9989=uvU!ul{Er|FSxk6x!b7TmWWlB$l&0>?N6wE z4H>gy70-IT5TX?vT*3nZpN?grpPiww00wdrH(DBQN{}M34ufr zob`q<-}blhG>y$qsg(htCC|F>s0*t&r(B!NC;kbSkGNe-%1L#TaMX1#gPXzd4mL%7 zV?wWf&xvjmcny9Vz|bH&gyHh?(qzJjE~ze<(d_0T1VGtfI5%mEr$i4320G8hWsWsp z13*gV190Ssd%&nEOv?dw?GPXCNRKwtZYP!Q(+Dl>%*vdcF7FY;6z9~8((dVb!Adcf zJ}$~ALOxBiTz+f`{1#gyI%*CLOj4yX@(yLQ!sjp@C;@JvG*FbNn&U&-CcO(oZgP@L+q@VQ z7|F_?RT;Ft#o3S2b=UZO818X2aIJ7Bij>w^i$&H6&sCtC_>pK7M7 z38J|=WBQmiMKC;9N|DPcpCA?;1Kp2Q&V2u}6ePvPVw|9!--iV4xYtNI`ps*Ep_f@Q zxG;!5BOR@ zbheOkn@-Hw%qcsk;p{n)Iqkhx{cTce{B7Y>gDDnDGmo~HIw~n~>@K&OwJg<4CZKv7e!?bQpdNhZqK}{v5c1BWK`sdW`WAQLs4*v<~}c zB_FL~83eX9a=>7sV@iTnz8p<;2b<_epo=ja3Q#Q2WkJ)Gjq&7tW>?**!ngn%K?!2t z3NgOb@!&^ACFw*~SUodMf>Y7)h9ZS&XBqMqylIrOE|!&%1(}m*S9u8dg(TNebWP8< z$t~6$KPC{dO5y1lMZ=cMf|IB}>&dh8F-lsz1d08NRrmZ&IK?+nNdgZ>3WI~5 zub;!8)(Ak7<>^FU_o^U<905iyhy@ozx&(&)X&h~}7eyZiVXSX=o{OnxddHE&lNaH1N>~6IbOr7z#K*0e zW+j+(gQ*HX!SWH8*Yq_oeD_A*{&6o7`InS19xQr}WI=i010N;j5 zHluJAVbB+%BX1Ij0~m_8r`31o75MWsRwyHY?Z;scSRzoDGg$SixRMW`F}w?owHESLrtgCWQc!t-V(oxw*xVTe!+(fK>yJ>}<0 z8K7oYx<{St2wt%E=#Hxbqca`cT;Qc?eDpLL>i0x%2jK+9{w5|!g&UY9EgpY}dQNBcaKaQ3=##-gP!PVGQ@5zMHt2PsISi$!8jgoR_G5j0 zf&FMgXm)(xIzHPw#hl~4HZ$aVjDs+`g8%SJv44%4Z`+O%7o?rrq$Y7Xz*Doto$16K z+l(us-=yy@kMq*IAA?Cw-Y73!*YWkiPB^^e36!B#n<=!!P6Q7)@xxLLC@F;OPX_cT zC|%$O!G^@f3%%<{r`2|&BWI4YQ6CCTIjlseA@L1y)jClifrg@*-9)Hu@Qr?f4Qu%g zJ@+~I0L#g1Ie3gNH5^nvE3AS}UrkWTzk&ZVjE)e^S z3uqJghRbZcCi&|{SDXyS7r?V4?SQ6JN8Q0CD*lT9>|{zH_>#EiAwtX4!2ONhAJKWo zV2mSW=2Z!Q!`$FgpA~xAa4?4b+)1~+{~jh}O_j^!ZE4nd$KMC^aES=TN~(Rdh7?%b zfyju1KF}ZZc-af+4IKUODnHaMiu6TzMZsJ2{*VZ>Hn`}D{iNg&4Q6;<;LG8VSK0_i zsA2_e>lCC$_f7Mxb^3b87&YB{lNw5dI}0{39m}< zyESEeFSKBf&odOL7UDQUH;XOXAl@pqja#mQPiY5wQWn9zBSL$@wINYXQQt(;~G1TYyOZv5X z*^I@owlDw+-(9ro+m~K^_@W!=H9v3EwqE_}3tdtjV0?R8K@evUl%gZ6>lF$^_uiZ; z6nu%Rd>fMiJ@H9#g=R*qQlV0X(%UYg$imo%No@RB~lL=%) zRy&h#$(nA=ZFjnz!MceCmMfWdVy&1r{SX2lnqT5sgzhR(Nq5nEA)%ml3{F_%FCKB8 zxuisCz(7kr@yjI_!n2g%A`MnOW0No9g^J`vW;mTBtM5%EFT1S%Du&|BTGhN-+dx)5 zA_WCoe}@uSaXlNy9aXK;qZa6Fa5;JQOb<;#=@l>;%SKDOsd!P5r3Lrm?%s-(W8AFw zMj;7Zv=C#y?R*%F$2c)?o2bMDEaVlVZ4%_?lvBFnM6OWAKBdUgC_$gnS~UpK4i;Mn z^Xu@AEQ2`rh6A7`?P7SiI4ZSNGfw5owE~ke8w_vJ>WMlnj4Vfq1H|1%99Vbg7^vSY zBvwO*LVUSfm%l(OEbvr6%aL73$lhu++&|ZTB?q>Rm$(U}lscu4;uPbopgG4FhU$;V4w`2-Z+R9oT7!*fxJgzw@PeOmr3$P?CJvR%b3;$*q5-b z3#f-0*tO8$adM66m~xF94FPs>$LAhNd%Bi3Q1%gD9H9j$mSx0UqyS#^`)gVUF#a7{ zw`AlT?ZRaOP?$RjEoEil@|@eA}qr4{?fhN-+3&3zu?Q_LnVj^w9F_ zd-n?Ioc)N=S~AeZgKdK`teIIo@=qT>yJE}4b93Yt$uioYm~3a)qGd_U?#IXM#lk_? zohUkqz!XMbSBbDWeB9eZLzH{|+mEK`-6qa?MR(!w8+M#vg{KG>-`$w>t|#J7`*i!M z!*f)INdN4av|WHExfWKU#0p-{*MkPx&V7iqa}!ptDh?|!#7t(8_t(Jij%%|M;yNsU|BZhVL*-Bb7UE zY+O7bzus>+w66vO6N)<5_lti(-h0q?MPO7QAfUI|^A zI-8K!R=-Qn2iwhuP6#>zM}+ZwTM&o+-A3X<+`M_?^}}0>nc7bbx%E0cw;uvZwgtv_ zUn48ok35nYlXpIKfbr=6pX3Iv-dz~vR#D4s;r#&)n<`#6=07>VfU39W3tnv>(RzNiD^Bp0FZLcF>9dTva*!s1iE`r{N z+1N|cS6}#dTBO_G2+jQ+jy_sXQaveP_5IL+**uHA<%0Ir85fIzF9D1Tbrq7DqmQZt zs@Lk3{+>8RvJq*_#2q-_Z-T2qZ;xD~oK$_2BC#-KjgAebMEK6RMyGGClP-Z2V%43n z=3%OSk4L4DFqoiDvGVrhs7dR+B^A^;M9JH1w@=!lq980+K_UIb3}{7BzGJz;-#@cr zBz3E*{wvP2r|VDA+M}<1IWSh%SM0iZ+&;98B@2!xgO9L@SzogrW>nQ`YFV{XrNzGI zP#;Rb^!h-vOB5CZL3ht1lv}}VtX@$Y@UMxsq8q@%Xe-oa3Iod}p4)(DHY4B^l$JjyyO3(l08%qNVyBveksUU7gd9%Zk^ym972 z1m#N)x7Yr11MXBw4S79d$P>evAkQB%p#H5(q8sfx<=Q2_JRmgnqh2`7pD~Kgc}fCs zDwM_pTk!4_Iak4G6RLf?>pSip$3**M9SE1~F@E$H(2(f6Zc$Dg7;ZY4bgE~Qcq(?| zfZgZXTZ-ds#S%+}d<8$?6)Y^nFP)I%2)$BbdHc68mTibKV2Y5E(Tl0KO z;VgO3{VMiXjYawU6FFhO!``F+}M( zyBmjVXwc@ci@>+68**9vC#jAB6>azzcig<~1=qJrl?CN)Gt#hF{gp3#=hikLYncgh zXy+f@OSsi%9CT3Os}3|^_Zpo6&SHm#4rR4gqr*TXFQ21)0F0OinT`H|enDuK)epY@ z5KdrQ5XGt&^sYnVUpl8j$+N2Pg;nVd<&&p3zoF{Hc`z>L1!l;?e6HHE*HRX6R`N!F zSzmq0>aDD(|6gIQygpi0HX-+6N%F$#U80)I+m=zp*(Mkt@>I1>2Z0z2&%M6S2HSKb zy_YXvmbDySU+ug*rN@WV^A|OJ0wxYkEVO7HZ-+sjiGZ!!1@@79XN=05%SP_<^xoVQ z@vetBR$ohCh9WnV3dv9=CRa#?e{_5$M2(je_u}x54ZtLK@&*)2M*<^VT$xZp>0ZA z!2}0w6Ne&U;50YlVQm}GofLvvQCAV)2$?=|TF8ngAzaLjn~rDfqtJXcXO~66kg)2? zxkTeX`)Q@3`=Bw;v>SVVQHR3)Yra%H8po6E?Mb?e-0P+MD};^l;{klQl+|m@cjbKto<+05D-+vbX*k zzEfoGraz;6_IBUxVa9IXv7+Vg08?8(7wEhlz9!C`{g6KviLKwfJ)gD_=59i2_f^7| z)mDCors60nUr0&$oZNSP)kFSA=pp~@)Q&H&OxP7Odp-VK{ObSrzsCR1d;fW@_Yv=% zM3eA~zA-%i{b%@Wy!emWi_NX)wHF&NpVJe{&o^FvegFB-_~1Q#Tz`uC%i2Zo;p@}v z|7$+p{EtI=&-qI~0Y88Kzj(P-gYPe1ymn%u@;pMd}R1pL=0;J-cr|Mdy@FaHF*k-`g}bYHmw z(K*d{<$XA~NCYeZ#XcDNX;dW3-j-UgK1zk@rM;d^IR1 zA~*DcvBZB#0Ho&Iub&^DylEXfl}y`~P|-~nNSYvMIQ_>BMR~9R;vr$3hY5t_7-b{v z>H87#`)T7%T=ehwzBz6jwwq_~+Q%@Z&&(TVh(QuNjki8P} zm#?ReFk9mPG|&F?=(PCFjMAVKV2>9zofPh)lYkddC`C}QwF;)T&Eo2%e^lafL4Pm1 z1q58dfOUr31V92Zb$;r2!`$tHD42cfcFTB|>JYzEOfTGn>wppz$BXOIEA`T`p|R;0ifR-5;3^=60>F>@Lv*p#fF+@eX4BH!%0anMC_(Y?W<0%v&X=B) z-j>l2Leau2>K8h1DJV(390phMZY`BAPLqO+3Vf>kI{iol2_$gx)!y*L&y!T7;Iuyi~%!WMiV~Qz~`v)(sRW zXH|F5FZnevv0P3LYU7{-(@(!I57o!P6?$TRnD)8{5$JZ)#&CER!4@KRLlUFsEtJH; zVY|19 zM5j!q1uT^n7171FkI@i-3_~6M=p#^tvDN|WpK$7qsm0DCsLqyPZ!o19X~I4LMA&||udE|+^zaotN>O6jD>xesqhz^^5idI~ z&dewzFie_RB((4*Y51nyY@T&Ng0#Dxvj*sq&f3r)UiKuI4;OBq9qxCJPu?5!bb_jz z1<~i&y-xd0_jQ8=l((LZgNXzpk_yb!^hm-ftTX)P3XcEPIhe=PQ!EH zgu$pC#?frj3*$r?PIVH+XImVJnxl{DJU&fNr^EQfVPkTYY=itvvmxno_;gqG#VRKU zXELs)S9sIkNtYGsY7))H1v~>z7NCm2GbY_ct7yWeW*?Z-hZK)*`vfQ+gOZ;CC?0D- z%!z*WG3@6B!1&e&AlLgQcjKueZFNPMJhM?RF34XH7$8n8XIF}8Zmx(|B>c_bTB_mj zBK%HpC!{1fk}6p)tl0PWECR@F)N}@iK{|h{n74ajgfTUgFNRU@yD$glYi{5sH3x7_ z8oLSw2Gn2mh*r|$ScP3}n(!z~9d{hRHcdr!$aj`+MEy@sE1t#Fd3M z7dBd@tX!|7Xs9|EI%>KSj9n|lfz=N>L{Ma}w_Rt0OES%h^(#T$MHxED`@+z%LF3jXYt=q+e zqq6~p4_(}5W4N$Q4KJ@f*x3fXK{Sh*%8Q!44F=N&b|c+v!L*rxX_|I7U0%#kFX$*f z+w3R&*xs`1@Q1;0IKC>4uO?$sGRl-vs!~dslajnddm2KUF+#HRE&Ahu`-U_sRtkd; zzBy~QkBn67GVgY&n5!A#jT$G+j!rN>9hd@&N2{Ox&e|6HH|TexxO;@4bk9F!)^CK< zq%o=V?qu^6@ZIL8CiJN?8X?%f`~x{gQ}>eB&n^@oF&yHKj65tFY{m{a<6`6$iP;PR$S>|zbyicwLp86gG zp76Odxu|%&ZHf^Nv}S0pt2N(654}_-VNBsMtq*{+7?JB+y9qk!kD!+Bw>qbXjh`y? z&MHr7wp6^ws3*`3jI@nzdLeP2=;N{b`Wy4&g#-e>#Yll6w$nq06*N&HI68}-iTRs= zQdD0GvW=xnFdg`g06G6dYP)&VIBvXYS`<09F93rU6*nKKi3F!&n>Gg3por>d#?vIf z4f|JNe@&S_vHcz)CFwv@xpl(5jp_IRlz$FzF3}FP)el)VmY6CbTl47YRCEnTi}@&+ zh7w_zjg#jF>TRf>zQYj89AuJ>j9N>! zS3!$uHye9ziSE$LBN}3vGc=KN-;QOqg(N%j`;OatyvVA%&-x1*OS_Zlh;^7QQgcU% zlpw;s!F2S3Je@>6x6&AY>sNAlxdH_nG-oOTQ%S5qW^IeF22}3-VAPLpLFz}*w0o;V z+%%@q4WK=V#(H#+hJ}I*j9zP9XC$8}_U4e|#K`g!-xu_`w&edzmG;VJl!PK@gXu6V z_04-PI&ewN3}R6{U=E|8FY$EDB@d%6fLYowb9IK!k&){MbOzt#2CHZi0QFi&pjxRdr4$(=oWQ$gerNEgssfs#OPO*^g zK*{5~a(@`#-J~E?)QTy#l4{8TXBzs=Ziq@N-^SvYs7at%Xc+QdJ<4W_bD#rPjytcz7GdyX zSavWfF`b7}Oo3S836l;>1x=BgR_Y*0vz;v48V1?A%uweflc>OfT1`;9jH~$*5`#|| zFnpmhn9RFl*T>t1CXCzd%qR+!aq6`?iG5JB;pkVY|?jYfLimt(bz_;k+RQ3!Y@46R_M6 zOJnI5)g*Xi?Kq^XmW(pNFPd|Y(*_=v-O?tjz6Hnc+tP7CXWXiY4;9~4Rs}~GvV9;o zXJ^G_mb21-5B;l=FLAKDoj0v+r`hSWPL8{$?GxDBo&BWN*48xZz%)jG?Gq61+OX+d z$2Chhlxf3PUfEd%66L7V1AZNmj#wt-Xy>D=8DDeHzq_>ZK8VfpI#=?7H9gyWOD(wG z-l#DkiX37LwFqv1C9`iJ-Ona7dySi@i4brtibkQw-GaU1_Oya($>NX$ z0Xh8cm|K?IKC|8r<#!-mf-S@q=>d8&|$?N7%I0v#e={dS<{zgU45dyR&tHcR}lP{4u zu!ugqpzrSSgHa|Je{LNEy<+@U<}EL)qPCnvKW@PQWD#%F`Gjg;KzyONLDxJL$%Ubr zPm}&dc1iB5iwTyqSEpDF)tNNj+x|G(TC!pRr!+==TG|CXUe?4rDj;}mt2%}H$0eBW z$Wmla43-+Q`wmHr4Ui{l=-@2IVhHojusX9e3MJHcEHwip1Mq#z!v`T*7l@a~m z=ASTVh{nwCosHdpyllKF7t9g@xk6?}H}H>+llauQ-1LB}Dbjq>fvF z`O4bKFzbi#?ji~%edVcz38pIZB&aB?aTN8#29i&@j~_o>?ad~5cu2bqRNV-N#GWxj zqhG?Bo;6S(bQeImSa#5U=a`u*x*iE*>|)rbD}VWn>hyRX``S*E8XbqTe$*xfA~B4Q zgim;o4SmnwjjmEd54tZ5kdack*W{U8>2AQpP8@PSd}?bz&X{EoO_r$N*+F~WVum@U z3(lbX(>?Nr2~3`S`jYbO)XS|}?e%OBO-{KoP8>PzKCDb~pl&%U2=!?Ip010g7+g*% zKDW_z(RDwo&Bvd&N>sr4H> z5J1yfW4)3iCs^s7)ETGF3$7s673)GGUcCISFg@j^RzCFc`bBiNV$^8o0b|)Xke@1< z2)lHm#AbGz)#JcC{0BF^G;&ySSN#A5glqTqFyC5`pKt~Dh!884on4M&v()dRAV6t~ zua*${CV&^CdBdj@3{N*;_E3VF;NBGwC5ukM;Nn?^xZWIvHAhKU6LjT*h4~Iz>lBDVgDmD2!8b`3pTa zHU6b1@#$sA#bf1_iqG0o=!uu;oUs{h|MGYx=MJEjOw!mT z)62PY%o06=9Z1j7u{C@;_zbddrK%OEMxOekZ&rxJ_*=0(pHGVOIVCN22>BF6^a+Ic zx+e^tPKThTqAJ$n={Q=8g+80QpXaGqpVQLaaQF7SisoG(yPLqXMZ}d(>R5NwF?5WE z5W9hN$fKoXl0JJrjYaQV$vIXU5Bg&r(VTro@+q}EYeJGt_vmA;(})jiKEUu#l2T2%lYExVD|X&9}C!?s$namcVR8q#*e$b%31 zxp_Nk^>RmDQdlD!elg z61r32RK!+sFLl92iCa1k|6m>*x0hYqixxY@>^V*BEDnx*@P@#E^~z$7Bid33U2_4RTF76+wtP;^=<^-B0ho zM9a{fd;=R_>=BBnImnXLo}w4oH~dwC$^ewEPUg{shg^6X8gi`?JswEl0iqP(;} z6`Pt>pzIdd8|@4_{;px4;4DVGM$xoEhuO zNMwMeD1zaxJ~EE}F05uS6rCPA{KS*dc?5GnK75Oor=oqv0b| zehD$6a0Jqdsyge&J@6|o>Tc2Vf5;kQYF&cY74a%ULU-hApGDopT($mQcm2&H;jqrZ z)Ppq{&5itwroQ+;2r1|tl{=26#^0MC+wJiQ$nXv{r0byfVGUi$QKUhNcyi=xF}BfZGcyOBh|xuXEH|w zF21RF2?d{m_A`n&Y(6=3#N^vPi6z<`x;AjM!AW#61Pw*MhtBGe6LJ?%c52S;lQF7x zT?_~~HdfVOyoMR!XD2hlkyhgM%Hv6bG-tP(AZX4Mw2B4W{Iqk|^g` zW(6A@Hqd2)v2%q6*ogH@=l)EAZ@e6zbbjh=i{TMi=s;XQ=@@BnGX{Eu7@G(N0p>ku zYeO33HTKWLO4iLw%o5v9q;qR6_3$f`0{si<;=injKoO_=-EaGzSYZu^(H7^O4C`is zzmdIxtzDg$gK}s#?}!T*vH^0MHP~(|3axy_UXJKpS)m%itdI9Kh5^16O(9h#9Qi1g zCmJvwfo2>DQavUS%st>IICT`x---$9=+cYmlB5Sh5jTE5QT%M5%cU;6_&}!&H{+p& z1bWOu2G2L}LIm}b@hRsG6pfPucPS(hrPrN(Jin=b_g%fVSvF|W)o#7lmx?RliKmA=5pX#&igahlB^r`bctX}07z+5M{FCYeLL1r8@w zmfC*w))-c%n^5Ks-a;bRbMX;&ohZ{YP$p42M2>$f7TysDc*kOzL?(cENU!bweAGBU zZl0l{e%L&IR{ynv$Gy-~0P^$O=J^lJpI-lT*6cuzKI)Q?;8=Tte&SGaLh)7IT>HWT z8hOa@64GwJ8-36bBOEBa!4{k_7VXrHiE9ptaU>J>e>t*Vf#PY9`NjGQ5h#;#&gDtUAK}jPfRcI;cxE=aN$61u41q^ zwVjB~s83AEY7t<0mas7Nw;_k4F>&S$Oa0aJVb@*qA4tcXRoh(AI{6wB$oO#~2Q_^R zsC(^|bGl7~#n3#DUW*WW7rR~^5;Ga*1gb#Ct&T7!!f}rvjV0UVv3kOx^*6hc^KqsS z@M1P)_YhQg2IvAd#wK7%GwZm6l9{Nmfs8<{>#>6_;$~0oSlak|0L|%t)f}s~P2gu| z>DFX4BgB@hk0pETn3c5{w(Q5I!*mBpfW8>q(iIlV+Km=cRxPVWup0#zy~y4LGQY`p};v zBCvTHkI&f);TY{)Wi3IuhIlLB9;M_S7*v!e{d8fit0SW02piT;CHloJxvpx@*^>wN z%wCxfj10a?7pYiSD-2kNL%-RHeKdQxOF zI$vUQ2CaY`DlXXx|JVVz{N{P1e+)N%YZRSpj&qZfG_&P750T? zv>4*R|FW{~?wRHziBT0WKs$S+SR1Gy$ZvGzsHgK3Q|Z2be|f+jq=s{_Trh4<&aZh#}V(Q zY3jvgzKyB}(U97!n_)XNK3|5$e)t$`{Qn)8JNHT0mNI59dh+K|yBxAiH(Yn_I$*RN z=jt7^IVzpyBKv#sB|&luGAZl|m38+M|8#NajFXqMO?87)8viizJ0laJ@mM0KnkP>P z4V)OR8B~U2Ub}gg}xjNYg$Zx$}!35*16ygVm^+(bSbj`m^zdDs5EsFk;U>O2>%meh-te zmRchoczsSDsQ4OV@$jvD3Frn35(kJ2P0XE}0CrDIMLPH`Q4}=|1EWQ%i|7+*2mMG_ z3GjqHjwFZy+6uh8`SiLhatIE1^Z2BBd`2>f=9^gV^mD7L=mI;2|3_nx(pSI&c##G~ z=1x(E+Z~0s+;bSok2@4w8wFU8of6475#G#(=rf52eW3V_LVOYBI`}w1t3tJE9RkeT z_G&m7g*%GgTttKivR;wr0dH$ozIn7#p-m2vj)*&;2g_pv3!kjf4iyLyImdZrgUV@J zCHfW4Mr%qnQDeZfsueQf#Mdj@s&Yx<7w!xs3mgf33$4mcIPE->&6E$7kk!SWq$Z0~bS*43nPk$Lb6 z#yXo6yj25Px>JBD!Da!cY9ZZRx;4)V3v~?S+D z12CDz_Q^?5HEsfQb_V5xAU`uW{#9)PD##D3hMOf0f|&{eFF7FyUCBdz4v`dA;3sv7 z{=%7(X@<^2{{^G3M^nnuVzNwswe%KTXet{?=F4zWEWP82)!2CwT9S%3Dz%~)3e19r zU0J0#5b);{3e%6l5Z}J!WrRakIMH#T45Yxn(PVl!h^IUF9r+Y%?*K2uA9DwlK=C#g zA(gO<9t6r0Qb-^R!JDxmWVleqnhs@X8Q1;ugJ9t9Mc$Uqy8p~;0~eC#zLSAExJicw z9szfXIasgA<@C(^(z1ikswP|A#B11yp`m3~HQIY~cS+7>6gfP3BZoRt%91jxINFIA zd8X(on_%*aciuJ+58d)4M4T?jQO5yoa`ML7e}vwxvXe39|C{~)y!RjV8=znKjlsF^ zKh`&E8+CmDaciT#vAMamLGM3qz1-aR`u^je@cBmRK?j*S3Mce{;>DdB(1xLkN8M=U z3;ToVqvAJ-w<4*Kc`5SMEA(l5zFyy0uff+B+nbx)^-b8!4EtfA9v7i{^~-#UnOM^S z;Yy2en%<0uD>T9WLJ3&(`xO4RY~`b>uWi)7Q{Qc^*PsiVs{VZY`K#^CI!2wIswON+ zkBi?Fi))>C2M4Y5W@lTi4T?DsdzS>SzCqwN*EhaHa9bPOKo=ng1N@>SiDB+n<8jy< zTn>8lGW6hTHep*aJ^O+|PGc5dI@om&jkbK73m}lU8f;xK$fAB-&V=zM6qZbphqpygekm59P)Cz1|)ewZ;Ac^^hoz4mnOPjR|6P3zgHScx@T0F zI<>V)y?Oy-tv2f0o3FOFp1XVlU@(#shqU8mZ5vNc(0{jRqFS7sp0$oz|F_wO)vS85 zVKd-!)Hr_E!3;WYk3p*l*Xf;aQ);hq28HVTEiCo8#1+c0+)QtR(fX{5|H6;DUw$*E z{8*RYEP68c0|8E-9A^Wtk_e0}N6FYcbuczk~5c_a&u{N0v!m2zo5SC2KY#9a&GH%Qm!0M*a*jJ;6e*IB zT9D1EH=W>fc7k;zdb8Sl*KRkD&$`U9YkuL@QR4?>OV%5+Govus-Q=2eemg1f>uxqyYHq$(!pWlO$TLFtX_i#d%~{@S8o)WsNt8Y zPEx&zs1`m00Z@u-XcAigmEug$D0?EDtx2&MW4EZ0kzsECudp^ z%F|}107#j`)@vR_DnM^cSeD4mJZv4GnM|OKhEs+@qp2^}$eYQN#30RzlF5Mpr3gtr z{9ZOiEEwIE72IVhPol7FiUTI8;+wg}(O~Hm_fUcwlFeF7IXNj*qb&@1a)@*;Qzyx@ zYodDpgwn4ewR6^PobKu2e_S#PS2+o8Z!ZU2ua|1Mlh<KkT|}+LD>-a2=HDob6j+s=7}$YWVYG zdrMVE5n1kgRN3|`!M6YfaXdNZrX|T~`f*ABD6_cey1!E$kVF^%veTBumW%ndoc>T_ zZ`;krey3~ec}?oHqB|It^xj}dMd@k+xLd*ib)cRcv0-bMJbpk>#7QPNr9}WH^?Gj% zi$n=K0*O9~0OYiNvImg%j`nkzQ&pRJ0Ql27?wmDfeYuEXd}9$2l58Ynipvl4+8p*1 zMGu?E)5Fk{#gGWn03i>De)*poG}rC|e`f9NY5|`v{L?Z&dZtgAa%=w zebzoXI6%v5Jc%wZRn-ycN1dYvEGpEunfkn*Rs;9R718T|icGMa9B- zpWv;ej+W=ftl{R&n znfKy28irs07+$z2K3Vn4YyxQuBK0Fdq) z;IyEtIHKN{^N`>Tx+}$1Gn!B=zKlg@0<8N=u4SkP*b53W^Jld3fN+WD z+(J9gix_s{cyf*)D@y)jOW$DQ*dA(S5#S8X;i`kp$`A7o%-jY%8Z2x{rKB^GhJ1t{ z(K;czQP9aPSs+L zPhT|ARraQ1WG3cDQ!C@!DrlRYwb_oQys6)bsyirnyNY+xGf^lLh5|2O4B$(7AEyy% z==rG+`q3Q`j{qSammfy@idu66QMYB zRcv|F$TUSNgMhF1y1+S1NcdQF!$u_G@z(>#z6JHpnmstSnVrxyi^{>q&a+VD6gOeU zZWUGs2R=6HnB|0-?a$$*O-_ks(G42P3! zEAv-L+9nQPnH=p)e&H%1pX|F;tmi8IYr7srRO4n1E_s`+I?PBVztd$EbI@pUglhMe z9WZN}U+X-eDvFFr}{wBh0njC#7A$5Ai=*K5M??JVbv9jj6Hs{mj z1EB5!-kw=x=C*YLIslwrw%ePynUw;wvA^)rd%(#_8Ah2qQ$Mn`OYZv?QdXJw`P zV_N3&Yg)YHP2@3WBu1WzljGVQ+nEBQun1upAZ|`13yYH%>qWom{GKx;fiu$$%xKLV z^h=}=>fLfX@ceEk(+b;GPDUNF0+`^_Nt-eA-;-kKVysceI9s8GBj|MnU&PI{h{Fov zA{9o^ND-d2{GyE$@T|s+Y&5*jK24Z}t)Lt(|4w#zNjDRl?Fw4AfQX=2DonlAy9?@?OE zCI$ij-x$?YY-^{uQ%i-IlQy|urxiI3L*fTRQ@rxu@ddlq(n5$xfVmV3;XOSS;^E%O zHxO78Oa3_;aHhWXMcl2Q=>qJ<#!djtxoz`hwHMpj_>fkyF!okG^}%5Z$SZn~esD&I zyS#N=7a$GM8wK>O$2Q>0R^NHf$@z#gzaQvK-L3(E8V?&K*`YuXu`cpLL4O!jx=nhYm2*k_e@S^%Qb#Z4vy>ilr_`aEM``IKk9I< zm<*j;BRu-V`nn|UeE?{Hm$}FXU+_mS#;GLtJouZT=UF}^AD?h~2t^JcQN7mkKuW@K z{^S#=C2+phW4TI5J4QW`f{G42NNx{#b3MqOuh=FBkJpJ*`LZVvJd>9*Grs+Vf-63V z&C$HeZun_~37I2%_ON2|tb*Ql=!hcntPDT);OeBg*bLr<>-pSSV;TuC!4tc_<9a3? zP#ylRL4#%^yB;cg>I@z@4tgE%FSI*i zP?J`c54Ptn;eh(ikJDVl_u)alH$F6wMis}wTHx@IP4%Cgw2xJ8pP<*UUb0e^N5a2i zpHZM{AJRutKgAW_TT%9;E(TtYg_&kixAp#;we7)_i-~rEdC=!m1&okm>=#3a2-K8I zj&`H}GPldDEJ|NX|7C86p`QrQgVC%`zA4hVgSe?j&?1#)OD;f5$g-B*S{B?LH`y*@ zjkOihO@G{+!a;9tX^A@OQ7K3}Gi5GSUaZX`&btSfORqf;TrOCG@D=={sOmo?RkX@< zRpg?GAf8L>+I=>8j9><_8#Jxg#@~Chpmt}kRN$>?voDlGUQxau|D&a%dxqKE9{nL9 z37B|gInMtdSn8b(on4!b|r60Mmlo#wxFyEOtZ(RfsMUZb+8P zXeZYWi1n_qQc;#g@B6lSqvV?d1G_QWlmd5yn{Bzz_;IaPVuRR4tM4d!DlH%E6sYlT zZY{^w0xb65&YW?~kHJVVfnK@X#$LamKd0b((jbEP@T>;ouW-N}do5V6AqMn)x|y!G zCur?K>`*2AJuzdC&xAikx8S$VTw%q3`1)$*>}ER{mx%d5n^B*5H^ z6k5*#&acIY~a|)H+Jfk)R~aI^$|Wf>!cT6-UXwV-7}Hj@?0a@lMD~OM6o@zWnV8Z;NOAtMeSKi#q~$whL_eoQleIBbf)Xpve#I`3yuxB#EZfUCPdY}EqsZ}66MHB?R>Hc#yNICDZ z7;udgoCwp-8iu#D%G>HYy^trxU-Sduvjjj9L$!keUI1YzM7~@stS>;Y_b5^qODI|G z#a~`LAC05|B4s<3tSa|eS>P=Z591Ke>yFsyjE?Q>31_Zr1#(9rF#X_XKag%lYpbFm zBppVnKKkran7Lh@h|_w^;@w!lZR_d!IQsVE&&n$7QZ__wK8RyubxqvNSr(nAjz^+e+kk_C4~8T%WfV&&Z>ih)mh;eIiz3EE!cvm2p8=`zGXIY z!jj3%jf3+#0_>p63Q}nQ;_t(e_#se2_{#dhqn7nc>}L}xk_5QbaRbFulpD3Fd}p=u z#yNEAKesm$kWN!I)r>6ai6=^vHJQ`{LEvC_EYa{YK6YZuF-56lzpPu#>hWdda>yrA zV84tPc$NMfp&L<@n;5^<=k@TN8PH?f*iv~Yz=+TOShs+7{VDV~IGhYRi2+S4ICKH) z2!l|t!#jB&OM8cOPRu$G^KklnkL0w$7~qQ&McWO^CIVId+Spb2sx0>sD0Uo9VKXvX zs^P@0Mm*YRkmVFIg6i^%Au6RTul!2MhpXJfN%nWzQz$`ibi?7xcVITQ;B^y7TZqUjd!&2J3ic7bjE)jl ze(I{GKp7?vFDjY~gaF!FP!eX7Qnw&U>GZ@nc8OEvLvSnG_ryd$SM?CEyRxF@aSHy6 z5ru!W@;%{%O7|+r8nISLgZdVZhAOu{vGm>{k+D>+u?s&TthPkA9|d56P{m|iw~YQh zmjTSM#|KKSJ5$r!9bf~xLBS1;)R5fB&F##JORvppCNiCqDNgLvF_d4LhUr%Yj$iu( z08*%~YIR!plbkPTd7!>O@F-06LMZYmtDDGHhOs~BFNez{TGe1j}rr=*@WW)l}Ot#Mz3>zRrj)uYL0^>ly36Zt`qPfuP6IqyqZ= zfw&Xa{^ap0!^g!30^y)OyUh4rPnKBX%J$0@*{ZM<>oLK+YhmMaI?E3P0c-UAWkE-YUh+P{oyNnMD zA+nYZ(E=S!^Q3Ra`5_n8;Rm@o6VwCY1K$iB){!TjvH@zi_vJuMgr5iQ=(`hR4TCSD zds(poY8~|LFv>XC*E|mH#k66N1B(pGrPpBf#wcZAvbk#KH|gE_3FwfYCoLQ?md;pByT#8j4$Y`Kuw9JO93 zRKX%B)03(481Boe*y}U-*!6p%k(5Vt&W5wC^kvu`<7J-afYA(d3qH^T<@A zJPuHNt^-rd+P7-CF0E7TRue4TCo6Mfm?bq2r^n03Z=J*Q9rYA3BReP7@&2$oP*Y*N z4A`HAgEGt?IaIzm+8eCce8oIeW|#^%~k6AA88( zI6y}$I;`HlK6L)@w{*e08G)_>7!~8?8ec#B8oA5;8M$aKswmqbClhy0qrQOkf4&kh zc--6Wr^YSnN;?E8J(n&`rR_LW{i^DLsBjjA5l|EieHzWfq)LS(=z^4MFtk;6h=lP% z8xj;7=jugCKEZf)cW4EXBUXuur!cUBZSqEVU#fka<9W`Qa%oAu)Qd+U@IfOhxZx4G z^jYA19=YO!aXI3Q0%|Q=pd|3y9VZ$nKHaz#%$U%@RrNoEK7w)VKTJ)w@irJOj`N6y z2=!me{=msn_?NH1bBlkk+VD}S!e4>PNL~(L(D8)UZU7P))}bwV{3B|3ga{v>01G&~ z9w*mm6P**Oz?1s71oz^yR7hN!51slC`nvtPk~(zEFnCX10l|%n zzN)7BNBNt|Q0Ug2Y5P~hz4Buo=pezicI2O8?!Hf461!r=A7+gppyt^c*(8+tLnyz+ zZph_ls`9&q)}ftq*%({7IIGF z1&=zrl^|0EevXPc-6zpx%-xdhd~Zsf&Y}+K5kZ?$X0*tl$8D9%5|b0By-53m)$GpZ z#|`;}_@GE*wdnL*C+?M2CuciqKxymMqPBEfc=N_&C1{cj+h8=j^ZapGw|?8$mI=oM zFd@=Ptziy7`?;Z98k|-CZ`MLR!JjT#(*hk965Dr2Dg_x8?m#gfzqiFx_i z;jzWNT@(5#92ARaD-n#vUQwT8J$h^{BZD0F)&+btWNzgIW%0lFZ{je{7|P)CbUvR& z09GsU%A$M7zOfGl zVv)!Fj8|=NMW>0(NM+lR%w>*@i|0F=8Oai|KO8B~3D@C2`Ytj-?Q~@_6dl=RCV+40 zWhVTd@qZthCc{~4&J`?mXqB&f&Zh>9``S}tgty02dI+Zh!73944D6Vpj$z2_ViU(E zF(PSCX6^U$ytS|0-J9Y!w}= z@x)#8jvX5`=p|3}1r#g(xmo1Ogtx^V^j~XAKJ1PhhgZU$kHsx!D%_(UGGt#$Hmsqh zCU?1)mDFlADkUXJ<}HM{`4N`&mp47z2vSh!70^HgJu#W#mZ(b$_{-FEOOGssf&@dvF4dPSg8o@szDeS9J4yd^!%25fMaxR%aLy}5Zwl-YYcvhkG)bJQ=vYP(D;oD9>&u=> zt@opajjMM%8pJ%a9XF#gk;;kfa<;=j022y68TQ#ODI0-};HVnWMl+*Jd+g$REi_i$ za;TN2=(ctiFIomZmCF7~oz2vidN>(_DpG?x6tLajd?H)B`H%4!UAZ8XAYz@V4Flmh zf2@CQC&Fg<&k)Hd2tAMv99ThH;XwRnyAEn3OQGO(fAr?$@=JAqIQYs=epKDP-rlZ% zYmHs1rVIOCEWAOrUFycY=N^5}z*|2-%l6-Xeea{9zyWNDEnT+B5mP_A)DTFlqRFO0 zaK|D*JKOBZnl@t5V*uAw%oN}&es?Xn%A!|WnWdvvx)@6M-7fZ4>iteF>f=fZM>d17 zsL9NAcRWQVz$)(%^C~|(-QXNm=e6J3JA|X~ZRfue$=$ZBEEm@dZR@s$jo;gXt9y!Q zUU1s>M6cl%fE5is8`yJ&%Egee=MF~l?6Y9=GfwN8+GV>|Y5@*?nVYa@Z_*Il+Er4; zX+UxwUVCmLRxSQvY=+d>k?yfCzZamjg?O~4tq^|{@Rn~R%E}DhadR}dX>l<}(YY-x zM>Gjs>ht$}(_h-ujHtb!vj~oB#}O^}GuNT5JlL6s5^Bu)e^}GS zle%IjjU9RfSu1Po2^1yk3JvBuTSvu;v~jrfImh}9W&%eCeb6MLgkJPy=jSiR1Doy> zcY6PxLd0*S)ZpWH(qfbMT0X-i88qRTuV>8PT&eXMxM1p|i_ku-5C4WNl{p!Ogxpt^ z`REQ$)wE)t954EyUzh-UAl#S)Xau{RENX>&Jdiv1JZJsh65mrp`fC}88V}Q^F(gdU zpW_cG(N@d@feF+3Bl&M}s%~Kze{0Si9Es8TwO|c(Iv$uK+p?yz{t~+%E4uYfrfIsA zwI#@weavLHtx~7*I^OCr4-EeGu~U7(H~P19`}!Ho+;MX6>Rpk(_1}|o$X0_JSIc?7 zFhR|JKr$$}+O$N6?}#G>eGbM6+y;P5+md{UfDJHIa<@Y`8X=dNfJ2Eq3OMay(B4P zaJ*zBn;Hpo@fE*vHc4^CHged~-f1eu6KT9@aBt}X@%9CiFHak!m8tmy@ja2ooXDCZ z{F46q!&O5*z2uSKHsEa=mJWNRzi!225V5%WnXbO?RGm5rSbSt$otVj(bfTU8*R+Tu zw7@&;sxPAHcO2JeDmiwTCx`DHK)t{=gWs>hR-2$-=`5F|S#DEm`!V2#PXUc^=0U|U zF!anIz5P#&@&HJ~b(1lm{m8YTRp6L^?-euoz$r_142^?&Jjd;llvsj%QifcTcE5gS zFclJa)PKG%Qg2CXjxko2X^A#BzJ=|Sg~1@}e$?1G`}9v{!p*y7I5j~xg*m1TYGiX= zbTB9wJ%amanu+GeDLTBlCmvLk@tHEh1PrO)%$>%N&*t%~$fwPQJDOa%q z`mHW2EB9gz`mB>+ysERXh`s0T2*kqsYpD5nvwb3y&t%2(l;98>la?nW^LH>T82#Pl za?M!W{kM(*ssYZ;gNIG27U8jBVxZar-^sc+ox48mc4ry~vspCET z=N$)XpffSCfq%@eJ`BZB^Zogx@~M8JNZ+c>3oD{8!EvjVt*^_6Gu)z-;_H-(GA?8K z4~+F-kFedK4-b6riY?u!A}iMCcd5gf3a1c0dm^9~gVwYGc};<=8-g#mjlaCErUoj# z+jOw&Z;!c#a}ot2f_e?Uqktzz<83&_Q!9l*mG=_W{kt;grQI(mL7g{wYYF>7D1xPs%34sG#RF0~B%zItr`zUJFUlK$)F z_6M5wfHF;&??qkrqu9CNz-VQK<>vs}%i>AnYG`@cXVIeR7s{}BXInMhbEf%qH0-me z(_Px-TG!U}=7}_aF_UA<-$obI+c`s>4TfZPFUZ!OtxKCZIdL+*i17C7yqO?;8}XX{ z?S@A$9yl&K>!smL+B7HW1A!uW&};Z8t3KUyd(`RFRM}dUzW+ufqOPLQ&i@lXEgtN% zJ~n!kYS;$E=$rnV!`ltGig(2vyxaD6W$55Q-}j(=$eyD>?ZMEBzI}UsfJgHf;Acy} z4mlX;3j$4?xEQjPbJ8|ZnyJo^mk)RPov&7T8|hRl4iXIF%pVn*JUFn+El-Jg zK=B@b04ob*WI3uHY)YPvTkTinb45-QkJo%~vkdw;<@8WANy2#>b$M52+^aIpj%l1^>D&^G6)Is6?VLUX*gx|=62)|>65V&$I%~WcI8zq(%ViRJ~^Wl*EzJG zx7d|{xzG`;W03tz!H}&R4l`k!`4Yx`VU3u&!skm;97)r-<<*80^&hT*|N89+|w({xWPJ49Qps4pC;)u$<*)zATU!YT~n2M)*jX7 zHtt_90hHp=##;+vf-sK12$V8F5;z$wk;U^yOZ*;TFyO$m;Oyl7UxZJPKkUGM zC-x3?4~io^2C~=)Atu-W2=Nbg^yyv>6~;@1i_}|Icuo&D!L@Z?jit^;AT{k-!Bvhv zh&*oj5@cBgyLfYlqO0R@`El>ws@BPjoJnExZ-6lU6=(_>_&`a1;Lmct#=Zo7$(h(S zoFAH+I0`KX`5(u`|6k6h4$-LsqYK{t={LbS4LlUibCbIL6cJCQr*CvqAP>pLebi=F3U?VVmOua6-9$9uc)< z*eAQu$EumLD#4Kax<*AQ*Ey4%9-SRD5$MhJGSmd2nJBh8R-BW3!Q6Jp9OuA8v8R&j zzrwT?VEM-CA$SAs{P%HFqan;G)Xcyt?Jgx z890^@Zy&|6TwDY@WHD!1QFWyeCs{`OG}|StKS2dJF!A3W8OV;*JKt>Cz)U@sOw2sQ z1w}pk($OzalzBD1p_MtSRaG(w%-Jyh z=B3Lv{@cX!yJo;}a>XlsN@*znq{|pfSzz4plt9iw2w`7G4st_ecZOOIux0yW=o?2&!KJpvvz*GXKX1CBwigH$b18(p%g&lrGxw6`H+r zt_@yLAr~r;i!08M%YLb0FK5<-GOfj10yAG|4;>-Fwt&u*G-giUMT@+wxje1L_&D>qn_`K7uB!fRx=n_@DyrZ`eVPv^geI)^I z@-yN%MQt))du>9ZYNnWADO;fg3XfSM9A{KOu~a?s`Pe(HbHQAG3Rfwl{Cfx_W4Ce8J$)3`odc$%42ODB~w}s#ef~ zO&5rn3T_Ibh0*^Kk2jH%qs0`ANz*@`CqFs>E}5^%D5bwpVdYYD0@+^Z+-iKfR{%Ki zjg6)uiuRo{wL)bfio#OFX=n;ZUf=PXVHK;3gOvk46bu=91Ki_61Q%17jwnrE=T}c_ zZ&Is@_26p*^-QF^c{R`*)k=pAyHY3c(2C<#%99l^mYyibv93|b%LjF}J4{`H{?hPZnHTOjGQ-v#Oi?BPGb+)xKI1R(UfD?hdLQGB|8Gx}>!VY7j`6mi zv19qLKFD8~#N=FANiGu^6K)kd{|GY{W-6{Sbb@}r$FatByukx~J5@@oB-4)2Qt0E? zN>1vMu(oG!`YzI^#Us!-@-cPF(Vq@ko^J2kgRGx3>2EX}!|%5p(n9NR(W{~3<%ji% z_2r2Z*TCi{2g8etx1F3@eaQWsA9I#cPo<}(cgLr#Wp``Ku5ShF#b(QljSQ@F%zxY~ zHr=5gUFO$sJ!@pli`C zjB)b6vXtJ)oq-B=|3@nY6D*wUBVpQiZQvet|EF-r=`Vhqx;?JY@|sic42_=ixwjTb zZZA1Xe?z_vA%fE@YoSe)DcS(Pr?%e~wtsi3Gy%i#pblHV#%zr9>d{~;Fd)QhC&SZ{ zfvB-rOvry`DYF$94_HpF8nS>^*RTz)*b$|Ym}XjwKdLrTefueMcIaCMD}0bQ54f%! zYJ=LO)DU=rzly1A@^ql`NFcc0)#!4gp_N+FT~sxePOn#mLE^0}NEUcS8=(!A$IE;Y zin%Ffvma|kXBoKZZPs<^rSn|K zQ_tI)uM}iON&Ea4m+1QbG6k6DjdMJfS6!S|jZ0@8&lHzRxo=(o9>0MCGeN2;qE+O+ z;4WvFu>TxW3jaB#90fFo9GM=SWB`Uch@RRZOPO@=STI-~4Q^`ZILb@EhUE`n^A}Xe z*(Psq{)r*TJ^!bD#q>Uar*lP){fzLPa3%4Y_6M)E_|EHHC z#b5Sq@?;Rh#FyLz8&e~kCjQNRhDqg?m-7Vfp$lpA{(_uehdJfQdMPlqd_~CC(*zP& z0U!(&HuVJhRe)!Q)tNh~3f91kU{t!I_bJ9g&=+Z)5u|fxzJ3^?$?$c7IePu2hA*+W zEt3?ePNCZj9+ms2=|;ccXPTUzX>9 zUw=8H{g=aT^HylHx$ln~C8R&CZ^ib@jiBT|aZ_j$LM@KLNLl4IV(a0~a%MS9&%dZU zMhcN4sr~Sw<15HSf<&k$q5W?ji8_HTSr$GhEbri5xm9Y^IBzzm%GV0ozXC|DS2ABB zEQd<&`p(GS>DO|{dQ3$!1PC%|QFgd;X9?nlY`$qThWGFTTv{i4eRWBVsI?q zHw82Y1P2OIVwEXY1~xNIpEr%D7(B*lei8%VZ(%_{?pLN!nH{DtUwR}yogckGpTB^E zMar}i%pQex&D?fP&#skYvYp5lh37I5iAUva2nJ1GI0zKnLAM|ay13_w{p^DRbcIIf znkRoV->~9>MO=bxNy5G|8@JQFQkmA`fG|Mp=xLzyDImS6@G0*tdD_g0d=Cbc0bXuI zkn$T41o9!(yLq7Er@g&sgkl)IFy-!yLK}<`(Ot0Mj$xg*;by(17-0=i__GxR6U*Zbu@G>#`@Z5`L*D&}*(_atMF0l3ayu>Aa6*Wq zXad@D-!?OHg?CJ+PO|v?0Lds+>6L+BqcgRLRJ}M$WeEQLp;A$Wt2>Fg+*Yk zPT+P<<4Z@#l%a-acF!yhfxb7E^m~nIO3L1$srKbcRzA^G?VZXd7kjNj{F#DP2>%ba zk}ApOP=E39A$}^0ELrST{oaeO^m5 zJg3MwW+S(|0@Na#8TP+)K7}}?ksCO8Z3zde=1h#HES&vf+=)Hh7i>2L*;d?>19Gmf z<1>~T`%w4*YDXYs3cH(ZZowTefZVqBUbWer4NER#P@cyOstVB#F+nHzi@leUp2%#V z!~SR+3~$>B7xEK5z}VLFp6?=w)xsiKAorARcV{jNHGL!p!GVAK{yh!WdU;i^=uiwBR`Y@ejRQ_XCwM+Wp|RL zcDrE2SO#031kzQk9pf_wl$7D@SJ4#wVyfkC3=eV@#EgCiT-d@@ZU8dY__kc>KH}TX zJv~@`)9B}mg?znMC@5f2$fYy?5XvfSQOaz;*kPdajn|YpiTG5d&tGj&J{8^~0w)A} z$7el|a$)c%KJctD6V?+Xs%9~K=n~`ZG3>W;V6#k`2-oLg3=A`mB*v7&u=P$JBU!`Q z*pa*|@YmfS$ZjV@6S8i)v;Zn;k7a}1Rk>R2I@%7{U537sUkwl#x08{7ndZ`j75dr=m+f;gChg%l|nApN3OdKi1zQ(xra(rVU0Z1aYF{5eHI}1x{uM0Dl7rJmu!Qy?QKy$2kyr+Ya z6iI^yrvm8x!@v9MTw`iy1$5FbOQuQnOYfc8bYYr~sSj$)Ny>GVqZNF?$YEs}T1@aQ zmys$*nIdH|1tS7VwM4E1@@pvnUmZ;JWoUayz1uCFBw+8d{lla!kYciRKC=KAd`X1H zn(Z||MGuaQW-|$G))t&&Qj3>6f<2Uq&G_M=kNp&~4GPxZ;&Hf7jpU(2)QZb+?SiiN z^hT5>3{o=gl*@4yvJTd=O$BRZxsK$0OhwBHhmSnTjUctx?i+Ho!gk^*Rp`VNsfy%M zOdilE<*htDUGmgCIt)UKMZg7rM(pMCv?ak)#S*m0dn@}@6qZLv-Een&1r+S4ehG;v ztcDCezh=4u23nD7G3~TUv%DGTxWs2Cdz$(e|3B9_5E8L$R!at+$YXgIzmfvB0Y?P~ znjVNIO9_E;vPCEr9cXnTYqhmxK%s>+*hC;7gKTfgeoveO}+fc5G1NFcyhw{!-3nbX$dQO3VuzkEVKnGipumo{72Ygn`4R~Y&wrc!mC$?E ztaGbPlqP&h&TntXz4tmX&^e4z4LJ)y6IkGXbVLB6^5vVr0`nGJ?ir%>QvfevKkzy= z2cfvdD!<4h)f3txgHLr@MCwQW5Gp*A=Z^L5Qeq0ss}ZzS7Bs zU?8v^?P9Md2sZnU%92=l36vk{=@3C-Gx%w=Cby&2P3O z-|2L%R5_<=g~TEojIUAjXR>auZH7BWFf-DDf#AEuYWJ}(Da-DYRbGfN%QK|i$#no9 zdS&?<){Md9aLwKk0A$6es!v!&!yUuMAVlZ)4rIK^_r)G|j2q#vTKcboBm$QHwh)map(Fo+G+%}ixFW#Hz{vZA095$y@9iBn4-ecY#90+x^nb@ z;;)5B$DJoXCqq87bvQkCk$!J?cr3r|jJ7*G9f!}5sT17;-cQJ!%2)VwShnv0=p=5!&ZY%hA0FTa3l~RsF@LPVBl+ zsl0hkKZrvqz8I#$YjC@TP^ENtr0vV}bd{d#N=qZwNWOr3)N690Zl!Vb#Gc!F=fA(i ztJ7LdArU?mVE&%v(a*X-U0%t5ezAN8dhg!N^yJ3~RCNQk&qt)xbVJj+&vv1hCJg8; z>4HG-R>9uyOmijR#KKCzO4+|g!-3}y5zad~PBY0izPa62ynlN%fx4HJd$oT$o9c*b zj+VC-Gkw6bVOnoF=N|IUZIAO0%dJM4?xyc>X`p!uND6NIf-l{;P3}o9*IM47x(UGl zTO%ss{^yL1iY)7YPSQt8Gu+xEr*$Ivn2G}+_*g(eN!d;**5>;ZX?JB&m9KJMv&_=G zY+?EI4z;|X!|aT`=PHu1IW4QlHfk7L=2+= z!c?z6PO(l*UshZX;OS9%cA9sp?DV>Du4IAv#DC*r-uz+}jB11%?s|S=XO#T+%DEpSq5wEzzbY|%+Lm@tY{k(rgjUKY2bm5k^tyi0o=;Sc0$3urd`k=&9+HQ&q@ ze1^)N)he$qfnR7=hQT)22Lr}7UkW2JJ~ru6xJMNOneEoh2c3HpEOx=e%@48EqO*X? zEwp8jwp2TARo`omE9sVHww;t5Wq^KIRTwB}+iARQOFX8%y(PKCr?f+!L>IO}oa|T( z5H8QH*5=>lAe?V>V-BJVZEPPkVkh*)wRu2p?1V4;nQNaiAuP+R&k$0eSt>JkPHfLo z5ntG6)RxSgz2&qGd(-IK4OUXKiFa20zNV-m9pk$fY}uN*I&i6$2TK#E5zxg@FCA<{y<6t2A6bZFki~6tI1?QP(wu53;jVZ&1 zD8cJT^)+P;`nJr#dU9FE*;GqO*X?Dz^d@On`x&~#-%c#}AH$$YinTJ`pEOE&4Ln4k zH@7qkIl3~iqhtfRAuHpu6IU#E%1s05f|O+@D0Ah4lmZJgKs|;>+wkXluMW$xP^_z4 z3k2CL>8-y=L#;N`8T2T&77v5skO7N>_KiV(5QlluImPN{(nfS|=HBfP?s%?w*_`U` zFG`@lQ^4DueY8Rwo;N^*C^w_^pQiXcKKC3mV*DXDrrz`QxuO%Q9H$18F&rKJwk{L8 zx|PW=`#DKnk)nB8tag1WR2eo+8gNR2YGsi?L|J-e9t zBbyuYSUPW)ow@U7J!hR4OfOM@O%RLsUXn=rsR4?v(S?qinb;qcix~%G<6#vQeTNoO zXg>jvj~)&v9@|C8gM&7p6u_3bT85aFgeaYsdi5hrD(l)F&WmB9Q`mkjgrdm)QVEF_ z^~u-BrW|IeGLe9N!?`glUuBXunw*df!eYnjRnqhb3I$E2$$|HOr7!BE#gCj2^GLKs z((xXYizLG!BCvWUx-D-_wl8(szs=M=9M&l@pN~>Q)Mf{#AFakGI3~^{>PJtqoAlM! z_@p|}#rdlCdpMgFUnOR2tVg`|Rw`cv5+<#=k{_;6rDoeo5x_c}beDw7xUS~gHGwcy z7u8*A>|H~B?wmH!O(YdE4&=xg#}{b3fHf7U)CF6sKv*uXzy@l2`~etY&>2EQ7_#Sc z8Ht^!Fw=B2-#x$}ebOlTIkl2F`CF5hbd|1nQY8*(%XU(Fcs9=m^3Y69E5V2tNA^nsc%_v35j;m1BEPrGH>U z7oXK}B5Q#=$+B~2Nrihu@&EJoSaTZUTBWRew)L!!{5TWx>T9COn{Ew!X2|M^qHU`= z?wU5xCRXT`$3{u~5w67hWc%p05Kd%y5C5>p*swyte>#S&{PfqJwCK*TpVL%=M}%wi zO|0#PW>uUY;0IuHwPBd>=53h6z8O#h<9}5T< zJ?XgT)NC&!t)nr0`asVi0qtZ2zE8DzOYW`WYKFAn7M2;Yya#-a^~gZZm{lSyVb`@~ zE;|jJFa6cA{6Xto@mdlUb=wQWch&a~#tSd0?mN)v=La60#mvRi;TOEv`m6iTf$Zzy z&JO^K+y!f&USsziqOEhMTFuf5Yj(wNI;HAlL(}HQ}pXKl4y@HyaErUXyX6b?DCtDncowqkhfCrLTOXE_Ct~ZZXZw{hXM0xhGo| z^KCfoy>)mx!)a?LeN63pA;t^pEf*z#VqKZxEf-9}4vs$9fi0~Z$EqXvaBgY8VWc)U zkGUz>(PZTHXASlGc<;%TnelGL;!ZTLEhR^JshnOHZ!6m({(Nf{i;LG643d7Q9Y@-# zGmU^!Rul)vi)F&Xgzc8-89iCBjD}wsAr167H>GF+)vIjQ-M`;rial-rf;dxlvH9Vq zpCmxw)4hXTQqlsRkxu%@p7Z`aUOR7$996^$0aB|Ky2q2k4U(bW!NIUR;~UT2u0tSA zF3?*UZ!4yhv~~svrcWMI=#xw5=L3^#`FFjf2VkT$fY0vA!bHgt@%hTZ8rg|E{tjK{ zFuCs`i7DmtZ`Yt1Zhh(pm}0!Eu$8Cv&_Tep4MZ%deG6A-^?mW`ohH)#;wLkxVQ^zU z^G^t?A7^Y@R2mMKK@KYAG0yq^2mcQxGWdiU7YuLkKse@pWld?!-!6v08;BM@*I-q7 zw7HUSvBBRBFu5X6okc#d;7EdQ1nBVZg`Ki>Ms3{}88d_Qj+? z$;O$btPa+6#Pr;eF}93kN`T!eUB$y0H>xxiH{}&PM}no zINShCK((j?nU7|jwq_Z!%5;|QxPLWrF=Wi( zO)+a}^ameFQ}y8M;1|{^T{o^^R%14fR+;6GtwA2!%QdIv8;Zh6jzQ4e5M?_asxn{{?tJhrfn)_Q6ZT+PloTpG&VB zp8|f^K?<}bfz1YT8f2!M@5XgLrCY}zgJG+$RtMe_)y!-1td8{?qy&6y!m@_a&o?_+ zafU0Qr0bwqIu;fof_*(0&SDHiFXXSNCqAL1zV+RbA9A~e9R%k#aM0!12J&%AJfT*h)ar$Ijz|X{CYh8H9&{atU!DtHHHTV`?H{vL~<)X$R^{o{dXr^#o$el}O7BJnFFhJ~KpX+%I zdpf;3$r+En1Mx`LEhoG>iND!U!c5H4p`s+J0VAh$3Hr-yUg0PQazBotV^9NA$V$G# zKhbi7*T=XRpU_p3$W~Nhz&(b9Js0lP_O64`6_A`2y(Gk1>g`^`Ugebcw9Vq;<~QBM zxD_7tayr(bB6%qRriBgumK5gN+f^ig(&rg}Wy}ARr%htD!!Kqz`7Oy=;VqtR(|F*^ z?q(U1mE+p1gw9fv8>kh>lh##6Os)j7_i7w;<(ik{rjocEs9Q5`E7;&GI=w6`%`EBVZ+*0A_yczbyS%B4Q zVsgPAkCV!Yg=ECB2DPN18J%`FCwo)!4u$9b;>YOI-Gfzvt7<)>TwZW1Nb|JRkdoYMN6smEP@5E&jOSQ&o{m3Ygk1VwiC%>nS8=m89n588-IokTrUoUe z;7rnt$7>7bK5W70UxKkyKjV2#n(RhYd5l_73C65w+_XQE89MvIv`NO{$#f#pG%9PX z3lav_c^y*3xd8Cq!F0u!eRrG|pn~%nvl$56lZr|WkJ}Gn9_LLZ=Xuwx2RVTYEH9^s zHUByg)zu4E&eaIyvU!(=Y;QeGl4F-Sln9t=ExZaG zic^n5at(;rFyU&K=d8w{%lt)cV$2;|WwYkAuY0cS%fGthGg-mSMUiK!UUO8EM?UEs zDtlm8-tn8bD|y3Wyp+6}7z(JmSzB9;)wiqgF9riDq`F&4PDL!_qg~1UEpMY)tbA?Q z&o8-J)vM<377r)GZ`>x4VkFjmGK6Pl?fW%x2er+q@D> z#Ix1186iXeu2y%JV7dgsn>XX>orWFTXIFi4la@>v-HUu#H`+b26f!&KKaQT0b+(g=)r5_|8P=0R`Yp6oE^O^7@{7M9uNyWN4 zz-MkfYm0U%XVv40HmoG3fQ3MBH4|-IhjgY^RxQq1`xs8hTj*P35QIpW|#kT}ZB&J6sSxY~#%9upsUepi0a4_#%hv?0+ZMC#HzW3?&mU7uQ zl75-OW`9BmIXfHagT2oA0+#9w3g~6LX!YWeo32S|HWwlasPmp(z#wkWGR)!;6p^75 z22D-#G-ZOr>t>5ZsO4QF$RM-7SEZ4AcYLq0`-28y3kdq(jKoPAXIc|71JOTnfq8d$ za&-1n)3phcxhdBkR@Fz zZ!6y*tAisPMc+tDF*a2@H({L{Xa=x{|mlt$U6pf6#fT=)C4i=6hy&-Tpi7GE5 zhK`)UhXF!HOeQ_U)u;3!1JlyzcP095tV4ygLgh9iiimlAp8ec3dyqez8*_}D`LO01 z`PBh2!#+E2&|~T1Tgd8@IP3P<1xCTvETmfK>>7{59{Qxx>~Z`c)G&%Z#A-HH{D5s} z4}r)TNpP{yofli!=_rrOdEVOzX71>)-ryb8i7}&KO*9#kp*t8AjLFf-A6%kS35cAY z-qZ*!P5vbOr&@(S*+-SsVFxT95mG3z+SV)g_IqLE90EMj#}h2o(*7pq>i&HkaHK7j z{0zqWZob!R$%W4K#(wXn6Y>e-%25xcB^GjKsX(AxqC1>h{T}|s0AEmy!kT&M=?n6z ziiTd^m6Q<0UA)6wQhe2Vpl@2A93TFq%KC<`Ys0hGbd#)8D$A|vlE5l^S9N)y<+y}J z1E3N0)&{+9?*^~NwoY3od)+t9v(~}h$uS0slkDl>1|4ESuc+BXw{Io7zErlEeJ21# znMuukW)f4+E3$00@KJL|3O#``)N{Y%<2n5%s3ihaO7x1n}?RXTm z+B;Jf^yj@dOahO#mmY2X^E1=kHR-ILh_5^QTU(uzy&sxq9j>T$oZ+1SL>Ikh%IS%8 zTQTsGFJj6i7s|72I-k}VA}CkX z$f3u)k+y@(p5_5*zQ65v6N+d$q7-^fh_l}S@VQ4u_XgVN-=y~T+Pi#%+ zSZXa6SokLFG#UX{wT|(nrLGaxWfOH#`0I6hA4^z0)*D}gBm7`tTa*{aF$ImDw8q>= z+!u0X*1=)pO=rgzFjA}LBqpSmL8a`J@r2hCrvsvyV*=$?K8$v05klFeT1$opXs|0mek{ECRfx_(@)Huun5=)L+$V8yhRC z)DL0%!WRz9vY68%0i9!&9{1_5jD_J~65YHFKZz=AxYH$zbj1Nt=9k>;%HfnY;gDs$ z;8+aMgHzD!+Xs89Uf+LUNUo2%0rR zq2oJ!*SHFQFN3KU!879&+1VNG*hTY^Jr*u_`kQlPjHkWW@>CxGlQz*U-6`QbSK){F z%;0x}entyBiMYoZk&f}*)!#Lz?lGUf%v{p5ho_FU-H>%Bx)cL5_V%i2tS|u=~EK_*cs5jj|JH4?tU+yl1pF2kshUReF+vvwq=GsfPDR&45zv}9i4(}&}X=u+xlK!jua3onH$&KlX8CaCRAaVc4kkofD zUY4GTTG_;$8!Cv_L9ODYqUFu{ZnV5wS$5k>KE9_7y)!Ja=&aJ13`JMw@N8_h(8a8w zHxY*(&7(A3)fwH%4`3+~qbChDn=er*oD4pO{WaB^l3R)jdea#Q#5>RqFwC5utY&SgPZX%#3%~@QtGTb#{{y%nEPxX!10T*4wgXLW5O=1 z`KAy+E3F_wS@RK!5HUDflShrEDTJ-@^|`LxNa41D=KI}F^UUs)Dv41kbMt6-_mHIO zjKl9iEEg`9v5w$L7L<20N}}Dsz611v?*5y0nA(O?lRs#TZZa-TQNE&RsR#sf^v7vJS~P*O3bBGA)nB6l_Ra z$>>u&JZ=7$0Aq!$>n~CaZ+I;bu#UXYAz~FrU7Pei+DNqpd?$0)Ilamu0P8$xj1{HcB^qJbIsEzUx zI}R?r<-Dmf=kW1~0~OC@V=f)q1pGn_$d8A(n-rk}X?G6|pXtj(mMoMYJ- zYP#k$LXKTbGaawd678OJ6idJ5P`!%sJd{P0*_l_-hw`WQ{MAy7=#kML%P)^X9x>+= zgay>RsH}4%vStTeO@wHz>Gi>?=dOc|FU7ONhEmN`$W*g~Nq|TOH=Nh{lWWhXcAi|r z=*qDc7J3poq@zfQ4mFU4^m*>0;fq6#>h6@9EgZp$fXs;cVhuWAKQQ`>4q*(Vg{yUp%L4GDmKTT$Uhm|PfgViMedf*#iGHknWuSG+Rmct+u)6OaP>Y(M;j)H-jx?;f@~XWiqI<7U~7 zi&8lMaM79eUx&jXDB}AZX{)58ag;0P)As-+x-H$7E42y~e%d~{)M1>xz1;QVfMJ-E6aa^y_G zdEqc|ysUr60Oc~+BAieET`ZNlJ+bq}cJQB_U^ER{Bk)~m(nW$^D(ndhVF_`fWwHb% z;Sn`?{8Q&SlM>bqf0jy_Q_7Rtr<9JNN-%aSne}@Vp!lP`=Z_yux6XX{*Ejb!CRc^R zIEpDA=+B$K>bovC99c@??d?8Y#|n{sg^W_Z@TsEole1b-;!K_5dBY$WqAp1X4)nsi zevK3QC+4{d6g{5d^XDZ=DOV^|wC;+)CL7TnhIyL60F`W<94Fk4N<~W2TfLeE^Cp}& z#^a$_g`KeFHgJ<`OL~%sU1Y!7b7#{9dKHwj%ev{3X4N@ldS!Y zDS#AFcaOFqN5Lq#3i~pbN-LDVB7vqjb#EA8Sby6&OAv%eF{j@sfy!`LKF2;k6&K z2a-a7`2ckwusI+DkuS@F9P{XdHHQL<|i0MRG%e=|KnUtva4t*Z?N za_0kiOGqt*BDe#X&D{P9bzm?*EhNevh;z5lJt&djkM=Cd1i%42rtXkpR^n`$j@x%k zrNQVhipFL|N7ckU_qe`#e1e}z+HUQ?^mT478yVg!+;MNNg=r$fRH!sE{u`vRdg^cz;O>y z!l;d^^t6^0$??0VuoJ}}RfPq%_4nW@-xwFy??+CM$W;?&gE7bJU-(yAQ&<4a^XN_= zvn*0qTL&JQ) z)fE279n{GUO%ZZNfl|JrT3FS!cT%MVS~`QE+dCoF^@coN`eE!wZ(DV*m)hH*SPJEd z4LnFw$-mabnOeEv^8mpLJ%|5GylP_iB*x@Bcd@cPSP%tbetf~6+-J^(!aP4ww|pN= zDB6E18@{95>B;ZxxZP=H>SL?g6DAoij0kJ*XZ7f)44+4}G?gL=6R4#k@zDQF|3B~j zkA4u|M58bL{Kta#KWZ;GHlLgKKc3e%@d=Hsm$m0#-~ad%KI_THKQs?iKC1d!{e}8& zYrVd)UaPD6%k6q?d+R%S_oMk~tRCZ%0&9Ef{f}3#{*d=Siv0eEdg%Kf#jN)~)cxN7 zD9(NVLoN0GM{$YwKh*s9KZ?t}|Doo;|55zo-~Yhp7XF>@e-!a)i-*1cQB1!7p&s=9 zM=|sH4|U(?KZUm|540;{zEPQ{73Omdj6xx&wr@j^ZZBAfBr)~&Kr?S~3#Nl*&H5v0?(35@lG7jtRwKtyLWe4^DOE{T~ zA}22Yc^Bp-M@VfR|5(IW_7mEbDJr>>hLCuOz<~mDvUP4F01x`zDTTZgig@W`{MYyz zNwXA}mCfF`mwg@fqMPt!GQJK*HWUxn@4>dJ-yPT;9BJvP4KV0nA3zENGX?y#%UIsr zzKX)w*?aLlAt#NkWIX zh?s3AL=wP^7~o2IVcb1ofrU;25kM=~{+y~4qB&hA6~iG62e8sbw<8M_Fde%G!WaY< z=qzB6fbp7Q|I`o{&Jh6Ro%lF{_2XhN98B*lO}MEWT5|wl4d=sv@AhlYRKhv#O$OsB z)qNV{8-BER!0E`%8gqkek9d@DQv)NR%?H{KOlNy>VQSl?S2I$0mYobgQmu0dc5uNG z`o+M~3QGVUcD|QfVMYcF4Y_ry_ycs0f3pDA{i1g06qBv+}6olG<~R;&LZq} zaSz6Gd_lB%+H4=eu)M#%`zyU{p`TB%4gA#k(Kb*ccY%I{ZzW=YH+2pF2X4SH^3)X2 z-{%Me)WdNy&cTs)P*CvEuDP&mDG7C_IJCBjG3{tHg)@mOhw6sLT6l=(3s3Eu*${r# zb9|qHnmKMFCb%vGc2@6^#{sG}eUR#;a^j|wSTmaNTTVFhCct^9=b|%q#3!xO>78ZK z6!Bdd%)?FWD&n_PcB4g`)LI1_gSlLC9&cuLWzPucuyTKE! z%3$-=i?ZV~k1i6P3*hw5xBx;;ygd!`jCcykf+gvh;;_%`=+FWeH@B&?y}iTs-q{(3 zB*zi?uW%BHt5FGMwnPX}r2!~Gx@<)~!E%OX*uZ`I2b$5cO>)U(gV_aPp~9l>>!!?H z(C{?qU02Zi6nN_nc#0;J$H4+pMsDEvj_X^dk8oU!0JJ>Y0e*xzO8QbB28A7Z<#A5Df8Q@jKMEdblX~5c;$62C=DTykz*ccZM4>}nd~_1Tz4v5b!LeM~G&0v+&PF}p$f+I?bqsr&AA<=V z`JQ4rS*yI)2dAKZ^P7)CH1%W9Mb%_l3Mv<6_0j#MiDm15WZ+8yD5vOi&^SuyQ@ z-P}$hkIuijiYbT@iV9NbD54jkDmVo%2Uq4Nx@X4m0q72rWNLR>Z}9oB&NRYvZD<5< zog(~WkZYHB)GDDuMU1z20#B%dW09BLaWc6h*b@+)XhrJAVJw&ZYddxfk5A6`kIq_W zhfNKN_mgLX>CmE&U?}AfodS}4@b0+X`Z|qG5lG_8<5=!^!CQqV{h3&fQYkwSqAG05f-n3LofSVGvK%Z8RD772gjDXvk3O z0qKcB#rq~!B-$cMx*Z@J{VmltHgJ2dYPAhMW{1CKJIzH+CB7Myq%#61VggKYX5F!g zhvYfIUam+9lrO(hJYYKC_tVL1ONPp|*EqZNX*gDOC^d|NzTz9>vk9x9X0L zIyz7}uB@K>EarE@Df2xtI&!)3raFW+_K%#p#<5DHb21v;@g<)sxl^MS!6q3-E;iNX`5H=BMc5+EF=v6J6RRK-zA@?LTY-}GmFn@#~2+o zwN>ZcDJin*`HPxMGoC%r21uDncnV)jW$yt5UBC&+q%Em@1M{iAwYWZvdLQuggN;8z zJNS)UQQmQ%>PtaLR>chpYh0)i4Xiny4i>)cm$gY&z|-^}v+;MyA%e~zUlSgH4@*Z~ zHaP^l5=#T!|3GAnD2OlYEumG>$wbGKeIlCf<#Cb{OCeyg^^3u1eFFNyCG>C|Rm1*Z zLVu~!dSexN4Swzq==K?C3)ApM>YMJEMG`$4MG6k48r3e1ptyRKFzQaK6AUR_yXw77!BZL5~oJ^BB66JNn~4xbSPB(Y6@I#KbQs=c#2cU&z)`q0>J| z<5_@(7rO{&Twr3wr|9c=BYTy`_~&X=_JSE2OPC34=CdDeyf{Bd`$ z@$Svrv->a=QzQ{T#AjXiK~D^L{#taanj5#k%a!I(!M*5M2ahRFhSZ%CE&x> z=n@!XrEN=HfH0K}hOFS0C!M-5N1Lz&o31$hTDZSxhXa3avS8nlxfXx1g+8^Y1A((} z_a9_%MWK}(G~JkZW`dc(sGgM}V}^0Nsa`GJZeVJr+fJD@vfF3I5}s;ZLfPdI5PpGu z&0G>VI)>jk7VyYpMTS{fxd{=C(^a0 zV*h{k{{5kCD{B-$zhAAtLSd$fO$^xN(H5G_rQjr-65wFcq$lllg)M^`V|gq&z}LzB z+wXerha?+F)6RV7;OPWg+V8#g+Uvb)^Pssl51dO$WJ{NgE~3RTw^>9Vjh9!k>)$ZN zWmGIsb@Nm$o1n;(Mhce3z(%WvsOd*FyMmPU%1c)Oc$J(g{xdTP348=A~yk7 zJBURq9eM4|sd$r9Zq~8_E!rhDge7Y@`Vrd4MWJCDKTrfo`2RpLC*BoEW3#$qAvtZt zr;8}*?%9kDz6NM&h%q~-v8qIbw=M4b4r*=F68lrc_(fQAM750@lIJizBiT}!M+$@} z>54u`5RF+D&c=P%L11H(be4^-3U)Amloc=TlIUT{jxrL1MFhM-5)Wv9&SARaI5uO( zN)D?{Qt5cWJBWM%@ny)_Uu`ZF6EECtPikDXiGcn#Fl956>xxWXjTLC-x@xW}bQ)k2$Xa1>G zyuhoNh13vYQ>ugBxUI{tE(tNF&P2%((Sb0){r6P9QMG6_gojxMoZX;ammOuCeh&A z{exFqm`X5wj{KwTuUz?&fk9KPX+ld*XBpsUHe)nxxynMhR&_I9i>{ntdnyjr(AP%z z)d1&;f5?E4{tjYe)*JGNbVyhkkYrs>20z$_TE!;=^F;Y{G_E(&E+*z&%9jnNi&A*1 ziOcaK84u**`2LEd@F>h~Xa+0b;CR_qG~1=xnd5MNM4WC8vs96EmVVT>4d8xt!SvF? zn^yDO70XKqIbQ`yLUuJVw|y0(`Cwnnc~0}=X+n9}DG|$}0Tdh20nj?FJRex`(CR1| z#!5vQ=?+RKYr15bApKeR-|6{D5^GkPirF|xPl_tlfsG&G&)OQ+FPzehbC^r|PBqn+ zeRH9x<_L4%XeCiVkWNFumPrFOUN_e1wJu^K!cnx`wDpA`Z(lxq=pV-C&&oUCWNWJ4hy*Unm?&vcjhA*}&iQf@ z3;jO-oE;y%>6qdr_(b~o=*P~{A3`w2MiwBL>b1ThV!07sG4n0Wm2a8z2?-UIsBbk} zjoVHdpkJ#0ht9MZSoAY@wff#Nc!B3c$qJ@CI@TTvdQI4LP}YR;!ZiNpEXF`?z=-nU z|2M5&_3iUXqcoIg3X^iFL|CxQ!;%+9)PSQk?<%MaGaEm#CT$>3&b=!B52GG#5!Nx9 zu&ClZ{V2FY@JR`K9ATOGx{GRZmd4}c((Uq)A8DV_G|42K8m{Iwy*hh^jPDVvi7UGn z6|&nkFDg5bSxhOn3PR{?9A8f0CW;3b8rmlVWEjoT)m^*|Z`I4j&6*czM#@r!y9PV! z?2e@e7SZu(VG|7PKuHX&rKRITp-!azrXnH6?zLLg+S;YBSYA2pIDcEtj3^y1+TZfA z@v??#PfByKv_qGc?Di{ZH*YarVQi%yz)#B%_f;m@<)#-ZaIQr=B)K!HMgP#oHW`7d z{n-fS+|~G0SBz@y#}{r5N1Jpo8i*!|OX}|ptA+FMpxwC!(WD-tEB37`T2x6F7FU+2 zD2XdCF>gbujcZnZoU?q$7bv>*O902@Q#4@6b%gc<*X*mn%%mJJ5?6^-+h#Y7qwERG z1~H%>Stw9$aFv;Eh8OXJ(I}`<{)cp|G}2~$Qx(kvxQ5`#J>jH}wRAOY7nGZA#>no}R}xFy&Le`|-JBreIO5 zt4~J>I=W&Ibw?X;hOr>W4EHl~^I*EnNL(y*M;rlF;4u0a^OQVD%!mvtRkGkbJ1-d< z-t#R8F@2%$_4 zD(@>FR`-RgHbNJyVljDKp|hccYODz$36Yx20=5%j03OqL6dT2iT!tP6Fi#WWQ6dH0 z)bQ7Yd)q|q1t5WbG>wO|5qbflJEW(w$UO6HpA@|bExB+=l@0hv5s5qxC-RA`Kt(rM zW#LOgk4EK{E|}RASv)w-{TQCp;HtJD^dfqy>8h=>cz-D5rdM8ARKq{;0k*cAw_Q7L z|79KK*+0!=w~FN6i=E!_Plufvg~WJGS~Kf>Qag{J1Cs-m${dVe5Oy67*llEJ!1e`Y z=abYzracFMhJ)}q&;*wNHt;Xv=>hFIqSPBSzP)#}xN*2vv2~oj=s{LiuumJF1Pek- zyWOgRHXJU-j?XNZH$YdnIaJD(QV|UKo`Jd;d=(cEzEWn9>pCa&>EuF@Y5$+j(Lq=* z&6!8oa@igV7LT_21G9&dxo#&#J7t?f zsqggRQlpxh5|RFjb%Ussd>e_n<62<}B^KTYX*Wa_lwB|w5DY->w)^5SflH{K9mX4k z8X0DB{K2o>8ga00Y8}<4hcX77k6c_Y@T~1wC%|r}^8-FIHn#d8YF1tj-o>>LFLc@@t{;eg1h%!T_(n18d+Fn=Aq-yGI; zIj#eB8xY6=Oc)S({ML#<@J4~a*gRB#?3;bZ=)kJ=<*IR4eds(ho5jvhbDW}qZDF5E ziHF1zh}G3qHA+}p{&DLFjg5dnvxT|X$EX)k8lAva-VEUBpg+=){yxu@lO0tju)N}k zsW%yUl{|C&W^HMSvkg69w-W1{9$D{ej1un1n3g9Lnf$@Z1OC0Tg6-R&+BVOlV#90O(z6aaM1y;G z#GiEjXfA`z8px=@KHu5@{ioai72`iGjDhr-pT+T?)*pZU=utWT)06gH{HMR*Qx*T| zjN(5%eR>!F=`Q}$UHqrJ_)mB7pZ@CjPk@8vD`5>1#KhBKgwlPK37rDU%-3K!&`=zs z4dFN=RD3N6A6|Hf)vBJK4=Ntwf|Np#7h^{?J}b&pod0${@w+7Knk|kz^@pNPE$;JX zk*IDlZa+E|I!o*d)f#43=O^h%huqXK4jRdX3sEeoemdg4m4PwU>(ju6UBm1sq|OhaNBEAWd(t^RiRMduyjfA|&tBYcZLy2o3` zZ@TzkgG|@mifCaj^_Vv>HIa6QN7dEH4jtaWr-h3=rWm;)jdL}`Q1BN(u2aNgNFafa19Rz2j4#_C1y82*10=Y5KfGjGUJ4wW8Rayob9rXW5V%+4ov{Y4{NRVW% zSGS!JDdNmtn6QC`0_Lq=Pe^#Mp%MwGj7jKhO!++d6=uf{IH3i`>ZmG+f)60dwB*FN zd#o7K5;67EtPa4`P}T;kvh|B2@?215s4+sYiWK^oL>wlF?k>k&Su5}zYb%iHkjRwq zxa;ZiRlA5QP%;Knh1nB@n%C4GYy(B!{u^<7DZgQpKz#nmjia*Z;2E;As@2-g*72g( zT23kBP2(0k)>{WMufeF+Xe?^TMWQ z$OuT{g%;lo3Z{IHeBBr`VBU3h$9m`PA{-UoK*wT?EQUxxTVoM0Q8!{%!d!<_g4{H@ zh;c%}M`0bMWx#-t4<6NUrKK*8@ZP*F;p_8G9qBXQ|;`r#0W)DIAJr$9jQP)L3; zJtd(96Ho3?*l5$~oH4X|wNi6^NqaB)d9s&M7g_C(qa$+m36sc#N*Vir&2mvW(Djuz zszt`>IOc^gTSw!N1?Hg+W|UU-)tf_Yi!!#G-i(L9W?|@P+&{fi>d`SaT2n^=yB6D9 zM>~(!aqNT_c6X?;-5ne=rpNwhodmErQNsIiPDvh71slgxf5-8ONsMS05T0UWBrGY( zRnuX)Y_WO7D%`x#@0k2L9h%Ne`&f`7FVTeBPiqQQobG#5idi!&8VTIuk|l>Nt&k%m zuGVdzvs2b;{Slu2EzHY_b;(jv>P?dV2i+U(-`Y1Cz+PQlb@EQoMl)0}pNn8?6QCEt zN}ZIbr7urXB+o&w*ik%*quiD=EvvPtR~kbi z0J~4cqZ8T|*J~{2*9B<3!5oagf^+t)l`d6G)MWQ0&Mz=!^SkcVxbIhRho@tqcz%A- zg8k3t+OlzvF_H0H@TW?Ea89H=Hva+R?8!#rs}nKP-%HUz-K$j`70DaXUzbG@(TOeY zn5$B8@pwmWmP~7Ki2bBgnT*ZeItmAYr~$T?<{DecU{is&JlMZ31g;I-zXfbxv9Kf+)eW%*=9{G@MLUc_AEoyFHr%C)bg}9F7U5uqHg_eT37$Xo zBDu5~X{U_t2Ujroq;D`+e>7v!I`)R69t^^9d;y)rqd~?-`Ru5HI=fX28;Wt9<6#U) zAK$S{2M`8CA$-~_P;NHE;?cqJLGO6?b?4yCajpKS1+3T8R)Y~Q`~p-z!-RkUp)(*& zf#$|2?a**KJ3SLiT;c|37j{Zag8SHT3NBR!tIqV=CinSf=deueQ5hu1!g3*@{=D-< zk>qOwqJO0dg;bU;x0EUpRwc^LyeN=dmUMI8Y{}>?u;K1SqoUC5eOozu=! zkzAkZ_2uqP?>Ib_?5M6-p5JgjRn62uyUdCyv(3!IC@)Gom^l3BslMTyk;%Zn>6*(gsYBXz~eECEU)dugEPlv8WVjG^2#=CODcim_;F>$U=UvB(ZMJ@}y= zYL9FMA?+QfUaxA|QK|NrDAEJuA7#BXFDQ_NR=PlWk&!Lyy8YW*rp@!I2dW9YP)k0|r zRPU9xL68cACx4n0vwN^rqSq3j`>OU$1j53L<@gd;VK2$@!W+id6;&LD%N-Zc*-1Zk zxl*OP`HjoQYrUd0(F?GEmmQ{Z!EikOo3386)vx7Ru71fL5tWUacn%Otvgm1g-kl7P7ZQOhCG2CF1va8q9waui?%_qArl)fSxw zF^^!eHP->#DJt!k%g2{-ALv4-DA^&D+pTg$E{+uny~zqLqQx@oL3V91@z_L&-S=lr zTQ!(mmB)zF1{ifWNa_WeKUmDxhok5;3w%7jy?4;<^tSfiZvE6HTC?S72Rd6nc6u)k z3t%1)mr%NBx8Z84U%iq1Qht*aWPL^EOjURQ6-yH3C zchNz|IFN7>p>hItc|mS=l{uw6`vKN>+p2S{bpK{9q*9DV)$nQ?WXe&G8?{WonRk0Y zDh!Yj@cOsm zw~yCakJs8?hwH74)}xI_cSgW>M!DSOl*kIt28&>?SN)aJ6@K6wxQ$Pj32Q_h!G(p|(Ju{(wjdr;q{*y&Fs$nCjQU1#M z@{lNy3M&qnugGVE8hN*)+p-OZG=Trm2M$V*Z+H#Ag%tBrq`K6�`FOe7Y)?}_zO(9GZ{+9fg2;09Fm%M~Ue*(DN@V15 zgIV#Uv`d|o>DTp=mcS6V*b^gsKpjOh6y-%zi?gDEC+8Wc;6H9q64iQ`WoSRG`HfUB z1qU~|)mq#j2xy) z+Co%SGL{c>Uy_AG#arKup=!Y;K$jC9V_qONyl`nt5{@{Ngx@*A(%?7m31O6ICK4?Q zX;*IYeL`^pYlUM`?%GE9EJ2EEYEUtLiC|)KHjj}~^50g#%=}l5jY1`W8ncUALaEkU z@D6P;N0`q4x-X=<4eR&qQUd;S0+rMJ3cFK|=2=6`;zlhhT}rO- znu#Gk+FMd+F)HEI$~&j?Xbks2L|k znYO5&rzV$>+^_`Dd`yMY6Z}saZolx!g%4su0y8z8q*pxz~)HE9u~CI&yhzgC5Nvz6GZO@}CD|c5W1&!p@31RVZ2zj!fre zn)a571o8>W7yw)-kH8h{U!9cXDd1|fwbI<=8lFM!7JH{I3V!Bg`Ow0Ju-r}?2t{ff zZ(dkaB+eCTUXaOO;TfCw6(5R4U*R#UtxFAPigNFSl{ z@Yoo_Vay!Vz?R;Kc~nI`xS_oLa!k3r=l-=))l$`S=WeL%oQ%Teyg=k$^-e9@Y^r#8 zVN9RBL0e1b(qqws7Gc$zEtlUo0s7@}!J^oE=a>MS#72JD6_=~=s*zG= zmEwb9p#m@9ys^gdRoe_#-YS{j6#>w`7Sk@TvS*Sdv$pYLpoG|e(AL%1e3wq)y+)c-tw@^t-9|MM4oO8Osx0n+}o zpO&;g-`r_`?zBI5+Mhe^&z<(?Pu2bi8kS$cc$Muxu>>9bNF1KX1^OZmPvdbsWp{^^ z42RDmIK`2ZGA#}BX!HRQK(+eFjo6S6l9a=o%nRA*mxh$*UOa9{4DttfaSnI&X)oV&eAOiwWE;v#*5vwvp(4%2++sL9&%L;k z#H!*msM4l?*XiF!^zUQ(_X+*`wBfV^RV1*o4DJT?&G=aiVq&1e>cOry!zBbJvYxJU z(w@dfXriG~Fx15}1ol`WQidFn5`Q|;C~=<1g?}vdtP4Q0DnF_tbJosU&8vIe;(4UB zMswvxG-A8IsS;@U|Bh{qc`|qVnw}m;xhKIFU|?dsjNlEVKh zHh3dM8UZMkbGXqtn8*~Kpe}IfKWu})_`#KfdLCz|YDIzH-E3Q`heXX0Il+bXrL{r) zajlP(%_v?nvG=hQ5?OIrPhe^3+|Y6Py7Uq|!7OepqNeVvAkPOq2_O7F4d_U(Wt>9X z;LGzTazmgh9{dVel33rLjUs9e*ubeU&|;-3v`@56< z-O2v$WPg8-?2l1!K{Qt@isowH^^ppssLW1Wy4MkB5eCw2u-oGLvb=bX+wQqO6yf$MFS^)q9OW zDagsynrPzRab)wt;8&|_9{WE{f|u%)FMw_*n1~Szh{@i=hnbq|K$(C23kHqr|KM*A z8oni$85;D4RlJ6m$6cwuVJlw`dfL#=hpyDP?8vKg{N#*|N+qlW^O ztf(&~{FWv6dJ-Si!e+BSbPX-C;Mc?T#&UTSb_CL{wSlCu6yS8Ta)`|2xQk%m0*8;^ z-qRRz>yAIhntpRgSAO^egA1(%H924LMI~fH zGb_Ahxc+m&RN72yB_wA+v-2(U%$SC9 z@lEfRS}xSxBsY_q*MK`G2@*qC8UB83@(i8VY$drYW`)Z+MOni4751mPbQE-Ru)}GF z`LR1lFZ!#8*h_Z`P0@uXK{lEo+k1`@5JmltL_z}R8WMvjr$RVmPKi~4x7?0C$*n`S ztkPj|2<;mUfi!w}B1I^oqrc%0+$hS=Dq;)ENSfh&XCGu0)$Y@tMM<+Kl{R%hKFTvV zvjuow9xD2h2|T{ zeP(VXU4OIOwc;ME>qCDN9&P&R;1%WgxIqSv{g>(5B6euHkkly9JS!^&tN}M#3A@@SW!$f}KHk8~(`#nL*>agAl1q%Z?t*uThgI5q&q zos!EjDLmYMB}uIHnq7I$i%)uwLdmxEG%@A==c+XBKDYRI`k&Ky%mKE(Y#-O?f7(yh z%kh6&Uq89i|NI4?lK#iQ0LTA%be9D5P78FW1-jD$-D!dTLM@PIlN}avaF*XleoyDQ zh5@qS9^>hBoN5Zss=$yM2RAv7dpX%#Yy3)iL<%1#6eb#LQ>$t|WIMy6G$g;#oc=h` zqKS(z@zjZw{t#ci|K=APN&eMV_ubCxtvAQ70w-;sQ-k)Y*FV9Kw^)<13*Zlu=~iX% zq6#0fp8WjXZ6WMo`Z{`WF^wjG-g;Rdkmqa^zi&VN#RgO*2jU(%+`r|5$LYafa2Nsf zaAZ%OUVtl^r#Mo$f`I?%GdoYgs zly{nPHe&^P{_9!v(b#hpO?PMerAI)SiEQ9 zR|682a-;OH%Ew;-|HaYPOWcH=&X2vvLI4+C7wRKwE3R<`6-HL`}ueB)sEc@=$I5oI%4g1f@g; zkur9D{LqLkJqTzQ1e7FNgAw75SL`=U`L_E_z|4k-!$HGS_1LjEQWi3xbny%uQF=H; z&r%g4$ z=CPEK8MvT05Agz#PlcNy{L^rvIN5;6&V>Rr(He1UJe6g;I) zI6`NwMk%EW26F*n&?~)MaQ)y;5#cJ)3RneJo4UefhidCjp32wno`r2w*%`!6x|@e} zoG;JX4yDQFAiQ-$E<^WOsGx!5+G7pFr33ocGv4x=#lGeub79he1Z{e(duATN$(Y53 zXF@XZL##s-r3?%eL1qgvH*s5iJZc7Agp4n)TV#GMi$w#0LW<<<9@{;rb0MZ*TP@CX zzNwS1X%n1a6Bm=8JU5gD-VqJIKlhb11=JOW@T*(8hJc506xA!9(NDqu82OJc|HXV8 zs|&@TpYyp!{`>eb#`-Yw-zOaZ($uG7FAOgRY$VYcf2??!#dBVe@d#Sb6#F3u+c}MCCc=t2 zt1rEIMbc*;0YJ}~CS4ODEpk@??{s9uPS9lE!~~1j*{NG^ZZ+)%sM_m#5w;Yt10cAa zgST$C+2mrNy=D_Q2&HL22iZhAa3zzP0FAPBY7>(Sw+UWAc+;O=O}K$iCau;H%Q}ci zXXCt=c-An%7u8=5f8j;YfGXH}&1 zl#z394Tf_5=SH1(O}*ox#9=EUBSNjitG{Lvy=0{|DZ6)!ea2t_R6iGUI_k&2LB z#a0AuNk&h8N#o&F!>61aRocu}F_tro5FrmpG8jB`h%G^#>C8($-o#=+%Z@UoSahz8dw-F|Pc!H8RKF6vc^iPF@cuYWt7jTthqlM5E#lY8t zCYx&N@8tn-7H&y5-R?5~X!>a1Bwgl|n%-L_DVE_&f1D}$MRBE~q{39{%Vsh#^nT;k zGb&DK{%q#XR1ve4g8Xfs~$8&LgWAFQg%{ z=Puzqa(hk%hxC>b)>BQ(6sYjI1ZW*68pED?rPM_bMN3zdfTaSE~Vnq77%ivJt zTE-*Wv1cuOT2Z*zpi8uu$#cI4qR{>JEurqW?=)W`+5JX^YWJJ9#Cu^?Z7EC03$lJe zxxfikLSagUMie+jjzrOtB1adUDSp8QY#x9?IGCZ)JQbD4+y)e8d?<|z?hy;7nngCX z3jAY=m9R~1J{~fa2M6i^3 zZ7@=;jH7HJ!AP|din84(I;xcsl)JQwj%rmX${jS}k6H;snIfmfBB!MyiiK(=v{c4P zPP2r4Y9(~!HcQy2RzgRGJd@GzguJTWj~(&55N2g z4j|X*|DND8)&I30asKD8TX*`uzu;5S|5+HYDnK^`*yGlX{6Fp#fOiVOI|bmK0`UJK z1>lYSKe~B5L3znb!lTU!=MQdBQL%&t6Vuc<{2`v6#M3kjf0QIdPyDe0-s)rUk%B@| z1BlsR{a4u<3F$bzzxx>F>;6+B67Zj@#{*PS)<`{oBHiPc$NO8aJ2Djv%nLxX1HXQN z(rB8;IU{lBdz7D*^D`qCXsi!2m`~23N_r+ctuaY7S)B0)j-iLlTo33(RZ+RQ-;i_Y zoda_KJ5q0iB+nv;g-^bsD3ibk53v7S_(Zk>#+~m2?->);0+^2a0=p!#CLk6K!%0lH z8GN~7sh7yHSW`u7u)U4dG1^0YVCT*S2JY1O5kIlN^Yh6dnTkC(|6q&Jc>J-xbo}~o zXZJ|``N@=$%QS+TDZI1>UzaopnUmU3;yl!)O88LXFUvqNl#1&PagT>z4v&;^EMfIi zK;MFmud=lto@_5QWz5nHa*X3Q6SP6ME5b1GQ2M4$n*K;0wteGyUL@F20teo6G`yw- z7Y>uxU3=)$Cib{~#TFRY;)3C_SHXim+Z`EuZ(n7gE%{e#z?*G{;G`VwXf z9DPLaG^l__D6x2)25CsobQ(Rb8P}^8z{Y=YBap}_cvi5w;Hd7F#|&RfYw-7995b6*yovg<*0jj@yP&WzGo-QRyt2G3Zr z>PkGaXIz_Vcwy;GZ9gboXp2{8`sAf`!_|2UYO{XUO%H%6-n`kMKvwuF%H3CPcjWsx{o$C`c52?KECimbI`W}^;OF1n*IeDw)na6VJHoy^C|jRQV{&82;%M4Gqxkn4 zLWTmp1hpTIzJJm?+}hbX-s*Msw|nT_(LLUJeb@|YD{X)~BUx5@1n9O=GDOCa$h;3o zJWvGI5JrXM%&JQyv~WW+Hmw-WM$NE|4}ehRdmeprv|&NCED8s-*jRw}xKLGOIzWj` z)O;{^kyX8UW5NENYe@?8ALl}=ysqdC-rD_S0*sk|15Pn@)A<#DsVvX2=$u!I?3S0I zp8Sa2y66D|$ohQ3zBqJJ+*A_ie8<;U#TBjqexE1TD0pOkm5F;IP(>6b3Y!RZ@qk8U zUpbG!vM|zc`ZSU*`4u473t2)&g`7%|_1auv9D08AmQG zLe~=)cnUWd6v|KYr7zfOYc6=xtjyj3rjm0=aI#=~=5K?pXr`Hf^-g;_*GajRtF z#No5y#wPPUvO>d0Q?{L$#{ZlFGL*o@Ar6Q{dOz%Jt36(!(Re(NCShVguRU!o!++mw zqQc^v5LnS^HmBw^hN~S`hLU!-+~B(6mQ{7dCclKw*=I}q;oMa|CA*wn{vq$7ETyOR zSamqME?hLt{K7e%xFtHrKOLg~d$+g!{dRBrXxn}HL+2-b?X}7`t@A|ip7X>-ElT7n zm?G@}Yu-CN>Yzzi@5L4{t~(~qxmWDy`(EehsQ0q7-#Oad_G3>vCyG`G={bvh>U^de zn}q^qq3VUxz3#}jUv68Uhi?4`M%DB5f2hv*%j3VH%I|Sm z|JT0D|NU2dO8P$o1DpbA{WJA{ck$ou^nZ8yzdQZko&N80vj7PqE-L?gP2Y$3ima=V z@PT$#091CjSGErhe%S4-v?U&W!IhyhxZHveavBnh=wTA7?REBR?WYuI?J8#sIu}*O)=!OKS-!NV${?pJR{?pzh3rXB4%A3VNdv z*{E&Y2w6=rSIF99DXXI=fw_EPnQ2)ga*d9IUo>1c;y+){u~22&Z-K0Rw-n^ zUXcDDEZWyU@)Q+tpNjyt!^62+ZMse(l{ujhZcuMVGHxMWIU&M50=&G@6G=1I|QdfkF&YeXH?yf zaJjSJIW9B;V;JB#26G!4xD8=^*VE)9Zs*ur<)#p-Y}UyOfe@6Z{d5!x--A#`Ugq)Y z=_(M#FM7K$BAO;DS)?gm`nv4!gc$&DNA(r5Z!)#+@lj{%b(dy`<(c<0{MK@vA0U;l zbsg%O%WXPw9hG;emv+&#&{%n%MLk)9k zxeN@#M2iZuAV*x-LM#qvttD17&;*`nXceDA!wkF3=;%5hLSJT;DKzZjwI<#Swuwfw z$)?G&Ok^T6XD4{@&oo`2;b*wnhwJXDXMj2|CEXlIP+pK2`3R7aK+r}|b9ym+pPD_? zOS?#i%iG9g+{3jO)=caxoOWBA6$ZJV{@|{|04~z$2X_;1vF8Gf zPaow5w%|!tsN#vR;85}*qr*^r8kt6d^N5|9BWVh=a1GXu<+Vgh4W<;J{K&Zp-&J3N zas&EQhPep0DIjQ$rx~_}$4f#^+MDuerXv1PE}djra*m8frAr50Ys0gT(Z~^OlE{{= zAsR)nSP^|aFXXc#9)^wUQg@W{5WrE4Qc3`h*vbUPKby=hOYI^ybC&T2jnBn9^Dxic zC8{2_hcf0PjY6yZdcji6J?q6a-9C%btke*9YLS7dq(Fxs&o*c=KEN`XoYOsF49Z9^ zeKjDhj~rAbp{*Bh@+j_-8j_9?u+pS3z zEWYWS(MdGT`Hg&A_pP3%IlQ93>;6G*qotMY{C9&^Uu^AlJ4LHMf4Wh-fwc<{*BjS1 zMdPu^f#^=0>3yAsEFq1zSZ>{xTXz%$S`|m6ufu=+3#Iy)%0-rdS~QEq<8R$|yo$_j zFl1Bo-!N)CaouwImS=Illq1n4LH z$z_NOWI_s-dK~vP2&`x4XEjKkMkp*Pl-y^Yny5(1I^{h5P%*tLo~WO`flbF1Ku3)} zBh6>w?_qs=>u3j)mbRMw{hPyl3ctcno29I+m_3Wk=$LMoW@(>ntDB{FW)FeS2&IXm zxDPbG{D2;9UOiiY^Gva0aXIJO@8R!e?CWOmNMJ8PkrgZhr+s&O3s2KZd+8Hul5Cas zx0O{6j&}c#Qv?2!wRF4ldTSLLF1`Fj(eO17@BWOYS5wPCvNc-^onM&JD+qW2VP%5t zvoy`(!q(OOMaNhJS;MY;IyCib6(t?nKrLy8zg0M(VP3F0<|VACuD+9!G>r3!{l@iv zgL*PY_(89go8{bVG%gWx+^=k$QkkhAS{PEH_rLwJ>KDeeVanVtY{!$g+%Fyi;(fQz zV&HBID?Gs<--=FlcT8LjW7?=eR#9N9K{c1LmU{$n2Wpj#INHcUDnYfA)pf>ft@og} zF);nsY>`Vy$c9RgZ(^VrYhw!Qf9r`Bvefz_19Y?R#v{OYTkbJG2CT6Q`0=s|N}E1P zC;~38SGn5eeAxEeS_InjL9`k?D@Grv2je2JEC?F0ai>pLD_Kg#XO5gdtKx~f=13JQ zFFH}Ctd3m4C2^%ipE*t(4JSudJo)?Wl${AD#Od>@F*s@rf8J5aSn0B=fZVq*Lb z#LmHFI~~OICZ~37z^WP-{eCtSQ-33So5qrsR2K-%i2Fz>Vn{AQVYx2z5y?3h5@7^bq|>nl14R17JHpmwxQbum6)j0I$X$LN!9f_wF?E+nBCGj z#!laB%AK5Bw-MAzeYV{38zXVImO>59rm`ce3@8JtB?Nez!a7pIO$w7jNz#li&vtkf?7tJhp1NKC8x9Pu5n?LmoL06yqsE-Y;s=V}Y;?WYRs1)$5SFMz7% zD#!dEEb#Q@e@INgef-zP|82J)KPlONKWg8}|Ne>(Gp_{^paBCG0zL`9eX`d2dad0G z*V`NIZ#G(Adp^L(vX&%(-~K5Qz>p5<`n-)#I1wOG0s@5z`g8E>vzs zC?m=D#0k!nT%y1y*uuqG(m&I5Yr8uS0MABnd{1JSjd~Ens4z>~I5nB~&R~nM2xZB` zz(nz2z5)7tgK{U7Fc<2<@#=MtceZ<-{U41C>Nq)%dpYHg)KqEmh{73hIvJ#AZR_}g z8upvW=}%GKSS=WFer1~ldjqb>mIjATK^9J2D{lGSvlQ?eXkC7FNp?BZ(56@L=Ui-V zHbP}73bqbd$@tQ88~oGydD_MX=p6plAgq5SK@2h6mFb&!0X%Q8Wc5}fTydV3o08Ep z6|Sa5Qo*D5i!}}8`IXFLa*ek8Ra#Ow2QQNGz~2P305bJTro*#L5>^;071$1G;bv^d zf-U!^T^un?Tx02`vWvi}`4C78!~Z_xH5$WNFlIAkep6m=G%EBTXk4m-`BrJg7J`xu z>ndCePqOx@Y_L z?Ch>4{=o8Poj1J|#)I=61yNf;665%Q0*1o1C{i8lBF*9o%%C!=PxF9zKfbsXEK|s; zqQIlXWi~B_{}X`!*5aem_-q@G)>(9oN zYtLL@wgr&G^rg&hJdPr8T$14Y#>EwX`7{i@_kjCZXpfMG$pJrM_P$^~Cc7DpQ(XYf zC8zO6IjQ*73MLs}S0HQn@7bj4*26najut)^O-4NYPDcOGt z46x+4T{8b%4?mEExmTo*E7yo4xMssF` zX?zabm?={S8$!*GQ`1Ai+OM)=Uz?%N2F0hCCmF~tK% zCLWP%{E^cA8a{;hly_95gRg4KR04Sy2{@EOk)dY(EuWW+xYc8}9#G-UV44-jm|$aG4svq=k_u z(=^S=hYyAX>|FmW83C<7=6Lco`U&5Sml=9>jX_IAXDqjX*T~U+0tF$!u7olLtR2|4^uq?gUEh z?!NqSYcGI%cbfCzuS;S&T5{U5y>xu~8=7KjYfVbk<%6*zBFo?b0Oc6X15ql$6jE4v zbXOUk!obBlb>hN(2=YNj;3Mn9Dq!4J;^4b+?hTJ~Zq(e&0Zu15OX>J1);_WSGnTKT z#G(;)2{%BiyDzu)j^N6&YeTyr#iCI(JrC=TD4#>^9gKlGdj+R%6r=H=gFmPUfe{a! z;YhxJ7k25(b~=;YZ|J)cM7i^j>Z11GUkpvSP|(E@{Nbe&m~zXM4=~m;V5S|O#4v2Q zgt}MbzN}b{en_Pk5v*Rtva}?*LTNGKOK;}|CfBN1Gqkb{>&uNg>>#yJHSa+>junso zyLp+r&+R`&{y&{f`|)3D|MjT-HRgOU{QncO|62e0F8{+{@u}kf1qL|(``0BAz@xha z5O*?wI~l;84B$=%@TbZEEGC}g%vtc>+#O@e@+|2Wyf}&LKA){^17_{AD@9 z|KU&{@Oxb39ZY5}i6D@!>_=lA1nR4IQWQOK3Iwk7A-?k3p!BEiljZml2fhbLRv*Dd zGf2;@=JU!S}mry;*lW<_>GjL~*p_qxY;)N3v8;qLx% zt=9G)eSdJUS6lZU0TcLR?UCi(3b>fCWJb1r*=&LuynzSpc1p;|)i4UnD(> zrm$ErwTz0*@?^A@V5wCBifj#CiC57Ct_}ddym}t>F^f1g7-8O7%;%O)NhkqK9o#Z_ z*AjfJWRtj`43mCiH4JwS2!$eweAz(+0JveN^I~^@7ja1UUciB5Ilvga=yf|sKX#6K zfHOLwvF9tkSlVcXlvy%dn`P6rlVrR`KpbwgmYm34)abjTo$q^aF}yt5dTknXABIa_ zBbU>`NvRPYK(`BHE)0sE6`O#Sg_AzYD%%0{c+@-GI)3G~WS+w0u%QiYal>tzf6V%G zM)*_rxbwQ)w(}fD8t45#+C%qMXK$~n3wi;4U}M=?WfPb%vAgx6)7ysocK_IGrSPt5 zSu5Lo2L}airWd;}z2@v=X=#+4a7)0;!2eemzg0H5{ptWN>m#o{c~;Sw;DO4PC=JH` z*6U7%KdsxkDOaoV_pZp^v!r&g)s0kFD8%6NN4c|mRBjC(mS;R4vMU?%-qe=X^7Bb$ z3qN#z>b=v)y*VQr~;eYdya6qc(w&*#(xGH&PKb-AYV9A-Xa&R^o~vYMq!HtvTA{{ld@!ZEg<^HM~g)LqfM3LHCY66@TA62zjtXODQs6`yy59X^oIVoT#rzi<0XJ|{BocqgL zAM?UlB8#CA)C@&Rfad-ZI?$VwE$-~NrD5q1xxd`O*kX1t4$^~$Ea{64y>x%M4cTJ0 zAqV$CLmtfx8@BELt~!Zc6`5T72~3Y7l_+hz|K@cMY6Jg%@a72C(Znoqu#*j4;-V~y zU}D-iNrywsD?e=1-sK1M{a|Q9NHee242KPiRr#5=cN5HtU%8vPNR?GSQ!{eZKM;pV zzU5XI>!SC-i)Hv@8hPKF~eTmGCPxbO#W=(n&ntiJ?=3iUa3|*+*@} zlx(;=NDUmtlQ_z?1@o)234W_>m?jMTa2xh#Wh3%hTX{s7ogA6mRq=n98uH3(Q;!)l zk54HmG3+IyXYY5ZCAYjcGkoF9?9lsJ*-T+()Cy9`$vDbm-e;KFaq)@4k=jM zebEx3gXlynBRX(?mD;jpE1Pj9_|p4XnxIqKY#m<%@Rn6oL~rP~QUgvw2a1tz@9w^Q z^@dDOX}NCFm@Vf*v@{0z?lrYWUA{=CD9T|v#`|4bEVq1VxlBk3xi-y@QZuGxqvGD) zPR{{PBzpO}zbhNk_f>7}(;dt0$aix&xovRdoB}m~e2KJU?o0dKxmUC$wt>(x4SUg* zZUP}D%eO%RDX#s@QD&;&^3~wsVfL6r0p&Cu2_j}`_DOseeN3R(Vw_BcOGw#tAV6Y% zRIGw2>ny+$i75a)m)^;jii%i9>bL?AM1FBTn=rA?Un*)-8MjNqfKttTt*Xc`-KqrU z<~+=uW}JKd@!Ih)^=suo>7@g0B9?(RP%C#B@mZ9=RZVCyrwt>J!I4}6({+A>c5Fd+ zG*2m+p-sQWGB;az zS|BE!NK4DPX#*zoBfhUmDO&~=jpI{tq`c_y59c*JK;xwMPg+i-CgUYcT|PA1f{}Pj=)P}q&ShQEpmsl}<-E`9XMBNpn1D>_`6@@YsL0 zy@569W=+fnqd${@ zd|VybV$bVI2c++?53)juu66f<39?(0bn{QB>hKFtRfvRaHWGQc~z7A%`%03Lwr-!8YZl&!F zf=s4>$F+lr@-(rH6?4cEEdoR5p;iA`tj!XiMO$pdc0VWR{ z;lKXHU{z59F7AczuYmHQfSFYb)E1x(=XB51GPhr=?0q;~^m?4m@4HpKA4u+Qu%jsA zIygisy|A@;yGxHlN|ljGJuCERIXJ@4j_`@DqJs(Qn0Ml=kD+H-Z*hz<@j{^}e_vY3 zlqEy|&?XXn)AN+-bw4B%=n>^dlO|C(cAM+W-R-4SD}2Aci^7gCt@?uZ8#bUj zzqDEqkl(Dj$Nen3zi!xo!x}8x?>DThu&}i3sR(XZdk#pzy|ti666(`>dFlXLeLtnz z!fc27;p*e`77Z{yGz}0)Sx1RlI!#WKaWsO`{Y`x#njhyKdTZ~F6LTG7v`whd4B_98 z4YtLg7NlxKRp3U40b#u)8o|9o!Fs$d@y4Ti?$eL_6dI@<#fjf5TdtQMJArh$K}*hR zHXm@Xv&R@6v^3>n-VQ)-ZNeyh0ZpiA?(G`8gT{j*wT&)9_UM ziv(2)hHK&g(WXgL#Y4XXukA0wA%s%a$H*KCso zg#3L6+<8_W%TlP|A^Ku#tJ}^??9np1;eD>yEZ8eZmjt9{y|Dqi+A{snfj=tl@ePID z)&)O#Kj_W1y)FUNL-PD&_+mjTbF*5o$)in%6#D%b71b03!W z-FfHkyYu+g`)=m>9L~Qkt}{d6fTxi;+gX^7J$TyLjCCY67nYfdqS zc2U2^L9>ZzGjWia+bx3oSE&1U6>iBdt5}jaI#XA8mh@OkF*(^e9|k3tulxG z@F9J*5Qb$8v#1c}OSsV=scGfqP0S^0-g#kTL^Lj)Z&tiATN_%M(1}q+HQnaDX!_2b zKNrePiNWLw_w4~HlRKSr zZta<^+b}W%%r5BFU`cU9Doqz1UBgf#9Cv-y53GI_v@)nNn9YU$f)=S+sgbfcx?7Mp z|FN$9wwl$VaO(WC?EifKuSp-3cV9XJ%r)^}9)FF#UIqWJcKhj_|JPseDf@pZ46yrG z$@}Z^UH-p2=dU~GuRG_jJLj)I)%lCju>8{4-C;NG&!+Lw;dUW7`84jQ(?KcgUnt&R zY3BQc!E@*U@B7Nuy)ys4HVW+ zGardqrVwiesZRbqp#|op`_HSg{#V5Wmx5CvNsx$3Bzl;Qo{m&IOeroTo0=K zb~xD+#VDP#s4^;oWsTP1(f`co{Kfgd*Vo%m9~bHW$6r6Wi~smnd`k4c!T^!~>n)`J z+byL3+uv-gf4lMMF<$7Xj*RbEfIAl8js>`50q$6UKZgZSObl&GW+3jJpMQ3=#VUrN z_Fa|_l5}odM(1HXosOxX8W#ZT5howx!JBN_wwZMb$$!L*6fLl*fz49Z9-7o)gd0Z2 zrSjYlKesq+-gcDt&u|#!sChCfD7e41*G0i;=eP%lXTP_-_2%WPV=7$^IrpY})NY2R zT|XhQ(#XXP2gVH%rBt_Cy@wC|rTWBiH^Su}P}!see4U+^hi*8P<&3FoGRdireWI?8 zY6#RnEX~Fr#_7eFLtILLOS0!@iTJ@7CG>+v!K0yOh0$VHF`Q#%K@Z?(N$KL42h$cB z#m*!d6w-J&;~_1G@D-vvF*CEPWx1G}Y!a3eqYr4(4qX*(Fd%pZ9e)Vx4bS$qwGq@r z$+Jy?CF^P#i4CcvN=YpPT{Od`6{7Y@6XTW^4T%iMStEQxs%Qz%XKhTh14ldTEZGJ| zT{Q}62?R*v8O8C$v(JTbSWi7E6<-3;P=B-kdTSr3 zLzDDbx9`DM*@F;O*h4ogpbP|XVGTtV$;a4rY?O@(ITGWbNre&#Nh_2C#U4S*BEw*} zQiBR!oW&^Qhz3{qb1kR{56NJF5e?yx<3OZHd>QvY@?yVl{bE%AuI62a_!Zn#(OB*q ztOmpx#dAd6lhh~E+iRDZm-whtT4DoeEA0($2n3Aiw}G@UbpSV&tffAvEVkF~x9DgALiR^lDtCNQh z-7P33Q>L4os^Zbg0ko0CCcP+?Y~!js=LCbd0-O`XYe*oepAZ=jRa@fhU_$_#5VI59 zxUCZk+T@r8I=gy=LtA{2I;E+p>PyK4qP2ZGp=fW`eD!U;=ys*ffcHp7*Wa+$jZ&;U zJdn>--wS7>5g4f=e8j|q5UrMQq1U?njGt4t=}fxs>?ja+9gCCW+XuX*l;=(;eO#5n?y@eP}mTs4c#g zHaBsZU_Rm%HmKvI8t5dW518r%Hf;BujDWBDiwN;?9siI|&N4@|{hJ+3)eLG2EAw5- zi7F)&mF?ZDjNj@jusiC3&;rJ7{{UlV*+Dqv9~FBu#jP2WMlhJpGUN=*giP)oI~EGT zWnSQ#(G9AzrhcDUkY-m3dAicZ{tNHO>sE)6to)iNY7#v<=YUb zh07M!h$d8A(InOtEfXxWaeO(UVEm&ir)23iDq?>?eQvOD3OG-H&nKg#Px7;qD~@D; zynRSy3G&UWVR$f>M78jmR0CO4EPyG_I8$?JA4nWvnSp!13NdOCUVZULOmC=N=F@bB z{toap!u66Krjix7* zQWv@#4=9)&>?+I_`QiqF3DK#u2~0y`B=`Y2Rx58=qyXfSy+I^*3}LY-kh^KkTuj9@ zyNtq*k2+hgyC|aZa^s?8nwWHtqh>Ew6o*J^FR~{ZE-*zh_ZWT|4vJbb@)0EiIxUEQ z#i3Fx+}M+>V!TeD<2c79#6MOFpa%k|t4WMGU5knpeKEInY;W~Ex^xF5<1w${C%l7y z`B~mOWxZB?IKUhPP^1|G(SC5;K}Dd{oU?j47!kH zqAFNg%FNG2Dc+U-1_%pkluX5~X!4MxZfPu}rSkBrVz!qlWfMU`o$4=v^AaY-nopX> z=BAZ%6NKOy^267gw1y_9r<2Lh!KJ$gA%9KA;X8_XQ_L;O+}y!oXCM9NJ39_P2Lr?2 z-@394KMhsVL}7i?teJljBAp+=(E#^Q_#I5C+{ZSF-U zJ!nuCDee)i23IwVkV5zMd&y4VtYQ7DtWl8cFxkWe1vy|kcP8c_*gf#KvAD4Y*eH3c z+nKTBtws`tW&sd-fjWqk4sDd7ZinR1m?+X~@FGTiNs_T0>}g7eI;Hy%NbMBgpOaD~ z%HTWPeC+rFy93L|mE^9vh^{zsJF8?YjyRd7AK<*;i&Y}aY6e^>0nN_BX*#JPC|iwJ zj)iLK3K52;y?=yD*{t7>W4LygP-Mt*2d0y7x3whf$o44BV%<&id=t;%Z?lX-(2_hu zDN0LPT}x8AB^G6-xCTHIRgWe3l|CVRSZzesau~R zJjF1BhAejF)w^v{u}CUi>ds+usG}o^07>h9Fn&QY%DGidqK{#JoR8)eY=#&z<@m); z(=L#TZrVx`o6IZpR@cvkCx#NvF`qTi4~BhNd?=%%-3)!1Ha%>V*8G#dS;+GwOf9N3 z1Wp@;o6+kbxv{8|rs2;@`#GCICjhuuT+pLs6biS)D=Aw9A+KI(VmE|pM}Sv(Qvz)& z;QRT$u6-}y&0M&Dh2E+S0ooq45oGC3ye<-@!tNiU{^788hbHK&*=IK8LZrZ04pGB(nT9yaX2J7k(#$(?x92m{JNXXeX7DzY)%07Fz#L%OpiwLp~& z<2u2G07KPs>J}C40UareMMc+))WJ3FyF5|e}BP;#ehW$1Gq<_c|5SsWBwt$jn^^ckZLNi~$A`o+bd=aC-s$3+-E>L#z zOIZh!RQ9tB1a%-^$V?EL`U94NQ2PrR3qng@$X*a<^hHbt(R%HRSPhyH%{LsBUHwAl zgV55KupmU$!xu0jgl6X05i%CNg^6Ie7iIY|qeQ#PC#T)}bxb27_;*afUNy$VUj zYkCh+&$2Zhpx`U)=IN;aAr8OG_{;w%>1WC6Nj&`!kK(JJKqv;Cn&M6O;4F z2xbjEtxCvvL0> z_L{hqWSLpgksGh?{e#}#R`+=C;HAw zJD0b|uMZ{fOUS}J3eVfa=QtDT&J?S8uUV;IQHs;#L_jHDaE6<((%=5goZjE~y}v2+ z{-(0`H%{+y-lwBBx96%o+=E{_8gDqZr0L9*t(A)Cu*ya4st8;xQF#H2%5jo4iW%YY z@lRbdLTTPSlWF6*EKPfkv9UrE^7%c~zyX;i2FUUVb<1ShDH)a=ZR&YU!0R`W(;sIR zMRN~n9=obRi}43)-3gvsTZS31hR=$8$)4z9IEqf;p5Z?u{G(yl5XyRpjGE!{%=wO} zk&Th)=@`&WlMpd|-4t|A?tBrw z_t-;|jMe~+_ZW?9iA%xax)KN$^j!-eCU%;LxR(L}ln9SQKU9S1_q5zz&=c4#0S+FinAw7_itTi@|FWv-m%|ZV902@eSK<-Lh#! z4L1xO>EV6~TSnN+LLrr}5pwI%3odlQ-x(9vYW>-C3W%qdlcJy|(sFExks%SixL58$ z5qtLc7~;I9fw^FN&?Fy2axb%S{+Gwyb_xZByBZfA44oz3gE60`6~_IM-) zYgUhBZ_Y?ewZcdY)-8=h(G>TdbMFTASNERV-V5tElF=vQIaNnxWu5UgmpuxDT*TufhgjW z#d>vfArl&fF#*zSShUC|@7^=kOpEVGUozC7>Sm0LFsdAI5Wvb$`7-B}xN**YBxt=e z3{QYV*XOI^Ct}9I_5Z(I+Z_Qd5JlQI`@Xi!d2=V~Y{AhiaTXc1O7P4FJn#{LVHV_K zxHr>M?zw$qOH~~+s<@{W-D75`?oEdnEt=5cTnY>pH<@db?%6SvwvIS63u15sV?Vkj zw27LzReWfEhd;x*=>aG`pJu~z*9^@OYVyuD02xqKxzO1rdR`~kI(389 z^fp18bf(FdnNqXQo>i5B9=UNVr<2b6X!pZq1)Ew^bwNA+p}cSx@4{WYw?_y2dq4f_ zptp5+*xBDP>v&PIj^2bX{=^Ai%$e|oop9~bT%;ITT&=`{F+)_t3w*O_AIWALHefm7-|y;SyT+VTCXm7*iqqV2@@C9O_25fZAq6 zfhFCgCmtThfUZNh6+Bwu)SzXmT08mgc$ykx==-CQZUnR_1j1;vIvOb=DGIVGD6{hbqnpAhNa{TqFK}$7V>bC-z2_h@WNR5qfNeTGF3;)Y-)XfT)s672&z}_*j2(Zm&Pv5Am*NqJ-Fcgs44O(PCB{W;Op1kmAfcz$>4c38B2E>d=8kY+;%G`y_R;EASO=&3 zD4e9Mj~&El`rBlobH>&e>_dLR~N z_$*i5bLI__bBwD>m~_W8NreG(CX8m2fz*@Lc(ti7IbxxBm6drVpH${706l*i)mqlr=ZUGD)b42N}@3rYqyOl+q#2%QIvJ3@q_ zv+GM!GCZaNK`y^BFT9DY9-n=p4-#r0>^7husyWVE76j_@&O>nY@=q2moU6y;Ts11orkU~W= zH9;p|k+sQWhRJwf5L-3=YSN4w9zl%v1l#{nC)5Ik%pg;l!abw|!utRtvMP;?d>&sY z)A)2Y0xBPIF1|&>G7=~D<1CAim7T^jvH_x7g1&GuY^I(JkXl1B2`?0)ikdhHrWdg# z@j8wfm)l8`gr_8tab~SLM=iGyFDusF)LbvDGZ99yX7@u7DsQ12ZTt-jDp-33!*hwy zq`pYzLOd&GR>YTNZ_r@GOaL=XrbvJw2*713a1mifD9o0f33TwzVK5WkII0?rvQ$`{ z(6~>*L6&{Tac0J&>;gUV;(=^%iqtJ*`x{ApZYb^%{O57Bu5^EC3CjpB!Y~zOaZo`p zA~F$|dDKUWl?2uB^Hq08K&dq$tS1 z(03uDQqvT#5?^+Nd>n97L}pMLob`fui&vj|cXX#x+$IHOil=7zXrvKf1mcc4h(|Gj zpdtD6FjJ~A+mJhtVt?2qK{i7Vp%Iay81$iy*{a$iA~K=9|J?@NxBOJv|DQ+WFWJXp z`~UWOyZy+q|Nolo{~teIzq9}U3qGqqFU_(32Ov=U|0it!-(Fv9eH*sF-e`TZ@#q_4 z|Bp?Stp6VutpBkP{qtq)|FNY%>HvUkd`zy|=E`7%xb*wTD20JEcC z$`1hB`b0bc;D{)L?SUt@4b<}wow!@_(Aa#&7e!BVyaM!!=M>ybkrrPbLV72=y z#IQAin%w_v;sztRwPrMLc(RZ@M{)_%?uPwQf~K6*LieZrgTwAFoPh6*y+0Z#{yf|@ zHi|zF4}S^JOc5T=3J*v4(3k+q!!vwn3<2d~h7TQ?qddOE$DXmiyvXr|u{D&35&kpy zCBTswqrl-IO=YLk-9FkqL@*3i4-c_SmuCbeSd=I}3}Pxqt3pdgF7vu*fxBoJ<5`lj zWvkSzu~I*aNF@;G7;?gsI2yxkly{ENFn2Rd@<5z5C`^`RXbrQMO*X&;959-dEWa8F-%S@}llI0g7EUd{ zz*r2Jh2}INGveKG0LSpR*_dubf^=LSK7z21oRpOX#4JA*Nghn1EGP~{xq)YKKv$NL z4clreLDt3b$$P_2=jc?gt6* z*ZBx1ygOtYY>ab*8#g}HcsIdSI-5!WHyl60Ev+D9Ga9Ou;O7QZ5L?Lh<}#F^4*<=b z20qM?a3K9aV#f;#d_zhFh6mbA4!AZdoTqI`FEIiV$(${T{+XF@!6C+zV*vqES7MmX zqXG(V<+6zjhETPVHyo>X9KIfSv3n=#hp9xW5MPq{S+g)BHgo4Sr&FWG^=Oq~4y=wD z(8kAPnvPAYY#2|~&v~k7p-(aqMjZx2!e+#yfi`H4B?CANHO?^UGO@Y{WZI(wrT__v z$)IsH$QQ+kS<{bld89*so~wjC-*ka&pi%CQjZ*+nt0Tl|u!~5hVN^391jiDL}DEzww%0g^FP9pEx?W3n_qvV9xO>=txj!L*7SRE#W1yBG<&Ifba9^AfdY#L{E zK-U4>Zo7x!($B;1S1xd43zyqcz~|c>vS@7Mbg%_W2`hV^K?LdKH#TJqU>>4Fgy14- z9-yB#oDE?SKarD$LGo%30MxkG!>XOZOlB~<@eF2_GjQCC{1FB>9HG7DoY9SBbS_CC zqZ`CoA9x)>VuW;;JkpKDOd&<g(gZLxz9yoXM z)~m;>r>iI;9<&i;sJ-ry(#!Z?XA#N-Jh5WK8M-gOdSAjvV`TSQj^>`6-@ zce6o#09Ga&XJ>l`jNZ*CX$pEj3}Su`2bgYHu}-W%;_#KoE>0#f?I6&G#E_zf7P^32 z*V%|O*$9^mla0Wk#JK@lEJ6DTlmtZswKuU&=pxGKGGGoHY1bgqn0{DYuCl8MQa401 zk+E%)FF?i7OtsSm>I^iKf%>H3QqYM2_f1l?9!xA82Zt^=i$1YQd8s)*QLiDa-5xX2dR-{}-u7OF$chE2m2yNF|jUG$s5-59$D zK^$i?o=aUp1)>(9%y2exmhn=Su}DfU1zVW|?WM?IESqZoK z#R$^5Y^4ugPFZt0nlok&iJA!tRB91dp)~_v@6NCyXBYy@f^1GGFs4v8%7r*J2a9U5 zG@K8mQyW9~icj*II3x!y?aP<`Qn%9yxAwXRO98-Iz1^Uvm^&I+_3K>H|J|a@yU%BQ zeEEOc{}AVYasI#7)33iS$^RdJ{rJh9{Qocbl=J@y3{d{RN9FwAUx%m3Xb?wt+5hgc z|J`N(yUYG}m;LWg%Kj&K7~1SgfFEVh_?0I6*4P!AoZE|DY)pQgK-f;W3zN*xJ_3G8 z=>YHfI0kk<&exK0x%_NgDmysQNHn*~2I#!1U1F^I7lTdrS^q3e;UdPT`uN38@A#*~ zPVFt=%pWlGU6+^Vb(DSZ>Xr*!LMz+T7_N-sI~!}Z5Q@K-jBEJ4hd-R;ceQ1<^I9g! zz$>v7qfCZsA3BYJMa}Xa?Il^?u#Yb98-ai-(bpO=dC<+%BWxsLq>e_~#|v zX7ed;F-%gxsl>RpFT~tZtU}c%1It#%!?uGi#|nU~IQ&r9 zpcpIyh@{&&b|!qk3Z>|YHkfGc$zz;rkDi`w#yA6Qp>V`ayUs>9ea&0YLSvtOa7TFB z#!i>b@JZ!Jo>wg?V6^ImcJQ{l)J`w+7W-3xnQXSXAjZ=t_nIl0V^10u0WVvGOkqQo z@%`p}BrYexslm<&PRkhEU8<>@=&Y?S0qK9NwLBuE%q^$ zM<#g(O-s|O*xNvH5=d(MsTCjc|)Q;7fb`Trci<~;jr>+L5c`@eSkj{pBF zK4t!2VSoexPl*42y4HFWwx4c1dc5(tjq>I@=KqfQzhnOInEyNG|4(B66$ux(f4S6e z$oVf|{3&0M&$K&<1YJfRHgK4nmihaHivGv)>v@m37yQSe-fRj&o>sU##xMTM0eQ%v z+LYY)09cFfu|Xu1*{KkJWmXgr&Xok15;!VMr`UdCvnhs2evPbPp`75&&Y?if99aRg z*Ad|>@=tNeh=2o7M`#rY6 z(AYjr3axTW(FD)3z~M+FNExl+vWjqGc*YGGTIl3H`}c`40`(PzwOKtQ_=9d=9dwU@ zPuhDS@W*j8>jFI(PIOQ$6S6H46hBjdGpR7)^kUx16E-EG-NATsTur_aSWAOQp?Ltq z@F4>?hivtq%s4&SEIg-wIQyn)8o+^GX75|SteU|U>IfrNS;w$Ig*r9~=;CTgP5_Fv z9iHDb=6-K@D~GFLWJIPDfaRSYN>TQ9yT=YlC*p55PY9wC5W&<%5lB(?Va}ri;QQ$X z!?y?Cga94z&U^o9auYd%^`$jH3u}3QvQ&u}<_S)QgD)jCxdBQkViZLvw(Farlp7uv zFQMx^05|zw>k7xAD^YPk8CNqT@k6K!5z6OQ^DDrVgY*9yt`%iP^cH14 z@Coku7tgV?X5j0c`?%xRP#G=_odW*c%t^=kMRg|%ZeVt0D|oS&G*e=^HYnf zAWEmmIy0+U}U7HihRE1+8@trHm!%-)zjO zg9=3@fsW1b8Y}o59NwZr8E8*)?<@2gkz;@HVFzHq@3zk8L_3yF=Ys`nXV-n3Hl*YV=OQNQh8>Ybt6L2 z3nv!|+)1+$iV17{4ao0vavb&&q1QbDRQS*cq_`h=ux`R--s6Ti4iIq02ebTO_&Pp^ zImjS6z^&CXQ$#z>;KH>jvCXruGMKSDA;bQLI&Lo=3$G?uX_#y)u?Yvr3n5XjMo!Q; z6Rw#i5H}nZxVs%D+!6(f(#rVac{rjN(kA5Fa;zgCX@oZ{_2Nck1nMWk+NTI5a4@!Y?rB*fX`oSVkbzlcwew z99^sCp1is?g=fqOK_*q4ptdwp+i|O^OFi4`6)oAN#~r(F!+1q#Ys>owkKfBkezD8s zJbl>yMTRI9;T-`vHp|dG{%D0QBpq0WM{0fJJakkXrVbZk*uk~Hnt(bt!Eeb*-DN(&>x3W56Q^k66c9H#g?Hys_5l;f zY!;G4c6VQHzuMa|;dHx1yoPmo-oygEofmsf@a}TS-nhvPLh8%Ix(gPk-6e*C+xHPt$zQ)tqh`@~@~+6~G`cDAqEHn|J54mvL@u zxxG7C9Gs^OKmnALs@NvSy0pS}GftjR&K6+Gx}pM&1uE zxIt4zOX0fN?00U`P)COV)gun0!{3@=%3nmGOW#+ss3)zW*Bbeg%+Nzi&&Q zvzEkff}@of?UCu4CwE^5a9>8y@Fe?bX()O^oI=c@`HN-X`_rA6|3B#C$^YU1Upn?D zeiq9A+mGPcQ!D>pClUJNCtrVkC;$HoKIQnI0t6EK^YP`!>MDE8+!-!$(cfZjy_ zy^8>P7XkDx0_Ycs0Qzp{^^K!{q9)?!6=-Bflo78*89@<*GRK&h%q}=syjppbLV!YR z!F&Aj^9mdP1*^Luf16Ed?36bk_$8E5<5ZL$<_X!FU^V*E8==*SeM=@M_?Eu(GC|)RV#rYM+U_zXaahcN7WK3a`#&nwl+YsA8ZrKJM zs|i^zBREoVNnQpGP{Kx(d<1w@(5JT_nLJaR`VEUsXJaG>V4HsZRrYrE!2^n0xMd$b zco0&+Ib!m4jYr8arW9F}fnpNDLiQvmgsS{Z_i4b#`SWhrk zlv*dbhNQzWKFDNRaK(;Bs{zON)NMx;7GLIC2}4j#PZH>DdSwDTi7L@afOQi0BSb%l zv*1vV2XryJ(I%T15Utd^PK)A4686(vDClW?hSD@3v`iGb6%6j^gs~;`Au+Kq?9~`* z=c~b6ir7kGz2cZPzFYJ$0vI|$w5bC&MV!cfL3|FYpQlt$LdU_t-0-SqKec`nHugM@ z#tauxuA{fX+>r8+dF#8_+aCoQ0vVc(8|W@^stpLrVdD_SDL$p1Lq6UFk9Cd_hC^=< zxd>pz#en|eP{TMFr#sUohEj}^j~t9_cg#Um!+*|V0EdrBr1%;GHbVgb{4m16or1b4 zW}42F3`F2iol_DwGOzo7nnr_ul;!`M8mvo#H+sj9U|Ve{TylYE1h51rF zw(%fHheMn-?7(=2?=>TiMi9gpZCr-C@zvu9sS^Bd7)R)+FVS>|vk^m^i~FcCAW#vY zv|mE9)H#M!1?s$n+dlITHWT;BODHWJw+yWQ&0d&ylr}=y?*M5FDG7&cX}Km50+g z!(hRy!69sxGyEveIfbRn5--=KuAG!ZzEGC}8G+u8w5A&B6SnLEp;NM}(@CSy(=b{+ za=7SI6OiuU$Ij7@yPda7fjuY4H3E+@y0VlAV;7j3u3?gA1i2rP=)&^?``72IZ^T!C z(h|ZDQZP-zlQ`5#u9r0@eP`$gh~mN)-Y9;ep;1Cg5o9PiiX+J57V?R%!)ah%V(aEY z`g!>M&u%%6Hm$MCW%304S;bkR0Nub>!fX6>0Tc>`;bd&V#R5fDnYlMTs^vWDpHc2Y zTnmE=l5ya~k)+$6qV&2gE1_dMs9O~N&Ri;4Ljr0uLZ}n^1mdoQJX{j##aOOVzQ39ZQV}e7 zU$RaDP)kHy9f~t<^UxnUN1R=Z<`lh}xU86mTGMJd`;TDfTv0ScpzG)&8cAbp2<>nHe>k92@zgncITZ?;SE5GR{7^Mz{w<7cN(f+M!_ zT3s5d_97X;Mpy`}c&Rwh4sU`p0HACJa*hcTV6c}YQWDsueuYNP+(j@$gyINe^QX^2 zyX^wt!cWuG4thL)<>)+kRZYi2j0O@wUJ*ATG-QTIj&x2zOqFbwp|Ci}Km>NF!CzM| z%Y7ze=ZpfNoW~MsKAm2zT4Jqw!0{#A0nH*chjDskF*RDyKv9N40?wh0b9X$9Oz?(8 zwIYB{Gw>)tEP!=vs^A=&5nif(npbdwof=~+I&ta*$F`Cv4iu^0p zh90)}1v6H76B1Y%`o%~Jh=j8_)uqES*qQqzxi$Smjn;r-N8{CYq>F{V0n62N1&*fpo}TZ319|*4h&MS;(q}OJ|nUvL0uMowYmz`d(6foVY9!zi$Z&*Rg+{alwJzMVgW1 z*vEcK%nIC`6d(QsZg!xQ284_l>Z1`k`b~}CjF>m*iBYDzt%Pl5TYV{I#m-*0qtw7& zdMbx5ESw2~Ws`H9(Z7%0tqjm$d6g-9Xr2cnOd)eL4CGAV0U-c;Gnh@4n4;$>Jn%0= zcOg6)78b*k#@>D{mc8~I;5I9P`#VY_6gLvvK#MRPoCHQxaaF*uz^wxA%_$`i_v?ud zDR{e(ZDv}0cWc%GM}Yhp+iRI5XJ-o-nAm1AM+v)3Hb@^l!li)oxIzs6C(+z0^LD<9C!mjYUls-pe%*G+%+6762yLs(idP?`XHH3-GuXG0=Nz8gmo z@EPFiv{zgx&76_hqs2@WN$oO^D2;rg9`P06ms286+~HqN&x_|SbK!<_JD{GnAWAmN zmixpH@?m(A>dZw5f9Knt4%?lQ_S?Tk6+e zeJDd(OIQicapPB$L^oEL;3cLJ_Q$V60>BZ_M6mlLP-T7d5XcfvbU)ip{G1HEHpGr!V8^{ z?hYA$y_rp370F{q81c1=(g<04l5B6G1J#}o3hk#OvGB-Zy#7Q_?P|d75yD+YXlLAp zLi|CR`<4CeMDZ`28aYj5i;?6r#BAt$HO=~z(hQO037n~rS|bSKQ4!V5ne2?%#!Le{ zV1W|sAd1$TRRq)JB<)@H(&=fhwdzPTgw1iMX$WLZlt%hK!L}lRU=c5oS&G?z{T2II zy2f^v6#Nm!4Ks}Hnofu^@hV4v$G;EkX(;V%)o;dG65ww ztS3X~0uok(giwHO0HDqq&5%e0!BS3RSC#zUd}4!+xU9n<&JnIx=S|rs4m5X^chi|m zyNWj83qREmv)C;KVz%;NhfH`g9^tVl@qf4D|6bqg($Oj1|a2&Ke2-%u?i5Cx+ z8t8|)Qz}s7O94lQ5wQs&5oAh7S0Z;pRitFXV%b+8HSnXD*&3i=SZ9~yO;U0AR14h} z1{8>i15))Y9q{pEEDuNBh;`5aYZrS0dLVE!`~W|gV$LtgD2Ms2RH`8M9Z9~4x|W!v zqqt-jDDXypAkN8P&gj2TKN^$$6-#Bfy%o&5G=VVzPz9v+G6r-mfzIrr;a5nT#cOBQ z%P=K@(Q+)7KZRmGV5M)Ik~F|nhPf{Yb7!}>7aG#3&)PJ2nQ zKCTiXS_4e}j>7j-3YtSXGshH$yctmFKD=}+TbqoTcrn?dPGV-z>BiVCvfUyB0qR64 zqTqsd-#{1-&NgbO3LyGcPG%S)hh!Rf@gYHo(gKwHilUP#Q8}1I6QQP#x-bxL?W4TJ zVvA$}OToU>HaCW_;gUu4gAvEjfFqr$Dz0Z^$83`^9)OezC{{IHT@dv#fcuCo7Xhw@ zEPN!;L8M@q+K6;vRxeIcVLB0Gk{}^dS(G2KdW3APw4ExM5$Cu=LAPsrk%gL;5Z6z1 znSjy9jv}?m*P;QB22npOO)a4eD|2H_D#M7#S6Od9cXKAmz+g6&I5XL31fU9yeTl7= zo8yd3#8!8EcNYL!)E16ig|TEDbNzpC_n!XJ~PimqbryL=Up=(x{yYn3;C^=Pb!FXDOTw(xXKm)BfBw!;u|& z>t?e|7U&Cs3ZioG&i5`lZ<;Wj4{T1!W;#zltOf^TldF{(V9PR-byfev z5V7MZIUzO=RVp<55!s?)qL3u#C5PfeEWb*rv8(5eVv?O?YUj*~@5pLgnBw#A^eiX( z&$DI}g*uOfvqX-P|JI|VawR6^{o6XBp;pMZY2e$;S4yVEfshbI_6s<b_{| zLwuEqfdLBzA|oVlY?mxMhy_U{BN7m_47oA{P?Dqg?AKrO=`3Ca^b!69v=s8@D5i~F zA#F??AQK0=Ha%e$PlZQI^AWy? zEzuSA+3u2|V*^N-NwSK&wKbKwRe)cxGBe4DNFx-_X<7YE&B@e9&WhRFdD{R0W$+lR z>dE4E7D+LRhnIPUjez&Z*~8lFh|PggRs^gJV?g z0HumCc*lx)px6?;?S1zp<~Aw|*X5rM=qJu(BLP(;YW)UTn+ zX~<4mX^K5n6ua{pZSlCo>S%Ro&a(3k?ZFUn*|*GK9lHiM$GaZftZ9TPM4ZBu&;)z} z%vO^$b0`urMs%K`N;B~7Hkt+7hGv;LQhm-m*qK6&^ju+Q%jo1uO`pxq*`SC7G%7dX zY|{Rnj(3ylZEcoXCmAo_K}g6TB#raY)hf}P<~pLgodUg{$LB`hTploRRH(q&OHOdW z2V=wGQa5@~0VFYaF<%2Ks3fA(CY6;aV&2z7x%^@kqsqDit5T}NcOYF~Vw0;`x?srt zvlNcpFU*302WE44SYKoi$XEg z;ymK+4T{%wW-NLOhZ{L5^-ICaPUW_A;k6)0=B3?=3A_1g!afoiw!&OE*p)t3f9r9Y7k~E(Bzo%%I}FOA=`+_k#?-`G{JP> zj)s%8yVaVq-rI+gL)yBwDc{(%T*_n z7_i#7@6a#SB+^Ro0~g_L`Tf1+IWGk&p=DgH3O7<$2X@9xdrYZslM)?K=m;&hi)#_H z3HdlJ2mzS_bXKYv!tET)IrW~Yrdrd$I(%f?XF&Qax4s3m+N~|>7*#bWW@WBrJKKHY z*ganWs2Qjj$eve%d8H)@;0uevy`uC~z&Y1kfSxmE9q zGs-#Y&BBB{=K{3}!j%!xIRX)$+{S9)>?j^$oh(mNh`!Q6q!SXc z5RWFLXuw6km0FQ5zEr=3MWT_)O)@mv?YGHl{C#Y!LNg$8;GD&S0+fHLH8CTvUKLT4 zeeSv#TD9`{7|`4g7f zM*Vz-j8)*y7>y$-T}QGSuQo*(c$u6d51Fu1VXQX$uxv-_BpTM&8|o{7>{>&KhT`TJ zoxYh5OXi4nldQgiB9Sf|pwe8fywl{P_;RGm^y5~btdEXZY3a;LkstyML_;(XZKCyi zGOSoOW#nK-C*plOE_ug6i-s5}h-^JyQ1x5!0ZP|PI3%(p(<_0f*9q%rs+Nvc3L6wu zGfC0>*E2QAf7kzzS!m8G4V+RyM;&E%$}9XE=(- z`mVTSx1z}=utmG5GKW##76)Nn7kwR*rnjGxI2+MQ!K#Wjh3GH?OKHC!W#U#GPRL&q zw)VU!-gLB8+S*rQeh&6>zU3mA|!xZH1e?s35}zI33VoLuC2Le z#A{5EgO6#j`M@;qibY((u`3%f_Ht|%rJ@hxRA?RArAEo=rwsSjsheo5z}&NB#e^Iu z*>9u(b23)$7l~Ob;UZ&3*L{yA!fXK9Pw6&JM|5V51cx+!>Wb%3$4N$x^~o4j8W}5i zSrjhkBppMCaHdciuEH>$VrGpZV63sIxzQ+I$qTzy=G;d8euCB=DzauY;Hf@vNomV{ zqe2H)kU<7X0|`Z(MbmRM+YvEQFdI)$i;iB!7wW7D8An&G!k2s%V1<}Tl!4TtaRswdQad%FBC51{a4G;P zMkIN)UXDrLP@aulpVaS^sQL>Vt$@1BW05qTPJuJixHBijxDmEt*&iJ5bc&i>vc)=2 z@}Nu)xXpUJMoD2S_6ZBLP*ux}lFq{@KNDO^CIZH~{BY~|Ri$Lzpb3YK5S{i&leQf89XFV}rc)%oldsGe2kj z6Ih3YqsE+{r^d_FmxZg#&e(TGgA;u+!#Jh118N#7*JV()mSzhX5v0D66}_FPftvm! z8{znM64)ApD+v)$Z8=o{rjmdzbl9jt;IE6Ak;$~XW(K~d(Awt}7Ht!DaxKpLH{H$9 z-AxwsuLk=X4JtaxViA`7`YUSL1G9pj0DU2J`?K97y?u(3)LB3hsoC|aV2MP9n`Zb!IdYhfJxt2Rzl*S zTP-m3aN^vBx2##9dy{hv#X^&rO_SW331V57H6oz;5MQ07(R3h8DO#!Mdd>+JMQ9d1 z7QInd-Py^|?af}+a3BW8b!?!BBehNdYsNKS#>37bW4#D5B$0o4&c-+zR7hKKkC__2 zGV;Er8+OiXLt22g@?=CxoxoA*DD0fXuqs8q%Dtx@pi$J)da&b&F69SU%DKV;@&eF^N)2n-Qgq9_!9g@OBDX!kSaDy?x8Q->5MOB} zs(7(wq#7FVtVvx{FdY<_Vva*r!g99Eg#~^c!D_^iIwR%*BFPt&tQpQ@)OjS?xsA*^ z&tzjY5SuhR2-oz$_@OfEH@6#NDcN>`HLO8-w8`l>ojL(6f#;7EyHu<`-ncC2cY<<- zrL`%9V8hj&iAtU=$a%_VY&DIIX$T>4L{M0^;SxrU{<@%}D2%gUf>@sOufM+DJzjae z^>TN6W&7aZhuzLf8&N2F{wG6YwRUi{`+wAE4foZ~=ht5=%KY3ax2hb<%|YK7T)E~& zMrj7L*=$U{FGiJP*PT@HuHUxmX+`j7DFgED#L6sW6o5ZJCsTIx2GTH4hPOff??cSt zQC#y}qhr7wr*MQT=owBl8(XjSsXE%Vk5B;^ux;a@Dg3_%H8bvrz@jSd0qFGwVy$Zwom*^O$TZm6;YvoTR5G1>aSG7#kY zuul5ZDur34g~KYtP2m>4#$0o*Zi%xGsQSW{kK<4{HG%bg%v21(M7g_V)v-XVYXcJg zT(n~RZA}r;xV1#(Gbdo=BVTY5PfSLQ+f9QO^F=z{nhCQ^GP!ATN@6wNMXGE*r$>j} z9QBx6!|TGm!LC)gEl2w(!W$zdB2tCS_*B;~#`ex#MaItM+qZnmU1uWKW=NYdA~n5i z&~AzHWyv7bdnl*yWV6Xio~{hYHhW$_Mf0Un2ov&&^R3U7J0L>35W$Nb$gvfci3e`{ zDQ_jyFzv%}Z)*Gt32UlyFEnKH<1<(JZ{gmROdK6_GK235Hh;o+AqLD;!E5lg*@2?JCch*+l$-Dfj(G2jSAhUX+e8HU`T3+I5x`iG+XwqE zc3-|ZqDww}vAfq<3SMA1o~EcAHL7k=PG;$R4m`OUyhc|v_wuaMLXEEG*n*Ot>4MBC zxc%Sw?Q7hNMJkOwM~kL$G1Pgu)1jz%mk_WDeDrW;w@DWh;LIXq09WP_r$U zLMGKmAHIMUPiZ;0fbckuXJLK@_;49eq3~9EO`#7^I!1XJ%L+2L5#h2aT9YClj1Yjn zAeJ>Tu{J1>E1HAq)z3X@$VM%=!r3HII%gbQT}MrnBn0B>>V={>a$^)J#lboPazTw* zaoe9MTaJiIj3u|XG1&v9Q8?IJGI9TmRWaixvtTv~>>~FMjliDymr|9Zy>T^Tt4*TB zjgnc^sn+>klxbf4B?BAz8Kz~)uO=K|RpJ(Gg!;|r`xP!=mnnflup|B;a8sB#)N0Mz zykQ$fD_Dv58}+9tM|w!qheqQoI{qPXC_~V`5{hk4F(=e_#W9{Gu6lx+?&;WxNrRp} zuwXOxI~KEdTT3>Oe2OwA0|T^CK`RQRrOsnOpC*8O7S;h&IfRM&-jiaP)d?-F7T6j* z;Pbgvr;;v|%A`k8uKJ$REhH`Lr zur!o-oXw_!3{m?o(RLlrV_MumLd2{FhZvWgB+qjoMMtGEI)1(P!0txCWUY8O@j2zN zH8cWVV>O55JU9}c)CmI5r3%3o{81>h28iRBX2>{R0*y&jpMkSZWZVO%N3sJEj2F(B zM>&~Lyro0u4vOCy$-M94r8|Vd<7p{%02I5QB+ghnzMMqN0&-vt=iF%xI()_xt;vrA zZl11evl(AGn*q(e=K2CzV?cqr;NEJZh#AY!nyZWt)`=7|UeMfv?}lT=j|TjK8@O2w zyu5fvE*tAw(QAGH!{I3!7mzcCXL@?spd@yjCNc6~H0B&R0cYzp&cjm;pG1I7fU8OjaEnfY!#MlH6F}reIXD5a_O`n`sX`76XEI;CI_MsE zYZSN1X+6A*;Xd%5{QPrJ!@z)9<~{xpjZeMR2!a^r+0VVvmfEZRjlAbWDQp-!_)29f zmU%EcKfkK|&8)S79$tdN`pC@wMr>kELF!IpNy>o8fhl?*GR42=#!=*bmm=gO2|?Q9 zT;XVBB4JlVh(|hoAgXfF+MH{Gn~F&NO@l;#{Z)o;!w54rQu__M2zEEjFF<+Rg6#AHO{{>7G`at zA=t$Fwu!;IfX2m8LBw@QydQ%Dh*)yN%!I}$5NR}Cg^u8}@`j6w!<*E@A|HBMFy=RAaa$s&S}K4e0iZn z{csdtCMU@#$*)4?$}wdEA31fK?ORW4H#Z46^=+3N_=@?LP+YYs9=k}WII`mixC*qW zvXl(by%c}Y*TTR`86MagYH9j3;npcyn)=9kiA`>}TCUG!Ar+HkV?c*!C3>4BoMfbr zn#~SQlg715B*dk#XA%?2%$%7j$`-Kds*U7zk|mV@a%_iS zZB)sgA<7+y_?fc}F6|v`Z|#L}?tX-$*FEfP@4k?D8B3+KEQ>=WpK{hKV~yiRC=6H= zY$cspRYb(FzSi(FKSrJegAiXu>o)Wv5p06gA{(E-uL=MSb7&)u$bvD4gf{?YDJ8|K zoFq0iS0D^H|A`T}i26f902~9HK~}8=+mGK;#8x!6+E2`vB!he1z(y**1jGN1j8e zac1lsT_DC#lob>5!M0-p!?3ck#Tu&MBo81 z6H)oAf{~5UDvUd4gqpY!(^ZY}ZXCl(~_D z;N997iv&C58JHM5m`J;j#Z>cp8gXzvo1w^%+3V>vLfjBIJOy7StmGwgH`34M&hp^N z!(15?9pJgzF0o+HNla>8(lnsbz-Axx10)O1$TavECbJ_OecB?2-Lzv>l&opL%k2dM zw5A;qd=hR=I2+aYfq3UgvPGk6mB5V@os%RYXalHPO>0O=J*Z4O$wRArXCex(RO;1D zlox0`D!bX-P-VWz;$2N{H)O$$R@oKyNMhD%kmrjc(seHgLJA1vo`n*I5|k*CC^mWE z`&%Nd;@U1@XaLjiI^&nOLB@CB}C;oDy$@EPQG0LrpXi(hM_7ZRkW5D(Vn!( zCR$4=NgG0FAdyr|3>af=Cw@wWSTSCviq&AtT3a}t{%ku(bgB5an)+gRL7U6g4NVT@ z$ogp&wFaeB7wG#*&GH4Oy4p7CYB@96GX1+s9?K)9e>TFuNkGLIMJ2WEd^-B>hxqFG z(FUe;pXPcK)EhtlJf>ncs8Pxuk3&WB>aa+cQI)Eb=UywP8S5%E$1qei2 zL&6~wo)-g3PGTFDzv#_SC*eB!ifHOA4Q3CJN!BfRt+4-?l?K3U%yz5l)3M*n9b*=6 z#GK@kj0MGBnIiBEG^R67k%;pq>r&V4_Z6c@KTgW46Z8_kx_d`z9yw`g)ufkzZMk^l;SgqmbcqEesdTe z9v!?q+IqcI4*8@AgmQkM!BXI0s>Ec9Lw${7%kM>3v0<}TZOXXBO{!QF4D1?iUxG}~ z-RT;-Gob}%dzKqN3=>(IIb@2i z%^ktfviziqUN9_G#F!9!Om$xQLYQkJ^>G3YR)Mi{qtfkWs&uc9F4xJlg@qF}!rV3@ zwM$Y5HS~_Fxdu2lG%fa=?t&V5T77;y>cSP&tc_Jov|D2AhS^}$zKglyvRMdRT76fs zWgT+VRi(+{-E%j@kC6ysDpWB)lPuQO#U&YILM@_(uZ;DamZmuLQJ>XytO88Q9$%u@ zZ$e>7;sK-t|^yh6}QPo()dI@4|x3l4N?y z)}m2-x!S^l64j~o^U7(A%;xm!=howIT9@rd@QD6vVSd3J2z~qpn{WbX6~Ceg?qK`^ z-G%N4M$fV2hhh!i?(V$o95cGDOzkB^RaEfSnnVe3+v(RF822lZg8OJm>gPCv~r^R&O~7d zG+@Fc&G@E(*~OzQCL>L&ZF2NLu9?}K3F0lx7n~U|`jAhJY{N)^&e$4iu#${fLhT0y zEVMe#O?&v`k2QB{ofMXWEfv5BqlqCM)Pav+ko^{pi)PC2!naIfumiR0mEd(&;Ta*3 zyx)~wjfBTqlvmXp56@|7j2MR;lGquG#;)^JYSSe0p?r;jzOHh2G(OkRo=hM#l9>go z`r<}AWqMxF67dl?0HSN!LNGX_6wszE*>CHVm8X&=T1-Pc_zB-(zC^4uK`RPCt^zFT z-zJ#{l#O-J1yT-!0hhu=-vQf%nRE}*sj-{}j7xs)C|+zd-MY-oFxm`|h$NYPTw$xU$JmVB^P9Q}bljjZWLO0YsIQ)Dt0-$> z!h{sA%OPibs@?%g%|u3d^A-iG-|W0#$=TE-Hd-*5o1U7Rx9B;bpSi9_CNi^Tt1C3> zEn;bz9<}Cl>hiNc&xwNQ@zyjy>-Xw;Rvw{Awoy6;nxau9o6%xxWa7J=uKeQ`IIqH7 zG7ePmLPjF=YNIxYv5OT9KabwhE5@*{-Uvm&V~X#X;)_aszfnW6!U|#q)Ke}j{6Y$g zPIF<|Eh(F)E94dr_@Say$Cd)jR#D)GjT-PLnU+{dhbt)AtSI?LOU`-!?wa@88#QqQ zSCLpnp`YQiQDebesT40LEMyna?u~YfcZ$m0yu3*7YQC7xE3#2@3!a zoTF8HDKsH#+3=*z9Ui7_i`00}JavUCKmcUvbk%F;y6QGqgI9YFv@Qj&(~sH)l@GO$ zTd@SW74@WyTg?IDrJ%kwNfA%rrA$&BB8w(5yFZeX%xa_DtR@JkyL2SPI?nfUwH z-c!b~c0Uz@S_a!_YIH07C}#;5MQtydEcfP&vQ0}j7P`o9O^87j)0 zD22QS>@O%9ay0uQeC&ZMTwcUNuzmx8BaoC#|D!Z3=#)++G@!wS#hO4w;y^Z>#)6ZgPLI(jlq_q-*fH*j!CRPSi z@jm={Wf;0E6aKP^HO4`$b}82}s%B^ry%mIqIg3`pN2Jo}$EeAJdITr!0Jy`TrpOQ8 zNBGYu{JS0p_;p!SC%It)!oSO@4vLQQSn6f+G2UkCD&QVlR%6udbi1f3s=kM8qG@N{ zm|A1YB`;S)Ye_p**i$7cn>o!j=xQ0w&|6T6=4333OR+ z_l|RLo*_;vb-{sk3;nfqNw(e5o08e}*{+5}6|Vnvi0S%T$t? zB%GElFPnE^KyKiqr&l%%EE2;QWRrySJUmV2ZgaTDBu9V-;9tB7VGj*#kZr@zw9yPS zAUK=ck|){V9K|Pek$vQB_fttH!vb%0S2gG+uved|7;O@AHM7!MfG5(^F`z$*aLYN$ z0*sNwHi8cxNRE38GQtgcR$+;CDlA!OHbvEgAu-6omKHXcyRaN;i0r@o47bE!>DuwB zHyMiPR)-oF6zSkW&YUoE{WIj`F4*D;(GEJ?N8?<>O0E_z^so(oD{plT7GrO9WkJ+M zjqLZlONqm%Vg*$nC<+%3u+^Xz)X?8B{QKX~v9i_%6ethc^q^+UHQ{>=XB$$q;Lw_H zgx|C-*B`U(1{T`f#7jPl`holl*F4iC&m@}ErJ0S{E`8-j;&DijrN2uPOAY}-qp@$G zI}B-4b8DH_+fWmS3EQ_ld#*fN>`Junlu;x9Hu1rGR4aA9j!t zmE#Gv#xyIQ5)#ULEtA*rX9M2p$&j5 zBT~F=P`N`ES2^W_vSq6 zXWnAA9zLO^ygUK)>Av}S2j(uXTdv%WG>E<8_QXy?_ z;NS~RlWSQOV~$zkbtv_!ml@>9l_w;*KO2 z`cb1Vpt-P;ES?+zHK1b>4!FcurA$EddsPA0WQZ5B$1N6^5K6R(_q|`jrV``m9}Wjo zSl$xTs}#onr8YwoJ0lnhp*2uL@qgwa++iPtQMi9aW>Dd{afBc3QxY{r0X zgb{FXO1jjHmTe>~ak8_K5(++Ap zuk8=XXvEnGIBA$0X^1vU<5wF0CB4nZs37x2^c0hZRVbXHEyN(=Zcssn6LuM+7)d!g z`3h4@7l+7-1J8)}grtQ@pU@tA%xIu7^r9yj5i6Y}8t^8|r8VfH^_DINAuZ)&N>v%* zO&c>gI^JN^WN6}Gcu~O1M-qn2SA(2K*B>CiNEISB^z20(S`<%)x~XN%;BWy02^^%= z=yOWp6N&dI2WBaHhG&5Ux_n`L3>ZUj;Ut&kr_2N@R<;V4Xh1GVQw`b7VmVggu;Z&u z?1V)vAXoZxSMmMOWXB7{W_y=T$vs0;MTH4m!2@hzbkzi~h{ndNltY=xZjTwm6P?U} z=3KERNfA$8YyrJY;tHLToZ4}Ov-^d+SebW^!fJ?2#vO_E_@Ae5F}gxj5IPFORTs$o zbc@pu1plh3%w{JmlD&_uf+@?;B%>@tCs(91cOoKMr#ZvpASR9zD6SpnHT-#nQNF??Qb244zO%E7_TO83A;%q% zOQE}@I3Dc{qp`CLz8^RnBt|?HT$&`;h{i1WFwqD&op`-MSg}V9vg<(Dbsgi8JZhMT zDCGKhR(5`NF3Ch4Ic<#9Ks=qx*Pt8vljK;qC*+Dhh&AuDSZ=$nKItTJOv~_4nII0w zj?TR}4o;piGD+V};&l$sg^+CAhGDE5t)Fck@Qt?hk2(M{=?H0`?(X-yd$4;Q*{q+$ zs}=<&*770e)X+vv>u6vj34Uz>@bT&+tcrJyby25~c6?c6GciaRL@2O8xvEeJM*q*d zn3@=YCenaM#iH-z09h0%zl2WYZ}wLntvzjRzkEF3k$lPWg$Gl~^GE!jcx5|;y9CPf zJ+vL)Yo_aqfsOTa<9`E|e2t6>h)MM51kiRf!1z~_+{jQ0pss>JWJ{45EzBNhkaPr- z{&BbaW@~Sy{cR{A3-A?CT<~gtd#CVxGD-(Ay*XMrK6neH@^0ttqgJbB3OP)(2`25v z{+3uY279Mt0Z9xsVeI+cCA!X9g6%HYSklSthK(^?DaniCIrgD&GNcweWu>MVh&%)mB>)m7WU+D%1W3iE@%hE>hMr2N!X%Z$<051uw&`(K# znyA;D>x1PcQzem;jX>uYFiv=gu+O6D0KKXRE*~H+pQa~-_Az(~#wQ|KpxW}&AaO=K z8}ym(2CK)1;d%>SRm96)vlu0qYu_WjXr`S~F!Eqt+;Wb@?RvteD9HN|U$Os<5W&n< zMT2X`DxRJGK;>DvCS}w@qk6Y^*$te$#^=?4=T(;I9do)ukSi2t#OV5`su)jYf{Q1- z^_?K_=RdD}m(7O5+Sh(~vTfQ6=4(SJ${{)&Zs?f8n}<+0 zF1MXJ54ABEpOS!;d0)^3IC?Tz*~8?CRy(_}P= zqp)*13I850uLWz%L9m@puBJra)ccLF{p~m3gg(dxhel3~cN)Sy5M_YC#*`3iDEB(r z_MNg;hw`ffe!x5WM1pt)NG46LtOZIs%*j2NNGOM=^*tmIZG~u&6)bh7#!`bifr%Is zJbe{fO&K~Ci4227v)~x?HASBl{|UrjIDMN?49D3-{T2|N$RN|SCbJXZ>du--K||9g zn1>QM#Sw77v zNoDr9hqb#Zud=gU4qPItq7RAMWjT;Mwl}_THNvlo)*v_4W^rnKpw)j}J($ zD@_5j0*wW)J4f5E;O7=`Fh4bc_Br0isQxdY(XH@s>*#oQ`_0}K@HuaefYpKPX@3Wr z-QV4RaRj||UU&A7SA*Sscouekgdbt|)z;n~b@dK&19T6di8rsq?>jJ(t?&0b+%!yL zdv9y^bu--AdcE}$M{^V~M}@^?G;d#Z=n=HP1^;c6hcv7KNygx36J~XE3{^v_`gXV5 zX$D(IyIov>7e@!sJT4#9IG{$L-hO9W{H%{(h29Q85&Zq8+p%NW>1?6+t&5f2!mxWC zzUHD#)g?}5I|da$U>{xk4#r?W3dF!w17$@63>?qt8I{{(%Xs$q)7UIoG>SQB7_h5M zFym3Dm`pl~(s>6y7wwkCG}%u9WHid|7-5=#{}2I&%ZNF{m7)q(7*Kq_MeS{b;dQrj zsLkOBK9D;q-8^z zbofxrv-=^wqM3b| zGc72Gdkw{o;yynAptGr3pE`xIS#E?MR-WT_Hp6ddG#Y(K2E{=dwSleaG`jl6EU_~X z9R#AWpT0TFVgGK_d!)U?7ud|x{LC8#)ZGOVdyD95-SH+JUhaH0M*bO%e$LP+IkZsW zuMs{sn>(~^h0j9(FW5Kp;2A#P>K>fI3%~L6_#EZabz7_%+JCVeZ!aIym(?d}-XW6n zM-u0gm?GX}8UaE=+IbTb>2#@k{%x#LPVvPg{Qn1)iq?F%tIWcyM{F?g-6xaZ_6=Z1DT2f-^h&3 zD_kW#`MOBOdW}tQmG~WR;_pF?2==;Z1ebAh{yKhgCW!ZaRrd@CrCu$Hsq9sTwfT7? zGN?nVnJ!%vVuxj3+qLxoSdj}Q>ce%edkr&&owLx0o(T3sP20(F@$vAPT$vV`;88}C zd(Q2uRmsMD2gpS%L2>O-2Ta=OCvc9FJd=`Z^tU{`#`_Zdtc2hE0uz1kbL)Y*;QWhZ zY0u5qj4Qp=3~xSj*&{l}pQ><60jqolCi&g%=vt(8eDtQ{kpz7E1{iNoh6VrjCp@;v z060DGHo*kPd)Qp*DGwcZzga(LTLBU5)RwWC&5D`Ts+x9YSz9g@C}Bv%^Z30PE??rn z@w~V~uW87oITV>TVO&GR6^Qs(E(c_nnoA&og@hso0AOm(3;@;- zW7IM_aS^e(i2Q|Wh6PwCJ@A2}q8Y}#e2je~c|_lK7jPQ>kc_&YJEXG+3NuCE%OeHH^po>D44JU8F2;$M8tWgg4EPDlA(>82{}w zns^74d%n->3#~0!rg>QQnHjiSu8eY_po2m1a-tM$m?}EGtoIwW`h(Vk@VjSW9}#yS zzdiW&LHG~&x)S26jSwU7h7Y1*si7$auO5c&mMOYbEc(I}-7-a2+6@&M1h7@d>Gy1N zUx)RutSLb|JkiU^JWFRe+)K&Wr}y)8(!?N0d3vrl6|Mko*u!w0%R)_h!oS$*52)q$ ztzU4!@TL8WL1P##;2AF!l~5c+&!5p8Y7UJ6WMYkbcWSjwEqzs85vTOK{c`gh-j zj~n5?%w%dXk%!N84xbz{ABSZ~Rv}bPTbBNk0&Rz@?UKPFLG2Hu1+}r(G?Amp_9pq8 z)#{7v3ZaQ9bVSfZXE)PqhfoUTZdpG`OjL7h7?rIQ{opLVT!EvNqJ%!1M`Wz#RCDL`rvO5@S@K!LElhYS^6pqNuq{J(J9E7z192Ry}(Ua4WKs=$f zt)rLSH{H$-OJ27z+|HKoik;Z>7NS2v zJu;s z_*B_{APlhe$CL2e$7`)`*V^BP>#dFU(~U>pNbYVx-*@&OclIB5_8)ilA9wa2f0q3R zB4TK=%b`(KMU9d}vf~Kn7;=cR!o072hlaoJR?nW7o?)n>tnebc%GM~uVc~fnAL27( zLBeGL=>m;Mh0XIZ1~rfKHB1ojyik5NE|ndeNV`1#9-PZw_jqT!*V+HkNVzbSb1!Gd zq!`Vj$NC7pL&7>xP=6y0s4;N)4qs4beiJ$Uu@)Bc7I^C}2{=d{)I_actzIw4=8{_z2lz_JGHlP8~rd& zFUDQk>g;utec&qPH~GVb7Yn_d;$gdscj zB0B7QEO`?_hcJ}#61i7@dcL5|PPDQW^BUVJE(*5&7ICRoOpd+(S%rpQEipg zv4jPmS#ezkXuE$_oV{*l#ZW2m3EOb&;#nPIsyv!8@`r^{AfVnivta3$1H<~tO5x-I z$~dI&@4GvXA9oM7f9M={QRqwWSK;asD<%<)XhpMDUQuIwA~V_aU(?0#EIiARgo2ZX z3gZUe0KGRmhrL6%{Z+&!JL?Jx9($5&C|5FvF!Q9&c*3S3u^02(#qMOE%oIzD3s8dP zL}E4%L<)PxPd8l15r379D#ah2rx&AHc4qJbFywr)c+^b=C|30g{^XhO$2q>-;>kJa z)q8yit4#>iJ(}$7FEu$3nf8af)ugDkjVj0wm$7j1NGjxW^-Z)&6!apBDLL45Y_RP@ z5o1Uhs)U+h$`P9{v*d%c)+YFbT0X5yRIKoYt*mp=SdbrA8Cz+vs| z9szUK``>RmM?XO`M=?P0NjwF*j@)M@$VmM@!+YUcbS(s5P-Ll_*5f5E!36G7CHYzb zc+N@~YPPbwY61Iw201w#4GaM^9`r7>rE8CsX~A0scX4%1>D*!Cv+?IQPZ&r|W&{V> z5(PAo$S%yq5&}!t-517m-opykpk9vI?`32GzX|@g<{=C@hRHA5f|;M<%4hEI z3>#EQz})w?-uynKOaFceX#nX4 zwLh};7W50FxD^1@M0J(qF&`-xthxC{sbu*8cq?`D3b<5rO5f_3!M#)~oOra*Pp24p z=Czo*=z+&F&}spMi&u}sQ#+0^ErjNvR*BS$Yp|%4Oq^{p{DI5XUQaR3T@F+)VjBe_ z!R3eO(vuTjLWlxRlsqUrO>;EbVASB_$fk!dO6-<9b7wafY+~UyJmiQ$qCRG^ij}Ik z*Fep^11f|NMfpLAC*=a({ZQ3AJBMMZk_f=(|CRao?~oT5zN&)%l*;#&18un5Vrybt zhj_qasNiw^yK3%fE;sHJzd;uT)O@cRH~YPiwwf!3S`l5E!iy*ik*+pj1RavvL2y#1 zS>09TP_=JvVFO|KD|5#eoAs`crjJ%-7gfOI71djkh#C}5e1CMXwX?m|l{2@2VvRH! zz&nSgyYI;x%H63b#I&ky74X5W+wl>?1`3ag^yaPG^e$OwQZDvC(Be@C+Ug#Y9EZ-{ zA870K*8bMZ4m2epgl^x$51r28*52-q*a$HL(Fnt1->M-J5xAPuMvy3d#ICXnhm@BorubtU$iatOEQd)ZvYFXU`C<#G6{B$B%^n|^b4`u}x4xAsRUZQlPmlAaqAy*B~1FDvs= z{QJL&{az#ixz%Ytw^Q+?Xd{^V-#AS*#tkv|LdgD%TD+{Y|YVilLgbVP}9= z0iZR>ipr@pOSQ;l!3TE-35!@Jt zjMO*C2Qw#8(V9Yms8UV;W{9XgaEBP$F#?bXi?U26<4D6$PF3{KPEThU4Uj-4GbPt7 z-Jrtri+cGD@?Q^DA2dX2@Vh!D!2Xcig0tX-%0!O*F766c z$C$k6joxliA;$-aOJ@@_@g8cirH!u!OGSvrvY#+_2IuK;JK_k^JLx$rm^g`=!Qz0w3E;wAN&kX0_6Mn>F<2vwt<3hB6t)_pU7`sZMbzZt zlQ^AV$PN0nrnAQ-s_V?zYovcRb$60BoV;L^Po_`ZtdXr%*mS8&yZXC`i4dBz^C&yB z7I+$GdXsY4;54-?g$D`8af}XLqbR4mGBpd~4mf!r2!nbEtbiHe!!{41w(JgCJXsiW zupvOmivUy|YKovuzKA!2-LEo+-qJ!6gw5>FKSAmOSS)IZ*S9aEWkP{m@nE` zNMY`{=%`Z?1>BqfxJJLtk1EtypQD&664rBd8)c!c5J%7LjIE z>ItjT@ZZX<>b-Lm6_v02Iu*-Os$5mZZw1eZ&u1*qBM^$awlvAoD~eVzFjeYkqw4ax z7CfmHY)7?DXnsjg8&oXT-c$r!F)+fXl}yw8t#Fk?6+@c0KQ6meTf{4=ECoRKHzkIC zlf}aCmBTGBgp9I=ReyskW&O!hf5Bu>(rWQgNctO%r$oj^a6%ezKz?gnKa#@c>0oS( zIJ^(a#|OsKC=AGo*7$A_G8=K#%JVD|d%cD&Q8GoW8DuO^HXLH9LX%;P5S@Fm5)Yt7 zU-++oIV3{)(2H-cxx{LxX`Y5BaDEhZ>MdNeE~9_Q?$I>|y@~N-seFY6r0@7zVWU{y z%4YbuQL0&O=E#O@1<*tvV688}c&*W>e>phjkapHg_slbde6zp%&W9I#vIt&g-1-I&ewwS~=9x9^46AQ#)p6s;Q$dLYo!9F3>igq!72L+>-A-*|zL8gz zO~myk0hOg3Ql{FV4n^3vHG>l)w9k{j6)ch$8i{HtwG}Pv?^S*8k-*(pSZACN#ochC zZB;#2#pYbx(OP*Vi!`p6iR2?JMV6_It;`IVZQX==>jXQtXue zA3rN^_7|R(#{l?$-BI}Kz?!uZCR!wVM%GS8=}9!|a(FWgm}I>1_T$UkJg+yf%lgBI zh4Ky7_)`9&o&-tjB?Du)u!ft~luqianFT1IbbwnY_c) z2sumkBh1x_TkdAo&Z4VuX$$QwmN*I=56 z4V;ow%B>q^2?{K^B1^OiQ>HLo$$4C_vwLWx)wtif{CYSXHlVBa(^jj6%Z)XCH93YK zI~cx>&(kTAv%gz-Y(Hx9k8dc}$kM@#GTWR}(WUUyW}%^R`eQUoh`=Z`^we)?KMg-( zNo9l=w8b$eownB3=e6ZJI#;%6)R=`9zx7*$lS|3t#%Te)U>qW9I4Ifo`~@09#|*uo zDl=%f(n{TxBRayul47aCPW~DfnsSjH6MCjfHt9u4E%%0bgNB$9b{bE2Y^b#ICByk0 zE2Wg>MNFFEZ=Mv?jg$n3sTeBB%&HL6)q7N!rx{s=hSR(6G@#Hz;i$iRMFD7e+pZON zE-YZeXZi*Fy}GVIr99PJtx}1~-CiVfW%ze*C|`|GAxQO$7Z&!WlGlnAzgE6mK}X)M z3I&6@g=pB{u4_B1T>PRuc~p=lk3<~1smf`%MZGN`xvy8YjX^G#ix92i%aDEB+;Q&T6E&A=Rh&BQt5Qf_o@luh=iF4ZLV?*AFPA{ZO(pY% zGk=4%nu948FIDx)A6b7#6FQEDi%7t>aqpSAT#G^yMXt9Mk}xGoO_BH~Iw1|4nln~I zFKQTCB&ME+m940{x&=D{zRzGo?mHBe6E@LNQ_uhhaUX*e@(`uKi)1`FbZ@pINmA0e zlHwO@qs^?b4xs>rY!09;seK44*(GluP{a}%M2$nt95j^2b=@m|=ZX!Ly_va{MilFS zpmVs&1zxSFges1tb@|mLolk;F zXORtbXdO z;$zP_^|UJUgNe!xRNwRF?YyyhIGP$GXm)4m5O4`EQ=Y=GVm}Ge4eiAg@ki;H8BFs8`$%vGje%eHoBgBuI7$Tj+AhK`f*mQCQ20_b1R-y?G8~c za}+zo3l&+Q>$Nu3*I#9=Y9-IjOFNNtuhS!yFzVbcsyQ7iPgn5EQw*d@`{x2(s3*QC zS+CqlQ~EmD!5qm@o)&}`G$Lyy{b*gF&xl3w=XG-W>d?;BHLn+X+)%PFWT4#sA<*(d zdz-<3LBaXf_IBs+c#hP3(=iscqY)u$r62lyr9xE~b6K|=R`Qnowsp$=e1`0wLCY2B z7xw52Ys?lO`}uYJ6jZmXQtV}}hQc6%hKS1pAK5#I;)Zx(u@-L8ng3EJ`<7a{9hs|D z#1&LwrQd&|Qf#NQy|=sHsXpAT1?QwnG4|IT_b;J>E9=$%sxx@Q(-Ek1@?WI>fcvjj zxco#bQuH3OXTZGL9z~h!V^}L_46aF}Ag>4dMv`ZG4nxj^zU_@xR07eFHFz(JKKh!J zS}~?abqJ!8hn071S%xsj7tSt0LB{UADjuwo0N%SM?%R997dU^0sQ#OZ(ln-Osr2LU zVT~PW{5zc?XWhIl%cr$K)x=%tBR#*J08%#K3(6lqTew#kl1GLyb7iG1mfkgj7bA4R zXs-oU3|GKzyjcW_l!Tw<@NFEP!ywN9%54T<)OE+0$yYaw(>mE4PNq8gC?z?nU`dsZ zx#%b`J?YG{*d+Z;r{}1Sj>e|uyMswQmNlw3!mBu64ZErMTEU#4)x;zX9wiy6vw=BC zKE|dE)zY&A6jaKzf&47;v#yb40Og}vHPv^A6eV8$sQ_tkfbcOI2k?r7gV|(+h&ML= z?AWwvq92VZ@cijGoyG&x^jbk4hMr{TS~m~?k$HcAC0JxJj5N6Rz}?tq?#3FYHU{td z665*}f@nK~$%nkjLp1>#q?!lI_~4U&T0EG9l|Ub}GK*m5Y#3pw-noSRL)(Zli%|gB zhRd{bKcxfY6)sv~O6=?^hgnTJTJW0{5#aseOHV>tlYv%>#&w$8?9w~%ym>dmub3_q z`y2}x;*}^EljDAHXq?iNm+Iq`8}MmYyVlPXuw{OBKxWgJaLy~|XWS-N_ z(}_W8SziGN;o>tQ@}cP**T4Hr|q z`aW+JX^F}Ma=JD~YbwWizFj5l#R_> zYpuKNTAFHq#d_NGpW18L@XUbketcn|hI{3GcSrBSZ!vAFnb_u^Ii-O?6Nq0{(K9t? zmg)su5`cdS73y-JKI7_Ujd!Z!Y?^DW5`2xmEVXtgC=Y}ZaR$GWHLe^VTE-`Ek~U`WQTra0HOUd}pLXjg;z&qJ%9ig0MV$6yD(!>TD$j0ap~Tv*d{ zeV9S__ODQ#IO{*)d}`(uVK2$4Juj&?9ALA=_eu@8E4lF0R}>hS7k?NflxQh(jwy|n zGb+wkF=-7rRSF67Gx@fB?6Xk$;L&tQ<>QsD)XG;`(}$@hgOGz^sg8ef-$b8*u;THF zB#=OZ@)xq$gQlugDj0Yms9g>ozbva=;qSgQOezouBXI^f$|g?qg%fwMwB3UInhqB9 z7sA>KSt$eN;7p$MJ`Z{TF6 zTpy-t$T=!FS2*R+R<`f9a$s)9gEF%s1Ha+nb<0+0o-x3xU&x%^Ck5h&;AO)J=Iac< z>91JBrI4>X`Gt}M*WSrDy;K)2;E8#|xG}OY|0cGQGB`UgUN-1G|%I~`}Ni@?o$pB)?=bez~{QiaB~97eO|CQCzuH zB(>;ud-3b_#jhVxSQLNmJVboFm!5V=g;QVJj>ee4Q}ggB9GEyRUs2v#6FE6+ z6bC&ix4o&>zD_Rp+XZBkAvrNLJP4B4Ce*W>FEo4iVwVE$NXZnQz{=)@oMG(4fT9;- zs$3{JosBr!p{ofD>(S^mh1>4zJnT=ClM`emB@ZrTm9()@gZ&Bsu7uyoO=6=~!*da6 zskv(*+O1m|D%D(Z{d9z>0hXmyZ|o4sTIfs;>-%&R`fNuaF2ssdo(b=Sz*w4Zi2|@j8rCDI2ACGG2u=v zr-A~vIRtsLGVTkjE3rWAW+G9A?aCWN~&6HN^GBSu%oQ7GMSm_2MH5+v@Jfy(EjWev*{xH_&_l z-jZi~>1E|c`HNH>wlnTZ$T8E4@-$IUVZEM%wyIXHB(Zie+NRxbjZieFyj~&>oX@`( zEwo&JH&#w}xu`#J4`{*da#A6MFQIop#g-i4#X+3Q{S;zP7C+k@5 zi;iN>XNJ;g=<-86K3iNao-TUNlWF1L+c4WNJIFup1JL^ScQ*I@MrdK6`7vy-!bSD% zleJcRt@R{aZ*4sJ8vYAEM5Fj5>|9R5zax~dX})@@2#7yR&L@BrC)4zF8l98$Sp*eW zib;r3dYX(S)qSv?POhfO=^5t5XoT%=zxf7O=gw1iskGFU8cPl8WDrNAK&+zl6@?{1ZPXOgnJ0uanjxp8$1&*ZQF5M0 z4`if;)6asO_`xQPvl*VJfKl*oOw*doPDV*~M${5CeKO0D{lSO*c#O4R9&51J8EiuU zEhI2*nyVch8)spHdR)+4mWa5pi!-L|>`am@7y^oeE@P@QNMXsS$KTK>keSI8UMxB@QN)Wnr4D(EqDW*gbf0{C4Z86Yh3Hz@9(u?sRs-rL8XfUTTJKcaL8k zyg3fvA_2L7{8M=FBHY^lDg0q~f2SFC-W?uwy4~>LDA;{{xVPJZXS@5`dvA7j_g{wJ zL%scj<8W{H_3kk=dVCOKhtkw;r;Clf?i_8uf}dO8@9ym$|I`d#>>lr9n=cNI!maRd z>*#oQ`_10gQF!>~=(IW zra~);Xg|P{4Kv0-pesyMaK@o%fI*sQn6Qrk$1h<{uQ4Q3Hk-!W>Qy=mVM9l-R`7Ki zz5_%Ff6*HqQ7s9C$lMcKxd1K{b~hP+Oh4eJ<&0IP`O3gpt44%laiY4NP3nZA*yD=8 z%Ftv_NNhAnFEGi+1)7#(G2Fso!dOnSA^lCTPxxJy50Z5C?74lkG&o;9TXKrT)9F}> z5TX382Z*89J>J>wb@qP@oIGAs(r_1Ap7zB=={nf&(Xrm^^bYp-ekv9&y|yF0%GQ#! zpO0uLwidBH-%}nq(+U3!m)2(4bnPS=uf1!xmrNzT&tDy`ym?2P&)e}4uJI3?2VrYX z-e8shTrlnC)mFFnBOst3Oixq`_K5$OE?6*o$Uw~Dk^Cep-K&gbh_5r0^EH&s4#ytT zzML_uOcvvHRay&SUeCgRgju)|F3rXtFi9C3mM^hZPP?Ohxs3Zgpd3(t0}#lZ1^#vt zTP^DwM;x%cjD?)6R^cQO<=I7)`j z(bN>!OnUJpV7@vTszMDoqDP&r?N=S+&}b#MW)KrV4P#0eUlTST zx78-|#>v8r8exTy7fWJNudrT``P%?pI*t+W3Ii_WQ>%bHd<+Fk5-fQ3@%^J;G-*5j zBI_o<33`qKl#tpmkJj;#P46HxnRhxqswY!|N#CcZeR*mQ13q(43-$4fdtBgp89K&9 zVgG#KTfvx$+50x?f#zUAZ4WOnZBW{uoK9KdnBh0KRd{Iwvk8_qZ*Z1%8&{diIH!b{ z4j0!sx;WqPdDyN#uuHRyya4dnO-YOCw1-e>0n|Bav_jBZIzbi3(%K;YxCYOl_CfDx z=j{F>fvFa&Y(f%}W>(opm;z&raH=4a$Vh3Jt-fsM-8r6!0)Xayn^*a8!% zj3ULb$}=jUlB!89+CU5ngBO_01E|m4gYB1xFOLpwI_CSbrHW`OSDFSs8{@T)2oVXF z2`6C$mNA`8kfP9)oICP58rnC){s<#b@`x%YWJQJ5HSo=%X$u&_UI^HQb$3he>HB~E zE7bHl@(5;1vye?#x_(V)Gl}!YM38Rf5TgKLdR|x>1<=yXphNkG`39HkI32I#>~k;z z6pCSmmga&pAJ76k>-ei-TB>{jpf17%jlmtkjiI;*uRO+TfK}A9V0Y|ky9v-mn2!yTsy>d0Ycuf-DF}lm{H%1W7nZ7q**1x}x9+n?)urM3@scCmw%H zrs?=xE@~n+_)Q&_FrH!TTAdLRwscL>off*(FUmf{m2opA{ zM*Sp9X4YiMcz7R@FVDK|0a%E009-($ztOx<@fR}Y2=h>>%H>64(t@-COXu?cI{yE2 zXf3Gngv||syK(G zcHld^Ki_Nr#^e1Pao_zLFK_=w+-?8Ho4J1@=GwpU=Geaxv-fYj`Sx$b?EM?>+wb3? zyZn#bzwvNu;(q%#UUvUR+-v{F%iX>aciq16W^CVxxwmh;>DxDA{_Pv@J8j>1ynQ1c zvVG&Z+c)Aq+c(~n?Hdm_3-tE4sOZyo0~wW;O?qdC=jQicbM8?~Vz*P4){e^w^2|kJI#! z8eay;ozLo9b2o(fFQJ)BKD4M)@a-Pe6e?Px68nQe(8cMqTqvHV$5Dvqu}Y%)ds$b+ z9HpAx>#y@x#f9gt>zb-LCGg`Y2~(>AQB)~*1=lliS85jW8$$l&4#;ojN8SSoK!?q+ zOSSAdKbyzlbCG*b|q5oci;9@6E)X}Zfh6b7eNFY3Qhx)b%I_}&#W zjyqRPL;7Jg6N)=mj5ku}t5@iX3u+ic*|{t9@J)a&9!CMQwT_0@2e4FOM$t|u8X)0) ziMa^x-1g+6d*9li=-pWz!%VFe%+8+kv$>D&H|i%{)5-pY36?PAY8+t?CVMP}!(k9p zRmuIUhRKOA+^y;)7~Q{0C_GWhZjshyTUOnW;^3Jcz5@TRiz3=n`+NgeIjGT`9q=L)D>5o3|w0r zlkgD%htAL2NifAT)sqDWmb^1s{3N;RTD2W#5^k^0Mv%H`fz2~yV;F~0adpn??Unzf)$Eu zs2MC)rxAvB7f_Tk#ip5>QgZ6?IXR7}=GJ7I9*I+VYY@2{b}AN5%_zFEE?I9TrTG?y zdEi^EmI+S1G*V>s6WreO@&2h*Ee7jwUH`wT6TWQix%OwliM74;KT zpW?-@bjNfSWH%sCtD58H(TC$HG@2Q1CZ!TZF0E5gOr>}V{3PA)nvKR3vi0mYlWIng zOLRVhsWj(Q)SCKqRRAW6jyRUHeQuXKIC{5# z*p>jFArlnE39S6c&ICdxySn@<-&ogK)(j`J)Me-#kWxv!5Lpbaacs$Iz14acZO)81 zjXGz}yAyqev_cUWU!34(d7=%atW@tGzRQY;t4jsmx2!vLkFPo7~SUz_-j?G68Az1AU)hr_xrF4aik(;>)y}xCdrQ-3Hz`uxIB99PbIo zD!^&-T;XCcMgqA-!ww+L9-kTY!wfUf+59h7zGPFa>XNaZE%VtblUL_^EB}2?zHUXK zsA-(q3ZBRwGQ9P2l2wh9UY=B^WZh2;Zk`Yg&5~CriDs@8Myw`k&k?FDdgkjKZ4h&| z!Lu2^YYiS(d`Nk?Hcr_!ASQ8rF=~hYnAtj`v@C7l7!`P@SUKn^9P|D##O+Klm)VoA zzwY85a&#m8`|8GueqdV~*7!=>C%-=i4QuiUF>VR8@tBWEr&|zGA!pNV&17vN$ShIx z%V#C=4|TBH7jMKF=yxBK^VzmA$J4QDuMzu6z)`8M$^ukd62*MBn-+|`=TW$_Vv#Y7 zb-ufBEf3yZi`R}8Kw+~^cv3ka1|Rji#&<&U<%ql~`X^qOUXquS&V&@YYY?EKwMSzMPb?Tg3SCTqesZmFsqv7H1eIY<79r%2kr1xs-U<9jhR z=Ha%(O-9b1ccyan-AzKlgPW~cO($1QM^H`LF9F>(b{mwML^QjTEr!D8_%ABhiIju1{|-6s&C7RVl?)`s(-hyJE3`x0C-d$pDNRWF?dwGz6|9 zv0B8K_`Q=H!cnm+Pcs40=`|B7>x199WXQTE$PrY4nq!LyCz&%Md);iM>ikTxUDFE!dk z=iZ{#oYvbTSueG3n+3vhIBb(wx_ymbsgCvyenodSe`AvmzVNhTICUPkafuE^_17Eo z^=jKb0GTZ#!_*&#*8_hf_&}r`h7`)sc~Lzm?NK26q-gQQJ(MGU5;dWEC?CcQn_d(b z!`HR#@Tb?)@NI`LUf2;sWv3rNOXlqHixB&pXZx^HE8~BT3#}4jT509hIy365ZS(uMu+zWv{Itl$k zv#XqieuObH7h%)cD?rBPCwV5GY%~F-D{ax5M+C3$AXQl+Y-4&x6&F?&($_IdTBVxC zhXo`rLAE2z!Ft3Gt#U~NYKrjC08>jV5xHIn8j?EbEncacexz0DCECZ4|+z9&n|6 zQW*g2Ddbujjh6dCFBM7H4H6UQ=$?~P!RkX+3BvwZT_oqHOaaL)m6;1vM~Jvf?LCV9p#q*q#@%GX5pT@3!V9@avB>pAr;gExQ4bIl*e5}0L-ju=b8vGO`Ei$`qu}+XVG!Vr(`ZO>ojX3oGw7*ezQ8>Q8N8&q zDv}`n8pNVfp@d6?EX43}K0VzN4OLkRSQ164xFWX6pduJJfst_JWIV6tquL6-2E#Pb zg;m)1&Nz_>#CX`p6VVgtcu5P8cPN6ELLkFEAXyS_Nr<=H7)gNN$5_%gfDCsSk-A=Z z9dyeIMF+aUPs6jYAEq}@dkS6Pr=lPDNh+FaOA>Bb&!ndghiA(V-CrqFpL~eAK|Q${ z>Qf&$z?^ge9g9(7aodGL{9$%$%r|4?vaEnRru)Ou7)CKNXJ+*{#+w1gxj2dB{!J6Q z%B@HZ)$ER;bJ#5C2Wjxu?_6F%n|IJ|z^ypwZR*c5hPU+xNf}QQw)wlgO^3T~^3c?2 z<10PmMddh&2V!B7%W>KcRD)3<3yTJ0&PE?1p4f4uy0T*hHxAWEGh4VOl}@^)*E#2$ z$WqGY(4?wgHZ!^UI9DNimJ2Jf&Ot(%vY0?y%DgdW0XXN^vgMRW%?mG|<0-gWW;RV~ z_M1GPHH%`_b$6k8dI_6q^U5AeZ(es7=8);VD883S7ykSrJxe@^@fiut9|Aw|ZA>+Z zdZ>|5$hDhN%XnpSTT)m%L z$8B7E(lbiW%sZB*s2UzdFJ4TPzU370y{lCtc+QIRhuN+2aT2`^&iQ4je=+fx;B#se6Z-j1H+1*@@E$Z1gyvB1wTIThe`TN zO}?_DuAx$N11UB60&<$Rg0zl-=@pLZZ|J{rW6G$|IN}*4>$30EHCJ=KSx^T_Wb9p^ zzn&jl^sTwj&+1FSkcs^BXYbPa*GX1%B0P+a2YIIDPuPGa&)9*8-l96s?dB9aO+R3F zb?~JLHcz-9ZEVWL?<|r@KTR&g4UFm?M2JsJ(EgTWqzbeuiVGNHO@;UHWiP9n46_}o z%>ZM?D+&3hkc|78{I1%~WMBJek}gnM3E|3y@F!@HqWYe|z+RUeFsE zPrdN)UTE*`w~i0$UuN_MU)ZtlJWY7o^lcS4goE0Q%-##vv`=39whuf^LdZ48G#J|= zM0=65o%=V-i$ckk$OzZ|FbU%HpT_k@77t8M_N=Y9L+Ob{BIpIX z69jQipF${RikB^@Lhh2*g_!9T+_pjSxlN`!jp)r@ingqd58r27M8A+Kiqyc{{gmR( zYk>&b2aQ8K_*(*^o;|}O(vq~F%t>DykoH+${9VF3BT%2TR=A%ngfr`|;GtiqEqX8+AZ9iUiNl=&Zsxb z(fPPF%ZD&+y0aokQB>-`m&N%oxZ>yfc&;<=QOgO*fa#U}0jzQbze#ORZDLU&$eY+E z?pqs_uw>u);3t=bueh!rz_+rv*54(}yB%J27X~-@-MASFBl(iTFDr6BR8K3&pgWYt zrIyUI3HIeJ85e)shBWaJth-g&pb1<;lZs}D6(nE$FZ_I~i)0KJJo`%v)^~VTugD!? zao`yfQktg$D%Ae>Z2=t>pRWnx_BQC}D85T0+-u_)2OYf%n!sUBu%I5sH83(N{+Fv! zR^RU~bND*doZOktn;GqO;yOH*BOS6&e}&8kv52ja#0Wd2M%w#WLiWERbmg zMb$8^5V9H9)7xRrHXibeOnxd)7vc+J+Uvrn1K;g{`m0pLe~yFr20Kk)c-2v=^Za2~ zp<`o$&lzH{%^^NUZ626HX)s6s@}&ta7<$IjD`e8esUabALJv$pXdlOBz-xiXg;V)j z#=D)PUW?ud#Zu}U#T`_k+HzT*Bkd-duAx%du(?3)KwymQ_qxs<4Yx~~^#V*r`rZ2M z_|r7}a%jAx)XdE$eIDB7QXvoE@i}B(s+q|kD8DMMu+y9 z$rlq-bdoI`;p0wR`7S<-+dU@P5J|E_th4>NaN?e@6Ycn=pZQLxb-PzbR<)BU+^md< zI$4>zXR4kWM-N0V6P<+;M|iyYwT_31S0S=Eu;2><+{WcO-Y81a@d#8h9={IzL9B1v znMGpJzEpp$UYh23fE)z(lspSllqO%qH7ug54W^mJ8w>l5!G2?~^V4Lvqc<0vSF?Lg z+HRGbPGGH0Zh&c^8Ux*cNt?G7b($XgG3_MbQSXs{Zmg)R^O9KM<$-Wk1Tu;&i~(gc ze4qi~r)ew~0(vDN&2^~wlL8crx{S&MqWGM7J(aJILjMsuwJbPI`2xJWx+1V@e2OK6 zao8=<3HGCLI-=-8pTcB}ON$a-YR5^Do2d`VFJ@^LrEJU{6&@GcIN73kRw}aLXa5t# zQC{58vi5kCW(bT)K0Y^IT$n)ct&%BXOrBd|du{;>7LetXaOjv#ZoIJbtLZxz6Csx= zSZ*wd`a2}Rm)n-!BDcuHmf;fR0iinJlI(qv8IxhrID@jSIqUJkf#uvVbzn!pIR+Bis30+l{fOH=X0~wIBlhRPR<8@Q% zz~t+cHa%gM78CyZR%+NCS}h|Im!xWjq%vKP&7(^l4`*EX2n9O0M5xZNBeqIS-*@n) zz}ihBXA(4uh?X}KsYg#@f0*=rek>Uu0QDAr^>)&@|I^RG&71dIg)ZHUsEp#^YZ#4_ z3S#g(X%H7n;@6=CyQ^WRg1p@-ps%cQCQp%1huo8pJw7Qt9k4C|)2MPL&u?Wx8U`d7 zcC)!ZZxsUc@yhH<)T>};WWhcvu)NIES(!Uqg_t+^EAn_i7UEaYLO$3mVk0$ld6p#v>p3i>Ri%(Z)Kp)3jo z>xiKQaik7$*he577&+N$80p85Fc}d?DEC;4gtMfCC^Flz5+DgQl8Qb?Q!Y%Npi;zT zh6K@P4s!t%J{Ly1Zl@3Sn3hESOTT%H(Ld0H7sN2V27%OMJPP6t7AO=JmkZCXXdYA; z$_k7i+GrmV7{7qGptEt)wLm%YjZex41f>jyP&@4j8W-Cch!HT>2Fr&+fS^k__UZ@t zO1sR?RA4pcS|rMV)N0UB`pA=~!&xe}1ete>RK+6B&vn?LkBv3k6}K0VL$lGqkO8hYIS36?Jw18b#rs0hW}P;{2M>3wc5sCsvE0o>(!0wdUYMr zYa8op)xT69r~28SF;0F^nY=N;5 zjt5&pcfVL3_~CGQQ`BC)+E}i>T3&f6YMWc||J9cwzDmSjz5kH!D(yyx^#1TccqR^y ztmGD$3_%x@zcgA_I)%`lfIf~RtT>YnKj|RDX?H-c2-_L&1HX%oNC0mgo$h|16@K4;w99z3slQw`8&kOruKi zQ?1S89S{C<%Cs6gADfM~%sSYAi>dv1)JeW}vRHnGvFH8Ve7kO8z_eW=JK?PT!<~bV zyA7GOKkW3!Fw5AeFy;<(`gAaE27kvX9aUZ=t^%}*M$ot9s|W!E7Pe=}-_UGoHvaSD zezUO)G-AaLhAjG{)?Te1cP_wG>A)f*@LKPo*un1JLH!*T{?#i~U>1YS_IQXhc>gO@ zbqtEF#W6kd0i?BvaHx?WB_EDMuIJ~WZzuu9wbO?=^k@i1|K-%$u+!AmUOvo6`I6sk zs2wm6=Bh9qk7i>6)!m5W=oSVwuETUHYj7!b+Gi_Onod(-Id@8?oOBz*uhU8gGcsY0 zN&>L@r&SFz|8N#=dPaPDzI}=xAhceI{rKh}^1FL||J)H;`7rsXH9W6|1NOr2MpyhU zw|D$`*BP@PTaDKH`tH%^TnwHJtJG*Zg?QfvMu9FQM=E9SFD;3`7VQCC@`Ne=*J1`` z36e4@2$L-BQd0P=-&R9P9*@c0{U+fDWbhSJn>$z|P47z`G}Xf14SYG^O)c-}?f*6T zk;;!`euTVWog;pd3|~qIqy8Ju+YLt0@)KA925GV6{n4}8)90?AT>FpveWp2dm(MNs z-{uOYY5Q-J?7!Oj=9B&R9X?gmsXq_OcmUiV-iQ&Hbxxaoj*@K0s+4agl!r3 z*n@r_F@!+343(y+lY!bIZ-fj@C5x!utBYvhwggzz8^`EK47$|Z2v|ln{x?jmh=s$o zp%V_TAmG_7+M7tw!eiy1_IDe*VxiuG-wS2&dH>}7 z(Z>@35Y77G$ro|7C+de^#LxSOyJgWhJ#IEyE$^r)_CFjS>^C5dXJOpxdJE+ak50tF z{)hb&Kzec{utJGyALi$yJ?}%Kx$_==*5B?Q?4Nuoi@p65m}OgH50KWyalLu6zw_~+ z-W10lo5x4322{TbXb<-f_nJ^k<3r={WC=_HNE3}u@I!!!ad1FY!T2~jY#jlLj~~R_ z22fIed(dFi(1@Lb`u>Nq*sXu4ze8%8-Vu~)5}2gs^ZN!R0scDtf9GWX=n#1Tcu$(} zvka|joZy^Krnn!>h*#{+#2nm!sY%msNt#En(K=3zMNrsl)M*RSA zwXm=a487O5MpqFGO6zbQ4K$2uNTO1v4yUv1vh!_?!Gh!gC<+q{DJt%FF)Ch|ps<1@ zMNlff3KI-;E^v>W&l-Xh`hCDp(Gp{iplGN=u|!ibG2X#C1)NuLn5F?#1?#~m4*!Qn zxYvv2*s^JaX5t}3JnOiKr*lL_d6>k&ANuE5s~-$7=;ETN6TU4WekS#K>~}8x7*rpK zpQ|eA;3C?dLtJyUPuT<3zR(Ls-E$t~+)T?Mnbxmm zpQeXo6QXyru%Ny!H~{M5`*#X(A)DgDo5-$!()@6N>}acn1^br^hi6#;4gQm6anAt0|T&*Cd>!0`9L?P;s|UK z^fRIcw6R@;immcnhOCRO%2!`A%s{mxhsJ{W;R1!jVG!@ps~QZtkWI-lW28{3uM5t& z+1azJ-LtB7px&9$l{;E?4(-u$m_J%}j-AnRJZ-e>?D1&X%Z?VxFaonTMPPPXS%GQI z5SX2oD=@980<%+h1g4%97&CkY?Ys4SFg2+(=`NZw)%2*2@D)~9JTHa$grbqB@ff75 zO%ohG=_CFjIFf#WP7JF;zv1m-Iv=c4w!PnlF1BrTo{k^`N;8{Cce!D1$fnDP2ZfdV z66*GMVRZ`WxC_2$?euKxeM@uz_HQIoGL{JJm^a&&E|5pLDE02Tjh7O)t!>eH(0jN^ z7AyN9e>)5rsGkQimJBZ>@q+#H6H(vY6|IwxdtlA)oixzy1oK~(0=PeV!Tc}wneP8N zel!QrZT=rfo$&vxR@a{VKi}b#@BcZL4xr5m2hf`M?{M(s{&{l$Jh^|K+&@q5pKs#+ z(cT}{#kTWDrni%f#4a03K{Yc_F#FO1|s>U;eNn$XU&EMY+3 z?Qoml?QGL&j1j-)f%5t;_D2_CCsFUcD{#CsG&e9^9-13k-6GoNpYpPh{Ka>I_jkFmi&A0%Txmu~k@9J>+(m1)zLKZOYunC#PW@2*XK@ zF2H_u0YfyDfOcWyO(OiHUZm()P_{RTr3({Kcqd_zFS2z~W)wLHbc(K*7Ku54;x$>x z2)uNOqeb!G0W_YUZ3mjulgR?w4dlW*>~l$xULhAguLb1wqf4($I^TcQIWkr{WywoJ zLf(N@7a0vO-+|5NmgzhM*9+xQ43tQei%unYUiyKa!I?aQCrBI+jWbOAFa)Y=eeFRq1zdpL{n`X^#!0{4XxYe zK2MEBAqA8Lk4~5mJC{SmpbIz;%u)gJhH-%;uY`Jf)9_a?1K9-d|JJlUR2V!ZeLzRQK0_cpZu7Y{7ZB@+2Zu6(M1AA(tWkXVgcy4@qAo2Kzn`}i2VX{E`frdruHS-REin33}ZQ6c>{Gp=5^ zZX0ETJgxu!1=fGL{vY|O`M@7NiVtYE|7WeXwql+CsjZ?5Wpica$^Y{`KFa1dPsP`2 zFFiX|MuS*cSy5MQ>2j)+kwo1MtX@~EF zA;r}~o7_!=2$Yu)vH$t{L7qZ*&JU+6`Tae8$EWZ)5-uFZ{ufq6N$ZFpQ*}U54-w)a9 z6S5~{Pssk1$o{-q<2$MCM@9DMorM25WVabEk7`nV17q(|&Co}+wjUMQyepJPMK;%R zXU;C23)!PC5$9eB&$D=)cT7#va6j+C{0sg$hQa)ux?6nV&(XHG~~56dAnKgC$kvp&%-_rvO+W|P z6=-Au3JDFdTK7)Ki0vIDg$5DLx&eM$CuAMRvI(Tv?cZ9gs!VQG_yFXI^A$h9UT8 zjmF_ihvVGfd3d&FhCx*!+ss2YPj6BOtmrn-VBB;`nI9SPY}GI%(8y{^RBLzZfSUP< zcvh$e$bt+q{ISscxtrN@kyXtMN@Dj?OV9jrriU_*aXq(h zRPTh0MB}B_udiHob+sOvADL0s9XHoPHunfv(__;@hLpWB5;wQdvL#DXlsiXmq71*h zBQjL*q{?1xIJrDKugu#_Ls^XsjzG6-LuIfrb2nt`G+VA|q1DFT%d>fV(;(Z#(l5zI z(BxTujk{46Xk?q(xVX13h>Td`&)Ta8BV#$kZ)-0fjtqwZ>BaSo0NxiFrLE{eWG$uc zi)_^u+6PjWhio1=b+5M4K zXCmu8A#;#TJ?9sE8)S3sR6HuO-k%$p@vE;rCNj(9eEH`>X0%VuMK<5|+Dix081c30 zgOM3i`QFGjry=Y8(a6@n5whxok)0XHwJFHv+Y`npw)s3ivW+}sFYk$r)#!>sw)P-owRw?EKYwQUTs6qF2dGzl9Asp0 zP)C~0r+Xp8KQ&F%y^w9X$TYiNJ{(z9FRNd!J{(zR8nVrKkgaMwdLnoXWL5Qzk!{`s zSG)U_d-T#8&2;1k?CQnz$cOQ?u5+r!lNP!46@+C$kilDlX1PRMveW^ED=9}e2Q6S56W zUIrQc@dL%UxsdVVbz=%La-I`;b0K>*6WMx4abj~GWV}RNpTt8MXRj1T=R#(tp4_vT zXDW9yn2IdBmYIqSGspnk^yfzA4r=pW1bBei-pv} zoJ|4Nx$~U9F@G`*nf>QBWOw@WXGZ3U-?zPgv-3Z>@n6&fVUHAJWOn?QmCenSRV)6> z3dR3jt3JK|^gTWk@qhK>aQyb?>V|y$b8WfyQq*74@cLV<^2JpW`45+6V zz)vxNpJD+2iDCdFxYEP&XL>UVJ1}0x!|0Tz$FWHZ&OzW%EuCj&|w?1~(=iempqv!2WjoWYI&r3m*k8c4<8Gi@e8vdO<(q zvVchsC(#R-GE1I}q$x*XVX?dIVSG}j;5LavVUde3a`{CRHOy>8_V>dYCi?~gt} z#}Q*@K*3PNVBibP$I>>&_Jk>H|FkThJr=m@=9J|O7#-9jG_syEv(DkdGK+tp*cN0qhfppojw0 z*D3nx>yqFA=<;28ig63}J*dil!1JsX&AAibfK7mMu2L4wv)?>Y%q!vqW{sOr(FXnCs35+DB08s?D;5 zfO(U+dM%)_SO0i`var`U+5gZG3$^Nns18ImS@2-$1mufizbCH9iUaE>J_DK)u>Rs3 z=+~fgiN+k7Rw_$iRPZxD31nR6Fd-bg(peH>HyS=qxhPmaQM!cLVEYhbneuVi6+dV` zQtx(TJbd}@wo1od*O|_b*EA_z0-mD7ScL81z)=Fgd-m#fI~aa zQ&h%@sS@U6nB-u%^nx@T7)2;Z`VBKtrO zbS?v`66G5V1X^VQOUlSquzR~K>YRV!e+}A5BVxuxp2$#+EFvi}9gHCPm$x7HTKoU? z8;rS;&Ke;Gm4oAjdZb7!d(C4E-)vJ1EDW*CSR&ZFOa7Wv#Zfx>T#SYg8CT6jg9%bW>z5 z+OxT27HSTJxrjB)^QGr(Tm29w-S9k2WzH|v-%2HH>>?I={%iHQ!jgw%>v;}vf})!C zimV#T!ehoR?Cl>kww9snvel#?6a3$ThEk~IPpNb`wItq%DopMR?FE?97pTt=NRdXg z$;M0K0D2@|h#JCIQN88K50DZEN!0&}y-l)F7K-?1oldSKnKE~mBSL`QDJ`^0X6F>M zx8tzi6}~V!0hgO%aKkHKSd50Lk&cP>(sbBHP}5#(wtz;1@Z>ex6uf7nfoq+9lsJ5T zB%bW!!;P>S{~ungqiPG-9Ym^h20MVLP#3l-Ll@h$&Nn5#AuDwM8X!5WA4`UiRVVLG zj3gO8*(^FkU_(yZst=?ECnK!Xo~dAT`2B%HcjXNX<#SkM%>|1Sj)X*A+CF*LqKAgs zFb_1!!b$t4wO5IwQgEmjCj}yhKlc}lF1m=Ln?Fi0-UTU%g%Xe5iZ(HA{DH}oxlwr4g-K8TrJ;6N@Yq>2`pFR~`0Q{b6pWZ2#3jC-cAokr4j zDq4j=s&#p#0W>3Ci&}MY1OHD?lhmqUiH&1klrS%m|3#OE+@WV_DPBg6<5`*tQANG3 zZ^_0pu=gp(Gdo3@HI` zE&56t*d@hy$p3TYCuTkZ!ICQ}bf)9(PBMz3UeJYgeJjF&gwh1~&S|{ih{s(;9&21s zIR$7C z-L{k%^nhghj;pR(3g{U?+13jFbh)TpGzJ$J0Vv1Y0%Q<1e}nb%mZ;@SI_@AKIp#K* z_OQ2Si9A2b8lg*z~9#rU2a^*nh{ zmCvSVc4t9(z?6#aKZLr9qv1Ih$M(}}d}iQx1M(8PW6h>j4iLwAM=UpObHGV_r#SY0 zR~0a)Uel<=$*<9Dwp;Dv=KkT%{&D@F{qgYU!=ulKvTiKlbfQdWwouDXSlNLR4H9%$ zUZUmUpE0LE2|=N*e63aQU)lO#Mnf4;7F$->%(z#9R9mbp?j~}_F&W`LVa|pl0`R<7QX78O_97Qk+lysB$n*L~w94zC@NQt4fIDq}Q++m! zN;CHllTqbOGHQ>mx+7|10UDKz(3~@SxAuVy^h7C5d&&M@(i_3{ZmeD@%HhsDd!!v%&ytQU zv*9eOO2(ZISkk&Su1piGtFf9u=Q_fn=-_^;e5hQv0Cm(d+bTK@Pj%|Ym0Rdl*&$yH zN(We;XvCe}5R)pnN86>&cMi*mq;nCVJ4J~76!9UI0WGQGV2K}UruJ0c;6AO|ZHDjL zCgoi8UJc*%{cea9-KT6ZF;?JjBp5DmG1a6p3SZPymGk9;0hRIZ#U9?WNjY_zc zSg3!WrgZiALt5?4;Vn4;Y5SDemD4H&Pzac+`A|45u#o_fcvRLxl1L;{h1BrS(Vfo! z<=+2T>U>SY^I;SRk8;Og_WcjM0OLteDE&=a!so*OK1M2 z_eWFp^!Z+&-0{!HsUPe5*KPN|)~l-<6ZgMXs!#8Ke~-_^{V&<~<*%Z)v{nR2x*PP8oIG3@VzNnB_s8^aeaXrs9Yp8h zP~E!{`c8mk$liEJx)a7YEO9_hp(5^cKc3wXGv(1d(Ln_fLR)FuH9U*`_=cN@r<3X6 z=wh1=p&mmUT67MiR4nP8oGes}m(~cpNA8(fz_h%Y1<(x6L0t#&4mtskhI>(bIlJ=C zI1YAM5M}{>1eHH0DDAV&U4J?r&4CkouYvB@IT+cv4%68z?1SZa+DCb421zuIJ3%t5 z0E5^NbT|k;i;D`zT#cFy#}0tmFxvexizu}ezok00JimpvN8|LU_aPYAU|*xK>#!k6 zVOR|v-s&4b(Rf5PE8z1S;4H#m*qwlx@Elv$fHL^W51fPFLQig72R-{po%=@_v~+tV zkE;fXJhL`P_WEe6vGcLnXg7~{EZr54I?M2%tI#mlp?u)KJ*t8WsHZp`IGyisBjN-2H32N-PrB=p$I^)Oxu`Bw~@VvzPw8VQrsT{iM@)@V`xGhP>C14VDF0h-3 zPI(`i_7K2k-rxJuKKgmflb2aUkr5i?=#o@l5 zjyAcAb`}Tz<@N+Y^|xT^T3aSy`Zt=N8qK!6Ix9V;5@$Adt}39=Nj+1^hx#Fy=hG^2 zbLVe|Dq&Ui@o-jE+1#mB{f@FK#Z!%^MGtRekR;*Q$r-(LHI;<`CQ;hdfOTy8ORf5w zC841d9-|}yuEU9~4xk_6Rn1O3bl~`IC+>Lg)qAmUO&So^cU6qYMAB}q$dVqmM*!KS zYCqY%9gWp93s`5JL{a}TOs)GT>dv(}8g!cO0JqWrbVXmrSdiLR!2$^ccLXz`R!O!l z;o)GKv2dyzRAz-Do*`*v+UF_B_K?m4+$GQ25u}_P`%@Hws9`|%_2GDMMmiG8DrAlg zO6n7HRZTpos1Kkwura%AYjH0f^<=>!7h>jtSqXh#R9zqbhAR0mp%P_6RN5|tFJ8=s z*X{1i3H?=ZiJ=Kx>3^lvxyNV`BZ@^{=#=D<3C(Qmi*yjSjn*Ma_UlmqMqf zYst>j&wf0T3@Q@K4~cE3%_vGghr@1kb<|@~geeFGOLbngtp6`lPN9ul%&gjt%`Ap3os~cAs!~H> ztLhzCZld+0ZKl%MJI)O=|tubCJnIXxAR9n>i0tESIeY)I0)zDlKN9ye4 zDH28*JDe_9q`6qYSx&bCTlr8^&iKIm>{=frWU8_!d<1LwrkUp0h)A}?LAJI!MDn}6 zs_~Ru$<6;f@ghs!N;aV?gbG!`!gt#E8lYJa;6Fz23bxeUp>y~AeiGQ?Fsn`|6E zBSXXCw!vnOM7VhMkw6Eh_*>@pmRR@+C-yfBd8(3^;~>(`3XGS9w6dBl+J&j2U2sKv zH}9l-FY32k=y{HcVY`?lI^Y$jL!M1O;$gV1v|jiWiH(H=CjI7kLu0a9CkzB#eqhldl>ikmRCG3=^m+;h&1p=vNE3weKeDVm`SD zVC6IzC$veB1o%%cifIqv1_71}Y4p!})5ZbEMniO2A2J4D;tDHotmJJAc+$OKmzl`5 zi?XEK;FMy6QcDZb(OQP{cXDBoob^+y< zc7Ro4PS2okI5pv;oia0MBy(l~daRREatMZKn!y zX=kgT#7q_B*v?i#iQ9IdI@hV4MNEk{Vm@(fLs5!}LC9K<>}|&j!$?rg5rk-t`ItdM zacf{169V1}Zl%gNTjPW;U|!+%W!yHs!eNTHs}u?@PI?dE&tw1WEa3YsS9II+c`DFa z5of$%n#MPv)|O=HWoPAzh2=IJdSI;~u1P0QY#G^5dQ=w|cKjid7Y7kAS5HPiCUm}- zy*XF32+UYJg#br-G3&Z>>;MV@x4lhO%GguPQI7T}Z)u|;;qIpLeGTbM%NoJ*NH675 zR4FAL)b;LT*x+t3))MFeiV&FFXZziynL7xQr01rtFWv0ch$jgI%${{C#h7Y9N?vc z*?0S^tSN@ zv`I^enCU&kQqyR8EMA_6&p!)aR=|Fj?-tXEV!7eXWAb^zOLRa%H!+h1fmX9S{z$&r z9VJ5XlX4ots*rpeX6h)s>tgyP{EdfKnJ_Kf9f5DYql(Tq|UhwNSu>^HoKd5GF|tQ|y5iNrNcLFKV#S)r4|RDQv}3&mV++)YyCU<&ewT z5Q?38mqp@t(D=+5T%b7^PJw0b>5}>)ne@*P&_1Z1*~*;1Z)f8_eCzYQY&9{x_ zQLC~JJzQJMcJcC}_&DnNsV&8L;|Yg44?r3kFpqXHX0gDAo-Pa3K=0svAe!~?7IBEPir-B*U<-xigPD!a2jb0JT@()sMYOa? zg`aA2mSwz8-ugYIb}arJpRL1^7EkYhX8dUi( z8i(g9wyZj33YoD-@spN2xLZim29{tnGIAPJfi;?1mOMU=yx(elY_vSPNualdKg1%H zB)x%_QQ!gMj4BS4^OS^msahh(Pt;LW3hF^ev4bHgLOL~xoJo=;zMdIJXMI?Ihl#w2 zo~0W(W8&uKHi9o;3Oau)u6(+(9tRa!CDDRGQpSm9T5x3-C$>$Hj`ZPbG8hI(2xMGE zo+LL};#1@lLDi+*;TMHv0Q?F`R}?AGsxp*4>Pu!~7;C*+VmBYT|4=iA!!bv;(0o*j z0OU^8?^?`H*qR_N$&~}lmHqG%2m%FM=71d+c=O-HBmp#oB~hdXs~+h<=R<|K*hb?& z#+VUUCc*2fIExI8L4%k*GG_b~);OcoL^}GkCfNZJ407DzHFCmpac_(!j-&!lG{b}) zhk=Z@hLf>OkL z66{RjJ1Bk!0~`6n8y;d92POpjlavTE?ouCy53chSP=X10O~*`MvP~E z7L{5lc^p$V!OSI0S>j$9b|rgM7ZiV9FOeb$u9hf;0IB_~9TV~bM!^tY`$NeM9K8vOy46ssBr)1L9C}xjr7(!JT>bcab zz!VJ6hJ9dB=D~_E>o{t($ zF3<4l-~c1SlcKS7!mw*k9Xv28wI4;7H1qj*51E5ONo{S3x2;%Er})DTNGb-4Q*&U4 z&aikiEGAl*A6ee+HhKAA3l?@j#yJyRnJ}sd)iMQrNlBw{U25XH^!RMP}#N$cG`sD$zp; zp%`a60;?!qb~{v$j(GS>?Y9!jMl467l7ZbFoK-!VZgJ&r_frq_?xpX|>?4M8=9w8i zR8)G(!v>aQkBMnL)=@o{?J!wurQ>#&=N+=+-%ri-hR#6=kGBEAA}JHOYVO84TaWVq zZwkSb6b?{HDMLxg$C5Z!gD62~73723V&y#u{2`eWL+Dhncg{^Qv-xm_K9_!=3>-E_ zVeNngxeQav>M2T+$`10bZi2kvt*aTT=l{~^Q~MvbNer`phcHra_zp&10I1tkN;cwv zE{^evKu&oGlNs46W+j#XKbijUaOERcL9PWOZD4IysHG3dgJV(1sRLU>w>RYtO18&x zCoCX{XPqv$e<6Q1S%4AdnF$1yo|?h11914RtS#f!UJfU<)XASicjSQL0<6Ik98Q@S zg=Yaa)WpO^B`+@ylZ@~8B;N^uuBq}e3g-bGST~iS+)$o|U;=we{p$#w(pHJo)|f*C zPds|VhZYh81miNzT6$;JDbzfV&0(DRKn6jL4{6S$A*OX59(3$# zz6h;QQ!(oMAPe5)`bbTBFbbhBJ#U{U)?r0WtQfs9GYXzEA5F zs+n?gIVG=Ms(IU+Id7w8=!akpbm_l#XLL1BzezxTpoe)zFXj0(0-q;Ns3}%Ybe}!p zz^&2^F-be|OkE~sQ%-etLUS83+)tgpC8ON9H*f)j5|Y>DYFS!O><+k#nG*-H-`zf& b(icllQC6NlPoJmHANu+KPfH9F06sVX5-aH_ diff --git a/src/packaging/RedHat/openafs.spec.in b/src/packaging/RedHat/openafs.spec.in index dcb22d1092..a3332d052f 100644 --- a/src/packaging/RedHat/openafs.spec.in +++ b/src/packaging/RedHat/openafs.spec.in @@ -1,7 +1,7 @@ # Openafs Spec $Revision$ -%define afsvers 1.4.2 -%define pkgvers 1.4.2 +%define afsvers @VERSION@ +%define pkgvers @VERSION@ # for beta/rc releases make pkgrel 0.X. # for real releases make pkgrel 1 (or more for extra releases) #%define pkgrel 0.1.rc1 @@ -11,6 +11,8 @@ %define osvers 1 %endif +%{!?fedorakmod: %define fedorakmod 0} + # Determine presence of rpmbuild command line --define arguments used for # option specification %define kernvers_on_cmdline %{?kernvers:1}%{!?kernvers:0} @@ -18,12 +20,36 @@ %define build_modules_on_cmdline %{?build_modules:1}%{!?build_modules:0} # Determine the version of the kernel to build against -# - automatically select the latest kernel with sources from /lib/modules +# - automatically select running kernel if there are sources in /lib/modules # - note that this can be overridden on the command line # %if !%{kernvers_on_cmdline} %define kernvers %(%{_sourcedir}/openafs-kernel-version.sh) %endif + +%if %{fedorakmod} +%define kmodtool bash %{_sourcedir}/kmodtool + +%define kmod_name openafs +%define kverrel %(%{kmodtool} verrel %{?kernvers} 2>/dev/null) + +%define upvar "" +%ifarch i686 +%define paevar PAE +%endif +%ifarch ppc +%define smpvar smp +%endif +%ifarch i686 x86_64 +%define xenvar xen +%define kdumpvar kdump +%endif +%{!?kvariants: %define kvariants %{?upvar} %{?smpvar} %{?paevar} %{?xenvar} %{?kdumpvar}} + +%{!?ksrcdir: %define ksrcdir %{_usrsrc}/kernels/%{kverrel}-%{_target_cpu}} + +%else # Legacy kernel build stuff + %define kversis %{_sourcedir}/openafs-kvers-is.sh %define kvers %(%{kversis} parsev %{kernvers}) %define kvers_is_24 %(%{kversis} %{kvers} "2.4") @@ -51,6 +77,9 @@ %endif %define kxmoddir %{kmoddir}/%{kernvers} +# End legacy kernel build stuff +%endif + # Set 'debugspec' to 1 if you want to debug the spec file. This will # not remove the installed tree as part of the %clean operation %if %{?debugspec:0}%{!?debugspec:1} @@ -74,6 +103,8 @@ # Define the location of the PAM security module directory %define pamdir /%{_lib}/security +%if !%{fedorakmod} + # Define the set of kernel module variations to be built: # For 2.4 kernels we just build everything at once for a particular # kernel. So we build up, smp, and bigmem all at once. @@ -138,6 +169,9 @@ %endif %endif +# End of legacy kernel module build +%endif + ####################################################################### # You probably don't need to change anything beyond this line # NOTE: If you do, please email me!!! @@ -195,7 +229,10 @@ URL: http://www.openafs.org BuildRoot: %{_tmppath}/%{name}-%{version}-root Packager: Derek Atkins Group: Networking/Filesystems -BuildRequires: %{?kdepend:%{kdepend}, } pam-devel, ncurses-devel +BuildRequires: %{?kdepend:%{kdepend}, } pam-devel, ncurses-devel, flex, bison +%if %{krb5support} +BuildRequires: krb5-devel +%endif %if %{build_userspace} BuildRequires: autoconf %endif @@ -206,37 +243,18 @@ Source0: http://www.openafs.org/dl/openafs/%{afsvers}/openafs-%{afsvers}-src.tar Source1: http://www.openafs.org/dl/openafs/%{afsvers}/openafs-%{afsvers}-doc.tar.bz2 %define srcdir openafs-%{afsvers} -Source2: openafs-ThisCell -# http://grand.central.org/dl/cellservdb/CellServDB -Source3: openafs-CellServDB -Source4: openafs-SuidCells -Source5: openafs-cacheinfo -# Source6: openafs-afsmodname -Source7: openafs-LICENSE.Sun -Source8: openafs-README Source10: http://www.openafs.org/dl/openafs/%{afsvers}/RELNOTES-%{afsvers} Source11: http://www.openafs.org/dl/openafs/%{afsvers}/ChangeLog -Source15: openafs.sysconfig -Source16: openafs-client.init -Source17: openafs-server.init - -# from ftp://ftp.cmf.nrl.navy.mil/pub/kerberos5/afs-krb5-2.0.tar.gz -Source20: openafs-krb5-2.0.tar.gz +Source20: http://dl.central.org/dl/cellservdb/CellServDB.2007-10-25 Source30: openafs-kernel-version.sh -Source31: openafs-buildall.sh -Source32: openafs-makesrc.sh -Source33: openafs-kvers-is.sh +Source996: openafs-kvers-is.sh +Source997: openafs-buildfedora.pl +Source998: openafs-buildall.sh +Source999: kmodtool Patch0: openafs-1.4.0-kmodule26.patch -#Patch1: openafs-1.4.1-moduleparam.patch - -Patch10: afs-krb5-2.0-krb524.patch -Patch11: afs-krb5-2.0-libsocket.patch -Patch12: afs-krb5-2.0-com_err.patch -Patch13: afs-krb5-2.0-openafs1.3.patch -Patch14: afs-krb5-2.0-res_search.patch %description The AFS distributed filesystem. AFS is a distributed filesystem @@ -280,6 +298,8 @@ what gets built: will be installed. You probably don't need to change this ever. + --define "fedorakmod 1" Build 'Fedora' style kernel modules + To a kernel module for your running kernel, just run: rpmbuild --rebuild --target=`uname -m` openafs-%{pkgvers}-%{osvers}.%{pkgrel}.src.rpm @@ -291,7 +311,15 @@ To a kernel module for your running kernel, just run: %if %{build_userspace} %package client -Requires: binutils, openafs-kernel, openafs = %{PACKAGE_VERSION} +Requires: binutils, openafs = %{PACKAGE_VERSION} + +%if %{fedorakmod} +Requires: %{name}-kmod >= %{version} +Provides: %{name}-kmod-common = %{version} +%else +Requires: openafs-kernel +%endif + Summary: OpenAFS Filesystem Client Group: Networking/Filesystem @@ -385,6 +413,9 @@ administrators. Summary: OpenAFS Kernel Module source tree Group: Networking/Filesystems Provides: openafs-kernel = %{PACKAGE_VERSION} +%if %{fedorakmod} +Provides: %{name}-kmod = %{PACKAGE_VERSION} +%endif %description kernel-source The AFS distributed filesystem. AFS is a distributed filesystem @@ -431,7 +462,7 @@ you are using KAserver instead of Krb5. Summary: OpenAFS programs to use with krb5 Requires: openafs = %{PACKAGE_VERSION} Group: Networking/Filesystems -BuildRequires: krb5-devel, autoconf, automake +BuildRequires: autoconf, automake %description krb5 The AFS distributed filesystem. AFS is a distributed filesystem @@ -453,6 +484,12 @@ krb4 lookalike services. ############################################################################## %if %{build_modules} +%if %{fedorakmod} +%{expand:%(%{kmodtool} rpmtemplate %{kmod_name} %{kverrel} %{kvariants} 2>/dev/null)} + +%else + +# Legacy kernel compilation code here ... %define modkversion %(echo %{kernvers} | cut -d- -f1) %define modkrelease %(echo %{kernvers} | cut -d- -f2) %define modpkgrel %{modkversion}_%{modkrelease}_%{pkgrel} @@ -562,6 +599,8 @@ administrative management. This package provides a precompiled AFS kernel module for %{kernvers}. %endif +%endif +# End legacy kernel compilation code ... %endif ############################################################################## @@ -575,6 +614,9 @@ This package provides a precompiled AFS kernel module for %{kernvers}. : @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ : @@@ : @@@ kernel version: %{kernvers} +%if %{fedorakmod} +: @@@ kernel variations: %{kvariants} +%else : @@@ base kernel version:%{kversion} : @@@ kernel modules dir: %{kxmoddir} : @@@ kernel source dir: %{ksrcdir} @@ -587,6 +629,7 @@ This package provides a precompiled AFS kernel module for %{kernvers}. : @@@ kernel type: %{ktype} %endif %endif +%endif : @@@ PAM modules dir: %{pamdir} : @@@ build userspace: %{build_userspace} : @@@ build modules: %{build_modules} @@ -602,41 +645,6 @@ This package provides a precompiled AFS kernel module for %{kernvers}. # Patch openafs to build a kernel module named "openafs" instead of "libafs" %patch0 -p1 -b .kmod26 -# Patch to work around the Linux 2.6.9 module_param function -#%patch1 -p0 -b .modparam - -%if %{build_userspace} -# Save some time -- install these if we're building userspace - -# Install the Krb5 Migration Kit -%setup -q -T -D -a 20 -n %{srcdir} - -# -# patch afs-krb5 migration kit to work with openafs-1.3 and krb5-1.3; -# add some features and fix bugs -# - -# krb524 is no longer in a separate library as of krb5-1.3; handle this -%patch10 -p0 -b .krb524 - -# make sure NETLIBS gets added to the proper programs (seems to be -# needed only for Solaris) -%patch11 -p0 -b .libsocket - -# find an existing libcom_err and use that -%patch12 -p0 -b .com_err - -# make afs-krb5 work with recent OpenAFS; includes and prototypes -%patch13 -p0 -b .openafs13 - -# nothing in afs-krb5 actually uses res_search -%patch14 -p0 -b .res_search - -(cd afs-krb5/src && autoreconf) || exit 1 - -%endif - - ############################################################################## # # building @@ -777,6 +785,22 @@ config_opts="--enable-redhat-buildsys \ # Configure AFS +# If we're using Fedora kmods, work out which is the best kernel module to +# use for the userland configuration step. If no variants have been specified, +# then use the standard kernel. If variants are specified, use the standard kernel +# if it's listed, otherwise pick the first listed kernel. +ksrc="" +%if %{fedorakmod} + for kvariant in %{kvariants} ; do + if [ -z "${kvariant}" -o -z "$ksrc" ] ; then + ksrc=%{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu} + fi + done +%endif +if [ -z "$ksrc" ] ; then +ksrc=%{ksrcdir} +fi + CFLAGS="$RPM_OPT_FLAGS"; export CFLAGS ./configure --with-afs-sysname=${sysname} \ @@ -784,36 +808,63 @@ CFLAGS="$RPM_OPT_FLAGS"; export CFLAGS --libdir=%{_libdir} \ --bindir=%{_bindir} \ --sbindir=%{_sbindir} \ - --with-linux-kernel-headers=%{ksrcdir} \ + --disable-strip-binaries \ +%if %{build_modules} + --with-linux-kernel-headers=%{ksrc} \ +%endif %if %{krb5support} --with-krb5-conf \ %endif $config_opts \ || exit 1 -%if %{build_userspace} -# Build the user-space AFS stuff -make dest_nolibafs || exit 1 - # Build the libafs tree make only_libafs_tree || exit 1 +# Configure each of our kernel modules + +%if %{fedorakmod} && %{build_modules} +for kvariant in %{kvariants} ; do + if [ -n "${kvariant}" ] ; then + cp -R libafs_tree _kmod_build_${kvariant} + pushd _kmod_build_${kvariant} + ./configure --with-afs-sysname=${sysname} \ + --prefix=%{_prefix} \ + --libdir=%{_libdir} \ + --bindir=%{_bindir} \ + --sbindir=%{_sbindir} \ + --with-linux-kernel-headers=%{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu} \ %if %{krb5support} -# Now build ka-forwarder -(cd afs-krb5/src && - ./configure --prefix=%{_prefix} --with-krb5=%{_prefix}/kerberos \ - --libdir=%{_libdir} \ - --bindir=%{_bindir} \ - --sbindir=%{_sbindir} \ - --with-afs=`pwd`/../../${sysname}/dest/ && \ - make all PROGS="ka-forwarder" && \ - install -c -s ka-forwarder `pwd`/../../${sysname}/dest/etc ) \ + --with-krb5-conf \ +%endif + $config_opts \ || exit 1 + popd + fi +done %endif +%if %{build_userspace} +# Build the user-space AFS stuff +make dest_nolibafs || exit 1 %endif %if %{build_modules} +%if %{fedorakmod} +for kvariant in %{kvariants} +do + if [ -n "${kvariant}" ] ; then + pushd _kmod_build_$kvariant; + make all MPS=SP + popd + else + make dest_only_libafs MPS=SP + fi +done + +%else +# Begin legacy kernel module building code + %if %{kvers_is_24} # Build all the kernel modules for linux 2.4.x for variation in %{kvariations} @@ -842,6 +893,8 @@ rm -f src/config/redhat-fix.h # the MPS=SP just means that we don't add a '.mp' to the name. make dest_only_libafs MPS=SP +%endif +# End legacy kernel module building code %endif %endif @@ -905,9 +958,9 @@ tar cf - -C ${sysname}/dest/root.client%{_prefix}/vice/etc afsd | tar xf - -C $R ln -f $RPM_BUILD_ROOT%{_bindir}/kpasswd $RPM_BUILD_ROOT%{_bindir}/kapasswd # Copy root.client config files -install -m 755 %{SOURCE15} $RPM_BUILD_ROOT/etc/sysconfig/openafs -install -m 755 %{SOURCE16} $RPM_BUILD_ROOT%{initdir}/openafs-client -install -m 755 %{SOURCE17} $RPM_BUILD_ROOT%{initdir}/openafs-server +install -m 755 src/packaging/RedHat/openafs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/openafs +install -m 755 src/packaging/RedHat/openafs-client.init $RPM_BUILD_ROOT%{initdir}/openafs-client +install -m 755 src/packaging/RedHat/openafs-server.init $RPM_BUILD_ROOT%{initdir}/openafs-server # Copy PAM modules install -m 755 ${sysname}/dest/lib/pam* $RPM_BUILD_ROOT%{pamdir} @@ -918,10 +971,9 @@ ln -sf pam_afs.krb.so.1 $RPM_BUILD_ROOT%{pamdir}/pam_afs.krb.so # Populate /usr/vice/etc uve=$RPM_BUILD_ROOT%{_prefix}/vice/etc -install -p -m 644 %{SOURCE2} $uve/ThisCell -install -p -m 644 %{SOURCE3} $uve/CellServDB.dist -install -p -m 644 %{SOURCE4} $uve/SuidCells.dist -install -p -m 644 %{SOURCE5} $uve/cacheinfo +install -p -m 644 src/packaging/RedHat/openafs-ThisCell $uve/ThisCell +install -p -m 644 %{SOURCE20} $uve/CellServDB.dist +install -p -m 644 src/packaging/RedHat/openafs-cacheinfo $uve/cacheinfo # # install kernel-source @@ -934,8 +986,8 @@ tar cf - -C libafs_tree . | \ # Next, copy the LICENSE Files, README install -m 644 src/LICENSE $RPM_BUILD_ROOT%{_prefix}/src/openafs-kernel-%{afsvers}/LICENSE.IBM -install -m 644 %{SOURCE7} $RPM_BUILD_ROOT%{_prefix}/src/openafs-kernel-%{afsvers}/LICENSE.Sun -install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_prefix}/src/openafs-kernel-%{afsvers}/README +install -m 644 src/packaging/RedHat/openafs-LICENSE.Sun $RPM_BUILD_ROOT%{_prefix}/src/openafs-kernel-%{afsvers}/LICENSE.Sun +install -m 644 src/packaging/RedHat/openafs-README $RPM_BUILD_ROOT%{_prefix}/src/openafs-kernel-%{afsvers}/README # # Install DOCUMENTATION @@ -1013,7 +1065,6 @@ grep -v "^#" >openafs-file-list < CellServDB ; \ - chmod 644 CellServDB ; \ - cat SuidCells.local SuidCells.dist > SuidCells ; \ - chmod 644 SuidCells ) + chmod 644 CellServDB ) echo echo The AFS cache is configured for 100 MB. Edit the @@ -1192,9 +1258,6 @@ fi if [ $1 = 0 ] ; then %{initdir}/openafs-client stop chkconfig --del openafs-client - - rm -f /usr/vice/etc/CellServDB /usr/vice/etc/SuidCells - rm -f /usr/vice/etc/CellServDB.local /usr/vice/etc/SuidCells.local fi %preun server @@ -1206,7 +1269,7 @@ fi %endif %if %{build_modules} - +%if !%{fedorakmod} %if %{up_package} %post kernel /sbin/depmod -ae %{kernvers} @@ -1247,7 +1310,7 @@ fi %postun kernel-hugemem /sbin/depmod -ae %{kernvers}%{?hugemem_ext:%{hugemem_ext}} %endif - +%endif %endif @@ -1273,7 +1336,6 @@ fi %dir %{_prefix}/vice/cache %dir %{_prefix}/vice/etc %{_prefix}/vice/etc/CellServDB.dist -%{_prefix}/vice/etc/SuidCells.dist %config %{_prefix}/vice/etc/ThisCell %config %{_prefix}/vice/etc/cacheinfo %{_bindir}/cmdebug @@ -1289,6 +1351,7 @@ fi %{_mandir}/man5/afs* %{_mandir}/man5/cacheinfo.* %{_mandir}/man8/afsd.* +%{_mandir}/man5/CellAlias.* %files server %defattr(-,root,root) @@ -1302,6 +1365,7 @@ fi %{_prefix}/afs/bin/fileserver # Should we support KAServer? %{_prefix}/afs/bin/kaserver +%{_prefix}/afs/bin/ka-forwarder %{_prefix}/afs/bin/pt_util %{_prefix}/afs/bin/ptserver %{_prefix}/afs/bin/salvager @@ -1343,8 +1407,10 @@ fi %{_mandir}/man8/buserver.* %{_mandir}/man8/fileserver.* %{_mandir}/man8/kadb_check.* +%{_mandir}/man8/ka-forwarder.* %{_mandir}/man8/prdb_check.* %{_mandir}/man8/ptserver.* +%{_mandir}/man8/pt_util.* %{_mandir}/man8/salvager.* %{_mandir}/man8/upclient.* %{_mandir}/man8/upserver.* @@ -1418,7 +1484,6 @@ fi %defattr(-,root,root) %{_bindir}/aklog %{_sbindir}/asetkey -%{_sbindir}/ka-forwarder %{_mandir}/man1/aklog.* %{_mandir}/man8/asetkey.* %endif @@ -1427,6 +1492,7 @@ fi %if %{build_modules} +%if !%{fedorakmod} %if %{up_package} %files kernel %defattr(-,root,root) @@ -1454,7 +1520,8 @@ fi %if %{hugemem_package} %files kernel-hugemem %defattr(-,root,root) -%{kxmoddir}%{?hugemem_ext:%{hugemem_ext}}/kernel/fs/openafs/openafs.* +%{kxmoddir}%{?hugemem_ext:%{hugemem_ext}}/fs/openafs/openafs.* +%endif %endif %endif @@ -1465,12 +1532,24 @@ fi ### ############################################################################## %changelog +* Tue Oct 29 2007 Simon Wilkinson 1.4.5 +- Update to match the shipped 1.4.5 RPMS +- Fix the kvariant stuff to only configure the 'standard' case once +- Add openafs-kvers.sh back in + +* Wed Oct 10 2007 Simon Wilkinson 1.4.5pre1-1 +- Use Fedora style kmods, which allows us to install multiple kernel types + +* Thu Jun 07 2007 Simon Wilkinson 1.4.4-3 +- Use distributed files, rather than those in packager's SOURCE directory +- Remove SuidCells stuff, which was unused + * Fri Dec 01 2006 Derrick Brashear 1.4.2-2 - integrate s390x changes - allow for building libafs*.a and not libafs*.so into packages, for platforms that won't build the .so files. -* Sun Aug 20 2006 Derrick Brashear 1.4.2-1 +* Wed Aug 23 2006 Derrick Brashear 1.4.2-1 - update to 1.4.2 - use installed aklog manpage. - moduleparam patch obsoleted. diff --git a/src/pam/afs_pam_msg.c b/src/pam/afs_pam_msg.c index c1f702355a..d36bd54a6f 100644 --- a/src/pam/afs_pam_msg.c +++ b/src/pam/afs_pam_msg.c @@ -14,13 +14,7 @@ RCSID ("$Header$"); #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include "afs_pam_msg.h" diff --git a/src/pam/afs_util.c b/src/pam/afs_util.c index 5c4d4cfcbf..cf8ae25fe6 100644 --- a/src/pam/afs_util.c +++ b/src/pam/afs_util.c @@ -17,13 +17,7 @@ #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include RCSID @@ -180,13 +174,6 @@ do_klog(const char *user, const char *password, const char *lifetime, static afs_int32 curpag(void) { -#if defined(AFS_AIX51_ENV) - afs_int32 pag; - - if (kcred_getpag(cred, PAG_AFS, &pag) < 0 || pag == 0) - pag = NOPAG; - return pag; -#else gid_t groups[NGROUPS_MAX]; afs_uint32 g0, g1; afs_uint32 h, l, ret; @@ -210,7 +197,6 @@ curpag(void) return -1; } return -1; -#endif } /* Returns the AFS pag number, if any, otherwise return -1 */ diff --git a/src/platform/DARWIN/Makefile.in b/src/platform/DARWIN/Makefile.in index 66af0801fa..0212714b28 100644 --- a/src/platform/DARWIN/Makefile.in +++ b/src/platform/DARWIN/Makefile.in @@ -21,10 +21,10 @@ dest: \ ${DEST}/etc/afssettings ${DESTDIR}${sbindir}/afssettings: afssettings - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/etc/afssettings: afssettings - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ clean: $(RM) -f *.o core afssettings AFS_component_version_number.c diff --git a/src/ptserver/Makefile.in b/src/ptserver/Makefile.in index 64a9c533bb..ad6b639fdb 100644 --- a/src/ptserver/Makefile.in +++ b/src/ptserver/Makefile.in @@ -87,29 +87,29 @@ ptint.cs.o: ptint.cs.c ptint.xdr.c ptint.xg ptint.xdr.o: ptint.xdr.c ptint.h ptint.xg ptint.cs.c: ptint.xg - ${RXGEN} -x -C -u -o $@ ${srcdir}/ptint.xg + ${RXGEN} -x -C -A -u -o $@ ${srcdir}/ptint.xg ptint.ss.c: ptint.xg - ${RXGEN} -x -S -o $@ ${srcdir}/ptint.xg + ${RXGEN} -x -S -A -o $@ ${srcdir}/ptint.xg ptint.xdr.c: ptint.xg - ${RXGEN} -x -c -o $@ ${srcdir}/ptint.xg + ${RXGEN} -x -c -A -o $@ ${srcdir}/ptint.xg ptint.h: ptint.xg - ${RXGEN} -x -h -u -o $@ ${srcdir}/ptint.xg + ${RXGEN} -x -h -A -u -o $@ ${srcdir}/ptint.xg ptint.cs.c: ptint.h ptint.ss.c: ptint.h ptint.xdr.c: ptint.h Kptint.cs.c: ptint.xg Kptint.h - ${RXGEN} -x -k -C -o Kptint.cs.c ${srcdir}/ptint.xg + ${RXGEN} -x -k -A -C -o Kptint.cs.c ${srcdir}/ptint.xg Kptint.xdr.c: ptint.xg - ${RXGEN} -x -k -c -o Kptint.xdr.c ${srcdir}/ptint.xg + ${RXGEN} -x -k -A -c -o Kptint.xdr.c ${srcdir}/ptint.xg Kptint.h: ptint.xg - ${RXGEN} -x -k -h -o Kptint.h ${srcdir}/ptint.xg + ${RXGEN} -x -k -A -h -o Kptint.h ${srcdir}/ptint.xg display.o: display.c ${INCLS} diff --git a/src/ptserver/db_verify.c b/src/ptserver/db_verify.c index 30510f405b..293fec67e0 100644 --- a/src/ptserver/db_verify.c +++ b/src/ptserver/db_verify.c @@ -44,13 +44,7 @@ RCSID #include #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -1433,7 +1427,7 @@ CheckPrDatabase(struct misc_data *misc) /* info & statistics */ #include "AFS_component_version_number.c" int -WorkerBee(struct cmd_syndesc *as, char *arock) +WorkerBee(struct cmd_syndesc *as, void *arock) { afs_int32 code; char *recreateFile; diff --git a/src/ptserver/display.c b/src/ptserver/display.c index 4ac88b46a2..4126831c45 100644 --- a/src/ptserver/display.c +++ b/src/ptserver/display.c @@ -20,13 +20,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "ptserver.h" diff --git a/src/ptserver/pt_util.c b/src/ptserver/pt_util.c index 6bf5a4e60a..ebeb9ff3e9 100644 --- a/src/ptserver/pt_util.c +++ b/src/ptserver/pt_util.c @@ -54,7 +54,7 @@ void fix_pre(); char *checkin(); char *check_core(); char *id_to_name(); -int CommandProc(struct cmd_syndesc *); +int CommandProc(struct cmd_syndesc *, void *); struct hash_entry { char h_name[PR_MAXNAMELEN]; @@ -106,7 +106,7 @@ main(int argc, char **argv) register struct cmd_syndesc *cs; /*Command line syntax descriptor */ register afs_int32 code; /*Return code */ - cs = cmd_CreateSyntax((char *)0, CommandProc, 0, + cs = cmd_CreateSyntax(NULL, CommandProc, NULL, "access protection database"); cmd_AddParm(cs, "-w", CMD_FLAG, CMD_OPTIONAL, "update prdb with contents of data file"); @@ -129,7 +129,7 @@ main(int argc, char **argv) } int -CommandProc(register struct cmd_syndesc *a_as) +CommandProc(register struct cmd_syndesc *a_as, void *arock) { register int i; register long code; diff --git a/src/ptserver/ptprocs.c b/src/ptserver/ptprocs.c index 44e664f3a3..f2c54e4af6 100644 --- a/src/ptserver/ptprocs.c +++ b/src/ptserver/ptprocs.c @@ -76,13 +76,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "ptserver.h" #include "pterror.h" #include "ptprototypes.h" diff --git a/src/ptserver/pts.c b/src/ptserver/pts.c index b26776ff80..2dbb655d17 100644 --- a/src/ptserver/pts.c +++ b/src/ptserver/pts.c @@ -62,21 +62,21 @@ struct myrock { }; int -pts_Interactive(struct cmd_syndesc *as, char *arock) +pts_Interactive(struct cmd_syndesc *as, void *arock) { finished = 0; return 0; } int -pts_Quit(struct cmd_syndesc *as, char *arock) +pts_Quit(struct cmd_syndesc *as, void *arock) { finished = 1; return 0; } int -pts_Source(struct cmd_syndesc *as, char *arock) +pts_Source(struct cmd_syndesc *as, void *arock) { FILE *fd; struct sourcestack *sp; @@ -104,7 +104,7 @@ pts_Source(struct cmd_syndesc *as, char *arock) } int -pts_Sleep(struct cmd_syndesc *as, char *arock) +pts_Sleep(struct cmd_syndesc *as, void *arock) { int delay; if (!as->parms[0].items) { @@ -131,7 +131,7 @@ popsource() } int -GetGlobals(struct cmd_syndesc *as, char *arock) +GetGlobals(struct cmd_syndesc *as, void *arock) { register afs_int32 code; char *cell; @@ -200,7 +200,7 @@ GetGlobals(struct cmd_syndesc *as, char *arock) } int -CleanUp(struct cmd_syndesc *as, char *arock) +CleanUp(struct cmd_syndesc *as, void *arock) { if (as && !strcmp(as->name, "help")) return 0; @@ -213,7 +213,7 @@ CleanUp(struct cmd_syndesc *as, char *arock) } int -CreateGroup(struct cmd_syndesc *as, char *arock) +CreateGroup(struct cmd_syndesc *as, void *arock) { register afs_int32 code; afs_int32 id; @@ -273,7 +273,7 @@ CreateGroup(struct cmd_syndesc *as, char *arock) } int -CreateUser(struct cmd_syndesc *as, char *arock) +CreateUser(struct cmd_syndesc *as, void *arock) { register afs_int32 code; afs_int32 id; @@ -498,7 +498,7 @@ GetNameOrId(register struct cmd_syndesc *as, struct idlist *lids, struct namelis int -AddToGroup(struct cmd_syndesc *as, char *arock) +AddToGroup(struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct cmd_item *u, *g; @@ -519,7 +519,7 @@ AddToGroup(struct cmd_syndesc *as, char *arock) } int -RemoveFromGroup(struct cmd_syndesc *as, char *arock) +RemoveFromGroup(struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct cmd_item *u, *g; @@ -540,7 +540,7 @@ RemoveFromGroup(struct cmd_syndesc *as, char *arock) } int -ListMembership(struct cmd_syndesc *as, char *arock) +ListMembership(struct cmd_syndesc *as, void *arock) { register afs_int32 code; idlist ids; @@ -585,7 +585,7 @@ ListMembership(struct cmd_syndesc *as, char *arock) } int -Delete(struct cmd_syndesc *as, char *arock) +Delete(struct cmd_syndesc *as, void *arock) { register afs_int32 code; idlist ids; @@ -624,7 +624,7 @@ char *flags_dncase = "s mar"; /* legal member acces values */ int flags_shift[5] = { 2, 1, 2, 2, 1 }; /* bits for each */ int -CheckEntry(struct cmd_syndesc *as, char *arock) +CheckEntry(struct cmd_syndesc *as, void *arock) { register afs_int32 code; afs_int32 rcode = 1; @@ -723,7 +723,7 @@ CheckEntry(struct cmd_syndesc *as, char *arock) } int -ListEntries(struct cmd_syndesc *as, char *arock) +ListEntries(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; afs_int32 flag, startindex, nentries, nextstartindex; @@ -760,7 +760,7 @@ ListEntries(struct cmd_syndesc *as, char *arock) } int -ChownGroup(struct cmd_syndesc *as, char *arock) +ChownGroup(struct cmd_syndesc *as, void *arock) { register afs_int32 code; char *name; @@ -776,7 +776,7 @@ ChownGroup(struct cmd_syndesc *as, char *arock) } int -ChangeName(struct cmd_syndesc *as, char *arock) +ChangeName(struct cmd_syndesc *as, void *arock) { register afs_int32 code; char *oldname; @@ -792,7 +792,7 @@ ChangeName(struct cmd_syndesc *as, char *arock) } int -ListMax(struct cmd_syndesc *as, char *arock) +ListMax(struct cmd_syndesc *as, void *arock) { register afs_int32 code; afs_int32 maxUser, maxGroup; @@ -813,7 +813,7 @@ ListMax(struct cmd_syndesc *as, char *arock) } int -SetMax(struct cmd_syndesc *as, char *arock) +SetMax(struct cmd_syndesc *as, void *arock) { register afs_int32 code; afs_int32 maxid; @@ -853,7 +853,7 @@ SetMax(struct cmd_syndesc *as, char *arock) } int -SetFields(struct cmd_syndesc *as, char *arock) +SetFields(struct cmd_syndesc *as, void *arock) { register afs_int32 code; idlist ids; @@ -948,7 +948,7 @@ SetFields(struct cmd_syndesc *as, char *arock) } int -ListOwned(struct cmd_syndesc *as, char *arock) +ListOwned(struct cmd_syndesc *as, void *arock) { register afs_int32 code; idlist ids; @@ -1074,7 +1074,7 @@ main(int argc, char **argv) memset(myrock, 0, sizeof *myrock); myrock->sec = 1; - ts = cmd_CreateSyntax("creategroup", CreateGroup, 0, + ts = cmd_CreateSyntax("creategroup", CreateGroup, NULL, "create a new group"); cmd_AddParm(ts, "-name", CMD_LIST, 0, "group name"); cmd_AddParm(ts, "-owner", CMD_SINGLE, CMD_OPTIONAL, "owner of the group"); @@ -1083,60 +1083,60 @@ main(int argc, char **argv) add_std_args(ts); cmd_CreateAlias(ts, "cg"); - ts = cmd_CreateSyntax("createuser", CreateUser, 0, "create a new user"); + ts = cmd_CreateSyntax("createuser", CreateUser, NULL, "create a new user"); cmd_AddParm(ts, "-name", CMD_LIST, 0, "user name"); cmd_AddParm(ts, "-id", CMD_LIST, CMD_OPTIONAL, "user id"); add_std_args(ts); cmd_CreateAlias(ts, "cu"); - ts = cmd_CreateSyntax("adduser", AddToGroup, 0, "add a user to a group"); + ts = cmd_CreateSyntax("adduser", AddToGroup, NULL, "add a user to a group"); cmd_AddParm(ts, "-user", CMD_LIST, 0, "user name"); cmd_AddParm(ts, "-group", CMD_LIST, 0, "group name"); add_std_args(ts); - ts = cmd_CreateSyntax("removeuser", RemoveFromGroup, 0, + ts = cmd_CreateSyntax("removeuser", RemoveFromGroup, NULL, "remove a user from a group"); cmd_AddParm(ts, "-user", CMD_LIST, 0, "user name"); cmd_AddParm(ts, "-group", CMD_LIST, 0, "group name"); add_std_args(ts); - ts = cmd_CreateSyntax("membership", ListMembership, 0, + ts = cmd_CreateSyntax("membership", ListMembership, NULL, "list membership of a user or group"); cmd_AddParm(ts, "-nameorid", CMD_LIST, 0, "user or group name or id"); add_std_args(ts); cmd_CreateAlias(ts, "groups"); - ts = cmd_CreateSyntax("delete", Delete, 0, + ts = cmd_CreateSyntax("delete", Delete, NULL, "delete a user or group from database"); cmd_AddParm(ts, "-nameorid", CMD_LIST, 0, "user or group name or id"); add_std_args(ts); - ts = cmd_CreateSyntax("examine", CheckEntry, 0, "examine an entry"); + ts = cmd_CreateSyntax("examine", CheckEntry, NULL, "examine an entry"); cmd_AddParm(ts, "-nameorid", CMD_LIST, 0, "user or group name or id"); add_std_args(ts); cmd_CreateAlias(ts, "check"); - ts = cmd_CreateSyntax("chown", ChownGroup, 0, + ts = cmd_CreateSyntax("chown", ChownGroup, NULL, "change ownership of a group"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "group name"); cmd_AddParm(ts, "-owner", CMD_SINGLE, 0, "new owner"); add_std_args(ts); - ts = cmd_CreateSyntax("rename", ChangeName, 0, "rename user or group"); + ts = cmd_CreateSyntax("rename", ChangeName, NULL, "rename user or group"); cmd_AddParm(ts, "-oldname", CMD_SINGLE, 0, "old name"); cmd_AddParm(ts, "-newname", CMD_SINGLE, 0, "new name"); add_std_args(ts); cmd_CreateAlias(ts, "chname"); - ts = cmd_CreateSyntax("listmax", ListMax, 0, "list max id"); + ts = cmd_CreateSyntax("listmax", ListMax, NULL, "list max id"); add_std_args(ts); - ts = cmd_CreateSyntax("setmax", SetMax, 0, "set max id"); + ts = cmd_CreateSyntax("setmax", SetMax, NULL, "set max id"); cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_OPTIONAL, "group max"); cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_OPTIONAL, "user max"); add_std_args(ts); - ts = cmd_CreateSyntax("setfields", SetFields, 0, + ts = cmd_CreateSyntax("setfields", SetFields, NULL, "set fields for an entry"); cmd_AddParm(ts, "-nameorid", CMD_LIST, 0, "user or group name or id"); cmd_AddParm(ts, "-access", CMD_SINGLE, CMD_OPTIONAL, "set privacy flags"); @@ -1148,30 +1148,30 @@ main(int argc, char **argv) #endif add_std_args(ts); - ts = cmd_CreateSyntax("listowned", ListOwned, 0, + ts = cmd_CreateSyntax("listowned", ListOwned, NULL, "list groups owned by an entry or zero id gets orphaned groups"); cmd_AddParm(ts, "-nameorid", CMD_LIST, 0, "user or group name or id"); add_std_args(ts); - ts = cmd_CreateSyntax("listentries", ListEntries, 0, + ts = cmd_CreateSyntax("listentries", ListEntries, NULL, "list users/groups in the protection database"); cmd_AddParm(ts, "-users", CMD_FLAG, CMD_OPTIONAL, "list user entries"); cmd_AddParm(ts, "-groups", CMD_FLAG, CMD_OPTIONAL, "list group entries"); add_std_args(ts); - ts = cmd_CreateSyntax("interactive", pts_Interactive, 0, + ts = cmd_CreateSyntax("interactive", pts_Interactive, NULL, "enter interactive mode"); add_std_args(ts); cmd_CreateAlias(ts, "in"); - ts = cmd_CreateSyntax("quit", pts_Quit, 0, "exit program"); + ts = cmd_CreateSyntax("quit", pts_Quit, NULL, "exit program"); add_std_args(ts); - ts = cmd_CreateSyntax("source", pts_Source, 0, "read commands from file"); + ts = cmd_CreateSyntax("source", pts_Source, NULL, "read commands from file"); cmd_AddParm(ts, "-file", CMD_SINGLE, 0, "filename"); add_std_args(ts); - ts = cmd_CreateSyntax("sleep", pts_Sleep, 0, "pause for a bit"); + ts = cmd_CreateSyntax("sleep", pts_Sleep, NULL, "pause for a bit"); cmd_AddParm(ts, "-delay", CMD_SINGLE, 0, "seconds"); add_std_args(ts); diff --git a/src/ptserver/ptserver.c b/src/ptserver/ptserver.c index a2d7eac591..45f18e3c36 100644 --- a/src/ptserver/ptserver.c +++ b/src/ptserver/ptserver.c @@ -129,13 +129,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ptserver/ptuser.c b/src/ptserver/ptuser.c index 0882be28e1..549dba69e1 100644 --- a/src/ptserver/ptuser.c +++ b/src/ptserver/ptuser.c @@ -46,13 +46,7 @@ RCSID #include #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ptserver/ptutils.c b/src/ptserver/ptutils.c index 9a152bea14..1c50733301 100644 --- a/src/ptserver/ptutils.c +++ b/src/ptserver/ptutils.c @@ -34,13 +34,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ptserver/readgroup.c b/src/ptserver/readgroup.c index b8e56d69bd..ebddd31e5e 100644 --- a/src/ptserver/readgroup.c +++ b/src/ptserver/readgroup.c @@ -18,13 +18,7 @@ RCSID #include #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -202,6 +196,7 @@ main(int argc, char **argv) } } } + return 0; } void diff --git a/src/ptserver/readpwd.c b/src/ptserver/readpwd.c index 5f36fb6264..4b983b4fb6 100644 --- a/src/ptserver/readpwd.c +++ b/src/ptserver/readpwd.c @@ -17,13 +17,7 @@ RCSID #ifdef AFS_NT40_ENV #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -95,4 +89,5 @@ main(afs_int32 argc, char **argv) fprintf(stderr, "%s (%d).\n", pr_ErrorMsg(code), code); } } + return 0; } diff --git a/src/ptserver/testpt.c b/src/ptserver/testpt.c index 9729928aa6..26a20bc62e 100644 --- a/src/ptserver/testpt.c +++ b/src/ptserver/testpt.c @@ -24,13 +24,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_FCNTL_H #include #endif @@ -99,7 +93,7 @@ static char lcell[MAXCELLCHARS]; #endif int -ListUsedIds(struct cmd_syndesc *as, char *arock) +ListUsedIds(struct cmd_syndesc *as, void *arock) { afs_int32 code; namelist lnames; @@ -479,7 +473,7 @@ RemUser(int u, int g) } int -TestManyMembers(struct cmd_syndesc *as, char *arock) +TestManyMembers(struct cmd_syndesc *as, void *arock) { char *filled; /* users filled up */ char *cleaned; /* users cleaned up */ @@ -861,7 +855,7 @@ ka_ConvertBytes(char *ascii, /* output buffer */ */ int -TestPrServ(struct cmd_syndesc *as, char *arock) +TestPrServ(struct cmd_syndesc *as, void *arock) { afs_int32 id; char name[PR_MAXNAMELEN + 1]; @@ -1007,7 +1001,7 @@ static char tmp_cell_file[128] = ""; static char tmp_noauth_file[128] = ""; static int -MyAfterProc(struct cmd_syndesc *as, char *arock) +MyAfterProc(struct cmd_syndesc *as, void *arock) { if (strlen(tmp_conf_file)) unlink(tmp_conf_file); @@ -1021,7 +1015,7 @@ MyAfterProc(struct cmd_syndesc *as, char *arock) } static int -MyBeforeProc(struct cmd_syndesc *as, char *arock) +MyBeforeProc(struct cmd_syndesc *as, void *arock) { afs_int32 code; int i; @@ -1194,7 +1188,7 @@ main(int argc, char *argv[]) cmd_SetBeforeProc(MyBeforeProc, NULL); cmd_SetAfterProc(MyAfterProc, NULL); - ts = cmd_CreateSyntax("usedIds", ListUsedIds, 0, + ts = cmd_CreateSyntax("usedIds", ListUsedIds, NULL, "Find used (or unused) user (or group) ids"); cmd_AddParm(ts, "-startId", CMD_SINGLE, CMD_OPTIONAL, "id to start checking"); @@ -1203,10 +1197,10 @@ main(int argc, char *argv[]) cmd_AddParm(ts, "-unused", CMD_FLAG, CMD_OPTIONAL, "print unused ids"); add_std_args(ts); - ts = cmd_CreateSyntax("initcmd", TestPrServ, 0, "test the prserver"); + ts = cmd_CreateSyntax("initcmd", TestPrServ, NULL, "test the prserver"); add_std_args(ts); - ts = cmd_CreateSyntax("testmanymembers", TestManyMembers, 0, + ts = cmd_CreateSyntax("testmanymembers", TestManyMembers, NULL, "test creating users and groups w/ many members"); cmd_AddParm(ts, "-number", CMD_SINGLE, 0, "number of users/groups to create"); diff --git a/src/ptserver/ubik.c b/src/ptserver/ubik.c index f589704b4c..e89faf0efb 100644 --- a/src/ptserver/ubik.c +++ b/src/ptserver/ubik.c @@ -8,14 +8,7 @@ RCSID #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #define UBIK_INTERNALS diff --git a/src/ptserver/utils.c b/src/ptserver/utils.c index 40e79d986d..ccc46261da 100644 --- a/src/ptserver/utils.c +++ b/src/ptserver/utils.c @@ -23,13 +23,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "ptserver.h" #include "pterror.h" diff --git a/src/rx/SOLARIS/rx_knet.c b/src/rx/SOLARIS/rx_knet.c index 85eaa5f7c9..c46f09b4ed 100644 --- a/src/rx/SOLARIS/rx_knet.c +++ b/src/rx/SOLARIS/rx_knet.c @@ -36,6 +36,16 @@ RCSID #include "inet/ip.h" #include "inet/ip_if.h" #include "netinet/udp.h" +#ifdef AFS_SUN510_ENV +#include "h/ddi.h" +#include "h/ksynch.h" +#include "h/sunddi.h" +#include "h/sunldi.h" +#include "h/sockio.h" +#include "h/cmn_err.h" +#include "h/socket.h" +#include "netinet/in.h" +#endif /* * Function pointers for kernel socket routines @@ -68,14 +78,11 @@ rxi_GetIFInfo() { int i = 0; int different = 0; - +#ifndef AFS_SUN510_ENV ill_t *ill; ipif_t *ipif; - int rxmtu, maxmtu; -#ifdef AFS_SUN510_ENV - ill_walk_context_t ctx; #endif - + int rxmtu, maxmtu; int mtus[ADDRSPERSITE]; afs_uint32 addrs[ADDRSPERSITE]; afs_uint32 ifinaddr; @@ -84,10 +91,58 @@ rxi_GetIFInfo() memset(addrs, 0, sizeof(addrs)); #ifdef AFS_SUN510_ENV - for (ill = ILL_START_WALK_ALL(&ctx) ; ill ; ill = ill_next(&ctx, ill)) { + (void) rw_enter(&afsifinfo_lock, RW_READER); + + for (i = 0; (afsifinfo[i].ipaddr != NULL) && (i < ADDRSPERSITE); i++) { + + /* Ignore addresses which are down.. */ + if (!(afsifinfo[i].flags & IFF_UP)) + continue; + + /* Compute the Rx interface MTU */ + rxmtu = (afsifinfo[i].mtu - RX_IPUDP_SIZE); + + ifinaddr = afsifinfo[i].ipaddr; + if (myNetAddrs[i] != ifinaddr) + different++; + + /* Copy interface MTU and address; adjust maxmtu */ + mtus[i] = rxmtu; + rxmtu = rxi_AdjustIfMTU(rxmtu); + maxmtu = rxmtu * rxi_nRecvFrags + + ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE); + maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu); + addrs[i] = ifinaddr; + + if (ifinaddr != 0x7f000001 && maxmtu > rx_maxReceiveSize) { + rx_maxReceiveSize = MIN(RX_MAX_PACKET_SIZE, maxmtu); + rx_maxReceiveSize = + MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser); + } + + } + + (void) rw_exit(&afsifinfo_lock); + + rx_maxJumboRecvSize = + RX_HEADER_SIZE + rxi_nDgramPackets * RX_JUMBOBUFFERSIZE + + (rxi_nDgramPackets - 1) * RX_JUMBOHEADERSIZE; + rx_maxJumboRecvSize = MAX(rx_maxJumboRecvSize, rx_maxReceiveSize); + + if (different) { + int j; + + for (j = 0; j < i; j++) { + myNetMTUs[j] = mtus[j]; + myNetAddrs[j] = addrs[j]; + } + } + + return different; +} + #else for (ill = ill_g_head; ill; ill = ill->ill_next) { -#endif #ifdef AFS_SUN58_ENV /* Make sure this is an IPv4 ILL */ if (ill->ill_isv6) @@ -144,17 +199,19 @@ rxi_GetIFInfo() return different; } +#endif int rxi_FindIfMTU(afs_uint32 addr) { - ill_t *ill; - ipif_t *ipif; afs_uint32 myAddr, netMask; int match_value = 0; int mtu = -1; #ifdef AFS_SUN510_ENV - ill_walk_context_t ctx; + int i = 0; +#else + ill_t *ill; + ipif_t *ipif; #endif if (numMyNetAddrs == 0) @@ -171,10 +228,46 @@ rxi_FindIfMTU(afs_uint32 addr) netMask = 0; #ifdef AFS_SUN510_ENV - for (ill = ILL_START_WALK_ALL(&ctx) ; ill ; ill = ill_next(&ctx, ill)) { + (void) rw_enter(&afsifinfo_lock, RW_READER); + + for (i = 0; (afsifinfo[i].ipaddr != NULL) && (i < ADDRSPERSITE); i++) { + afs_uint32 thisAddr, subnetMask; + int thisMtu; + + /* Ignore addresses which are down.. */ + if ((afsifinfo[i].flags & IFF_UP) == 0) + continue; + + thisAddr = afsifinfo[i].ipaddr; + subnetMask = afsifinfo[i].netmask; + thisMtu = afsifinfo[i].mtu; + + if ((myAddr & netMask) == (thisAddr & netMask)) { + if ((myAddr & subnetMask) == (thisAddr & subnetMask)) { + if (myAddr == thisAddr) { + match_value = 4; + mtu = thisMtu; + } + + if (match_value < 3) { + match_value = 3; + mtu = thisMtu; + } + } + + if (match_value < 2) { + match_value = 2; + mtu = thisMtu; + } + } + } + + (void) rw_exit(&afsifinfo_lock); + + return mtu; +} #else for (ill = ill_g_head; ill; ill = ill->ill_next) { -#endif #ifdef AFS_SUN58_ENV /* Make sure this is an IPv4 ILL */ if (ill->ill_isv6) @@ -213,6 +306,7 @@ rxi_FindIfMTU(afs_uint32 addr) return mtu; } +#endif /* rxi_NewSocket, rxi_FreeSocket and osi_NetSend are from the now defunct * afs_osinet.c. @@ -462,6 +556,174 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec, return error; } +#if defined(AFS_SUN510_ENV) +/* How often afs collects interface info. Tunable via /etc/system: */ +/* set afs:afs_if_poll_interval = integer (value is in seconds) */ +static int afs_if_poll_interval = 30; + +/* Global array which holds the interface info for consumers */ +struct afs_ifinfo afsifinfo[ADDRSPERSITE]; + +void +osi_StartNetIfPoller() +{ + (void) ddi_taskq_dispatch(afs_taskq, (void(*) (void*)) osi_NetIfPoller, + NULL, DDI_SLEEP); +} + +void +osi_NetIfPoller() +{ + cred_t *cr; + ldi_ident_t li; + ldi_handle_t lh; + struct lifnum lifn; + struct lifconf lifc; + struct lifreq lifr; + struct lifreq *lifrp; + struct sockaddr_in *sin4_local; + struct sockaddr_in *sin4_dst; + major_t udpmajor; + caddr_t lifcbuf; + int i, count, error, rv; + int ifcount; + int metric; + int index; + uint_t mtu; + uint64_t flags; + + /* Get our permissions */ + cr = CRED(); + + /* Initialize and open /dev/udp for receiving ioctls */ + udpmajor = ddi_name_to_major(UDP_MOD_NAME); + + error = ldi_ident_from_major(udpmajor, &li); + if (error) + cmn_err(CE_PANIC, "osi_NetIfPoller: ldi_ident_from_major failed: %d", + error); + + error = ldi_open_by_name(UDP_DEV_NAME, FREAD, cr, &lh, li); + if (error) + cmn_err(CE_PANIC, + "osi_NetIfPoller: ldi_open_by_name failed: %d", error); + + + /* First, how many interfaces do we have? */ + (void) bzero((void *)&lifn, sizeof(struct lifnum)); + lifn.lifn_family = AF_INET; + + error = ldi_ioctl(lh, SIOCGLIFNUM, (intptr_t)&lifn, + FKIOCTL, cr, &rv); + if (error) + cmn_err(CE_PANIC, + "osi_NetIfPoller: ldi_ioctl: SIOCGLIFNUM failed: %d", error); + + ifcount = lifn.lifn_count; + + /* Set up some stuff for storing the results of SIOCGLIFCONF */ + (void) bzero((void *)&lifc, sizeof(struct lifconf)); + + lifcbuf = kmem_zalloc(ifcount * sizeof(struct lifreq), KM_SLEEP); + + lifc.lifc_family = AF_INET; + lifc.lifc_flags = IFF_UP; + lifc.lifc_len = ifcount * sizeof(struct lifreq); + lifc.lifc_buf = lifcbuf; + + /* Get info on each of our available interfaces. */ + error = ldi_ioctl(lh, SIOCGLIFCONF, (intptr_t)&lifc, + FKIOCTL, cr, &rv); + if (error) + cmn_err(CE_PANIC, + "osi_NetIfPoller: ldi_ioctl: SIOCGLIFCONF failed: %d", error); + + lifrp = lifc.lifc_req; + + count = 0; + + /* Loop through our interfaces and pick out the info we want */ + for (i = lifc.lifc_len / sizeof(struct lifreq); + i > 0; i--, lifrp++) { + + if (count >= ADDRSPERSITE) + break; + + (void) bzero((void *)&lifr, sizeof(struct lifreq)); + + (void) strncpy(lifr.lifr_name, lifrp->lifr_name, + sizeof(lifr.lifr_name)); + + /* Get this interface's Flags */ + error = ldi_ioctl(lh, SIOCGLIFFLAGS, (intptr_t)&lifr, + FKIOCTL, cr, &rv); + if (error) + cmn_err(CE_PANIC, + "osi_NetIfPoller: ldi_ioctl: SIOCGLIFFLAGS failed: %d", + error); + + /* Ignore plumbed but down interfaces. */ + if ((lifr.lifr_flags & IFF_UP) == 0) + continue; + + flags = lifr.lifr_flags; + + /* Get this interface's MTU */ + error = ldi_ioctl(lh, SIOCGLIFMTU, (intptr_t)&lifr, + FKIOCTL, cr, &rv); + + if (error) { + mtu = 1125; + } else { + mtu = lifr.lifr_metric; + } + + /* Get this interface's Metric */ + error = ldi_ioctl(lh, SIOCGLIFMETRIC, (intptr_t)&lifr, + FKIOCTL, cr, &rv); + + if (error) { + metric = 0; + } else { + metric = lifr.lifr_metric; + } + + sin4_local = (struct sockaddr_in *) &lifrp->lifr_addr; + sin4_dst = (struct sockaddr_in *) &lifrp->lifr_dstaddr; + + /* Acquire global array write lock */ + (void) rw_enter(&afsifinfo_lock, RW_WRITER); + + /* Copy our collected data into the global array */ + (void) strncpy(afsifinfo[count].ifname, lifrp->lifr_name, + sizeof(afsifinfo[count].ifname)); + afsifinfo[count].ipaddr = ntohl(sin4_local->sin_addr.s_addr); + afsifinfo[count].mtu = mtu; + afsifinfo[count].netmask = lifrp->lifr_addrlen; + afsifinfo[count].flags = flags; + afsifinfo[count].metric = metric; + afsifinfo[count].dstaddr = ntohl(sin4_dst->sin_addr.s_addr); + + /* Release global array write lock */ + (void) rw_exit(&afsifinfo_lock); + + count++; + + } /* Bottom of loop: for each interface ... */ + + kmem_free(lifcbuf, ifcount * sizeof(struct lifreq)); + + /* End of thread. Time to clean up */ + (void) ldi_close(lh, FREAD, cr); + (void) ldi_ident_release(li); + + /* Schedule this to run again after afs_if_poll_interval seconds */ + (void) timeout((void(*) (void *)) osi_StartNetIfPoller, NULL, + drv_usectohz((clock_t)afs_if_poll_interval * MICROSEC)); + +} +#endif /* AFS_SUN510_ENV */ + void shutdown_rxkernel(void) { diff --git a/src/rx/rx.c b/src/rx/rx.c index cb64f21e35..c4229acbfe 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -79,6 +79,7 @@ extern afs_int32 afs_termState; # include "rxgen_consts.h" #else /* KERNEL */ # include +# include # include #ifdef AFS_NT40_ENV # include @@ -93,13 +94,6 @@ extern afs_int32 afs_termState; # include # include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif # include "rx.h" # include "rx_user.h" # include "rx_clock.h" diff --git a/src/rx/rx.h b/src/rx/rx.h index acd57f1d20..16c5a7e83e 100644 --- a/src/rx/rx.h +++ b/src/rx/rx.h @@ -46,6 +46,7 @@ #else /* KERNEL */ # include # include +# include #ifdef AFS_PTHREAD_ENV # include "rx_pthread.h" #else diff --git a/src/rx/rx_kcommon.h b/src/rx/rx_kcommon.h index 4b4d2a3027..717f47753e 100644 --- a/src/rx/rx_kcommon.h +++ b/src/rx/rx_kcommon.h @@ -158,6 +158,10 @@ extern rxk_portRocks_t rxk_portRocks; extern struct domain inetdomain; #endif /* AFS_XBSD_ENV */ +#if defined(AFS_SUN510_ENV) +extern struct afs_ifinfo afsifinfo[ADDRSPERSITE]; +#endif + #endif /* _RX_KCOMMON_H_ */ #endif diff --git a/src/rx/rx_misc.c b/src/rx/rx_misc.c index 4b9761d189..2dd3b045af 100644 --- a/src/rx/rx_misc.c +++ b/src/rx/rx_misc.c @@ -30,13 +30,7 @@ RCSID #include "rx.h" #endif /* AFS_PTHREAD_ENV */ #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/rx/rx_packet.c b/src/rx/rx_packet.c index 8f7489fb37..db3c23ef67 100644 --- a/src/rx/rx_packet.c +++ b/src/rx/rx_packet.c @@ -88,13 +88,7 @@ RCSID #include "rx_globals.h" #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index ca8387cfb2..1e45fbb521 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -380,7 +380,6 @@ extern struct ifnet *rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp); #endif extern void osi_StopListener(void); - /* ARCH/rx_kmutex.c */ #if defined(KERNEL) && defined(AFS_LINUX20_ENV) extern void afs_mutex_init(afs_kmutex_t * l); @@ -402,6 +401,11 @@ extern int osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, #endif extern int osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec, int nvecs, int *lengthp); +#if defined(KERNEL) && defined(AFS_SUN510_ENV) +extern void osi_StartNetIfPoller(void); +extern void osi_NetIfPoller(void); +extern struct afs_ifinfo afsifinfo[ADDRSPERSITE]; +#endif extern void osi_StopListener(void); extern int rxi_FindIfMTU(afs_uint32 addr); #ifndef RXK_LISTENER_ENV diff --git a/src/rx/rx_pthread.c b/src/rx/rx_pthread.c index a03a5a0bcf..d63347597b 100644 --- a/src/rx/rx_pthread.c +++ b/src/rx/rx_pthread.c @@ -24,6 +24,7 @@ RCSID #include #include #include +#include #ifndef AFS_NT40_ENV # include # include diff --git a/src/rx/rx_rdwr.c b/src/rx/rx_rdwr.c index bbd731cd37..f38a053181 100644 --- a/src/rx/rx_rdwr.c +++ b/src/rx/rx_rdwr.c @@ -81,13 +81,7 @@ RCSID # include # include #endif /* !AFS_NT40_ENV */ -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/rx/rx_trace.c b/src/rx/rx_trace.c index dfb1735305..37b85d6e11 100644 --- a/src/rx/rx_trace.c +++ b/src/rx/rx_trace.c @@ -14,13 +14,7 @@ RCSID ("$Header$"); #ifdef RXDEBUG -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_NT40_ENV #include #include @@ -188,6 +182,7 @@ main(argc, argv) printf(" %3u %7u %7u %x.%x\n", ip.qlen, ip.servicetime, ip.waittime, ip.cid, ip.call); } + return 0; } #endif /* DUMPTRACE */ diff --git a/src/rx/rx_user.c b/src/rx/rx_user.c index 9d15032d51..b12a44db48 100644 --- a/src/rx/rx_user.c +++ b/src/rx/rx_user.c @@ -18,6 +18,7 @@ RCSID # include # include # include +# include #ifdef AFS_NT40_ENV # include #else @@ -36,13 +37,6 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifndef IPPORT_USERRESERVED /* If in.h doesn't define this, define it anyway. Unfortunately, defining diff --git a/src/rx/test/generator.c b/src/rx/test/generator.c index bf112470cf..214e2d7266 100644 --- a/src/rx/test/generator.c +++ b/src/rx/test/generator.c @@ -731,7 +731,7 @@ WriteCltTrailer(char *serverName, int first, int last, FILE * itl_h) fprintf(itl_h, "}\n"); fprintf(itl_h, - "\n\nstatic void DoRun(struct cmd_syndesc *as, char *arock) {\n"); + "\n\nstatic void DoRun(struct cmd_syndesc *as, void *arock) {\n"); if (threadModel == PTHREADS) { fprintf(itl_h, "\tpthread_t *tid;\n"); @@ -802,7 +802,7 @@ WriteCltTrailer(char *serverName, int first, int last, FILE * itl_h) fprintf(itl_h, "static void SetupRunCmd(void) {\n" "\tstruct cmd_syndesc *ts;\n" - "\tts = cmd_CreateSyntax(NULL,DoRun, 0, \"run the test client program\");\n" + "\tts = cmd_CreateSyntax(NULL,DoRun, NULL, \"run the test client program\");\n" "\tcmd_AddParm(ts, \"-threadCount\", CMD_SINGLE, CMD_REQUIRED, \"number of threads to spawn\");\n" "\tcmd_AddParm(ts, \"-iterationCount\", CMD_SINGLE, CMD_REQUIRED, \"number of iterations to make over entire interface for each thread\");\n" "\tcmd_AddParm(ts, \"-secType\", CMD_SINGLE, CMD_REQUIRED, \"security level to use (1 -> unauthenticated, 2 -> authenticated)\");\n" @@ -1187,7 +1187,7 @@ WriteServTrailer(FILE * srv_h) "\nstatic long GetKey (char *rock, long kvno, struct ktc_encryptionKey *key) {\n" "\tmemcpy ((void *) key, (void *) &serviceKey, sizeof(*key));\n" "\treturn 0;\n" "}\n\n" - "static void DoRun(struct cmd_syndesc *as, char *arock) {\n" + "static void DoRun(struct cmd_syndesc *as, void *arock) {\n" "\tstruct rx_service *serv;\n" "\tstruct rx_securityClass *sc[3];\n\n" "\tint port=0, errflg=0;\n" "\tint lowThreads=4, highThreads=8;\n" @@ -1204,7 +1204,7 @@ WriteServTrailer(FILE * srv_h) "\t\trx_SetMaxProcs(serv,highThreads);\n" "\t\trx_StartServer(1);\n" "\t}\n" "\texit(0);\n" "}\n\n" "static void SetupRunCmd(void) {\n" "\tstruct cmd_syndesc *ts;\n" - "\tts = cmd_CreateSyntax(NULL,DoRun, 0, \"run the test server program\");\n" + "\tts = cmd_CreateSyntax(NULL,DoRun, NULL, \"run the test server program\");\n" "\tcmd_AddParm(ts, \"-lowThreadCount\", CMD_SINGLE, CMD_REQUIRED, \"minimum number of threads to spawn\");\n" "\tcmd_AddParm(ts, \"-highThreadCount\", CMD_SINGLE, CMD_REQUIRED, \"maximum number of threads to spawn\");\n" "\tcmd_AddParm(ts, \"-serverPort\", CMD_SINGLE, CMD_REQUIRED, \"port that server is using\");\n" diff --git a/src/rx/xdr.c b/src/rx/xdr.c index 5816ef162c..54011e6ae4 100644 --- a/src/rx/xdr.c +++ b/src/rx/xdr.c @@ -32,6 +32,7 @@ #include "afs/param.h" #else #include +#include #endif RCSID diff --git a/src/rx/xdr_array.c b/src/rx/xdr_array.c index 41776ec939..03d8947d67 100644 --- a/src/rx/xdr_array.c +++ b/src/rx/xdr_array.c @@ -58,6 +58,7 @@ RCSID #endif /* AFS_LINUX20_ENV */ #else #include +#include #endif #include "xdr.h" diff --git a/src/rx/xdr_rec.c b/src/rx/xdr_rec.c index 0a84facd32..ad14646484 100644 --- a/src/rx/xdr_rec.c +++ b/src/rx/xdr_rec.c @@ -59,13 +59,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* * A record is composed of one or more record fragments. diff --git a/src/rx/xdr_refernce.c b/src/rx/xdr_refernce.c index 9145eb6723..f8aa058802 100644 --- a/src/rx/xdr_refernce.c +++ b/src/rx/xdr_refernce.c @@ -46,6 +46,7 @@ RCSID #include "xdr.h" #include +#include #define LASTUNSIGNED ((u_int)0-1) /* diff --git a/src/rxdebug/rxdebug.c b/src/rxdebug/rxdebug.c index a42f5c7083..93a8389a0a 100644 --- a/src/rxdebug/rxdebug.c +++ b/src/rxdebug/rxdebug.c @@ -32,13 +32,7 @@ RCSID #ifdef HAVE_UNISTD_H #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -85,9 +79,7 @@ PortName(aname) } int -MainCommand(as, arock) - char *arock; - struct cmd_syndesc *as; +MainCommand(struct cmd_syndesc *as, void *arock) { register int i; osi_socket s; @@ -604,7 +596,7 @@ main(argc, argv) } #endif - ts = cmd_CreateSyntax(NULL, MainCommand, 0, "probe RX server"); + ts = cmd_CreateSyntax(NULL, MainCommand, NULL, "probe RX server"); cmd_AddParm(ts, "-servers", CMD_SINGLE, CMD_REQUIRED, "server machine"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "IP port"); cmd_AddParm(ts, "-nodally", CMD_FLAG, CMD_OPTIONAL, diff --git a/src/rxgen/Makefile.in b/src/rxgen/Makefile.in index b0915fa62f..a9cd97e2ca 100644 --- a/src/rxgen/Makefile.in +++ b/src/rxgen/Makefile.in @@ -18,6 +18,9 @@ all: rxgen ${TOP_INCDIR}/afs/rxgen_consts.h rxgen: $(OBJS) AFS_component_version_number.c $(HDRS) $(CC) $(CFLAGS) $(OBJS) $(XLIBS) -o $@ +rpc_main.o: rpc_main.c + $(CCOBJ) $(CFLAGS) -c $< -D__PROG_CPP__="\"$(CPP)\"" + # # Install targets # diff --git a/src/rxgen/rpc_cout.c b/src/rxgen/rpc_cout.c index 66599be931..92a864534e 100644 --- a/src/rxgen/rpc_cout.c +++ b/src/rxgen/rpc_cout.c @@ -40,13 +40,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "rpc_scan.h" #include "rpc_parse.h" #include "rpc_util.h" diff --git a/src/rxgen/rpc_main.c b/src/rxgen/rpc_main.c index 4f923314d4..be9fd5696f 100644 --- a/src/rxgen/rpc_main.c +++ b/src/rxgen/rpc_main.c @@ -43,13 +43,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_SIGNAL_H #include #endif @@ -66,6 +60,7 @@ RCSID #define EXTEND 1 /* alias for TRUE */ struct commandline { + int ansic_flag; int cflag; int hflag; int lflag; @@ -93,19 +88,14 @@ int nincludes = 0; char *OutFileFlag = ""; char OutFile[256]; char Sflag = 0, Cflag = 0, hflag = 0, cflag = 0, kflag = 0, uflag = 0; +char ansic_flag = 0; /* If set, build ANSI C style prototypes */ char zflag = 0; /* If set, abort server stub if rpc call returns non-zero */ char xflag = 0; /* if set, add stats code to stubs */ char yflag = 0; /* if set, only emit function name arrays to xdr file */ int debug = 0; static char *cmdname; -#ifdef AFS_SUN5_ENV -static char CPP[] = "/usr/ccs/lib/cpp"; -#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN60_ENV) -static char CPP[] = "/usr/bin/cpp"; -#elif defined(AFS_NT40_ENV) -static char CPP[MAXCMDLINE]; -#elif defined(AFS_DARWIN_ENV) -static char CPP[] = "cc -E"; +#ifdef __PROG_CPP__ +static char CPP[] = __PROG_CPP__; #else static char CPP[] = "/lib/cpp"; #endif @@ -808,6 +798,7 @@ parseargs(int argc, char *argv[], struct commandline *cmd) for (j = 1; argv[i][j] != 0; j++) { c = argv[i][j]; switch (c) { + case 'A': case 'c': case 'h': case 'l': @@ -867,6 +858,7 @@ parseargs(int argc, char *argv[], struct commandline *cmd) ; } } + cmd->ansic_flag = ansic_flag = flag['A']; cmd->cflag = cflag = flag['c']; cmd->hflag = hflag = flag['h']; cmd->sflag = flag['s']; diff --git a/src/rxgen/rpc_parse.c b/src/rxgen/rpc_parse.c index fafc81bdb2..fa5acb66f5 100644 --- a/src/rxgen/rpc_parse.c +++ b/src/rxgen/rpc_parse.c @@ -41,13 +41,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "rpc_scan.h" #include "rpc_parse.h" #include "rpc_util.h" @@ -1116,20 +1110,29 @@ cs_Proc_CodeGeneration(definition * defp, int split_flag, char *procheader) } } - static void cs_ProcName_setup(definition * defp, char *procheader, int split_flag) { proc1_list *plist; + char *first_arg; + + if (ansic_flag) { + if (split_flag) { + first_arg = "register struct rx_call *z_call"; + } else { + first_arg = "register struct rx_connection *z_conn"; + } + } else { + if (split_flag) { + first_arg = "z_call"; + } else { + first_arg = "z_conn"; + } + } if (!cflag) { - if (split_flag) { - f_print(fout, "int %s%s%s%s(z_call", procheader, prefix, - PackagePrefix[PackageIndex], defp->pc.proc_name); - } else { - f_print(fout, "int %s%s%s%s(z_conn", procheader, prefix, - PackagePrefix[PackageIndex], defp->pc.proc_name); - } + f_print(fout, "int %s%s%s%s(%s", procheader, prefix, + PackagePrefix[PackageIndex], defp->pc.proc_name, first_arg); } if ((strlen(procheader) + strlen(prefix) + strlen(PackagePrefix[PackageIndex]) + strlen(defp->pc.proc_name)) >= @@ -1139,20 +1142,32 @@ cs_ProcName_setup(definition * defp, char *procheader, int split_flag) if (!cflag) { for (plist = defp->pc.plists; plist; plist = plist->next) { if (plist->component_kind == DEF_PARAM) { - plist->pl.param_flag &= ~PROCESSED_PARAM; - f_print(fout, ", %s", plist->pl.param_name); + if (ansic_flag) { + if (plist->pl.param_flag & OUT_STRING) { + f_print(fout, ",%s *%s", plist->pl.param_type, + plist->pl.param_name); + } else { + f_print(fout, ",%s %s", plist->pl.param_type, + plist->pl.param_name); + } + } else { + f_print(fout, ", %s", plist->pl.param_name); + plist->pl.param_flag &= ~PROCESSED_PARAM; + } } } f_print(fout, ")\n"); } } - static void cs_ProcParams_setup(definition * defp, int split_flag) { proc1_list *plist, *plist1; + if (ansic_flag) + return; + if (!split_flag) f_print(fout, "\tregister struct rx_connection *z_conn;\n"); if (split_flag) { @@ -1748,8 +1763,14 @@ ucs_ProcName_setup(definition * defp, char *procheader, int split_flag) proc1_list *plist; if (!cflag) { - f_print(fout, "int %s%s%s%s(aclient, aflags", procheader, prefix, - PackagePrefix[PackageIndex], defp->pc.proc_name); + if (ansic_flag) { + f_print(fout, "int %s%s%s%s(register struct ubik_client *aclient, afs_int32 aflags", + procheader, prefix, PackagePrefix[PackageIndex], + defp->pc.proc_name); + } else { + f_print(fout, "int %s%s%s%s(aclient, aflags", procheader, prefix, + PackagePrefix[PackageIndex], defp->pc.proc_name); + } } if ((strlen(procheader) + strlen(prefix) + strlen(PackagePrefix[PackageIndex]) + strlen(defp->pc.proc_name)) >= @@ -1759,8 +1780,18 @@ ucs_ProcName_setup(definition * defp, char *procheader, int split_flag) if (!cflag) { for (plist = defp->pc.plists; plist; plist = plist->next) { if (plist->component_kind == DEF_PARAM) { - plist->pl.param_flag &= ~PROCESSED_PARAM; - f_print(fout, ", %s", plist->pl.param_name); + if (ansic_flag) { + if (plist->pl.param_flag & OUT_STRING) { + f_print(fout, ",%s *%s", plist->pl.param_type, + plist->pl.param_name); + } else { + f_print(fout, ",%s %s", plist->pl.param_type, + plist->pl.param_name); + } + } else { + plist->pl.param_flag &= ~PROCESSED_PARAM; + f_print(fout, ", %s", plist->pl.param_name); + } } } f_print(fout, ")\n"); @@ -1773,6 +1804,9 @@ ucs_ProcParams_setup(definition * defp, int split_flag) { proc1_list *plist, *plist1; + if (ansic_flag) + return; + f_print(fout, "\tregister struct ubik_client *aclient;\n\tafs_int32 aflags;\n"); for (plist = defp->pc.plists; plist; plist = plist->next) { if (plist->component_kind == DEF_PARAM diff --git a/src/rxgen/rpc_scan.c b/src/rxgen/rpc_scan.c index 2fd4f17d69..7504bfdc3d 100644 --- a/src/rxgen/rpc_scan.c +++ b/src/rxgen/rpc_scan.c @@ -43,13 +43,8 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif + #include "rpc_scan.h" #include "rpc_parse.h" #include "rpc_util.h" diff --git a/src/rxgen/rpc_svcout.c b/src/rxgen/rpc_svcout.c index 6e717f6356..288e6ea8c6 100644 --- a/src/rxgen/rpc_svcout.c +++ b/src/rxgen/rpc_svcout.c @@ -39,13 +39,7 @@ RCSID ("$Header$"); #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "rpc_scan.h" #include "rpc_parse.h" #include "rpc_util.h" diff --git a/src/rxgen/rpc_util.c b/src/rxgen/rpc_util.c index 9794442a67..232c1fbe6c 100644 --- a/src/rxgen/rpc_util.c +++ b/src/rxgen/rpc_util.c @@ -39,13 +39,7 @@ RCSID ("$Header$"); #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/rxgen/rpc_util.h b/src/rxgen/rpc_util.h index 86e4894e52..3722421f45 100644 --- a/src/rxgen/rpc_util.h +++ b/src/rxgen/rpc_util.h @@ -57,6 +57,7 @@ extern int nincludes; extern char *OutFileFlag; extern char OutFile[]; extern char Sflag, Cflag, hflag, cflag, kflag, uflag; +extern char ansic_flag; extern char zflag; extern char xflag; extern char yflag; diff --git a/src/rxkad/crc.c b/src/rxkad/crc.c index a7e93fc290..65a4827313 100644 --- a/src/rxkad/crc.c +++ b/src/rxkad/crc.c @@ -60,13 +60,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/rxkad/domestic/crypt_conn.c b/src/rxkad/domestic/crypt_conn.c index c5696d3772..4bb1fa4678 100644 --- a/src/rxkad/domestic/crypt_conn.c +++ b/src/rxkad/domestic/crypt_conn.c @@ -37,6 +37,7 @@ RCSID #else /* !KERNEL */ #include #include +#include #include #ifdef AFS_NT40_ENV #include diff --git a/src/rxkad/domestic/fcrypt.c b/src/rxkad/domestic/fcrypt.c index c24b3768df..63f75e842e 100644 --- a/src/rxkad/domestic/fcrypt.c +++ b/src/rxkad/domestic/fcrypt.c @@ -47,6 +47,7 @@ RCSID #include #include +#include #ifdef AFS_NT40_ENV #include #else diff --git a/src/rxkad/md4.c b/src/rxkad/md4.c index 6844caf781..4c61fc1cb3 100644 --- a/src/rxkad/md4.c +++ b/src/rxkad/md4.c @@ -55,13 +55,7 @@ #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/rxkad/md5.c b/src/rxkad/md5.c index 397023bb42..0e9fcf2c78 100644 --- a/src/rxkad/md5.c +++ b/src/rxkad/md5.c @@ -55,14 +55,7 @@ #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#include #include #include #include "lifetimes.h" diff --git a/src/rxkad/rxkad_client.c b/src/rxkad/rxkad_client.c index 33d1b9ff1d..d54de23634 100644 --- a/src/rxkad/rxkad_client.c +++ b/src/rxkad/rxkad_client.c @@ -47,13 +47,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_NT40_ENV #include #else diff --git a/src/rxkad/rxkad_common.c b/src/rxkad/rxkad_common.c index 9f3fb6d291..62d56535be 100644 --- a/src/rxkad/rxkad_common.c +++ b/src/rxkad/rxkad_common.c @@ -50,6 +50,7 @@ RCSID #else /* KERNEL */ #include #include +#include #include #ifdef AFS_NT40_ENV #include @@ -61,13 +62,6 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #endif /* KERNEL */ diff --git a/src/rxkad/rxkad_server.c b/src/rxkad/rxkad_server.c index 5806e9649e..b916f98711 100644 --- a/src/rxkad/rxkad_server.c +++ b/src/rxkad/rxkad_server.c @@ -28,13 +28,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/rxkad/test/stress.c b/src/rxkad/test/stress.c index ee40f85e2a..936e2d74e3 100644 --- a/src/rxkad/test/stress.c +++ b/src/rxkad/test/stress.c @@ -104,9 +104,7 @@ StringToAuth(authname) #define aKEYFILE 26 static int -CommandProc(as, arock) - char *arock; - struct cmd_syndesc *as; +CommandProc(struct cmd_syndesc *as, void *arock) { long code; int startServer = (as->parms[aSERVER].items != 0); @@ -311,7 +309,7 @@ main(argc, argv) exit(1); } #endif - ts = cmd_CreateSyntax(NULL, CommandProc, 0, + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "run Rx authentication stress test"); cmd_AddParm(ts, "-server", CMD_FLAG, CMD_OPTIONAL, "start server"); cmd_AddParm(ts, "-client", CMD_SINGLE, CMD_OPTIONAL, "start client"); diff --git a/src/rxkad/ticket.c b/src/rxkad/ticket.c index 0e44591595..67c2fb1a14 100644 --- a/src/rxkad/ticket.c +++ b/src/rxkad/ticket.c @@ -34,13 +34,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/rxkad/ticket5.c b/src/rxkad/ticket5.c index 4273a9466f..98c56d347e 100644 --- a/src/rxkad/ticket5.c +++ b/src/rxkad/ticket5.c @@ -81,13 +81,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/rxstat/Makefile.in b/src/rxstat/Makefile.in index 588b5552d1..4850bf2c9d 100644 --- a/src/rxstat/Makefile.in +++ b/src/rxstat/Makefile.in @@ -19,16 +19,16 @@ depinstall: \ # Build targets # rxstat.cs.c: rxstat.xg - ${RXGEN} -x -C -o $@ ${srcdir}/rxstat.xg + ${RXGEN} -A -x -C -o $@ ${srcdir}/rxstat.xg rxstat.ss.c: rxstat.xg - ${RXGEN} -x -S -o $@ ${srcdir}/rxstat.xg + ${RXGEN} -A -x -S -o $@ ${srcdir}/rxstat.xg rxstat.xdr.c: rxstat.xg - ${RXGEN} -x -c -o $@ ${srcdir}/rxstat.xg + ${RXGEN} -A -x -c -o $@ ${srcdir}/rxstat.xg rxstat.h: rxstat.xg - ${RXGEN} -x -h -o $@ ${srcdir}/rxstat.xg + ${RXGEN} -A -x -h -o $@ ${srcdir}/rxstat.xg rxstat.xdr.c: rxstat.h rxstat.cs.c: rxstat.h diff --git a/src/scout/scout.c b/src/scout/scout.c index 8a95417c7b..de3a6c7cad 100644 --- a/src/scout/scout.c +++ b/src/scout/scout.c @@ -21,13 +21,7 @@ RCSID #ifdef AFS_AIX32_ENV #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #undef IN #include /*Generic window package */ #include /*Object definitions */ @@ -2216,10 +2210,7 @@ static void scout_AdoptThresholds(a_thresh_item) * Initializes this program. *------------------------------------------------------------------------*/ -static int scoutInit(as, arock) - struct cmd_syndesc *as; - char *arock; - +static int scoutInit(struct cmd_syndesc *as, void *arock) { /*scoutInit */ static char rn[] = "scoutInit"; /*Routine name */ @@ -2358,7 +2349,7 @@ main(argc, argv) /* * Set up the commands we understand. */ - ts = cmd_CreateSyntax("initcmd", scoutInit, 0, "initialize the program"); + ts = cmd_CreateSyntax("initcmd", scoutInit, NULL, "initialize the program"); cmd_AddParm(ts, "-server", CMD_LIST, CMD_REQUIRED, "FileServer name(s) to monitor"); cmd_AddParm(ts, "-basename", CMD_SINGLE, CMD_OPTIONAL, @@ -2390,4 +2381,5 @@ main(argc, argv) } else scout_CleanExit(0); + return 0; /* not reachable */ } /*main */ diff --git a/src/shlibafsauthent/afsauthent.exp b/src/shlibafsauthent/afsauthent.exp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/shlibafsauthent/mapfile b/src/shlibafsauthent/mapfile deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/shlibafsrpc/Makefile.in b/src/shlibafsrpc/Makefile.in index 4ae525e37e..16329ef73f 100644 --- a/src/shlibafsrpc/Makefile.in +++ b/src/shlibafsrpc/Makefile.in @@ -439,7 +439,7 @@ fasttime.o: ${LWP}/fasttime.c syscall.o: ${SYS}/syscall.s case "$(SYS_NAME)" in \ sun4x_5* | sunx86_5*) \ - /usr/ccs/lib/cpp ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ + $(CPP) ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ as -o syscall.o syscall.ss; \ $(RM) syscall.ss;; \ sgi_* | *_darwin_* ) \ @@ -451,7 +451,7 @@ syscall.o: ${SYS}/syscall.s *fbsd* ) \ touch syscall.o ;; \ *) \ - /lib/cpp ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ + $(CPP) ${SFLAGS} ${SYS}/syscall.s syscall.ss; \ as -o syscall.o syscall.ss; \ $(RM) syscall.ss;; \ esac diff --git a/src/shlibafsrpc/afsrpc.exp b/src/shlibafsrpc/afsrpc.exp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/shlibafsrpc/mapfile b/src/shlibafsrpc/mapfile deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/shlibafsrpc/mapfile.afs_xdr b/src/shlibafsrpc/mapfile.afs_xdr deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/sys/Makefile.in b/src/sys/Makefile.in index 3e76122931..dd849785c4 100644 --- a/src/sys/Makefile.in +++ b/src/sys/Makefile.in @@ -80,7 +80,7 @@ tests: pagsh pagsh.krb fixit iinc idec icreate iopen istat rmtsysd syscall.o: syscall.s @set -x; case "$(SYS_NAME)" in \ sun4c_51 | sun4c_52 | sun4m_51 | sun4m_52 | sun4c_53 | sun4m_53 | sun4_53 | sun4_52 | sun4_54 | sun4c_54 | sun4m_54 | sun4x_5? | sun4x_5?? | sunx86_5? | sunx86_5?? ) \ - /usr/ccs/lib/cpp -P ${SFLAGS} ${srcdir}/syscall.s syscall.ss; \ + $(CPP) -P ${SFLAGS} ${srcdir}/syscall.s syscall.ss; \ as -o syscall.o syscall.ss; \ $(RM) syscall.ss;; \ sgi_* |*_darwin* ) \ @@ -96,7 +96,7 @@ syscall.o: syscall.s ${AS} syscall.S -o syscall.o ; \ $(RM) -f syscall.S ;;\ *) \ - /lib/cpp -P ${SFLAGS} ${srcdir}/syscall.s syscall.ss; \ + $(CPP) -P ${SFLAGS} ${srcdir}/syscall.s syscall.ss; \ as -o syscall.o syscall.ss; \ $(RM) syscall.ss;; \ esac @@ -128,25 +128,25 @@ rmtsysnet.o rmtsysc.o rmtsyss.o rmtsysd.o: rmtsys.h rmtsysd: AFS_component_version_number.o afs.exp afsl.exp rmtsys.cs.c: rmtsys.xg - ${RXGEN} -C -o $@ ${srcdir}/rmtsys.xg + ${RXGEN} -A -C -o $@ ${srcdir}/rmtsys.xg rmtsys.ss.c: rmtsys.xg - ${RXGEN} -S -o $@ ${srcdir}/rmtsys.xg + ${RXGEN} -A -S -o $@ ${srcdir}/rmtsys.xg rmtsys.xdr.c: rmtsys.xg - ${RXGEN} -c -o $@ ${srcdir}/rmtsys.xg + ${RXGEN} -A -c -o $@ ${srcdir}/rmtsys.xg rmtsys.h: rmtsys.xg - ${RXGEN} -h -o $@ ${srcdir}/rmtsys.xg + ${RXGEN} -A -h -o $@ ${srcdir}/rmtsys.xg Krmtsys.cs.c: rmtsys.xg Krmtsys.h - ${RXGEN} -k -C -o Krmtsys.cs.c ${srcdir}/rmtsys.xg + ${RXGEN} -A -k -C -o Krmtsys.cs.c ${srcdir}/rmtsys.xg Krmtsys.xdr.c: rmtsys.xg - ${RXGEN} -k -c -o Krmtsys.xdr.c ${srcdir}/rmtsys.xg + ${RXGEN} -A -k -c -o Krmtsys.xdr.c ${srcdir}/rmtsys.xg Krmtsys.h: rmtsys.xg - ${RXGEN} -k -h -o Krmtsys.h ${srcdir}/rmtsys.xg + ${RXGEN} -A -k -h -o Krmtsys.h ${srcdir}/rmtsys.xg rmtsysd: rmtsysd.o libsys.a ${CC} ${CFLAGS} -o rmtsysd rmtsysd.o ${LIBS} @@ -310,16 +310,16 @@ ${DESTDIR}${libdir}/${LIBAFSSETPAG_DARWIN}: ${LIBAFSSETPAG_DARWIN} ${DESTDIR}${libdir}/libafssetpag.${LIBAFSSETPAGMAJOR}.${LIBAFSSETPAGMINOR}.${SHLIB_SUFFIX} ;; \ ${DESTDIR}${sbindir}/rmtsysd: rmtsysd - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${includedir}/afs/afssyscalls.h: afssyscalls.h ${INSTALL} $? $@ ${DESTDIR}${bindir}/pagsh: pagsh - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${bindir}/pagsh.krb: pagsh.krb - ${INSTALL} -s $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ ${DESTDIR}${includedir}/afs/afs.exp: afs.exp @set -x; case ${SYS_NAME} in \ @@ -361,13 +361,13 @@ ${DEST}/include/afs/afssyscalls.h: afssyscalls.h ${INSTALL} $? $@ ${DEST}/etc/rmtsysd: rmtsysd - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/pagsh: pagsh - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/pagsh.krb: pagsh.krb - ${INSTALL} -s $? $@ + ${INSTALL} ${NO_STRIP_KRB} $? $@ # # Misc targets diff --git a/src/sys/pagsh.c b/src/sys/pagsh.c index 0b05d3af3b..4564667121 100644 --- a/src/sys/pagsh.c +++ b/src/sys/pagsh.c @@ -22,9 +22,7 @@ RCSID #ifndef AFS_NT40_ENV #include #endif -#ifdef HAVE_STRING_H #include -#endif #include #ifdef AFS_KERBEROS_ENV #include @@ -165,6 +163,7 @@ ktc_newpag(void) strcat(*denv, fname5); *++denv = 0; environ = newenv; + return 0; } #endif diff --git a/src/sys/pioctl_nt.c b/src/sys/pioctl_nt.c index 4eec849712..7152e8a5b7 100644 --- a/src/sys/pioctl_nt.c +++ b/src/sys/pioctl_nt.c @@ -92,12 +92,14 @@ CMtoUNIXerror(int cm_code) return EACCES; case CM_ERROR_NOSUCHFILE: case CM_ERROR_NOSUCHPATH: + case CM_ERROR_BPLUS_NOMATCH: return ENOENT; case CM_ERROR_INVAL: return EINVAL; case CM_ERROR_BADFD: return EBADF; case CM_ERROR_EXISTS: + case CM_ERROR_INEXACT_MATCH: return EEXIST; case CM_ERROR_CROSSDEVLINK: return EXDEV; diff --git a/src/sys/rmtsysc.c b/src/sys/rmtsysc.c index 6d501af123..a7ad054332 100644 --- a/src/sys/rmtsysc.c +++ b/src/sys/rmtsysc.c @@ -31,9 +31,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#endif #ifdef HAVE_UNISTD_H #include #endif @@ -46,6 +44,8 @@ static afs_int32 hostAddr = 0; static int hostAddrLookup = 0; char *afs_server = 0, server_name[128]; static afs_int32 SetClientCreds(); +int afs_get_pag_from_groups(afs_uint32 g0, afs_uint32 g1); +void afs_get_groups_from_pag(afs_uint32 pag, afs_uint32 * g0p, afs_uint32 * g1p); /* Picks up the name of the remote afs client host where the rmtsys * daemon resides. Since the clients may be diskless and/or readonly @@ -307,7 +307,7 @@ afs_get_pag_from_groups(afs_uint32 g0, afs_uint32 g1) return NOPAG; } - +void afs_get_groups_from_pag(afs_uint32 pag, afs_uint32 * g0p, afs_uint32 * g1p) { unsigned short g0, g1; diff --git a/src/sys/rmtsysd.c b/src/sys/rmtsysd.c index 0819b943f8..aceb44b5d7 100644 --- a/src/sys/rmtsysd.c +++ b/src/sys/rmtsysd.c @@ -78,4 +78,5 @@ main(int argc, char *argv[]) * at some point... */ rx_SetMaxProcs(service, 2); rx_StartServer(1); /* Donate this process to the server process pool */ + return 0; } diff --git a/src/sys/rmtsysnet.c b/src/sys/rmtsysnet.c index 907f93ff82..4430b3899c 100644 --- a/src/sys/rmtsysnet.c +++ b/src/sys/rmtsysnet.c @@ -26,13 +26,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -153,6 +147,7 @@ RAclToString(struct Acl *acl, char *mydata, int ntoh_conv) sprintf(tstring, "%s %d\n", tp->name, tp->rights); strcat(mydata, tstring); } + return 0; } @@ -171,6 +166,7 @@ RCleanAcl(struct Acl *aa) free(te); } free(aa); + return 0; } @@ -212,6 +208,7 @@ RFetchVolumeStatus_conversion(char *data, int ntoh_conv) status->PartBlocksAvail = htonl(status->PartBlocksAvail); status->PartMaxBlocks = htonl(status->PartMaxBlocks); } + return 0; } int @@ -230,6 +227,7 @@ RClearToken_convert(char *ptr, int ntoh_conv) ticket->BeginTimestamp = htonl(ticket->BeginTimestamp); ticket->EndTimestamp = htonl(ticket->EndTimestamp); } + return 0; } int @@ -340,6 +338,7 @@ inparam_conversion(afs_int32 cmd, char *buffer, afs_int32 ntoh_conv) /* Note that new pioctls are supposed to be in network order! */ break; } + return 0; } @@ -450,4 +449,5 @@ outparam_conversion(afs_int32 cmd, char *buffer, afs_int32 ntoh_conv) /* Note that new pioctls are supposed to be in network order! */ break; } + return 0; } diff --git a/src/sys/rmtsyss.c b/src/sys/rmtsyss.c index 33bb05a5fb..2cb68a97b4 100644 --- a/src/sys/rmtsyss.c +++ b/src/sys/rmtsyss.c @@ -30,9 +30,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#endif /*#include */ #include "rmtsys.h" @@ -85,6 +83,7 @@ rmtsysd() * at some point... */ rx_SetMaxProcs(service, 2); rx_StartServer(1); /* Donate this process to the server process pool */ + return 0; /* not reached */ } diff --git a/src/tbutc/NTMakefile b/src/tbutc/NTMakefile index bf75476b93..551547bd18 100644 --- a/src/tbutc/NTMakefile +++ b/src/tbutc/NTMakefile @@ -78,6 +78,9 @@ BUTCOBJS = $(OUT)\dbentries.obj \ $(OUT)\butc_xbsa.obj \ $(LWPOBJS) \ $(BUCOORDOBJS) + +BUTCRES = $(OUT)\butc.res + BUTCINCLUDE= -I. -I$(DESTDIR)\include -I$(XBSADIR) BUTCLIBS=$(DESTDIR)\lib\afs\afsbudb.lib \ $(DESTDIR)\lib\afs\afsbubasics.lib \ @@ -122,7 +125,9 @@ BUTCLIBS=$(DESTDIR)\lib\afs\afsbudb.lib \ # nmake /nologo /f ntmakefile install #----------------------------------------------- BUTC -$(BUTCEXE): $(BUTCOBJS) $(BUTCLIBS) +$(BUTCRES): butc.rc AFS_component_version_number.h + +$(BUTCEXE): $(BUTCOBJS) $(BUTCRES) $(BUTCLIBS) $(EXECONLINK) dnsapi.lib mpr.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) @@ -198,3 +203,5 @@ noversion: install mkdir: +clean:: + $(DEL) $(BUTCRES) diff --git a/src/tbutc/butc.rc b/src/tbutc/butc.rc new file mode 100644 index 0000000000..4c14377e2a --- /dev/null +++ b/src/tbutc/butc.rc @@ -0,0 +1,17 @@ +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + */ + +/* Define VERSIONINFO resource */ + +#define AFS_VERINFO_FILE_DESCRIPTION "AFS Tape Coordinator Server (threaded)" +#define AFS_VERINFO_NAME "butc" +#define AFS_VERINFO_FILENAME "butc.exe" + +#include "AFS_component_version_number.h" +#include "..\config\NTVersioninfo.rc" diff --git a/src/tsalvaged/Makefile.in b/src/tsalvaged/Makefile.in index 1f4ccc6001..382e7255d8 100644 --- a/src/tsalvaged/Makefile.in +++ b/src/tsalvaged/Makefile.in @@ -176,10 +176,10 @@ ${DEST}/root.server/usr/afs/bin/salvageserver: salvageserver ${INSTALL} -ns $? $@ ${DEST}/root.server/usr/afs/bin/fssync-debug: fssync-debug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/root.server/usr/afs/bin/salvsync-debug: salvsync-debug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ install: ${INSTALL_TARGS} @@ -192,9 +192,9 @@ ${DESTDIR}${afssrvlibexecdir}/salvageserver: salvageserver ${INSTALL} -ns $? $@ ${DESTDIR}${afssrvsbindir}/fssync-debug: fssync-debug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/salvsync-debug: salvsync-debug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ dest: ${DEST_TARGS} diff --git a/src/tsalvaged/salvsync-debug.c b/src/tsalvaged/salvsync-debug.c index 4d4949aff2..f25c89f4ee 100644 --- a/src/tsalvaged/salvsync-debug.c +++ b/src/tsalvaged/salvsync-debug.c @@ -101,12 +101,12 @@ static char * program_type_to_string(afs_int32); static char * state_code_to_string(afs_int32); -static int OpStats(struct cmd_syndesc * as, char * rock); -static int OpSalvage(struct cmd_syndesc * as, char * rock); -static int OpCancel(struct cmd_syndesc * as, char * rock); -static int OpCancelAll(struct cmd_syndesc * as, char * rock); -static int OpRaisePrio(struct cmd_syndesc * as, char * rock); -static int OpQuery(struct cmd_syndesc * as, char * rock); +static int OpStats(struct cmd_syndesc * as, void * rock); +static int OpSalvage(struct cmd_syndesc * as, void * rock); +static int OpCancel(struct cmd_syndesc * as, void * rock); +static int OpCancelAll(struct cmd_syndesc * as, void * rock); +static int OpRaisePrio(struct cmd_syndesc * as, void * rock); +static int OpQuery(struct cmd_syndesc * as, void * rock); #ifndef AFS_NT40_ENV @@ -153,25 +153,25 @@ main(int argc, char **argv) } - ts = cmd_CreateSyntax("stats", OpStats, 0, "get salvageserver statistics (SALVSYNC_NOP opcode)"); + ts = cmd_CreateSyntax("stats", OpStats, NULL, "get salvageserver statistics (SALVSYNC_NOP opcode)"); COMMON_PARMS_DECL(ts); cmd_CreateAlias(ts, "nop"); - ts = cmd_CreateSyntax("salvage", OpSalvage, 0, "schedule a salvage (SALVSYNC_SALVAGE opcode)"); + ts = cmd_CreateSyntax("salvage", OpSalvage, NULL, "schedule a salvage (SALVSYNC_SALVAGE opcode)"); SALV_PARMS_DECL(ts); - ts = cmd_CreateSyntax("cancel", OpCancel, 0, "cancel a salvage (SALVSYNC_CANCEL opcode)"); + ts = cmd_CreateSyntax("cancel", OpCancel, NULL, "cancel a salvage (SALVSYNC_CANCEL opcode)"); SALV_PARMS_DECL(ts); - ts = cmd_CreateSyntax("raiseprio", OpRaisePrio, 0, "raise a salvage priority (SALVSYNC_RAISEPRIO opcode)"); + ts = cmd_CreateSyntax("raiseprio", OpRaisePrio, NULL, "raise a salvage priority (SALVSYNC_RAISEPRIO opcode)"); SALV_PARMS_DECL(ts); cmd_CreateAlias(ts, "rp"); - ts = cmd_CreateSyntax("query", OpQuery, 0, "query salvage status (SALVSYNC_QUERY opcode)"); + ts = cmd_CreateSyntax("query", OpQuery, NULL, "query salvage status (SALVSYNC_QUERY opcode)"); SALV_PARMS_DECL(ts); cmd_CreateAlias(ts, "qry"); - ts = cmd_CreateSyntax("kill", OpCancelAll, 0, "cancel all scheduled salvages (SALVSYNC_CANCELALL opcode)"); + ts = cmd_CreateSyntax("kill", OpCancelAll, NULL, "cancel all scheduled salvages (SALVSYNC_CANCELALL opcode)"); COMMON_PARMS_DECL(ts); err = cmd_Dispatch(argc, argv); @@ -395,7 +395,7 @@ state_code_to_string(afs_int32 state) } static int -OpStats(struct cmd_syndesc * as, char * rock) +OpStats(struct cmd_syndesc * as, void * rock) { struct state state; @@ -408,7 +408,7 @@ OpStats(struct cmd_syndesc * as, char * rock) } static int -OpSalvage(struct cmd_syndesc * as, char * rock) +OpSalvage(struct cmd_syndesc * as, void * rock) { struct state state; @@ -421,7 +421,7 @@ OpSalvage(struct cmd_syndesc * as, char * rock) } static int -OpCancel(struct cmd_syndesc * as, char * rock) +OpCancel(struct cmd_syndesc * as, void * rock) { struct state state; @@ -434,7 +434,7 @@ OpCancel(struct cmd_syndesc * as, char * rock) } static int -OpCancelAll(struct cmd_syndesc * as, char * rock) +OpCancelAll(struct cmd_syndesc * as, void * rock) { struct state state; @@ -447,7 +447,7 @@ OpCancelAll(struct cmd_syndesc * as, char * rock) } static int -OpRaisePrio(struct cmd_syndesc * as, char * rock) +OpRaisePrio(struct cmd_syndesc * as, void * rock) { struct state state; @@ -460,7 +460,7 @@ OpRaisePrio(struct cmd_syndesc * as, char * rock) } static int -OpQuery(struct cmd_syndesc * as, char * rock) +OpQuery(struct cmd_syndesc * as, void * rock) { struct state state; diff --git a/src/tsm41/aix_aklog.c b/src/tsm41/aix_aklog.c index dc0320e148..e14b0b5cd7 100644 --- a/src/tsm41/aix_aklog.c +++ b/src/tsm41/aix_aklog.c @@ -533,11 +533,14 @@ static int auth_to_cell(krb5_context context, char *cell, char *realm) strcpy(aclient.instance, ""); strncpy(aclient.cell, realm_of_user, MAXKTCREALMLEN - 1); +#ifndef AFS_AIX51_ENV /* on AIX 4.1.4 with AFS 3.4a+ if a write is not done before * this routine, it will not add the token. It is not clear what - * is going on here! So we will do the following operation + * is going on here! So we will do the following operation. + * On AIX 5 this kills our parent. So we won't. */ write(2,"",0); /* dummy write */ +#endif status = ktc_SetToken(&aserver, &atoken, &aclient, afssetpag); return(status); diff --git a/src/tviced/NTMakefile b/src/tviced/NTMakefile index 163e237c21..4e40e9b800 100644 --- a/src/tviced/NTMakefile +++ b/src/tviced/NTMakefile @@ -48,7 +48,7 @@ RXOBJS = $(OUT)\xdr_int64.obj \ $(OUT)\xdr_int32.obj VICEDOBJS = $(OUT)\viced.obj $(OUT)\afsfileprocs.obj $(OUT)\host.obj $(OUT)\physio.obj $(OUT)\callback.obj -VICEDRES = $(OUT)\$(VICED)\fileserver.res +TVICEDRES = $(OUT)\fileserver.res TVICEDOBJS = $(OUT)\serialize_state.obj @@ -68,7 +68,7 @@ VOLOBJS = $(OUT)\vnode.obj $(OUT)\volume.obj $(OUT)\vutil.obj $(OUT)\partition.o FSINTOBJS = $(OUT)\afsaux.obj $(OUT)\afscbint.cs.obj $(OUT)\afsint.ss.obj $(OUT)\afsint.xdr.obj -EXEOBJS = $(VICEDOBJS) $(VICEDRES) $(VLSERVEROBJS) $(LWPOBJS) $(LIBACLOBJS) \ +EXEOBJS = $(VICEDOBJS) $(TVICEDRES) $(VLSERVEROBJS) $(LWPOBJS) $(LIBACLOBJS) \ $(UTILOBJS) $(DIROBJS) $(VOLOBJS) $(FSINTOBJS) $(RXOBJS) $(K5OBJS) #$(TVICEDOBJS) noversion: install @@ -81,6 +81,9 @@ $(RXOBJS): $(RX)\$$(@B).c $(VICEDOBJS): $(VICED)\$$(@B).c $(C2OBJ) -I$(VICED) -I$(UTIL) $** +$(TVICEDRES): $(VICED)\fileserver.rc AFS_component_version_number.h + $(RC) /fo $(TVICEDRES) $(VICED)\fileserver.rc + $(TVICEDOBJS): $(TVICED)\$$(@B).c $(C2OBJ) -I$(TVICED) -I$(UTIL) $** @@ -132,3 +135,6 @@ install: $(EXEFILE) mkdir: +clean:: + $(DEL) $(TVICEDRES) + diff --git a/src/tviced/serialize_state.c b/src/tviced/serialize_state.c index 74843a812f..84c29c0a55 100644 --- a/src/tviced/serialize_state.c +++ b/src/tviced/serialize_state.c @@ -21,6 +21,7 @@ RCSID #include #include /* for malloc() */ #include /* ANSI standard location for time stuff */ +#include #ifdef AFS_NT40_ENV #include #include @@ -28,13 +29,6 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/tviced/state_analyzer.c b/src/tviced/state_analyzer.c index f9cb8befbe..1919030c39 100644 --- a/src/tviced/state_analyzer.c +++ b/src/tviced/state_analyzer.c @@ -26,14 +26,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/ubik/Makefile.in b/src/ubik/Makefile.in index 7e207dab52..6ff63078d1 100644 --- a/src/ubik/Makefile.in +++ b/src/ubik/Makefile.in @@ -41,45 +41,45 @@ udebug: udebug.o libubik.a ${CC} ${CFLAGS} -o udebug udebug.o libubik.a $(LIBS) $(LIBCOM_ERR) ubik_int.cs.c: ubik_int.xg - ${RXGEN} -x -C -o $@ ${srcdir}/ubik_int.xg + ${RXGEN} -x -A -C -o $@ ${srcdir}/ubik_int.xg ubik_int.ss.c: ubik_int.xg - ${RXGEN} -x -S -o $@ ${srcdir}/ubik_int.xg + ${RXGEN} -x -A -S -o $@ ${srcdir}/ubik_int.xg ubik_int.xdr.c: ubik_int.xg - ${RXGEN} -x -c -o $@ ${srcdir}/ubik_int.xg + ${RXGEN} -x -A -c -o $@ ${srcdir}/ubik_int.xg ubik_int.h: ubik_int.xg - ${RXGEN} -x -h -o $@ ${srcdir}/ubik_int.xg + ${RXGEN} -x -A -h -o $@ ${srcdir}/ubik_int.xg ubik_int.cs.c: ubik_int.h ubik_int.ss.c: ubik_int.h ubik_int.xdr.c: ubik_int.h Kubik_int.cs.c: ubik_int.xg Kubik_int.h - ${RXGEN} -x -k -C -o Kubik_int.cs.c ${srcdir}/ubik_int.xg + ${RXGEN} -x -k -A -C -o Kubik_int.cs.c ${srcdir}/ubik_int.xg Kubik_int.xdr.c: ubik_int.xg - ${RXGEN} -x -k -c -o Kubik_int.xdr.c ${srcdir}/ubik_int.xg + ${RXGEN} -x -k -A -c -o Kubik_int.xdr.c ${srcdir}/ubik_int.xg Kubik_int.h: ubik_int.xg - ${RXGEN} -x -k -h -o Kubik_int.h ${srcdir}/ubik_int.xg + ${RXGEN} -x -k -A -h -o Kubik_int.h ${srcdir}/ubik_int.xg utst_int.ss.o: utst_int.ss.c utst_int.xdr.c utst_int.cs.o: utst_int.cs.c utst_int.xdr.c utst_int.xdr.o: utst_int.xdr.c utst_int.h utst_int.cs.c: utst_int.xg - ${RXGEN} -C -o $@ ${srcdir}/utst_int.xg + ${RXGEN} -A -C -o $@ ${srcdir}/utst_int.xg utst_int.ss.c: utst_int.xg - ${RXGEN} -S -o $@ ${srcdir}/utst_int.xg + ${RXGEN} -A -S -o $@ ${srcdir}/utst_int.xg utst_int.xdr.c: utst_int.xg - ${RXGEN} -c -o $@ ${srcdir}/utst_int.xg + ${RXGEN} -A -c -o $@ ${srcdir}/utst_int.xg utst_int.h: utst_int.xg - ${RXGEN} -h -o $@ ${srcdir}/utst_int.xg + ${RXGEN} -A -h -o $@ ${srcdir}/utst_int.xg utst_int.cs.c: utst_int.h utst_int.ss.c: utst_int.h diff --git a/src/ubik/beacon.c b/src/ubik/beacon.c index 7313b1a205..c6d2a8dc3f 100644 --- a/src/ubik/beacon.c +++ b/src/ubik/beacon.c @@ -26,13 +26,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -83,6 +77,7 @@ static verifyInterfaceAddress(); */ /* procedure called from debug rpc call to get this module's state for debugging */ +void ubeacon_Debug(aparm) register struct ubik_debug *aparm; { diff --git a/src/ubik/disk.c b/src/ubik/disk.c index ee8a149289..e29f8650ed 100644 --- a/src/ubik/disk.c +++ b/src/ubik/disk.c @@ -21,13 +21,7 @@ RCSID #include #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/ubik/phys.c b/src/ubik/phys.c index caf84aa491..2611056831 100644 --- a/src/ubik/phys.c +++ b/src/ubik/phys.c @@ -26,13 +26,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #define UBIK_INTERNALS 1 #include "ubik.h" diff --git a/src/ubik/recovery.c b/src/ubik/recovery.c index 7c86de91e4..a04a059781 100644 --- a/src/ubik/recovery.c +++ b/src/ubik/recovery.c @@ -24,13 +24,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ubik/remote.c b/src/ubik/remote.c index f7c2b0d964..488571c3b8 100644 --- a/src/ubik/remote.c +++ b/src/ubik/remote.c @@ -20,13 +20,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ubik/ubik.c b/src/ubik/ubik.c index 0cb8bb6acb..7ec8031dae 100644 --- a/src/ubik/ubik.c +++ b/src/ubik/ubik.c @@ -23,13 +23,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ubik/ubikcmd.c b/src/ubik/ubikcmd.c index cf16f1081a..06cfca31ea 100644 --- a/src/ubik/ubikcmd.c +++ b/src/ubik/ubikcmd.c @@ -24,13 +24,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/ubik/udebug.c b/src/ubik/udebug.c index 451d5fc2a8..a7e5ab6cc4 100644 --- a/src/ubik/udebug.c +++ b/src/ubik/udebug.c @@ -15,13 +15,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_NT40_ENV #include #else @@ -90,7 +84,7 @@ PortName(char *aname) } static int -CommandProc(struct cmd_syndesc *as, char *arock) +CommandProc(struct cmd_syndesc *as, void *arock) { char *hostName, *portName, *times; afs_int32 hostAddr; @@ -355,7 +349,7 @@ main(int argc, char **argv) nsa.sa_flags = SA_FULLDUMP; sigaction(SIGSEGV, &nsa, NULL); #endif - ts = cmd_CreateSyntax(NULL, CommandProc, 0, "probe ubik server"); + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "probe ubik server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server machine"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "IP port"); cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print all info"); diff --git a/src/ubik/uinit.c b/src/ubik/uinit.c index d629b0d278..936c7ceebd 100644 --- a/src/ubik/uinit.c +++ b/src/ubik/uinit.c @@ -28,13 +28,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/ubik/utst_client.c b/src/ubik/utst_client.c index 3852bd18b9..9387a3533c 100644 --- a/src/ubik/utst_client.c +++ b/src/ubik/utst_client.c @@ -24,13 +24,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ubik/utst_server.c b/src/ubik/utst_server.c index f832c263d8..eab0cefe93 100644 --- a/src/ubik/utst_server.c +++ b/src/ubik/utst_server.c @@ -25,13 +25,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/ubik/vote.c b/src/ubik/vote.c index 0a1f4f230a..d61ef05e5d 100644 --- a/src/ubik/vote.c +++ b/src/ubik/vote.c @@ -22,13 +22,7 @@ RCSID #endif #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/update/Makefile.in b/src/update/Makefile.in index 273a904e58..b9c27d4a26 100644 --- a/src/update/Makefile.in +++ b/src/update/Makefile.in @@ -44,16 +44,16 @@ utils.o: utils.c update.h global.h client.o server.o: update.h global.h AFS_component_version_number.c update.cs.c: update.xg - ${RXGEN} -u -C -o $@ ${srcdir}/update.xg + ${RXGEN} -A -u -C -o $@ ${srcdir}/update.xg update.ss.c: update.xg - ${RXGEN} -S -o $@ ${srcdir}/update.xg + ${RXGEN} -A -S -o $@ ${srcdir}/update.xg update.xdr.c: update.xg - ${RXGEN} -c -o $@ ${srcdir}/update.xg + ${RXGEN} -A -c -o $@ ${srcdir}/update.xg update.h: update.xg - ${RXGEN} -u -h -o $@ ${srcdir}/update.xg + ${RXGEN} -A -u -h -o $@ ${srcdir}/update.xg update.cs.c: update.h upcate.ss.c: update.h diff --git a/src/update/client.c b/src/update/client.c index 9956db3bf7..46efe5d732 100644 --- a/src/update/client.c +++ b/src/update/client.c @@ -36,13 +36,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/update/server.c b/src/update/server.c index 303c8eb6c8..51be8d9987 100644 --- a/src/update/server.c +++ b/src/update/server.c @@ -31,13 +31,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/update/utils.c b/src/update/utils.c index 13d6b86c01..ae65ab4144 100644 --- a/src/update/utils.c +++ b/src/update/utils.c @@ -22,13 +22,7 @@ RCSID #include #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/usd/usd_file.c b/src/usd/usd_file.c index b9c73cfdda..93279b43fd 100644 --- a/src/usd/usd_file.c +++ b/src/usd/usd_file.c @@ -31,13 +31,7 @@ RCSID #include #endif /* AFS_AIX_ENV */ -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/uss/grammar.y b/src/uss/grammar.y index 697a14d5fa..2c3fede932 100644 --- a/src/uss/grammar.y +++ b/src/uss/grammar.y @@ -11,14 +11,7 @@ #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif extern int line; extern int uss_perr; @@ -134,4 +127,5 @@ yyerror(s) char *s; { fprintf(stderr,"%s. ",s); +return 0; } diff --git a/src/uss/lex.l b/src/uss/lex.l index 1c26d3fa4e..07a477641b 100644 --- a/src/uss/lex.l +++ b/src/uss/lex.l @@ -14,13 +14,7 @@ RCSID("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "y.tab.h" #include "uss_common.h" @@ -76,6 +70,7 @@ EOL [\n] * and replaces the second with a null. */ +void Replace(in, out) char *in, *out; diff --git a/src/uss/uss.c b/src/uss/uss.c index 41c2cfc2dc..35a8cc2134 100644 --- a/src/uss/uss.c +++ b/src/uss/uss.c @@ -25,13 +25,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "uss_common.h" /*Common uss definitions, globals */ #include "uss_procs.h" /*Main uss operations */ @@ -129,10 +123,8 @@ static int DoAdd(); * As advertised. *------------------------------------------------------------------------*/ -static afs_int32 -GetCommon(a_as) - register struct cmd_syndesc *a_as; - +static int +GetCommon(register struct cmd_syndesc *a_as, void *arock) { /*GetCommon */ int code; /*Result of ka_LocalCell */ @@ -376,10 +368,7 @@ DoDelete() *------------------------------------------------------------------------*/ static int -DelUser(a_as, a_rock) - struct cmd_syndesc *a_as; - char *a_rock; - +DelUser(struct cmd_syndesc *a_as, void *a_rock) { /*DelUser */ int code; @@ -473,10 +462,7 @@ DelUser(a_as, a_rock) *------------------------------------------------------------------------*/ static int -PurgeVolumes(a_as, a_rock) - struct cmd_syndesc *a_as; - char *a_rock; - +PurgeVolumes(struct cmd_syndesc *a_as, void *a_rock) { /*PurgeVolumes */ fprintf(stderr, "Sorry, purgevolumes has not yet been implemented.\n"); @@ -508,10 +494,7 @@ PurgeVolumes(a_as, a_rock) *------------------------------------------------------------------------*/ static int -RestoreUser(a_as, a_rock) - struct cmd_syndesc *a_as; - char *a_rock; - +RestoreUser(struct cmd_syndesc *a_as, void *a_rock) { /*RestoreUser */ fprintf(stderr, "Sorry, restoreuser has not yet been implemented.\n"); @@ -1323,10 +1306,7 @@ DoBulkExecLine(a_buf, a_tp) *------------------------------------------------------------------------*/ extern int Pipe; static int -HandleBulk(a_as, a_rock) - register struct cmd_syndesc *a_as; - char *a_rock; - +HandleBulk(register struct cmd_syndesc *a_as, void *a_rock) { /*HandleBulk */ #define USS_BULK_CMD_CHARS 128 @@ -1535,10 +1515,7 @@ HandleBulk(a_as, a_rock) *------------------------------------------------------------------------*/ static int -AddUser(a_as, a_rock) - register struct cmd_syndesc *a_as; - char *a_rock; - +AddUser(register struct cmd_syndesc *a_as, void *a_rock) { /*AddUser */ int i; @@ -1842,7 +1819,7 @@ main(argc, argv) /* ----------------------------- add ----------------------------- */ - cs = cmd_CreateSyntax("add", AddUser, 0, "create a new user account"); + cs = cmd_CreateSyntax("add", AddUser, NULL, "create a new user account"); cmd_AddParm(cs, "-user", CMD_SINGLE, 0, "login name"); cmd_AddParm(cs, "-realname", CMD_SINGLE, CMD_OPTIONAL, "full name in quotes"); @@ -1877,7 +1854,7 @@ main(argc, argv) /* ---------------------------- bulk ----------------------------- */ - cs = cmd_CreateSyntax("bulk", HandleBulk, 0, "bulk input mode"); + cs = cmd_CreateSyntax("bulk", HandleBulk, NULL, "bulk input mode"); cmd_AddParm(cs, "-file", CMD_SINGLE, 0, "bulk input file"); cmd_Seek(cs, AUSS_TEMPLATE); cmd_AddParm(cs, "-template", CMD_SINGLE, CMD_OPTIONAL, @@ -1902,7 +1879,7 @@ main(argc, argv) /* ---------------------------- delete --------------------------- */ - cs = cmd_CreateSyntax("delete", DelUser, 0, "delete a user account"); + cs = cmd_CreateSyntax("delete", DelUser, NULL, "delete a user account"); cmd_AddParm(cs, "-user", CMD_SINGLE, 0, "login name"); cmd_AddParm(cs, "-mountpoint", CMD_SINGLE, CMD_OPTIONAL, "mountpoint for user's volume"); @@ -1936,7 +1913,7 @@ main(argc, argv) #if USS_DONT_HIDE_SOME_FEATURES /* ------------------------- purgevolumes ------------------------ */ - cs = cmd_CreateSyntax("purgevolumes", PurgeVolumes, 0, + cs = cmd_CreateSyntax("purgevolumes", PurgeVolumes, NULL, "destroy a deleted user's volume"); cmd_AddParm(cs, "-volname", CMD_LIST, CMD_OPTIONAL | CMD_EXPANDS, "Name(s) of volume(s) to destroy"); @@ -1959,7 +1936,7 @@ main(argc, argv) #if USS_DONT_HIDE_SOME_FEATURES /* ---------------------------- restore -------------------------- */ - cs = cmd_CreateSyntax("restore", RestoreUser, 0, + cs = cmd_CreateSyntax("restore", RestoreUser, NULL, "restore a deleted user account"); cmd_AddParm(cs, "-user", CMD_SINGLE, 0, "login name to restore"); cmd_AddParm(cs, "-uid", CMD_SINGLE, 0, "user id number"); @@ -2011,4 +1988,5 @@ main(argc, argv) if (doUnlog) { code = uss_fs_UnlogToken(uss_Cell); } + return 0; } /*Main routine */ diff --git a/src/uss/uss_acl.c b/src/uss/uss_acl.c index 00737070b8..7347426959 100644 --- a/src/uss/uss_acl.c +++ b/src/uss/uss_acl.c @@ -30,13 +30,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #undef VIRTUE #undef VICE diff --git a/src/uss/uss_common.c b/src/uss/uss_common.c index 347e4f5114..7cf2a9915b 100644 --- a/src/uss/uss_common.c +++ b/src/uss/uss_common.c @@ -24,14 +24,7 @@ RCSID #include "uss_common.h" /*Interface definitions */ #include /*MAXKTCREALMLEN & MAXKTCNAMELEN */ - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* diff --git a/src/uss/uss_common.h b/src/uss/uss_common.h index 3b2f4ec401..ecfc630f74 100644 --- a/src/uss/uss_common.h +++ b/src/uss/uss_common.h @@ -23,13 +23,7 @@ #include /*I/O stuff */ #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* * --------------------- Exported definitions --------------------- diff --git a/src/uss/uss_fs.c b/src/uss/uss_fs.c index 232e76fcdf..3b8747002a 100644 --- a/src/uss/uss_fs.c +++ b/src/uss/uss_fs.c @@ -30,13 +30,7 @@ RCSID #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "uss_common.h" @@ -495,7 +489,7 @@ uss_fs_MkMountPoint(a_volname, a_cellname, a_rw, a_mountpoint) #endif /* USS_FS_DB */ return (-1); } - + return 0; } /*uss_fs_MkMountPoint */ diff --git a/src/uss/uss_kauth.c b/src/uss/uss_kauth.c index cd82d33c24..d735088283 100644 --- a/src/uss/uss_kauth.c +++ b/src/uss/uss_kauth.c @@ -26,13 +26,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include /*MAXKTCREALMLEN*/ diff --git a/src/uss/uss_procs.c b/src/uss/uss_procs.c index e21cc64392..df9f49a128 100644 --- a/src/uss/uss_procs.c +++ b/src/uss/uss_procs.c @@ -33,13 +33,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include /*MAXKTCREALMLEN*/ #undef USS_PROCS_DB diff --git a/src/uss/uss_vol.c b/src/uss/uss_vol.c index 8ff76cde47..990f5857ca 100644 --- a/src/uss/uss_vol.c +++ b/src/uss/uss_vol.c @@ -30,13 +30,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/util/afsutil.h b/src/util/afsutil.h index 3d074152ab..3a036134d9 100644 --- a/src/util/afsutil.h +++ b/src/util/afsutil.h @@ -40,7 +40,7 @@ extern int serverLogSyslogFacility; extern char *serverLogSyslogTag; #endif extern void vFSLog(const char *format, va_list args); -extern void SetLogThreadNumProgram(int (*func) () ); +extern void SetLogThreadNumProgram(int (*func) (void) ); /*@printflike@*/ extern void FSLog(const char *format, ...); #define ViceLog(level, str) if ((level) <= LogLevel) (FSLog str) diff --git a/src/util/afsutil_prototypes.h b/src/util/afsutil_prototypes.h index 2848da3641..3bcbacec3c 100644 --- a/src/util/afsutil_prototypes.h +++ b/src/util/afsutil_prototypes.h @@ -160,7 +160,7 @@ extern void ResetDebug_Signal(int signo); extern void SetupLogSignals(void); extern int OpenLog(const char *fileName); extern int ReOpenLog(const char *fileName); -extern int LogThreadNum(); +extern int LogThreadNum(void); /* snprintf.c */ diff --git a/src/util/assert.c b/src/util/assert.c index 757d9768f7..f269d19e84 100644 --- a/src/util/assert.c +++ b/src/util/assert.c @@ -14,13 +14,7 @@ #ifdef HAVE_SYS_TIME_H #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif RCSID ("$Header$"); @@ -44,7 +38,7 @@ AssertionFailed(char *file, int line) time_t when; time(&when); - afs_ctime(&when, tdate, 25); + (void)afs_ctime(&when, tdate, 25); fprintf(stderr, "%s: Assertion failed! file %s, line %d.\n", tdate, file, line); fflush(stderr); diff --git a/src/util/casestrcpy.c b/src/util/casestrcpy.c index 4645d1f3b1..8e8e0ce52d 100644 --- a/src/util/casestrcpy.c +++ b/src/util/casestrcpy.c @@ -13,13 +13,7 @@ RCSID ("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/util/fileutil.c b/src/util/fileutil.c index 8ff9449ac3..e7e0c2d5f9 100644 --- a/src/util/fileutil.c +++ b/src/util/fileutil.c @@ -20,6 +20,7 @@ RCSID #include #include #include +#include #ifdef AFS_NT40_ENV #include @@ -30,13 +31,6 @@ RCSID #ifdef HAVE_UNISTD_H #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/util/get_krbrlm.c b/src/util/get_krbrlm.c index 6e1efb7d03..21950b96a6 100644 --- a/src/util/get_krbrlm.c +++ b/src/util/get_krbrlm.c @@ -10,8 +10,8 @@ RCSID ("$Header$"); #include -#include #include +#include #include "afsutil.h" /* diff --git a/src/util/hostparse.c b/src/util/hostparse.c index 2de6080982..d48dc6de6e 100644 --- a/src/util/hostparse.c +++ b/src/util/hostparse.c @@ -34,13 +34,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "afsutil.h" #endif /* UKERNEL */ diff --git a/src/util/kreltime.c b/src/util/kreltime.c index 1ed7e730d6..e89775a7ba 100644 --- a/src/util/kreltime.c +++ b/src/util/kreltime.c @@ -19,13 +19,7 @@ RCSID #include "ktime.h" #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "afsutil.h" diff --git a/src/util/ktime.c b/src/util/ktime.c index cf082f0e09..81256465f3 100644 --- a/src/util/ktime.c +++ b/src/util/ktime.c @@ -20,13 +20,7 @@ RCSID #ifdef AFS_NT40_ENV #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "afsutil.h" diff --git a/src/util/netutils.c b/src/util/netutils.c index 4ff10a0272..63d2995d4d 100644 --- a/src/util/netutils.c +++ b/src/util/netutils.c @@ -24,13 +24,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #ifdef KERNEL #include "afs/sysincludes.h" @@ -57,6 +51,9 @@ RCSID #define INADDR_LOOPBACK (afs_uint32)0x7f000001 #endif +int ParseNetInfoFile_int(afs_uint32 *, afs_uint32 *, afs_uint32 *, + int, char reason[], const char *, + int); /* * The line parameter is a pointer to a buffer containing a string of * bytes of the form diff --git a/src/util/serverLog.c b/src/util/serverLog.c index e54951757f..2b3b8d3eca 100644 --- a/src/util/serverLog.c +++ b/src/util/serverLog.c @@ -37,13 +37,7 @@ RCSID #include /* signal(), kill(), wait(), etc. */ #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "afsutil.h" #include "fileutil.h" @@ -75,7 +69,7 @@ dummyThreadNum(void) { return -1; } -static int (*threadNumProgram) () = dummyThreadNum; +static int (*threadNumProgram) (void) = dummyThreadNum; static int serverLogFD = -1; @@ -93,7 +87,7 @@ int printLocks = 0; static char ourName[MAXPATHLEN]; void -SetLogThreadNumProgram(int (*func) () ) +SetLogThreadNumProgram(int (*func) (void) ) { threadNumProgram = func; } @@ -339,9 +333,6 @@ int ReOpenLog(const char *fileName) { int isfifo = 0; -#if !defined(AFS_PTHREAD_ENV) - int tempfd; -#endif #if !defined(AFS_NT40_ENV) struct stat statbuf; #endif diff --git a/src/util/snprintf.c b/src/util/snprintf.c index 78332e4db1..5b06be9efd 100644 --- a/src/util/snprintf.c +++ b/src/util/snprintf.c @@ -10,6 +10,7 @@ RCSID #include #include #include +#include #ifndef AFS_NT40_ENV #include #include @@ -19,13 +20,6 @@ RCSID #if defined(AFS_AIX32_ENV) || defined(AFS_SUN_ENV) || defined(AFS_XBSD_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_SGI65_ENV) #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #define MAXPREC 100 diff --git a/src/util/softsig.c b/src/util/softsig.c index ac7ae1cc66..98c04cf492 100644 --- a/src/util/softsig.c +++ b/src/util/softsig.c @@ -15,6 +15,7 @@ #define _POSIX_PTHREAD_SEMANTICS #include #include +#include #include #ifndef AFS_NT40_ENV #include diff --git a/src/util/sys.c b/src/util/sys.c index 1930fba540..40f18d8689 100644 --- a/src/util/sys.c +++ b/src/util/sys.c @@ -18,7 +18,7 @@ RCSID #include "AFS_component_version_number.c" int -main() +main(int argc, char **argv) { printf("%s\n", SYS_NAME); return 0; diff --git a/src/util/uuid.c b/src/util/uuid.c index 593a79a37c..3972aaab33 100644 --- a/src/util/uuid.c +++ b/src/util/uuid.c @@ -60,6 +60,7 @@ RCSID #else /* KERNEL */ #include #include +#include #ifdef AFS_NT40_ENV #include #include @@ -73,13 +74,6 @@ RCSID #include #endif /* ITIMER_REAL */ #include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_UNISTD_H #include #endif diff --git a/src/util/volparse.c b/src/util/volparse.c index 1ae83d1671..a358da784d 100644 --- a/src/util/volparse.c +++ b/src/util/volparse.c @@ -13,13 +13,7 @@ RCSID ("$Header$"); -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef HAVE_STDLIB_H #include #endif diff --git a/src/venus/Makefile.in b/src/venus/Makefile.in index 81f6928e04..a8a4768e4d 100644 --- a/src/venus/Makefile.in +++ b/src/venus/Makefile.in @@ -55,22 +55,22 @@ cacheout: cacheout.o cacheout.o: cacheout.c ${DEST}/bin/fs ${DEST}/root.server/usr/afs/bin/fs: fs - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/livesys: livesys - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/up: up - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/etc/fstrace: fstrace - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/cmdebug: cmdebug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/bin/dedebug: dedebug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ up.o: up.c AFS_component_version_number.c @@ -287,29 +287,29 @@ ${DEST}/etc/kdump: kdump-build ln -fs kdump.IP20 ${DEST}/etc/kdump.IP22; \ ln -fs kdump.IP20 ${DEST}/etc/kdump.IP32; \ for f in kdump.IP??; \ - do ${INSTALL} -s $$f ${DEST}/etc/$$f || exit $$? ; \ + do ${INSTALL} $$f ${DEST}/etc/$$f || exit $$? ; \ done ;; \ sun*_5[789] | sun*_510 ) \ ${INSTALLex} -f ${srcdir}/kdump.sh.solaris7 ${DEST}/etc/kdump; \ - ${INSTALL} -s -f ${srcdir}/kdump ${DEST}/etc/kdump32;; \ + ${INSTALL} -f ${srcdir}/kdump ${DEST}/etc/kdump32;; \ *alpha_linux* ) \ ${INSTALLex} -f ${srcdir}/kdump.sh.linux ${DEST}/etc/kdump; \ - ${INSTALL} -s kdump-alpha_linux-${LINUX_VERSION} $@ ;; \ + ${INSTALL} kdump-alpha_linux-${LINUX_VERSION} $@ ;; \ *linux* ) \ ${INSTALLex} -f ${srcdir}/kdump.sh.linux ${DEST}/etc/kdump; \ - ${INSTALL} -s kdump-linux-${LINUX_VERSION} $@-${LINUX_VERSION} ;; \ + ${INSTALL} kdump-linux-${LINUX_VERSION} $@-${LINUX_VERSION} ;; \ hp_ux11* ) \ ${INSTALLex} -f ${srcdir}/kdump.sh.hp_ux11 ${DEST}/etc/kdump; \ - ${INSTALL} -s -f $? $@;; \ + ${INSTALL} -f $? $@;; \ *nbsd*) \ ;; \ *) \ - ${INSTALL} -s $? $@ ;; \ + ${INSTALL} $? $@ ;; \ esac ${DEST}/etc/kdump64: kdump-build if [ -f kdump64 ]; then \ - ${INSTALL} -s kdump64 $@; \ + ${INSTALL} kdump64 $@; \ fi @@ -339,25 +339,25 @@ test: include ../config/Makefile.version ${DESTDIR}${bindir}/fs: fs - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${bindir}/livesys: livesys - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvbindir}/fs: fs - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${bindir}/up: up - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${sbindir}/fstrace: fstrace - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${bindir}/cmdebug: cmdebug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${bindir}/dedebug: dedebug - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${sbindir}/kdump: kdump-build -set -x; \ @@ -368,24 +368,24 @@ ${DESTDIR}${sbindir}/kdump: kdump-build ln -fs kdump.IP20 ${DESTDIR}${sbindir}/kdump.IP22; \ ln -fs kdump.IP20 ${DESTDIR}${sbindir}/kdump.IP32; \ for f in kdump.IP??; \ - do ${INSTALL} -s $$f ${DESTDIR}${sbindir}/$$f || exit $$? ; \ + do ${INSTALL} $$f ${DESTDIR}${sbindir}/$$f || exit $$? ; \ done ;; \ sun*_5[789] | sun*_510 ) \ ${INSTALLex} -f kdump.sh.solaris7 ${DESTDIR}${sbindir}/kdump32; \ - ${INSTALL} -s -f $? $@;; \ + ${INSTALL} -f $? $@;; \ *linux* ) \ ${INSTALLex} -f kdump.sh.linux ${DESTDIR}${sbindir}/kdump; \ - ${INSTALL} -s $? $@ ;; \ + ${INSTALL} $? $@ ;; \ hp_ux11* ) \ ${INSTALLex} -f kdump.sh.hp_ux11 ${DESTDIR}${sbindir}/kdump; \ - ${INSTALL} -s -f $? $@;; \ + ${INSTALL} -f $? $@;; \ *) \ - ${INSTALL} -s $? $@ ;; \ + ${INSTALL} $? $@ ;; \ esac ${DESTDIR}${sbindir}/kdump64: kdump-build if [ -f kdump64 ]; then \ - ${INSTALL} -s kdump64 $@; \ + ${INSTALL} kdump64 $@; \ fi dest: \ diff --git a/src/venus/cacheout.c b/src/venus/cacheout.c index 705f2ce19d..58a33e6bdd 100644 --- a/src/venus/cacheout.c +++ b/src/venus/cacheout.c @@ -63,9 +63,8 @@ struct rx_securityClass *junk; extern int VL_GetAddrs(); -afs_int32 -InvalidateCache(as) - struct cmd_syndesc *as; +static int +InvalidateCache(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; struct cmd_item *u; @@ -212,10 +211,10 @@ ListServers() return code; } -afs_int32 -GetServerList() +static int +GetServerList(struct cmd_syndesc *as, void *arock) { - afs_int32 code; + int code; int i; code = ListServers(); @@ -240,10 +239,8 @@ User enters lists of: Command is executed in user's cell. */ -static -MyBeforeProc(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +MyBeforeProc(struct cmd_syndesc *as, void *arock) { register char *tcell = NULL; char confdir[200]; @@ -308,13 +305,13 @@ main(argc, argv) cmd_SetBeforeProc(MyBeforeProc, NULL); ts = cmd_CreateSyntax("initcmd" /*"invalidatecache" */ , InvalidateCache, - 0, "invalidate server ACL cache"); + NULL, "invalidate server ACL cache"); cmd_AddParm(ts, "-id", CMD_LIST, CMD_OPTIONAL, "user identifier"); cmd_AddParm(ts, "-ip", CMD_LIST, CMD_OPTIONAL, "IP address"); cmd_CreateAlias(ts, "ic"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); - ts = cmd_CreateSyntax("listservers", GetServerList, 0, + ts = cmd_CreateSyntax("listservers", GetServerList, NULL, "list servers in the cell"); cmd_CreateAlias(ts, "ls"); diff --git a/src/venus/cmdebug.c b/src/venus/cmdebug.c index 4ba22a6384..70e1b96ad5 100644 --- a/src/venus/cmdebug.c +++ b/src/venus/cmdebug.c @@ -26,13 +26,7 @@ RCSID #include #endif #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_AIX32_ENV #include #endif @@ -46,6 +40,8 @@ RCSID extern struct hostent *hostutil_GetHostByName(); +static int print_ctime = 0; + static int PrintCacheConfig(struct rx_connection *aconn) { @@ -310,8 +306,13 @@ PrintCacheEntries32(struct rx_connection *aconn, int aint32) } printf(" %12d bytes DV %12d refcnt %5d\n", centry.Length, centry.DataVersion, centry.refCount); - printf(" callback %08x\texpires %u\n", centry.callback, - centry.cbExpires); + if (print_ctime) { + time_t t = centry.cbExpires; + printf(" callback %08x\texpires %s\n", centry.callback, + ctime(&t)); + } else + printf(" callback %08x\texpires %u\n", centry.callback, + centry.cbExpires); printf(" %d opens\t%d writers\n", centry.opens, centry.writers); /* now display states */ @@ -412,8 +413,13 @@ PrintCacheEntries64(struct rx_connection *aconn, int aint32) printf(" %12d bytes DV %12d refcnt %5d\n", centry.Length, centry.DataVersion, centry.refCount); #endif - printf(" callback %08x\texpires %u\n", centry.callback, - centry.cbExpires); + if (print_ctime) { + time_t t = centry.cbExpires; + printf(" callback %08x\texpires %s\n", centry.callback, + ctime(&t)); + } else + printf(" callback %08x\texpires %u\n", centry.callback, + centry.cbExpires); printf(" %d opens\t%d writers\n", centry.opens, centry.writers); /* now display states */ @@ -468,7 +474,7 @@ PrintCacheEntries(struct rx_connection *aconn, int aint32) } int -CommandProc(struct cmd_syndesc *as, char *arock) +CommandProc(struct cmd_syndesc *as, void *arock) { struct rx_connection *conn; register char *hostName; @@ -506,6 +512,10 @@ CommandProc(struct cmd_syndesc *as, char *arock) PrintCacheConfig(conn); return 0; } + + if (as->parms[7].items) + print_ctime = 1; + if (as->parms[2].items) /* -long */ int32p = 1; @@ -559,7 +569,7 @@ main(int argc, char **argv) initialize_rx_error_table(); rx_Init(0); - ts = cmd_CreateSyntax(NULL, CommandProc, 0, "probe unik server"); + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "probe unik server"); cmd_AddParm(ts, "-servers", CMD_SINGLE, CMD_REQUIRED, "server machine"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "IP port"); cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print all info"); @@ -571,6 +581,8 @@ main(int argc, char **argv) "print only host interfaces"); cmd_AddParm(ts, "-cache", CMD_FLAG, CMD_OPTIONAL, "print only cache configuration"); + cmd_AddParm(ts, "-ctime", CMD_FLAG, CMD_OPTIONAL, + "print human readable expiration time"); cmd_Dispatch(argc, argv); exit(0); diff --git a/src/venus/dedebug.c b/src/venus/dedebug.c index 14ff0246d4..36e669eee0 100644 --- a/src/venus/dedebug.c +++ b/src/venus/dedebug.c @@ -55,8 +55,9 @@ static PrintCacheEntries(struct rx_connection *aconn, int aint32) return 0; } -static CommandProc(as) -struct cmd_syndesc *as; { +static int +CommandProc(struct cmd_syndesc *as, void *arock) +{ struct rx_connection *conn; register char *hostName; register struct hostent *thp; @@ -111,7 +112,7 @@ char **argv; { #endif rx_Init(0); - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "probe unik server"); + ts = cmd_CreateSyntax(NULL, CommandProc, NULL, "probe unik server"); cmd_AddParm(ts, "-servers", CMD_SINGLE, CMD_REQUIRED, "server machine"); cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "IP port"); cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print all info"); diff --git a/src/venus/fs.c b/src/venus/fs.c index 1bd0bf4cc3..924b254164 100644 --- a/src/venus/fs.c +++ b/src/venus/fs.c @@ -30,13 +30,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #undef VIRTUE #undef VICE @@ -69,20 +63,19 @@ static char tspace[1024]; static struct ubik_client *uclient; static int GetClientAddrsCmd(), SetClientAddrsCmd(), FlushMountCmd(); -static int RxStatProcCmd(), RxStatPeerCmd(), GetFidCmd(), NewUuidCmd(); +static int RxStatProcCmd(), RxStatPeerCmd(), GetFidCmd(), UuidCmd(); extern char *hostutil_GetNameByINet(); extern struct hostent *hostutil_GetHostByName(); -extern struct cmd_syndesc *cmd_CreateSyntax(); static char pn[] = "fs"; static int rxInitDone = 0; static void ZapList(); static int PruneList(); static CleanAcl(); -static SetVolCmd(); +static int SetVolCmd(struct cmd_syndesc *as, void *arock); static GetCellName(); static VLDBInit(); static void Die(); @@ -286,6 +279,7 @@ PRights(afs_int32 arights, int dfs) if (arights & DFS_USR7) printf("H"); } + return 0; } /* this function returns TRUE (1) if the file is in AFS, otherwise false (0) */ @@ -731,7 +725,7 @@ AclToString(struct Acl *acl) } static int -SetACLCmd(struct cmd_syndesc *as, char *arock) +SetACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -865,7 +859,7 @@ SetACLCmd(struct cmd_syndesc *as, char *arock) static int -CopyACLCmd(struct cmd_syndesc *as, char *arock) +CopyACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1045,7 +1039,7 @@ CleanAcl(struct Acl *aa, char *fname) /* clean up an acl to not have bogus entries */ static int -CleanACLCmd(struct cmd_syndesc *as, char *arock) +CleanACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct Acl *ta = 0; @@ -1132,7 +1126,7 @@ CleanACLCmd(struct cmd_syndesc *as, char *arock) } static int -ListACLCmd(struct cmd_syndesc *as, char *arock) +ListACLCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct Acl *ta; @@ -1196,7 +1190,7 @@ ListACLCmd(struct cmd_syndesc *as, char *arock) } static int -GetCallerAccess(struct cmd_syndesc *as, char *arock) +GetCallerAccess(struct cmd_syndesc *as, void *arock) { struct cmd_item *ti; int error = 0; @@ -1223,7 +1217,7 @@ GetCallerAccess(struct cmd_syndesc *as, char *arock) } static int -FlushVolumeCmd(struct cmd_syndesc *as, char *arock) +FlushVolumeCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1244,26 +1238,45 @@ FlushVolumeCmd(struct cmd_syndesc *as, char *arock) return error; } +/* + * The Windows version of UuidCmd displays the UUID. + * When the UNIX version is updated to do the same + * be sure to replace the CMD_REQUIRED flag with + * CMD_OPTIONAL in the cmd_AddParam(-generate) call + */ static int -NewUuidCmd(struct cmd_syndesc *as, char *arock) +UuidCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; blob.in_size = 0; blob.out_size = 0; - code = pioctl(0, VIOC_NEWUUID, &blob, 1); - if (code) { - Die(errno, 0); - return 1; - } + + if (as->parms[0].items) { + if (geteuid()) { + fprintf (stderr, "Permission denied: requires root access.\n"); + return EACCES; + } - printf("New uuid generated.\n"); + /* generate new UUID */ + code = pioctl(0, VIOC_NEWUUID, &blob, 1); + + if (code) { + Die(errno, 0); + return 1; + } + + printf("New uuid generated.\n"); + } else { + /* This will never execute */ + printf("Please add the '-generate' option to generate a new UUID.\n"); + } return 0; } static int -FlushCmd(struct cmd_syndesc *as, char *arock) +FlushCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1290,17 +1303,17 @@ FlushCmd(struct cmd_syndesc *as, char *arock) /* all this command does is repackage its args and call SetVolCmd */ static int -SetQuotaCmd(struct cmd_syndesc *as, char *arock) +SetQuotaCmd(struct cmd_syndesc *as, void *arock) { struct cmd_syndesc ts; /* copy useful stuff from our command slot; we may later have to reorder */ memcpy(&ts, as, sizeof(ts)); /* copy whole thing */ - return SetVolCmd(&ts); + return SetVolCmd(&ts, arock); } static int -SetVolCmd(struct cmd_syndesc *as, char *arock) +SetVolCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1364,7 +1377,7 @@ struct VenusFid { }; static int -ExamineCmd(struct cmd_syndesc *as, char *arock) +ExamineCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1405,7 +1418,7 @@ ExamineCmd(struct cmd_syndesc *as, char *arock) } static int -ListQuotaCmd(struct cmd_syndesc *as, char *arock) +ListQuotaCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1436,7 +1449,7 @@ ListQuotaCmd(struct cmd_syndesc *as, char *arock) } static int -WhereIsCmd(struct cmd_syndesc *as, char *arock) +WhereIsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1475,7 +1488,7 @@ WhereIsCmd(struct cmd_syndesc *as, char *arock) static int -DiskFreeCmd(struct cmd_syndesc *as, char *arock) +DiskFreeCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1506,7 +1519,7 @@ DiskFreeCmd(struct cmd_syndesc *as, char *arock) } static int -QuotaCmd(struct cmd_syndesc *as, char *arock) +QuotaCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1539,7 +1552,7 @@ QuotaCmd(struct cmd_syndesc *as, char *arock) } static int -ListMountCmd(struct cmd_syndesc *as, char *arock) +ListMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1659,8 +1672,8 @@ ListMountCmd(struct cmd_syndesc *as, char *arock) return error; } -static -MakeMountCmd(struct cmd_syndesc *as, char *arock) +static int +MakeMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; char *cellName, *volName, *tmpName; @@ -1768,7 +1781,7 @@ defect #3069 * tp: Set to point to the actual name of the mount point to nuke. */ static int -RemoveMountCmd(struct cmd_syndesc *as, char *arock) +RemoveMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; struct ViceIoctl blob; @@ -1820,7 +1833,7 @@ RemoveMountCmd(struct cmd_syndesc *as, char *arock) */ static int -CheckServersCmd(struct cmd_syndesc *as, char *arock) +CheckServersCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1919,7 +1932,7 @@ CheckServersCmd(struct cmd_syndesc *as, char *arock) } static int -MessagesCmd(struct cmd_syndesc *as, char *arock) +MessagesCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; struct ViceIoctl blob; @@ -1965,7 +1978,7 @@ MessagesCmd(struct cmd_syndesc *as, char *arock) } static int -CheckVolumesCmd(struct cmd_syndesc *as, char *arock) +CheckVolumesCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -1983,7 +1996,7 @@ CheckVolumesCmd(struct cmd_syndesc *as, char *arock) } static int -SetCacheSizeCmd(struct cmd_syndesc *as, char *arock) +SetCacheSizeCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2022,7 +2035,7 @@ SetCacheSizeCmd(struct cmd_syndesc *as, char *arock) #define MAXGCSIZE 16 static int -GetCacheParmsCmd(struct cmd_syndesc *as, char *arock) +GetCacheParmsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code, filesUsed; struct ViceIoctl blob; @@ -2096,7 +2109,7 @@ GetCacheParmsCmd(struct cmd_syndesc *as, char *arock) } static int -ListCellsCmd(struct cmd_syndesc *as, char *arock) +ListCellsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 i, j; @@ -2147,7 +2160,7 @@ ListCellsCmd(struct cmd_syndesc *as, char *arock) } static int -ListAliasesCmd(struct cmd_syndesc *as, char *arock) +ListAliasesCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code, i; char *tp, *aliasName, *realName; @@ -2177,7 +2190,7 @@ ListAliasesCmd(struct cmd_syndesc *as, char *arock) } static int -CallBackRxConnCmd(struct cmd_syndesc *as, char *arock) +CallBackRxConnCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2216,7 +2229,7 @@ CallBackRxConnCmd(struct cmd_syndesc *as, char *arock) } static int -NukeNFSCredsCmd(struct cmd_syndesc *as, char *arock) +NukeNFSCredsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2247,7 +2260,7 @@ NukeNFSCredsCmd(struct cmd_syndesc *as, char *arock) } static int -NewCellCmd(struct cmd_syndesc *as, char *arock) +NewCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code, linkedstate = 0, size = 0, *lp; struct ViceIoctl blob; @@ -2359,7 +2372,7 @@ NewCellCmd(struct cmd_syndesc *as, char *arock) } static int -NewAliasCmd(struct cmd_syndesc *as, char *arock) +NewAliasCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2394,7 +2407,7 @@ NewAliasCmd(struct cmd_syndesc *as, char *arock) } static int -WhichCellCmd(struct cmd_syndesc *as, char *arock) +WhichCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -2419,7 +2432,7 @@ WhichCellCmd(struct cmd_syndesc *as, char *arock) } static int -WSCellCmd(struct cmd_syndesc *as, char *arock) +WSCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2449,7 +2462,7 @@ static PrimaryCellCmd(as) */ static int -MonitorCmd(struct cmd_syndesc *as, char *arock) +MonitorCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2510,7 +2523,7 @@ MonitorCmd(struct cmd_syndesc *as, char *arock) } static int -SysNameCmd(struct cmd_syndesc *as, char *arock) +SysNameCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2564,7 +2577,7 @@ SysNameCmd(struct cmd_syndesc *as, char *arock) static char *exported_types[] = { "null", "nfs", "" }; static int -ExportAfsCmd(struct cmd_syndesc *as, char *arock) +ExportAfsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2691,7 +2704,7 @@ ExportAfsCmd(struct cmd_syndesc *as, char *arock) static int -GetCellCmd(struct cmd_syndesc *as, char *arock) +GetCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2742,7 +2755,7 @@ GetCellCmd(struct cmd_syndesc *as, char *arock) } static int -SetCellCmd(struct cmd_syndesc *as, char *arock) +SetCellCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -2926,7 +2939,7 @@ addServer(char *name, afs_int32 rank) static int -SetPrefCmd(struct cmd_syndesc *as, char *arock) +SetPrefCmd(struct cmd_syndesc *as, void *arock) { FILE *infd; afs_int32 code; @@ -3032,7 +3045,7 @@ SetPrefCmd(struct cmd_syndesc *as, char *arock) static int -GetPrefCmd(struct cmd_syndesc *as, char *arock) +GetPrefCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -3102,7 +3115,7 @@ GetPrefCmd(struct cmd_syndesc *as, char *arock) } static int -StoreBehindCmd(struct cmd_syndesc *as, char *arock) +StoreBehindCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; struct ViceIoctl blob; @@ -3202,8 +3215,8 @@ StoreBehindCmd(struct cmd_syndesc *as, char *arock) } -static afs_int32 -SetCryptCmd(struct cmd_syndesc *as, char *arock) +static int +SetCryptCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0, flag; struct ViceIoctl blob; @@ -3229,8 +3242,8 @@ SetCryptCmd(struct cmd_syndesc *as, char *arock) } -static afs_int32 -GetCryptCmd(struct cmd_syndesc *as, char *arock) +static int +GetCryptCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0, flag; struct ViceIoctl blob; @@ -3267,8 +3280,8 @@ static char *modenames[] = { NULL }; -static afs_int32 -DisconCmd(struct cmd_syndesc *as, char *arock) +static int +DisconCmd(struct cmd_syndesc *as, void *arock) { struct cmd_item *ti; char *modename; @@ -3336,17 +3349,17 @@ main(int argc, char **argv) #endif /* try to find volume location information */ - ts = cmd_CreateSyntax("getclientaddrs", GetClientAddrsCmd, 0, + ts = cmd_CreateSyntax("getclientaddrs", GetClientAddrsCmd, NULL, "get client network interface addresses"); cmd_CreateAlias(ts, "gc"); - ts = cmd_CreateSyntax("setclientaddrs", SetClientAddrsCmd, 0, + ts = cmd_CreateSyntax("setclientaddrs", SetClientAddrsCmd, NULL, "set client network interface addresses"); cmd_AddParm(ts, "-address", CMD_LIST, CMD_OPTIONAL | CMD_EXPANDS, "client network interfaces"); cmd_CreateAlias(ts, "sc"); - ts = cmd_CreateSyntax("setserverprefs", SetPrefCmd, 0, + ts = cmd_CreateSyntax("setserverprefs", SetPrefCmd, NULL, "set server ranks"); cmd_AddParm(ts, "-servers", CMD_LIST, CMD_OPTIONAL | CMD_EXPANDS, "fileserver names and ranks"); @@ -3357,7 +3370,7 @@ main(int argc, char **argv) cmd_AddParm(ts, "-stdin", CMD_FLAG, CMD_OPTIONAL, "input from stdin"); cmd_CreateAlias(ts, "sp"); - ts = cmd_CreateSyntax("getserverprefs", GetPrefCmd, 0, + ts = cmd_CreateSyntax("getserverprefs", GetPrefCmd, NULL, "get server ranks"); cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "output to named file"); @@ -3366,7 +3379,7 @@ main(int argc, char **argv) /* cmd_AddParm(ts, "-cell", CMD_FLAG, CMD_OPTIONAL, "cellname"); */ cmd_CreateAlias(ts, "gp"); - ts = cmd_CreateSyntax("setacl", SetACLCmd, 0, "set access control list"); + ts = cmd_CreateSyntax("setacl", SetACLCmd, NULL, "set access control list"); cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); cmd_AddParm(ts, "-acl", CMD_LIST, 0, "access list entries"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "clear access list"); @@ -3379,7 +3392,7 @@ main(int argc, char **argv) "initial file acl (DFS only)"); cmd_CreateAlias(ts, "sa"); - ts = cmd_CreateSyntax("listacl", ListACLCmd, 0, + ts = cmd_CreateSyntax("listacl", ListACLCmd, NULL, "list access control list"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); parm_listacl_id = ts->nParms; @@ -3387,16 +3400,16 @@ main(int argc, char **argv) cmd_AddParm(ts, "-if", CMD_FLAG, CMD_OPTIONAL, "initial file acl"); cmd_CreateAlias(ts, "la"); - ts = cmd_CreateSyntax("getcalleraccess", GetCallerAccess, 0, + ts = cmd_CreateSyntax("getcalleraccess", GetCallerAccess, NULL, "list callers access"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "gca"); - ts = cmd_CreateSyntax("cleanacl", CleanACLCmd, 0, + ts = cmd_CreateSyntax("cleanacl", CleanACLCmd, NULL, "clean up access control list"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("copyacl", CopyACLCmd, 0, + ts = cmd_CreateSyntax("copyacl", CopyACLCmd, NULL, "copy access control list"); cmd_AddParm(ts, "-fromdir", CMD_SINGLE, 0, "source directory (or DFS file)"); @@ -3410,13 +3423,13 @@ main(int argc, char **argv) cmd_CreateAlias(ts, "ca"); - ts = cmd_CreateSyntax("flush", FlushCmd, 0, "flush file from cache"); + ts = cmd_CreateSyntax("flush", FlushCmd, NULL, "flush file from cache"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("flushmount", FlushMountCmd, 0, + ts = cmd_CreateSyntax("flushmount", FlushMountCmd, NULL, "flush mount symlink from cache"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("setvol", SetVolCmd, 0, "set volume status"); + ts = cmd_CreateSyntax("setvol", SetVolCmd, NULL, "set volume status"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_AddParm(ts, "-max", CMD_SINGLE, CMD_OPTIONAL, "disk space quota in 1K units"); @@ -3429,32 +3442,32 @@ main(int argc, char **argv) "offline message"); cmd_CreateAlias(ts, "sv"); - ts = cmd_CreateSyntax("messages", MessagesCmd, 0, + ts = cmd_CreateSyntax("messages", MessagesCmd, NULL, "control Cache Manager messages"); cmd_AddParm(ts, "-show", CMD_SINGLE, CMD_OPTIONAL, "[user|console|all|none]"); - ts = cmd_CreateSyntax("examine", ExamineCmd, 0, "display file/volume status"); + ts = cmd_CreateSyntax("examine", ExamineCmd, NULL, "display file/volume status"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "lv"); cmd_CreateAlias(ts, "listvol"); - ts = cmd_CreateSyntax("listquota", ListQuotaCmd, 0, "list volume quota"); + ts = cmd_CreateSyntax("listquota", ListQuotaCmd, NULL, "list volume quota"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "lq"); - ts = cmd_CreateSyntax("diskfree", DiskFreeCmd, 0, + ts = cmd_CreateSyntax("diskfree", DiskFreeCmd, NULL, "show server disk space usage"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); cmd_CreateAlias(ts, "df"); - ts = cmd_CreateSyntax("quota", QuotaCmd, 0, "show volume quota usage"); + ts = cmd_CreateSyntax("quota", QuotaCmd, NULL, "show volume quota usage"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("lsmount", ListMountCmd, 0, "list mount point"); + ts = cmd_CreateSyntax("lsmount", ListMountCmd, NULL, "list mount point"); cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - ts = cmd_CreateSyntax("mkmount", MakeMountCmd, 0, "make mount point"); + ts = cmd_CreateSyntax("mkmount", MakeMountCmd, NULL, "make mount point"); cmd_AddParm(ts, "-dir", CMD_SINGLE, 0, "directory"); cmd_AddParm(ts, "-vol", CMD_SINGLE, 0, "volume name"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); @@ -3470,10 +3483,10 @@ defect 3069 */ - ts = cmd_CreateSyntax("rmmount", RemoveMountCmd, 0, "remove mount point"); + ts = cmd_CreateSyntax("rmmount", RemoveMountCmd, NULL, "remove mount point"); cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - ts = cmd_CreateSyntax("checkservers", CheckServersCmd, 0, + ts = cmd_CreateSyntax("checkservers", CheckServersCmd, NULL, "check local cell's servers"); cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell to check"); cmd_AddParm(ts, "-all", CMD_FLAG, CMD_OPTIONAL, "check all cells"); @@ -3482,12 +3495,12 @@ defect 3069 cmd_AddParm(ts, "-interval", CMD_SINGLE, CMD_OPTIONAL, "seconds between probes"); - ts = cmd_CreateSyntax("checkvolumes", CheckVolumesCmd, 0, + ts = cmd_CreateSyntax("checkvolumes", CheckVolumesCmd, NULL, "check volumeID/name mappings"); cmd_CreateAlias(ts, "checkbackups"); - ts = cmd_CreateSyntax("setcachesize", SetCacheSizeCmd, 0, + ts = cmd_CreateSyntax("setcachesize", SetCacheSizeCmd, NULL, "set cache size"); cmd_AddParm(ts, "-blocks", CMD_SINGLE, CMD_OPTIONAL, "size in 1K byte blocks (0 => reset)"); @@ -3496,19 +3509,19 @@ defect 3069 cmd_AddParm(ts, "-reset", CMD_FLAG, CMD_OPTIONAL, "reset size back to boot value"); - ts = cmd_CreateSyntax("getcacheparms", GetCacheParmsCmd, 0, + ts = cmd_CreateSyntax("getcacheparms", GetCacheParmsCmd, NULL, "get cache usage info"); cmd_AddParm(ts, "-files", CMD_FLAG, CMD_OPTIONAL, "Show cach files used as well"); cmd_AddParm(ts, "-excessive", CMD_FLAG, CMD_OPTIONAL, "excessively verbose cache stats"); - ts = cmd_CreateSyntax("listcells", ListCellsCmd, 0, + ts = cmd_CreateSyntax("listcells", ListCellsCmd, NULL, "list configured cells"); cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only"); - ts = cmd_CreateSyntax("listaliases", ListAliasesCmd, 0, + ts = cmd_CreateSyntax("listaliases", ListAliasesCmd, NULL, "list configured cell aliases"); - ts = cmd_CreateSyntax("setquota", SetQuotaCmd, 0, "set volume quota"); + ts = cmd_CreateSyntax("setquota", SetQuotaCmd, NULL, "set volume quota"); cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_OPTIONAL, "dir/file path"); cmd_AddParm(ts, "-max", CMD_SINGLE, 0, "max quota in kbytes"); #ifdef notdef @@ -3516,13 +3529,13 @@ defect 3069 #endif cmd_CreateAlias(ts, "sq"); - ts = cmd_CreateSyntax("newcell", NewCellCmd, 0, "configure new cell"); + ts = cmd_CreateSyntax("newcell", NewCellCmd, NULL, "configure new cell"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "cell name"); cmd_AddParm(ts, "-servers", CMD_LIST, CMD_REQUIRED, "primary servers"); cmd_AddParm(ts, "-linkedcell", CMD_SINGLE, CMD_OPTIONAL, "linked cell name"); - ts = cmd_CreateSyntax("newalias", NewAliasCmd, 0, + ts = cmd_CreateSyntax("newalias", NewAliasCmd, NULL, "configure new cell alias"); cmd_AddParm(ts, "-alias", CMD_SINGLE, 0, "alias name"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "real name of cell"); @@ -3540,42 +3553,42 @@ defect 3069 "cell's vldb server port"); #endif - ts = cmd_CreateSyntax("whichcell", WhichCellCmd, 0, "list file's cell"); + ts = cmd_CreateSyntax("whichcell", WhichCellCmd, NULL, "list file's cell"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("whereis", WhereIsCmd, 0, "list file's location"); + ts = cmd_CreateSyntax("whereis", WhereIsCmd, NULL, "list file's location"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("wscell", WSCellCmd, 0, "list workstation's cell"); + ts = cmd_CreateSyntax("wscell", WSCellCmd, NULL, "list workstation's cell"); /* - ts = cmd_CreateSyntax("primarycell", PrimaryCellCmd, 0, "obsolete (listed primary cell)"); + ts = cmd_CreateSyntax("primarycell", PrimaryCellCmd, NULL, "obsolete (listed primary cell)"); */ /* set cache monitor host address */ - ts = cmd_CreateSyntax("monitor", MonitorCmd, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("monitor", MonitorCmd, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "host name or 'off'"); cmd_CreateAlias(ts, "mariner"); - ts = cmd_CreateSyntax("getcellstatus", GetCellCmd, 0, "get cell status"); + ts = cmd_CreateSyntax("getcellstatus", GetCellCmd, NULL, "get cell status"); cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name"); - ts = cmd_CreateSyntax("setcell", SetCellCmd, 0, "set cell status"); + ts = cmd_CreateSyntax("setcell", SetCellCmd, NULL, "set cell status"); cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name"); cmd_AddParm(ts, "-suid", CMD_FLAG, CMD_OPTIONAL, "allow setuid programs"); cmd_AddParm(ts, "-nosuid", CMD_FLAG, CMD_OPTIONAL, "disallow setuid programs"); - ts = cmd_CreateSyntax("flushvolume", FlushVolumeCmd, 0, + ts = cmd_CreateSyntax("flushvolume", FlushVolumeCmd, NULL, "flush all data in volume"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - ts = cmd_CreateSyntax("sysname", SysNameCmd, 0, + ts = cmd_CreateSyntax("sysname", SysNameCmd, NULL, "get/set sysname (i.e. @sys) value"); cmd_AddParm(ts, "-newsys", CMD_LIST, CMD_OPTIONAL, "new sysname"); - ts = cmd_CreateSyntax("exportafs", ExportAfsCmd, 0, + ts = cmd_CreateSyntax("exportafs", ExportAfsCmd, NULL, "enable/disable translators to AFS"); cmd_AddParm(ts, "-type", CMD_SINGLE, 0, "exporter name"); cmd_AddParm(ts, "-start", CMD_SINGLE, CMD_OPTIONAL, @@ -3592,7 +3605,7 @@ defect 3069 "enable callbacks to get creds from new clients (on | off)"); - ts = cmd_CreateSyntax("storebehind", StoreBehindCmd, 0, + ts = cmd_CreateSyntax("storebehind", StoreBehindCmd, NULL, "store to server after file close"); cmd_AddParm(ts, "-kbytes", CMD_SINGLE, CMD_OPTIONAL, "asynchrony for specified names"); @@ -3602,44 +3615,44 @@ defect 3069 cmd_AddParm(ts, "-verbose", CMD_FLAG, CMD_OPTIONAL, "show status"); cmd_CreateAlias(ts, "sb"); - ts = cmd_CreateSyntax("setcrypt", SetCryptCmd, 0, + ts = cmd_CreateSyntax("setcrypt", SetCryptCmd, NULL, "set cache manager encryption flag"); cmd_AddParm(ts, "-crypt", CMD_SINGLE, 0, "on or off"); - ts = cmd_CreateSyntax("getcrypt", GetCryptCmd, 0, + ts = cmd_CreateSyntax("getcrypt", GetCryptCmd, NULL, "get cache manager encryption flag"); - ts = cmd_CreateSyntax("rxstatproc", RxStatProcCmd, 0, + ts = cmd_CreateSyntax("rxstatproc", RxStatProcCmd, NULL, "Manage per process RX statistics"); cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats"); cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "Disable RX stats"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "Clear RX stats"); - ts = cmd_CreateSyntax("rxstatpeer", RxStatPeerCmd, 0, + ts = cmd_CreateSyntax("rxstatpeer", RxStatPeerCmd, NULL, "Manage per peer RX statistics"); cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats"); cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "Disable RX stats"); cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "Clear RX stats"); - ts = cmd_CreateSyntax("setcbaddr", CallBackRxConnCmd, 0, "configure callback connection address"); + ts = cmd_CreateSyntax("setcbaddr", CallBackRxConnCmd, NULL, "configure callback connection address"); cmd_AddParm(ts, "-addr", CMD_SINGLE, CMD_OPTIONAL, "host name or address"); /* try to find volume location information */ - ts = cmd_CreateSyntax("getfid", GetFidCmd, 0, + ts = cmd_CreateSyntax("getfid", GetFidCmd, NULL, "get fid for file(s)"); cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); #ifdef AFS_DISCON_ENV - ts = cmd_CreateSyntax("discon", DisconCmd, 0, + ts = cmd_CreateSyntax("discon", DisconCmd, NULL, "disconnection mode"); cmd_AddParm(ts, "-mode", CMD_SINGLE, CMD_OPTIONAL, "nat | full"); #endif - ts = cmd_CreateSyntax("nukenfscreds", NukeNFSCredsCmd, 0, "nuke credentials for NFS client"); + ts = cmd_CreateSyntax("nukenfscreds", NukeNFSCredsCmd, NULL, "nuke credentials for NFS client"); cmd_AddParm(ts, "-addr", CMD_SINGLE, 0, "host name or address"); - ts = cmd_CreateSyntax("newuuid", NewUuidCmd, 0, - "force a new uuid"); + ts = cmd_CreateSyntax("uuid", UuidCmd, NULL, "manage the UUID for the cache manager"); + cmd_AddParm(ts, "-generate", CMD_FLAG, CMD_REQUIRED, "generate a new UUID"); code = cmd_Dispatch(argc, argv); if (rxInitDone) @@ -3693,7 +3706,7 @@ Die(int errnum, char *filename) /* get clients interface addresses */ static int -GetClientAddrsCmd(struct cmd_syndesc *as, char *arock) +GetClientAddrsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct cmd_item *ti; @@ -3739,7 +3752,7 @@ GetClientAddrsCmd(struct cmd_syndesc *as, char *arock) } static int -SetClientAddrsCmd(struct cmd_syndesc *as, char *arock) +SetClientAddrsCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code, addr; struct cmd_item *ti; @@ -3813,7 +3826,7 @@ SetClientAddrsCmd(struct cmd_syndesc *as, char *arock) } static int -FlushMountCmd(struct cmd_syndesc *as, char *arock) +FlushMountCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -3929,7 +3942,7 @@ FlushMountCmd(struct cmd_syndesc *as, char *arock) } static int -RxStatProcCmd(struct cmd_syndesc *as, char *arock) +RxStatProcCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 flags = 0; @@ -3964,7 +3977,7 @@ RxStatProcCmd(struct cmd_syndesc *as, char *arock) } static int -RxStatPeerCmd(struct cmd_syndesc *as, char *arock) +RxStatPeerCmd(struct cmd_syndesc *as, void *arock) { afs_int32 code; afs_int32 flags = 0; @@ -3999,7 +4012,7 @@ RxStatPeerCmd(struct cmd_syndesc *as, char *arock) } static int -GetFidCmd(struct cmd_syndesc *as, char *arock) +GetFidCmd(struct cmd_syndesc *as, void *arock) { struct ViceIoctl blob; struct cmd_item *ti; diff --git a/src/venus/fstrace.c b/src/venus/fstrace.c index ef5dd1ff00..4e47b2ca08 100644 --- a/src/venus/fstrace.c +++ b/src/venus/fstrace.c @@ -27,13 +27,7 @@ RCSID #undef abs #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include @@ -87,6 +81,7 @@ struct logInfo { } *allInfo = 0; char dumpFileName[256] = ""; +void RegisterIclDumpFileName(name) char *name; { @@ -258,7 +253,7 @@ CheckTypes(bufferp, typesp, typeCount) #if defined(AFS_SGI61_ENV) && !defined(AFS_SGI62_ENV) #define uint64_t long long #endif -static +static void DisplayRecord(outFilep, alp, rsize) FILE *outFilep; register afs_int32 *alp; @@ -2713,10 +2708,8 @@ GetBulkLogInfo() } -static -DoDump(as, arock) - register struct cmd_syndesc *as; - char *arock; +static int +DoDump(struct cmd_syndesc *as, void *arock) { afs_int32 code = 0; afs_int32 tcode; @@ -2792,7 +2785,7 @@ SetUpDump() struct cmd_syndesc *dumpSyntax; dumpSyntax = - cmd_CreateSyntax("dump", DoDump, (char *)NULL, "dump AFS trace logs"); + cmd_CreateSyntax("dump", DoDump, NULL, "dump AFS trace logs"); (void)cmd_AddParm(dumpSyntax, "-set", CMD_LIST, CMD_OPTIONAL, "set_name"); (void)cmd_AddParm(dumpSyntax, "-follow", CMD_SINGLE, CMD_OPTIONAL, "log_name"); @@ -2802,10 +2795,8 @@ SetUpDump() "seconds_between_reads"); } -static -DoShowLog(as, arock) - register struct cmd_syndesc *as; - char *arock; +static int +DoShowLog(register struct cmd_syndesc *as, void *arock) { afs_int32 retVal = 0; afs_int32 code = 0; @@ -2868,17 +2859,15 @@ SetUpShowLog() struct cmd_syndesc *showSyntax; showSyntax = - cmd_CreateSyntax("lslog", DoShowLog, (char *)NULL, + cmd_CreateSyntax("lslog", DoShowLog, NULL, "list available logs"); (void)cmd_AddParm(showSyntax, "-set", CMD_LIST, CMD_OPTIONAL, "set_name"); (void)cmd_AddParm(showSyntax, "-log", CMD_LIST, CMD_OPTIONAL, "log_name"); (void)cmd_AddParm(showSyntax, "-long", CMD_FLAG, CMD_OPTIONAL, ""); } -static -DoShowSet(as, arock) - register struct cmd_syndesc *as; - char *arock; +static int +DoShowSet(register struct cmd_syndesc *as, void *arock) { afs_int32 retVal = 0; afs_int32 code = 0; @@ -2926,15 +2915,13 @@ SetUpShowSet() struct cmd_syndesc *showSyntax; showSyntax = - cmd_CreateSyntax("lsset", DoShowSet, (char *)NULL, + cmd_CreateSyntax("lsset", DoShowSet, NULL, "list available event sets"); (void)cmd_AddParm(showSyntax, "-set", CMD_LIST, CMD_OPTIONAL, "set_name"); } -static -DoClear(as, arock) - register struct cmd_syndesc *as; - char *arock; +static int +DoClear(register struct cmd_syndesc *as, void *arock) { afs_int32 retVal = 0; afs_int32 code = 0; @@ -2985,7 +2972,7 @@ SetUpClear() struct cmd_syndesc *clearSyntax; clearSyntax = - cmd_CreateSyntax("clear", DoClear, (char *)NULL, + cmd_CreateSyntax("clear", DoClear, NULL, "clear logs by logname or by event set"); (void)cmd_AddParm(clearSyntax, "-set", CMD_LIST, CMD_OPTIONAL, "set_name"); @@ -2993,10 +2980,8 @@ SetUpClear() "log_name"); } -static -DoSet(as, arock) - register struct cmd_syndesc *as; - char *arock; +static int +DoSet(register struct cmd_syndesc *as, void *arock) { afs_int32 retVal = 0; afs_int32 code = 0; @@ -3074,7 +3059,7 @@ SetUpSet() struct cmd_syndesc *setSyntax; setSyntax = - cmd_CreateSyntax("setset", DoSet, (char *)NULL, + cmd_CreateSyntax("setset", DoSet, NULL, "set state of event sets"); (void)cmd_AddParm(setSyntax, "-set", CMD_LIST, CMD_OPTIONAL, "set_name"); (void)cmd_AddParm(setSyntax, "-active", CMD_FLAG, CMD_OPTIONAL, ""); @@ -3082,10 +3067,8 @@ SetUpSet() (void)cmd_AddParm(setSyntax, "-dormant", CMD_FLAG, CMD_OPTIONAL, ""); } -static -DoResize(as, arock) - register struct cmd_syndesc *as; - char *arock; +static int +DoResize(register struct cmd_syndesc *as, void *arock) { afs_int32 retVal = 0; afs_int32 code = 0; @@ -3133,7 +3116,7 @@ SetUpResize() struct cmd_syndesc *setsizeSyntax; setsizeSyntax = - cmd_CreateSyntax("setlog", DoResize, (char *)NULL, + cmd_CreateSyntax("setlog", DoResize, NULL, "set the size of a log"); (void)cmd_AddParm(setsizeSyntax, "-log", CMD_LIST, CMD_OPTIONAL, "log_name"); diff --git a/src/venus/kdump.c b/src/venus/kdump.c index 6cdc39ca0d..7cd52ce112 100644 --- a/src/venus/kdump.c +++ b/src/venus/kdump.c @@ -564,9 +564,6 @@ void print_cmstats(); -#ifndef AFS_KDUMP_LIB -extern struct cmd_syndesc *cmd_CreateSyntax(); -#endif int opencore(); #if defined(AFS_HPUX_ENV) && defined(__LP64__) @@ -836,10 +833,8 @@ symsrch(s) #ifndef AFS_KDUMP_LIB -static -cmdproc(as, arock) - register struct cmd_syndesc *as; - afs_int32 arock; +static int +cmdproc(register struct cmd_syndesc *as, void *arock) { register afs_int32 code = 0; @@ -965,7 +960,7 @@ main(argc, argv) sigaction(SIGSEGV, &nsa, NULL); #endif - ts = cmd_CreateSyntax(NULL, cmdproc, 0, + ts = cmd_CreateSyntax(NULL, cmdproc, NULL, "Read internal cache manager structs"); cmd_AddParm(ts, "-kobj", CMD_SINGLE, CMD_OPTIONAL, "kernel object (default /vmunix)"); diff --git a/src/venus/livesys.c b/src/venus/livesys.c index 04131442de..fe64b6fadc 100644 --- a/src/venus/livesys.c +++ b/src/venus/livesys.c @@ -22,13 +22,7 @@ RCSID #include #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/venus/test/fulltest.c b/src/venus/test/fulltest.c index ee455f3d9a..49da1bdc9f 100644 --- a/src/venus/test/fulltest.c +++ b/src/venus/test/fulltest.c @@ -17,6 +17,7 @@ RCSID #include #include #include +#include #include main(argc, argv) @@ -40,41 +41,41 @@ main(argc, argv) dirName = argv[1]; mkdir(dirName, 0777); if (chdir(dirName) < 0) - return perror("chdir"); + {perror("chdir");return;} if (getcwd(tempName, 1024) == 0) { return printf("Could not get working dir.\n"); } /* now create some files */ fd1 = open("hi", O_CREAT | O_TRUNC | O_RDWR, 0666); if (fd1 < 0) - return perror("open1"); + {perror("open1");return;} if (close(fd1) < 0) - return perror("close1"); + {perror("close1");return;} if (access("hi", 2) < 0) return printf("New file can not be written (access)\n"); if (chmod("hi", 0741) < 0) - return perror("chmod1"); + {perror("chmod1");return;} if (stat("hi", &tstat) < 0) - return perror("stat1"); + {perror("stat1");return;} if ((tstat.st_mode & 0777) != 0741) return printf("chmod failed to set mode properly\n"); fd1 = open("hi", O_RDWR); if (fd1 < 0) - return perror("open2"); + {perror("open2");return;} if (fchmod(fd1, 0654) < 0) - return perror("fchmod"); + {perror("fchmod");return;} if (fstat(fd1, &tstat) < 0) - return perror("fstat1"); + {perror("fstat1");return;} if ((tstat.st_mode & 0777) != 0654) return printf("fchmod failed to set mode properly\n"); #if 0 /* These appear to be defunct routines; * I don't know what, if anything, replaced them */ if (osi_ExclusiveLockNoBlock(fd1) < 0) - return perror("flock1"); + {perror("flock1");return;} if (osi_UnLock(fd1) < 0) - return perror("flock/unlock"); + {perror("flock/unlock");return;} #endif /* How about shared lock portability? */ @@ -87,7 +88,7 @@ main(argc, argv) fl.l_len = 0; if (fcntl(fd1, F_SETLK, &fl) == -1) - return perror("fcntl1: RDLCK"); + {perror("fcntl1: RDLCK");return;} fl.l_type = F_UNLCK; fl.l_whence = SEEK_SET; @@ -95,7 +96,7 @@ main(argc, argv) fl.l_len = 0; if (fcntl(fd1, F_SETLK, &fl) == -1) - return perror("fcntl2: UNLCK"); + {perror("fcntl2: UNLCK");return;} fl.l_type = F_WRLCK; fl.l_whence = SEEK_SET; @@ -103,7 +104,7 @@ main(argc, argv) fl.l_len = 0; if (fcntl(fd1, F_SETLK, &fl) == -1) - return perror("fcntl3: WRLCK"); + {perror("fcntl3: WRLCK");return;} fl.l_type = F_UNLCK; fl.l_whence = SEEK_SET; @@ -111,61 +112,61 @@ main(argc, argv) fl.l_len = 0; if (fcntl(fd1, F_SETLK, &fl) == -1) - return perror("fcntl4: UNLCK"); + {perror("fcntl4: UNLCK");return;} } if (fsync(fd1) < 0) - return perror("fsync"); + {perror("fsync");return;} if (write(fd1, "hi\n", 3) != 3) - return perror("write"); + {perror("write");return;} if (ftruncate(fd1, 2) < 0) - return perror("ftruncate"); + {perror("ftruncate");return;} if (close(fd1) < 0) - return perror("close2"); + {perror("close2");return;} fd1 = open("hi", O_RDONLY); if (fd1 < 0) - return perror("open3"); + {perror("open3");return;} if (read(fd1, tempName, 100) != 2) - return perror("read2"); + {perror("read2");return;} if (close(fd1) < 0) - return perror("close3"); + {perror("close3");return;} if (link("hi", "bye") < 0) - return perror("link"); + {perror("link");return;} if (stat("bye", &tstat) < 0) - return perror("link/stat"); + {perror("link/stat");return;} if (unlink("bye") < 0) - return perror("unlink"); + {perror("unlink");return;} if (symlink("hi", "bye") < 0) - return perror("symlink"); + {perror("symlink");return;} if (readlink("bye", tempName, 100) != 2) - return perror("readlink"); + {perror("readlink");return;} if (strncmp(tempName, "hi", 2) != 0) return printf("readlink contents"); if (mkdir("tdir", 0777) < 0) - return perror("mkdir"); + {perror("mkdir");return;} fd1 = open("tdir/fdsa", O_CREAT | O_TRUNC, 0777); close(fd1); if (rmdir("tdir") == 0) return printf("removed non-empty dir\n"); if (unlink("tdir/fdsa") < 0) - return perror("unlink tdir contents"); + {perror("unlink tdir contents");return;} if (rmdir("tdir") < 0) - return perror("rmdir"); + {perror("rmdir");return;} fd1 = open(".", O_RDONLY); if (fd1 < 0) - return perror("open dot"); + {perror("open dot");return;} if (read(fd1, tempName, 20) < 20) perror("read dir"); close(fd1); fd1 = open("rotest", O_RDWR | O_CREAT, 0444); if (fd1 < 0) - return perror("open ronly"); + {perror("open ronly");return;} fchown(fd1, 1, -1); /* don't check error code, may fail on Ultrix */ code = write(fd1, "test", 4); if (code != 4) { @@ -174,40 +175,41 @@ main(argc, argv) } code = close(fd1); if (code) - return perror("close ronly"); + {perror("close ronly");return;} code = stat("rotest", &tstat); if (code < 0) - return perror("stat ronly"); + {perror("stat ronly");return;} if (tstat.st_size != 4) { printf("rotest short close\n"); exit(1); } if (unlink("rotest") < 0) - return perror("rotest unlink"); + {perror("rotest unlink");return;} if (rename("hi", "bye") < 0) - return perror("rename1"); + {perror("rename1");return;} if (stat("bye", &tstat) < 0) - return perror("rename target invisible\n"); + {perror("rename target invisible\n");return;} if (stat("hi", &tstat) == 0) return printf("rename source still there\n"); #ifndef AFS_AIX_ENV /* No truncate(2) on aix so the following are excluded */ if (truncate("bye", 1) < 0) - return perror("truncate"); + {perror("truncate");return;} if (stat("bye", &tstat) < 0) - return perror("truncate zapped"); + {perror("truncate zapped");return;} if (tstat.st_size != 1) return printf("truncate failed\n"); #endif if (utimes("bye", tvp) < 0) - return perror("utimes"); + {perror("utimes");return;} if (unlink("bye") < 0) - return perror("unlink bye"); + {perror("unlink bye");return;} /* now finish up */ chdir(".."); rmdir(dirName); printf("Test completed successfully.\n"); + return 0; } diff --git a/src/venus/test/getinitparams.c b/src/venus/test/getinitparams.c index e720698a65..89f4800fe1 100644 --- a/src/venus/test/getinitparams.c +++ b/src/venus/test/getinitparams.c @@ -34,7 +34,7 @@ RCSID int -GetInitParamsCmd(struct cmd_syndesc *as) +GetInitParamsCmd(struct cmd_syndesc *as, void *arock) { struct cm_initparams cm_initParams; struct ViceIoctl blob; diff --git a/src/venus/test/idtest.c b/src/venus/test/idtest.c index be04f05409..9261f28915 100644 --- a/src/venus/test/idtest.c +++ b/src/venus/test/idtest.c @@ -9,6 +9,7 @@ #include #include +#include RCSID ("$Header$"); diff --git a/src/venus/test/owntest.c b/src/venus/test/owntest.c index 11dcf419d7..a22b6044dd 100644 --- a/src/venus/test/owntest.c +++ b/src/venus/test/owntest.c @@ -12,6 +12,7 @@ #ifdef HAVE_STDLIB_H #include #endif +#include RCSID ("$Header$"); diff --git a/src/venus/twiddle.c b/src/venus/twiddle.c index a75abf3cb3..f4a1958025 100644 --- a/src/venus/twiddle.c +++ b/src/venus/twiddle.c @@ -31,7 +31,7 @@ RCSID #undef VICE #include "afs/prs_fs.h" #include -#include #include #include #include @@ -46,13 +46,11 @@ static char tspace[1024]; static struct ubik_client *uclient; -extern struct cmd_syndesc *cmd_CreateSyntax(); static char pn[] = "fs"; static int rxInitDone = 0; -static -Twiddle(as) - struct cmd_syndesc *as; +static int +Twiddle(struct cmd_syndesc *as, void *arock) { afs_int32 code; struct ViceIoctl blob; @@ -153,7 +151,7 @@ main(argc, argv) /* try to find volume location information */ - ts = cmd_CreateSyntax(NULL, Twiddle, 0, "adjust rx parms"); + ts = cmd_CreateSyntax(NULL, Twiddle, NULL, "adjust rx parms"); cmd_AddParm(ts, "-initReceiveWindow ", CMD_SINGLE, CMD_OPTIONAL, "16"); cmd_AddParm(ts, "-maxReceiveWindow ", CMD_SINGLE, CMD_OPTIONAL, "16"); cmd_AddParm(ts, "-initSendWindow ", CMD_SINGLE, CMD_OPTIONAL, "8"); diff --git a/src/venus/up.c b/src/venus/up.c index 3bb74a0edc..f35814ee8d 100644 --- a/src/venus/up.c +++ b/src/venus/up.c @@ -21,6 +21,7 @@ RCSID #undef _NONSTD_TYPES #endif #include +#include #include #include #ifdef AFS_SUN5_ENV @@ -42,13 +43,7 @@ RCSID #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include diff --git a/src/venus/whatfid.c b/src/venus/whatfid.c index ab1977c603..c1f21d6af9 100644 --- a/src/venus/whatfid.c +++ b/src/venus/whatfid.c @@ -49,8 +49,7 @@ void PioctlError(); int WhatFidCmd_FileParm; int WhatFidCmd_FollowLinkParm; int -WhatFidCmd(as) - register struct cmd_syndesc *as; +WhatFidCmd(register struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct ViceIoctl blob; @@ -104,7 +103,7 @@ main(argc, argv) pn = argv[0]; - ts = cmd_CreateSyntax("initcmd", WhatFidCmd, 0, "list fid for file(s)"); + ts = cmd_CreateSyntax("initcmd", WhatFidCmd, NULL, "list fid for file(s)"); WhatFidCmd_FileParm = cmd_AddParm(ts, "-path", CMD_LIST, 0, "pathnames"); WhatFidCmd_FollowLinkParm = cmd_AddParm(ts, "-link", CMD_FLAG, CMD_OPTIONAL, diff --git a/src/vfsck/dirutils.c b/src/vfsck/dirutils.c index f893326878..9b3246695e 100644 --- a/src/vfsck/dirutils.c +++ b/src/vfsck/dirutils.c @@ -15,6 +15,7 @@ RCSID #include #include +#include #include #include diff --git a/src/vfsck/setup.c b/src/vfsck/setup.c index 19d7dce083..87a99d2036 100644 --- a/src/vfsck/setup.c +++ b/src/vfsck/setup.c @@ -22,6 +22,7 @@ RCSID ("$Header$"); #include +#include #define VICE #if defined(AFS_SUN_ENV) || defined(AFS_OSF_ENV) diff --git a/src/vfsck/utilities.c b/src/vfsck/utilities.c index 27ea70706d..4d42aa4947 100644 --- a/src/vfsck/utilities.c +++ b/src/vfsck/utilities.c @@ -75,6 +75,7 @@ RCSID #endif /* AFS_OSF_ENV */ #include +#include #include #include "fsck.h" diff --git a/src/viced/afsfileprocs.c b/src/viced/afsfileprocs.c index f879b5dc6f..e8bed09f2b 100644 --- a/src/viced/afsfileprocs.c +++ b/src/viced/afsfileprocs.c @@ -47,14 +47,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifndef AFS_LINUX20_ENV #include @@ -5988,7 +5981,9 @@ common_GiveUpCallBacks(struct rx_call *acall, struct AFSCBFids *FidArray, (tcon->peer ? tcon->peer->host : 0))); errorCode = GetClient(tcon, &client); if (!errorCode) { + H_LOCK; DeleteAllCallBacks_r(client->host, 1); + H_UNLOCK; PutClient(&client); } } else { diff --git a/src/viced/callback.c b/src/viced/callback.c index ebb2c8660d..809dce2d27 100644 --- a/src/viced/callback.c +++ b/src/viced/callback.c @@ -90,6 +90,7 @@ RCSID #include #include /* for malloc() */ #include /* ANSI standard location for time stuff */ +#include #ifdef AFS_NT40_ENV #include #include @@ -97,13 +98,6 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include @@ -387,7 +381,7 @@ CDelPtr(register struct FileEntry *fe, register afs_uint32 * cbp, CcdelB++; *cbp = cb->cnext; FreeCB(cb); - if (deletefe && (--fe->ncbs == 0)) + if ((--fe->ncbs == 0) && deletefe) FDel(fe); return 0; } @@ -543,6 +537,8 @@ AddCallBack1_r(struct host *host, AFSFid * fid, afs_uint32 * thead, int type, struct CallBack *newcb = 0; int safety; + cbstuff.AddCallBacks++; + host->Console |= 2; /* allocate these guys first, since we can't call the allocator with @@ -867,9 +863,9 @@ DeleteCallBack(struct host *host, AFSFid * fid) register afs_uint32 *pcb; char hoststr[16]; + H_LOCK; cbstuff.DeleteCallBacks++; - H_LOCK; h_Lock_r(host); fe = FindFE(fid); if (!fe) { @@ -928,6 +924,7 @@ DeleteFileCallBacks(AFSFid * fid) TDel(cb); HDel(cb); FreeCB(cb); + fe->ncbs--; } FDel(fe); H_UNLOCK; @@ -1079,7 +1076,7 @@ BreakDelayedCallBacks_r(struct host *host) cbstuff.nbreakers--; /* If we succeeded it's always ok to unset HFE_LATER */ - if (!host->hostFlags & VENUSDOWN) + if (!(host->hostFlags & VENUSDOWN)) host->hostFlags &= ~HFE_LATER; return (host->hostFlags & VENUSDOWN); } @@ -1335,6 +1332,7 @@ BreakLaterCallBacks(void) fe->volid)); fid.Volume = fe->volid; *feip = fe->fnext; + fe->status &= ~FE_LATER; /* Works since volid is deeper than the largest pointer */ tmpfe = (struct object *)fe; tmpfe->next = (struct object *)myfe; @@ -2315,7 +2313,7 @@ cb_stateRestoreFEs(struct fs_dump_state * state) static int cb_stateSaveFE(struct fs_dump_state * state, struct FileEntry * fe) { - int ret = 0, iovcnt, cbi, idx, len, written = 0; + int ret = 0, iovcnt, cbi, written = 0; afs_uint32 fei; struct callback_state_entry_header hdr; struct FEDiskEntry fedsk; @@ -2336,24 +2334,24 @@ cb_stateSaveFE(struct fs_dump_state * state, struct FileEntry * fe) } iov[0].iov_base = (char *)&hdr; - len = iov[0].iov_len = sizeof(hdr); + iov[0].iov_len = sizeof(hdr); iov[1].iov_base = (char *)&fedsk; - len += iov[1].iov_len = sizeof(struct FEDiskEntry); + iov[1].iov_len = sizeof(struct FEDiskEntry); iovcnt = 2; - for (cbi = fe->firstcb, cb = itocb(cbi), idx = 2; + for (cbi = fe->firstcb, cb = itocb(cbi); cb != NULL; - cbi = cb->cnext, cb = itocb(cbi), idx++, hdr.nCBs++) { + cbi = cb->cnext, cb = itocb(cbi), hdr.nCBs++) { if (cbi > state->cb_hdr->cb_max) { state->cb_hdr->cb_max = cbi; } - if (cb_stateCBToDiskEntry(cb, &cbdsk[idx])) { + if (cb_stateCBToDiskEntry(cb, &cbdsk[iovcnt])) { ret = 1; goto done; } - cbdsk[idx].index = cbi; - iov[iovcnt].iov_base = (char *)&cbdsk[idx]; - len += iov[iovcnt].iov_len = sizeof(struct CBDiskEntry); + cbdsk[iovcnt].index = cbi; + iov[iovcnt].iov_base = (char *)&cbdsk[iovcnt]; + iov[iovcnt].iov_len = sizeof(struct CBDiskEntry); iovcnt++; if ((iovcnt == 16) || (!cb->cnext)) { if (fs_stateWriteV(state, iov, iovcnt)) { @@ -2362,7 +2360,6 @@ cb_stateSaveFE(struct fs_dump_state * state, struct FileEntry * fe) } written = 1; iovcnt = 0; - len = 0; } } @@ -2401,7 +2398,7 @@ cb_stateSaveFE(struct fs_dump_state * state, struct FileEntry * fe) static int cb_stateRestoreFE(struct fs_dump_state * state) { - int ret = 0, iovcnt, len, nCBs, idx; + int ret = 0, iovcnt, nCBs; struct callback_state_entry_header hdr; struct FEDiskEntry fedsk; struct CBDiskEntry cbdsk[16]; @@ -2410,9 +2407,9 @@ cb_stateRestoreFE(struct fs_dump_state * state) struct CallBack * cb; iov[0].iov_base = (char *)&hdr; - len = iov[0].iov_len = sizeof(hdr); + iov[0].iov_len = sizeof(hdr); iov[1].iov_base = (char *)&fedsk; - len += iov[1].iov_len = sizeof(fedsk); + iov[1].iov_len = sizeof(fedsk); iovcnt = 2; if (fs_stateReadV(state, iov, iovcnt)) { @@ -2438,11 +2435,11 @@ cb_stateRestoreFE(struct fs_dump_state * state) } if (hdr.nCBs) { - for (iovcnt = 0, idx = 0, len = 0, nCBs = 0; + for (iovcnt = 0, nCBs = 0; nCBs < hdr.nCBs; - idx++, nCBs++) { - iov[idx].iov_base = (char *)&cbdsk[idx]; - len += iov[idx].iov_len = sizeof(struct CBDiskEntry); + nCBs++) { + iov[iovcnt].iov_base = (char *)&cbdsk[iovcnt]; + iov[iovcnt].iov_len = sizeof(struct CBDiskEntry); iovcnt++; if ((iovcnt == 16) || (nCBs == hdr.nCBs - 1)) { if (fs_stateReadV(state, iov, iovcnt)) { @@ -2453,7 +2450,6 @@ cb_stateRestoreFE(struct fs_dump_state * state) ret = 1; goto done; } - len = 0; iovcnt = 0; } } @@ -2646,11 +2642,14 @@ cb_OldToNew(struct fs_dump_state * state, afs_uint32 old, afs_uint32 * new) int DumpCallBackState(void) { - int fd; + int fd, oflag; afs_uint32 magic = MAGIC, now = FT_ApproxTime(), freelisthead; - fd = open(AFSDIR_SERVER_CBKDUMP_FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, - 0666); + oflag = O_WRONLY | O_CREAT | O_TRUNC; +#ifdef AFS_NT40_ENV + oflag |= O_BINARY; +#endif + fd = open(AFSDIR_SERVER_CBKDUMP_FILEPATH, oflag, 0666); if (fd < 0) { ViceLog(0, ("Couldn't create callback dump file %s\n", @@ -2684,11 +2683,15 @@ DumpCallBackState(void) time_t ReadDump(char *file) { - int fd; + int fd, oflag; afs_uint32 magic, freelisthead; - time_t now; + afs_uint32 now; - fd = open(file, O_RDONLY); + oflag = O_RDONLY; +#ifdef AFS_NT40_ENV + oflag |= O_BINARY; +#endif + fd = open(file, oflag); if (fd < 0) { fprintf(stderr, "Couldn't read dump file %s\n", file); exit(1); @@ -2709,7 +2712,7 @@ ReadDump(char *file) read(fd, &tfirst, sizeof(tfirst)); read(fd, &freelisthead, sizeof(freelisthead)); CB = ((struct CallBack - *)(calloc(cbstuff.nblks, sizeof(struct FileEntry)))) - 1; + *)(calloc(cbstuff.nblks, sizeof(struct CallBack)))) - 1; FE = ((struct FileEntry *)(calloc(cbstuff.nblks, sizeof(struct FileEntry)))) - 1; CBfree = (struct CallBack *)itocb(freelisthead); diff --git a/src/viced/check_sysid.c b/src/viced/check_sysid.c index e1e3c65e89..b37b544af9 100644 --- a/src/viced/check_sysid.c +++ b/src/viced/check_sysid.c @@ -109,4 +109,5 @@ main(int argc, char **argv) } close(fd); + return 0; } diff --git a/src/viced/fsprobe.c b/src/viced/fsprobe.c index 963b974574..0e5c15b977 100644 --- a/src/viced/fsprobe.c +++ b/src/viced/fsprobe.c @@ -21,15 +21,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - struct ubik_client *cstruct; struct rx_connection *serverconns[MAXSERVERS]; @@ -265,6 +257,7 @@ main(int argc, char **argv) } } #endif + return 0; } diff --git a/src/viced/host.c b/src/viced/host.c index 0b9f7fb349..5b6526ff8b 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -17,6 +17,7 @@ RCSID #include #include +#include #ifdef AFS_NT40_ENV #include #include @@ -26,14 +27,6 @@ RCSID #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -1552,6 +1545,7 @@ h_GetHost_r(struct rx_connection *tcon) host->interface ? uuid2 : "no_uuid")); /* The host in the cache is not the host for this connection */ + h_Lock_r(host); host->hostFlags |= HOSTDELETED; host->hostFlags &= ~HWHO_INPROGRESS; h_Unlock_r(host); @@ -1744,6 +1738,7 @@ h_GetHost_r(struct rx_connection *tcon) &FS_HostUUID); rx_PutConnection(cb_conn); cb_conn=NULL; + H_LOCK; if (code == 0) { ViceLog(25, ("InitCallBackState3 success on host %x (%s:%d)\n", @@ -3346,6 +3341,16 @@ CheckHost_r(register struct host *host, int held, char *dummy) struct rx_connection *cb_conn = NULL; int code; +#ifdef AFS_DEMAND_ATTACH_FS + /* kill the checkhost lwp ASAP during shutdown */ + FS_STATE_RDLOCK; + if (fs_state.mode == FS_MODE_SHUTDOWN) { + FS_STATE_UNLOCK; + return H_ENUMERATE_BAIL(held); + } + FS_STATE_UNLOCK; +#endif + /* Host is held by h_Enumerate_r */ for (client = host->FirstClient; client; client = client->next) { if (client->refCount == 0 && client->LastCall < clientdeletetime) { diff --git a/src/viced/physio.c b/src/viced/physio.c index b3a6a16ff3..678e2bd677 100644 --- a/src/viced/physio.c +++ b/src/viced/physio.c @@ -21,6 +21,7 @@ RCSID #include #include +#include #ifdef AFS_NT40_ENV #include #else @@ -28,13 +29,6 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include diff --git a/src/viced/viced.c b/src/viced/viced.c index 7ec8408957..03a537054a 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -27,6 +27,7 @@ RCSID #include #include #include +#include #include #include /* signal(), kill(), wait(), etc. */ #include @@ -41,14 +42,6 @@ RCSID #include #include /* sysconf() */ -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #ifndef ITIMER_REAL #include #endif /* ITIMER_REAL */ @@ -869,6 +862,9 @@ ShutDownAndCore(int dopanic) } } + if (dopanic) + assert(0); + exit(0); } @@ -2190,7 +2186,18 @@ main(int argc, char *argv[]) /* allow super users to manage RX statistics */ rx_SetRxStatUserOk(fs_rxstat_userok); +#if !defined(AFS_DEMAND_ATTACH_FS) + /* + * For DAFS, we do not start the Rx server threads until after + * the volume package is initialized, and fileserver state is + * restored. This is necessary in order to keep host and callback + * package state pristine until we have a chance to restore state. + * + * Furthermore, startup latency is much lower with dafs, so this + * shouldn't pose a serious problem. + */ rx_StartServer(0); /* now start handling requests */ +#endif /* we ensure that there is enough space in the vnode buffer to satisfy ** requests from all concurrent threads. @@ -2230,6 +2237,7 @@ main(int argc, char *argv[]) * restore fileserver state */ fs_stateRestore(); } + rx_StartServer(0); /* now start handling requests */ #endif /* AFS_DEMAND_ATTACH_FS */ /* @@ -2325,4 +2333,5 @@ main(int argc, char *argv[]) #else /* AFS_PTHREAD_ENV */ assert(LWP_WaitProcess((char*) &parentPid) == LWP_SUCCESS); #endif /* AFS_PTHREAD_ENV */ + return 0; } diff --git a/src/vlserver/Makefile.in b/src/vlserver/Makefile.in index e67ce1d53a..a396ba32b5 100644 --- a/src/vlserver/Makefile.in +++ b/src/vlserver/Makefile.in @@ -80,26 +80,26 @@ vldbint.cs.o: vldbint.cs.c vldbint.xdr.c vldbint.xdr.o: vldbint.xdr.c vldbint.h vldbint.cs.c: vldbint.xg - ${RXGEN} -u -x -C -o $@ ${srcdir}/vldbint.xg + ${RXGEN} -A -u -x -C -o $@ ${srcdir}/vldbint.xg vldbint.ss.c: vldbint.xg - ${RXGEN} -x -S -o $@ ${srcdir}/vldbint.xg + ${RXGEN} -A -x -S -o $@ ${srcdir}/vldbint.xg vldbint.xdr.c: vldbint.xg - ${RXGEN} -x -c -o $@ ${srcdir}/vldbint.xg + ${RXGEN} -A -x -c -o $@ ${srcdir}/vldbint.xg vldbint.h: vldbint.xg - ${RXGEN} -u -x -h -o $@ ${srcdir}/vldbint.xg + ${RXGEN} -A -u -x -h -o $@ ${srcdir}/vldbint.xg vldbint.cs.c: vldbint.h vldbint.ss.c: vldbint.h vldbint.xdr.c: vldbint.h Kvldbint.cs.c: vldbint.xg - ${RXGEN} -x -k -C -o $@ ${srcdir}/vldbint.xg + ${RXGEN} -A -x -k -C -o $@ ${srcdir}/vldbint.xg Kvldbint.xdr.c: vldbint.xg - ${RXGEN} -x -k -c -o $@ ${srcdir}/vldbint.xg + ${RXGEN} -A -x -k -c -o $@ ${srcdir}/vldbint.xg libvldb.a: $(OBJS) AFS_component_version_number.o $(RM) -f $@ diff --git a/src/vlserver/cnvldb.c b/src/vlserver/cnvldb.c index dbe42d5aa9..c03dbd7748 100644 --- a/src/vlserver/cnvldb.c +++ b/src/vlserver/cnvldb.c @@ -18,14 +18,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include "cnvldb.h" /* CHANGEME! */ #include @@ -40,7 +33,6 @@ RCSID #define BADSERVERID 255 /* XXX */ -extern struct cmd_syndesc *cmd_CreateSyntax(); static char pn[] = "cnvldb"; static char tempname[] = "XXnewvldb"; static char space[MAXSIZE]; @@ -52,6 +44,10 @@ static int convert_vlentry(); static int rewrite_header(); static char tspace[1024]; /* chdir can't handle anything bigger, anyway */ + +void read_mhentries(afs_uint32 mh_addr, int oldfd); +void convert_mhentries(int oldfd, int newfd, struct vlheader_2 *header, int fromver, int tover); + /* return a static pointer to a buffer */ static char * Parent(apath) @@ -74,9 +70,8 @@ afs_int32 dbsize; char *pathname = NULL; const char *dbPath; -static -handleit(as) - struct cmd_syndesc *as; +static int +handleit(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; register afs_int32 code; @@ -366,6 +361,7 @@ struct extentaddr *base[VL_MAX_ADDREXTBLKS]; * verifying their address is not pass the EOF and the flags are good. * If it's not good, then don't read the block in. */ +void read_mhentries(mh_addr, oldfd) int oldfd; afs_uint32 mh_addr; @@ -472,6 +468,7 @@ read_mhentries(mh_addr, oldfd) * * Before this can be called, the routine read_mhentries must be called. */ +void convert_mhentries(oldfd, newfd, header, fromver, tover) int oldfd, newfd; struct vlheader_2 *header; @@ -997,7 +994,7 @@ main(argc, argv) register struct cmd_syndesc *ts; afs_int32 code; - ts = cmd_CreateSyntax("initcmd", handleit, 0, "optional"); + ts = cmd_CreateSyntax("initcmd", handleit, NULL, "optional"); cmd_AddParm(ts, "-to", CMD_SINGLE, CMD_OPTIONAL, "goal version"); cmd_AddParm(ts, "-from", CMD_SINGLE, CMD_OPTIONAL, "current version"); cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_OPTIONAL, "pathname"); diff --git a/src/vlserver/sascnvldb.c b/src/vlserver/sascnvldb.c index 956f3a3fe2..b17db693ed 100644 --- a/src/vlserver/sascnvldb.c +++ b/src/vlserver/sascnvldb.c @@ -21,6 +21,7 @@ RCSID #include "cnvldb.h" /* CHANGEME! */ #include #include +#include #ifdef notdef #include @@ -36,7 +37,6 @@ RCSID #define MAXSIZE 2048 /* most I'll get back from PIOCTL */ -extern struct cmd_syndesc *cmd_CreateSyntax(); static char pn[] = "cnvldb"; static char tempname[] = "XXnewvldb"; static char space[MAXSIZE]; @@ -148,9 +148,8 @@ QuickPrintStatus(status, name) } -static -ListQuotaCmd(as) - register struct cmd_syndesc *as; +static int +ListQuotaCmd(register struct cmd_syndesc *as, void *arock) { register afs_int32 code; struct ViceIoctl blob; diff --git a/src/vlserver/vlclient.c b/src/vlserver/vlclient.c index c7a0987bd5..152a3a97aa 100644 --- a/src/vlserver/vlclient.c +++ b/src/vlserver/vlclient.c @@ -38,14 +38,7 @@ RCSID #include #endif #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include @@ -194,9 +187,8 @@ GetServer(char *aname) } -static -handleit(as) - struct cmd_syndesc *as; +static int +handleit(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; register afs_int32 code, server = 0, sawserver = 0; @@ -1044,7 +1036,7 @@ main(argc, argv) #endif strcpy(confdir, AFSDIR_CLIENT_ETC_DIRPATH); - ts = cmd_CreateSyntax("initcmd", handleit, 0, "initialize the program"); + ts = cmd_CreateSyntax("initcmd", handleit, NULL, "initialize the program"); cmd_AddParm(ts, "-cellpath", CMD_LIST, CMD_OPTIONAL, "Cell configuration directory"); cmd_AddParm(ts, "-server", CMD_LIST, CMD_OPTIONAL, diff --git a/src/vlserver/vldb_check.c b/src/vlserver/vldb_check.c index ce574a70ab..619fd838d0 100644 --- a/src/vlserver/vldb_check.c +++ b/src/vlserver/vldb_check.c @@ -31,6 +31,7 @@ RCSID #include #include #include +#include #ifdef AFS_NT40_ENV #include #include @@ -41,14 +42,6 @@ RCSID #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include "vlserver.h" #include "vldbint.h" #include @@ -249,6 +242,7 @@ readheader(headerp) if (headerp->vital_header.headersize != sizeof(*headerp)) printf("Header reports its size as %d (should be %d)\n", headerp->vital_header.headersize, sizeof(*headerp)); + return 0; } readMH(addr, mhblockP) @@ -273,6 +267,7 @@ readMH(addr, mhblockP) for (j = 0; j < VL_MAXIPADDRS_PERMH; j++) e->ex_addrs[j] = ntohl(e->ex_addrs[j]); } + return 0; } readentry(addr, vlentryp, type) @@ -353,6 +348,7 @@ readentry(addr, vlentryp, type) } } } + return 0; } void @@ -569,6 +565,7 @@ FollowNameHash(header) ("%d entries in name hash, longest is %d, shortest is %d, average length is %f\n", count, longest, shortest, ((float)count / (float)HASHSIZE)); } + return 0; } /* @@ -642,6 +639,7 @@ FollowIdHash(header) ((float)count / (float)HASHSIZE)); } } + return 0; } /* @@ -686,6 +684,7 @@ FollowFreeChain(header) } if (verbose) printf("%d entries on free chain\n", count); + return 0; } /* @@ -896,13 +895,13 @@ CheckIpAddrs(header) printf("%d simple entries, %d multihomed entries, Total = %d\n", regentries, mhentries, mhentries + regentries); } - + return 0; } int WorkerBee(as, arock) struct cmd_syndesc *as; - char *arock; + void *arock; { char *dbfile; afs_int32 maxentries, type; diff --git a/src/vlserver/vlprocs.c b/src/vlserver/vlprocs.c index 8fceacdb5d..64caecd7b1 100644 --- a/src/vlserver/vlprocs.c +++ b/src/vlserver/vlprocs.c @@ -15,6 +15,7 @@ RCSID #include #include +#include #include #include #include @@ -25,13 +26,6 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include "vlserver.h" #include "afs/audit.h" @@ -61,17 +55,17 @@ static char rxinfo_str[128]; /* Need rxinfo string to be non-local */ static int put_attributeentry(); static int put_nattributeentry(); static int RemoveEntry(); -static ReleaseEntry(); +static void ReleaseEntry(); static int check_vldbentry(); static int check_nvldbentry(); static int vldbentry_to_vlentry(); static int nvldbentry_to_vlentry(); static get_vldbupdateentry(); static int repsite_exists(); -static repsite_compress(); -static vlentry_to_vldbentry(); -static vlentry_to_nvldbentry(); -static vlentry_to_uvldbentry(); +static void repsite_compress(); +static void vlentry_to_vldbentry(); +static void vlentry_to_nvldbentry(); +static void vlentry_to_uvldbentry(); static int InvalidVolname(); static int InvalidVoltype(); static int InvalidOperation(); @@ -2585,7 +2579,7 @@ RemoveEntry(trans, entryptr, tentry) return 0; } -static +static void ReleaseEntry(tentry, releasetype) struct nvlentry *tentry; afs_int32 releasetype; @@ -2890,7 +2884,7 @@ repsite_exists(VlEntry, server, partition) /* Repsite table compression: used when deleting a repsite entry so that all active repsite entries are on the top of the table. */ -static +static void repsite_compress(VlEntry, offset) struct nvlentry *VlEntry; int offset; @@ -2911,7 +2905,7 @@ repsite_compress(VlEntry, offset) /* Convert from the internal (compacted) vldb entry to the external representation used by the interface. */ -static +static void vlentry_to_vldbentry(VlEntry, VldbEntry) struct nvlentry *VlEntry; struct vldbentry *VldbEntry; @@ -2953,7 +2947,7 @@ vlentry_to_vldbentry(VlEntry, VldbEntry) /* Convert from the internal (compacted) vldb entry to the external representation used by the interface. */ -static +static void vlentry_to_nvldbentry(VlEntry, VldbEntry) struct nvlentry *VlEntry; struct nvldbentry *VldbEntry; @@ -2993,7 +2987,7 @@ vlentry_to_nvldbentry(VlEntry, VldbEntry) VldbEntry->flags = VlEntry->flags; } -static +static void vlentry_to_uvldbentry(VlEntry, VldbEntry) struct nvlentry *VlEntry; struct uvldbentry *VldbEntry; diff --git a/src/vlserver/vlserver.c b/src/vlserver/vlserver.c index f0b6431ad9..ee00a3075a 100644 --- a/src/vlserver/vlserver.c +++ b/src/vlserver/vlserver.c @@ -17,6 +17,7 @@ RCSID #include #include #include +#include #ifdef HAVE_FCNTL_H #include #endif @@ -36,14 +37,6 @@ RCSID #endif #include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -440,4 +433,6 @@ main(argc, argv) rx_SetRxStatUserOk(vldb_rxstat_userok); rx_StartServer(1); /* Why waste this idle process?? */ + + return 0; /* not reachable */ } diff --git a/src/vlserver/vlutils.c b/src/vlserver/vlutils.c index 4dbe7c2ead..6caeed176e 100644 --- a/src/vlserver/vlutils.c +++ b/src/vlserver/vlutils.c @@ -14,20 +14,13 @@ RCSID ("$Header$"); #include +#include #ifdef AFS_NT40_ENV #include #else #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include diff --git a/src/vol/Makefile.in b/src/vol/Makefile.in index fb1d4180ea..5cde5526eb 100644 --- a/src/vol/Makefile.in +++ b/src/vol/Makefile.in @@ -73,14 +73,14 @@ install: \ ${DESTDIR}${includedir}/afs/namei_ops.h ${DEST}/root.server/usr/afs/bin/salvager: salvager - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/root.server/usr/afs/bin/volinfo: volinfo - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/root.server/usr/afs/bin/fssync-debug: fssync-debug if test "@DEMAND_ATTACH@" = "no"; then \ - ${INSTALL} -s $? $@ ; \ + ${INSTALL} $? $@ ; \ fi ${DEST}/lib/afs/vlib.a: vlib.a @@ -90,22 +90,22 @@ ${DEST}/lib/afs/libvlib.a: vlib.a ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/fs_conv_dux40D: fs_conv_dux40D - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/xfs_size_check: xfs_size_check - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/fs_conv_sol26: fs_conv_sol26 - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ $(DEST)/root.server/usr/afs/bin/fs_conv_dux40D: fs_conv_dux40D - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ $(DEST)/root.server/usr/afs/bin/xfs_size_check: xfs_size_check - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ $(DEST)/root.server/usr/afs/bin/fs_conv_sol26: fs_conv_sol26 - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DEST}/include/afs/nfs.h: nfs.h ${INSTALL} $? $@ @@ -232,14 +232,14 @@ ${TOP_LIBDIR}/libvlib.a: vlib.a ${INSTALL} $? $@ ${DESTDIR}${afssrvlibexecdir}/salvager: salvager - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/volinfo: volinfo - ${INSTALL} -s $? $@ + ${INSTALL} $? $@ ${DESTDIR}${afssrvsbindir}/fssync-debug: fssync-debug if test "@DEMAND_ATTACH@" = "no" ; then \ - ${INSTALL} -s $? $@ ; \ + ${INSTALL} $? $@ ; \ fi ${DESTDIR}${includedir}/afs/nfs.h: nfs.h diff --git a/src/vol/clone.c b/src/vol/clone.c index 2634624371..432b3f24ba 100644 --- a/src/vol/clone.c +++ b/src/vol/clone.c @@ -38,13 +38,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/vol/daemon_com.c b/src/vol/daemon_com.c index a14e25cdad..ceff6c9855 100644 --- a/src/vol/daemon_com.c +++ b/src/vol/daemon_com.c @@ -1,5 +1,5 @@ /* - * Copyright 2006, Sine Nomine Associates and others. + * Copyright 2006-2007, Sine Nomine Associates and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public @@ -39,14 +39,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include @@ -116,7 +109,8 @@ SYNC_connect(SYNC_client_state * state) if (!*timeout) break; if (!(*timeout & 1)) - Log("SYNC_connect temporary failure (will retry)\n"); + Log("SYNC_connect: temporary failure on circuit '%s' (will retry)\n", + state->proto_name); SYNC_disconnect(state); sleep(*timeout++); } @@ -155,26 +149,16 @@ SYNC_closeChannel(SYNC_client_state * state) com.hdr.command = SYNC_COM_CHANNEL_CLOSE; com.hdr.command_len = sizeof(SYNC_command_hdr); + com.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; /* in case the other end dropped, don't do any retries */ state->retry_limit = 0; state->hard_timeout = 0; - code = SYNC_ask(state, &com, &res); - - if (code == SYNC_OK) { - if (res.hdr.response != SYNC_OK) { - Log("SYNC_closeChannel: channel shutdown request denied; closing socket anyway\n"); - } else if (!(res.hdr.flags & SYNC_FLAG_CHANNEL_SHUTDOWN)) { - Log("SYNC_closeChannel: channel shutdown request mishandled by server\n"); - } - } else { - Log("SYNC_closeChannel: channel communications problem"); - } - + SYNC_ask(state, &com, &res); SYNC_disconnect(state); - return code; + return SYNC_OK; } int @@ -249,21 +233,28 @@ SYNC_ask(SYNC_client_state * state, SYNC_command * com, SYNC_response * res) if (code == SYNC_OK) { break; } else if (code == SYNC_BAD_COMMAND) { - Log("SYNC_ask: protocol mismatch; make sure fileserver, volserver, salvageserver and salvager are same version\n"); + Log("SYNC_ask: protocol mismatch on circuit '%s'; make sure " + "fileserver, volserver, salvageserver and salvager are same " + "version\n", state->proto_name); break; - } else if (code == SYNC_COM_ERROR) { - Log("SYNC_ask: protocol communications failure; attempting reconnect to server\n"); + } else if ((code == SYNC_COM_ERROR) && (tries < state->retry_limit)) { + Log("SYNC_ask: protocol communications failure on circuit '%s'; " + "attempting reconnect to server\n", state->proto_name); SYNC_reconnect(state); /* try again */ } else { - /* unknown (probably protocol-specific) response code, pass it up to the caller, and let them deal with it */ + /* + * unknown (probably protocol-specific) response code, pass it up to + * the caller, and let them deal with it + */ break; } } if (code == SYNC_COM_ERROR) { - Log("SYNC_ask: fatal protocol error; disabling sync protocol to server running on port %d until next server restart\n", - state->port); + Log("SYNC_ask: fatal protocol error on circuit '%s'; disabling sync " + "protocol to server running on port %d until next server restart\n", + state->proto_name, state->port); state->fatal_error = 1; } @@ -281,13 +272,15 @@ SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * #endif if (state->fd == -1) { - Log("SYNC_ask: invalid sync file descriptor\n"); + Log("SYNC_ask: invalid sync file descriptor on circuit '%s'\n", + state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } if (com->hdr.command_len > SYNC_PROTO_MAX_LEN) { - Log("SYNC_ask: internal SYNC buffer too small; please file a bug\n"); + Log("SYNC_ask: internal SYNC buffer too small on circuit '%s'; " + "please file a bug\n", state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } @@ -303,25 +296,37 @@ SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * #ifdef AFS_NT40_ENV n = send(state->fd, buf, com->hdr.command_len, 0); if (n != com->hdr.command_len) { - Log("SYNC_ask: write failed\n"); + Log("SYNC_ask: write failed on circuit '%s'\n", state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } + if (com->hdr.command == SYNC_COM_CHANNEL_CLOSE) { + /* short circuit close channel requests */ + res->hdr.response = SYNC_OK; + goto done; + } + n = recv(state->fd, buf, SYNC_PROTO_MAX_LEN, 0); if (n == 0 || (n < 0 && WSAEINTR != WSAGetLastError())) { - Log("SYNC_ask: No response\n"); + Log("SYNC_ask: No response on circuit '%s'\n", state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } #else /* !AFS_NT40_ENV */ n = write(state->fd, buf, com->hdr.command_len); if (com->hdr.command_len != n) { - Log("SYNC_ask: write failed\n"); + Log("SYNC_ask: write failed on circuit '%s'\n", state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } + if (com->hdr.command == SYNC_COM_CHANNEL_CLOSE) { + /* short circuit close channel requests */ + res->hdr.response = SYNC_OK; + goto done; + } + /* receive the response */ iov[0].iov_base = (char *)&res->hdr; iov[0].iov_len = sizeof(res->hdr); @@ -334,7 +339,7 @@ SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * } n = readv(state->fd, iov, iovcnt); if (n == 0 || (n < 0 && errno != EINTR)) { - Log("SYNC_ask: No response\n"); + Log("SYNC_ask: No response on circuit '%s'\n", state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } @@ -343,7 +348,8 @@ SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * res->recv_len = n; if (n < sizeof(res->hdr)) { - Log("SYNC_ask: response too short\n"); + Log("SYNC_ask: response too short on circuit '%s'\n", + state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } @@ -352,7 +358,8 @@ SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * #endif if ((n - sizeof(res->hdr)) > res->payload.len) { - Log("SYNC_ask: response too long\n"); + Log("SYNC_ask: response too long on circuit '%s'\n", + state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } @@ -361,12 +368,13 @@ SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * #endif if (res->hdr.response_len != n) { - Log("SYNC_ask: length field in response inconsistent\n"); + Log("SYNC_ask: length field in response inconsistent " + "on circuit '%s'\n", state->proto_name); res->hdr.response = SYNC_COM_ERROR; goto done; } if (res->hdr.response == SYNC_DENIED) { - Log("SYNC_ask: negative response\n"); + Log("SYNC_ask: negative response on circuit '%s'\n", state->proto_name); } done: diff --git a/src/vol/daemon_com.h b/src/vol/daemon_com.h index 846436783f..3c6102125f 100644 --- a/src/vol/daemon_com.h +++ b/src/vol/daemon_com.h @@ -1,5 +1,5 @@ /* - * Copyright 2006, Sine Nomine Associates and others. + * Copyright 2006-2007, Sine Nomine Associates and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public @@ -53,7 +53,7 @@ /* general reason codes */ #define SYNC_REASON_NONE 0 #define SYNC_REASON_MALFORMED_PACKET 1 - +#define SYNC_REASON_NOMEM 2 /* SYNC protocol flags * @@ -84,6 +84,7 @@ typedef struct SYNC_client_state { afs_uint32 proto_version; int retry_limit; /* max number of times for SYNC_ask to retry */ afs_int32 hard_timeout; /* upper limit on time to keep trying */ + char * proto_name; /**< sync protocol associated with this conn */ byte fatal_error; /* fatal error on this client conn */ } SYNC_client_state; diff --git a/src/vol/devname.c b/src/vol/devname.c index f614bc3b90..c06544a611 100644 --- a/src/vol/devname.c +++ b/src/vol/devname.c @@ -16,6 +16,7 @@ RCSID #include #include #include +#include #include #if !defined(AFS_SGI_ENV) #ifdef AFS_OSF_ENV @@ -87,16 +88,6 @@ RCSID #endif /* ITIMER_REAL */ #include "partition.h" - -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - - /* ensure that we don't have a "/" instead of a "/dev/rxd0a" type of device. * returns pointer to static storage; copy it out quickly! */ diff --git a/src/vol/fssync-client.c b/src/vol/fssync-client.c index 205a08953d..d983b4cae8 100644 --- a/src/vol/fssync-client.c +++ b/src/vol/fssync-client.c @@ -65,15 +65,7 @@ RCSID #include #endif /* AFS_PTHREAD_ENV */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include @@ -100,7 +92,14 @@ RCSID extern int LogLevel; -static SYNC_client_state fssync_state = { -1, 2040, FSYNC_PROTO_VERSION, 5, 120 }; +static SYNC_client_state fssync_state = + { -1, /* file descriptor */ + 2040, /* port number */ + FSYNC_PROTO_VERSION, /* protocol version */ + 5, /* connect retry limit */ + 120, /* hard timeout */ + "FSSYNC", /* protocol name string */ + }; #ifdef AFS_PTHREAD_ENV static pthread_mutex_t vol_fsync_mutex; diff --git a/src/vol/fssync-debug.c b/src/vol/fssync-debug.c index 194204e8ba..1dadf9639e 100644 --- a/src/vol/fssync-debug.c +++ b/src/vol/fssync-debug.c @@ -89,17 +89,17 @@ static char * command_code_to_string(afs_int32); static char * reason_code_to_string(afs_int32); static char * program_type_to_string(afs_int32); -static int VolOnline(struct cmd_syndesc * as, char * rock); -static int VolOffline(struct cmd_syndesc * as, char * rock); -static int VolMode(struct cmd_syndesc * as, char * rock); -static int VolDetach(struct cmd_syndesc * as, char * rock); -static int VolBreakCBKs(struct cmd_syndesc * as, char * rock); -static int VolMove(struct cmd_syndesc * as, char * rock); -static int VolList(struct cmd_syndesc * as, char * rock); -static int VolQuery(struct cmd_syndesc * as, char * rock); -static int VolHdrQuery(struct cmd_syndesc * as, char * rock); -static int VolOpQuery(struct cmd_syndesc * as, char * rock); -static int StatsQuery(struct cmd_syndesc * as, char * rock); +static int VolOnline(struct cmd_syndesc * as, void * rock); +static int VolOffline(struct cmd_syndesc * as, void * rock); +static int VolMode(struct cmd_syndesc * as, void * rock); +static int VolDetach(struct cmd_syndesc * as, void * rock); +static int VolBreakCBKs(struct cmd_syndesc * as, void * rock); +static int VolMove(struct cmd_syndesc * as, void * rock); +static int VolList(struct cmd_syndesc * as, void * rock); +static int VolQuery(struct cmd_syndesc * as, void * rock); +static int VolHdrQuery(struct cmd_syndesc * as, void * rock); +static int VolOpQuery(struct cmd_syndesc * as, void * rock); +static int StatsQuery(struct cmd_syndesc * as, void * rock); static void print_vol_stats_general(VolPkgStats * stats); @@ -154,43 +154,43 @@ main(int argc, char **argv) } - ts = cmd_CreateSyntax("online", VolOnline, 0, "bring a volume online (FSYNC_VOL_ON opcode)"); + ts = cmd_CreateSyntax("online", VolOnline, NULL, "bring a volume online (FSYNC_VOL_ON opcode)"); VOLOP_PARMS_DECL(ts); - ts = cmd_CreateSyntax("offline", VolOffline, 0, "take a volume offline (FSYNC_VOL_OFF opcode)"); + ts = cmd_CreateSyntax("offline", VolOffline, NULL, "take a volume offline (FSYNC_VOL_OFF opcode)"); VOLOP_PARMS_DECL(ts); - ts = cmd_CreateSyntax("mode", VolMode, 0, "change volume attach mode (FSYNC_VOL_NEEDVOLUME opcode)"); + ts = cmd_CreateSyntax("mode", VolMode, NULL, "change volume attach mode (FSYNC_VOL_NEEDVOLUME opcode)"); VOLOP_PARMS_DECL(ts); cmd_CreateAlias(ts, "needvolume"); - ts = cmd_CreateSyntax("detach", VolDetach, 0, "detach a volume (FSYNC_VOL_DONE opcode)"); + ts = cmd_CreateSyntax("detach", VolDetach, NULL, "detach a volume (FSYNC_VOL_DONE opcode)"); VOLOP_PARMS_DECL(ts); - ts = cmd_CreateSyntax("callback", VolBreakCBKs, 0, "break callbacks for volume (FSYNC_VOL_BREAKCBKS opcode)"); + ts = cmd_CreateSyntax("callback", VolBreakCBKs, NULL, "break callbacks for volume (FSYNC_VOL_BREAKCBKS opcode)"); VOLOP_PARMS_DECL(ts); cmd_CreateAlias(ts, "cbk"); - ts = cmd_CreateSyntax("move", VolMove, 0, "set volume moved flag (FSYNC_VOL_MOVE opcode)"); + ts = cmd_CreateSyntax("move", VolMove, NULL, "set volume moved flag (FSYNC_VOL_MOVE opcode)"); VOLOP_PARMS_DECL(ts); - ts = cmd_CreateSyntax("list", VolList, 0, "sync local volume list (FSYNC_VOL_LISTVOLUMES opcode)"); + ts = cmd_CreateSyntax("list", VolList, NULL, "sync local volume list (FSYNC_VOL_LISTVOLUMES opcode)"); VOLOP_PARMS_DECL(ts); cmd_CreateAlias(ts, "ls"); - ts = cmd_CreateSyntax("query", VolQuery, 0, "get volume structure (FSYNC_VOL_QUERY opcode)"); + ts = cmd_CreateSyntax("query", VolQuery, NULL, "get volume structure (FSYNC_VOL_QUERY opcode)"); VOLOP_PARMS_DECL(ts); cmd_CreateAlias(ts, "qry"); - ts = cmd_CreateSyntax("header", VolHdrQuery, 0, "get volume disk data structure (FSYNC_VOL_QUERY_HDR opcode)"); + ts = cmd_CreateSyntax("header", VolHdrQuery, NULL, "get volume disk data structure (FSYNC_VOL_QUERY_HDR opcode)"); VOLOP_PARMS_DECL(ts); cmd_CreateAlias(ts, "hdr"); - ts = cmd_CreateSyntax("volop", VolOpQuery, 0, "get pending volume operation info (FSYNC_VOL_QUERY_VOP opcode)"); + ts = cmd_CreateSyntax("volop", VolOpQuery, NULL, "get pending volume operation info (FSYNC_VOL_QUERY_VOP opcode)"); VOLOP_PARMS_DECL(ts); cmd_CreateAlias(ts, "vop"); - ts = cmd_CreateSyntax("stats", StatsQuery, 0, "see 'stats help' for more information"); + ts = cmd_CreateSyntax("stats", StatsQuery, NULL, "see 'stats help' for more information"); cmd_Seek(ts, CUSTOM_PARMS_OFFSET); cmd_AddParm(ts, "-cmd", CMD_SINGLE, 0, "subcommand"); cmd_AddParm(ts, "-arg1", CMD_SINGLE, CMD_OPTIONAL, "arg1"); @@ -412,7 +412,7 @@ program_type_to_string(afs_int32 type) } static int -VolOnline(struct cmd_syndesc * as, char * rock) +VolOnline(struct cmd_syndesc * as, void * rock) { struct state state; @@ -425,7 +425,7 @@ VolOnline(struct cmd_syndesc * as, char * rock) } static int -VolOffline(struct cmd_syndesc * as, char * rock) +VolOffline(struct cmd_syndesc * as, void * rock) { struct state state; @@ -438,7 +438,7 @@ VolOffline(struct cmd_syndesc * as, char * rock) } static int -VolMode(struct cmd_syndesc * as, char * rock) +VolMode(struct cmd_syndesc * as, void * rock) { struct state state; @@ -451,7 +451,7 @@ VolMode(struct cmd_syndesc * as, char * rock) } static int -VolDetach(struct cmd_syndesc * as, char * rock) +VolDetach(struct cmd_syndesc * as, void * rock) { struct state state; @@ -464,7 +464,7 @@ VolDetach(struct cmd_syndesc * as, char * rock) } static int -VolBreakCBKs(struct cmd_syndesc * as, char * rock) +VolBreakCBKs(struct cmd_syndesc * as, void * rock) { struct state state; @@ -477,7 +477,7 @@ VolBreakCBKs(struct cmd_syndesc * as, char * rock) } static int -VolMove(struct cmd_syndesc * as, char * rock) +VolMove(struct cmd_syndesc * as, void * rock) { struct state state; @@ -490,7 +490,7 @@ VolMove(struct cmd_syndesc * as, char * rock) } static int -VolList(struct cmd_syndesc * as, char * rock) +VolList(struct cmd_syndesc * as, void * rock) { struct state state; @@ -636,7 +636,7 @@ vlru_idx_to_string(int idx) #endif static int -VolQuery(struct cmd_syndesc * as, char * rock) +VolQuery(struct cmd_syndesc * as, void * rock) { struct state state; SYNC_PROTO_BUF_DECL(res_buf); @@ -765,7 +765,7 @@ VolQuery(struct cmd_syndesc * as, char * rock) } static int -VolHdrQuery(struct cmd_syndesc * as, char * rock) +VolHdrQuery(struct cmd_syndesc * as, void * rock) { struct state state; SYNC_PROTO_BUF_DECL(res_buf); @@ -836,7 +836,7 @@ VolHdrQuery(struct cmd_syndesc * as, char * rock) } static int -VolOpQuery(struct cmd_syndesc * as, char * rock) +VolOpQuery(struct cmd_syndesc * as, void * rock) { struct state state; SYNC_PROTO_BUF_DECL(res_buf); @@ -892,7 +892,7 @@ VolOpQuery(struct cmd_syndesc * as, char * rock) } static int -StatsQuery(struct cmd_syndesc * as, char * rock) +StatsQuery(struct cmd_syndesc * as, void * rock) { afs_int32 code; int command; diff --git a/src/vol/fssync-server.c b/src/vol/fssync-server.c index 08c917544e..0d135cb6fd 100644 --- a/src/vol/fssync-server.c +++ b/src/vol/fssync-server.c @@ -6,7 +6,7 @@ * License. For details, see the LICENSE file in the top-level source * directory or online at http://www.openafs.org/dl/license10.html * - * Portions Copyright (c) 2006 Sine Nomine Associates + * Portions Copyright (c) 2006-2007 Sine Nomine Associates */ /* @@ -74,15 +74,7 @@ RCSID #include #endif /* AFS_PTHREAD_ENV */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include @@ -98,6 +90,10 @@ RCSID #include "volume.h" #include "partition.h" +#ifdef HAVE_POLL +#include +#endif /* HAVE_POLL */ + #ifdef USE_UNIX_SOCKETS #include #include @@ -140,13 +136,17 @@ static void FSYNC_Drop(); static void AcceptOn(); static void AcceptOff(); static void InitHandler(); -static void CallHandler(fd_set * fdsetp); static int AddHandler(); static int FindHandler(); static int FindHandler_r(); static int RemoveHandler(); +#if defined(HAVE_POLL) && defined (AFS_PTHREAD_ENV) +static void CallHandler(struct pollfd *fds, int nfds, int mask); +static void GetHandler(struct pollfd *fds, int maxfds, int events, int *nfds); +#else +static void CallHandler(fd_set * fdsetp); static void GetHandler(fd_set * fdsetp, int *maxfdp); - +#endif extern int LogLevel; static afs_int32 FSYNC_com_VolOp(int fd, SYNC_command * com, SYNC_response * res); @@ -203,7 +203,11 @@ FSYNC_fsInit(void) #endif /* AFS_PTHREAD_ENV */ } +#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV) +static struct pollfd FSYNC_readfds[MAXHANDLERS]; +#else static fd_set FSYNC_readfds; +#endif #ifdef USE_UNIX_SOCKETS static int @@ -309,6 +313,12 @@ FSYNC_sync() InitHandler(); AcceptOn(); for (;;) { +#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV) + int nfds; + GetHandler(FSYNC_readfds, MAXHANDLERS, POLLIN|POLLPRI, &nfds); + if (poll(FSYNC_readfds, nfds, -1) >=1) + CallHandler(FSYNC_readfds, nfds, POLLIN|POLLPRI); +#else int maxfd; GetHandler(&FSYNC_readfds, &maxfd); /* Note: check for >= 1 below is essential since IOMGR_select @@ -320,6 +330,7 @@ FSYNC_sync() if (IOMGR_Select(maxfd + 1, &FSYNC_readfds, NULL, NULL, NULL) >= 1) #endif /* AFS_PTHREAD_ENV */ CallHandler(&FSYNC_readfds); +#endif } } @@ -369,6 +380,14 @@ FSYNC_com(int fd) return; } + if (com.recv_len < sizeof(com.hdr)) { + Log("FSSYNC_com: invalid protocol message length (%u)\n", com.recv_len); + res.hdr.response = SYNC_COM_ERROR; + res.hdr.reason = SYNC_REASON_MALFORMED_PACKET; + res.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; + goto respond; + } + if (com.hdr.proto_version != FSYNC_PROTO_VERSION) { Log("FSYNC_com: invalid protocol version (%u)\n", com.hdr.proto_version); res.hdr.response = SYNC_COM_ERROR; @@ -376,6 +395,13 @@ FSYNC_com(int fd) goto respond; } + if (com.hdr.command == SYNC_COM_CHANNEL_CLOSE) { + res.hdr.response = SYNC_OK; + res.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; + goto respond; + } + + VOL_LOCK; switch (com.hdr.command) { case FSYNC_VOL_ON: @@ -397,10 +423,6 @@ FSYNC_com(int fd) case FSYNC_VOL_STATS_VLRU: res.hdr.response = FSYNC_com_StatsOp(fd, &com, &res); break; - case SYNC_COM_CHANNEL_CLOSE: - res.hdr.response = SYNC_OK; - res.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; - break; default: res.hdr.response = SYNC_BAD_COMMAND; break; @@ -1129,6 +1151,24 @@ InitHandler() ReleaseWriteLock(&FSYNC_handler_lock); } +#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV) +static void +CallHandler(struct pollfd *fds, int nfds, int mask) +{ + int i; + int handler; + ObtainReadLock(&FSYNC_handler_lock); + for (i = 0; i < nfds; i++) { + if (fds[i].revents & mask) { + handler = FindHandler_r(fds[i].fd); + ReleaseReadLock(&FSYNC_handler_lock); + (*HandlerProc[handler]) (fds[i].fd); + ObtainReadLock(&FSYNC_handler_lock); + } + } + ReleaseReadLock(&FSYNC_handler_lock); +} +#else static void CallHandler(fd_set * fdsetp) { @@ -1143,6 +1183,7 @@ CallHandler(fd_set * fdsetp) } ReleaseReadLock(&FSYNC_handler_lock); } +#endif static int AddHandler(int afd, int (*aproc) ()) @@ -1198,6 +1239,24 @@ RemoveHandler(register int afd) return 1; } +#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV) +static void +GetHandler(struct pollfd *fds, int maxfds, int events, int *nfds) +{ + int i; + int fdi = 0; + ObtainReadLock(&FSYNC_handler_lock); + for (i = 0; i < MAXHANDLERS; i++) + if (HandlerFD[i] != -1) { + assert(fdi #include #include +#include #ifdef AFS_NT40_ENV #include #else @@ -31,13 +32,7 @@ RCSID #include #endif #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif + #include #include #include @@ -325,9 +320,10 @@ ih_open(IHandle_t * ihP) */ fdInUseCount += 1; IH_UNLOCK; +ih_open_retry: fd = OS_IOPEN(ihP); IH_LOCK; - if (fd == INVALID_FD) { + if (fd == INVALID_FD && (errno != EMFILE || fdLruHead == NULL) ) { fdInUseCount -= 1; IH_UNLOCK; return NULL; @@ -337,13 +333,23 @@ ih_open(IHandle_t * ihP) * we permit the number of open files to exceed fdCacheSize. * We only recycle open file descriptors when the number * of open files reaches the size of the cache */ - if (fdInUseCount > fdCacheSize && fdLruHead != NULL) { + if ((fdInUseCount > fdCacheSize || fd == INVALID_FD) && fdLruHead != NULL) { fdP = fdLruHead; assert(fdP->fd_status == FD_HANDLE_OPEN); DLL_DELETE(fdP, fdLruHead, fdLruTail, fd_next, fd_prev); DLL_DELETE(fdP, fdP->fd_ih->ih_fdhead, fdP->fd_ih->ih_fdtail, fd_ihnext, fd_ihprev); closeFd = fdP->fd_fd; + if (fd == INVALID_FD) { + fdCacheSize--; /* reduce in order to not run into here too often */ + DLL_INSERT_TAIL(fdP, fdAvailHead, fdAvailTail, fd_next, fd_prev); + fdP->fd_status = FD_HANDLE_AVAIL; + fdP->fd_ih = NULL; + fdP->fd_fd = INVALID_FD; + IH_UNLOCK; + OS_CLOSE(closeFd); + goto ih_open_retry; + } } else { if (fdAvailHead == NULL) { fdHandleAllocateChunk(); diff --git a/src/vol/listinodes.c b/src/vol/listinodes.c index 8342b19676..254a40f306 100644 --- a/src/vol/listinodes.c +++ b/src/vol/listinodes.c @@ -20,6 +20,8 @@ #include #include +#include + RCSID ("$Header$"); @@ -107,7 +109,13 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, #if defined(AFS_HPUX101_ENV) #include #endif +#include "lock.h" +#include "ihandle.h" +#include "vnode.h" +#include "volume.h" +#include "volinodes.h" #include "partition.h" +#include "fssync.h" /*@+fcnmacros +macrofcndecl@*/ #ifdef O_LARGEFILE @@ -276,10 +284,12 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, return -1; } - inodeFile = fopen(resultFile, "w"); - if (inodeFile == NULL) { - Log("Unable to create inode description file %s\n", resultFile); - goto out; + if (resultFile) { + inodeFile = fopen(resultFile, "w"); + if (inodeFile == NULL) { + Log("Unable to create inode description file %s\n", resultFile); + goto out; + } } /* @@ -323,43 +333,47 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, if (judgeInode && (*judgeInode) (&info, judgeParam, rock) == 0) continue; - if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { - Log("Error writing inode file for partition %s\n", partition); - goto out; + if (inodeFile) { + if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { + Log("Error writing inode file for partition %s\n", partition); + goto out; + } } ++ninodes; } - if (fflush(inodeFile) == EOF) { - Log("Unable to successfully flush inode file for %s\n", partition); - err = -2; - goto out1; - } - if (fsync(fileno(inodeFile)) == -1) { - Log("Unable to successfully fsync inode file for %s\n", partition); - err = -2; - goto out1; - } - if (fclose(inodeFile) == EOF) { - Log("Unable to successfully close inode file for %s\n", partition); - err = -2; - goto out1; - } + if (inodeFile) { + if (fflush(inodeFile) == EOF) { + Log("Unable to successfully flush inode file for %s\n", partition); + err = -2; + goto out1; + } + if (fsync(fileno(inodeFile)) == -1) { + Log("Unable to successfully fsync inode file for %s\n", partition); + err = -2; + goto out1; + } + if (fclose(inodeFile) == EOF) { + Log("Unable to successfully close inode file for %s\n", partition); + err = -2; + goto out1; + } - /* - * Paranoia: check that the file is really the right size - */ - if (stat(resultFile, &status) == -1) { - Log("Unable to successfully stat inode file for %s\n", partition); - err = -2; - goto out1; - } - if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { - Log("Wrong size (%d instead of %d) in inode file for %s\n", - status.st_size, ninodes * sizeof(struct ViceInodeInfo), - partition); - err = -2; - goto out1; + /* + * Paranoia: check that the file is really the right size + */ + if (stat(resultFile, &status) == -1) { + Log("Unable to successfully stat inode file for %s\n", partition); + err = -2; + goto out1; + } + if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { + Log("Wrong size (%d instead of %d) in inode file for %s\n", + status.st_size, ninodes * sizeof(struct ViceInodeInfo), + partition); + err = -2; + goto out1; + } } close(pfd); return 0; @@ -522,10 +536,12 @@ efs_ListViceInodes(char *devname, char *mountedOn, char *resultFile, return -1; } - inodeFile = fopen(resultFile, "w"); - if (inodeFile == NULL) { - Log("Unable to create inode description file %s\n", resultFile); - goto out; + if (resultFile) { + inodeFile = fopen(resultFile, "w"); + if (inodeFile == NULL) { + Log("Unable to create inode description file %s\n", resultFile); + goto out; + } } /* Allocate space for one cylinder group's worth of inodes. */ @@ -592,43 +608,47 @@ efs_ListViceInodes(char *devname, char *mountedOn, char *resultFile, if (judgeInode && (*judgeInode) (&info, judgeParam, rock) == 0) continue; - if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { - Log("Error writing inode file for partition %s\n", partition); - goto out; + if (inodeFile) { + if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { + Log("Error writing inode file for partition %s\n", partition); + goto out; + } } ++ninodes; } - if (fflush(inodeFile) == EOF) { - Log("Unable to successfully flush inode file for %s\n", partition); - err = -2; - goto out1; - } - if (fsync(fileno(inodeFile)) == -1) { - Log("Unable to successfully fsync inode file for %s\n", partition); - err = -2; - goto out1; - } - if (fclose(inodeFile) == EOF) { - Log("Unable to successfully close inode file for %s\n", partition); - err = -2; - goto out1; - } + if (inodeFile) { + if (fflush(inodeFile) == EOF) { + Log("Unable to successfully flush inode file for %s\n", partition); + err = -2; + goto out1; + } + if (fsync(fileno(inodeFile)) == -1) { + Log("Unable to successfully fsync inode file for %s\n", partition); + err = -2; + goto out1; + } + if (fclose(inodeFile) == EOF) { + Log("Unable to successfully close inode file for %s\n", partition); + err = -2; + goto out1; + } - /* - * Paranoia: check that the file is really the right size - */ - if (stat(resultFile, &status) == -1) { - Log("Unable to successfully stat inode file for %s\n", partition); - err = -2; - goto out1; - } - if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { - Log("Wrong size (%d instead of %d) in inode file for %s\n", - status.st_size, ninodes * sizeof(struct ViceInodeInfo), - partition); - err = -2; - goto out1; + /* + * Paranoia: check that the file is really the right size + */ + if (stat(resultFile, &status) == -1) { + Log("Unable to successfully stat inode file for %s\n", partition); + err = -2; + goto out1; + } + if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { + Log("Wrong size (%d instead of %d) in inode file for %s\n", + status.st_size, ninodes * sizeof(struct ViceInodeInfo), + partition); + err = -2; + goto out1; + } } efs_umount(mp); if (dinodeBuf) { @@ -876,10 +896,12 @@ xfs_ListViceInodes(char *devname, char *mountedOn, char *resultFile, return -1; } - inodeFile = fopen(resultFile, "w"); - if (inodeFile == NULL) { - Log("Unable to create inode description file %s\n", resultFile); - return -1; + if (resultFile) { + inodeFile = fopen(resultFile, "w"); + if (inodeFile == NULL) { + Log("Unable to create inode description file %s\n", resultFile); + return -1; + } } if ((top_dirp = opendir(mountedOn)) == NULL) { @@ -983,11 +1005,11 @@ xfs_ListViceInodes(char *devname, char *mountedOn, char *resultFile, n_renames++; } - if (fwrite - (&info.ili_info, sizeof(vice_inode_info_t), 1, inodeFile) - != 1) { - Log("Error writing inode file for partition %s\n", mountedOn); - goto err1_exit; + if (inodeFile) { + if (fwrite(&info.ili_info, sizeof(vice_inode_info_t), 1, inodeFile) != 1) { + Log("Error writing inode file for partition %s\n", mountedOn); + goto err1_exit; + } } ninodes++; @@ -1006,32 +1028,35 @@ xfs_ListViceInodes(char *devname, char *mountedOn, char *resultFile, closedir(top_dirp); if (renames) free((char *)renames); - if (fflush(inodeFile) == EOF) { - ("Unable to successfully flush inode file for %s\n", mountedOn); - fclose(inodeFile); - return errors ? -1 : -2; - } - if (fsync(fileno(inodeFile)) == -1) { - Log("Unable to successfully fsync inode file for %s\n", mountedOn); - fclose(inodeFile); - return errors ? -1 : -2; - } - if (fclose(inodeFile) == EOF) { - Log("Unable to successfully close inode file for %s\n", mountedOn); - return errors ? -1 : -2; - } - /* - * Paranoia: check that the file is really the right size - */ - if (stat(resultFile, &status) == -1) { - Log("Unable to successfully stat inode file for %s\n", partition); - return errors ? -1 : -2; - } - if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { - Log("Wrong size (%d instead of %d) in inode file for %s\n", - status.st_size, ninodes * sizeof(struct ViceInodeInfo), - partition); - return errors ? -1 : -2; + + if (inodeFile) { + if (fflush(inodeFile) == EOF) { + ("Unable to successfully flush inode file for %s\n", mountedOn); + fclose(inodeFile); + return errors ? -1 : -2; + } + if (fsync(fileno(inodeFile)) == -1) { + Log("Unable to successfully fsync inode file for %s\n", mountedOn); + fclose(inodeFile); + return errors ? -1 : -2; + } + if (fclose(inodeFile) == EOF) { + Log("Unable to successfully close inode file for %s\n", mountedOn); + return errors ? -1 : -2; + } + /* + * Paranoia: check that the file is really the right size + */ + if (stat(resultFile, &status) == -1) { + Log("Unable to successfully stat inode file for %s\n", partition); + return errors ? -1 : -2; + } + if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { + Log("Wrong size (%d instead of %d) in inode file for %s\n", + status.st_size, ninodes * sizeof(struct ViceInodeInfo), + partition); + return errors ? -1 : -2; + } } if (errors) { @@ -1186,10 +1211,12 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, goto out; } - inodeFile = fopen(resultFile, "w"); - if (inodeFile == NULL) { - Log("Unable to create inode description file %s\n", resultFile); - goto out; + if (resultFile) { + inodeFile = fopen(resultFile, "w"); + if (inodeFile == NULL) { + Log("Unable to create inode description file %s\n", resultFile); + goto out; + } } #ifdef AFS_AIX_ENV /* @@ -1233,9 +1260,11 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, info.u.param[3] = auxp->aux_param4; if (judgeInode && (*judgeInode) (&info, judgeParam, rock) == 0) continue; - if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { - Log("Error writing inode file for partition %s\n", partition); - goto out; + if (inodeFile) { + if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { + Log("Error writing inode file for partition %s\n", partition); + goto out; + } } ninodes++; } @@ -1442,10 +1471,12 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, info.linkCount = p->di_nlink; if (judgeInode && (*judgeInode) (&info, judgeParam, rock) == 0) continue; - if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { - Log("Error writing inode file for partition %s\n", - partition); - goto out; + if (inodeFile) { + if (fwrite(&info, sizeof info, 1, inodeFile) != 1) { + Log("Error writing inode file for partition %s\n", + partition); + goto out; + } } ninodes++; } @@ -1455,36 +1486,38 @@ ListViceInodes(char *devname, char *mountedOn, char *resultFile, if (inodes) free(inodes); #endif - if (fflush(inodeFile) == EOF) { - Log("Unable to successfully flush inode file for %s\n", partition); - err = -2; - goto out1; - } - if (fsync(fileno(inodeFile)) == -1) { - Log("Unable to successfully fsync inode file for %s\n", partition); - err = -2; - goto out1; - } - if (fclose(inodeFile) == EOF) { - Log("Unable to successfully close inode file for %s\n", partition); - err = -2; - goto out1; - } - - /* - * Paranoia: check that the file is really the right size - */ - if (stat(resultFile, &status) == -1) { - Log("Unable to successfully stat inode file for %s\n", partition); - err = -2; - goto out1; - } - if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { - Log("Wrong size (%d instead of %d) in inode file for %s\n", - status.st_size, ninodes * sizeof(struct ViceInodeInfo), - partition); - err = -2; - goto out1; + if (inodeFile) { + if (fflush(inodeFile) == EOF) { + Log("Unable to successfully flush inode file for %s\n", partition); + err = -2; + goto out1; + } + if (fsync(fileno(inodeFile)) == -1) { + Log("Unable to successfully fsync inode file for %s\n", partition); + err = -2; + goto out1; + } + if (fclose(inodeFile) == EOF) { + Log("Unable to successfully close inode file for %s\n", partition); + err = -2; + goto out1; + } + + /* + * Paranoia: check that the file is really the right size + */ + if (stat(resultFile, &status) == -1) { + Log("Unable to successfully stat inode file for %s\n", partition); + err = -2; + goto out1; + } + if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) { + Log("Wrong size (%d instead of %d) in inode file for %s\n", + status.st_size, ninodes * sizeof(struct ViceInodeInfo), + partition); + err = -2; + goto out1; + } } close(pfd); return 0; @@ -1535,4 +1568,225 @@ bread(int fd, char *buf, daddr_t blk, afs_int32 size) } #endif /* AFS_LINUX20_ENV */ +static afs_int32 +convertVolumeInfo(int fdr, int fdw, afs_uint32 vid) +{ + struct VolumeDiskData vd; + char *p; + + if (read(fdr, &vd, sizeof(struct VolumeDiskData)) != + sizeof(struct VolumeDiskData)) { + Log("1 convertiVolumeInfo: read failed for %lu with code %d\n", vid, + errno); + return -1; + } + vd.restoredFromId = vd.id; /* remember the RO volume here */ + vd.cloneId = vd.id; + vd.id = vd.parentId; + vd.type = RWVOL; + vd.dontSalvage = 0; + vd.inUse = 0; + vd.uniquifier += 5000; /* just in case there are still file copies + from the old RW volume around */ + + p = strrchr(vd.name, '.'); + if (p && !strcmp(p, ".readonly")) { + memset(p, 0, 9); + } + + if (write(fdw, &vd, sizeof(struct VolumeDiskData)) != + sizeof(struct VolumeDiskData)) { + Log("1 convertiVolumeInfo: write failed for %lu with code %d\n", vid, + errno); + return -1; + } + return 0; +} + +struct specino { + afs_int32 inodeType; + Inode inodeNumber; + Inode ninodeNumber; +}; + + +int +UpdateThisVolume(struct ViceInodeInfo *inodeinfo, VolumeId singleVolumeNumber, + struct specino *specinos) +{ + struct dinode *p; + if ((inodeinfo->u.vnode.vnodeNumber == INODESPECIAL) && + (inodeinfo->u.vnode.volumeId == singleVolumeNumber)) { + specinos[inodeinfo->u.special.type].inodeNumber = + inodeinfo->inodeNumber; + } + return 0; /* We aren't using a result file, we're caching */ +} + +static char * +getDevName(char *pbuffer, char *wpath) +{ + char pbuf[128], *ptr; + strcpy(pbuf, pbuffer); + ptr = (char *)strrchr(pbuf, '/'); + if (ptr) { + *ptr = '\0'; + strcpy(wpath, pbuf); + } else + return NULL; + ptr = (char *)strrchr(pbuffer, '/'); + if (ptr) { + strcpy(pbuffer, ptr + 1); + return pbuffer; + } else + return NULL; +} + +#ifdef FSSYNC_BUILD_CLIENT +int +inode_ConvertROtoRWvolume(char *pname, afs_int32 volumeId) +{ + char dir_name[512], oldpath[512], newpath[512]; + char volname[20]; + char headername[16]; + char *name; + int fd, err, forcep, len, j, code; + struct dirent *dp; + struct DiskPartition *partP; + struct ViceInodeInfo info; + struct VolumeDiskHeader h; + IHandle_t *ih, *ih2; + FdHandle_t *fdP, *fdP2; + char wpath[100]; + char tmpDevName[100]; + char buffer[128]; + struct specino specinos[VI_LINKTABLE+1]; + Inode nearInode = 0; + + memset(&specinos, 0, sizeof(specinos)); + + (void)afs_snprintf(headername, sizeof headername, VFORMAT, volumeId); + (void)afs_snprintf(oldpath, sizeof oldpath, "%s/%s", pname, headername); + fd = open(oldpath, O_RDONLY); + if (fd < 0) { + Log("1 inode_ConvertROtoRWvolume: Couldn't open header for RO-volume %lu.\n", volumeId); + return ENOENT; + } + if (read(fd, &h, sizeof(h)) != sizeof(h)) { + Log("1 inode_ConvertROtoRWvolume: Couldn't read header for RO-volume %lu.\n", volumeId); + close(fd); + return EIO; + } + close(fd); + FSYNC_VolOp(volumeId, pname, FSYNC_VOL_BREAKCBKS, 0, NULL); + + /* now do the work */ + + for (partP = DiskPartitionList; partP && strcmp(partP->name, pname); + partP = partP->next); + if (!partP) { + Log("1 inode_ConvertROtoRWvolume: Couldn't find DiskPartition for %s\n", pname); + return EIO; + } + + strcpy(tmpDevName, partP->devName); + name = getDevName(tmpDevName, wpath); + + if ((err = ListViceInodes(name, VPartitionPath(partP), + NULL, UpdateThisVolume, volumeId, + &forcep, 0, wpath, &specinos)) < 0) + { + Log("1 inode_ConvertROtoRWvolume: Couldn't get special inodes\n"); + return EIO; + } + +#if defined(NEARINODE_HINT) + nearInodeHash(volumeId, nearInode); + nearInode %= partP->f_files; +#endif + + for (j = VI_VOLINFO; j < VI_LINKTABLE+1; j++) { + if (specinos[j].inodeNumber > 0) { + specinos[j].ninodeNumber = + IH_CREATE(NULL, partP->device, VPartitionPath(partP), + nearInode, h.parent, INODESPECIAL, j, h.parent); + IH_INIT(ih, partP->device, volumeId, + specinos[j].inodeNumber); + fdP = IH_OPEN(ih); + if (!fdP) { + Log("1 inode_ConvertROtoRWvolume: Couldn't find special inode %d for %d\n", j, volumeId); + return -1; + } + + IH_INIT(ih2, partP->device, h.parent, specinos[j].ninodeNumber); + fdP2 = IH_OPEN(ih2); + if (!fdP2) { + Log("1 inode_ConvertROtoRWvolume: Couldn't find special inode %d for %d\n", j, h.parent); + return -1; + } + + if (j == VI_VOLINFO) + convertVolumeInfo(fdP->fd_fd, fdP2->fd_fd, ih2->ih_vid); + else { + while (1) { + len = read(fdP->fd_fd, buffer, sizeof(buffer)); + if (len < 0) + return errno; + if (len == 0) + break; + code = write(fdP2->fd_fd, buffer, len); + if (code != len) + return -1; + } + } + + FDH_CLOSE(fdP); + FDH_CLOSE(fdP2); + IH_RELEASE(ih); + IH_RELEASE(ih2); + } + } + + h.id = h.parent; +#ifdef AFS_64BIT_IOPS_ENV + h.volumeInfo_lo = (afs_int32)specinos[VI_VOLINFO].ninodeNumber & 0xffffffff; + h.volumeInfo_hi = (afs_int32)(specinos[VI_VOLINFO].ninodeNumber >> 32) && 0xffffffff; + h.smallVnodeIndex_lo = (afs_int32)specinos[VI_SMALLINDEX].ninodeNumber & 0xffffffff; + h.smallVnodeIndex_hi = (afs_int32)(specinos[VI_SMALLINDEX].ninodeNumber >> 32) & 0xffffffff; + h.largeVnodeIndex_lo = (afs_int32)specinos[VI_LARGEINDEX].ninodeNumber & 0xffffffff; + h.largeVnodeIndex_hi = (afs_int32)(specinos[VI_LARGEINDEX].ninodeNumber >> 32) & 0xffffffff; + if (specinos[VI_LINKTABLE].ninodeNumber) { + h.linkTable_lo = (afs_int32)specinos[VI_LINKTABLE].ninodeNumber & 0xffffffff; + h.linkTable_hi = (afs_int32)specinos[VI_LINKTABLE].ninodeNumber & 0xffffffff; + } +#else + h.volumeInfo_lo = specinos[VI_VOLINFO].ninodeNumber; + h.smallVnodeIndex_lo = specinos[VI_SMALLINDEX].ninodeNumber; + h.largeVnodeIndex_lo = specinos[VI_LARGEINDEX].ninodeNumber; + if (specinos[VI_LINKTABLE].ninodeNumber) { + h.linkTable_lo = specinos[VI_LINKTABLE].ninodeNumber; + } +#endif + + (void)afs_snprintf(headername, sizeof headername, VFORMAT, h.id); + (void)afs_snprintf(newpath, sizeof newpath, "%s/%s", pname, headername); + fd = open(newpath, O_CREAT | O_EXCL | O_RDWR, 0644); + if (fd < 0) { + Log("1 inode_ConvertROtoRWvolume: Couldn't create header for RW-volume %lu.\n", h.id); + return EIO; + } + if (write(fd, &h, sizeof(h)) != sizeof(h)) { + Log("1 inode_ConvertROtoRWvolume: Couldn't write header for RW-volume %lu.\n", h.id); + close(fd); + return EIO; + } + close(fd); + if (unlink(oldpath) < 0) { + Log("1 inode_ConvertROtoRWvolume: Couldn't unlink RO header, error = %d\n", errno); + } + FSYNC_VolOp(volumeId, pname, FSYNC_VOL_DONE, 0, NULL); + FSYNC_VolOp(h.id, pname, FSYNC_VOL_ON, 0, NULL); + return 0; +} +#endif /* FSSYNC_BUILD_CLIENT */ #endif /* AFS_NAMEI_ENV */ diff --git a/src/vol/namei_ops.c b/src/vol/namei_ops.c index 240e4be272..c07091113c 100644 --- a/src/vol/namei_ops.c +++ b/src/vol/namei_ops.c @@ -18,6 +18,7 @@ RCSID #ifdef AFS_NAMEI_ENV #include #include +#include #include #include #include @@ -40,6 +41,7 @@ RCSID #include "viceinode.h" #include "voldefs.h" #include "partition.h" +#include "fssync.h" #include /*@+fcnmacros +macrofcndecl@*/ @@ -1543,25 +1545,57 @@ convertVolumeInfo(fdr, fdw, vid) */ int -namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) +namei_ConvertROtoRWvolume(char *pname, afs_int32 volumeId) { +#ifdef FSSYNC_BUILD_CLIENT namei_t n; char dir_name[512], oldpath[512], newpath[512]; char smallName[64]; char largeName[64]; char infoName[64]; IHandle_t t_ih; + IHandle_t *ih; char infoSeen = 0; char smallSeen = 0; char largeSeen = 0; char linkSeen = 0; - int code, fd, fd2; + int code, fd, fd2, found; char *p; DIR *dirp; + Inode ino; struct dirent *dp; + struct DiskPartition *partP; struct ViceInodeInfo info; + struct VolumeDiskHeader h; + char volname[20]; + char headername[16]; + afs_int32 error = 0; - namei_HandleToName(&n, h); + (void)afs_snprintf(headername, sizeof headername, VFORMAT, volumeId); + (void)afs_snprintf(oldpath, sizeof oldpath, "%s/%s", pname, headername); + fd = open(oldpath, O_RDONLY); + if (fd < 0) { + Log("1 namei_ConvertROtoRWvolume: Couldn't open header for RO-volume %lu.\n", volumeId); + return ENOENT; + } + if (read(fd, &h, sizeof(h)) != sizeof(h)) { + Log("1 namei_ConvertROtoRWvolume: Couldn't read header for RO-volume %lu.\n", volumeId); + close(fd); + return EIO; + } + close(fd); + FSYNC_VolOp(volumeId, pname, FSYNC_VOL_BREAKCBKS, 0, NULL); + + for (partP = DiskPartitionList; partP && strcmp(partP->name, pname); + partP = partP->next); + if (!partP) { + Log("1 namei_ConvertROtoRWvolume: Couldn't find DiskPartition for %s\n", pname); + return EIO; + } + ino = namei_MakeSpecIno(h.parent, VI_LINKTABLE); + IH_INIT(ih, partP->device, h.parent, ino); + + namei_HandleToName(&n, ih); strcpy(dir_name, n.n_path); p = strrchr(dir_name, '/'); *p = 0; @@ -1576,7 +1610,7 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) if (*dp->d_name == '.') continue; - if (DecodeInode(dir_name, dp->d_name, &info, h->ih_vid) < 0) { + if (DecodeInode(dir_name, dp->d_name, &info, ih->ih_vid) < 0) { Log("1 namei_ConvertROtoRWvolume: DecodeInode failed for %s/%s\n", dir_name, dp->d_name); closedir(dirp); @@ -1587,8 +1621,8 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) closedir(dirp); return -1; } - if (info.u.param[0] != vid) { - if (info.u.param[0] == h->ih_vid) { + if (info.u.param[0] != volumeId) { + if (info.u.param[0] == ih->ih_vid) { if (info.u.param[2] == VI_LINKTABLE) { /* link table */ linkSeen = 1; continue; @@ -1626,8 +1660,8 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) */ memset(&t_ih, 0, sizeof(t_ih)); - t_ih.ih_dev = h->ih_dev; - t_ih.ih_vid = h->ih_vid; + t_ih.ih_dev = ih->ih_dev; + t_ih.ih_vid = ih->ih_vid; (void)afs_snprintf(oldpath, sizeof oldpath, "%s/%s", dir_name, infoName); fd = afs_open(oldpath, O_RDWR, 0); @@ -1636,7 +1670,7 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) oldpath); return -1; } - t_ih.ih_ino = namei_MakeSpecIno(h->ih_vid, VI_VOLINFO); + t_ih.ih_ino = namei_MakeSpecIno(ih->ih_vid, VI_VOLINFO); namei_HandleToName(&n, &t_ih); fd2 = afs_open(n.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0); if (fd2 < 0) { @@ -1644,17 +1678,17 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) close(fd); return -1; } - code = convertVolumeInfo(fd, fd2, h->ih_vid); + code = convertVolumeInfo(fd, fd2, ih->ih_vid); close(fd); if (code) { close(fd2); unlink(n.n_path); return -1; } - SetOGM(fd2, h->ih_vid, 1); + SetOGM(fd2, ih->ih_vid, 1); close(fd2); - t_ih.ih_ino = namei_MakeSpecIno(h->ih_vid, VI_SMALLINDEX); + t_ih.ih_ino = namei_MakeSpecIno(ih->ih_vid, VI_SMALLINDEX); namei_HandleToName(&n, &t_ih); (void)afs_snprintf(newpath, sizeof newpath, "%s/%s", dir_name, smallName); fd = afs_open(newpath, O_RDWR, 0); @@ -1662,12 +1696,12 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) Log("1 namei_ConvertROtoRWvolume: could not open SmallIndex file: %s\n", newpath); return -1; } - SetOGM(fd, h->ih_vid, 2); + SetOGM(fd, ih->ih_vid, 2); close(fd); link(newpath, n.n_path); unlink(newpath); - t_ih.ih_ino = namei_MakeSpecIno(h->ih_vid, VI_LARGEINDEX); + t_ih.ih_ino = namei_MakeSpecIno(ih->ih_vid, VI_LARGEINDEX); namei_HandleToName(&n, &t_ih); (void)afs_snprintf(newpath, sizeof newpath, "%s/%s", dir_name, largeName); fd = afs_open(newpath, O_RDWR, 0); @@ -1675,12 +1709,38 @@ namei_ConvertROtoRWvolume(IHandle_t * h, afs_uint32 vid) Log("1 namei_ConvertROtoRWvolume: could not open LargeIndex file: %s\n", newpath); return -1; } - SetOGM(fd, h->ih_vid, 3); + SetOGM(fd, ih->ih_vid, 3); close(fd); link(newpath, n.n_path); unlink(newpath); unlink(oldpath); + + h.id = h.parent; + h.volumeInfo_hi = h.id; + h.smallVnodeIndex_hi = h.id; + h.largeVnodeIndex_hi = h.id; + h.linkTable_hi = h.id; + (void)afs_snprintf(headername, sizeof headername, VFORMAT, h.id); + (void)afs_snprintf(newpath, sizeof newpath, "%s/%s", pname, headername); + fd = open(newpath, O_CREAT | O_EXCL | O_RDWR, 0644); + if (fd < 0) { + Log("1 namei_ConvertROtoRWvolume: Couldn't create header for RW-volume %lu.\n", h.id); + return EIO; + } + if (write(fd, &h, sizeof(h)) != sizeof(h)) { + Log("1 namei_ConvertROtoRWvolume: Couldn't write header for RW-volume\ + %lu.\n", h.id); + close(fd); + return EIO; + } + close(fd); + if (unlink(oldpath) < 0) { + Log("1 namei_ConvertROtoRWvolume: Couldn't unlink RO header, error = %d\n", error); + } + FSYNC_VolOp(volumeId, pname, FSYNC_VOL_DONE, 0, NULL); + FSYNC_VolOp(h.id, pname, FSYNC_VOL_ON, 0, NULL); +#endif return 0; } diff --git a/src/vol/partition.c b/src/vol/partition.c index 85a65779b8..8963854f9b 100644 --- a/src/vol/partition.c +++ b/src/vol/partition.c @@ -25,6 +25,7 @@ RCSID ("$Header$"); #include +#include #ifdef AFS_NT40_ENV #include #include @@ -107,14 +108,6 @@ RCSID #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include "nfs.h" @@ -463,7 +456,7 @@ VAttachPartitions(void) /* but allow zfs too if we're in the NAMEI environment */ if ( #ifdef AFS_NAMEI_ENV - ((!(strcmp(mnt.mnt_fstype, "ufs") && + (((strcmp(mnt.mnt_fstype, "ufs") && strcmp(mnt.mnt_fstype, "zfs")))) #else (strcmp(mnt.mnt_fstype, "ufs") != 0) diff --git a/src/vol/physio.c b/src/vol/physio.c index ac3eeb4c64..c463a4e7d4 100644 --- a/src/vol/physio.c +++ b/src/vol/physio.c @@ -28,13 +28,7 @@ RCSID #else #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_SUN5_ENV #include #endif diff --git a/src/vol/purge.c b/src/vol/purge.c index 77695e390b..87ecc99f35 100644 --- a/src/vol/purge.c +++ b/src/vol/purge.c @@ -28,13 +28,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include diff --git a/src/vol/salvaged.c b/src/vol/salvaged.c index d5b318b39e..cff405fb82 100644 --- a/src/vol/salvaged.c +++ b/src/vol/salvaged.c @@ -1,5 +1,5 @@ /* - * Copyright 2006, Sine Nomine Associates and others. + * Copyright 2006-2007, Sine Nomine Associates and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public @@ -179,7 +179,7 @@ struct { #define DEFAULT_PARALLELISM 4 /* allow 4 parallel salvage workers by default */ static int -handleit(struct cmd_syndesc *as) +handleit(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; char pname[100], *temp; @@ -365,7 +365,7 @@ main(int argc, char **argv) } #endif - ts = cmd_CreateSyntax("initcmd", handleit, 0, "initialize the program"); + ts = cmd_CreateSyntax("initcmd", handleit, NULL, "initialize the program"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "Name of partition to salvage"); cmd_AddParm(ts, "-volumeid", CMD_SINGLE, CMD_OPTIONAL, @@ -407,6 +407,7 @@ main(int argc, char **argv) err = cmd_Dispatch(argc, argv); Exit(err); + return 0; /* not reached */ } static void @@ -529,6 +530,9 @@ SalvageServer(void) node = SALVSYNC_getWork(); assert(node != NULL); + Log("dispatching child to salvage volume %u...\n", + node->command.sop.parent); + VOL_LOCK; /* find a slot */ for (slot = 0; slot < Parallel; slot++) { @@ -572,7 +576,8 @@ DoSalvageVolume(struct SalvageQueueNode * node, int slot) int ret; struct DiskPartition * partP; - VChildProcReconnectFS(); + /* do not allow further forking inside salvager */ + canfork = 0; /* do not attempt to close parent's logFile handle as * another thread may have held the lock on the FILE @@ -587,7 +592,7 @@ DoSalvageVolume(struct SalvageQueueNode * node, int slot) ShowLog = 0; } - if (node->command.sop.volume <= 0) { + if (node->command.sop.parent <= 0) { Log("salvageServer: invalid volume id specified; salvage aborted\n"); return 1; } @@ -600,9 +605,7 @@ DoSalvageVolume(struct SalvageQueueNode * node, int slot) } /* Salvage individual volume; don't notify fs */ - SalvageFileSys1(partP, node->command.sop.volume); - - VDisconnectFS(); + SalvageFileSys1(partP, node->command.sop.parent); fclose(logFile); return 0; @@ -654,7 +657,7 @@ SalvageChildReaperThread(void * args) /* ok, we've reaped a child */ current_workers--; - SALVSYNC_doneWorkByPid(pid, 0); + SALVSYNC_doneWorkByPid(pid, WEXITSTATUS(status)); assert(pthread_cond_broadcast(&worker_cv) == 0); } @@ -671,7 +674,9 @@ Reap_Child(char *prog, int * pid, int * status) *pid = ret; if (WCOREDUMP(*status)) Log("\"%s\" core dumped!\n", prog); - if (WIFSIGNALED(*status) != 0 || WEXITSTATUS(*status) != 0) + if ((WIFSIGNALED(*status) != 0) || + ((WEXITSTATUS(*status) != 0) && + (WEXITSTATUS(*status) != SALSRV_EXIT_VOLGROUP_LINK))) Log("\"%s\" (pid=%d) terminated abnormally!\n", prog, ret); } else { Log("wait returned -1\n"); diff --git a/src/vol/salvager.c b/src/vol/salvager.c index 146431f340..d7dab03c60 100644 --- a/src/vol/salvager.c +++ b/src/vol/salvager.c @@ -137,7 +137,7 @@ static int get_salvage_lock = 0; static int -handleit(struct cmd_syndesc *as) +handleit(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; char pname[100], *temp; @@ -440,7 +440,7 @@ main(int argc, char **argv) } #endif - ts = cmd_CreateSyntax("initcmd", handleit, 0, "initialize the program"); + ts = cmd_CreateSyntax("initcmd", handleit, NULL, "initialize the program"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "Name of partition to salvage"); cmd_AddParm(ts, "-volumeid", CMD_SINGLE, CMD_OPTIONAL, @@ -490,5 +490,6 @@ main(int argc, char **argv) #endif /* FAST_RESTART */ err = cmd_Dispatch(argc, argv); Exit(err); + return 0; /* not reached */ } diff --git a/src/vol/salvsync-client.c b/src/vol/salvsync-client.c index 7ed96d6ee0..f7258677a7 100644 --- a/src/vol/salvsync-client.c +++ b/src/vol/salvsync-client.c @@ -1,5 +1,5 @@ /* - * Copyright 2006, Sine Nomine Associates and others. + * Copyright 2006-2007, Sine Nomine Associates and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public @@ -35,15 +35,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include @@ -76,7 +68,14 @@ extern int LogLevel; extern int VInit; extern pthread_mutex_t vol_salvsync_mutex; -static SYNC_client_state salvsync_client_state = { -1, 2041, SALVSYNC_PROTO_VERSION, 5, 120 }; +static SYNC_client_state salvsync_client_state = + { -1, /* file descriptor */ + 2041, /* port */ + SALVSYNC_PROTO_VERSION, /* protocol version */ + 5, /* connect retry limit */ + 120, /* hard timeout */ + "SALVSYNC", /* protocol name string */ + }; /* * client-side routines @@ -105,6 +104,9 @@ afs_int32 SALVSYNC_askSalv(SYNC_command * com, SYNC_response * res) { afs_int32 code; + SALVSYNC_command_hdr * scom = com->payload.buf; + + scom->hdr_version = SALVSYNC_PROTO_VERSION; VSALVSYNC_LOCK; code = SYNC_ask(&salvsync_client_state, com, res); @@ -158,6 +160,7 @@ SALVSYNC_SalvageVolume(VolumeId volume, char *partName, int command, int reason, com.hdr.reason = reason; com.hdr.command_len = sizeof(com.hdr) + sizeof(scom); scom.volume = volume; + scom.parent = volume; scom.prio = prio; if (partName) { @@ -169,4 +172,46 @@ SALVSYNC_SalvageVolume(VolumeId volume, char *partName, int command, int reason, return SALVSYNC_askSalv(&com, res); } +afs_int32 +SALVSYNC_LinkVolume(VolumeId parent, + VolumeId clone, + char * partName, + SYNC_response * res_in) +{ + SYNC_command com; + SYNC_response res_l, *res; + SALVSYNC_command_hdr scom; + SALVSYNC_response_hdr sres; + int n, tot; + + memset(&com, 0, sizeof(com)); + memset(&scom, 0, sizeof(scom)); + + if (res_in) { + res = res_in; + } else { + memset(&res_l, 0, sizeof(res_l)); + memset(&sres, 0, sizeof(sres)); + res_l.payload.buf = (void *) &sres; + res_l.payload.len = sizeof(sres); + res = &res_l; + } + + com.payload.buf = (void *) &scom; + com.payload.len = sizeof(scom); + com.hdr.command = SALVSYNC_OP_LINK; + com.hdr.reason = SALVSYNC_REASON_WHATEVER; + com.hdr.command_len = sizeof(com.hdr) + sizeof(scom); + scom.volume = clone; + scom.parent = parent; + + if (partName) { + strlcpy(scom.partName, partName, sizeof(scom.partName)); + } else { + scom.partName[0] = '\0'; + } + + return SALVSYNC_askSalv(&com, res); +} + #endif /* AFS_DEMAND_ATTACH_FS */ diff --git a/src/vol/salvsync-server.c b/src/vol/salvsync-server.c index e7549e9d3a..f15961718d 100644 --- a/src/vol/salvsync-server.c +++ b/src/vol/salvsync-server.c @@ -1,5 +1,5 @@ /* - * Copyright 2006, Sine Nomine Associates and others. + * Copyright 2006-2007, Sine Nomine Associates and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public @@ -44,14 +44,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include @@ -119,24 +112,34 @@ struct Lock SALVSYNC_handler_lock; * SALVSYNC is a feature specific to the demand attach fileserver */ +static int AllocNode(struct SalvageQueueNode ** node); + static int AddToSalvageQueue(struct SalvageQueueNode * node); static void DeleteFromSalvageQueue(struct SalvageQueueNode * node); static void AddToPendingQueue(struct SalvageQueueNode * node); static void DeleteFromPendingQueue(struct SalvageQueueNode * node); static struct SalvageQueueNode * LookupPendingCommand(SALVSYNC_command_hdr * qry); static struct SalvageQueueNode * LookupPendingCommandByPid(int pid); -static void RaiseCommandPrio(struct SalvageQueueNode * node, SALVSYNC_command_hdr * com); +static void UpdateCommandPrio(struct SalvageQueueNode * node); +static void HandlePrio(struct SalvageQueueNode * clone, + struct SalvageQueueNode * parent, + afs_uint32 new_prio); -static struct SalvageQueueNode * LookupNode(VolumeId vid, char * partName); -static struct SalvageQueueNode * LookupNodeByCommand(SALVSYNC_command_hdr * qry); +static int LinkNode(struct SalvageQueueNode * parent, + struct SalvageQueueNode * clone); + +static struct SalvageQueueNode * LookupNode(VolumeId vid, char * partName, + struct SalvageQueueNode ** parent); +static struct SalvageQueueNode * LookupNodeByCommand(SALVSYNC_command_hdr * qry, + struct SalvageQueueNode ** parent); static void AddNodeToHash(struct SalvageQueueNode * node); static void DeleteNodeFromHash(struct SalvageQueueNode * node); static afs_int32 SALVSYNC_com_Salvage(SALVSYNC_command * com, SALVSYNC_response * res); static afs_int32 SALVSYNC_com_Cancel(SALVSYNC_command * com, SALVSYNC_response * res); -static afs_int32 SALVSYNC_com_RaisePrio(SALVSYNC_command * com, SALVSYNC_response * res); static afs_int32 SALVSYNC_com_Query(SALVSYNC_command * com, SALVSYNC_response * res); static afs_int32 SALVSYNC_com_CancelAll(SALVSYNC_command * com, SALVSYNC_response * res); +static afs_int32 SALVSYNC_com_Link(SALVSYNC_command * com, SALVSYNC_response * res); extern int LogLevel; @@ -146,21 +149,24 @@ extern pthread_mutex_t vol_salvsync_mutex; static int AcceptSd = -1; /* Socket used by server for accepting connections */ -/* be careful about rearranging elements in this structure. - * element placement has been optimized for locality of reference - * in SALVSYNC_getWork() */ +/** + * queue of all volumes waiting to be salvaged. + */ struct SalvageQueue { volatile int total_len; - volatile afs_int32 last_insert; /* id of last partition to have a salvage node insert */ + volatile afs_int32 last_insert; /**< id of last partition to have a salvage node inserted */ volatile int len[VOLMAXPARTS+1]; - volatile struct rx_queue part[VOLMAXPARTS+1]; + volatile struct rx_queue part[VOLMAXPARTS+1]; /**< per-partition queues of pending salvages */ pthread_cond_t cv; }; static struct SalvageQueue salvageQueue; /* volumes waiting to be salvaged */ +/** + * queue of all volumes currently being salvaged. + */ struct QueueHead { - volatile struct rx_queue q; - volatile int len; + volatile struct rx_queue q; /**< queue of salvages in progress */ + volatile int len; /**< length of in-progress queue */ pthread_cond_t queue_change_cv; }; static struct QueueHead pendingQueue; /* volumes being salvaged */ @@ -190,7 +196,8 @@ static int partition_salvaging[VOLMAXPARTS+1]; static struct QueueHead SalvageHashTable[VSHASH_SIZE]; static struct SalvageQueueNode * -LookupNode(afs_uint32 vid, char * partName) +LookupNode(afs_uint32 vid, char * partName, + struct SalvageQueueNode ** parent) { struct rx_queue *qp, *nqp; struct SalvageQueueNode *vsp; @@ -207,13 +214,24 @@ LookupNode(afs_uint32 vid, char * partName) if (queue_IsEnd(&SalvageHashTable[idx], qp)) { vsp = NULL; } + + if (parent) { + if (vsp) { + *parent = (vsp->type == SALVSYNC_VOLGROUP_CLONE) ? + vsp->volgroup.parent : vsp; + } else { + *parent = NULL; + } + } + return vsp; } static struct SalvageQueueNode * -LookupNodeByCommand(SALVSYNC_command_hdr * qry) +LookupNodeByCommand(SALVSYNC_command_hdr * qry, + struct SalvageQueueNode ** parent) { - return LookupNode(qry->volume, qry->partName); + return LookupNode(qry->volume, qry->partName, parent); } static void @@ -427,6 +445,14 @@ SALVSYNC_com(int fd) return; } + if (com.recv_len < sizeof(com.hdr)) { + Log("SALVSYNC_com: invalid protocol message length (%u)\n", com.recv_len); + res.hdr.response = SYNC_COM_ERROR; + res.hdr.reason = SYNC_REASON_MALFORMED_PACKET; + res.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; + goto respond; + } + if (com.hdr.proto_version != SALVSYNC_PROTO_VERSION) { Log("SALVSYNC_com: invalid protocol version (%u)\n", com.hdr.proto_version); res.hdr.response = SYNC_COM_ERROR; @@ -434,6 +460,12 @@ SALVSYNC_com(int fd) goto respond; } + if (com.hdr.command == SYNC_COM_CHANNEL_CLOSE) { + res.hdr.response = SYNC_OK; + res.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; + goto respond; + } + if (com.recv_len != (sizeof(com.hdr) + sizeof(SALVSYNC_command_hdr))) { Log("SALVSYNC_com: invalid protocol message length (%u)\n", com.recv_len); res.hdr.response = SYNC_COM_ERROR; @@ -447,6 +479,7 @@ SALVSYNC_com(int fd) case SALVSYNC_NOP: break; case SALVSYNC_SALVAGE: + case SALVSYNC_RAISEPRIO: res.hdr.response = SALVSYNC_com_Salvage(&scom, &sres); break; case SALVSYNC_CANCEL: @@ -457,17 +490,13 @@ SALVSYNC_com(int fd) /* cancel all queued salvages */ res.hdr.response = SALVSYNC_com_CancelAll(&scom, &sres); break; - case SALVSYNC_RAISEPRIO: - /* raise the priority of a salvage */ - res.hdr.response = SALVSYNC_com_RaisePrio(&scom, &sres); - break; case SALVSYNC_QUERY: /* query whether a volume is done salvaging */ res.hdr.response = SALVSYNC_com_Query(&scom, &sres); break; - case SYNC_COM_CHANNEL_CLOSE: - res.hdr.response = SYNC_OK; - res.hdr.flags |= SYNC_FLAG_CHANNEL_SHUTDOWN; + case SALVSYNC_OP_LINK: + /* link a clone to its parent in the scheduler */ + res.hdr.response = SALVSYNC_com_Link(&scom, &sres); break; default: res.hdr.response = SYNC_BAD_COMMAND; @@ -489,7 +518,8 @@ static afs_int32 SALVSYNC_com_Salvage(SALVSYNC_command * com, SALVSYNC_response * res) { afs_int32 code = SYNC_OK; - struct SalvageQueueNode * node; + struct SalvageQueueNode * node, * clone; + int hash = 0; if (SYNC_verifyProtocolString(com->sop->partName, sizeof(com->sop->partName))) { code = SYNC_FAILED; @@ -497,41 +527,41 @@ SALVSYNC_com_Salvage(SALVSYNC_command * com, SALVSYNC_response * res) goto done; } - node = LookupNodeByCommand(com->sop); + clone = LookupNodeByCommand(com->sop, &node); - /* schedule a salvage for this volume */ - if (node != NULL) { - switch (node->state) { - case SALVSYNC_STATE_ERROR: - case SALVSYNC_STATE_DONE: - memcpy(&node->command.com, com->hdr, sizeof(SYNC_command_hdr)); - memcpy(&node->command.sop, com->sop, sizeof(SALVSYNC_command_hdr)); - node->command.sop.prio = 0; - if (AddToSalvageQueue(node)) { - code = SYNC_DENIED; - } - break; - default: - break; - } - } else { - node = (struct SalvageQueueNode *) malloc(sizeof(struct SalvageQueueNode)); - if (node == NULL) { + if (node == NULL) { + if (AllocNode(&node)) { code = SYNC_DENIED; + res->hdr->reason = SYNC_REASON_NOMEM; goto done; } - memset(node, 0, sizeof(struct SalvageQueueNode)); - memcpy(&node->command.com, com->hdr, sizeof(SYNC_command_hdr)); - memcpy(&node->command.sop, com->sop, sizeof(SALVSYNC_command_hdr)); - AddNodeToHash(node); + clone = node; + hash = 1; + } + + HandlePrio(clone, node, com->sop->prio); + + switch (node->state) { + case SALVSYNC_STATE_QUEUED: + UpdateCommandPrio(node); + break; + + case SALVSYNC_STATE_ERROR: + case SALVSYNC_STATE_DONE: + case SALVSYNC_STATE_UNKNOWN: + memcpy(&clone->command.com, com->hdr, sizeof(SYNC_command_hdr)); + memcpy(&clone->command.sop, com->sop, sizeof(SALVSYNC_command_hdr)); if (AddToSalvageQueue(node)) { - /* roll back */ - DeleteNodeFromHash(node); - free(node); - node = NULL; code = SYNC_DENIED; - goto done; } + break; + + default: + break; + } + + if (hash) { + AddNodeToHash(node); } res->hdr->flags |= SALVSYNC_FLAG_VOL_STATS_VALID; @@ -554,7 +584,7 @@ SALVSYNC_com_Cancel(SALVSYNC_command * com, SALVSYNC_response * res) goto done; } - node = LookupNodeByCommand(com->sop); + node = LookupNodeByCommand(com->sop, NULL); if (node == NULL) { res->sop->state = SALVSYNC_STATE_UNKNOWN; @@ -563,7 +593,8 @@ SALVSYNC_com_Cancel(SALVSYNC_command * com, SALVSYNC_response * res) res->hdr->flags |= SALVSYNC_FLAG_VOL_STATS_VALID; res->sop->prio = node->command.sop.prio; res->sop->state = node->state; - if (node->state == SALVSYNC_STATE_QUEUED) { + if ((node->type == SALVSYNC_VOLGROUP_PARENT) && + (node->state == SALVSYNC_STATE_QUEUED)) { DeleteFromSalvageQueue(node); } } @@ -587,11 +618,14 @@ SALVSYNC_com_CancelAll(SALVSYNC_command * com, SALVSYNC_response * res) return SYNC_OK; } +/** + * link a queue node for a clone to its parent volume. + */ static afs_int32 -SALVSYNC_com_RaisePrio(SALVSYNC_command * com, SALVSYNC_response * res) +SALVSYNC_com_Link(SALVSYNC_command * com, SALVSYNC_response * res) { afs_int32 code = SYNC_OK; - struct SalvageQueueNode * node; + struct SalvageQueueNode * clone, * parent; if (SYNC_verifyProtocolString(com->sop->partName, sizeof(com->sop->partName))) { code = SYNC_FAILED; @@ -599,35 +633,31 @@ SALVSYNC_com_RaisePrio(SALVSYNC_command * com, SALVSYNC_response * res) goto done; } - node = LookupNodeByCommand(com->sop); - - /* raise the priority of a salvage */ - if (node == NULL) { - code = SALVSYNC_com_Salvage(com, res); - node = LookupNodeByCommand(com->sop); - } else { - switch (node->state) { - case SALVSYNC_STATE_QUEUED: - RaiseCommandPrio(node, com->sop); - break; - case SALVSYNC_STATE_SALVAGING: - break; - case SALVSYNC_STATE_ERROR: - case SALVSYNC_STATE_DONE: - code = SALVSYNC_com_Salvage(com, res); - break; - default: - break; - } + /* lookup clone's salvage scheduling node */ + clone = LookupNodeByCommand(com->sop, NULL); + if (clone == NULL) { + code = SYNC_DENIED; + res->hdr->reason = SALVSYNC_REASON_ERROR; + goto done; } - if (node == NULL) { - res->sop->prio = 0; - res->sop->state = SALVSYNC_STATE_UNKNOWN; - } else { - res->hdr->flags |= SALVSYNC_FLAG_VOL_STATS_VALID; - res->sop->prio = node->command.sop.prio; - res->sop->state = node->state; + /* lookup parent's salvage scheduling node */ + parent = LookupNode(com->sop->parent, com->sop->partName, NULL); + if (parent == NULL) { + if (AllocNode(&parent)) { + code = SYNC_DENIED; + res->hdr->reason = SYNC_REASON_NOMEM; + goto done; + } + memcpy(&parent->command.com, com->hdr, sizeof(SYNC_command_hdr)); + memcpy(&parent->command.sop, com->sop, sizeof(SALVSYNC_command_hdr)); + parent->command.sop.volume = parent->command.sop.parent = com->sop->parent; + AddNodeToHash(parent); + } + + if (LinkNode(parent, clone)) { + code = SYNC_DENIED; + goto done; } done: @@ -646,7 +676,7 @@ SALVSYNC_com_Query(SALVSYNC_command * com, SALVSYNC_response * res) goto done; } - node = LookupNodeByCommand(com->sop); + LookupNodeByCommand(com->sop, &node); /* query whether a volume is done salvaging */ if (node == NULL) { @@ -797,10 +827,128 @@ GetHandler(fd_set * fdsetp, int *maxfdp) ReleaseReadLock(&SALVSYNC_handler_lock); /* just in case */ } +static int +AllocNode(struct SalvageQueueNode ** node_out) +{ + int code = 0; + struct SalvageQueueNode * node; + + *node_out = node = (struct SalvageQueueNode *) + malloc(sizeof(struct SalvageQueueNode)); + if (node == NULL) { + code = 1; + goto done; + } + + memset(node, 0, sizeof(struct SalvageQueueNode)); + node->type = SALVSYNC_VOLGROUP_PARENT; + node->state = SALVSYNC_STATE_UNKNOWN; + + done: + return code; +} + +static int +LinkNode(struct SalvageQueueNode * parent, + struct SalvageQueueNode * clone) +{ + int code = 0; + int idx; + + /* check for attaching a clone to a clone */ + if (parent->type != SALVSYNC_VOLGROUP_PARENT) { + code = 1; + goto done; + } + + /* check for pre-existing registration and openings */ + for (idx = 0; idx < VOLMAXTYPES; idx++) { + if (parent->volgroup.children[idx] == clone) { + goto linked; + } + if (parent->volgroup.children[idx] == NULL) { + break; + } + } + if (idx == VOLMAXTYPES) { + code = 1; + goto done; + } + + /* link parent and child */ + parent->volgroup.children[idx] = clone; + clone->type = SALVSYNC_VOLGROUP_CLONE; + clone->volgroup.parent = parent; + + + linked: + switch (clone->state) { + case SALVSYNC_STATE_QUEUED: + DeleteFromSalvageQueue(clone); + + case SALVSYNC_STATE_SALVAGING: + switch (parent->state) { + case SALVSYNC_STATE_UNKNOWN: + case SALVSYNC_STATE_ERROR: + case SALVSYNC_STATE_DONE: + parent->command.sop.prio = clone->command.sop.prio; + AddToSalvageQueue(parent); + break; + + case SALVSYNC_STATE_QUEUED: + if (clone->command.sop.prio) { + parent->command.sop.prio += clone->command.sop.prio; + UpdateCommandPrio(parent); + } + break; + + default: + break; + } + break; + + default: + break; + } + + done: + return code; +} + +static void +HandlePrio(struct SalvageQueueNode * clone, + struct SalvageQueueNode * node, + afs_uint32 new_prio) +{ + afs_uint32 delta; + + switch (node->state) { + case SALVSYNC_STATE_ERROR: + case SALVSYNC_STATE_DONE: + case SALVSYNC_STATE_UNKNOWN: + node->command.sop.prio = 0; + break; + } + + if (new_prio < clone->command.sop.prio) { + /* strange. let's just set our delta to 1 */ + delta = 1; + } else { + delta = new_prio - clone->command.sop.prio; + } + + if (clone->type == SALVSYNC_VOLGROUP_CLONE) { + clone->command.sop.prio = new_prio; + } + + node->command.sop.prio += delta; +} + static int AddToSalvageQueue(struct SalvageQueueNode * node) { afs_int32 id; + struct SalvageQueueNode * last = NULL; id = volutil_GetPartitionID(node->command.sop.partName); if (id < 0 || id > VOLMAXPARTS) { @@ -810,12 +958,25 @@ AddToSalvageQueue(struct SalvageQueueNode * node) /* don't enqueue salvage requests for unmounted partitions */ return 1; } + if (queue_IsOnQueue(node)) { + return 0; + } + + if (queue_IsNotEmpty(&salvageQueue.part[id])) { + last = queue_Last(&salvageQueue.part[id], SalvageQueueNode); + } queue_Append(&salvageQueue.part[id], node); salvageQueue.len[id]++; salvageQueue.total_len++; salvageQueue.last_insert = id; node->partition_id = id; node->state = SALVSYNC_STATE_QUEUED; + + /* reorder, if necessary */ + if (last && last->command.sop.prio < node->command.sop.prio) { + UpdateCommandPrio(node); + } + assert(pthread_cond_broadcast(&salvageQueue.cv) == 0); return 0; } @@ -887,21 +1048,22 @@ LookupPendingCommandByPid(int pid) /* raise the priority of a previously scheduled salvage */ static void -RaiseCommandPrio(struct SalvageQueueNode * node, SALVSYNC_command_hdr * com) +UpdateCommandPrio(struct SalvageQueueNode * node) { struct SalvageQueueNode *np, *nnp; afs_int32 id; + afs_uint32 prio; assert(queue_IsOnQueue(node)); - node->command.sop.prio = com->prio; + prio = node->command.sop.prio; id = node->partition_id; - if (queue_First(&salvageQueue.part[id], SalvageQueueNode)->command.sop.prio < com->prio) { + if (queue_First(&salvageQueue.part[id], SalvageQueueNode)->command.sop.prio < prio) { queue_Remove(node); queue_Prepend(&salvageQueue.part[id], node); } else { for (queue_ScanBackwardsFrom(&salvageQueue.part[id], node, np, nnp, SalvageQueueNode)) { - if (np->command.sop.prio > com->prio) + if (np->command.sop.prio > prio) break; } if (queue_IsEnd(&salvageQueue.part[id], np)) { @@ -934,7 +1096,6 @@ SALVSYNC_getWork(void) assert(pthread_cond_wait(&salvageQueue.cv, &vol_glock_mutex) == 0); } - /* * short circuit for simple case where only one partition has * scheduled salvages @@ -1011,6 +1172,8 @@ static void SALVSYNC_doneWork_r(struct SalvageQueueNode * node, int result) { afs_int32 partid; + int idx; + DeleteFromPendingQueue(node); partid = node->partition_id; if (partid >=0 && partid <= VOLMAXPARTS) { @@ -1018,9 +1181,17 @@ SALVSYNC_doneWork_r(struct SalvageQueueNode * node, int result) } if (result == 0) { node->state = SALVSYNC_STATE_DONE; - } else { + } else if (result != SALSRV_EXIT_VOLGROUP_LINK) { node->state = SALVSYNC_STATE_ERROR; } + + if (node->type == SALVSYNC_VOLGROUP_PARENT) { + for (idx = 0; idx < VOLMAXTYPES; idx++) { + if (node->volgroup.children[idx]) { + node->volgroup.children[idx]->state = node->state; + } + } + } } void diff --git a/src/vol/salvsync.h b/src/vol/salvsync.h index 6611df6589..9c2f8b953e 100644 --- a/src/vol/salvsync.h +++ b/src/vol/salvsync.h @@ -1,5 +1,5 @@ /* - * Copyright 2006, Sine Nomine Associates and others. + * Copyright 2006-2007, Sine Nomine Associates and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public @@ -14,46 +14,86 @@ #ifndef _AFS_VOL_SALVSYNC_H #define _AFS_VOL_SALVSYNC_H +#define SALSRV_EXIT_VOLGROUP_LINK 10 + + #ifdef AFS_DEMAND_ATTACH_FS #include "daemon_com.h" +#include "voldefs.h" -#define SALVSYNC_PROTO_VERSION 1 +#define SALVSYNC_PROTO_VERSION_V1 1 +#define SALVSYNC_PROTO_VERSION_V2 2 +#define SALVSYNC_PROTO_VERSION SALVSYNC_PROTO_VERSION_V2 -/* SALVSYNC command codes */ -#define SALVSYNC_NOP SYNC_COM_CODE_DECL(0) /* just return stats */ -#define SALVSYNC_SALVAGE SYNC_COM_CODE_DECL(1) /* schedule a salvage */ -#define SALVSYNC_CANCEL SYNC_COM_CODE_DECL(2) /* Cancel a salvage */ -#define SALVSYNC_RAISEPRIO SYNC_COM_CODE_DECL(3) /* move a salvage operation to - * the head of the work queue */ -#define SALVSYNC_QUERY SYNC_COM_CODE_DECL(4) /* query the status of a salvage */ -#define SALVSYNC_CANCELALL SYNC_COM_CODE_DECL(5) /* cancel all pending salvages */ +/** + * SALVSYNC protocol command codes. + */ +typedef enum { + SALVSYNC_OP_NOP = SYNC_COM_CODE_DECL(0), /**< just return stats */ + SALVSYNC_OP_SALVAGE = SYNC_COM_CODE_DECL(1), /**< schedule a salvage */ + SALVSYNC_OP_CANCEL = SYNC_COM_CODE_DECL(2), /**< cancel a salvage */ + SALVSYNC_OP_RAISEPRIO = SYNC_COM_CODE_DECL(3), /**< raise salvage priority */ + SALVSYNC_OP_QUERY = SYNC_COM_CODE_DECL(4), /**< query status of a salvage */ + SALVSYNC_OP_CANCELALL = SYNC_COM_CODE_DECL(5), /**< cancel all pending salvages */ + SALVSYNC_OP_LINK = SYNC_COM_CODE_DECL(6), /**< link a clone to its parent */ + SALVSYNC_OP_MAX_ID /* must be at end of enum */ +} SALVSYNC_op_code_t; -/* SALVSYNC reason codes */ -#define SALVSYNC_WHATEVER SYNC_REASON_CODE_DECL(0) /* XXXX */ -#define SALVSYNC_ERROR SYNC_REASON_CODE_DECL(1) /* volume is in error state */ -#define SALVSYNC_OPERATOR SYNC_REASON_CODE_DECL(2) /* operator forced salvage */ -#define SALVSYNC_SHUTDOWN SYNC_REASON_CODE_DECL(3) /* cancel due to shutdown */ -#define SALVSYNC_NEEDED SYNC_REASON_CODE_DECL(4) /* needsSalvaged flag set */ +#define SALVSYNC_NOP SALVSYNC_OP_NOP +#define SALVSYNC_SALVAGE SALVSYNC_OP_SALVAGE +#define SALVSYNC_CANCEL SALVSYNC_OP_CANCEL +#define SALVSYNC_RAISEPRIO SALVSYNC_OP_RAISEPRIO +#define SALVSYNC_QUERY SALVSYNC_OP_QUERY +#define SALVSYNC_CANCELALL SALVSYNC_OP_CANCELALL +#define SALVSYNC_LINK SALVSYNC_OP_LINK + +/** + * SALVSYNC protocol reason codes. + */ +typedef enum { + SALVSYNC_REASON_WHATEVER = SYNC_REASON_CODE_DECL(0), /**< XXX */ + SALVSYNC_REASON_ERROR = SYNC_REASON_CODE_DECL(1), /**< volume is in error state */ + SALVSYNC_REASON_OPERATOR = SYNC_REASON_CODE_DECL(2), /**< operator forced salvage */ + SALVSYNC_REASON_SHUTDOWN = SYNC_REASON_CODE_DECL(3), /**< cancel due to shutdown */ + SALVSYNC_REASON_NEEDED = SYNC_REASON_CODE_DECL(4), /**< needsSalvaged flag set */ + SALVSYNC_REASON_MAX_ID /* must be at end of enum */ +} SALVSYNC_reason_code_t; + +#define SALVSYNC_WHATEVER SALVSYNC_REASON_WHATEVER +#define SALVSYNC_ERROR SALVSYNC_REASON_ERROR +#define SALVSYNC_OPERATOR SALVSYNC_REASON_OPERATOR +#define SALVSYNC_SHUTDOWN SALVSYNC_REASON_SHUTDOWN +#define SALVSYNC_NEEDED SALVSYNC_REASON_NEEDED /* SALVSYNC response codes */ /* SALVSYNC flags */ #define SALVSYNC_FLAG_VOL_STATS_VALID SYNC_FLAG_CODE_DECL(0) /* volume stats in response are valid */ -/* SALVSYNC command state fields */ -#define SALVSYNC_STATE_UNKNOWN 0 /* unknown state */ -#define SALVSYNC_STATE_QUEUED 1 /* salvage request on queue */ -#define SALVSYNC_STATE_SALVAGING 2 /* salvage is happening now */ -#define SALVSYNC_STATE_ERROR 3 /* salvage ended in an error */ -#define SALVSYNC_STATE_DONE 4 /* last salvage ended successfully */ +/** + * SALVSYNC command state. + */ +typedef enum { + SALVSYNC_STATE_UNKNOWN = 0, /**< unknown state */ + SALVSYNC_STATE_QUEUED = 1, /**< salvage request is queued */ + SALVSYNC_STATE_SALVAGING = 2, /**< salvage is happening now */ + SALVSYNC_STATE_ERROR = 3, /**< salvage ended in an error */ + SALVSYNC_STATE_DONE = 4 /**< last salvage ended successfully */ +} SALVSYNC_command_state_t; +/** + * on-wire salvsync protocol payload. + */ typedef struct SALVSYNC_command_hdr { - afs_uint32 prio; - afs_uint32 volume; - char partName[16]; /* partition name, e.g. /vicepa */ + afs_uint32 hdr_version; /**< salvsync protocol header version */ + afs_uint32 prio; /**< salvage priority */ + afs_uint32 volume; /**< volume on which to operate */ + afs_uint32 parent; /**< parent volume (for vol group linking command) */ + char partName[16]; /**< partition name, e.g. /vicepa */ + afs_uint32 reserved[6]; } SALVSYNC_command_hdr; typedef struct SALVSYNC_response_hdr { @@ -61,6 +101,7 @@ typedef struct SALVSYNC_response_hdr { afs_int32 prio; afs_int32 sq_len; afs_int32 pq_len; + afs_uint32 reserved[4]; } SALVSYNC_response_hdr; typedef struct SALVSYNC_command { @@ -80,10 +121,20 @@ typedef struct SALVSYNC_command_info { SALVSYNC_command_hdr sop; } SALVSYNC_command_info; +typedef enum { + SALVSYNC_VOLGROUP_PARENT, + SALVSYNC_VOLGROUP_CLONE +} SalvageQueueNodeType_t; + struct SalvageQueueNode { struct rx_queue q; struct rx_queue hash_chain; - afs_uint32 state; + SalvageQueueNodeType_t type; + union { + struct SalvageQueueNode * parent; + struct SalvageQueueNode * children[VOLMAXTYPES]; + } volgroup; + SALVSYNC_command_state_t state; struct SALVSYNC_command_info command; afs_int32 partition_id; int pid; @@ -99,6 +150,8 @@ extern int SALVSYNC_clientReconnect(void); extern afs_int32 SALVSYNC_askSalv(SYNC_command * com, SYNC_response * res); extern afs_int32 SALVSYNC_SalvageVolume(VolumeId volume, char *partName, int com, int reason, afs_uint32 prio, SYNC_response * res); +extern afs_int32 SALVSYNC_LinkVolume(VolumeId parent, VolumeId clone, + char * partName, SYNC_response * res_in); /* salvage server interfaces */ extern void SALVSYNC_salvInit(void); diff --git a/src/vol/vnode.c b/src/vol/vnode.c index 75e90bd6ac..e73a12ab88 100644 --- a/src/vol/vnode.c +++ b/src/vol/vnode.c @@ -24,13 +24,7 @@ RCSID #include #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_PTHREAD_ENV #include #else /* AFS_PTHREAD_ENV */ diff --git a/src/vol/vol-bless.c b/src/vol/vol-bless.c index 925315b2f0..f7bc372589 100644 --- a/src/vol/vol-bless.c +++ b/src/vol/vol-bless.c @@ -28,7 +28,7 @@ RCSID int VolumeChanged; /* to keep physio happy */ static int -handleit(struct cmd_syndesc *as, char *arock) +handleit(struct cmd_syndesc *as, void *arock) { Volume *vp; Error ec; @@ -73,7 +73,7 @@ main(int argc, char **argv) register struct cmd_syndesc *ts; afs_int32 code; - ts = cmd_CreateSyntax(NULL, handleit, 0, "Manipulate volume blessed bit"); + ts = cmd_CreateSyntax(NULL, handleit, NULL, "Manipulate volume blessed bit"); cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_REQUIRED, "Volume id"); cmd_AddParm(ts, "-bless", CMD_FLAG, CMD_OPTIONAL, "Set blessed bit"); cmd_AddParm(ts, "-unbless", CMD_FLAG, CMD_OPTIONAL, "Clear blessed bit"); diff --git a/src/vol/vol-info.c b/src/vol/vol-info.c index ae58d5fe11..d88df7e4ae 100644 --- a/src/vol/vol-info.c +++ b/src/vol/vol-info.c @@ -217,7 +217,7 @@ AttachVolume(struct DiskPartition * dp, char *volname, static int -handleit(struct cmd_syndesc *as) +handleit(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; int err = 0; @@ -622,7 +622,7 @@ main(int argc, char **argv) register struct cmd_syndesc *ts; afs_int32 code; - ts = cmd_CreateSyntax(NULL, handleit, 0, "Dump volume's internal state"); + ts = cmd_CreateSyntax(NULL, handleit, NULL, "Dump volume's internal state"); cmd_AddParm(ts, "-online", CMD_FLAG, CMD_OPTIONAL, "Get info from running fileserver"); cmd_AddParm(ts, "-vnode", CMD_FLAG, CMD_OPTIONAL, "Dump vnode info"); diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index d10d3377c8..e82820dde4 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -235,11 +235,18 @@ int ShowMounts = 0; /* -showmounts flag */ int orphans = ORPH_IGNORE; /* -orphans option */ int Showmode = 0; + #ifndef AFS_NT40_ENV int useSyslog = 0; /* -syslog flag */ int useSyslogFacility = LOG_DAEMON; /* -syslogfacility option */ #endif +#ifdef AFS_NT40_ENV +int canfork = 0; +#else +int canfork = 1; +#endif + #define MAXPARALLEL 32 int OKToZap; /* -o flag */ @@ -1258,9 +1265,23 @@ GetVolumeSummary(VolumeId singleVolumeNumber) DiskToVolumeHeader(&vsp->header, &diskHeader); if (singleVolumeNumber && vsp->header.id == singleVolumeNumber && vsp->header.parent != singleVolumeNumber) { - Log("%u is a read-only volume; not salvaged\n", - singleVolumeNumber); - Exit(1); + if (programType == salvageServer) { +#ifdef SALVSYNC_BUILD_CLIENT + Log("fileserver requested salvage of clone %u; scheduling salvage of volume group %u...\n", + vsp->header.id, vsp->header.parent); + if (SALVSYNC_LinkVolume(vsp->header.parent, + vsp->header.id, + fileSysPartition->name, + NULL) != SYNC_OK) { + Log("schedule request failed\n"); + } +#endif + Exit(SALSRV_EXIT_VOLGROUP_LINK); + } else { + Log("%u is a read-only volume; not salvaged\n", + singleVolumeNumber); + Exit(1); + } } if (!singleVolumeNumber || (vsp->header.id == singleVolumeNumber @@ -3287,7 +3308,18 @@ Fork(void) #else f = fork(); assert(f >= 0); +#ifdef AFS_DEMAND_ATTACH_FS + if ((f == 0) && (programType == salvageServer)) { + /* we are a salvageserver child */ +#ifdef FSSYNC_BUILD_CLIENT + VChildProcReconnectFS_r(); #endif +#ifdef SALVSYNC_BUILD_CLIENT + VReconnectSALV_r(); +#endif + } +#endif /* AFS_DEMAND_ATTACH_FS */ +#endif /* !AFS_NT40_ENV */ return f; } @@ -3297,6 +3329,18 @@ Exit(code) { if (ShowLog) showlog(); + +#ifdef AFS_DEMAND_ATTACH_FS + if (programType == salvageServer) { +#ifdef SALVSYNC_BUILD_CLIENT + VDisconnectSALV(); +#endif +#ifdef FSSYNC_BUILD_CLIENT + VDisconnectFS(); +#endif + } +#endif /* AFS_DEMAND_ATTACH_FS */ + #ifdef AFS_NT40_ENV if (main_thread != pthread_self()) pthread_exit((void *)code); @@ -3427,11 +3471,11 @@ Log(const char *format, ...) syslog(LOG_INFO, "%s", tmp); } else #endif - { - gettimeofday(&now, 0); - fprintf(logFile, "%s %s", TimeStamp(now.tv_sec, 1), tmp); - fflush(logFile); - } + if (logFile) { + gettimeofday(&now, 0); + fprintf(logFile, "%s %s", TimeStamp(now.tv_sec, 1), tmp); + fflush(logFile); + } } void @@ -3448,12 +3492,12 @@ Abort(const char *format, ...) syslog(LOG_INFO, "%s", tmp); } else #endif - { - fprintf(logFile, "%s", tmp); - fflush(logFile); - if (ShowLog) - showlog(); - } + if (logFile) { + fprintf(logFile, "%s", tmp); + fflush(logFile); + if (ShowLog) + showlog(); + } if (debug) abort(); diff --git a/src/vol/vol-salvage.h b/src/vol/vol-salvage.h index 7c892204e6..da9fbec0d2 100644 --- a/src/vol/vol-salvage.h +++ b/src/vol/vol-salvage.h @@ -211,11 +211,10 @@ typedef struct { struct InodeSummary *svgp_inodeSummaryp; int svgp_count; } SVGParms_t; -#define canfork 0 -#else /* AFS_NT40_ENV */ -#define canfork 1 #endif /* AFS_NT40_ENV */ +extern int canfork; + /* prototypes */ extern void Exit(int code); diff --git a/src/vol/voldefs.h b/src/vol/voldefs.h index b546be24f3..e83bc90dd4 100644 --- a/src/vol/voldefs.h +++ b/src/vol/voldefs.h @@ -25,6 +25,8 @@ #define ROVOL 1 #define BACKVOL 2 +#define VOLMAXTYPES 3 /* _current_ max number of types */ + /* maximum numbe of Vice partitions */ #define VOLMAXPARTS 255 diff --git a/src/vol/volume.c b/src/vol/volume.c index 42fca0b2ce..8d8a2e59ce 100644 --- a/src/vol/volume.c +++ b/src/vol/volume.c @@ -2761,12 +2761,14 @@ GetVolume(Error * ec, Error * client_ec, VolId volumeId, Volume * hint, int flag } } *ec = VOFFLINE; + ReleaseVolumeHeader(vp->header); vp = NULL; break; } if (V_attachState(vp) == VOL_STATE_UNATTACHED) { *ec = VOFFLINE; + ReleaseVolumeHeader(vp->header); vp = NULL; break; } @@ -3735,8 +3737,6 @@ VConnectSALV(void) int VConnectSALV_r(void) { - assert((programType != salvageServer) && - (programType != volumeUtility)); return SALVSYNC_clientInit(); } @@ -3753,8 +3753,6 @@ VDisconnectSALV(void) int VDisconnectSALV_r(void) { - assert((programType != salvageServer) && - (programType != volumeUtility)); return SALVSYNC_clientFinis(); } @@ -3771,8 +3769,6 @@ VReconnectSALV(void) int VReconnectSALV_r(void) { - assert((programType != salvageServer) && - (programType != volumeUtility)); return SALVSYNC_clientReconnect(); } #endif /* SALVSYNC_BUILD_CLIENT */ @@ -3828,7 +3824,7 @@ VDisconnectFS(void) VOL_UNLOCK; } -static int +int VChildProcReconnectFS_r(void) { return FSYNC_clientChildProcReconnect(); diff --git a/src/volser/Makefile.in b/src/volser/Makefile.in index 226bae0f80..3f31addc86 100644 --- a/src/volser/Makefile.in +++ b/src/volser/Makefile.in @@ -90,16 +90,16 @@ volser.h volerr.c: volerr.et volser.p.h ${COMPILE_ET} -p ${srcdir} volerr -h volser volint.cs.c: volint.xg - ${RXGEN} -x -C -o $@ ${srcdir}/volint.xg + ${RXGEN} -A -x -C -o $@ ${srcdir}/volint.xg volint.ss.c: volint.xg - ${RXGEN} -x -S -o $@ ${srcdir}/volint.xg + ${RXGEN} -A -x -S -o $@ ${srcdir}/volint.xg volint.xdr.c: volint.xg - ${RXGEN} -x -c -o $@ ${srcdir}/volint.xg + ${RXGEN} -A -x -c -o $@ ${srcdir}/volint.xg volint.h: volint.xg - ${RXGEN} -x -h -o $@ ${srcdir}/volint.xg + ${RXGEN} -A -x -h -o $@ ${srcdir}/volint.xg volint.cs.c: volint.h volint.ss.c: volint.h diff --git a/src/volser/dumpstuff.c b/src/volser/dumpstuff.c index 64226b9309..85567e33c0 100644 --- a/src/volser/dumpstuff.c +++ b/src/volser/dumpstuff.c @@ -17,6 +17,7 @@ RCSID #include #include #include +#include #ifdef AFS_NT40_ENV #include #else @@ -26,13 +27,6 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #ifdef AFS_PTHREAD_ENV #include diff --git a/src/volser/lockprocs.c b/src/volser/lockprocs.c index e83eb6561a..9b1d96cc34 100644 --- a/src/volser/lockprocs.c +++ b/src/volser/lockprocs.c @@ -26,13 +26,7 @@ RCSID #else #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -108,6 +102,7 @@ SetAValue(entry, oserver, opart, nserver, npart, type) } /* Changes the RW site only */ +void Lp_SetRWValue(entry, oserver, opart, nserver, npart) struct nvldbentry *entry; afs_int32 oserver, opart, nserver, npart; @@ -116,6 +111,7 @@ Lp_SetRWValue(entry, oserver, opart, nserver, npart) } /* Changes the RO site only */ +void Lp_SetROValue(entry, oserver, opart, nserver, npart) struct nvldbentry *entry; afs_int32 oserver, opart, nserver, npart; @@ -149,6 +145,7 @@ Lp_GetRwIndex(entry) } /*initialize queue pointed by */ +void Lp_QInit(ahead) struct qHead *ahead; { @@ -157,6 +154,7 @@ Lp_QInit(ahead) } /*add in front of queue */ +void Lp_QAdd(ahead, elem) struct qHead *ahead; struct aqueue *elem; @@ -198,6 +196,7 @@ Lp_QScan(ahead, id, success, elem) /*return the element in the beginning of the queue , free *the space used by that element . indicates if enumeration was ok*/ +void Lp_QEnumerate(ahead, success, elem) struct qHead *ahead; struct aqueue *elem; @@ -223,6 +222,7 @@ Lp_QEnumerate(ahead, success, elem) *success = 0; } +void Lp_QTraverse(ahead) struct qHead *ahead; { diff --git a/src/volser/physio.c b/src/volser/physio.c index 31cac6523e..f285d74167 100644 --- a/src/volser/physio.c +++ b/src/volser/physio.c @@ -21,13 +21,7 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #ifdef AFS_SUN5_ENV #include #endif diff --git a/src/volser/restorevol.c b/src/volser/restorevol.c index 341c0d978d..aadac4c966 100644 --- a/src/volser/restorevol.c +++ b/src/volser/restorevol.c @@ -64,14 +64,7 @@ RCSID #include #include #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif char rootdir[MAXPATHLEN]; @@ -125,7 +118,7 @@ readchar() #define BUFSIZE 16384 char buf[BUFSIZE]; -char +void readdata(buffer, size) char *buffer; afs_sfsize_t size; @@ -799,9 +792,8 @@ ReadVNode(count) return ((afs_int32) tag); } -WorkerBee(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +WorkerBee(struct cmd_syndesc *as, void *arock) { int code = 0, c, len; afs_int32 type, count, vcount; diff --git a/src/volser/vol-dump.c b/src/volser/vol-dump.c index 47ee1fa19c..0686addd16 100644 --- a/src/volser/vol-dump.c +++ b/src/volser/vol-dump.c @@ -166,7 +166,7 @@ AttachVolume(struct DiskPartition * dp, char *volname, static int -handleit(struct cmd_syndesc *as, char *arock) +handleit(struct cmd_syndesc *as, void *arock) { register struct cmd_item *ti; int err = 0; @@ -291,7 +291,7 @@ main(int argc, char **argv) VInitVolumePackage(volumeUtility, 5, 5, DONT_CONNECT_FS, 0); - ts = cmd_CreateSyntax(NULL, handleit, 0, + ts = cmd_CreateSyntax(NULL, handleit, NULL, "Dump a volume to a 'vos dump' format file without using volserver"); cmd_AddParm(ts, "-part", CMD_LIST, CMD_OPTIONAL, "AFS partition name"); cmd_AddParm(ts, "-volumeid", CMD_LIST, CMD_OPTIONAL, "Volume id"); diff --git a/src/volser/volmain.c b/src/volser/volmain.c index d738027bba..087ddf7712 100644 --- a/src/volser/volmain.c +++ b/src/volser/volmain.c @@ -14,6 +14,7 @@ RCSID ("$Header$"); #include +#include #ifdef AFS_NT40_ENV #include #include @@ -24,13 +25,6 @@ RCSID #include #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include #include #include @@ -584,4 +578,5 @@ main(int argc, char **argv) osi_audit(VS_FinishEvent, (-1), AUD_END); Abort("StartServer returned?"); + return 0; /* not reached */ } diff --git a/src/volser/volprocs.c b/src/volser/volprocs.c index 1b772b8e7a..6e53cea8b5 100644 --- a/src/volser/volprocs.c +++ b/src/volser/volprocs.c @@ -15,6 +15,7 @@ RCSID #include #include +#include #include #ifdef AFS_NT40_ENV #include @@ -25,14 +26,6 @@ RCSID #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -198,7 +191,7 @@ XAttachVolume(afs_int32 *error, afs_int32 avolid, afs_int32 apartid, int amode) *error = EINVAL; return NULL; } - tv = VAttachVolumeByName(error, pbuf, vbuf, amode); + tv = VAttachVolumeByName((Error *)error, pbuf, vbuf, amode); return tv; } @@ -210,14 +203,14 @@ ViceCreateRoot(Volume *vp) struct acl_accessList *ACL; ViceFid did; Inode inodeNumber, nearInode; - char buf[SIZEOF_LARGEDISKVNODE]; - struct VnodeDiskObject *vnode = (struct VnodeDiskObject *)buf; + struct VnodeDiskObject *vnode; struct VnodeClassInfo *vcp = &VnodeClassInfo[vLarge]; IHandle_t *h; FdHandle_t *fdP; int code; afs_fsize_t length; + vnode = (struct VnodeDiskObject *)malloc(SIZEOF_LARGEDISKVNODE); memset(vnode, 0, SIZEOF_LARGEDISKVNODE); V_pref(vp, nearInode); @@ -282,6 +275,7 @@ ViceCreateRoot(Volume *vp) VNDISK_GET_LEN(length, vnode); V_diskused(vp) = nBlocks(length); + free(vnode); return 1; } @@ -1650,8 +1644,7 @@ VolListPartitions(struct rx_call *acid, struct pIDs *partIds) namehead[7] = '\0'; for (i = 0; i < 26; i++) { namehead[6] = i + 'a'; - if (VGetPartition(namehead, 0)) - partIds->partIds[i] = VGetPartition(namehead, 0) ? i : -1; + partIds->partIds[i] = VGetPartition(namehead, 0) ? i : -1; } return 0; @@ -2069,11 +2062,6 @@ VolXListOneVolume(struct rx_call *a_rxCidP, afs_int32 a_partID, xInfoP->accessDate = volDiskDataP->accessDate; xInfoP->updateDate = volDiskDataP->updateDate; xInfoP->backupDate = volDiskDataP->backupDate; - now = FT_ApproxTime(); - if (now - volDiskDataP->dayUseDate > OneDay) - xInfoP->dayUse = 0; - else - xInfoP->dayUse = volDiskDataP->dayUse; xInfoP->filecount = volDiskDataP->filecount; xInfoP->maxquota = volDiskDataP->maxquota; xInfoP->size = volDiskDataP->diskused; @@ -2081,8 +2069,15 @@ VolXListOneVolume(struct rx_call *a_rxCidP, afs_int32 a_partID, /* * Copy out the stat fields in a single operation. */ - memcpy((char *)&(xInfoP->stat_reads[0]), + now = FT_ApproxTime(); + if (now - volDiskDataP->dayUseDate > OneDay) { + xInfoP->dayUse = 0; + memset((char *)&(xInfoP->stat_reads[0]), 0, numStatBytes); + } else { + xInfoP->dayUse = volDiskDataP->dayUse; + memcpy((char *)&(xInfoP->stat_reads[0]), (char *)&(volDiskDataP->stat_reads[0]), numStatBytes); + } /* * We're done copying. Detach the volume and iterate (at this @@ -2764,116 +2759,65 @@ VolSetDate(struct rx_call *acid, afs_int32 atid, afs_int32 cdate) return error; } -#ifdef AFS_NAMEI_ENV -/* - * Inode number format (from namei_ops.c): - * low 26 bits - vnode number - all 1's if volume special file. - * next 3 bits - tag - * next 3 bits spare (0's) - * high 32 bits - uniquifier (regular) or type if spare - */ -#define NAMEI_VNODEMASK 0x003ffffff -#define NAMEI_TAGMASK 0x7 -#define NAMEI_TAGSHIFT 26 -#define NAMEI_UNIQMASK 0xffffffff -#define NAMEI_UNIQSHIFT 32 -#define NAMEI_INODESPECIAL ((Inode)NAMEI_VNODEMASK) -#define NAMEI_VNODESPECIAL NAMEI_VNODEMASK -#endif /* AFS_NAMEI_ENV */ - afs_int32 SAFSVolConvertROtoRWvolume(struct rx_call *acid, afs_int32 partId, afs_int32 volumeId) { -#if defined(AFS_NAMEI_ENV) && !defined(AFS_NT40_ENV) - DIR *dirp; - char pname[16]; - char volname[20]; - afs_int32 error = 0; - afs_int32 volid; - int found = 0; +#ifdef AFS_NT40_ENV + return EXDEV; +#else char caller[MAXKTCNAMELEN]; - char headername[16]; - char opath[256]; - char npath[256]; - struct VolumeDiskHeader h; - int fd; - IHandle_t *ih; - Inode ino; - struct DiskPartition *dp; + DIR *dirp; + register struct volser_trans *ttc; + char pname[16], volname[20]; + struct DiskPartition *partP; + afs_int32 ret = ENODEV; + afs_int32 volid; if (!afsconf_SuperUser(tdir, acid, caller)) return VOLSERBAD_ACCESS; /*not a super user */ if (GetPartName(partId, pname)) - return VOLSERILLEGAL_PARTITION; - dirp = opendir(pname); + return VOLSERILLEGAL_PARTITION; + if (!(partP = VGetPartition(pname, 0))) + return VOLSERILLEGAL_PARTITION; + dirp = opendir(VPartitionPath(partP)); if (dirp == NULL) return VOLSERILLEGAL_PARTITION; strcpy(volname, ""); + ttc = (struct volser_trans *)0; - while (strcmp(volname, "EOD") && !found) { /*while there are more volumes in the partition */ - GetNextVol(dirp, volname, &volid); - if (strcmp(volname, "")) { /* its a volume */ - if (volid == volumeId) - found = 1; + while (strcmp(volname, "EOD")) { + if (!strcmp(volname, "")) { /* its not a volume, fetch next file */ + GetNextVol(dirp, volname, &volid); + continue; /*back to while loop */ + } + + if (volid == volumeId) { /*copy other things too */ +#ifndef AFS_PTHREAD_ENV + IOMGR_Poll(); /*make sure that the client doesnot time out */ +#endif + ttc = NewTrans(volumeId, partId); + if (!ttc) { + return VBUSY; + } +#ifdef AFS_NAMEI_ENV + ret = namei_ConvertROtoRWvolume(pname, volumeId); +#else + ret = inode_ConvertROtoRWvolume(pname, volumeId); +#endif + break; } + GetNextVol(dirp, volname, &volid); } - if (!found) - return ENOENT; - (void)afs_snprintf(headername, sizeof headername, VFORMAT, volumeId); - (void)afs_snprintf(opath, sizeof opath, "%s/%s", pname, headername); - fd = open(opath, O_RDONLY); - if (fd < 0) { - Log("1 SAFS_VolConvertROtoRWvolume: Couldn't open header for RO-volume %lu.\n", volumeId); - return ENOENT; + + if (ttc) { + DeleteTrans(ttc, 1); + ttc = (struct volser_trans *)0; } - if (read(fd, &h, sizeof(h)) != sizeof(h)) { - Log("1 SAFS_VolConvertROtoRWvolume: Couldn't read header for RO-volume %lu.\n", volumeId); - close(fd); - return EIO; - } - close(fd); - FSYNC_VolOp(volumeId, pname, FSYNC_VOL_BREAKCBKS, 0, NULL); - - for (dp = DiskPartitionList; dp && strcmp(dp->name, pname); - dp = dp->next); - if (!dp) { - Log("1 SAFS_VolConvertROtoRWvolume: Couldn't find DiskPartition for %s\n", pname); - return EIO; - } - ino = namei_MakeSpecIno(h.parent, VI_LINKTABLE); - IH_INIT(ih, dp->device, h.parent, ino); - - error = namei_ConvertROtoRWvolume(ih, volumeId); - if (error) - return error; - h.id = h.parent; - h.volumeInfo_hi = h.id; - h.smallVnodeIndex_hi = h.id; - h.largeVnodeIndex_hi = h.id; - h.linkTable_hi = h.id; - (void)afs_snprintf(headername, sizeof headername, VFORMAT, h.id); - (void)afs_snprintf(npath, sizeof npath, "%s/%s", pname, headername); - fd = open(npath, O_CREAT | O_EXCL | O_RDWR, 0644); - if (fd < 0) { - Log("1 SAFS_VolConvertROtoRWvolume: Couldn't create header for RW-volume %lu.\n", h.id); - return EIO; - } - if (write(fd, &h, sizeof(h)) != sizeof(h)) { - Log("1 SAFS_VolConvertROtoRWvolume: Couldn't write header for RW-volume %lu.\n", h.id); - close(fd); - return EIO; - } - close(fd); - if (unlink(opath) < 0) { - Log("1 SAFS_VolConvertROtoRWvolume: Couldn't unlink RO header, error = %d\n", error); - } - FSYNC_VolOp(volumeId, pname, FSYNC_VOL_DONE, 0, NULL); - FSYNC_VolOp(h.id, pname, FSYNC_VOL_ON, 0, NULL); - return 0; -#else /* AFS_NAMEI_ENV */ - return EINVAL; -#endif /* AFS_NAMEI_ENV */ + + closedir(dirp); + return ret; +#endif } afs_int32 diff --git a/src/volser/voltrans.c b/src/volser/voltrans.c index 0ef9acba1f..df5f20f03a 100644 --- a/src/volser/voltrans.c +++ b/src/volser/voltrans.c @@ -29,6 +29,7 @@ RCSID #include #include #include +#include #ifdef AFS_NT40_ENV #include #include @@ -61,14 +62,6 @@ RCSID #include #include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include "volser.h" /*@printflike@*/ extern void Log(const char *format, ...); diff --git a/src/volser/vos.c b/src/volser/vos.c index fb28127478..69819b2178 100644 --- a/src/volser/vos.c +++ b/src/volser/vos.c @@ -14,6 +14,7 @@ RCSID ("$Header$"); #include +#include #ifdef AFS_NT40_ENV #include #include @@ -31,14 +32,6 @@ RCSID #endif #include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -350,21 +343,21 @@ WriteData(struct rx_call *call, char *rock) error = VOLSERBADOP; goto wfail; } + /* test if we have a valid dump */ + hset64(filesize, 0, 0); + USD_SEEK(ufd, filesize, SEEK_END, &currOffset); + hset64(filesize, hgethi(currOffset), hgetlo(currOffset)-sizeof(afs_uint32)); + USD_SEEK(ufd, filesize, SEEK_SET, &currOffset); + USD_READ(ufd, &buffer, sizeof(afs_uint32), &got); + if ((got != sizeof(afs_uint32)) || (ntohl(buffer) != DUMPENDMAGIC)) { + fprintf(STDERR, "Signature missing from end of file '%s'\n", filename); + error = VOLSERBADOP; + goto wfail; + } + /* rewind, we are done */ + hset64(filesize, 0, 0); + USD_SEEK(ufd, filesize, SEEK_SET, &currOffset); } - /* test if we have a valid dump */ - hset64(filesize, 0, 0); - USD_SEEK(ufd, filesize, SEEK_END, &currOffset); - hset64(filesize, hgethi(currOffset), hgetlo(currOffset)-sizeof(afs_uint32)); - USD_SEEK(ufd, filesize, SEEK_SET, &currOffset); - USD_READ(ufd, &buffer, sizeof(afs_uint32), &got); - if ((got != sizeof(afs_uint32)) || (ntohl(buffer) != DUMPENDMAGIC)) { - fprintf(STDERR, "Signature missing from end of file '%s'\n", filename); - error = VOLSERBADOP; - goto wfail; - } - hset64(filesize, 0, 0); - USD_SEEK(ufd, filesize, SEEK_SET, &currOffset); - /* rewind, we are done */ code = SendFile(ufd, call, blksize); if (code) { error = code; @@ -1472,9 +1465,8 @@ VolumeStats(pntr, entry, server, part, voltype) } /* command to forcibly remove a volume */ -static -NukeVolume(as) - register struct cmd_syndesc *as; +static int +NukeVolume(register struct cmd_syndesc *as) { register afs_int32 code; afs_int32 volID, err; @@ -1538,9 +1530,8 @@ NukeVolume(as) * As advertised. *------------------------------------------------------------------------ */ -static -ExamineVolume(as) - register struct cmd_syndesc *as; +static int +ExamineVolume(register struct cmd_syndesc *as, void *arock) { struct nvldbentry entry; afs_int32 vcode = 0; @@ -1691,9 +1682,8 @@ ExamineVolume(as) * As advertised. *------------------------------------------------------------------------ */ -static -SetFields(as) - register struct cmd_syndesc *as; +static int +SetFields(register struct cmd_syndesc *as, void *arock) { struct nvldbentry entry; afs_int32 vcode = 0; @@ -1776,9 +1766,8 @@ SetFields(as) * As advertised. *------------------------------------------------------------------------ */ -static -volOnline(as) - register struct cmd_syndesc *as; +static int +volOnline(register struct cmd_syndesc *as, void *arock) { afs_int32 server, partition, volid; afs_int32 code, err = 0; @@ -1837,7 +1826,7 @@ volOnline(as) *------------------------------------------------------------------------ */ static int -volOffline(register struct cmd_syndesc *as) +volOffline(register struct cmd_syndesc *as, void *arock) { afs_int32 server, partition, volid; afs_int32 code, err = 0; @@ -1887,7 +1876,7 @@ volOffline(register struct cmd_syndesc *as) } static int -CreateVolume(register struct cmd_syndesc *as) +CreateVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 pnum; char part[10]; @@ -1995,9 +1984,8 @@ DeleteAll(entry) return error; } -static -DeleteVolume(as) - struct cmd_syndesc *as; +static int +DeleteVolume(struct cmd_syndesc *as, void *arock) { afs_int32 err, code = 0; afs_int32 server = 0, partition = -1, volid; @@ -2117,8 +2105,7 @@ DeleteVolume(as) #define TESTM 0 /* set for move space tests, clear for production */ static -MoveVolume(as) - register struct cmd_syndesc *as; +MoveVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 volid, fromserver, toserver, frompart, topart; @@ -2244,9 +2231,8 @@ MoveVolume(as) return 0; } -static -CopyVolume(as) - register struct cmd_syndesc *as; +static int +CopyVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 volid, fromserver, toserver, frompart, topart, code, err, flags; char fromPartName[10], toPartName[10], *tovolume; @@ -2391,9 +2377,8 @@ CopyVolume(as) } -static -ShadowVolume(as) - register struct cmd_syndesc *as; +static int +ShadowVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 volid, fromserver, toserver, frompart, topart, tovolid; afs_int32 code, err, flags; @@ -2588,9 +2573,8 @@ ShadowVolume(as) } -static -CloneVolume(as) - register struct cmd_syndesc *as; +static int +CloneVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 server, part, volid, cloneid, voltype; char partName[10], *volname; @@ -2696,9 +2680,8 @@ CloneVolume(as) } -static -BackupVolume(as) - register struct cmd_syndesc *as; +static int +BackupVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aserver, apart, vtype, code, err; struct nvldbentry entry; @@ -2765,9 +2748,8 @@ BackupVolume(as) return 0; } -static -ReleaseVolume(as) - register struct cmd_syndesc *as; +static int +ReleaseVolume(register struct cmd_syndesc *as, void *arock) { struct nvldbentry entry; @@ -2812,9 +2794,7 @@ ReleaseVolume(as) } static -DumpVolume(as) - register struct cmd_syndesc *as; - +DumpVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aserver, apart, voltype, fromdate = 0, code, err, i, flags; char filename[MAXPATHLEN]; @@ -2913,10 +2893,8 @@ retry_dump: #define TS_KEEP 2 #define TS_NEW 3 -static -RestoreVolume(as) - register struct cmd_syndesc *as; - +static int +RestoreVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aparentid, aserver, apart, code, vcode, err; afs_int32 aoverwrite = ASK; @@ -3205,10 +3183,8 @@ RestoreVolume(as) return 0; } -static -LockReleaseCmd(as) - register struct cmd_syndesc *as; - +static int +LockReleaseCmd(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, code, err; @@ -3232,9 +3208,8 @@ LockReleaseCmd(as) return 0; } -static -AddSite(as) - register struct cmd_syndesc *as; +static int +AddSite(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aserver, apart, code, err; char apartName[10], avolname[VOLSER_MAXVOLNAME + 1]; @@ -3281,9 +3256,8 @@ AddSite(as) return 0; } -static -RemoveSite(as) - register struct cmd_syndesc *as; +static int +RemoveSite(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aserver, apart, code, err; @@ -3333,9 +3307,8 @@ RemoveSite(as) return 0; } -static -ChangeLocation(as) - register struct cmd_syndesc *as; +static int +ChangeLocation(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aserver, apart, code, err; char apartName[10]; @@ -3381,9 +3354,8 @@ ChangeLocation(as) return 0; } -static -ListPartitions(as) - register struct cmd_syndesc *as; +static int +ListPartitions(register struct cmd_syndesc *as, void *arock) { afs_int32 aserver, code; struct partList dummyPartList; @@ -3547,8 +3519,7 @@ XCompareVolID(a_obj1P, a_obj2P) *------------------------------------------------------------------------*/ static -ListVolumes(as) - register struct cmd_syndesc *as; +ListVolumes(register struct cmd_syndesc *as, void *arock) { afs_int32 apart, int32list, fast; afs_int32 aserver, code; @@ -3703,9 +3674,8 @@ ListVolumes(as) return 0; } -static -SyncVldb(as) - register struct cmd_syndesc *as; +static int +SyncVldb(register struct cmd_syndesc *as, void *arock) { afs_int32 pnum = 0, code; /* part name */ char part[10]; @@ -3782,10 +3752,8 @@ SyncVldb(as) return 0; } -static -SyncServer(as) - register struct cmd_syndesc *as; - +static int +SyncServer(register struct cmd_syndesc *as, void *arock) { afs_int32 pnum, code; /* part name */ char part[10]; @@ -3863,10 +3831,8 @@ VolumeInfoCmd(name) return 0; } -static -VolumeZap(as) - register struct cmd_syndesc *as; - +static int +VolumeZap(register struct cmd_syndesc *as, void *arock) { struct nvldbentry entry; afs_int32 volid, code, server, part, zapbackupid = 0, backupid = 0, err; @@ -3950,10 +3916,8 @@ VolumeZap(as) return 0; } -static -VolserStatus(as) - register struct cmd_syndesc *as; - +static int +VolserStatus(register struct cmd_syndesc *as, void *arock) { afs_int32 server, code; transDebugInfo *pntr, *oldpntr; @@ -4043,9 +4007,8 @@ VolserStatus(as) return 0; } -static -RenameVolume(as) - register struct cmd_syndesc *as; +static int +RenameVolume(register struct cmd_syndesc *as, void *arock) { afs_int32 code1, code2, code; struct nvldbentry entry; @@ -4164,10 +4127,8 @@ GetVolumeInfo(volid, server, part, voltype, rentry) return -1; } -static -DeleteEntry(as) - register struct cmd_syndesc *as; - +static int +DeleteEntry(register struct cmd_syndesc *as, void *arock) { afs_int32 apart; afs_int32 avolid; @@ -4389,9 +4350,8 @@ char *p1,*p2; } */ -static -ListVLDB(as) - struct cmd_syndesc *as; +static int +ListVLDB(struct cmd_syndesc *as, void *arock) { afs_int32 apart; afs_int32 aserver, code; @@ -4560,9 +4520,8 @@ ListVLDB(as) return 0; } -static -BackSys(as) - register struct cmd_syndesc *as; +static int +BackSys(register struct cmd_syndesc *as, void *arock) { afs_int32 apart = 0, avolid; afs_int32 aserver = 0, code, aserver1, apart1; @@ -4890,9 +4849,8 @@ BackSys(as) return 0; } -static -UnlockVLDB(as) - register struct cmd_syndesc *as; +static int +UnlockVLDB(register struct cmd_syndesc *as, void *arock) { afs_int32 apart; afs_int32 aserver, code; @@ -5020,9 +4978,8 @@ PrintInt64Size(afs_uint64 in) return output; } -static -PartitionInfo(as) - register struct cmd_syndesc *as; +static int +PartitionInfo(register struct cmd_syndesc *as, void *arock) { afs_int32 apart; afs_int32 aserver, code; @@ -5105,10 +5062,8 @@ PartitionInfo(as) return 0; } -static -ChangeAddr(as) - register struct cmd_syndesc *as; - +static int +ChangeAddr(register struct cmd_syndesc *as, void *arock) { afs_int32 ip1, ip2, vcode; int remove = 0; @@ -5255,9 +5210,8 @@ print_addrs(const bulkaddrs * addrs, const afsUUID * m_uuid, int nentries, return; } -static -ListAddrs(as) - register struct cmd_syndesc *as; +static int +ListAddrs(register struct cmd_syndesc *as, void *arock) { afs_int32 vcode; afs_int32 i, noresolve = 0, printuuid = 0; @@ -5363,10 +5317,8 @@ ListAddrs(as) return 0; } -static -LockEntry(as) - register struct cmd_syndesc *as; - +static int +LockEntry(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, vcode, err; @@ -5391,10 +5343,8 @@ LockEntry(as) return 0; } -static -ConvertRO(as) - register struct cmd_syndesc *as; - +static int +ConvertRO(register struct cmd_syndesc *as, void *arock) { afs_int32 partition = -1; afs_int32 server, volid, code, i, same; @@ -5557,9 +5507,8 @@ ConvertRO(as) return code; } -static -Sizes(as) - register struct cmd_syndesc *as; +static int +Sizes(register struct cmd_syndesc *as, void *arock) { afs_int32 avolid, aserver, apart, voltype, fromdate = 0, code, err, i; struct nvldbentry entry; @@ -5658,10 +5607,8 @@ PrintDiagnostics(astring, acode) } -static -MyBeforeProc(as, arock) - struct cmd_syndesc *as; - char *arock; +static int +MyBeforeProc(struct cmd_syndesc *as, void *arock) { register char *tcell; register afs_int32 code; @@ -5742,7 +5689,7 @@ main(argc, argv) cmd_SetBeforeProc(MyBeforeProc, NULL); - ts = cmd_CreateSyntax("create", CreateVolume, 0, "create a new volume"); + ts = cmd_CreateSyntax("create", CreateVolume, NULL, "create a new volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "volume name"); @@ -5753,14 +5700,14 @@ main(argc, argv) #endif COMMONPARMS; - ts = cmd_CreateSyntax("remove", DeleteVolume, 0, "delete a volume"); + ts = cmd_CreateSyntax("remove", DeleteVolume, NULL, "delete a volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("move", MoveVolume, 0, "move a volume"); + ts = cmd_CreateSyntax("move", MoveVolume, NULL, "move a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-fromserver", CMD_SINGLE, 0, "machine name on source"); cmd_AddParm(ts, "-frompartition", CMD_SINGLE, 0, @@ -5773,7 +5720,7 @@ main(argc, argv) "copy live volume without cloning"); COMMONPARMS; - ts = cmd_CreateSyntax("copy", CopyVolume, 0, "copy a volume"); + ts = cmd_CreateSyntax("copy", CopyVolume, NULL, "copy a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID on source"); cmd_AddParm(ts, "-fromserver", CMD_SINGLE, 0, "machine name on source"); cmd_AddParm(ts, "-frompartition", CMD_SINGLE, 0, @@ -5791,7 +5738,7 @@ main(argc, argv) "copy live volume without cloning"); COMMONPARMS; - ts = cmd_CreateSyntax("shadow", ShadowVolume, 0, + ts = cmd_CreateSyntax("shadow", ShadowVolume, NULL, "make or update a shadow volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID on source"); cmd_AddParm(ts, "-fromserver", CMD_SINGLE, 0, "machine name on source"); @@ -5815,12 +5762,12 @@ main(argc, argv) "do incremental update if target exists"); COMMONPARMS; - ts = cmd_CreateSyntax("backup", BackupVolume, 0, + ts = cmd_CreateSyntax("backup", BackupVolume, NULL, "make backup of a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("clone", CloneVolume, 0, + ts = cmd_CreateSyntax("clone", CloneVolume, NULL, "make clone of a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "server"); @@ -5835,13 +5782,13 @@ main(argc, argv) "make clone volume read-only, not readwrite"); COMMONPARMS; - ts = cmd_CreateSyntax("release", ReleaseVolume, 0, "release a volume"); + ts = cmd_CreateSyntax("release", ReleaseVolume, NULL, "release a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "force a complete release"); COMMONPARMS; - ts = cmd_CreateSyntax("dump", DumpVolume, 0, "dump a volume"); + ts = cmd_CreateSyntax("dump", DumpVolume, NULL, "dump a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-time", CMD_SINGLE, CMD_OPTIONAL, "dump from time"); cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "dump file"); @@ -5853,7 +5800,7 @@ main(argc, argv) "omit unchanged directories from an incremental dump"); COMMONPARMS; - ts = cmd_CreateSyntax("restore", RestoreVolume, 0, "restore a volume"); + ts = cmd_CreateSyntax("restore", RestoreVolume, NULL, "restore a volume"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name of volume to be restored"); @@ -5871,12 +5818,12 @@ main(argc, argv) "dump | keep | new"); COMMONPARMS; - ts = cmd_CreateSyntax("unlock", LockReleaseCmd, 0, + ts = cmd_CreateSyntax("unlock", LockReleaseCmd, NULL, "release lock on VLDB entry for a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("changeloc", ChangeLocation, 0, + ts = cmd_CreateSyntax("changeloc", ChangeLocation, NULL, "change an RW volume's location in the VLDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name for new location"); @@ -5885,25 +5832,25 @@ main(argc, argv) cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("addsite", AddSite, 0, "add a replication site"); + ts = cmd_CreateSyntax("addsite", AddSite, NULL, "add a replication site"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name for new site"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name for new site"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("remsite", RemoveSite, 0, + ts = cmd_CreateSyntax("remsite", RemoveSite, NULL, "remove a replication site"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("listpart", ListPartitions, 0, "list partitions"); + ts = cmd_CreateSyntax("listpart", ListPartitions, NULL, "list partitions"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); COMMONPARMS; - ts = cmd_CreateSyntax("listvol", ListVolumes, 0, + ts = cmd_CreateSyntax("listvol", ListVolumes, NULL, "list volumes on server (bypass VLDB)"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); @@ -5920,20 +5867,20 @@ main(argc, argv) #endif /* FULL_LISTVOL_SWITCH */ COMMONPARMS; - ts = cmd_CreateSyntax("syncvldb", SyncVldb, 0, + ts = cmd_CreateSyntax("syncvldb", SyncVldb, NULL, "synchronize VLDB with server"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_OPTIONAL, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("syncserv", SyncServer, 0, + ts = cmd_CreateSyntax("syncserv", SyncServer, NULL, "synchronize server with VLDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); COMMONPARMS; - ts = cmd_CreateSyntax("examine", ExamineVolume, 0, + ts = cmd_CreateSyntax("examine", ExamineVolume, NULL, "everything about the volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-extended", CMD_FLAG, CMD_OPTIONAL, @@ -5945,7 +5892,7 @@ main(argc, argv) COMMONPARMS; cmd_CreateAlias(ts, "volinfo"); - ts = cmd_CreateSyntax("setfields", SetFields, 0, + ts = cmd_CreateSyntax("setfields", SetFields, NULL, "change volume info fields"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-maxquota", CMD_SINGLE, CMD_OPTIONAL, "quota (KB)"); @@ -5953,7 +5900,7 @@ main(argc, argv) cmd_AddParm(ts, "-clearVolUpCounter", CMD_FLAG, CMD_OPTIONAL, "clear volUpdateCounter"); COMMONPARMS; - ts = cmd_CreateSyntax("offline", volOffline, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("offline", volOffline, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "server name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); @@ -5961,13 +5908,13 @@ main(argc, argv) cmd_AddParm(ts, "-busy", CMD_FLAG, CMD_OPTIONAL, "busy volume"); COMMONPARMS; - ts = cmd_CreateSyntax("online", volOnline, 0, (char *)CMD_HIDDEN); + ts = cmd_CreateSyntax("online", volOnline, NULL, (char *)CMD_HIDDEN); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "server name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("zap", VolumeZap, 0, + ts = cmd_CreateSyntax("zap", VolumeZap, NULL, "delete the volume, don't bother with VLDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); @@ -5978,17 +5925,17 @@ main(argc, argv) "also delete backup volume if one is found"); COMMONPARMS; - ts = cmd_CreateSyntax("status", VolserStatus, 0, + ts = cmd_CreateSyntax("status", VolserStatus, NULL, "report on volser status"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); COMMONPARMS; - ts = cmd_CreateSyntax("rename", RenameVolume, 0, "rename a volume"); + ts = cmd_CreateSyntax("rename", RenameVolume, NULL, "rename a volume"); cmd_AddParm(ts, "-oldname", CMD_SINGLE, 0, "old volume name "); cmd_AddParm(ts, "-newname", CMD_SINGLE, 0, "new volume name "); COMMONPARMS; - ts = cmd_CreateSyntax("listvldb", ListVLDB, 0, + ts = cmd_CreateSyntax("listvldb", ListVLDB, NULL, "list volumes in the VLDB"); cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "volume name or ID"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "machine name"); @@ -6000,7 +5947,7 @@ main(argc, argv) "do not alphabetically sort the volume names"); COMMONPARMS; - ts = cmd_CreateSyntax("backupsys", BackSys, 0, "en masse backups"); + ts = cmd_CreateSyntax("backupsys", BackSys, NULL, "en masse backups"); cmd_AddParm(ts, "-prefix", CMD_LIST, CMD_OPTIONAL, "common prefix on volume(s)"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "machine name"); @@ -6012,7 +5959,7 @@ main(argc, argv) cmd_AddParm(ts, "-dryrun", CMD_FLAG, CMD_OPTIONAL, "no action"); COMMONPARMS; - ts = cmd_CreateSyntax("delentry", DeleteEntry, 0, + ts = cmd_CreateSyntax("delentry", DeleteEntry, NULL, "delete VLDB entry for a volume"); cmd_AddParm(ts, "-id", CMD_LIST, CMD_OPTIONAL, "volume name or ID"); cmd_AddParm(ts, "-prefix", CMD_SINGLE, CMD_OPTIONAL, @@ -6023,7 +5970,7 @@ main(argc, argv) "no execute"); COMMONPARMS; - ts = cmd_CreateSyntax("partinfo", PartitionInfo, 0, + ts = cmd_CreateSyntax("partinfo", PartitionInfo, NULL, "list partition information"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); @@ -6031,18 +5978,18 @@ main(argc, argv) "print storage summary"); COMMONPARMS; - ts = cmd_CreateSyntax("unlockvldb", UnlockVLDB, 0, + ts = cmd_CreateSyntax("unlockvldb", UnlockVLDB, NULL, "unlock all the locked entries in the VLDB"); cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); COMMONPARMS; - ts = cmd_CreateSyntax("lock", LockEntry, 0, + ts = cmd_CreateSyntax("lock", LockEntry, NULL, "lock VLDB entry for a volume"); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); COMMONPARMS; - ts = cmd_CreateSyntax("changeaddr", ChangeAddr, 0, + ts = cmd_CreateSyntax("changeaddr", ChangeAddr, NULL, "change the IP address of a file server"); cmd_AddParm(ts, "-oldaddr", CMD_SINGLE, 0, "original IP address"); cmd_AddParm(ts, "-newaddr", CMD_SINGLE, CMD_OPTIONAL, "new IP address"); @@ -6050,7 +5997,7 @@ main(argc, argv) "remove the IP address from the VLDB"); COMMONPARMS; - ts = cmd_CreateSyntax("listaddrs", ListAddrs, 0, + ts = cmd_CreateSyntax("listaddrs", ListAddrs, NULL, "list the IP address of all file servers registered in the VLDB"); cmd_AddParm(ts, "-uuid", CMD_SINGLE, CMD_OPTIONAL, "uuid of server"); cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_OPTIONAL, "address of host"); @@ -6060,7 +6007,7 @@ main(argc, argv) "print uuid of hosts"); COMMONPARMS; - ts = cmd_CreateSyntax("convertROtoRW", ConvertRO, 0, + ts = cmd_CreateSyntax("convertROtoRW", ConvertRO, NULL, "convert a RO volume into a RW volume (after loss of old RW volume)"); cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name"); cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name"); @@ -6068,7 +6015,7 @@ main(argc, argv) cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "don't ask"); COMMONPARMS; - ts = cmd_CreateSyntax("size", Sizes, 0, + ts = cmd_CreateSyntax("size", Sizes, NULL, "obtain various sizes of the volume."); cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID"); cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name"); diff --git a/src/volser/vsprocs.c b/src/volser/vsprocs.c index d62febca2e..70bfdb8967 100644 --- a/src/volser/vsprocs.c +++ b/src/volser/vsprocs.c @@ -16,6 +16,7 @@ RCSID #include #include #include +#include #ifdef AFS_AIX_ENV #include #endif @@ -27,14 +28,6 @@ RCSID #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include @@ -654,7 +647,7 @@ UV_CreateVolume2(afs_int32 aserver, afs_int32 apart, char *aname, code = AFSVolSetInfo(aconn, tid, &tstatus); if (code) - EPRINT(code, "Could not change quota (error %d), continuing...\n"); + EPRINT(code, "Could not change quota, continuing...\n"); code = AFSVolSetFlags(aconn, tid, 0); /* bring it online (mark it InService */ EGOTO2(cfail, vcode, "Could not bring the volume %s %u online \n", aname, diff --git a/src/volser/vsutils.c b/src/volser/vsutils.c index 8a13b7f933..faf759ff7c 100644 --- a/src/volser/vsutils.c +++ b/src/volser/vsutils.c @@ -14,6 +14,7 @@ RCSID ("$Header$"); #include +#include #ifdef AFS_NT40_ENV #include #include @@ -28,14 +29,6 @@ RCSID #include #endif -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif - #include #include #include diff --git a/src/xstat/xstat_cm.c b/src/xstat/xstat_cm.c index 109df3d483..c049ed3731 100644 --- a/src/xstat/xstat_cm.c +++ b/src/xstat/xstat_cm.c @@ -24,14 +24,7 @@ RCSID #include /*Lightweight process package */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #define LWP_STACK_SIZE (16 * 1024) diff --git a/src/xstat/xstat_cm_test.c b/src/xstat/xstat_cm_test.c index 95fb3bb5e3..3da9dba2c9 100644 --- a/src/xstat/xstat_cm_test.c +++ b/src/xstat/xstat_cm_test.c @@ -22,13 +22,7 @@ RCSID #include "xstat_cm.h" /*Interface for xstat_cm module */ #include /*Command line interpreter */ #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* * External routines that don't have explicit include file definitions. @@ -158,6 +152,7 @@ PrintCallInfo() /* Print detailed functional call statistics */ +void print_cmCallStats() { static char rn[] = "print_cmCallStats"; /*Routine name */ @@ -1238,9 +1233,7 @@ CountListItems(a_firstItem) *------------------------------------------------------------------------*/ int -RunTheTest(a_s) - struct cmd_syndesc *a_s; - +RunTheTest(struct cmd_syndesc *a_s, void *arock) { /*RunTheTest */ static char rn[] = "RunTheTest"; /*Routine name */ @@ -1448,7 +1441,7 @@ main(argc, argv) /* * Set up the commands we understand. */ - ts = cmd_CreateSyntax("initcmd", RunTheTest, 0, "initialize the program"); + ts = cmd_CreateSyntax("initcmd", RunTheTest, NULL, "initialize the program"); cmd_AddParm(ts, "-cmname", CMD_LIST, CMD_REQUIRED, "Cache Manager name(s) to monitor"); cmd_AddParm(ts, "-collID", CMD_LIST, CMD_REQUIRED, diff --git a/src/xstat/xstat_fs.c b/src/xstat/xstat_fs.c index a3f7b67b42..2805b1207d 100644 --- a/src/xstat/xstat_fs.c +++ b/src/xstat/xstat_fs.c @@ -24,14 +24,7 @@ RCSID #include /*Lightweight process package */ #include - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #define LWP_STACK_SIZE (16 * 1024) diff --git a/src/xstat/xstat_fs_callback.c b/src/xstat/xstat_fs_callback.c index 6d05387b2c..d580e9d2de 100644 --- a/src/xstat/xstat_fs_callback.c +++ b/src/xstat/xstat_fs_callback.c @@ -34,14 +34,7 @@ RCSID #include #include /*Standard I/O stuff */ - -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif #include /*Callback interface defs */ diff --git a/src/xstat/xstat_fs_test.c b/src/xstat/xstat_fs_test.c index 90c6cec3ee..0c97afbb24 100644 --- a/src/xstat/xstat_fs_test.c +++ b/src/xstat/xstat_fs_test.c @@ -22,13 +22,7 @@ RCSID #include "xstat_fs.h" /*Interface for xstat_fs module */ #include /*Command line interpreter */ #include -#ifdef HAVE_STRING_H #include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif /* * External routines that don't have explicit include file definitions.