mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)
>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan 8 10:11:07 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
id AA01218; Mon, 8 Jan 90 16:11:18 +0100
Received: from gmdzi.UUCP (gmdzi) (1254)
by unido.informatik.uni-dortmund.de
for cosmo
id AL21947; Mon, 8 Jan 90 11:00:10 +0100
Received: by gmdzi.UUCP id AA07368; Mon, 8 Jan 90 11:03:13 -0100
Date: 6 Jan 90 12:22 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <143:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part 1 of 3)
Status: RO
Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]
A very helpful utility appeared once in comp.sources.misc which I have
ported to OS-9. This utility displays an ls-like directory listing on screen
and allows to walk around in the directory tree and to inspect, dump, rename,,
copy, edit, execute etc. files and directories. It was written by Peter da
Silva who proposed to post it to comp.os.os9. To compile this *NIX program
TOP's os9lib is required. Since not all OS-9 users may have this library
available, I have uuencoded the ready-to-use object module and posted as
well.
Requests and proposals:
----------------------
'browse' in general: Peter da Silva (peter@ficc.uu.net)
'browse' OS-9 implementation: Carsten Emde (emde@zedat.fu-berlin.dbp.de)
---- Cut Here and unpack ----
#!/bin/sh
# OS-9/xshar: Shell Archiver (v1.22)
# Packed January 6, 1990 Saturday 11:49:38 am by carsten
# from directory /h0/SYSSRC/BROWSE
#
# Run the following text with /bin/sh to create:
# /h0/SYS/browse.hlp
# makefile
#
sed 's/^X//' << 'SHAR_EOF' > /h0/SYS/browse.hlp &&
XBrowse is a screen-oriented directory browser, based on the metaphor of using
X'VI' to edit an 'ls -l' listing.
X
XCommands:
X SPACE Change directory (if cursor points to a directory).
X SPACE Page file through 'more' (if cursor points to a file).
X x Hex dump of current file or directory.
X & Run a program that won't clobber the screen.
X $ Run a program.
X = Enter a directory name.
X ? Page this help file through 'more'.
X [ Define a macro.
X H Go to the top of the page.
X J Go to the bottom of the directory.
X K Go to the top of the directory.
X L Go to the bottom of the page.
X ^L Repaint screen.
X M Display macros.
X S Save macros.
X I Install macros from current file.
X . Go down 20 lines.
X o Go up 20 lines.
X R Rename a file.
X dd Delete file(s). (ask for verification)
X DD Delete file(s).
X h Place cursor at beginning of line.
X l Move cursor to end of line.
X < Display file names only.
X > Display long directory listing.
X , Go down a line.
X k,^K Go up a line.
X n,^D Go down 11 lines.
X p,^U Go up 11 lines.
X
X qq,QQ,ZZ Exit.
X
X r Re-read directory.
X
X t Toggle tag on current file or directory.
X T Tag all files.
X U Untag all files or directories.
X
XMacros:
X [xtext] Define x as text.
X
XWithin text:
X % Current filename(s).
X # Current directory.
X ! Previous command.
X $x Macro for key x
X $$ Current process ID
X ~ Home directory.
X ^K One character from previous command.
X @x Execute macro for key x
X \x Enter special character x
X \nnn nnn, octal
X \^x Control-x
X
XDefault macros:
X b =..<CR>
X ~ =~<CR>
X % $%<CR>
X SPACE $more %<CR>
X c $copy %
X s $scred %<CR>
X
XWhen a command is executed (using '$<prog>'), the environment in the form
Xpresent at start of 'browse' will automatically be passed to <prog>. In
Xaddition, the environment variable FILE will be set to the current file name.
SHAR_EOF
chmod 0003 /h0/SYS/browse.hlp || echo "restore of /h0/SYS/browse.hlp fails"
sed 's/^X//' << 'SHAR_EOF' > makefile &&
XTARGET=browse
XDEBUG=
X
XHOME=/h0/
XCFILES=$(TARGET).c
XOFILES=$(TARGET).r
XHELP=$(HOME)SYS/$(TARGET).hlp
XCFLAGS=-ixt=/dd/TMP $(DEBUG)
XLFLAGS=-ixe=10
XLIBS=-l=/dd/LIB/os9lib.l -l=/dd/LIB/termlib.l
XEXEC=$(HOME)CMDS/
X
X$(TARGET): $(OFILES)
X cc $(LFLAGS) $(OFILES) $(LIBS) $(DEBUG) -f=$(EXEC)$(TARGET)
X attr $(EXEC)$(TARGET) -pe
X uuencode $(EXEC)$(TARGET) >-$(TARGET).uu
X xshar -c -D $(HELP) makefile >$(TARGET)01
X xshar -c -D $(CFILES) >$(TARGET)02
X xshar -c -D $(TARGET).uu >$(TARGET)03
X
X$(OFILES): $(CFILES)
SHAR_EOF
chmod 0003 makefile || echo "restore of makefile fails"
exit 0
mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)
>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan 8 10:11:23 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
id AA01227; Mon, 8 Jan 90 16:11:31 +0100
Received: from gmdzi.UUCP (gmdzi) (1261)
by unido.informatik.uni-dortmund.de
for cosmo
id AL22685; Mon, 8 Jan 90 11:05:01 +0100
Received: by gmdzi.UUCP id AA07489; Mon, 8 Jan 90 11:06:19 -0100
Date: 6 Jan 90 14:22 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <144:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part2 of 3)
Status: O
Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]
---- Cut Here and unpack ----
#!/bin/sh
# OS-9/xshar: Shell Archiver (v1.22)
# Packed January 6, 1990 Saturday 11:49:46 am by carsten
# from directory /h0/SYSSRC/BROWSE
#
# Run the following text with /bin/sh to create:
# browse.c
#
sed 's/^X//' << 'SHAR_EOF' > browse.c &&
X/* -- Just what the hell am I ??? --- */
X
X#include <stdio.h>
X
Xchar help[]=
X"Browse through a directory, written by Peter da Silva\n\
XAdapted for OS-9 using TOP's os9lib\n\
XSyntax: browse [<dir>]\n\
XFunction: show an ls-like directory listing which can be 'edited', i.e.\n\
X files may be tagged and inspected, dumped, executed, deleted,\n\
X renamed, copied, edited etc.\n\
XOptions:\n\
X none\n";
X
X#ifdef mc68000
X#define sr sr_
X#define PC PC_
X#endif
X
X#ifdef OSK
X#include <termcap.h>
X#define GETCWD
X#define getcwd getwd
X#define minor(i) ((i)&0xFF)
X#define major(i) minor((i)>>8)
X#define SHELLSYM '$'
X#define ASSISTCOM "more /dd/sys/browse.hlp"
X#define SAVEMACROS "/h0/sys/browse.macros"
X#else
X#define remote
X#define SHELLSYM '!'
X#define ASSISTCOM "more /usr/hlp/browse.doc"
X#define SAVEMACROS "/usr/tmp/macros"
X#endif
X
X#ifdef M_XENIX
X#define USG
X#define rindex strrchr
X#define GETCWD
X#else
X#ifdef L_ctermid
X#define USG
X#define rindex strrchr
X#define minor(i) ((i)&0xFF)
X#define major(i) minor((i)>>8)
X#else
X#ifndef OSK
X#include <whoami.h>
X#endif
X#endif
X#endif
X
X/* -- Miscellaneous include files -- */
X
X#ifdef OSK
X#include <modes.h>
X#include <direct.h>
X#include <sgstat.h>
X#include <strings.h>
X#endif
X#include <sys/param.h> /* NCARGS, and others */
X#ifndef M_XENIX
X#include <sys/types.h> /* data types for various files */
X#endif
X#include <sys/stat.h> /* stat data structure for getdir(), statout() */
X#include <sys/dir.h> /* dir data structure for getdir() */
X#include <pwd.h> /* passwd data structure for u_name() */
X#include <grp.h> /* group data structure for g_name() */
X
X#ifdef BSD
X#include <sys/time.h> /* time data structure for printime() */
X#else
X#ifndef OSK
X#include <time.h> /* time data structure for printime() */
X#endif
X#endif
X#ifdef USG
X#ifdef M_XENIX
X#include <sys/ioctl.h>
X#endif
X#include <termio.h>
X#else
X#ifndef OSK
X#include <sgtty.h> /* terminal modes for tinit(), tend() */
X#endif
X#endif
X
X#include <signal.h>
X
X/* -- make information --
XBUILD
Xbrowse: browse.c
X cc browse.c -O -o browse -ltermlib
XEND
X*/
X
X/* -- Miscellaneous defines -- */
X#define FALSE 0
X#define TRUE 1
X
X#define MAXID 64
X#define MAXLINE 256
X#ifdef OSK
X#define MAXENTS 512
X#define NCOL 54
X#define MAXNAME 24
X#else
X#define MAXENTS 320
X#define NCOL 64
X#define MAXNAME 14
X#endif
X#define FILENAME 256
X#define MAXARGC (NCARGS/16) /* Estimate max ARGC */
X#define CHARSET 256 /* Number of macros == size of byte */
X#define NOMAC (0) /* Null macro (last) */
X#define TERMBUF 1024 /* Size of term buf for termcap */
X#define SMALLBUF 256
X#define NAME 1
X#define SEC 2
X
X/* -- Extended directory entry format -- */
Xstruct entry {
X char *e_name;
X int e_flags;
X#define FTAGGED (1<<0)
X#define FPERMANENT (1<<1)
X struct stat e_stat; /* file status field */
X char e_uname[9]; /* user name */
X char e_gname[9]; /* user's group name */
X#ifdef OSK
X unsigned long e_secno;
X#endif
X}
X*xentries[MAXENTS], **entries=xentries;
Xint nentries;
X
X/* -- Look-up cache for user names -- */
Xstruct idtab {
X int id_id; /* user (or group) id */
X char id_name[9]; /* name[8] + filler */
X}
Xu_list[MAXID], /* Matched user id's. */
Xg_list[MAXID]; /* ditto group */
Xint u_ptr=0, g_ptr=0; /* current entries */
X
X/* -- Global variables -- */
XFILE *efp; /* Environment file */
Xchar efname[MAXLINE]; /* " name */
Xchar *tent; /* Pointer to tbuf */
Xchar PC; /* Pad character */
Xchar *UP, *BC; /* Upline, backsapce character */
Xshort ospeed; /* Terminal output speed */
Xchar termbuf[TERMBUF]; /* Place to put term info */
X
Xchar *macbuf[CHARSET], ungetbuf[SMALLBUF];
X /* Buffers for pushback and macros */
Xchar c_macro=NOMAC; /* current macro */
Xchar *macptr = ""; /* Pointer to currently executing macro */
Xchar *ungetptr = ungetbuf; /* Pointer to pushed-back characters */
X
Xchar *errname; /* Name of file error found in */
Xextern int errno; /* system error number */
Xint xerrno; /* extended error number */
Xint ccol=NCOL; /* Width of used display, current column */
Xint quickmode; /* short display mode (files only) */
X
X#ifdef USG
Xstruct termio rawbuf;
Xstruct termio cookedbuf;
X#else
X#ifdef OSK
Xstruct sgbuf cookopts,rawopts;
Xint signhndl();
X#else
Xstruct sgttyb sgbuf; /* buffer for terminal mode info */
Xint rawflags, cookflags; /* flags for raw & cooked tty mode */
X#endif
X#endif
X
Xchar *cm, /* Cursor motion */
X *cs, /* Change scrolling region */
X *sf, /* - scroll forward */
X *sr, /* - scroll backwards */
X *ce, /* Clear to end of line */
X *cl, /* Clear screen */
X *al, /* Insert line */
X *dl, /* delete ditto */
X *so, /* standout */
X *se, /* standout end */
X *us, /* underline */
X *ue, /* underline end */
X *ti, /* Init terminal */
X *te; /* Reset terminal */
Xint li, /* lines on screen */
X co; /* columns ditto */
Xchar xn; /* Magic cookie kludge */
X
X/* -- Global error messages -- */
Xchar *emesg[4]={
X "??",
X#define TOO_MANY 1
X "Too many directory entries",
X#define NOMATCH 2
X "No match",
X 0
X};
X
Xint top, curr; /* Positions of screen in directory */
X#define bottom ((top+nlines>nentries)?nentries:(top+nlines))
Xchar *dot; /* name of current directory */
Xint nlines; /* number of lines displayed on page */
Xchar display_up; /* Does the display exist? */
Xint todump=1; /* Do we want to dump data? */
Xint ended; /* Have we quite finished? */
Xint intrup; /* Have we been interrupted? */
Xchar *HOME; /* Where did I start from? */
Xchar *SHELL; /* How do I run programs? */
X
X/* -- types of functions !!! */
Xchar *getenv(), *tgetstr();
Xchar *malloc();
X
X#define NEW(t) (t *)malloc(sizeof (t))
X#define NIL(t) ((t) 0)
X
X/* -- Code starts here: dummy main -- */
Xmain(ac, av, ep)
Xint ac;
Xchar **av;
Xchar **ep;
X{
X int i;
X
X if(ac>1)
X {
X for(i=1; i<ac; i++)
X {
X if(!strcmp(av[i],"-?"))
X {
X printf(help); exit(0);
X }
X }
X if(ac>2)
X {
X perror("only one argument may be specified.");
X exit(0);
X }
X if(chdir(av[1])==-1)
X {
X perror("can't access directory specified",av[1]);
X exit(0);
X }
X }
X
X sprintf(efname, "/tmp/br.env.%d", getpid());
X HOME=getenv("HOME");
X SHELL=getenv("SHELL");
X
X#ifndef OSK
X dumpenv(ep);
X#endif
X
X intrup=0;
X tinit(getenv("TERM"));
X clear_all();
X
X#ifdef OSK
X stdin->_flag|=_RBF; stdin->_flag|=_UNBUF;
X#endif
X
X browse();
X tend();
X#ifndef OSK
X unlink(efname);
X#endif
X}
X
Xclear_all()
X{
X int i;
X
X for(i = 0; i < MAXENTS; i++)
X entries[i] = 0;
X}
X
Xchar *clone(name)
Xchar *name;
X{
X char *hold;
X
X hold = (char *)malloc(strlen(name)+1);
X
X if(hold==0)
X return 0;
X strcpy(hold, name);
X return hold;
X}
X
Xnewname(e, name)
Xstruct entry *e;
Xchar *name;
X{
X if(e->e_name)
X free(e->e_name);
X e->e_name = clone(name);
X}
X
X#if (BSD || OSK)
Xreadent(dp, db)
XDIR *dp;
Xstruct direct *db;
X{
X struct direct *ptr;
X
X ptr = readdir(dp);
X if(!ptr) return 0;
X
X *db = *ptr; /* V7 'C' and above... safe, since UCB=V7+ */
X free(ptr);
X return 1;
X}
X#else
X#define opendir(n) fopen(n, "r")
X#define DIR FILE
Xreadent(dp, db)
XDIR *dp;
Xstruct direct *db;
X{
X if(fread(db, sizeof(struct direct), 1, dp))
X return 1;
X /* else */
X return 0;
X}
X#define closedir fclose
X#endif
X
Xgetdir()
X{
X
X#ifdef OSK
X struct fildes f;
X struct tm t;
X int physdisk, oldid;
X char pdot[32], *slash;
X#endif
X
X char *u_name(), *g_name();
X DIR *dp;
X int valid;
X struct direct *hold = NEW(struct direct);
X int i, p;
X
X if(!(dp = opendir("."))) {
X errname=".";
X return FALSE;
X }
X
X p = 0;
X for(i = 0; i < nentries; i++) {
X if(entries[i]->e_flags & FPERMANENT) {
X if(p != i) {
X struct entry *hold;
X hold = entries[p];
X entries[p] = entries[i];
X entries[i] = hold;
X }
X p++;
X }
X }
X
X for(nentries = p; !intrup && nentries < MAXENTS; nentries += valid) {
X
X if(!entries[nentries]) {
X entries[nentries] = NEW(struct entry);
X if(!entries[nentries])
X break;
X entries[nentries]->e_name = NIL(char *);
X }
X
X if(!readent(dp, hold)) {
X p=nentries; break;
X }
X
X#ifndef OSK
X valid = (hold->d_ino != 0);
X#else
X valid = TRUE;
X entries[nentries]->e_secno=hold->d_addr;
X#endif
X
X if(valid) {
X#ifndef OSK
X if(stat(hold->d_name, &entries[nentries]->e_stat)==-1) {
X closedir(dp);
X errname=hold->d_name;
X free(hold);
X return FALSE;
X }
X#endif
X
X newname(entries[nentries], hold->d_name);
X
X#ifndef BSD /* truncate name to 14 characters in non-BSD systems */
X#ifndef OSK
X if(strlen(entries[nentries]->e_name)>14)
X entries[nentries]->e_name[14] = 0;
X#endif
X#endif
X
X entries[nentries]->e_flags = 0;
X
X#ifndef OSK
X strcpy(entries[nentries]->e_uname,
X u_name(entries[nentries]->e_stat.st_uid));
X
X strcpy(entries[nentries]->e_gname,
X g_name(entries[nentries]->e_stat.st_gid));
X#endif
X }
X }
X
X closedir(dp);
X
X free(hold);
X
X#ifdef OSK
X sortdir(SEC); /* optimize head movements */
X oldid=getuid(); super();
X strcpy(pdot,dot);
X if(slash=index(pdot+1,'/')) strcpy(slash,"@"); else strcat(pdot,"@");
X if((physdisk=open(pdot,S_IREAD))==-1) return FALSE;
X for(nentries = 0; !intrup && nentries < p; nentries ++) {
X lseek(physdisk,(entries[nentries]->e_secno)<<8,0);
X read(physdisk,&f,sizeof(f));
X
X t.tm_year = (int) f.fd_date[0];
X t.tm_mon = (int) f.fd_date[1] - 1;
X t.tm_mday = (int) f.fd_date[2];
X t.tm_hour = (int) f.fd_date[3];
X t.tm_min = (int) f.fd_date[4];
X t.tm_sec = 0;
X t.tm_isdst = -1;
X
X entries[nentries]->e_stat.st_atime =
X entries[nentries]->e_stat.st_mtime = mktime(&t);
X
X t.tm_year = (int) f.fd_dcr[0];
X t.tm_mon = (int) f.fd_dcr[1] - 1;
X t.tm_mday = (int) f.fd_dcr[2];
X t.tm_hour = t.tm_min = t.tm_sec = 0;
X t.tm_isdst = -1;
X
X entries[nentries]->e_stat.st_ctime = mktime(&t);
X memcpy(&(entries[nentries]->e_stat.st_size), f.fd_fsize,
X sizeof(long));
X entries[nentries]->e_stat.st_uid = f.fd_own[1];
X entries[nentries]->e_stat.st_gid = f.fd_own[0];
X entries[nentries]->e_stat.st_mode = f.fd_att;
X entries[nentries]->e_stat.st_nlink = f.fd_link;
X
X strcpy(entries[nentries]->e_uname,
X u_name(entries[nentries]->e_stat.st_uid));
X
X strcpy(entries[nentries]->e_gname,
X g_name(entries[nentries]->e_stat.st_gid));
X }
X close(physdisk);
X setuid(oldid);
X#endif
X
X if(intrup)
X return FALSE;
X
X if(nentries>=MAXENTS || entries[nentries]==NIL(struct entry *)) {
X errno=0;
X xerrno=TOO_MANY;
X errname=".";
X return FALSE;
X }
X
X sortdir(NAME);
X
X if(intrup)
X return FALSE;
X return TRUE;
X}
X
Xat_current()
X{
X at_file(curr);
X}
X
Xat_file(file)
Xint file;
X{
X if(display_up) {
X if(file < top || file >= top+nlines)
X return 0;
X at(0, curr-top+2);
X } else {
X if(file != curr)
X return 0;
X cmdline();
X }
X return 1;
X}
X
Xdisplay_flags(flags)
X{
X outc((flags&FTAGGED)?'+':((flags&FPERMANENT)?'!':' '));
X}
X
Xrepaint_flags()
X{
X if(!display_up) return;
X at(quickmode?0:NCOL-1, curr-top+2);
X display_flags(entries[curr]->e_flags);
X}
X
X/*
Xrepaint_current()
X{
X if(!display_up) return;
X at_current();
X dump(curr, curr+1);
X}
X*/
X
Xtag()
X{
X entries[curr]->e_flags ^= FTAGGED;
X repaint_flags();
X}
X
Xtag_all(flag)
Xint flag;
X{
X int i;
X
X for(i = 0; i < nentries; i++)
X if(flag)
X {
X if(!isdir(entries[i])) entries[i]->e_flags |= FTAGGED;
X }
X else
X entries[i]->e_flags &= ~FTAGGED;
X if(display_up)
X todump = TRUE;
X}
X
Xdelete_from_display(file)
Xint file;
X{
X if(!display_up) return;
X
X if(file>=top+nlines) return;
X
X if(file < top) file = top;
X
X scroll(2+file-top, 2+nlines, 1);
X at(0, 2+nlines-1);
X if(top+nlines >= nentries)
X outc('~');
X else
X dump(bottom, bottom+1);
X}
X
Xdelete_file_entry(file)
Xint file;
X{
X struct entry *hold;
X int i;
X
X delete_from_display(file);
X
X hold = entries[file];
X for(i=file; i<nentries-1; i++)
X entries[i]=entries[i+1];
X entries[nentries-1]=hold;
X nentries--;
X
X if(file < curr || curr >= nentries) {
X curr--;
X if(top >= nentries) {
X top--;
X display_up = 0;
X todump = 1;
X }
X }
X}
X
Xremove_one(file, doit)
Xint file;
Xint doit;
X{
X if(!doit) {
X cmdline();
X outs("Delete ");
X ctlouts(entries[file]->e_name);
X outs(" [n]?");
X fflush(stdout);
X doit = getch() == 'y';
X outs(doit?"Yes.":"No.");
X fflush(stdout);
X }
X if(doit) {
X if(unlink(entries[file]->e_name) == 0) {
X cmdline();
X outs("Deleted ");
X ctlouts(entries[file]->e_name);
X outs(".");
X delete_file_entry(file);
X return 1;
X } else {
X wperror(entries[file]->e_name);
X return 0;
X }
X }
X return 0;
X}
X
Xremove(doit)
Xint doit;
X{
X int i;
X int found_tags;
X
X found_tags = 0;
X i = 0;
X while(i < nentries) {
X if(entries[i]->e_flags & FTAGGED) {
X found_tags = 1;
X if(!remove_one(i, doit)) /* decrements nentries */
X break;
X } else
X i++;
X }
X if(!found_tags)
X remove_one(curr, doit);
X}
X
Xinsert_entry_at(ent, i)
Xstruct entry *ent;
Xint i;
X{
X struct entry *hold;
X int j;
X
X /* Allocate slot at end */
X if(!entries[nentries]) {
X entries[nentries] = NEW(struct entry);
X if(!entries[nentries])
X return 0;
X entries[nentries]->e_name = NIL(char *);
X } else if(entries[nentries]->e_name) {
X free(entries[nentries]->e_name);
X entries[nentries]->e_name = NIL(char *);
X }
X
X /* Copy data into slot */
X *entries[nentries] = *ent;
X entries[nentries]->e_name = clone(ent->e_name);
X if(!entries[nentries]->e_name)
X return 0;
X
X if(i != nentries) {
X /* Rotate slot to middle */
X hold = entries[nentries];
X for(j = nentries; j > i; j--)
X entries[j] = entries[j-1];
X entries[i] = hold;
X }
X nentries++;
X
X if(display_up) {
X if(i < top)
X i = top;
X if(i >= bottom)
X return;
X scroll(2+i-top, 2+nlines, -1);
X at(0, 2+i-top);
X dump(i, i+1);
X }
X}
X
Xinsert_entry(ent)
Xstruct entry *ent;
X{
X int i;
X
X if(nentries >= MAXENTS)
X return 0;
X
X for(i = 0; i < nentries; i++)
X if(entcmpnam(&ent, &entries[i]) < 0)
X break;
X
X return insert_entry_at(ent, i);
X}
X
Xassist()
X{
X char cmdbuf[MAXLINE];
X
X sprintf(cmdbuf, ASSISTCOM);
X if(sys(cmdbuf, 1))
X perror(cmdbuf);
X}
X
Xhexdump()
X{
X char cmdbuf[MAXLINE];
X
X sprintf(cmdbuf, "dump %s", entries[curr]->e_name);
X if(sys(cmdbuf, 1))
X perror(cmdbuf);
X}
X
Xmove()
X{
X char scratch[FILENAME];
X struct entry hold;
X char inps();
X
X hold = *entries[curr];
X
X cmdline();
X outs("Rename ");
X ctlouts(entries[curr]->e_name);
X outc(' ');
X if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
X killcmd();
X return;
X }
X if(link(entries[curr]->e_name, scratch)!=0) {
X char tmbuf[42];
X sprintf(tmbuf, "(rename %s %s)", entries[curr]->e_name, scratch);
X wperror(tmbuf);
X return;
X }
X if(unlink(entries[curr]->e_name)!=0) {
X wperror(entries[curr]->e_name);
X return;
X }
X
X hold.e_name = scratch;
X hold.e_flags &= ~FTAGGED;
X
X delete_file_entry(curr);
X insert_entry(&hold);
X}
X
Xpname(name, mode)
Xchar *name;
Xint mode;
X{
X int i;
X char *slash, *rindex();
X int max=quickmode?MAXLINE:(MAXNAME+1);
X
X#ifdef OSK
X if(mode&S_IFDIR)
X#else
X if((mode&S_IFMT)==S_IFDIR)
X#endif
X max--;
X
X#ifndef OSK
X else if((mode&S_IFMT)==S_IFREG && (mode&0111))
X max--;
X else if((mode&S_IFMT)!=S_IFREG)
X max--;
X#endif
X
X if(!quickmode && (slash=rindex(name, '/'))) {
X name=slash;
X outc('<');
X max--;
X }
X for(i=0; i<max && *name; name++)
X i += ctlout(*name);
X standend();
X if(i==max && *name)
X outs("\b>");
X
X#ifdef OSK
X if(mode&S_IFDIR) {
X#else
X if((mode&S_IFMT)==S_IFDIR) {
X#endif
X outc('/');
X }
X
X#ifndef OSK
X else if((mode&S_IFMT)==S_IFREG && (mode&0111)) {
X outc('*');
X }
X else if((mode&S_IFMT)!=S_IFREG) {
X outc('?');
X }
X#endif
X
X}
X
Xsortdir(ele)
Xint ele;
X{
X int entcmpnam(),entcmpsec();
X
X if(ele==NAME)
X qsort(entries, nentries, sizeof(struct entry *), entcmpnam);
X if(ele==SEC)
X qsort(entries, nentries, sizeof(struct entry *), entcmpsec);
X}
X
X#ifndef OSK
Xaddname(flag)
Xchar flag;
X{
X char buf[FILENAME], *ptr, *tmp;
X char scratch[FILENAME];
X struct entry hold;
X char inps();
X
X cmdline();
X outs("Add ");
X if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
X killcmd();
X return;
X }
X
X if(stat(scratch, &hold.e_stat)==-1) {
X wperror(scratch);
X return;
X }
X if(flag!='+' && *scratch != '/') {
X strcpy(buf, dot);
X ptr = scratch;
X for(;;) { /* eat '../' and './' */
X if(ptr[0]=='.' && ptr[1]=='.' &&
X (ptr[2]=='/' || !ptr[2])) {
X tmp = rindex(buf, '/');
X if(!tmp) break;
X *tmp=0;
X ptr += 2+(ptr[2]=='/');
X continue;
X }
X if(ptr[0]=='.' &&
X (ptr[1]=='/' || !ptr[1])) {
X ptr += 1+(ptr[1]=='/');
X continue;
X }
X break;
X }
X if(*ptr) {
X strcat(buf, "/");
X strcat(buf, ptr);
X }
X hold.e_name = buf;
X } else
X hold.e_name = scratch;
X strcpy(hold.e_uname,
X u_name(hold.e_stat.st_uid));
X strcpy(hold.e_gname,
X g_name(hold.e_stat.st_gid));
X hold.e_flags = 0;
X if(flag!='+')
X hold.e_flags |= FPERMANENT;
X insert_entry(&hold);
X}
X
Xaddperm()
X{
X char buf[FILENAME], *ptr, *tmp;
X struct entry hold;
X int entcmpnam(), i;
X
X if(entries[curr]->e_flags & FPERMANENT)
X return;
X
X if(entries[curr]->e_name[0]!='/') {
X strcpy(buf, dot);
X ptr = entries[curr]->e_name;
X for(;;) { /* eat '../' and './' */
X if(ptr[0]=='.' && ptr[1]=='.' &&
X (ptr[2]=='/' || !ptr[2])) {
X tmp = rindex(buf, '/');
X if(!tmp) break;
X *tmp=0;
X ptr += 2+(ptr[2]=='/');
X continue;
X }
X if(ptr[0]=='.' &&
X (ptr[1]=='/' || !ptr[1])) {
X ptr += 1+(ptr[1]=='/');
X continue;
X }
X break;
X }
X if(*ptr) {
X strcat(buf, "/");
X strcat(buf, ptr);
X }
X hold = *entries[curr];
X
X hold.e_name = buf;
X hold.e_flags &= ~FTAGGED;
X hold.e_flags |= FPERMANENT;
X insert_entry(&hold);
X } else {
X entries[curr]->e_flags |= FPERMANENT;
X entries[curr]->e_flags &= ~FTAGGED;
X repaint_flags();
X }
X}
X
Xdelperm()
X{
X entries[curr]->e_flags &= ~(FPERMANENT|FTAGGED);
X repaint_flags();
X}
X#endif
X
Xentcmpnam(e1, e2)
Xstruct entry **e1, **e2;
X{
X if((*e1)->e_name[0] == '/') {
X if((*e2)->e_name[0] != '/')
X return 1;
X } else if((*e2)->e_name[0] == '/')
X return -1;
X
X return strcmp((*e1)->e_name, (*e2)->e_name);
X}
X
Xentcmpsec(e1, e2)
Xstruct entry **e1, **e2;
X{
X if((*e1)->e_secno < (*e2)->e_secno) return -1;
X if((*e1)->e_secno > (*e2)->e_secno) return 1;
X return 0;
X}
X
Xdump(start, end)
Xint start;
Xint end;
X{
X int i;
X int lo = (start<nentries)?start:nentries;
X int hi = (end<nentries)?end:nentries;
X
X for(i=lo; i<hi; i++) {
X statout(entries[i]->e_name,
X &entries[i]->e_stat,
X entries[i]->e_uname,
X entries[i]->e_gname,
X entries[i]->e_flags);
X nl();
X }
X return TRUE;
X}
X
Xstatout(name, sbuf, user, group, flags)
Xchar *name;
Xstruct stat *sbuf;
Xchar *user, *group;
Xint flags;
X{
X int mode = sbuf->st_mode;
X
X if(!quickmode) {
X#ifndef OSK
X printf("%5u ", sbuf->st_ino);
X#endif
X
X
X#ifdef OSK
X if(mode&S_IFDIR) outc('d'); else outc('-');
X if(mode&S_ISHARE) outc('s'); else outc('-');
X if(mode&S_IOEXEC) outc('e'); else outc('-');
X if(mode&S_IOWRITE) outc('w'); else outc('-');
X if(mode&S_IOREAD) outc('r'); else outc('-');
X if(mode&S_IEXEC) outc('e'); else outc('-');
X if(mode&S_IWRITE) outc('w'); else outc('-');
X if(mode&S_IREAD) outc('r'); else outc('-');
X#else
X if((mode&S_IFMT)==S_IFCHR) outc('c');
X else if((mode&S_IFMT)==S_IFBLK) outc('b');
X else if((mode&S_IFMT)==S_IFDIR) outc('d');
X else if((mode&S_IFMT)==S_IFREG) outc('-');
X else outc('?');
X triad((mode>>6)&7, mode&S_ISUID, 's');
X triad((mode>>3)&7, mode&S_ISGID, 's');
X triad(mode&7, mode&S_ISVTX, 't');
X#endif
X
X outc(' ');
X
X printf("%1u ", sbuf->st_nlink);
X printf("%-8s ", user);
X printf("%-8s ", group);
X
X#ifdef OSK
X if(!(mode&S_IFDIR))
X#else
X if((mode&S_IFMT)==S_IFREG || (mode&S_IFMT)==S_IFDIR))
X#endif
X printf("%7ld ", sbuf->st_size);
X else
X#ifdef OSK
X printf(" --- ");
X#else
X
X printf("%3d,%3d ",
X major(sbuf->st_rdev),
mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)
>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan 8 10:11:41 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
id AA01234; Mon, 8 Jan 90 16:11:52 +0100
Received: from gmdzi.UUCP (gmdzi) (1262)
by unido.informatik.uni-dortmund.de
for cosmo
id AL23070; Mon, 8 Jan 90 11:07:18 +0100
Received: by gmdzi.UUCP id AA07593; Mon, 8 Jan 90 11:09:36 -0100
Date: 6 Jan 90 14:33 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <145:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part 3 of 3)
Status: O
Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]
---- Cut Here and unpack ----
#!/bin/sh
# OS-9/xshar: Shell Archiver (v1.22)
# Packed January 6, 1990 Saturday 11:50:12 am by carsten
# from directory /h0/SYSSRC/BROWSE
#
# Run the following text with /bin/sh to create:
# browse.uu
# Then run uudecode to create browse
#
sed 's/^X//' << 'SHAR_EOF' > browse.uu &&
X
Xbegin 644 /h0/CMDS/browse
XM2OP``0``D$X````#````2`55`0&``0`*````````````````````````````7
XM`*%8````4````:```#:\```,````@N0``(X&8G)O=W-E```M1H`0+4:`%#U#^
XM@!@(*P`%`!1G#BU,@!IF""UY`````(`:2H5G'@@%``!F%$'U6`!*:/_^9@I9[
XMB$GH__QP`6`@0C58_R!-U^L`#$*G+PMT`6$`>Z1@=D/H``0M2:NF=``B8"X)_
XM9PS3S4(I__\@B5*"8.Y3@&?@2H)F$$IH__YG"D(H__\D2%B(8`8@C21(4H)2<
XM@DJ49Q@H5$H<9ORUS&,>#!P`_&884HPF5-?-8!0,+0#\``)F""9M``37S6`$[
XMU^L`#"$++PA"*/__+P)A`'+<90`!"&$43-\``YO-+RZKIF$``3YP`$ZNLK`@N
XM?/__MKS1SBU(@`0M3X``+4^`""`\____!"\(0?<(`+'N@`AD"K'N@`1E""U(R
XM@`@@7TYU0?H`9&$*+SP```$!3JZRI#\!<F1P`DY``(PR'TYU("Z``)"N@`A.K
XM=2`N@`B0KH`$3G5(Y\#P,"\`'@1``(#D0`Q```]F#$'Z`&5R`$Y``"%D!DZN(
XMLJIE9"])`!1,WP<#3G5*^P!0*BHJ*B!3=&%C:R!/=F5R9FQO=R`J*BHJ#0`JO
XM*BHJ($-A;B=T(&EN<W1A;&P@=')A<"!H86YD;&5R("HJ*BH-`"`J*BHJ(`!MA
XM871H```````B/````$`O"$'Z_\!A`/],('S__Z@6T<Y!^O_682@@7U.)82)!G
XM^O_*4XEA&A-\``W__R!\__^H%M'.80#_'DY```9.0``&$MAF_$YU3E4``$CGR
XMP(`@//___[1A`/[468]P`;"O``1L``!^<`$N@&`L0?HXH"(((!?EB"!O``@@I
XM,`@`80!T)$J`9A!![JNJ(`AA`'(6<`!.KK*P4I<@%["O``1MS'`"L*\`!&P0A
XM0?HX9R`(80!,/'``80!_WB!O``@@*``$80!^>G+_LH!F&"!O``@B*``$0?HX.
XM82`(80!,$G``80!_M&$`?S@O`$'Z.&PB"$'NCR8@"&$`<;98CT'Z.&D@"&$`\
XM<D8M0)J>0?HX8"`(80!R."U`FJ)"KIJ:0?HX5"`(80!R)F$`%UIA(`!N`("H!
XM(G`$@6ZH(F$`&H1A`!HH6(],[0$`__Q.74YU3E4``$CG@(`@//___[QA`/W22
XM68]"EV`.(!?EB"!NK.9"L`@`4I<,EP```@!MZEB/3.T!`/_\3EU.=4Y5``!('
XMY\``(#S___^X80#]F%F/("\`!&$`<J!2@&$`<;PN@$J79@1P`&`,(B\`!"`7=
XM80!RIB`76(],[0`"__Q.74YU3E4``$CGP(`@//___[QA`/U4(%=*D&<((%<@K
XM$&$`<88@+P`$898@5R"`3.T!`/_\3EU.=4Y5``!(Y\#`(#S___^X80#](%F/U
XM("\`!&$`<18N@$J79@1P`&`8(%<B;P`(<`DBV%'(__PRV"`780!Q-G`!6(],@
XM[0,`__A.74YU3E4``$CGX,`@//___E1A`/S63^_^G'`J80!Q`"]```A!^C<-@
XM(`AA`'"Z+T``$&8,0?HV_RU(F39@``0,0I="KP`$8&`@+P`$Y8@@;JSF('`(.
XM`"`H``0(```!9T0@%["O``1G.EF/("\`!.6((&ZLYBZP"``@+P`(Y8@@;JSF-
XM(B\`!.6)(FZLYB.P"``8`"`O``CEB"!NK.8AEP@`6(]2EU*O``0@+P`$L*Z(*
XM'FV6+5>('F```+8@+H@>Y8@@;JSF2K`(`&8X("Z('N6((&ZLYB(`<$)A`'!$L
XM(8`8`"`NB![EB"!NK.9*L`@`9P``D"`NB![EB"!NK.8@<`@`0I`B+P`(("\`&
XM$&$`_JY*@&8&+JZ('F!H<`$O0``,("Z('N6((&ZLYB!P"``B;P`((5$`/DJOD
XM``QG+"`O``A0@"(`("Z('N6((&ZLYB`P"`!A`/XT("Z('N6((&ZLYB!P"`!"O
XMJ``$("\`#-&NB!Y*KIJ:9@P,K@```@"('FT`_SP@+P`080!O7"`O``AA`&^<B
XM<`)A``O@80!\4B]``#AA`#3.(BZ:C$'O`!@@"&$`<&YR+T'O`!D@"&$`<<0OS
XM0``49Q!!^C5S(@@@+P`480!P3F`00?HU92((0>\`&"`(80!P7'(!0>\`&"`()
XM80!NOB]``#QR_[*`9P`"4D*NB!Y@``'J0J<@+H@>Y8@@;JSF('`(`"`H`#[A@
XMB"(`("\`0&$`;JY8CTAX`0!![P!H(@@@+P!`80!NBEB/$"\`9TB`2,`O0`!4H
XM$"\`:$B`2,!3@"]``%`0+P!I2(!(P"]``$P0+P!J2(!(P"]``$@0+P!K2(!(F
XMP"]``$1"KP!`</\O0`!@0>\`0"`(80!NCB(NB![EB2!NK.8@<!@`(4``)"(N8
XMB![EB2!NK.8@<!@`(4``(!`O`'%(@$C`+T``5!`O`')(@$C`4X`O0`!0$"\`R
XM<TB`2,`O0`!,<``O0`!`+T``1"]``$AP_R]``&`@+H@>Y8@@;JSF('`(`$/O0
XM`$`@"6$`;A@A0``H2'@`!$'O`'$B""`NB![EB"!NK.8@,`@`=!S0@F$`<F18R
XMCR`NB![EB"!NK.8@<`@`$"\`9DB`,4``%"`NB![EB"!NK.8@<`@`$"\`94B`?
XM,4``%B`NB![EB"!NK.8@<`@`$"\`9$B`,4``$"`NB![EB"!NK.8@<`@`$"\`D
XM;$B`,4``$B`NB![EB"!NK.8@<`@`<``P*``480`,["(`("Z('N6((&ZLYB`PX
XM"`!T+-""80!N:"`NB![EB"!NK.8@<`@`<``P*``680`-XB(`("Z('N6((&ZLU
XMYB`P"`!T-=""80!N.%*NB!Y*KIJ:9@H@+H@>L)=M`/X*("\`/&$`;-H@+P`XK
XM80!Y^$JNFIIF.@RN```"`(@>;!`@+H@>Y8@@;JSF2K`(`&840JZ`#'`!+4"9L
XM.D'Z,P4M2)DV8`QP`6$`"3)*KIJ:9P1P`&`"<`%/[P%D3.T#!O_P3EU.=4Y5I
XM``!(YX``(#S___^\80#X?"`NFHAA!$Y=3G5.50``2.?``"`\____O&$`^&!*&
XM+IJ49R@@%["NFH1M*"`NFH30KIJ0L)=O'"`NFHB0KIJ$5(`B`'``80`/'F`0)
XM(!>PKIJ(9P1P`&`&80`8KG`!3.T``O_\3EU.=4Y5``!(YX``(#S___^\80#XT
XM!"`7"````&<$<"M@#B`7"````6<$<"%@`G`@80`.HDY=3G5.50``2.?`@"`\2
XM____O&$`]]!*+IJ49S(@+IJ(D*Z:A%2`(@!*KID^9P1P`&`"<#5A``Z8("Z:"
XMB.6((&ZLYB!P"``@*``$80#_A$SM`0+_^$Y=3G5.50``2.>`@"`\____O&$`&
XM]WP@+IJ(Y8@@;JSF('`(`'`!L:@`!&$`_X1,[0$`__Q.74YU3E4``$CG@(`@/
XM//___[AA`/=(68]"EV!"2J\`!&<H(!?EB"!NK.8@,`@`80`I7DJ`9B8@%^6(^
XM(&ZLYB!P"`!P`8&H``1@$B`7Y8@@;JSF('`(`'#^P:@`!%*7(!>PKH@>;;9*0
XM+IJ49P9P`2U`K1!8CTSM`0#__$Y=3G5.50``2.?``"`\____N&$`]LY*+IJ4<
XM9P``GB`NFH30KIJ0L)=O``"0(!>PKIJ$;`0NKIJ$2'@``2`NFI!4@"(`("\`Z
XM!%2`D*Z:A&$`#<I8CR`NFI!4@%.`(@!P`&$`#6H@+IJ$T*Z:D+"NB!YM"'!^7
XM80`-*&!`("Z:A-"NFI"PKH@>;P8@+H@>8`@@+IJ$T*Z:D%*`(@`@+IJ$T*Z:K
XMD+"NB!YO!B`NB!Y@""`NFH30KIJ080`'M$SM``+__$Y=3G5.50``2.?`P"`\G
XM____M&$`]@Y1CR`O``AA`/\F("\`".6((&ZLYB]P"```!"ZO``A@&B`74H#EO
XMB"!NK.8B%^6)(FZLYB.P"``8`%*7("Z('E.`L)=NW"`NB!Y3@.6((&ZLYB&O)
XM``0(`%.NB!X@+P`(L*Z:B&T*("Z:B+"NB!YM'%.NFH@@+IJ$L*Z('FT.4ZZ:G
XMA$(NFI1P`2U`K1!0CTSM`P+_]$Y=3G5.50``2.?`@"`\____O&$`]69*KP`$;
XM9FAA`!7H0?HOJR`(80`+WB`7Y8@@;JSF('`(`"`080`C.D'Z+Y<@"&$`"\)!5
XM[J@R(`AA`&C$80`HR')YLH!F!'`!8`)P`"]```1*KP`$9P9!^B]O8`1!^B]N*
XM(`AA``N.0>ZH,B`(80!HD$JO``1G7"`7Y8@@;JSF('`(`"`080!HJ$J`9C1AN
XM`!5D0?HO/B`(80`+6B`7Y8@@;JSF('`(`"`080`BMD'Z+RL@"&$`"SX@%V$`3
XM_HYP`6`4(!?EB"!NK.8@<`@`(!!A``TB<`!,[0$`__Q.74YU3E4``$CGP(`@2
XM//___[1A`/1X48]"ET*O``1@,B`O``3EB"!NK.8@<`@`("@`!`@```!G%G`!T
XM+H`B+P`(("\`!&$`_M!*@&8&8`Y2KP`$("\`!+"NB!YMQ$J79@PB+P`(("Z:.
XMB&$`_JQ0CTSM`0+_^$Y=3G5.50``2.?`P"`\____L&$`]`11CR`NB![EB"!N6
XMK.9*L`@`9BH@+H@>Y8@@;JSF(@!P0F$`:!0A@!@`("Z('N6((&ZLYDJP"`!FX
XM*F```(`@+H@>Y8@@;JSF('`(`$J09R0@+H@>Y8@@;JSF('`(`"`080!GXB`N)
XMB![EB"!NK.8@<`@`0I`@;P`(("Z('N6((FZLYB)Q"`!P#R+84<C__#+8("Z(_
XM'N6((&ZLYB!P"``B;P`((!%A`/6V((`@+H@>Y8@@;JSF('`(`$J09@9P`&``H
XM`,X@+P`,L*Z('F=(("Z('N6((&ZLYB]P"```!"ZNB!Y@&B`74X#EB"!NK.8B]
XM%^6)(FZLYB.P"``8`%.7(!>PKP`,;MX@+P`,Y8@@;JSF(:\`!`@`4JZ('DHN4
XMFI1G<"`O``RPKIJ$;`8O;IJ$``P@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30Z
XMKIJ0L*\`#&\^2'C__R`NFI!4@"(`("\`$%2`D*Z:A&$`"=18CR`O``Q4@)"N]
XMFH0B`'``80`)<B`O``Q2@"(`("\`#&$`!`)0CTSM`P#_^$Y=3G5.50``2.?`O
XM@"`\____N&$`\EI9CPRN```"`(@>;01P`&`P0I=@&B`7Y8C0KJSF(@!![P`$6
XM(`AA``,02H!M"E*7(!>PKH@>;=XB%R`O``1A`/X&6(],[0$"__A.74YU3E4`H
XM`$CGP(`@//___KQA`/'\3^__`$'Z+&DB"$'7(`AA`&5J<@%!UR`(80`8/$J`J
XM9PA!UR`(80`_E$_O`0!,[0$"__A.74YU3E4``$CGP(`@//___KAA`/&T3^__H
XM`"`NFHCEB"!NK.8@<`@`+Q!!^BPI(@A![P`$(`AA`&406(]R`4'7(`AA`!?@R
XM2H!G"$'7(`AA`#\X3^\!`$SM`0+_^$Y=3G5.50``2.?`P"`\___^2&$`\5A/<
XM[_Z^("Z:B.6((&ZLYB!P"`!#UW`/(MA1R/_\,MAA`!'"0?HKQR`(80`'N"`NH
XMFHCEB"!NK.8@<`@`(!!A`!\2<"!A``?.0J<@+IJ(Y8@@;JSF('`(`"(00>\`O
XM1B`(80`7Z%B/<ANR`&8(80`B!&```*)![P!"(@@@+IJ(Y8@@;JSF('`(`"`0,
XM80`J"DJ`9SA/[__62&\`;"`NFHCEB"!NK.8@<`@`+Q!!^BM)(@A![P`((`AAB
XM`&0@4(]!UR`(80`)(D_O`6Q@3B`NFHCEB"!NK.8@<`@`(!!A`&1$2H!G%B`NK
XMFHCEB"!NK.8@<`@`(!!A``CP8!Q![P!"+HAP_L&O``0@+IJ(80#Z,$'7(`AAR
XM`/W<3^\!0DSM`P+_]$Y=3G5.50``2.?`@"`\____L&$`\"9/[__T2JZ9/F<(Z
XM(#P```$`8`)P&2Z`("\`$`@```=G`E.72JZ9/F8><B\@+P`,80!FK"]```1G3
XM#B]O``0`#'`\80`&GE.70J\`"&`6(&\`#!`02(!(P&$`'OS1KP`(4J\`#"`OP
XM``BPEVP((&\`#$H09MIA`!Z.("\`"+"79A(@;P`,2A!G"D'Z*D@@"&$`!B(@_
XM+P`0"```!V<&<"]A``9"3^\`#$SM`0#__$Y=3G5.50``2.?``"`\____M&$`P
XM[V9P`;"79A9(>@`Z2'@`!"(NB!X@+JSF80!FJ%"/<`*PEV862'H`?$AX``0B&
XM+H@>("ZLYF$`9HQ0CTSM``+__$Y=3G5.50``2.?`@"`\____O&$`[Q(@5R!0Z
XM(%!P+[`09A(@;P`$(%`@4'`OL!!G%G`!8"0@;P`$(%`@4'`OL!!F!'#_8!(@(
XM;P`$(%`B$"!7(%`@$&$`9$A,[0$`__Q.74YU3E4``$CGP,`@//___\!A`.ZT*
XM(&\`!"!0(E<B42`I`#ZPJ``^9`1P_V`:(&\`!"!0(E<B42`I`#ZPJ``^8P1P`
XM`6`"<`!,[0,`__A.74YU3E4``$CGP(`@//___Z1A`.YF3^__]"`O``RPKH@>(
XM;`8@+P`,8`0@+H@>+T``!"`O`!"PKH@>;`8@+P`08`0@+H@>+H`O;P`$``A@<
XM9B`O``CEB"!NK.8@<`@`+R@`!"`O``SEB"!NK.8@<`@`2&@`-2`O`!#EB"!N\
XMK.8@<`@`2&@`+"`O`!3EB"!NK.8@,`@`4(`B`"`O`!3EB"!NK.8@<`@`(!!A9
XM)$_O``QA``3@4J\`""`O``BPEVV2<`%/[P`,3.T!`/_\3EU.=4Y5``!(Y\"`)
XM(#S___^X80#MG%F/(&\`"'``,"@`""Z`2JZ9/F8``/P@%P@```=G!'!D8`)P`
XM+6$`!#`@%P@```9G!'!S8`)P+6$`!!X@%P@```5G!'!E8`)P+6$`!`P@%P@`*
XM``1G!'!W8`)P+6$``_H@%P@```-G!'!R8`)P+6$``^@@%P@```)G!'!E8`)P@
XM+6$``]8@%P@```%G!'!W8`)P+6$``\0@%P@```!G!'!R8`)P+6$``[)P(&$`R
XM`ZP@;P`(<``P*``*(@!!^B>/(`AA`&!2(B\`&$'Z)X8@"&$`8$0B+P`<0?HGS
XM?B`(80!@-B`7"```!V8.(&\`""(H`!1!^B=J8`1!^B=J(`AA`&`6<"!A``-4/
XM("\`"'(<T(%A``)V("\`(&$`]'`@;P`(<``P*``((@`@+P`$80#\.EB/3.T!7
XM`/_\3EU.=4Y5``!(Y_#`(#S___^P80#L4E&/0J\`!&`L("\`!'(.80!F/$'NY
XMB"(@,`@`L*\`"&800>Z((B`()``@+P`$8```SE*O``0@+P`$L*ZLZFW*<$"PH
XMKJSJ;@1"KJSJ("ZLZG(.80!E^D'NB"(AKP`("``@+P`(80`U%"Z`9U9"KP`$Z
XM8"8@+JSJ<@YA`&740>Z((B(O``30@2)7(E$B+P`$$;$8``@$4J\`!"!7(%`@V
XM+P`$<B"R,`@`;<H@+JSJ<@YA`&6>0>Z((B(O``30@4(P"`1@+"\O``A!^B997
XM(@A![H@B(`@D`"8!("ZLZG(.80!E<-2`6((@`B(#80!>Z%B/0>Z((B`()``@8
XM+JSJ4JZLZG(.80!E3-2`6((@`E"/3.T##O_L3EU.=4Y5``!(Y_#`(#S___^P)
XM80#K+%&/0J\`!&`L("\`!'(.80!E%D'NBZ(@,`@`L*\`"&800>Z+HB`()``@A
XM+P`$8```SE*O``0@+P`$L*ZL[FW*<$"PKJSN;@1"KJSN("ZL[G(.80!DU$'N\
XMBZ(AKP`("``@+P`(80`OI"Z`9U9"KP`$8"8@+JSN<@YA`&2N0>Z+HB(O``30:
XM@2)7(E$B+P`$$;$8``@$4J\`!"!7(%`@+P`$<B"R,`@`;<H@+JSN<@YA`&1X_
XM0>Z+HB(O``30@4(P"`1@+"\O``A!^B4V(@A![HNB(`@D`"8!("ZL[G(.80!DN
XM2M2`6((@`B(#80!=PEB/0>Z+HB`()``@+JSN4JZL[G(.80!D)M2`6((@`E"/J
XM3.T##O_L3EU.=4Y5``!(Y\"`(#S___^H80#J!EF/("\`!&$`7B0N@"!7+R@`A
XM!"!O``0O*``((&\`""\H`!0@;P`,("@`$.6(0>ZM%"\P"``@;P`0(B@`#$'Z?
XM),L@"&$`73A/[P`06(],[0$"__A.74YU3E4``$CG@(`@//___[AA`.F>68]*@
XMKID^9P9!^B2M8`1!^B2R(`AA`%S^80``F%B/3.T!`/_\3EU.=4Y5``!(Y\``K
XM(#S___^X80#I9$J79Q!(>@`8<@`@+P`$80!:YEB/3.T``O_\3EU.=4Y5``!(-
XMY\"`(#S___^\80#I-$'NJ#(B"!`O``-(@$C`80!<LDSM`0+_^$Y=3G5.50``R
XM2.?``"`\____N&$`Z08O+P`$(B\`!"`NFD)A`%AV6(]A`/]\3EU.=4Y5``!(\
XMYX``(#S___^\80#HVB`NFE)A`/]><`UAB$Y=3G5.50``2.?``"`\____M&$`K
XMZ+A*KII&9P``=DJNFDIG;DJNFDYG:"`O``13@"\`(B\`!"`NFD9A`%@06(]A>
XM`/\62J\`$&P@8`@@+II.80#_!B`O`!!2KP`02H!F[&`4("Z:2F$`_O`@+P`0.
XM4Z\`$$J`9NP@+IIZ4X`O`'(`("Z:1F$`5\98CV$`_LQ@``#$2JZ:6F<``+Q*_
XMKII>9P``M$JO`!!L5EF/+J\`%"`O``C0KP`4+P!R`"`NFD)A`%>,6(]@!"`NW
XMFEYA`/Z,(!=2ETJ`9O`O+P`$<@`@+II"80!7:EB/8`0@+II:80#^:B`O`!12.
XMKP`42H!F[&!468\NKP`4+R\`!'(`("Z:0F$`5SQ8CV`$("Z:7F$`_CP@%U.7K
XM2H!F\"`O``B0KP`4+P!R`"`NFD)A`%<46(]@!"`NFEIA`/X4("\`%%.O`!1*D
XM@&;L6(].74YU3E4``$CG@(`@//___[QA`.=D80`'["`780`55$'Z(KP@"&$`Q
XM%4I*KH`,9Q`@+H`,Y8@@?/__LKS1SF`*("Z9.N6(0>ZM`"!P"``@"&$`%2!*\
XM+IJ49@1A`/XR3.T!`/_\3EU.=4Y5``!(Y\"`(#S___^T80#G`"\70?HB8R((1
XM0>ZH3B`(80!::EB/2JZ`#&<*("\`!&$`-)Y@)"`NF3KEB$'NK0`O,`@`+R\`'
XM"$'Z(C8B"$'NJ$X@"&$`6C90CTSM`0#__$Y=3G5.50``2.?`@"`\___[L&$`]
XMYIQ/[_OX0>Z0-B](!`0B+P0(0>\`!"`(80!0N$'O!`0B"$'Z(?`@"&$`5)8N8
XM@$J79P8@5QU0D"I![P0$(@A!^B'7(`AA`%1Z+4"0+$'O!`0B"$'Z(<8@"&$`.
XM5&8M0)`P0>\$!"((0?HAM2`(80!44BU`FD)![P0$(@A!^B&D(`AA`%0^+4":6
XM1D'O!`0B"$'Z(9,@"&$`5"HM0)I*0>\$!"((0?HA@B`(80!4%BU`FDY![P0$O
XM(@A!^B%Q(`AA`%0"+4":4D'O!`0B"$'Z(6`@"&$`4^XM0)I60>\$!"((0?HAR
XM3R`(80!3VBU`FEI![P0$(@A!^B$^(`AA`%/&+4":7D'O!`0B"$'Z(2T@"&$`=
XM4[(M0)IJ0>\$!"((0?HA'"`(80!3GBU`FFY![P0$(@A!^B$+(`AA`%.*+4":U
XM8D'O!`0B"$'Z(/H@"&$`4W8M0)IF0>\$!"((0?H@Z2`(80!38BU`FG)![P0$M
XM(@A!^B#8(`AA`%-.+4":=D'Z(,T@"&$`4YXM0)IZ0?H@PB`(80!3D"U`FGY!V
XM^B"W(`AA`%&P'4":@B`NFGI7@"U`FI!![IE"(@AP`6$`8%Q(>`"`0>Z90B((:
XM0>Z9PB`(80!=;EB/<``=0)G)'4"9QG``'4"9S1U`F<Y!^@"^(`AA`&7:86!/X
XM[P0(3.T!`O_X3EU.=4Y5``!(YX``(#S___^\80#DD$JNK41F""`NFG)A`/L.S
XM<`$M0*U$3EU.=4Y5``!(YX``(#S___^\80#D9DJNK41G""`NFG9A`/KD0JZMA
XM1$Y=3G5.50``2.?`@"`\____O&$`Y#Y![IG"(@AP`6$`8$9ACDSM`0+_^$Y=5
XM3G5.50``2.?`@"`\____O&$`Y!1![IE"(@AP`6$`8!QACDSM`0+_^$Y=3G5.C
XM50``2.>``"`\____P&$`X^I@"'`!+4":FF`2(!<,@`````)G[@R``````V?FM
XM3EU.=4Y5``!(YX"`(#S___^\80#CN&$`!$!AC$'NJ#(@"&$`5T!,[0$`__Q./
XM74YU3E4``$CGP(`@//___[QA`..,(CP```$`0>ZM2"`(80`A!$SM`0+_^$Y=F
XM3G5.50``2.>`@"`\____M&$`XV!1CT'Z'PX@"&$`5W`N@&<$+5>L]&$`&61A:
XM``0,80`%($*NFI9*KIJ:9QA"KIJ:80`#ND'Z'N4@"&$`^;!A`!=^82YA``;<;
XM0>ZH,B`(80!6J&$`%JPO0``$("\`!&%`2JZ:EF?`4(],[0$`__Q.74YU3E4`.
XM`$CGP(`@//___[AA`.+>2'@``7(`0>ZH%B`(80!6)EB/3.T!`O_X3EU.=4Y5Q
XM``!(Y\"`(#S___^X80#BL%F/2JZ:FF<``AY@``,B("Z:B.6((&ZLYB`P"`!A)
XM`!3"2H!G,B`NFHCEB"!NK.8@<`@`(!!A`!/,2H!F``+R("Z:B.6((&ZLYB!PO
XM"``@$&$`^NI@``+:$"\`!TB`2,!A`!5\2H!F``&T80`(A&```L!P`&`"<`%A9
XM`!/:8``"LF$`$>1@``*J80`6YF```J)A`/`28``"FBUNFH2:B&```I!A``6"8
XM8``"B&$`!0I@``*`80`#W&```G@@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30[
XMKIJ04X`M0)J(8``"4F$`&$Y@``)*("Z:D&```+H@+IJ08```Q&$`\$Y@``(R"
XM80`8MF```BH@+IJ(Y8@@;JSF('`(`"`080`9<F```A(0+P`'2(!(P"(`80`5.
XM)+*`9@#_.$JNFIIF`/\P<$2P+P`'9@1P`6`"<`!A`.S<8``!X$*NK/Q@``'8V
XM<#8M0*S\8``!SG`!+4"9/F`$0JZ9/DHNFI1G``&Z<`$M0*T0<@%P`&$`^!9A@
XM`/=Z8``!I&$`!+9@``&<80`#^&```90@+IJ0;`)2@.*`80`$)F```8(@+IJ0?
XM;`)2@.*`80`$1&```7`0+P`'2(!(P"(`0>ZH%B`(80!42+*`9@#^D$JNFIIF>
XM`/Z(<`$M0)J68``!1&$``>Q@``$\80#I+&```31P5+`O``=F!'`!8`)P`&$`G
XMZ4I@``$>80#NUF``_CIA`!0R80#]SF```0H0+P`'2(!50`Q``'9B`/XBT$`P4
XM.P`&3OL``OZN_A;_7/X6_J;^%OX6_A;_3/]4_G#^%OX6_A;^%OX6_A;^%OX6'
XM_V[^%OX6_A;^%OX6_A;^%OX6_A;^%OW._A;^%OX6_C3^%OXP_A;^%OX6_A;^^
XM%O],_A;^IOX6_A;^%OX6_A;^%OX6_A;^%OX6_A;^%OX6_R+^/O\J_D[^%OX67
XM_A;^%O[>_A;^%OX6_E;^QOY@_FC^>/Z>_A;^%OX6_X#^MOZ^_[S_O/X6_A;^U
XM%OX6_X#^1OX6_A;^%OX6_A;^%OX6_A;^WOX6_A;^%O\0_U3^%OX6_QC^%O]<U
XM_J[_;O^`_ZS^%O^T_A;^%OX6_])8CTSM`0+_^$Y=3G5.50``2.?`@"`\____*
XMO&$`WV0@+IIZ4X`B`'``80#V0"`NFE)A`/7:0>ZH,B`(80!2W$SM`0+_^$Y=&
XM3G5.50``2.?`@"`\____O&$`WRA*+IJ49PAR`'``80#V!$'NJ#(@"&$`4JAA1
XM`/MP+4":C&$`XAY*@&8(("Z:C&$`]X1"KIJ(0JZ:A&$``(I*+IJ49P9P`2U`C
XMK1!,[0$"__A.74YU3E4``$CG@``@//___[QA`-[$80#AVB`NFH30KIJ0L*Z(>
XM'F\&("Z('F`(("Z:A-"NFI"PKIJ(;B`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`N(
XMFH30KIJ04X!@!"`NFH@M0)J(2BZ:E&<(80IP`2U`K1!.74YU3E4``$CGP(`@W
XM//___[AA`-Y22BZ:E&<(<@!P`&$`]2XO+H@>(BZ:C$'Z&?T@"&$`4:I8CV$`3
XM]4),[0$"__A.74YU3E4``$CGP``@//___[QA`-X0("Z:5F$`])1"+IJ489YR$
XM`7``80#TY&$`]$AP`2U`K1`=?``!FI1,[0`"__Q.74YU3E4``$CGP``@//__Z
XM_[AA`-W.<@)P`&$`]+`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30KIJ0(@`@K
XM+IJ$80#O*B`NFH30KIJ0L*Z('F]F68\@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`N2
XMFH30KIJ0D*Z:A%2`(@!P`&$`]%`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH302
XMKIJ0D*Z:A"Z`8`QP?F$`\_AA`/1.4I<@%["NFI!M[%B/3.T``O_\3EU.=4Y5:
XM``!(YX``(#S___^\80#=$$JNFHAO!E.NFHA@!&$``T!.74YU3E4``$CG@``@L
XM//___\!A`-SJ0JZ:B$Y=3G5.50``2.>``"`\____P&$`W-`@%]&NFH@@+IJ(@
XML*Z('FT*("Z('E.`+4":B$Y=3G5.50``2.>``"`\____P&$`W*`@%Y&NFHA*I
XMKIJ(;`1"KIJ(3EU.=4Y5``!(YX``(#S____`80#<>B`NB!Y3@"U`FHA.74YUF
XM3E4``$CG@``@//___[QA`-Q:("Z('E.`L*Z:B&\&4JZ:B&`$80`"A$Y=3G5.C
XM50``2.?`@"`\____K&$`W"Y9CR!NK/1*$&8``E9*KJT09P8=?``!FI1*+IJ4R
XM9@``K&$`_)8@+IJ(Y8@@;JSF('`(`"\H``0@+IJ(Y8@@;JSF('`(`$AH`#4@/
XM+IJ(Y8@@;JSF('`(`$AH`"P@+IJ(Y8@@;JSF(#`(`%"`(@`@+IJ(Y8@@;JSF5
XM('`(`"`080#N`D_O``P@+IIZ4X`B`$JNF3YG!'`!8`0@+JS\80#R>D'NJ#(@U
XM"&$`3QYA``\B+H!R#;*`9@QA`/U680#_-&```:(@%V$`#^Y@``&82JZM$&=@.
XM("Z:B)"NFH1O#B`NFHB0KIJ$L*Z:D&T>("Z:D&P"4H#B@"(NFHB2@"U!FH1*<
XMKIJ$;`1"KIJ$80#]1B`NFHB0KIJ$5(`B`$JNF3YG!'`!8`0@+JS\80#Q\$*NG
XMK1!@``$R68\@+IJ(D*Z:A"Z`2I=O#"`NFI!3@)&7;`)"EW`!D*Z:D+"7;S0MX
XM;IJ(FH1R`G``80#QM"`NFH30KIJ0L*Z('F\&("Z('F`(("Z:A-"NFI`B`"`N%
XMFH1@``"T("Z:D%.`L)=L*B`NFHB0KIJ04H`M0)J$<@)P`&$`\6X@+IJ$T*Z:W
XMD+"NB!YOP"`NB!Y@PDJ79P``?B\7("Z:D%2`(@!P`F$`\9)8CR`7T:Z:A$J7%
XM;!!R`G``80#Q,"`NFH20EV"0("Z:D%2`D)<B`'``80#Q&"`NFH30KIJ0L*Z(.
XM'F\&("Z('F`(("Z:A-"NFI`B`"`NFH30KIJ0L*Z('F\&("Z('F`(("Z:A-"NX
XMFI"0EV$`ZW@@+IJ(D*Z:A%2`(@!*KID^9P1P`6`$("ZL_&$`\+I8CUB/3.T!O
XM`O_X3EU.=4Y5``!(YX``(#S___^\80#9L'`'80#P9DY=3G5.50``2.?`@"`\"
XM___^<&$`V91/[_[`80#Z&$'NJ#(@"&$`31IA`/5:+R\!0"\NFJ(@+IJ(Y8@@'
XM;JSF('`(`"\00?H5-"((0>\`#"`(80!,UD_O``Q!UR`(80!-DBU`@`QG"$'7V
XM(`AA`";\0>ZH%B`(80!,GDJO`41G"F$`^P@=?``!FI1A`/303^\!0$SM`0#_#
XM_$Y=3G5.50``2.?`@"`\____F&$`V/Y/[__J0J\`$DJO`!IG!B!O`!I@!$'Z6
XM%,TNB&``!G)@``7F2J\`$F]`0?H4NR`(80!,1%.O`!)@-$JO`!IG!B!O`!I@(
XM!$'Z%*,NB$JO`!)O&&`.0?H4ER`(80!,&E.O`!)*KP`2;NQ@!&$`_M)@``8@5
XM(%=*$&<>(%=2EQ`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``:L8``%^$*O``I"7
XMKP`.8```HB`O``[EB"!NK.8@<`@`("@`!`@```!G``"$<`$O0``*("\`#N6(T
XM(&ZLYB!P"``@$&$`33C0KP`24H`,@````0!L``3Z("\`#N6((&ZLYB!P"``O9
XM4``$8"(@;P`$$!`B+P`24J\`$B!O`!81@!@`2(!(P&$`!Q12KP`$(&\`!$H0+
XM9M9P("(O`!)2KP`2(&\`%A&`&`!(@$C`80`&[E*O``X@+P`.L*Z('FT`_U9*Q
XMKP`*9@`"IB`NFHCEB"!NK.8@<`@`(!!A`$RDT*\`$E*`#(````$`;``$9B`NQ
XMFHCEB"!NK.8@<`@`+U``!&`B(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!AT
XM``:`4J\`!"!O``1*$&;68``"0"]NFHP`!&`N#*\```$``!)L``00(&\`!!`0L
XM(B\`$E*O`!(@;P`6$8`8`$B`2,!A``8^4J\`!"!O``1*$&;*8``!_B]NFIX`/
XM!&`N#*\```$``!)L``/.(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``7\&
XM4J\`!"!O``1*$&;*8``!O!`O``E(@$C`80#M;$'NJ#(@"&$`2CYA``I"'T``W
XM"1`O``E(@$C`80`)P$J`9B`0+P`)2(!(P&$`"P@@+P`24J\`$B!O`!81O`!`-
XM"`!@"D'Z$ET@"&$`[/!@``/R$"\`"4B`2,!A`.T00>ZH,B`(80!)XF$`">8?X
XM0``)<"2P+P`)9@``>D_O__9A`%<@+P!!^A(A(@A![P`$(`AA`$F>6(]!^A(2A
XM(`AA`.R>0=<O2``.8#8,KP```0``'&T*<!M/[P`@8``#YB!O``X0$"(O`!Q2#
XMKP`<(&\`(!&`&`!(@$C`80`%"%*O``X@;P`.2A!FPF$`!*9/[P`*8``#4A`O6
XM``E(@$C`Y8A![I0V2K`(`&8B$"\`"4B`2,!A``HF("\`$E*O`!(@;P`6$;P`8
XM)`@`8``#'$'Z$80@"&$`[`P0+P`)2(!(P.6(0>Z4-B]P"```!&`N#*\```$`O
XM`!)L``)"(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``1P4J\`!"!O``1*`
XM$&;*8#`,KP```0``$FP``@H@5U*7$!`B+P`24J\`$B!O`!81@!@`2(!(P&$`+
XM!#@@5TH09M!A``/<8``"C!`O``E(@$C`80#KJD'NJ#(@"&$`2'QA``B`'T``=
XM"7!^L"\`"6<``'9P);`O``EG``!L<".P+P`)9V)P7+`O``EG6G`AL"\`"6=2W
XM<`NP+P`)9TIP%;`O``EG0G`8L"\`"6<Z<`BP+P`)9S)P?[`O``EG*A`O``FP4
XM+P`M9R!P&[`O``EG&'`-L"\`"6<0<$"P+P`)9PAP)+`O``EF"G`(80#K%&``<
XM`3YP,+`O``EN``"&<#>P+P`);0``?%&/0I="KP`$8"X@%^>($B\`$4B!2,'0)
XM@02`````,"Z`<`AA`.K6(!=A``)680`'L!]``!%2KP`$<`.PKP`$;Q!P,+`O-
XM`!%N"'`WL"\`$6RZ$"\`$4B`2,!A``AJ$"\``R(O`!I2KP`:(&\`'A&`&``?T
XM0``14(]@``%8<%ZP+P`)9@``A'`(80#J<G!>80#J;$'NJ#(@"&$`1SYA``="$
XM'T``"7`_L"\`"6XB<%^P+P`);1IP"&$`ZD00+P`)2(!(P`2`````0')_P(%@"
XM8'!@L"\`"6X><'ZP+P`);19P"&$`ZAH0+P`)2(!(P`2`````8&`Z("\`$E*O2
XM`!(@;P`6$;P`7@@`8!(@+P`24J\`$B!O`!81O`!<"``,KP```0``$FT&<!M@2
XM``$$$"\`"2(O`!)2KP`2(&\`%A&`&`!(@$C`80`!/F```(H0+P`)2(`,0``DK
XM9P#\C&(^#```&&<`^BYB'@P```MG`/I*8@H,```(9P#Y\F"B#```%6<`^?Y@W
XMF`Q``"-G`/MZ8HX,```A9P#]J&``_X0,0`!<9P#]JF(8#```0&<`^]YB`/]NZ
XM#```)6<`^BA@`/]B#$``?V<`^:9B`/]6#$``?F<`^WA@`/]*2JZ:FF8V0>ZHO
XM,B`(80!%^&$`!?P?0``)<ANR`&<$<`%@`G``2H!G%'`-L"\`"6<,$"\`";`OS
XM`"UF`/E6(&\`%B`O`!)",`@`2JZ:FF<$<!M@"!`O``E(@$C`3^\`%DSM`0#_1
XM_$Y=3G5.50``2.>`@"`\____N&$`T?99CT*78!0@;P`$4J\`!!`02(!(P&$`3
XM`0[1ER!O``1*$&;D80``KM&7(!=8CTSM`0#__$Y=3G5.50``2.>``"`\____1
XMN&$`T:Y9CQ`O``=(@$C`80``T"Z`80``>-&7(!=8CTY=3G5.50``2.>``"`\P
XM____O&$`T7Y*KJY*9A@@+IIB80#G_'`!+4"N2DHNFH)G!'`!8`)P`$Y=3G5.Y
XM50``2.>``"`\____O&$`T4A*KJY.9A@@+IIJ80#GQG`!+4"N3DHNFH)G!'`!O
XM8`)P`$Y=3G5.50``2.>``"`\____N&$`T1)9CT*72JZN2F<4("Z:9F$`YXQ"W
XMKJY*2BZ:@F<"4I=*KJY.9Q0@+IIN80#G<D*NKDY*+IJ"9P)2ER`76(].74YUI
XM3E4``$CGP``@//___[AA`-#`68]"EQ`O``=(@$C`<H#`@6<880#_4M&7$"\`V
XM!TB`2,!R?\"!8<C1EV`\<""P+P`';@AP?[`O``=F&&$`_O31EQ`O``=(@$C`&
XM<D#0@7)_P(%@#F$`_TC1EQ`O``=(@$C`80#G&%*7(!=8CTSM``+__$Y=3G5.B
XM50``2.?`@"`\___^M&$`T#I/[_[\80#POD'Z##`@"&$`0Z!"IT'NKE(B"$'O7
XM``@@"&$`]PA8CW(;L@!G``!^2B\`!&<``'9![P`$(@A![JY2(`AA`$4F<@!!I
XM[P`$(`AA``$\2H!F6$'O``0@"&%>2H!F3'(O0>\`!"`(80!&A"Z`9RP@5U*7A
XM0A!R`4'O``0@"&$``0I*@&<6(!=A,$J`9AY"KH`,<`(M0)DZ(!=@!D'O``0@)
XM"&$`Z!Y@!&$``*9/[P$$3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^X80#/;%F/E
XM0I=@(B(O``0@%^6((&ZLYB!P"``@$&$D2H!G""U7FHAP`6`,4I<@%["NB!YM.
XMUG``6(],[0$"__A.74YU3E4``$CGP,`@//___\!A`,\<8`92EU*O``0@;P`$L
XM2A!G#"!O``0B5Q`1L!!GYB!O``1*$&8$<`%@`G``3.T#`/_X3EU.=4Y5``!(M
XMYX"`(#S___^\80#.UDJNFIIF&&$`[UA!^@K0(`AA`$(Z2BZ:E&8$80#ESDSM*
XM`0#__$Y=3G5.50``2.?`@"`\____O&$`SIQ*KP`$9Q!A`.\>(A=!^@JC(`AAH
XM`$'^0>ZH,B`(80!"%"`780!.ADJ`9@AA`.\V<`%@`G``3.T!`/_\3EU.=4Y5:
XM``!(Y\"`(#S___ZX80#.3$_O_P!A`.[080#IRD'NJ#(B"$JO`0!G!'`D8`)PH
XM)F$`0;I"IT'NKU(B"$'O``0@"&$`]0I8CW(;L@!F%&$`Z6QA`._H'7P``9J47
XM80#_&&`>0=<B"$'NKU(@"&$`0R`B+P$`0=<@"&$`]#YA`.D^3^\!`$SM`0+_[
XM^$Y=3G5.50``2.>`@"`\____P&$`S;X@5W``,"@`$`*`````@$SM`0#__$Y=N
XM3G5.50``2.?`@"`\____K&$`S91/[__P0?H)J2((("\`$&$`0,HN@&8,("\`9
XM$&$`Y@)@``"20J\`!&$`[?9"KP`,8`P@+P`(80#\C-&O``P@%V$`0+XO0``(&
XM<$BPKP`,;PX@5S`H``Q(P`@```1GU&$`_!)*+IJ4<`UA`./F(%<P*``,2,`(Q
XM```$9@YA``"X+T``!'(_LH!GH"`780!`I$JO``1G('`@L*\`!&<8<'&PKP`$D
XM9Q!P/["O``1G""`O``1A``%H3^\`$$SM`0+_^$Y=3G5.50``2.>`@"`\____O
XMO&$`S,)*+P`#9S`0+P`#2(!(P.6(0>Z4-DJP"`!G'!`O``.P+JSR9A9A`.TFI
XM0?H(M2`(80!`"&$``.IP`&`<'6\``ZSR$"\``TB`2,#EB$'NE#8M<`@`K/1P:
XM`4SM`0#__$Y=3G5.50``2.?`@"`\____NF$`S%!5CT'NF#:Q[JSX9`Q3KJSX_
XM(&ZL^&```'8@;JST2A!G``!T(&ZL]'`'L!!F/E*NK/0@;JST<`>P$&9<0>ZH2
XM%B`(80`_>!]```%R#;(`9P93KJST8`12KJST<`VP+P`!9@1AC&`\$"\``6`D-
XM(&ZL]'!<L!!F$"!NK/1P![`H``%F!%*NK/0@;JST4JZL]!`02(!(P&`,819!:
XM[J@6(`AA`#\<5(],[0$"__A.74YU3E4``$CG@(`@//___\!A`,N20BZL\D'Z&
XM![HM2*ST3.T!`/_\3EU.=4Y5``!(YX"`(#S____`80#+:D'NF#8@+JSXD(@,-
XM@````0!N#"!NK/A2KJSX$*\``TSM`0#__$Y=3G5.50``2.?`@"`\___^M&$`U
XMRS!/[_[\80#KM$'NJ#(@"&$`/K9!^@=+(`AA`#Z,80#^L"]``0!*KIJ:9E`@:
XM+P$`80#Y0$'Z!S,@"&$`/FQ(>`!=("\!!.6(0>Z4-B(P"`!![P`$(`AA`/'*;
XM6(]R&[(`9@9A`/OF8!1!^@<%(`AA`#XX0=<B""`O`0!A#D_O`01,[0$"__A.3
XM74YU3E4``$CGP(`@//___[QA`,J6$"\``TB`2,#EB$'NE#9*L`@`9Q80+P`#!
XM2(!(P.6(0>Z4-B`P"`!A`#ZL(&\`!$H09A00+P`#2(!(P.6(0>Z4-D*P"`!@2
XM8!`O``-(@$C`Y8A![I0V(@`@+P`$80`_2E*`80`^9B&`&``0+P`#2(!(P.6(&
XM0>Z4-DJP"`!F$&$`ZJ)!^@93(`AA`#V$8!HB+P`$$"\``TB`2,#EB$'NE#8@C
XM,`@`80`_(DSM`0#__$Y=3G5.50``2.?`@"`\____O&$`R=1!^@89(@AP(&$`W
XM_R)!^@86(@AP)6$`_Q9!^@8.(@AP<V$`_PI!^@8,(@AP8F$`_OY!^@8%(@APY
XM8V$`_O)!^@8"(@AP?F$`_N9,[0$"__A.74YU3E4``$CG@(`@//___[AA`,EPR
XM68]A`.GV0I=@1"`7Y8A![I0V2K`(`&<T0?H%QB`(80`\QB`780#WBD'Z!;X@G
XM"&$`/+8@%^6(0>Z4-B`P"`!A`/<H0?H%JB`(80`\G%*7#)<```$`;;1![J@6V
XM(`AA`#Q\80#J[!U\``&:E%B/3.T!`/_\3EU.=4Y5``!(Y\"`(#S___ZL80#()
XMZ$_O_OAA`.EL0?H%7R`(80#?8DAX`!M![K!2(@A![P`((`AA`.^T6(]R&[(`[
XM9@AA`/G08```@$'O``0B"$'NL%(@"&$`/=1!^@4Q(@A![P`$(`AA`#O:+H!FB
XM#$'O``0@"&$`X1!@3G`!+T`!!&`V("\!!.6(0>Z4-DJP"`!G(B`O`03EB$'N8
XME#8O,`@`+R\!"$'Z!.DB""`O``AA`#O&4(]2KP$$#*\```$``01MP"`780`[)
XMT$_O`0A,[0$"__A.74YU3E4``$CGP(`@//___V!A`,@43^__I$'Z!*DB""`O"
XM`%QA`#M*+T``6&8,("\`7&$`X(!@``$@80#H>&```-YP6[`O``%G"B(O`%Q!Q
XM^@1W8%(@+P!880`[.A]``%=![P`&+T@``B`O`%AA`#LF(&\``E*O``(0@"!OE
XM``)P7;`H__]G#"!O``)P_[`H__]FUB!O``)P7;`H__]G'"(O`%Q!^@0Z(`AA0
XM`#KV0>ZH,B`(80`[#&```(0@;P`"0BC__V$`Y_!!^@0M(`AA`#K2$"\`5TB`]
XM2,!A`/600?H$'R`(80`ZO$'O``8@"&$`]31!^@01(`AA`#JH0>ZH,B`(80`ZZ
XMOD'O``8B"!`O`%=(@$C`80#\;B`O`%AA`#IX("\`6&$`.G`?0``!(&\`6#`H:
XM``Q(P`@```1G`/\(0>ZH%B`(80`Z4"`O`%AA`#IX80#HN!U\``&:E$_O`%Q,W
XM[0$"__A.74YU3E4``$CGP(`@//___V1A`,:R3^__L"\O`%0O+P!40?H#@"((V
XM0>\`""`(80`Z%E"/0=<@"&$`.M1/[P!03.T!`/_\3EU.=4Y5``!(YX``(#S_]
XM___`80#&;"U\`````(`,<@!.0``<9`0]08`,2JZ`#&<$<`!@`G`!3EU.=0`_S
XM/P!4;V\@;6%N>2!D:7)E8W1O<GD@96YT<FEE<P!.;R!M871C:``M/P!O;FQYM
XM(&]N92!A<F=U;65N="!M87D@8F4@<W!E8VEF:65D+@!C86XG="!A8V-E<W,@L
XM9&ER96-T;W)Y('-P96-I9FEE9``O=&UP+V)R+F5N=BXE9`!(3TU%`%-(14Q,S
XM`%1%4DT`+@`N`$``0``N`$1E;&5T92``(%MN73\`665S+@!.;RX`1&5L971E7
XM9"``+@!M;W)E("]D9"]S>7,O8G)O=W-E+FAL<`!D=6UP("5S`%)E;F%M92``C
XM*')E;F%M92`E<R`E<RD`"#X`)3%U(``E+3AS(``E+3AS(``E-VQD(``@("`@P
XM+2TM(``E9``E9`!*86X`1F5B`$UA<@!!<'(`36%Y`$IU;@!*=6P`075G`%-EV
XM<`!/8W0`3F]V`$1E8P`E,F0@)3-S("4P,F0@)3)D.B4P,F0`($9I;&4@3F%MB
XM90!!='1R("`@3&YK(%5S97(@("`@($=R;W5P("`@("`@(%-I>F4@("`@("!-Y
XM;V1I9GD@5&EM92!&:6QE(&YA;64`.B``)7,@+2T@`"5S.B`E<PT`<&,`=7``&
XM8F,`8VT`8W,`<V8`<W(`8V4`8VP`86P`9&P`=7,`=64`<V\`<V4`=&D`=&4`/
XM;&D`8V\`>&X`0E)/5U-%`$EN=&5R<G5P=``E<SH@)60@9FEL97,`<V5T96YVO
XM($9)3$4@)7,[)7,@)7,`(0`((`@`(0`((`@`""`(`"5D``@@"``((`@`9V]T(
XM;R``0V]M;6%N9"!K:6QL960`8V0@)7,`<@!296-U<G-I=F4@;6%C<F\N``!D0
XM969I;F4@`"!A<R!;`%T`3F\@<F]O;0`D;6]R92`E#0`D)0T`)'-C<F5D("4-3
XM`#TN+@T`)&-O<'D@)2``/7X-`&1E9FEN92``(&%S(%L`70T`4V%V92!M86-RH
XM;W,@87,@`'<`6R5C)7-=#0!R`&EL;&5G86P@<WEN=&%X(&EN("<E<R<`:6QLC
XM96=A;"!S>6YT87@@:6X@)R5S)P!D969I;F4@`"!A<R!;`%T-`&-O<'D@)7,@4
XM)7,``$Y5``!(Y\BX)$`F02`\____D&$`PP)/[__80A)!^@#,(@A!UR`(80`XW
XM("`+9PHB"T'7(`AA`#@R0?H`O"((0=<@"&$``O@H0$J`9Q1(5"(\````R"`*)
XM80`V)EB/2H!F!'``8"QR#2`*80`Y0"@`9P0@1$(02%1R)T'O``0@"&$`-?Y8=
XMCTJ`9NP@#&$``\8@"D_O`"A,[1T0_^Q.74YU3E4``$CGP``@//___[QA`,)H"
XM<@`@%V$`_TI,[0`"__Q.74YU3E4``$CGP(`@//___[QA`,)$0?H`(B(((!=AD
XM`/\B3.T!`O_X3EU.=2]H,"]#3413+W!D`'(`("UX`$Y5``!(Y\"`(#S___[@C
XM80#""D_O_R@M?````-:`#$'Z`]P@"&$`-A`O0`#49P``FDAX`,A![P`$(@A!Q
XM^@/&(`AA`"/<6(]*@&8.0?H#PR((0=<@"&$`-O9!UR](`-!@6B]O`-``S'(L9
XM("\`T&$`.$`O0`#09Q`@;P#04J\`T$(08`12KP#,(&\`S`P0`"!G\G(@("\`R
XMS&$`.!8O0`#(9P8@;P#(0A`B+P#,("\`U&$`-N)*@&8$<`%@$$JO`-!G""!O=
XM`-!*$&:8<`!/[P#83.T!`O_X3EU.=4Y5``!(Y\^X)$`F02`\____J&$`P2Y*.
XMKK'29PIA`/\*2H!G``$X*$I@`E*,#!0`(&?X(@Q![IQN(`AA`#8X<B!![IQNP
XM(`AA`#>.*$!*@&<"0AQ!^@+P(@A![INF(`AA`#840>Z<;B((0>Z<;B`(80`"(
XM^B(`0>Z;IB`(80`V&"`,9QQ!^@+$(@A![INF(`AA`#8$(@Q![INF(`AA`#7X$
XM0>Z;IBU(L=I@"'@`8!1X`6`0$!-(@`Q``')G\@Q``'=GZ'`!L(1F"D'NJ#(@_
XM"&$`-`P@!&$`-#XL`"`$80`T5G(#0?H":"`(80`T%D'Z`F0B"$'Z`FL@"&$`$
XM`G(M0+'62'@``T*G0J<O+JNF2&ZQUB(NL=9!^D#"(`AA`#0X3^\`%"X`(`1AV
XM`#/L*@`@!&$`-`0@!F$`,]X@!F$`,_A*AV\6(`7EB$'NL5(AAP@`(@L@!6$`-
XM,SQ@""`%80`SV'``3.T=\/_@3EU.=4Y5``!(Y\^P)$`F02`\____I&$`O\99#
XMCTJNL=)G"F$`_:!*@&<``.(B"D'NFJ8@"&$`--I!UR((0>Z:IB`(80`GH'+_P
XMLH!F#&```+YX`&`4>`%@$!`32(`,0`!R9_(,0`!W9^AP`;"$9A(,;@`!J$!F1
XM"D'NJ#(@"&$`,O@@!&$`,RHL`"`$80`S0G(#0?H!;2`(80`S`DAX``-"IT*G_
XM+RZKIB\O`!`@;P`4(A`@;P`4(!!A``%.(@!!^C^T(`AA`#,J3^\`%"X`(!=A"
XM`#-.(`1A`#+8*@`@!&$`,O`@!F$`,LH@!F$`,N1*AV\6(`7EB$'NL5(AAP@`+
XM(@L@!6$`,BA@""`%80`RQ'``6(],[0WP_^1.74YU3E4``$CGSJ`D0"`\____,
XMN&$`OK)9CS!J``XJ""`%Y8A![K%22K`(`&8$</]@;"`*80`R*B`*80`R*&`V8
XM(`7EB$'NL5*XL`@`9SA\`&`>(`;EB$'NL5*XL`@`9@X@!N6(0>ZQ4D*P"`!@5
XM"%*&<""PAF[<0=<@"&$`/HXH`'+_LH!FNG#_L(1F!'#_+H`@!>6(0>ZQ4D*PH
XM"``@%UB/3.T%<O_H3EU.=5-(14Q,`'9A;&ED+G-H96QL<P!S:&5L;"QS:"QC:
XM<V@`97@@`"``+W!I<&4`4UE35$5-+E-(14Q,`'-H96QL`"]P:7!E``!.50``X
XM2.?`N"1`(#S___^X80"]QG(O("\`!&$`-'0H0$J`9P@@#%*`+T``!$AX`0!!1
XM[ITV(@@@+P`(80`?H%B/2H!G!$7NG39R+R`*80`T0BA`2H!G!%*,8`(H2B(\3
XM```!`"`,80`](B9`<O^R@&8.(@I![ITV(`AA`#*08!(B#$'NG38@"&$`,H(@B
XM"V$`/3!![ITV(`A,[1T`__!.74YU3E4``$CGP(`@//___U!A`+TH3^__G$JN(
XML>)F)"\NL>9(>@/D0>\`""((0?H#W"`(80`F9E"/+4"QXF8,</]@"B`NL>)AW
XM`#!.<`!/[P!D3.T!`O_X3EU.=4Y5``!(YX``(#S___^\80"\T$JNL>)G#"`N1
XML>)A`#!>0JZQXDY=3G5.50``2.>`("1`(#S____`80"\IF`"4HI*$F<&#!(`*
XM.F;T2A)G`D(:(`I,[00`__Q.74YU3E4``$CG@"`D0"`\____P&$`O')@`E**!
XM2A)G#`P2`"QG!@P2``UF[DH29PP,$@`-9P1"&F`"0A(@"DSM!`#__$Y=3G5.:
XM50``2.?`L"1`(#S___^T80"\+E&/(B\`#$'NH)P@"&$`,5!'[J"<)(L@"V$`.
XM_UHF0"5+``0@"V$`_TXF0"]+``0@"V$`_T(F0"`O``1A`#+,)4``"$*78!8@Q
XM%U*7Y8A![J`X(8L(`"`+80#_4"9`<!2PEV\$2A-FX"`7Y8A![J`X0K`(`$'N>
XMH#@E2``,8`)2BTH39P8,$P`-9O1"$R`*4(],[0T`__1.74YU3E4``$CGP(`@7
XM//___[AA`+N$2JZQXF8(80#^0DJ`;3XO+K'B(CP```(`0>Z>-B`(80`NREB/;
XM2H!G)`PN`".>-F?>#"X`*IXV9]9![IXV(@A![J",(`AA`/[\2H!F!'``8`9!6
XM[J",(`A,[0$"__A.74YU3E4``$CGP(`@//___[1A`+L268]"EV$`_=)*@&PX/
XM8&`,+@`CGC9G+@PN`"J>-F<F0>Z>-B((0>Z@C"`(80#^I$J`9Q(@+J"4L*\`B
XM!&8$<`%@`G``+H!*EV8:+RZQXB(\```"`$'NGC8@"&$`+AY8CTJ`9JQ*EV<([
XM0>Z@C"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^T80"ZA%F/0I=A]
XM`/U$2H!L/F!F#"X`(YXV9S0,+@`JGC9G+$'NGC8B"$'NH(P@"&$`_A9*@&<8`
XM(B\`!"`NH(QA``/\2H!F!'`!8`)P`"Z`2I=F&B\NL>(B/````@!![IXV(`AA1
XM`"V*6(]*@&:F2I=G"$'NH(P@"&`"<`!8CTSM`0+_^$Y=3G5.50``2.?`@"`\/
XM____M&$`N?!9CT*7+R\`!"(\```"`$'NGC8@"&$`+4!8CTJ`9Q1![J",(@A!I
XM[IXV(`AA`/V"+H!@`D*72I=G$`PN`".>-F?$#"X`*IXV9[P@%UB/3.T!`O_X3
XM3EU.=4Y5``!(Y\#`(#S___^T80"YB%&/80#\2DJ`;`1P_V`Z0I=@)F$`_=XO#
XM0``$9@AA`/R((!=@)"!O``0@%^6((F\`#".H``@(`%*7(!>PKP`(;=)A`/QD(
XM("\`"%"/3.T#`/_X3EU.=7(`4UE3+V=R;W5P`$Y5``!(Y\"`(#S___]080"YY
XM%D_O_YQ*KK'L9B0O+K'P2'H&M$'O``@B"$'Z!JP@"&$`(E10CRU`L>QF#'#_@
XM8`H@+K'L80`L/'``3^\`9$SM`0+_^$Y=3G5.50``2.>``"`\____O&$`N+Y*9
XMKK'L9PP@+K'L80`L3$*NL>Q.74YU3E4``$CG@"`D0"`\____P&$`N)1@`E**7
XM2A)G#`P2`"QG!@P2``UF[DH29P)"&B`*3.T$`/_\3EU.=4Y5``!(Y\"P)$`@\
XM//___[!A`+A:68\B+P`(0>ZDT"`(80`M?$?NI-`DBR`+89@F0"5+``0@"V&.B
XM)D`NBV`"4I<@5TH09P@@5PP0`"YF\"!72A!G!B!74I="$"`+80`NZB5```PFL
XM5R`+80#_7"9`(!=A`"[6)4``""Z+(`MA`/]()D`@%V$`+L(E0``00>ZQZB5(3
XM`!A![K'J)4@`'$'NL>HE2``4)4L`)"`+80#_&B9`)4L`("`+80#_#B9`)4L`4
XM*"`+80#_`B9`)4L`+"`+80#^]B9`2'@`44AX`&-![J;1(@@@*@`L80`$!%"/?
XM0>ZFT25(`!A(>`!12'@`9T'NIR(B""`J`"QA``/D4(]![J<B)4@`'"`*6(],`
XM[0T`__1.74YU3E4``$CGP(`@//___[AA`+<Z2JZQ[&8(80#^"DJ`;3XO+K'LK
XM(CP```(`0>ZBGB`(80`J@%B/2H!G)`PN`".BGF?>#"X`*J*>9]9![J*>(@A!;
XM[J2@(`AA`/Z&2H!F!'``8`9![J2@(`A,[0$"__A.74YU3E4``$CGP(`@//__Q
XM_[1A`+;(68]"EV$`_9I*@&PX8&`,+@`CHIYG+@PN`"JBGF<F0>ZBGB((0>ZD(
XMH"`(80#^+DJ`9Q(@+J2HL*\`!&8$<`%@`G``+H!*EV8:+RZQ["(\```"`$'N:
XMHIX@"&$`*=18CTJ`9JQ*EV<(0>ZDH"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y
XMY\@P)$`F02`\____O&$`MC9X_V`B$!M(@$C`80`K"B(`$!I(@$C`80`J_K*`M
XM9@1P`6`"<``H`$J$9PA*$F<$2A-FTDJ$9Q`0$DB`$A-(@9)`2,$@`6`"</],D
XM[0P0__1.74YU3E4``$CGP(`@//___[1A`+7268]"EV$`_*1*@&P^8&8,+@`C*
XMHIYG-`PN`"JBGF<L0>ZBGB((0>ZDH"`(80#].$J`9Q@B+P`$("ZDH&$`_TI*`
XM@&8$<`%@`G``+H!*EV8:+RZQ["(\```"`$'NHIX@"&$`*-A8CTJ`9J9*EV<(;
XM0>ZDH"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^T80"U/EF/0I<O8
XM+P`$(CP```(`0>ZBGB`(80`HCEB/2H!G%$'NI*`B"$'NHIX@"&$`_*0N@&`"R
XM0I=*EV<0#"X`(Z*>9\0,+@`JHIYGO"`76(],[0$"__A.74YU3E4``$CGP(`@Q
XM//___[AA`+3668\@+P`$80#]]"Z`9@1P_V`.(%<B$"`O``AA`"GJ<`!8CTSMB
XM`0#__$Y=3G5.50``2.?`@"`\____O&$`M)A9CT*78#H@;P`$$!!(@$C`0>ZR]
XM(Q`P"`!(@`@```-G``"T(!=R"F$`+FH@;P`$4J\`!!(02(%(P="!<C"0@2Z`#
XM(&\`!$H09PH@;P`$#!``+F:T(&\`!%*O``1*$&8((&\`"""78&IP$"(7X:D@P
XM;P`(((%"EV`X(&\`!!`02(!(P$'NLB,0,`@`2(`(```#9T0@%W(*80`M_"!OB
XM``12KP`$$A!(@4C!T(%R,)"!+H`@;P`$2A!G"B!O``0,$``N9K8@%R!O``B!5
XMD"!O``1*$&<$<`!@`G#_6(],[0$`__Q.74YU3E4``$CG@"`D0"`\____P&$`#
XMLZ)@`E**2A)G!@P2`'QF]$H29P)2BB`*3.T$`/_\3EU.=4Y5``!(Y\RP)$`H;
XM+P`D*B\`*"`\____N&$`LV99CW#_+H!3A2!O``A"$&!"#!(`+68&N"H``6<*2
XM(`IA`/^0)$!@+"9O``@,*@`]``)F!'`#8`)P`M7`8`(6VDH29PH,$@!\9P139
XMA6[P0A-"EV`(2A)G!$J79K8@%UB/3.T-,/_L3EU.=4Y5``!(YX"@)$`@//__:
XM_\!A`++J8`)2BDH29P8,$@`Z9O1*$F<"0AI*$F8$D<A@`B!*(`A,[04`__A.L
XM74YU3E4``$CG@*`D0"`\____O&$`LJP@"F<$2A)F!'``8$1P`"U`IX`M0*=\-
XM+4"G>"U`IW0M2J=T("ZG=&$`_X8M0*=X9QH@+J=X80#_>"U`IWQG#"`NIWQA<
XM`/]J+4"G@$'NIW0@"$SM!0#_^$Y=3G5R`%-94R]P87-S=V]R9```3E4``$CGW
XMP(`@//___[1A`+(P+Q=A`"8^+P!!^A+"(@A![JA.(`AA`"644(\@+H`,L*ZQR
XM]&\H(#P```#_P*Z`#"\`("Z`#."`+P!!^A*:(@A![JA.(`AA`"5D4(]@+$'N:
XMJ$XB""`N@`SEB"!\__^RO-'.(#`(`&$`)51![JA.(@A!^A)P(`AA`"5$("Z`,
XM#$SM`0+_^$Y=3G5.50``2.?`@"`\____M&$`L9@@%["NL?1O+"`\````_\"7]
XM+P`@+P`$X(`O`$'Z$BXB"$'NIX0@"&$`).Y0CT'NIX0@"&`2("Z`#.6(('S_@
XM_[*\T<X@,`@`3.T!`O_X3EU.=0`P,#`Z,#`Q(&%B;W)T960@=VET:"!A;B!EQ
XM<G)O<@`P,#`Z,#`R(&ME>6)O87)D('%U:70`,#`P.C`P,R!K97EB;V%R9"!I,
XM;G1E<G)U<'0`,#`P.C`P-"``,#`P.C`P-2``,#`P.C`P-B``,#`P.C`P-R``"
XM,#`P.C`P."``,#`P.C`P.2``,#`P.C`Q,"``,#`P.C`Q,2``,#`P.C`Q,B``Y
XM,#`P.C`Q,R``,#`P.C`Q-"``,#`P.C`Q-2``,#`P.C`Q-B``,#`P.C`Q-R```
XM,#`P.C`Q."``,#`P.C`Q.2``,#`P.C`R,"``,#`P.C`R,2``,#`P.C`R,B``^
XM,#`P.C`R,R``,#`P.C`R-"``,#`P.C`R-2``,#`P.C`R-B``,#`P.C`R-R``%
XM,#`P.C`R."``,#`P.C`R.2``,#`P.C`S,"``,#`P.C`S,2``,#`P.C`S,B``#
XM,#`P.C`S,R``,#`P.C`S-"``,#`P.C`S-2``,#`P.C`S-B``,#`P.C`S-R``*
XM,#`P.C`S."``,#`P.C`S.2``,#`P.C`T,"``,#`P.C`T,2``,#`P.C`T,B``(
XM,#`P.C`T,R``,#`P.C`T-"``,#`P.C`T-2``,#`P.C`T-B``,#`P.C`T-R``/
XM,#`P.C`T."``,#`P.C`T.2``,#`P.C`U,"``,#`P.C`U,2``,#`P.C`U,B``-
XM,#`P.C`U,R``,#`P.C`U-"``,#`P.C`U-2``,#`P.C`U-B``,#`P.C`U-R``4
XM,#`P.C`U."``,#`P.C`U.2``,#`P.C`V,"``,#`P.C`V,2``,#`P.C`V,B``2
XM,#`P.C`V,R``,#`P.C`V-"!I;&QE9V%L(&9U;F-T:6]N(&-O9&4@*&UA=&@I]
XM`#`P,#HP-C4@87-C:6DM/FYU;65R:6,@9F]R;6%T(&-O;G9E<G-I;VX@97)RD
XM;W(@*&UA=&@I`#`P,#HP-C8@;F]T(&$@;G5M8F5R("AM871H*0`P,#`Z,#8W_
XM(&EL;&5G86P@87)G=6UE;G0@*'5S=6%L;'D@;6%T:"D`,#`P.C`V."``,#`P?
XM.C`V.2``,#`P.C`W,"``,#`P.C`W,2``,#`P.C`W,B``,#`P.C`W,R``,#`P3
XM.C`W-"``,#`P.C`W-2``,#`P.C`W-B``,#`P.C`W-R``,#`P.C`W."``,#`PC
XM.C`W.2``,#`P.C`X,"``,#`P.C`X,2``,#`P.C`X,B``,#`P.C`X,R``,#`P8
XM.C`X-"``,#`P.C`X-2``,#`P.C`X-B``,#`P.C`X-R``,#`P.C`X."``,#`PH
XM.C`X.2``,#`P.C`Y,"``,#`P.C`Y,2``,#`P.C`Y,B``,#`P.C`Y,R``,#`P=
XM.C`Y-"``,#`P.C`Y-2``,#`P.C`Y-B``,#`P.C`Y-R``,#`P.C`Y."``,#`PM
XM.C`Y.2``,#`P.C$P,"``,#`P.C$P,2``,#`P.C$P,B!B=7,@=')A<``P,#`Z;
XM,3`S(&%D9')E<W,@=')A<``P,#`Z,3`T(&EL;&5G86P@:6YS=')U8W1I;VX`L
XM,#`P.C$P-2!D:79I9&4@8GD@>F5R;P`P,#`Z,3`V(")C:&LB(&EN<W1R=6-TG
XM:6]N('1R87``,#`P.C$P-R`B=')A<'8B(&EN<W1R=6-T:6]N('1R87``,#`P9
XM.C$P."!P<FEV:6QE9V5D(&EN<W1R=6-T:6]N`#`P,#HQ,#D@=')A8V4@97ACS
XM97!T:6]N`#`P,#HQ,3`@:6QL96=A;"!I;G-T<G5C=&EO;B`H,3`Q,"D`,#`P*
XM.C$Q,2!I;&QE9V%L(&EN<W1R=6-T:6]N("@Q,3$Q*0`P,#`Z,3$R(&5X8V5PQ
XM=&EO;B`Q,@`P,#`Z,3$S(&-O<')O8V5S<V]R('!R;W1O8V]L('9I;VQA=&EO'
XM;@`P,#`Z,3$T('-Y<W1E;2!S=&%C:R!F<F%M92!F;W)M870@97)R;W(`,#`PW
XM.C$Q-2!U;FEN:71I86QI>F5D(&EN=&5R<G5P=``P,#`Z,3$V(&5X8V5P=&EO:
XM;B`Q-@`P,#`Z,3$W(&5X8V5P=&EO;B`Q-P`P,#`Z,3$X(&5X8V5P=&EO;B`QS
XM.``P,#`Z,3$Y(&5X8V5P=&EO;B`Q.0`P,#`Z,3(P(&5X8V5P=&EO;B`R,``P4
XM,#`Z,3(Q(&5X8V5P=&EO;B`R,0`P,#`Z,3(R(&5X8V5P=&EO;B`R,@`P,#`Z\
XM,3(S(&5X8V5P=&EO;B`R,P`P,#`Z,3(T('-P=7)I;W5S(&EN=&5R<G5P=``P2
XM,#`Z,3(U(``P,#`Z,3(V(``P,#`Z,3(W(``P,#`Z,3(X(``P,#`Z,3(Y(``P4
XM,#`Z,3,P(``P,#`Z,3,Q(``P,#`Z,3,R(``P,#`Z,3,S(&%N('5N:6YI=&EA>
XM;&EZ960@=7-E<B!44D%0("@Q+3$U*2!W87,@97AE8W5T960`,#`P.C$S-"``G
XM,#`P.C$S-2``,#`P.C$S-B``,#`P.C$S-R``,#`P.C$S."``,#`P.C$S.2``9
XM,#`P.C$T,"``,#`P.C$T,2``,#`P.C$T,B``,#`P.C$T,R``,#`P.C$T-"``%
XM,#`P.C$T-2``,#`P.C$T-B``,#`P.C$T-R``,#`P.C$T."!F<&-P('5N;W)D'
XM97)E9"!C;VYD:71I;VX`,#`P.C$T.2!F<&-P(&EN97AA8W0@<F5S=6QT`#`PC
XM,#HQ-3`@9G!C<"!D:79I9&4@8GD@>F5R;P`P,#`Z,34Q(&9P8W`@=6YD97)F'
XM;&]W`#`P,#HQ-3(@9G!C<"!O<&5R86YD(&5R<F]R`#`P,#HQ-3,@9G!C<"!O+
XM=F5R9FQO=P`P,#`Z,34T(&9P8W`@;F]T(&$@;G5M8F5R`#`P,#HQ-34@97AC2
XM97!T:6]N(#4U`#`P,#HQ-38@<&UM=2!C;VYF:6=U<F%T:6]N`#`P,#HQ-3<@]
XM<&UM=2!I;&QE9V%L(&]P97)A=&EO;@`P,#`Z,34X('!M;74@86-C97-S(&QET
XM=F5L('9I;VQA=&EO;@`P,#`Z,34Y(&5X8V5P=&EO;B`U.0`P,#`Z,38P(&5X`
XM8V5P=&EO;B`V,``P,#`Z,38Q(&5X8V5P=&EO;B`V,0`P,#`Z,38R(&5X8V5PH
XM=&EO;B`V,@`P,#`Z,38S(&5X8V5P=&EO;B`V,P`P,#`Z,38T(&YO('!E<FUI]
XM<W-I;VX`,#`P.C$V-2!A<F=U;65N=',@=&\@1B1#:&M.86T@9&ED;B=T(&UA/
XM=&-H`#`P,#HQ-C8@<WES=&5M('-T86-K(&]V97)F;&]W`#`P,#HQ-C<@:6YV*
XM86QI9"!E=F5N="!)1"!N=6UB97(`,#`P.C$V."!E=F5N="!N;W0@9F]U;F0`*
XM,#`P.C$V.2!T:&4@979E;G0@:7,@8G5S>0`P,#`Z,3<P(&EM<&]S<VEB;&4@%
XM979E;G0@<&%R86UE=&5R<P`P,#`Z,3<Q('-Y<W1E;2!D871A('-T<G5C='5R$
XM97,@:&%V92!B965N(&1A;6%G960`,#`P.C$W,B!M;V1U;&4@<F5V:7-I;VX@R
XM:7,@:6YC;VUP871A8FQE('=I=&@@;W!E<F%T:6YG('-Y<W1E;0`P,#`Z,3<S:
XM('!A=&@@8F5C86UE(&QO<W0@8F5C875S92!N971W;W)K(&YO9&4@=V%S(&1OR
XM=VX`,#`P.C$W-"!B860@9&ES:R!P87)T:71I;VXL(&]R(&YO(&%C=&EV92!PM
XM87)T:71I;VX`,#`P.C$W-2``,#`P.C$W-B``,#`P.C$W-R``,#`P.C$W."``,
XM,#`P.C$W.2``,#`P.C$X,"``,#`P.C$X,2``,#`P.C$X,B``,#`P.C$X,R``=
XM,#`P.C$X-"``,#`P.C$X-2``,#`P.C$X-B``,#`P.C$X-R``,#`P.C$X."``M
XM,#`P.C$X.2``,#`P.C$Y,"``,#`P.C$Y,2``,#`P.C$Y,B``,#`P.C$Y,R``B
XM,#`P.C$Y-"``,#`P.C$Y-2``,#`P.C$Y-B``,#`P.C$Y-R``,#`P.C$Y."``R
XM,#`P.C$X.2``,#`P.C(P,"!T:&4@<&%T:"!T86)L92!I<R!F=6QL`#`P,#HR)
XM,#$@8F%D('!A=&@@;G5M8F5R`#`P,#HR,#(@<WES=&5M($E242!T86)L92!I^
XM<R!F=6QL`#`P,#HR,#,@8F%D($DO3R!M;V1E`#`P,#HR,#0@<WES=&5M(&1EF
XM=FEC92!T86)L92!I<R!F=6QL`#`P,#HR,#4@8F%D(&UO9'5L92!H96%D97(`U
XM,#`P.C(P-B!S>7-T96T@;6]D=6QE(&1I<F5C=&]R>2!I<R!F=6QL`#`P,#HR-
XM,#<@;65M;W)Y(&9U;&P`,#`P.C(P."!U;FMN;W=N('-E<G9I8V4@8V]D92``S
XM,#`P.C(P.2!N;VXM<VAA<F%B;&4@;6]D=6QE(&ES(&)U<WD`,#`P.C(Q,"!BC
XM860@<&%G92!A9&1R97-S`#`P,#HR,3$@96YD(&]F(&9I;&4`,#`P.C(Q,B!)Z
XM4E$@=F5C=&]R(&ES(&)U<WD`,#`P.C(Q,R!N;VXM97AI<W1I;F<@<V5G;65NW
XM=``P,#`Z,C$T(&9I;&4@;F]T(&%C8V5S<VEB;&4`,#`P.C(Q-2!B860@<&%T"
XM:&QI<W0`,#`P.C(Q-B!F:6QE(&YO="!F;W5N9``P,#`Z,C$W(&9I;&4@<V5GW
XM;65N="!L:7-T(&ES(&9U;&P`,#`P.C(Q."!C<F5A=&EN9R!A;B!E>&ES=&EN$
XM9R!F:6QE`#`P,#HR,3D@:6QL96=A;"!M96UO<GD@8FQO8VL@861D<F5S<P`PA
XM,#`Z,C(P(&UO9&5M(&1A=&$@8V%R<FEE<B!L;W-T`#`P,#HR,C$@;6]D=6QE)
XM(&YO="!F;W5N9``P,#`Z,C(R('-Y<W1E;2!C;&]C:R!N;W0@<G5N;FEN9P`P`
XM,#`Z,C(S(&1E;&5T:6YG('-T86-K(&UE;6]R>0`P,#`Z,C(T(&EL;&5G86P@(
XM<')O8V5S<R!)1``P,#`Z,C(U(&)A9"!)4E$@<&%R86UE=&5R`#`P,#HR,C8@'
XM;F\@8VAI;&1R96X`,#`P.C(R-R!I;G9A;&ED('1R87`@;G5M8F5R`#`P,#HRN
XM,C@@<')O8V5S<R!H87,@86)O<G1E9``P,#`Z,C(Y('-Y<W1E;2!P<F]C97-SQ
XM('1A8FQE(&ES(&9U;&P`,#`P.C(S,"!I;&QE9V%L(&9O<FL@<&%R86UE=&5R#
XM`#`P,#HR,S$@:VYO=VX@;6]D=6QE`#`P,#HR,S(@8F%D(&UO9'5L92!#4D,`9
XM,#`P.C(S,R!U;G!R;V-E<W-E9"!S:6=N86P@<&5N9&EN9P`P,#`Z,C,T(&YOP
XM;B!E>&5C=71A8FQE(&UO9'5L90`P,#`Z,C,U(&)A9"!N86UE`#`P,#HR,S8@'
XM8F%D(&UO9'5L92!H96%D97(@<&%R:71Y`#`P,#HR,S<@;F\@4D%-(&%V86EL?
XM86)L90`P,#`Z,C,X(&1I<F5C=&]R>2!I<R!N;W0@96UP='D`,#`P.C(S.2!NB
XM;R!A=F%I;&%B;&4@=&%S:R!N=6UB97(`,#`P.C(T,"!I;&QE9V%L('5N:70@&
XM*&1R:79E*2!N=6UB97(`,#`P.C(T,2!B860@<V5C=&]R(&YU;6)E<@`P,#`Z?
XM,C0R(&UE9&EA(&ES('=R:71E('!R;W1E8W1E9``P,#`Z,C0S($DO3R!E<G)O+
XM<B`M(&)A9"!C:&5C:R!S=6T`,#`P.C(T-"!R96%D(&5R<F]R`#`P,#HR-#4@(
XM=W)I=&4@97)R;W(`,#`P.C(T-B!D979I8V4@;F]T(')E861Y`#`P,#HR-#<@8
XM<V5E:R!E<G)O<@`P,#`Z,C0X(&UE9&EA(&9U;&P`,#`P.C(T.2!I;F-O;7!A]
XM=&%B;&4@;65D:6$`,#`P.C(U,"!D979I8V4@8G5S>0`P,#`Z,C4Q(&1I<VL@)
XM;65D:6$@:&%S(&-H86YG960`,#`P.C(U,B!R96-O<F0@:7,@8G5S>0`P,#`ZQ
XM,C4S(&YO;BUS:&%R86)L92!F:6QE+V1E=FEC92!I<R!B=7-Y`#`P,#HR-30@W
XM22]/(&1E861L;V-K(&5R<F]R`#`P,#HR-34@9&5V:6-E(&ES(&9O<FUA="!P3
XM<F]T96-T960`)7,Z("5S#0`E,#-D+B4P,V0@#0`-`"4P,V0N)3`S9"`-`$Y5'
XM``!(Y\"@(#S___^\80"?,"(\```$`$'Z!O0@"&$`'M`D0'+_LH!F!'``8`8@)
XM*@`PT(I,[04"__1.74YU3E4``$CGP(`@//___[QA`)[R(CP```0`0?H&OB`(V
XM80`>WDSM`0+_^$Y=3G5.50``2.?,,"1`*`$@//___[QA`)["80#_?B9`2H!GD
XM2G`!L*L`"&<$8:I@/GH`8"HB"B`%ZX@@,PA880`4$DJ`9A8@!>N(N+,(8&8,7
XM<%C0BR(%ZXG0@6`44H6ZDVW280#_="U\````V(`,<`!,[0PP__!.74YU3E4`L
XM`$CGS"`@//___[QA`)Y080#_#"1`2H!F!'``8#IX`&`D(A<@!.N((#((6&$`L
XM$ZA*@&80(`3KB"HR"&!A`/\>(`5@%%*$N))MV&$`_Q`M?````-B`#'#_3.T$[
XM,O_P3EU.=4Y5``!(Y\@X)$`F02@O`"`@//___[AA`)WD<@$@"F$`_P8H0$J`+
XM9@1P`&`@(`13@"\`(BP`!"`+80`3FEB/(`13@$(S"`!A`/ZR(`M,[1P0__!.$
XM74YU3E4``$CGP+`D0"`\____O&$`G91R`B`*80#^MB9`2H!F!'#_8`IA`/Y\N
XM(&L`!"`03.T-`O_P3EU.=4Y5``!(Y\"X)$`@//__][!A`)U:3^_W^`P2`"]F+
XM`E**<@0@"F$`_G`H0$J`9P``ED'Z!1@@"&$`'`HO0`@$<O^R@&8(80#^)&``R
XM`'I"IW(`("\("&$`'))8CTJ`9NXF;``$+U,(`'`!L*\(`&8V2JL`#&<L2%<BQ
XM/```"``@*P`,80`;$%B/<O^R@&<4("\"P+"K`!AF"B`O`KRPJP`49P1"KP@``
XM<@`@+P@$80`;S"`O"`1A`!N<80#]LDJO"`!F!'``8`)P_T_O"`A,[1T"_^Q.C
XM74YU3E4``$CGR+@D0"`\___WM&$`G(9/[_?\#!(`+V8"4HIR!"`*80#]G"A`B
XM2H!G7D'Z!$X@"&$`&S@O0`@`<O^R@&=&0J=R`"`O"`1A`!O(6(]*@&;N)FP`0
XM!'`!L)-F``">2JL`#&<``)9X`&!<(`12A'(4LH!L''(`("\(`&$`&R8@+P@`J
XM80`:]F$`_0QP_V```-!P_["K`!!G#"(K`!`@*P`,80`<)G(`("\(`&$`&O9P(
XM!6$`&2Y"IW(`("\(!&$`&U18CTJ`9NYP`;"39BY(5R(\```(`"`K``QA`!GBX
XM6(]R_[*`9Q8@+P+`L*L`&&8,("\"O+"K`!1G`/]R)KP````!<`!A``_")T``]
XM"&$`''HG0``,)V\("``02%<B/```"``@*P`,80`9EEB/<O^R@&<.)V\"P``8#
XM)V\"O``48`A"JP`80JL`%'(`("\(`&$`&E0@+P@`80`:)&$`_#IP`$_O"`1,!
XM[1T0_^Q.74YU3E4``$CGP+@D0"`\___WM&$`FQA/[_?\#!(`+V8"4HIR!"`*<
XM80#\+BA`2H!G&$'Z`N@@"&$`&<HO0`@`<O^R@&8(80#[Y'#_8&Q"IW(`("\("
XM!&$`&E)8CTJ`9NXF;``$<`&PDV8X80`;LK"K``QF+DA7(CP```@`("L`#&$`D
XM&-)8CW+_LH!G%B`O`L"PJP`89@P@+P*\L*L`%&8"0I-R`"`O"`!A`!F0("\(*
XM`&$`&6!A`/MV<`!/[P@$3.T=`O_L3EU.=4Y5``!(Y\"X)$`@//__][!A`)I45
XM3^_W^`P2`"]F`E**<@0@"F$`^VHH0$J`9QA!^@(L(`AA`!D&+T`(`'+_LH!FF
XM"F$`^R!P_V```'Y"IW(`("\(!&$`&8Q8CTJ`9NXF;``$</\O0`@$<`&PDV9`N
XM80`:YK"K``QF-DA7(CP```@`("L`#&$`&`98CW+_LH!G'B`O`L"PJP`89A0@L
XM+P*\L*L`%&8*0J\(!"=O"`P`$'(`("\(`&$`&+P@+P@`80`8C&$`^J(@+P@$U
XM3^\("$SM'0#_\$Y=3G5.50``2.?(N"1`*`$@//__][!A`)E\3^_W^`P2`"]FW
XM`E**<@0@"F$`^I(H0$J`9QA!^@%<(`AA`!@N+T`(`'+_LH!F"F$`^DAP_V``_
XM`(9"IW(`("\(!&$`&+18CTJ`9NXF;``$</\O0`@$<`&PDV9(2%<B/```"``@U
XM*P`,80`7.%B/<O^R@&<P("\"P+"K`!AF)B`O`KRPJP`49AQP_["K`!!G%$*O<
XM"`0@*P`0T(0B`"`K``QA`!D,<@`@+P@`80`7W"`O"`!A`!>L80#YPB`O"`1/8
XM[P@(3.T=$/_L3EU.=4Y5``!(Y\`@)$`@//___[QA`)B><@`@"F$`_P9,[00"!
XM__A.74YU3E4``$CGP"`D0"`\____O&$`F'AR`2`*80#^X$SM!`+_^$Y=3G5#$
XM;W!Y<FEG:'1S("AC*2`Q.3@X(&)Y(')E8V-O=V%R92!S>7-T96US('!U8VAH]
XM96EM`%-Y<TEN9F\`4WES26YF;P!3>7-);F9O`%-Y<TEN9F\`4WES26YF;P!3%
XM>7-);F9O`%-Y<TEN9F\`3E4``$CGS+`D0"`\____N&$`E^A9CW@`<"@N@"`7#
XMY8AA``P,(&\`"""`9R0@%U.`L(1N)'`HT9<@%^6((@`@;P`((!!A``OP(&\`P
XM"""`9@AP_V```)12B@P2`"!G^`P2``EG\@P2``UG``!N2A)G``!H(`12A.6($
XM(&\`""!0)DHAB@@`>@!@0$H%9BH,$@`@9P8,$@`)9AY2BF`VNA)F!GH`4HI@9
XM(DH%9P06VF`:&AI@%A;:8!(0$DB`#$``(F?<#$``)V?68.I*$F<&#!(`#6:VW
XM0AM@`/]6(`3EB"!O``@@4$*P"``@!%B/3.T-,/_L3EU.=4Y5``!(Y\"P(#S_;
XM__^\80"6]B(\```,`$'Z`,H@"&$`%I8D0'+_LH!G(C`J`$!(P-"*)D!*@&<.\
XM(@M![J>L(`AA``OV8`H@"F$`%J)P`&`,(`IA`!:80>ZGK"`(3.T-`O_P3EU.5
XM=4Y5``!(Y\RX)$`F02AO`"@@//___[QA`):(2J\`+&8D0?H`82(((`MA``NH=
XM(@H@"V$`"\`B#"`+80`)KB@`9P0@!&`P80#_5"H`9R8B!2`+80`+@$'Z`#(BS
XM""`+80`+E"(*(`MA``N,(@P@"V$`"7I@`G``3.T=,/_H3EU.=6EN:70`+V1D7
XM+P`O`$Y5``!(Y\B`(#S___^\80"6!G(!0?H%$"`(80`)NC@`;A!R`4'Z!1`@R
XM"&$`":HX`&\$,`1@#'(!0?H%#"`(80`)EDSM`1+_]$Y=3G5.50``2.?.L"`\G
XM___[N&$`E;I/[_P`2FZGSF8``'PM;P0`I])!^@3D(`AA``FZ)$!*@&=(2A)G2
XM1'`OL!)G,D'Z!-(@"&$`":`F0$J`9PXB"R`O!`1A``KL2H!F#B(*("\$`&$`?
XM"IA@``&`80#_2&`(<@$@"F$`"10]0*?.2FZGSF8(80#_,#U`I\Y*;J?.;`@P.
XM+J?.8```^D*G<@`P;J?.(`AA``D*6(]P`#P`,$`J""1O!``P!DC`L(5F'DAX*
XM!`!![P`$(@@P;J?.(`AA``C06(\J`&\``19\`#`&4D9(P$'7$#`(`!@`<@VRH
XM`&82M>\$`&,R<%RP*O__9BI3BF"T("\$``:````$`+7`911(>`!00?H$`R((A
XM<`)A``B.6(]@!!3$8(Y"$B(O!`0@+P0`80``VDJ`9P#_>$INI]!F``"H)&\$Q
XM`$H29P9P.K`:9O9*$F<``(IP=+`:9NIP8[`:9N1P/;`:9MXF2E*+2A-G!G`Z'
XML!-F]$(34FZGT"(*0=<@"&$`_GQ*@&8*<``]0*?02,!@:E-NI]!'UTH39P9PP
XM.K`;9O8@"I"O!``B`"`+80`)+-*`#($```0#;11(>`!00?H#;B((<`)A``?@X
XM6(]@+"(+5XH@"F$`"21@`/]J,&ZGSB`(80`'U'`!8!)*;J?09@HP;J?.(`AA7
XM``?`<`!/[P0`3.T-</_H3EU.=4Y5``!(Y\"X)$$@//___\!A`).L(%=P([`0V
XM9T8F5V`X*$I*$V<$MPQG^%.+2B1F%G!\L!-G"G`ZL!-G!$H39@9P`6`@4HM*_
XM$V<,<#JP$V<&<'RP$V;N4HM*$V<&<#JP$V:^<`!,[1T`__!.74YU3E4``$CG0
XM@#`D0"`\____P&$`DSXF;J?22A-G!G`ZL!MF]DH39R80&[`29NQ*$V?H$!NPW
XM*@`!9N!*$V<&<#JP$V8$<`%@"'!`L!-FS'``3.T,`/_X3EU.=4Y5``!(Y\RPX
XM)$`@//___\!A`)+F(&\`!"908```UG@;8```SG@*8```R'@-8```PG@)8```(
XMO'@(8```MG@,8```L'`PL$1N``"H<#>P1&T``*!P,)A`>@+G3!`:2(!(P`2`=
XM````,(A`4T5*16<``()P,+`2;@``>G`WL!)LVF```'`0&DB`.``,0`!F9ZYBD
XM)`P``%YG6F(2#```7&=28J(,``!%9P#_>&"8#```8F<`_X9@C@Q``')G`/]PK
XM8@P,``!N9P#_8&``_WH,0`!T9P#_8&``_VX0&DB`2,!R'\"!.`!@#`Q$`%QG=
XMF`Q$`%YGYA;$$!I(@#@`2D!G!G`ZL$1FXD(;(&\`!"10(&\`!""+(`I,[0TPV
XM_^Q.74YU3E4``$CGP#`D0"`\____O&$`D<HF;J?22A-G!G`ZL!MF]DH39Q@0D
XM&[`29NQ*$V?H$!NP*@`!9N!P0+`39@1P`&`2<#VP$V;0(B\`!%*+(`MA`/Z2:
XM3.T,`/_X3EU.=4Y5``!(Y\PP)$`@//___\!A`)%L)FZGTDH39P9P.K`;9O9*%
XM$V<8$!NP$F;L2A-GZ!`;L"H``6;@<$"P$V8$</]@0G`CL!-FT'H*4HMP,+`3'
XM9@)Z"'@`8!PP!4C`,@1(P6$`"Q@X`!`;2(!(P`2`````,-A`<#"P$VX&<#FP-
XM$VS8,`1(P$SM##+_[$Y=3G4O9&0O<WES+W1E<FUC87``+V@P+W-Y<R]T97)M_
XM8V%P`"]D,"]S>7,O=&5R;6-A<`!415)-0T%0`%1%4DT`5&5R;6-A<"!E;G1R)
XM>2!T;V\@;&]N9R$-`%1E<FUC87`@96YT<GD@=&]O(&QO;F<A#0``3E4``$CG)
XM[[`@//___[QA`)!P1^ZGUBHO`#!\`'X`(!<D0$J`9@`!>$'Z`>!@``'0<"6P@
XM1&8``69@``#T<`JPA6XP<&2PA6X8(`5R9&$`"F9R,("!%L!R9"`%80`*@BH`8
XM3^W_V"`%<@IA``I*<C"`@1;`3^W_V"`%<@IA``IB<C"`@1;`3^W_V$J&9@1P9
XM`6`"<``L`$J&9P8@+P`$8`0@+P`P*@!@``#X$!I(@$C`VH!*A6<&<`VPA68(D
XM4H4@!E*`CH`6Q6"^$!I(@$C`NH!O#!`:2(!(P-J`8```Q%**8```OE*O``12.
XMKP`P4H5@``"P%H1@``"J(`5R"F$`";CIB"0`(`5R"F$`"=;4@"H"8```CB`%V
XM<A!A``G&XX@B!9*`*@%@``!Z0?H`YV```-(0&DB`.``,0``^9XQB,`P``"YG)
XM`/]N8A(,```K9P#_7&+6#```)6>:8,X,```S9P#^ZF+$#$``,F<`_OA@N@Q`G
XM`&1G`/[*8A(,``!$9Y9BJ`P``$)G`/]R8)X,0`!R9P#^]F*4#```:6<`_TI@6
XMBA;$$!I(@#@`9@#^BDJ'9TP@!P@```!G%"(ND"P@"V$``_8@+I`L80`#SM?`.
XM(`<(```!9RA*KI`P9QX@;I`P2A!G%B(ND#`@"V$``\P@+I`P80`#I-?`8`06S
XM_``(0A-![J?6(`A,[0WT_^!.74YU3T]04P!/3U!3`$Y5``!(Y^ZP)$`H`29O(
XM`"P@//___[QA`(Y4>@`@"F<``.AP,+`2;BYP.;`2;2AZ`#`%2,!R"F$`"#`23
XM&DB!2,'0@02`````,#H`<#"P$FX&<#FP$FS:<`HR!4C!80`("CH`<"ZP$F8<[
XM4HIP,+`2;A1P.;`2;0X0&DB`2,`$@````##:0'`JL!)F&C`$2,`R!4C!80`'N
XMU#H`4HI@"!`:2(!(P$Z32A)F]$I%9UQ*;I`T;59P$;!ND#1M3C`ND#1(P..(G
XM0>ZQ_#`P"`!(P&P"4H#B@-I`,"Z0-$C`XXA![K'\,#`(`$C`,@5(P20`(`$B0
XM`F$`!ZX\`&`,$"Z0*DB`2,!.DU-&2D9N\$SM#73_Y$Y=3G5.50``2.>`.'``U
XM*$`F0"1`<`UR`$'Z`&1'[H`,=@@F@R8NJZ8D+JNB*&ZR'DY``"%E/DJ39QA!!
XM^@!&<F1P`DY``(Q!^@`V<MT`/``!8"(]?`!!J")";J@D/7P``J@^/7P``:A`D
XM/7P``JA:/7P``JA<3.T<`/_T3EU.=6-I;P`J*BHJ(&-I;R!T<F%P:&%N9&QES
XM<B!M:7-M871C:"`J*BHJ#0!.30``3DT``4Y-``).30`#3DT`!$Y-``5.30`&/
XM3DT`!TY-``A.30`)3DT`"DY-``M.30`,3DT`#4Y-``Y.30`/3DT`$$Y-`!%.[
XM30`23DT`$TY-`!1.30`53DT`%DY-`!=.30`83DT`&4Y-`!I.30`;3DT`'$Y-S
XM`!U.30`>3DT`'TY-`"!.30`A3DT`(DY-`"-.30`D3DT`)4Y-`"9.30`G3DT`?
XM*$Y-`"E.30`J3DT`*TY-`"Q.30`M3DT`+DY-`"].30`P3DT`,4Y-`#).30`S+
XM3DT`-$Y-`#5.30`V3DT`-TY-`#A.30`Y3DT`.DY-`#M.30`\3DT`/4Y-`#Y.J
XM30`_3E4``$CGP(!/[__H0?H`5"Z(+V\`&``$0J\`"$*G0J="IR\NJZ9(;P`0K
XM(B\`%$'Z#"P@"&$`_Y)/[P`4+T``%$'O``P@"&$`"[*PKP`49O`@+P`,3^\`K
XM&$SM`0+_^$Y=3G5S:&5L;`!.50``2.>`@"`70>ZR(Q`P"`!(@$C`"````F<*Q
XM(!<"@````-]@`B`73.T!`/_\3EU.=4Y5``!(YX"`(!=![K(C$#`(`$B`2,`(!
XM```!9P@@%PC```5@`B`73.T!`/_\3EU.=4Y5``!(YX`P)$`F2DH;9OP@"Y"*2
XM4X!,[0P`__A.74YU3E4``$CGP#@D0"9!*$H0&QC`9OH@"DSM'`#_]$Y=3G5.5
XM50``2.?`."1`)D$H2DH<9OQ3C!`;&,!F^B`*3.T<`/_T3EU.=4Y5``!(Y\`PE
XM)$`F06`*2AMF!'``8!A2BA`2L!-G\!`32(!(P!(22(%(P9*`(`%,[0P`__A.J
XM74YU3E4``$CGP#@D0"9!*$H0&QC`;OIP?\$L__]"%"`*3.T<`/_T3EU.=4Y5%
XM``!(Y\@X)$`F02@O`"`H2B`$4X1*@&\,$!L8P$H`9O!@`D(<(`13A$J`;O8@/
XM"DSM'!#_\$Y=3G5.50``2.?(,"1`)D$H+P`<8`9*&V<44HH@!%.$2H!O!A`22
XML!-G[$J$;`1P`&`0$!-(@$C`$A)(@4C!DH`@`4SM#!#_]$Y=3G5.50``2.?(@
XM."1`)D$H+P`@*$I*'&;\4XP@!%.$2H!O"!`;&,!*`&;P2H1L`D(4(`I,[1P03
XM__!.74YU3E4``$CGR"`D0"@!N!)F!"`*8`9*&F;T<`!,[000__A.74YU3E4`K
XM`$CGR#`D0"@!E\NX$F8")DI*&F;V(`M,[0P0__1.74YU3E4``$CGSJ`D0'H`W
XM$!H<`'(@L@!G]G`)L`9G\'`ML`9F!'`!8`)P`"@`<"VP!F<@<"NP!F8<8!@@:
XM!7(*80`"XA(&2(%(P="!!(`````P*@`<&A`&2(!(P$'NLB,0,`@`2(!(P`@`?
XM``-FSDJ$9P8@!42`8`(@!4SM!7+_Z$Y=3G5.50``2.?`,"1`)F\`'"UO`!BK=
XMEBU+JYH@+P`$4X`B+JN680`"?-"*(@`@"F$*3.T,`/_X3EU.=4Y5``!(Y^"X.
XM)$`F05&/8```O"A*+TL`!"`NJY;CB"(+DHHD`"`!(@)A``)V(BZKEF$``C;0V
XMBBZ`8`8@+JN6V<`B%R`,(&ZKFDZ02H!M[&`(("ZKEI&O``0B+P`$(!<@;JN:9
XM3I!*@&WHN>\`!&(PN>\`!&0<(B\`!"`,86*YUV8&+J\`!&`*(!>PKP`$9@(NB
XMC"`NJY;9P"`NJY:1KP`$N>\`!&.<(`N0C"(O``22BK"!;`XB"R`,80#_2"9OK
XM``1@#"(O``0@"F$`_S@D3+7+90#_0E"/3.T=!/_L3EU.=4Y5``!(Y\PP)$`F'
XM02@NJY9@!AH2%-,6Q2`$4X1*@&;R3.T,,/_P3EU.=4Y5``!(Y^#@($`D020M#
XM``AG`F$*3.T'!__H8```VDJ"9TJQRF)(9T0P"@@```!G!!#:4X(P"`@```!FC
XM).**9`9A!!#:3G7BBF0&,-I@`B#:4<K__%)"4X)D]'0`3G40VE'*__Q20E."_
XM9/1T`$YUU<+1PC`*"````&<$$2)3@C`("````&8DXHID!F$$$2).=>**9`8QP
XM(F`"(2)1RO_\4D)3@F3T=`!.=1$B4<K__%)"4X)D]'0`3G5.50``2.?(,"1`$
XM)D$H+P`<8!P0$K`39Q(0$TB`2,`2$DB!2,&2@"`!8`Y2BE*+(`13A$J`8MQPJ
XM`$SM#!#_]$Y=3G5.50``2.?.("1`*`$J+P`@<``0!"P`8`(4QB`%4X5*@&+V'
XM3.T$</_P3EU.=4Y5``!(Y\X@)$`H`2HO`"!P`!`$+`!@#G``$!*PAF8$(`I@J
XM#%**(`53A4J`8NIP`$SM!'#_\$Y=3G5(YS@`)``F`$A#*`%(1,#!PL/$Q,;$^
XM2$#007@`UX300M>$2$!"04A!0D)(0M*"TH-*@$S?`!Q.=2\"=`!*@&H$1(!T-
XM`TJ!:@9$@0H"``%A(N(*9`)$@.(*9`)$@20?2H!.=6'4P4%*@$YU80;!04J`'
XM3G5(YS@`)`%F!H'\``!@;E.!9VHH`2(`M(%E#&<$<`!@7'`!DH)@5B8":_;&]
XMA&82XHIV_^**5<O__$2#YJC"A&`\<`!V_^.":@:T@6(*8`RT@53+__)G!%*#G
XMXHI$@V`$XX#BBI*"91!2@%'+__1@#N.`XHK2@F7P4<O_]M*"3-\`'$J`3G4J9
XM7U.%96(0&&?X#```#6=8#```(&?L#```"6?F#```+&?@4H(,```B9S`,```G)
XM9RI(:/__4X5E,!`89\8,```-9Q(,```@9PP,```)9P8,```L9N!"*/__8*A(J
XM4%.%90@2&+`!9O9@["!/2%<O`E."9Q#E@B`P*``AD"@`(,!1@F+R3M5.50``H
XM2.=@@"!!,CP``$Y``(U@``7&3E4``$CG8(`R/``!3D``C64`!;0@`6``!:Q.^
XM50``2.=@@#(\``9.0`"-9``%H@Q!`--F``62<`%@``6*3E4``$CG8(`@03(\\
XM``\D+0`(8*A.50``2.=@@"!!,CP`#F"83E4``$CG8(`R/``"3D``C64`!50@2
XM`F``!4Q.50``2.=@@#(\``5@Y$Y5``!(YV"`($$R/```3D``CF``!2A.50``I
XM2.=@@#(\``-@ZDY5``!(YV"`)`$R/``"8-I.50``2.=@@"!!,CP`#V#*3E4`H
XM`$CG8(`D`3(\`!!@NDY5``!(YV"`)`$R/``18*I.50``2.=@@"0!,CP`&F":%
XM3E4``$CG8(`R/``;8/!.50``2.=@@$CG&$`D`7($3.T#&``(3D``CDS?`AA@\
XM``2:3E4``$CG8(`D`3(\`!Q@ODY5``!(YV"`,CP`)&"P3E4``$CG8(`R/``EV
XM8*).50``2.=@@#0!,CP`)F"23E4``$CG8(`T`3(\`"=@@DY5``!(YV"`<`!.]
XM0``*8``$/$Y5``!(YV"`(&T`""(0($`@%TY``!=E``0D(&T`"""!8``$(DY5+
XM``!(YV"`3D``#V``!`CAB`C``!].50``2.=@@$Y```I@``/R3E4``$CG`,`@Y
XM02)`(BT`"$Y``!%E%'``8$I.50``2.?`P"!`3D``$&0V+4&`#&`L3E4``$CGN
XMP,`B0"!)#!@`+F?Z#"@`+___9_)3B$Y``!!E"DH`9PH,```O9]YP_V`$(`F0G
XMETSM`P+_]$Y=3G5.50``2.=@@$CG`&`D+0`,($`@`2(M``A.0``E90(@"DS?;
XM!@!@``-<3E4``$CG8(`@0$Y``!IE``-,(`%@``-$3E4``$CG8(`@0$Y``!]E?
XM``,T(`%@``,L3E4``$CG8(`@;0`(3D``&&```QA.50``2.=@@"!`3D``)F``U
XM`P9.50``2.=@@`C!`!]@#$Y5``!(YV"`)"T`"$Y``"=E``+F(`)@``+>3E4`A
XM`$CG8(!.0``+8``"SDY5``!.0`!23EU.=4Y5``!(YV"`+PD@;0`((FT`#$Y`Q
XM`!LB7V```J9.50``2.<P@"0!)B\`%"!O`!AR`DY``%-D!BU!@`QP_TSM`0S_(
XM]$Y=3G5.50``2.<P@"!`<@!@W$Y5``!(YS"`<@%@T$Y5``!(YS"`($!R`V#"0
XM3E4``$CG,(`@07('8+1.50``@GP`"$Y``%-D!BU!@`QR_R`!3EU.=4Y5```OP
XM`7(&3D``4V0&+4&`#'+_(`$B+?_\3EU.=4Y5```O`G0)8!).50``+P)T"F`(%
XM3E4``"\"=`O#0H)O``Y.0`!39`8M08`,<O\@`20M__Q.74YU3E4``$CG,`!T>
XM!,-")B\`$$Y``%-D!BU!@`QR_R`!3.T`#/_X3EU.=4Y5``!(YS``=`5@UDY5#
XM``!(YV"`($`P`4CG`&!.0```90(@"DS?!@!@``&"3E4``$CG8(`@0#`!2.<`4
XM8$Y```%@WDY5``!(YV"`+PHD0$Y```(D7V```59.50``2.=@@"!`,`%.0``=T
XM8``!0DY5``!(YV"`<@,@0,%!3D``AF```39.50``2.=@@'($8.A.50``2.=@Y
XM@$Y```A@``$03E4``$CG8(`@0'``3D``!&4``/XD"&<``/9"6#"!8```[DY5#
XM``!(YV"`3D``#6```-Y.50``2.=@@$CG'$!Z`V`N3E4``$CG8(!(YQQ`>@%@(
XM'DY5``!(YV"`2.<<0'H"8`Y.50``2.=@@$CG'$!Z`"!`)`$B;0`(,"T`$DA`/
XM,"T`#B(M`!1V`P@%``%G!"8M`!PH+0`8"`4``&8&3D```V`$3D``!4S?`CA@B
XM``!B3E4``$CG8(!.0``,8```4DY5``!(YV"`3D``#&4``$0@`6```#Q.50``U
XM2.=@@"(`3D``'&```"I.50``2.=@@$'Z`!(M0*N>9@(@0$Y```E@```.(`$@H
XM;JN>3I!.0``>9`PM08`,</]@!&7V<`!,[0$&__1.74YU3E4``"(`80``'F$`/
XM\H!@"$Y5``!*_"(`3D``!MZMWJT`/``!3G5.=0``*Z(```L:```H%@```B!"F
XM<F]W<V4@=&AR;W5G:"!A(&1I<F5C=&]R>2P@=W)I='1E;B!B>2!0971E<B!D_
XM82!3:6QV80U!9&%P=&5D(&9O<B!/4RTY('5S:6YG(%1/4"=S(&]S.6QI8@U34
XM>6YT87@Z(&)R;W=S92!;/&1I<CY=#49U;F-T:6]N.B!S:&]W(&%N(&QS+6QI/
XM:V4@9&ER96-T;W)Y(&QI<W1I;F<@=VAI8V@@8V%N(&)E("=E9&ET960G+"!I=
XM+F4N#2`@("`@("`@("!F:6QE<R!M87D@8F4@=&%G9V5D(&%N9"!I;G-P96-TD
XM960L(&1U;7!E9"P@97AE8W5T960L(&1E;&5T960L#2`@("`@("`@("!R96YAY
XM;65D+"!C;W!I960L(&5D:71E9"!E=&,N#4]P=&EO;G,Z#2`@("`@;F]N90T`8
XM````'@```````````````#L.```8-@```#8``#L/```[$@``.RT`````````J
XM`0``/"D``#PM```\,0``/#4``#PY```\/0``/$$``#Q%```\20``/$T``#Q1T
XM```\50``````````````````````````````````````````````````````1
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````"X`````````````````````````````````````````````````````N
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM````````````````````````````+V@P+W-Y<R]B<F]W<V4N;6%C<F]S````)
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````0```&CP!]`%U
XM-0.-`N<"F@%-`*8`4P`W`#(`*@`<`!0`#@`*``4``@```````0$!`0$!`0$!\
XM$1$!$1$!`0$!`0$!`0$!`0$!`0$!`0$P("`@("`@("`@("`@("`@2$A(2$A(7
XM2$A(2"`@("`@("!"0D)"0D("`@("`@("`@("`@("`@("`@("`B`@("`@($1$\
XM1$1$1`0$!`0$!`0$!`0$!`0$!`0$!`0$("`@(`$`3OD``(+23OD``(+<3OD`H
XM`(*\3OD```````!0#@``4`\``%`M``!00P``4%X``%!G``!0<```4'D``%""2
XM``!0BP``4)0``%"=``!0I@``4*\``%"X``!0P0``4,H``%#3``!0W```4.4`8
XM`%#N``!0]P``40```%$)``!1$@``41L``%$D``!1+0``438``%$_``!12```B
XM45$``%%:``!18P``46P``%%U``!1?@``48<``%&0``!1F0``4:(``%&K``!1V
XMM```4;T``%'&``!1SP``4=@``%'A``!1Z@``4?,``%'\``!2!0``4@X``%(7`
XM``!2(```4BD``%(R``!2.P``4D0``%)-``!25@``4E\``%)H``!2<0``4GH`5
XM`%*?``!2U0``4O$``%,9``!3(@``4RL``%,T``!3/0``4T8``%-/``!36```W
XM4V$``%-J``!3<P``4WP``%.%``!3C@``4Y<``%.@``!3J0``4[(``%.[``!3^
XMQ```4\T``%/6``!3WP``4^@``%/Q``!3^@``5`,``%0,``!4%0``5!X``%0G8
XM``!4,```5#D``%1"``!42P``5%P``%1Q``!4C0``5*0``%3#``!4Y```50,`[
XM`%4;``!5/@``56$``%5V``!5G0``5<4``%7E``!5^@``5@\``%8D``!6.0``'
XM5DX``%9C``!6>```5HT``%:H``!6L0``5KH``%;#``!6S```5M4``%;>``!63
XMYP``5O```%<G``!7,```5SD``%="``!72P``5U0``%==``!79@``5V\``%=XN
XM``!7@0``5XH``%>3``!7G```5Z4``%?&``!7X@``5_X``%@5``!8,```6$8`0
XM`%A@``!8=0``6)```%BO``!8TP``6.@``%C]``!9$@``62<``%D\``!94@``?
XM67T``%F;``!9NP``6=,``%GM``!:$0``6D(``%J```!:MP``6NH``%KS``!:M
XM_```6P4``%L.``!;%P``6R```%LI``!;,@``6SL``%M$``!;30``6U8``%M?+
XM``!;:```6W$``%MZ``!;@P``6XP``%N5``!;G@``6Z<``%NP``!;N0``6\(`0
XM`%O+``!;Z@``7`(``%PC``!<.```7%P``%QV``!<G@``7+(``%S0``!<]```J
XM70T``%TA``!=/```75D``%UU``!=B@``7:$``%W#``!=Y0``7@H``%XJ``!>>
XM0P``7F0``%Z"``!>G0``7K<``%[+``!>YP``7P,``%\H``!?1P``7UP``%]S_
XM``!?E@``7[0``%_%``!?Y@``7_\``&`>``!@/P``8&,``&!]``!@G@``8,``J
XM```!@YP``80```&$3``!A)@``84$``&%5``!A=```88L``&&T``!ASP``T
XM`1<RN#*R,JPRIC(>,?@RO#+`,L0RR#+,,M`RU#+8,MPRX#+D,N@R[#+P,O0R=
XM^#+\,P`S!#,(,PPS$#,4,Q@S'#,@,R0S*#,L,S`S-#,X,SPS0#-$,T@S3#-0=
XM,U0S6#-<,V`S9#-H,VPS<#-T,W@S?#.`,X0SB#.,,Y`SE#.8,YPSH#.D,Z@SI
XMK#.P,[0SN#.\,\`SQ#/(,\PST#/4,]@SW#/@,^0SZ#/L,_`S]#/X,_PT`#0$,
XM-`@T##00-!0T�<-"`T)#0H-"PT,#0T-#@T/#1`-$0T2#1,-%`T5#18-%PTX
XM8#1D-&@T;#1P-'0T>#1\-(`TA#2(-(PTD#24-)@TG#2@-*0TJ#2L-+`TM#2X,
XM-+PTP#3$-,@TS#30--0TV#3<-.`TY#3H-.PT\#3T-/@T_#4`-00U"#4,-1`UV
XM%#48-1PU(#4D-2@U+#4P-30U.#4\-4`U1#5(-4PU4#54-5@U7#5@-60U:#5L.
XM-7`U=#5X-7PU@#6$-8@UC#60-90UF#6<-:`UI#6H-:PUL#6T-;@UO#7`-<0U_
XMR#7,-=`UU#78-=PUX#7D->@U[#7P-?0U^#7\-@`V!#8(-@PV$#84-A@V'#8@#
XM-B0V*#8L-C`V-#8X-CPV0#9$-D@V3#90-E0V6#9<-F`V9#9H-FPV<#9T-G@V.
XM?#:`-H0VB#:,-I`VE#:8-IPVH#:D-J@VK#:P-K0VN"ST+0`M!"T(+10M&"T<,
XJ+2`M)"TH+2PM,"TT+3@M/"U`*Z8``````````RSF+/@KH@``````*+:-'
X``
Xend
Xsize 36942
SHAR_EOF
chmod 0003 browse.uu || echo "restore of browse.uu fails"
exit 0
mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (02/03/90)
Sorry for problems with this source when posted some weeks ago. "browse.c" comes now in two parts. Any complaints to: ---------------------------------------------------------------------- -- Carsten Emde --- Klinikum Steglitz --- Freie Universitaet Berlin -- -- Med. Klinik --- Hindenburgdamm 30 --- D-1000 Berlin 45 Steglitz -- -- +49307982393 --- Fax: +49307984141 --- Gastrointestinal Motility -- -- E-mail emde@zedat.fu-berlin.dbp.de (checked 0800/1200/1600/2000) -- -- or {anything big}!unido!cosmo!mdnet (checked only occasionally) -- ---------------------------------------------------------------------- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # browse_2a # This archive created: Tue Jan 30 18:04:16 1990 export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'browse_2a' then echo shar: "will not over-write existing file 'browse_2a'" else cat << \SHAR_EOF > 'browse_2a' /* -- Just what the hell am I ??? --- */ #include <stdio.h> char help[]= "Browse through a directory, written by Peter da Silva\n\ Adapted for OS-9 using TOP's os9lib\n\ Syntax: browse [<dir>]\n\ Function: show an ls-like directory listing which can be 'edited', i.e.\n\ files may be tagged and inspected, dumped, executed, deleted,\n\ renamed, copied, edited etc.\n\ Options:\n\ none\n"; #ifdef mc68000 #define sr sr_ #define PC PC_ #endif #ifdef OSK #include <termcap.h> #define GETCWD #define getcwd getwd #define minor(i) ((i)&0xFF) #define major(i) minor((i)>>8) #define SHELLSYM '$' #define ASSISTCOM "more /dd/sys/browse.hlp" #define SAVEMACROS "/h0/sys/browse.macros" #else #define remote #define SHELLSYM '!' #define ASSISTCOM "more /usr/hlp/browse.doc" #define SAVEMACROS "/usr/tmp/macros" #endif #ifdef M_XENIX #define USG #define rindex strrchr #define GETCWD #else #ifdef L_ctermid #define USG #define rindex strrchr #define minor(i) ((i)&0xFF) #define major(i) minor((i)>>8) #else #ifndef OSK #include <whoami.h> #endif #endif #endif /* -- Miscellaneous include files -- */ #ifdef OSK #include <modes.h> #include <direct.h> #include <sgstat.h> #include <strings.h> #endif #include <sys/param.h> /* NCARGS, and others */ #ifndef M_XENIX #include <sys/types.h> /* data types for various files */ #endif #include <sys/stat.h> /* stat data structure for getdir(), statout() */ #include <sys/dir.h> /* dir data structure for getdir() */ #include <pwd.h> /* passwd data structure for u_name() */ #include <grp.h> /* group data structure for g_name() */ #ifdef BSD #include <sys/time.h> /* time data structure for printime() */ #else #ifndef OSK #include <time.h> /* time data structure for printime() */ #endif #endif #ifdef USG #ifdef M_XENIX #include <sys/ioctl.h> #endif #include <termio.h> #else #ifndef OSK #include <sgtty.h> /* terminal modes for tinit(), tend() */ #endif #endif #include <signal.h> /* -- make information -- BUILD browse: browse.c cc browse.c -O -o browse -ltermlib END */ /* -- Miscellaneous defines -- */ #define FALSE 0 #define TRUE 1 #define MAXID 64 #define MAXLINE 256 #ifdef OSK #define MAXENTS 512 #define NCOL 54 #define MAXNAME 24 #else #define MAXENTS 320 #define NCOL 64 #define MAXNAME 14 #endif #define FILENAME 256 #define MAXARGC (NCARGS/16) /* Estimate max ARGC */ #define CHARSET 256 /* Number of macros == size of byte */ #define NOMAC (0) /* Null macro (last) */ #define TERMBUF 1024 /* Size of term buf for termcap */ #define SMALLBUF 256 #define NAME 1 #define SEC 2 /* -- Extended directory entry format -- */ struct entry { char *e_name; int e_flags; #define FTAGGED (1<<0) #define FPERMANENT (1<<1) struct stat e_stat; /* file status field */ char e_uname[9]; /* user name */ char e_gname[9]; /* user's group name */ #ifdef OSK unsigned long e_secno; #endif } *xentries[MAXENTS], **entries=xentries; int nentries; /* -- Look-up cache for user names -- */ struct idtab { int id_id; /* user (or group) id */ char id_name[9]; /* name[8] + filler */ } u_list[MAXID], /* Matched user id's. */ g_list[MAXID]; /* ditto group */ int u_ptr=0, g_ptr=0; /* current entries */ /* -- Global variables -- */ FILE *efp; /* Environment file */ char efname[MAXLINE]; /* " name */ char *tent; /* Pointer to tbuf */ char PC; /* Pad character */ char *UP, *BC; /* Upline, backsapce character */ short ospeed; /* Terminal output speed */ char termbuf[TERMBUF]; /* Place to put term info */ char *macbuf[CHARSET], ungetbuf[SMALLBUF]; /* Buffers for pushback and macros */ char c_macro=NOMAC; /* current macro */ char *macptr = ""; /* Pointer to currently executing macro */ char *ungetptr = ungetbuf; /* Pointer to pushed-back characters */ char *errname; /* Name of file error found in */ extern int errno; /* system error number */ int xerrno; /* extended error number */ int ccol=NCOL; /* Width of used display, current column */ int quickmode; /* short display mode (files only) */ #ifdef USG struct termio rawbuf; struct termio cookedbuf; #else #ifdef OSK struct sgbuf cookopts,rawopts; int signhndl(); #else struct sgttyb sgbuf; /* buffer for terminal mode info */ int rawflags, cookflags; /* flags for raw & cooked tty mode */ #endif #endif char *cm, /* Cursor motion */ *cs, /* Change scrolling region */ *sf, /* - scroll forward */ *sr, /* - scroll backwards */ *ce, /* Clear to end of line */ *cl, /* Clear screen */ *al, /* Insert line */ *dl, /* delete ditto */ *so, /* standout */ *se, /* standout end */ *us, /* underline */ *ue, /* underline end */ *ti, /* Init terminal */ *te; /* Reset terminal */ int li, /* lines on screen */ co; /* columns ditto */ char xn; /* Magic cookie kludge */ /* -- Global error messages -- */ char *emesg[4]={ "??", #define TOO_MANY 1 "Too many directory entries", #define NOMATCH 2 "No match", 0 }; int top, curr; /* Positions of screen in directory */ #define bottom ((top+nlines>nentries)?nentries:(top+nlines)) char *dot; /* name of current directory */ int nlines; /* number of lines displayed on page */ char display_up; /* Does the display exist? */ int todump=1; /* Do we want to dump data? */ int ended; /* Have we quite finished? */ int intrup; /* Have we been interrupted? */ char *HOME; /* Where did I start from? */ char *SHELL; /* How do I run programs? */ /* -- types of functions !!! */ char *getenv(), *tgetstr(); char *malloc(); #define NEW(t) (t *)malloc(sizeof (t)) #define NIL(t) ((t) 0) /* -- Code starts here: dummy main -- */ main(ac, av, ep) int ac; char **av; char **ep; { int i; if(ac>1) { for(i=1; i<ac; i++) { if(!strcmp(av[i],"-?")) { printf(help); exit(0); } } if(ac>2) { perror("only one argument may be specified."); exit(0); } if(chdir(av[1])==-1) { perror("can't access directory specified",av[1]); exit(0); } } sprintf(efname, "/tmp/br.env.%d", getpid()); HOME=getenv("HOME"); SHELL=getenv("SHELL"); #ifndef OSK dumpenv(ep); #endif intrup=0; tinit(getenv("TERM")); clear_all(); #ifdef OSK stdin->_flag|=_RBF; stdin->_flag|=_UNBUF; #endif browse(); tend(); #ifndef OSK unlink(efname); #endif } clear_all() { int i; for(i = 0; i < MAXENTS; i++) entries[i] = 0; } char *clone(name) char *name; { char *hold; hold = (char *)malloc(strlen(name)+1); if(hold==0) return 0; strcpy(hold, name); return hold; } newname(e, name) struct entry *e; char *name; { if(e->e_name) free(e->e_name); e->e_name = clone(name); } #if (BSD || OSK) readent(dp, db) DIR *dp; struct direct *db; { struct direct *ptr; ptr = readdir(dp); if(!ptr) return 0; *db = *ptr; /* V7 'C' and above... safe, since UCB=V7+ */ free(ptr); return 1; } #else #define opendir(n) fopen(n, "r") #define DIR FILE readent(dp, db) DIR *dp; struct direct *db; { if(fread(db, sizeof(struct direct), 1, dp)) return 1; /* else */ return 0; } #define closedir fclose #endif getdir() { #ifdef OSK struct fildes f; struct tm t; int physdisk, oldid; char pdot[32], *slash; #endif char *u_name(), *g_name(); DIR *dp; int valid; struct direct *hold = NEW(struct direct); int i, p; if(!(dp = opendir("."))) { errname="."; return FALSE; } p = 0; for(i = 0; i < nentries; i++) { if(entries[i]->e_flags & FPERMANENT) { if(p != i) { struct entry *hold; hold = entries[p]; entries[p] = entries[i]; entries[i] = hold; } p++; } } for(nentries = p; !intrup && nentries < MAXENTS; nentries += valid) { if(!entries[nentries]) { entries[nentries] = NEW(struct entry); if(!entries[nentries]) break; entries[nentries]->e_name = NIL(char *); } if(!readent(dp, hold)) { p=nentries; break; } #ifndef OSK valid = (hold->d_ino != 0); #else valid = TRUE; entries[nentries]->e_secno=hold->d_addr; #endif if(valid) { #ifndef OSK if(stat(hold->d_name, &entries[nentries]->e_stat)==-1) { closedir(dp); errname=hold->d_name; free(hold); return FALSE; } #endif newname(entries[nentries], hold->d_name); #ifndef BSD /* truncate name to 14 characters in non-BSD systems */ #ifndef OSK if(strlen(entries[nentries]->e_name)>14) entries[nentries]->e_name[14] = 0; #endif #endif entries[nentries]->e_flags = 0; #ifndef OSK strcpy(entries[nentries]->e_uname, u_name(entries[nentries]->e_stat.st_uid)); strcpy(entries[nentries]->e_gname, g_name(entries[nentries]->e_stat.st_gid)); #endif } } closedir(dp); free(hold); #ifdef OSK sortdir(SEC); /* optimize head movements */ oldid=getuid(); super(); strcpy(pdot,dot); if(slash=index(pdot+1,'/')) strcpy(slash,"@"); else strcat(pdot,"@"); if((physdisk=open(pdot,S_IREAD))==-1) return FALSE; for(nentries = 0; !intrup && nentries < p; nentries ++) { lseek(physdisk,(entries[nentries]->e_secno)<<8,0); read(physdisk,&f,sizeof(f)); t.tm_year = (int) f.fd_date[0]; t.tm_mon = (int) f.fd_date[1] - 1; t.tm_mday = (int) f.fd_date[2]; t.tm_hour = (int) f.fd_date[3]; t.tm_min = (int) f.fd_date[4]; t.tm_sec = 0; t.tm_isdst = -1; entries[nentries]->e_stat.st_atime = entries[nentries]->e_stat.st_mtime = mktime(&t); t.tm_year = (int) f.fd_dcr[0]; t.tm_mon = (int) f.fd_dcr[1] - 1; t.tm_mday = (int) f.fd_dcr[2]; t.tm_hour = t.tm_min = t.tm_sec = 0; t.tm_isdst = -1; entries[nentries]->e_stat.st_ctime = mktime(&t); memcpy(&(entries[nentries]->e_stat.st_size), f.fd_fsize, sizeof(long)); entries[nentries]->e_stat.st_uid = f.fd_own[1]; entries[nentries]->e_stat.st_gid = f.fd_own[0]; entries[nentries]->e_stat.st_mode = f.fd_att; entries[nentries]->e_stat.st_nlink = f.fd_link; strcpy(entries[nentries]->e_uname, u_name(entries[nentries]->e_stat.st_uid)); strcpy(entries[nentries]->e_gname, g_name(entries[nentries]->e_stat.st_gid)); } close(physdisk); setuid(oldid); #endif if(intrup) return FALSE; if(nentries>=MAXENTS || entries[nentries]==NIL(struct entry *)) { errno=0; xerrno=TOO_MANY; errname="."; return FALSE; } sortdir(NAME); if(intrup) return FALSE; return TRUE; } at_current() { at_file(curr); } at_file(file) int file; { if(display_up) { if(file < top || file >= top+nlines) return 0; at(0, curr-top+2); } else { if(file != curr) return 0; cmdline(); } return 1; } display_flags(flags) { outc((flags&FTAGGED)?'+':((flags&FPERMANENT)?'!':' ')); } repaint_flags() { if(!display_up) return; at(quickmode?0:NCOL-1, curr-top+2); display_flags(entries[curr]->e_flags); } /* repaint_current() { if(!display_up) return; at_current(); dump(curr, curr+1); } */ tag() { entries[curr]->e_flags ^= FTAGGED; repaint_flags(); } tag_all(flag) int flag; { int i; for(i = 0; i < nentries; i++) if(flag) { if(!isdir(entries[i])) entries[i]->e_flags |= FTAGGED; } else entries[i]->e_flags &= ~FTAGGED; if(display_up) todump = TRUE; } delete_from_display(file) int file; { if(!display_up) return; if(file>=top+nlines) return; if(file < top) file = top; scroll(2+file-top, 2+nlines, 1); at(0, 2+nlines-1); if(top+nlines >= nentries) outc('~'); else dump(bottom, bottom+1); } delete_file_entry(file) int file; { struct entry *hold; int i; delete_from_display(file); hold = entries[file]; for(i=file; i<nentries-1; i++) entries[i]=entries[i+1]; entries[nentries-1]=hold; nentries--; if(file < curr || curr >= nentries) { curr--; if(top >= nentries) { top--; display_up = 0; todump = 1; } } } remove_one(file, doit) int file; int doit; { if(!doit) { cmdline(); outs("Delete "); ctlouts(entries[file]->e_name); outs(" [n]?"); fflush(stdout); doit = getch() == 'y'; outs(doit?"Yes.":"No."); fflush(stdout); } if(doit) { if(unlink(entries[file]->e_name) == 0) { cmdline(); outs("Deleted "); ctlouts(entries[file]->e_name); outs("."); delete_file_entry(file); return 1; } else { wperror(entries[file]->e_name); return 0; } } return 0; } remove(doit) int doit; { int i; int found_tags; found_tags = 0; i = 0; while(i < nentries) { if(entries[i]->e_flags & FTAGGED) { found_tags = 1; if(!remove_one(i, doit)) /* decrements nentries */ break; } else i++; } if(!found_tags) remove_one(curr, doit); } insert_entry_at(ent, i) struct entry *ent; int i; { struct entry *hold; int j; /* Allocate slot at end */ if(!entries[nentries]) { entries[nentries] = NEW(struct entry); if(!entries[nentries]) return 0; entries[nentries]->e_name = NIL(char *); } else if(entries[nentries]->e_name) { free(entries[nentries]->e_name); entries[nentries]->e_name = NIL(char *); } /* Copy data into slot */ *entries[nentries] = *ent; entries[nentries]->e_name = clone(ent->e_name); if(!entries[nentries]->e_name) return 0; if(i != nentries) { /* Rotate slot to middle */ hold = entries[nentries]; for(j = nentries; j > i; j--) entries[j] = entries[j-1]; entries[i] = hold; } nentries++; if(display_up) { if(i < top) i = top; if(i >= bottom) return; scroll(2+i-top, 2+nlines, -1); at(0, 2+i-top); dump(i, i+1); } } insert_entry(ent) struct entry *ent; { int i; if(nentries >= MAXENTS) return 0; for(i = 0; i < nentries; i++) if(entcmpnam(&ent, &entries[i]) < 0) break; return insert_entry_at(ent, i); } assist() { char cmdbuf[MAXLINE]; sprintf(cmdbuf, ASSISTCOM); if(sys(cmdbuf, 1)) perror(cmdbuf); } hexdump() { char cmdbuf[MAXLINE]; sprintf(cmdbuf, "dump %s", entries[curr]->e_name); if(sys(cmdbuf, 1)) perror(cmdbuf); } move() { char scratch[FILENAME]; struct entry hold; char inps(); hold = *entries[curr]; cmdline(); outs("Rename "); ctlouts(entries[curr]->e_name); outc(' '); if(inps(scratch, entries[curr]->e_name, 0)=='\033') { killcmd(); return; } if(link(entries[curr]->e_name, scratch)!=0) { char tmbuf[42]; sprintf(tmbuf, "(rename %s %s)", entries[curr]->e_name, scratch); wperror(tmbuf); return; } if(unlink(entries[curr]->e_name)!=0) { wperror(entries[curr]->e_name); return; } hold.e_name = scratch; hold.e_flags &= ~FTAGGED; delete_file_entry(curr); insert_entry(&hold); } pname(name, mode) char *name; int mode; { int i; char *slash, *rindex(); int max=quickmode?MAXLINE:(MAXNAME+1); #ifdef OSK if(mode&S_IFDIR) #else if((mode&S_IFMT)==S_IFDIR) #endif max--; #ifndef OSK else if((mode&S_IFMT)==S_IFREG && (mode&0111)) max--; else if((mode&S_IFMT)!=S_IFREG) max--; #endif if(!quickmode && (slash=rindex(name, '/'))) { name=slash; outc('<'); max--; } for(i=0; i<max && *name; name++) i += ctlout(*name); standend(); if(i==max && *name) outs("\b>"); #ifdef OSK if(mode&S_IFDIR) { #else if((mode&S_IFMT)==S_IFDIR) { #endif outc('/'); } #ifndef OSK else if((mode&S_IFMT)==S_IFREG && (mode&0111)) { outc('*'); } else if((mode&S_IFMT)!=S_IFREG) { outc('?'); } #endif } sortdir(ele) int ele; { int entcmpnam(),entcmpsec(); if(ele==NAME) qsort(entries, nentries, sizeof(struct entry *), entcmpnam); if(ele==SEC) qsort(entries, nentries, sizeof(struct entry *), entcmpsec); } #ifndef OSK addname(flag) char flag; { char buf[FILENAME], *ptr, *tmp; char scratch[FILENAME]; struct entry hold; char inps(); cmdline(); outs("Add "); if(inps(scratch, entries[curr]->e_name, 0)=='\033') { killcmd(); return; } if(stat(scratch, &hold.e_stat)==-1) { wperror(scratch); return; } if(flag!='+' && *scratch != '/') { strcpy(buf, dot); ptr = scratch; for(;;) { /* eat '../' and './' */ if(ptr[0]=='.' && ptr[1]=='.' && (ptr[2]=='/' || !ptr[2])) { tmp = rindex(buf, '/'); if(!tmp) break; *tmp=0; ptr += 2+(ptr[2]=='/'); continue; } if(ptr[0]=='.' && (ptr[1]=='/' || !ptr[1])) { ptr += 1+(ptr[1]=='/'); continue; } break; } if(*ptr) { strcat(buf, "/"); strcat(buf, ptr); } hold.e_name = buf; } else hold.e_name = scratch; strcpy(hold.e_uname, u_name(hold.e_stat.st_uid)); strcpy(hold.e_gname, g_name(hold.e_stat.st_gid)); hold.e_flags = 0; if(flag!='+') hold.e_flags |= FPERMANENT; insert_entry(&hold); } addperm() { char buf[FILENAME], *ptr, *tmp; struct entry hold; int entcmpnam(), i; if(entries[curr]->e_flags & FPERMANENT) return; if(entries[curr]->e_name[0]!='/') { strcpy(buf, dot); ptr = entries[curr]->e_name; for(;;) { /* eat '../' and './' */ if(ptr[0]=='.' && ptr[1]=='.' && (ptr[2]=='/' || !ptr[2])) { tmp = rindex(buf, '/'); if(!tmp) break; *tmp=0; ptr += 2+(ptr[2]=='/'); continue; } if(ptr[0]=='.' && (ptr[1]=='/' || !ptr[1])) { ptr += 1+(ptr[1]=='/'); continue; } break; } if(*ptr) { strcat(buf, "/"); strcat(buf, ptr); } hold = *entries[curr]; hold.e_name = buf; hold.e_flags &= ~FTAGGED; hold.e_flags |= FPERMANENT; insert_entry(&hold); } else { entries[curr]->e_flags |= FPERMANENT; entries[curr]->e_flags &= ~FTAGGED; repaint_flags(); } } delperm() { entries[curr]->e_flags &= ~(FPERMANENT|FTAGGED); repaint_flags(); } #endif entcmpnam(e1, e2) struct entry **e1, **e2; { if((*e1)->e_name[0] == '/') { if((*e2)->e_name[0] != '/') return 1; } else if((*e2)->e_name[0] == '/') return -1; return strcmp((*e1)->e_name, (*e2)->e_name); } entcmpsec(e1, e2) struct entry **e1, **e2; { if((*e1)->e_secno < (*e2)->e_secno) return -1; if((*e1)->e_secno > (*e2)->e_secno) return 1; return 0; } dump(start, end) int start; int end; { int i; int lo = (start<nentries)?start:nentries; int hi = (end<nentries)?end:nentries; for(i=lo; i<hi; i++) { statout(entries[i]->e_name, &entries[i]->e_stat, entries[i]->e_uname, entries[i]->e_gname, entries[i]->e_flags); nl(); } return TRUE; } SHAR_EOF fi exit 0 # End of shell archive
mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (02/03/90)
#! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # browse_2b # 4. Merge browse_2a and browse_2b to create browse.c # This archive created: Tue Jan 30 18:04:32 1990 export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'browse_2b' then echo shar: "will not over-write existing file 'browse_2b'" else cat << \SHAR_EOF > 'browse_2b' statout(name, sbuf, user, group, flags) char *name; struct stat *sbuf; char *user, *group; int flags; { int mode = sbuf->st_mode; if(!quickmode) { #ifndef OSK printf("%5u ", sbuf->st_ino); #endif #ifdef OSK if(mode&S_IFDIR) outc('d'); else outc('-'); if(mode&S_ISHARE) outc('s'); else outc('-'); if(mode&S_IOEXEC) outc('e'); else outc('-'); if(mode&S_IOWRITE) outc('w'); else outc('-'); if(mode&S_IOREAD) outc('r'); else outc('-'); if(mode&S_IEXEC) outc('e'); else outc('-'); if(mode&S_IWRITE) outc('w'); else outc('-'); if(mode&S_IREAD) outc('r'); else outc('-'); #else if((mode&S_IFMT)==S_IFCHR) outc('c'); else if((mode&S_IFMT)==S_IFBLK) outc('b'); else if((mode&S_IFMT)==S_IFDIR) outc('d'); else if((mode&S_IFMT)==S_IFREG) outc('-'); else outc('?'); triad((mode>>6)&7, mode&S_ISUID, 's'); triad((mode>>3)&7, mode&S_ISGID, 's'); triad(mode&7, mode&S_ISVTX, 't'); #endif outc(' '); printf("%1u ", sbuf->st_nlink); printf("%-8s ", user); printf("%-8s ", group); #ifdef OSK if(!(mode&S_IFDIR)) #else if((mode&S_IFMT)==S_IFREG || (mode&S_IFMT)==S_IFDIR)) #endif printf("%7ld ", sbuf->st_size); else #ifdef OSK printf(" --- "); #else printf("%3d,%3d ", major(sbuf->st_rdev), minor(sbuf->st_rdev)); #endif outc(' '); printime(&sbuf->st_mtime); } display_flags(flags); pname(name, sbuf->st_mode); } char * u_name(uid) int uid; { int i; struct passwd *pwptr, *getpwuid(); for(i=0; i<u_ptr; i++) if(u_list[i].id_id==uid) return u_list[i].id_name; if(u_ptr>=MAXID) /* cache full */ u_ptr = 0; /* simplistic algorithm, wrap to beginning */ /* with MAXID >> # common id's it's good enough */ u_list[u_ptr].id_id=uid; if(pwptr=getpwuid(uid)) { /* Copy name */ for(i=0; pwptr->pw_name[i]>' '; i++) u_list[u_ptr].id_name[i]=pwptr->pw_name[i]; u_list[u_ptr].id_name[i]=0; } else /* Default to UID */ sprintf(u_list[u_ptr].id_name, "%d", uid); return u_list[u_ptr++].id_name; } char * g_name(gid) int gid; { int i; struct group *grptr, *getgrgid(); for(i=0; i<g_ptr; i++) if(g_list[i].id_id==gid) return g_list[i].id_name; if(g_ptr>=MAXID) /* cache full */ g_ptr = 0; /* simplistic algorithm, wrap to beginning */ /* with MAXID >> # common id's it's good enough */ g_list[g_ptr].id_id=gid; if(grptr=getgrgid(gid)) { /* Copy name */ for(i=0; grptr->gr_name[i]>' '; i++) g_list[g_ptr].id_name[i]=grptr->gr_name[i]; g_list[g_ptr].id_name[i]=0; } else /* Default to UID */ sprintf(g_list[g_ptr].id_name, "%d", gid); return g_list[g_ptr++].id_name; } printime(clock) long *clock; { struct tm *tmbuf, *localtime(); static char *months[12]= { "Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec" }; tmbuf=localtime(clock); printf("%2d %3s %02d %2d:%02d", tmbuf->tm_mday, months[tmbuf->tm_mon], tmbuf->tm_year, tmbuf->tm_hour, tmbuf->tm_min); } header() { int i; if(quickmode) printf(" File Name"); else printf( #ifdef OSK "Attr Lnk User Group Size Modify Time File name" #else "Inode Long mode LNX User Group Size/Dev Modify Time File name" #endif ); nl(); } #ifndef OSK triad(bits, special, code) int bits, special; char code; { if(bits&4) outc('r'); else outc('-'); if(bits&2) outc('w'); else outc('-'); if(special) outc(code); else if(bits&1) outc('x'); else outc('-'); } #endif outs(s) char *s; { int outc(); if(s) tputs(s, 0, outc); } outc(c) char c; { putchar(c); } /* Screen manipulation primitives: dumb set for smart terminals */ at(x, y) int x, y; { outs(tgoto(cm, x, y)); } nl() { outs(ce); outc('\n'); } /* Scroll lines in window (from:to) n lines */ scroll(from, to, n) int from, to, n; { if(cs && sf && sr) { outs(tgoto(cs, from, to-1)); if(n<0) while(n++) outs(sr); else while(n--) outs(sf); outs(tgoto(cs, 0, li-1)); } else if(al && dl) { if(n<0) { int i=n; outs(tgoto(cm, 0, to+n)); while(i++) outs(dl); outs(tgoto(cm, 0, from)); while(n++) outs(al); } else { int i=n; outs(tgoto(cm, 0, from)); while(i--) outs(dl); outs(tgoto(cm, 0, to-n)); while(n--) outs(al); } } } wperror(file) char *file; { extern int errno; extern remote char *sys_errlist[]; cmdline(); ctlouts(file); ctlouts(": "); ctlouts(errno?sys_errlist[errno]:emesg[xerrno]); if(!display_up) nl(); } fperror(prog, file) char *prog, *file; { extern int errno; fprintf(stderr, "%s -- ", prog); if(errno) perror(file); else fprintf(stderr, "%s: %s\n", file, emesg[xerrno]); } tinit(name) char *name; { char *termptr; char tbuf[TERMBUF], *tmp; #ifndef OSK int intr(); #endif #ifdef BSD int stop(); #endif termptr = termbuf; tgetent(tbuf, name); tmp = tgetstr("pc", &termptr); if(tmp) PC = *tmp; UP = tgetstr("up", &termptr); BC = tgetstr("bc", &termptr); cm = tgetstr("cm", &termptr); cs = tgetstr("cs", &termptr); sf = tgetstr("sf", &termptr); sr = tgetstr("sr", &termptr); ce = tgetstr("ce", &termptr); cl = tgetstr("cl", &termptr); al = tgetstr("al", &termptr); dl = tgetstr("dl", &termptr); us = tgetstr("us", &termptr); ue = tgetstr("ue", &termptr); so = tgetstr("so", &termptr); se = tgetstr("se", &termptr); ti = tgetstr("ti", &termptr); te = tgetstr("te", &termptr); li = tgetnum("li"); co = tgetnum("co"); xn = tgetflag("xn"); nlines=li-3; #ifdef USG ioctl(1, TCGETA, &rawbuf); cookedbuf = rawbuf; rawbuf.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL); rawbuf.c_cc[VMIN] = 1; rawbuf.c_cc[VTIME] = 0; #else #ifdef OSK _gs_opt(1, &cookopts); memcpy(&rawopts,&cookopts,sizeof(cookopts)); rawopts.sg_echo=rawopts.sg_pause=FALSE; rawopts.sg_eofch=rawopts.sg_eorch=0; #else gtty(1, &sgbuf); ospeed=sgbuf.sg_ospeed; quickmode=ospeed<10; cookflags=sgbuf.sg_flags; sgbuf.sg_flags = (sgbuf.sg_flags&~ECHO)|CBREAK; rawflags=sgbuf.sg_flags; #endif #endif #ifdef OSK intercept(signhndl); #else signal(SIGINT, intr); #endif #ifdef BSD signal(SIGTSTP, stop); #endif rawtty(); } int tmode=0; entty() { if(!tmode) outs(ti); tmode=1; } extty() { if(tmode) outs(te); tmode=0; } rawtty() { #ifdef USG ioctl(1, TCSETA, &rawbuf); #else #ifdef OSK _ss_opt(1, &rawopts); #else sgbuf.sg_flags=rawflags; stty(1, &sgbuf); #endif #endif entty(); } cooktty() { #ifdef USG ioctl(1, TCSETA, &cookedbuf); #else #ifdef OSK _ss_opt(1, &cookopts); #else sgbuf.sg_flags=cookflags; stty(1, &sgbuf); #endif #endif extty(); } #ifdef OSK int signhndl(signum) int signum; { switch (signum) { case 2: intrup=1; break; case 3: intrup=1; break; default: break; } } #else intr() { int intr(); signal(SIGINT, intr); intrup=1; bell(); } #endif #ifdef BSD stop() { int stop(); signal(SIGTSTP, stop); intrup=1; tend(); kill(getpid(), SIGSTOP); rawtty(); display_up=0; } #endif tend() { cmdline(); cooktty(); fflush(stdout); } char * pwd() #ifdef GETCWD { static char mydir[FILENAME+1] = ""; char *getcwd(); return getcwd(mydir, FILENAME); } #else { static char mydir[FILENAME] = ""; int status; int pip[2]; int n; int (*sigs[2])(); sigs[0] = signal(2, 1); sigs[1] = signal(3, 1); if(pipe(pip)<0) return 0; if(!fork()) { close(1); dup(pip[1]); close(pip[0]); execl("/bin/pwd", "pwd", 0); exit(-1); } close(pip[1]); wait(&status); signal(2, sigs[0]); signal(3, sigs[1]); if(status) { close(pip[0]); return "/"; } n = read(pip[0], mydir, FILENAME); close(pip[0]); if(n<=0) return "/"; mydir[n-1] = 0; return mydir; } #endif browse() { int c; char *env; if(env=getenv("BROWSE")) macptr = env; defmacs(); newdir(); redraw(); ended=0; do { if(intrup) { intrup=0; /* clear interrupt */ cmdline(); /* go to the command line */ outs("Interrupt"); /* let us know about it */ endmac(); /* clear macros */ clearin(); /* and input buffer */ } here_i_am(); fflush(stdout); c = getch(); cmd(c); } while(!ended); } clearin() { fseek(stdin, 0L, 1); /* stay here messily */ } cmd(c) char c; { int i; if(intrup) return; switch(c) { case ' ': if(isdir(entries[curr])) { if(!cd(entries[curr]->e_name)) wperror(entries[curr]->e_name); } else if(!macro(c)) bell(); else cmd(getch()); break; case '&': syscom(0); break; case SHELLSYM: syscom(1); break; case '=': todir(); break; #ifndef OSK case '?': sample(entries[curr]->e_name); break; #endif case '[': define(); break; #ifdef OSK case '?': #else case 'a': #endif assist(); break; case 'B'-'@': prev(nlines); break; case 'D'-'@': next(nlines/2); break; case 'F'-'@': next(nlines); break; case 'H': curr=top; break; case 'J': tail(); break; case 'K': home(); break; case 'L'-'@': redraw(); break; case 'L': curr=bottom-1; break; case 'M': definitions(); break; #ifdef OSK case '.': #else case 'N': #endif next(nlines); break; #ifdef OSK case 'o': #else case 'P': #endif prev(nlines); break; case 'R': move(); break; case 'S': savedefs(); break; case 'I': installdefs(entries[curr]->e_name); break; case 'U'-'@': prev(nlines/2); break; case 'D': case 'd': if(getch()==c && !intrup) remove(c=='D'); else bell(); break; case 'h': ccol=0; break; case 'l': ccol=NCOL; break; case '<': quickmode=1; if(display_up) { todump=1; at(0, 1); header(); } break; #ifndef OSK case '+': case '^': addname(c); break; case '(': addperm(); break; case ')': delperm(); break; #endif case '>': quickmode=0; if(display_up) { todump=1; at(0, 1); header(); } break; case 'J'-'@': #ifdef OSK case ',': #else case 'j': #endif newline(); break; case 'K'-'@': #ifdef OSK case 'i': #else case 'k': #endif upline(); break; case 'n': next(nlines/2); break; case 'p': prev(nlines/2); break; case 'q': case 'Z': case 'Q': if(getchar()==c && !intrup) ended=1; else bell(); break; case 'r': reload(); break; case 't': tag(); break; case 'T': case 'U': tag_all(c=='T'); break; case 'x': hexdump(); break; default: if(!macro(c)) bell(); else cmd(getch()); /* make sure it does something */ } /* and thus avoid unneeded redraws */ } cmdline() { at(0, li-1); outs(ce); fflush(stdout); } newdir() { if(display_up) at(0,0); fflush(stdout); dot=pwd(); if(!getdir()) wperror(dot); curr=0; top=0; topline(); if(display_up) todump=TRUE; } reload() { getdir(); curr=(curr>=bottom)?bottom-1:curr; if(display_up) { topline(); todump=TRUE; } } topline() { if(display_up) at(0,0); printf("%s: %d files", dot, nentries); nl(); } redraw() { outs(cl); display_up=0; topline(); at(0,1); header(); todump=1; display_up=1; } dumpdata() { at(0,2); dump(top,bottom); if(top+nlines>nentries) { int i; at(0, bottom-top+2); for(i=bottom-top; i<nlines; i++) { outc('~'); nl(); } } } upline() { if(curr>0) curr--; else bell(); } home() { curr=0; } next(l) { curr += l; if(curr>=nentries) curr=nentries-1; } prev(l) { curr -= l; if(curr<0) curr=0; } tail() { curr=nentries-1; } newline() { if(curr<nentries-1) curr++; else bell(); } here_i_am() { int c; if(*macptr) return; if(todump) display_up = 1; if(!display_up) { cmdline(); statout(entries[curr]->e_name, &entries[curr]->e_stat, entries[curr]->e_uname, entries[curr]->e_gname, entries[curr]->e_flags); at(quickmode?1:ccol, li-1); fflush(stdout); if((c=getch())=='\n') { redraw(); here_i_am(); } else ungetch(c); } else if(todump) { if(!(curr-top > 0 && curr-top < nlines)) { top = curr-nlines/2; if(top<0) top=0; } dumpdata(); at(quickmode?1:ccol, curr-top+2); todump=0; } else { int lines_to_scroll = curr-top; if(lines_to_scroll > 0) if((lines_to_scroll -= nlines-1) < 0) lines_to_scroll = 0; if(lines_to_scroll < 1-nlines) { top=curr; at(0,2); dump(top, bottom); } else if(lines_to_scroll > nlines-1) { top=curr-nlines+1; at(0,2); dump(top, bottom); } else if(lines_to_scroll) { scroll(2, nlines+2, lines_to_scroll); top += lines_to_scroll; if(lines_to_scroll < 0) { at(0, 2); dump(top, top-lines_to_scroll); } else { at(0, 2+nlines-lines_to_scroll); dump(bottom-lines_to_scroll, bottom); } } at(quickmode?1:ccol, curr-top+2); } } bell() { outc(7); } /* (Never used) perform(command) char *command; { char cmdbuf[MAXLINE]; cmdline(); extty(); outc('!'); printf(command, entries[curr]->e_name); sprintf(cmdbuf, command, entries[curr]->e_name); sys(cmdbuf, 1); entty(); } */ #ifdef OSK sys(command, rdflag) int rdflag; /* Should I redraw? */ { char shellstr[MAXLINE+64]; cmdline(); fflush(stdout); cooktty(); sprintf(shellstr,"setenv FILE %s;%s %s", entries[curr]->e_name, SHELL, command); if(errno=system(shellstr)) perror(shellstr); getchar(); if(rdflag) { redraw(); display_up=1; } rawtty(); } #else sys(command, rdflag) char *command; int rdflag; /* Should I redraw? */ { char scratch[32]; int status; int (*sigint)(), (*sigquit)(); char c; sigint=signal(2, 1); sigquit=signal(3, 1); cooktty(); fflush(stdout); strcpy(scratch, entries[curr]->e_name); if(!fork()) { int i; static char *envp[MAXARGC]; static char env[NCARGS]; char *hold; char line[MAXLINE]; char *tmp; signal(2,0); signal(3,0); if(!(efp=fopen(efname, "r"))) { fputc('\n', stderr); perror(efname); execl(SHELL, SHELL, "-c", command, 0); execl("/bin/sh", "sh", "-c", command, 0); perror("/bin/sh"); exit(-77); } i=0; tmp=hold=env; while(!feof(efp)) { fgets(line, MAXLINE, efp); if(strlen(line)+(tmp-env)>NCARGS) break; if(line[0]=='$') if(tmp>hold) { envp[i] = hold; i++; if(i > MAXARGC-2) break; tmp[-1]=0; /* eat line-feed at end */ hold = tmp; } strcpy(tmp, line+(line[0]=='$')); tmp += strlen(tmp); } if(tmp>hold) { envp[i] = hold; i++; tmp[-1]=0; /* and eat this one as well */ } sprintf(tmp, "FILE=%s", scratch); envp[i++]=tmp; envp[i]=0; if(rdflag) putchar('\n'); else putchar('\r'); fflush(stdout); execle(SHELL, SHELL, "-c", command, 0, envp); execle("/bin/sh", "sh", "-c", command, 0, envp); perror("/bin/sh"); exit(-77); } wait(&status); signal(2, sigint); signal(3, sigquit); rawtty(); if(rdflag || status!=0) display_up=0; } #endif char inps(buf, text, termin) char *buf; char *text; char termin; { int i = 0, j, found_tags; char c, *ptr, *txp; txp=text?text:"!"; while(!intrup && (fflush(stdout), c=getch()) != '\033' && c != '\n' && c != termin) switch(c) { case '\b': case '\177': if(i>0) { printf("\b \b"); i--; } else bell(); break; case 'U'-'@': txp=text?text:"!"; case 'X'-'@': if(i>0) while(i>0) { printf("\b \b"); i--; } else bell(); break; case 'K'-'@': if(*txp) ctloutc(buf[i++] = *txp++); break; case '%': found_tags = 0; j = 0; while(j < nentries) { if(entries[j]->e_flags & FTAGGED) { found_tags = 1; if(i+strlen(entries[j]->e_name)+1>=MAXLINE) return '\033'; for(ptr=entries[j]->e_name; *ptr; ptr++) ctlout(buf[i++] = *ptr); ctlout(buf[i++] = ' '); } j++; } if(!found_tags) { if(i+strlen(entries[curr]->e_name)+1>=MAXLINE) return '\033'; for(ptr=entries[curr]->e_name; *ptr; ptr++) ctlout(buf[i++] = *ptr); } standend(); break; case '#': for(ptr=dot; *ptr; ptr++) { if(i>=MAXLINE) return '\033'; ctlout(buf[i++] = *ptr); } standend(); break; case '~': for(ptr=HOME; *ptr; ptr++) { if(i>=MAXLINE) return '\033'; ctlout(buf[i++] = *ptr); } standend(); break; case '@': outc(c); fflush(stdout); c = getch(); if(!macro(c)) { ungetch(c); buf[i++]='@'; } else outs("\b \b"); break; case '$': outc(c); fflush(stdout); c = getch(); if(c=='$') { char tmp[10]; sprintf(tmp, "%d", getpid()); outs("\b \b"); for(ptr=tmp; *ptr; ptr++) { if(i>=MAXLINE) return '\033'; ctlout(buf[i++] = *ptr); } standend(); } else if(!macbuf[c]) { ungetch(c); buf[i++]='$'; } else { outs("\b \b"); for(ptr=macbuf[c]; *ptr; ptr++) { if(i>=MAXLINE) return '\033'; ctlout(buf[i++] = *ptr); } standend(); } break; case '!': while(*txp) { if(i>=MAXLINE) return '\033'; ctlout(buf[i++] = *txp++); } standend(); break; case '\\': outc(c); fflush(stdout); c=getch(); if(c=='~' || c=='%' || c=='#' || c=='\\' || c=='!' || c=='K'-'@' || c=='U'-'@' || c=='X'-'@' || c=='\b' || c=='\177' || c==termin || c=='\033' || c=='\n' || c=='@' || c=='$') { outc('\b'); ctloutc(buf[i++]=c); break; } else if(c>='0' && c<='7') { int n, val=0; for(n=0; n<3 && c>='0' && c<='7'; n++) { val = val*8 + c-'0'; outc('\b'); ctloutc(val); c=getch(); } ungetch(c); c=buf[i++]=val; break; } else if(c=='^') { outc('\b'); outc('^'); fflush(stdout); c=getch(); if(c>='?'&&c<='_') { outc('\b'); ctloutc(buf[i++]=(c-'@')&'\177'); break; } else if(c>='`'&&c<='~') { outc('\b'); ctloutc(buf[i++]=c-'`'); break; } /* otherwise default */ else buf[i++]='^'; /* after adding caret */ } /* otherwise fall through to default */ else buf[i++]='\\'; /* after adding backslash */ default: if(i>=MAXLINE) return '\033'; ctloutc(buf[i++] = c); break; } buf[i] = 0; return intrup?'\033':c; } ctlouts(s) char *s; { int cnt = 0; while(*s) cnt += ctlout(*s++); cnt += standend(); return cnt; } ctloutc(c) char c; { int cnt; cnt = ctlout(c); cnt += standend(); return cnt; } int somode = 0; int ulmode = 0; standout() { if(!somode) { outs(so); somode = 1; if(xn) return 1; } return 0; } underline() { if(!ulmode) { outs(us); ulmode = 1; if(xn) return 1; } return 0; } standend() { int cnt = 0; if(somode) { outs(se); somode = 0; if(xn) cnt++; } if(ulmode) { outs(ue); ulmode = 0; if(xn) cnt++; } return cnt; } ctlout(c) char c; { int cnt = 0; if(c&'\200') { cnt += underline(); cnt += ctlout(c&'\177'); return cnt; } else if(c<' ' || c=='\177') { cnt += standout(); outc((c+'@')&'\177'); cnt++; return cnt; } else { cnt += standend(); outc(c); cnt++; return cnt; } } todir() { char cmdbuf[MAXLINE]; static char lastdir[MAXLINE] = "."; char *slash, *rindex(); cmdline(); printf("goto "); if(inps(cmdbuf, lastdir, 0)!='\033' && cmdbuf[0]) { strcpy(lastdir, cmdbuf); if(!cd(cmdbuf, 0)) { if(!fgoto(cmdbuf)) if(slash=rindex(cmdbuf, '/')) { *slash++=0; if(cd(cmdbuf, 1)) { if(!fgoto(slash)) { errno=0; xerrno=NOMATCH; wperror(slash); } } else wperror(cmdbuf); } else wperror(cmdbuf); } } else killcmd(); } fgoto(file) char *file; { int i; for(i = 0; i<nentries; i++) if(match(entries[i]->e_name, file)) { curr=i; return 1; } return 0; } match(target, sample) char *target, *sample; { while(*sample && *target==*sample) { target++; sample++; } return !*sample; } killcmd() { if(!intrup) { cmdline(); printf("Command killed"); if(!display_up) nl(); } } cd(dir, flag) char *dir; int flag; { if(flag) { cmdline(); #ifdef OSK printf("cd %s", dir); } #else printf("cd %s\r", dir); } else outc('\r'); #endif fflush(stdout); if( #ifndef OSK access(dir, 5)==0 && #endif chdir(dir)==0) { newdir(); return 1; } return 0; } syscom(rd) int rd; /* should I redraw? */ { char buf[MAXLINE]; static char lastcmd[MAXLINE] = ""; char inps(); cmdline(); extty(); putchar(rd?SHELLSYM:'&'); if(inps(buf, lastcmd, 0)=='\033') { entty(); redraw(); display_up=1; killcmd(); return; } else strcpy(lastcmd, buf); sys(buf, rd); entty(); } isdir(entry) struct entry *entry; { #ifdef OSK return((entry->e_stat.st_mode)&S_IFDIR); #else return((entry->e_stat.st_mode&S_IFMT)==S_IFDIR); #endif } sample(name) char *name; { int col; int c, i; FILE *tfp; if(!(tfp = fopen(name, "r"))) { wperror(name); return; } i=0; do { cmdline(); col = 0; for(c=fgetc(tfp); col<72 && !feof(tfp); c=fgetc(tfp)) col+=ctlout(c); standend(); if(display_up) outc('\r'); else outc('\n'); } while(!feof(tfp) && (i=getch())=='?'); fclose(tfp); if(i && i!=' ' && i!='q' && i!='?') ungetch(i); } macro(c) char c; { if(c==NOMAC) return 0; else if(!macbuf[c]) return 0; else if(c==c_macro) { cmdline(); printf("Recursive macro."); endmac(); return 0; } else { c_macro = c; macptr = macbuf[c]; return 1; } } getch() { char c; if(ungetptr>ungetbuf) return *--ungetptr; if(*macptr) if(*macptr=='\007') { macptr++; if(*macptr!='\007') return getchar(); else { if((c=getchar()) != '\n') macptr--; else macptr++; return (c=='\n')?getch():c; } } else if(*macptr=='\\') { if(macptr[1]=='\007') macptr++; return *macptr++; } else return *macptr++; else { endmac(); return getchar(); } } endmac() { c_macro=NOMAC; macptr=""; } ungetch(c) char c; { if(ungetptr-ungetbuf>SMALLBUF) return; *ungetptr++=c; } define() { int c; char buf[SMALLBUF]; cmdline(); fflush(stdout); printf("define "); c = getch(); if(intrup) return; ctloutc(c); printf(" as ["); if(inps(buf, macbuf[c], ']')=='\033') { killcmd(); return; } printf("]"); defent(c, buf); } defent(c, buf) char c; char *buf; { if(macbuf[c]) free(macbuf[c]); if(!buf[0]) { macbuf[c]=0; return; } macbuf[c] = (char *)malloc(strlen(buf)+1); if(!macbuf[c]) { cmdline(); printf("No room"); return; } strcpy(macbuf[c], buf); } defmacs() { #ifdef OSK defent(' ', "$more %\n"); defent('%', "$%\n"); defent('s', "$scred %\n"); defent('b', "=..\n"); defent('c', "$copy % "); #else defent('/', "=/"); defent('.', "=."); defent(' ', "!more %\n"); defent('%', "!%\n"); defent('$', "!vi /tmp/br.env.$$\n"); defent('v', "!vi %\n"); #endif defent('~', "=~\n"); } definitions() { int i; cmdline(); for(i=0; i<CHARSET; i++) if(macbuf[i]) { printf("define "); ctloutc(i); printf(" as ["); ctlouts(macbuf[i]); printf("]\n"); } getchar(); redraw(); display_up=1; } savedefs() { int i; char filename[MAXLINE]; static char lastfile[MAXLINE] = SAVEMACROS; FILE *fp; cmdline(); outs("Save macros as "); if(inps(filename, lastfile, '\033')=='\033') { killcmd(); return; } strcpy(lastfile, filename); if(!(fp = fopen(filename, "w"))) { wperror(filename); return; } for(i=1; i<CHARSET; i++) if(macbuf[i]) fprintf(fp, "[%c%s]\n", i, macbuf[i]); fclose(fp); } installdefs(s) char *s; { FILE *fp; char macc,macs[80],*macp,firstchar; if((fp=fopen(s,"r"))==NULL) { wperror(s); return; } cmdline(); firstchar=(char)fgetc(fp); while(!feof(fp)) { if(firstchar!='[') { printf("illegal syntax in '%s'",s); fflush(stdout); break; } macc=fgetc(fp); macp=macs; do *(macp++)=(char)fgetc(fp); while(*(macp-1)!=']' && *(macp-1)!=-1); if(*(macp-1)!=']') { printf("illegal syntax in '%s'",s); fflush(stdout); break; } *(macp-1)='\0'; cmdline(); printf("define "); ctloutc(macc); printf(" as ["); ctlouts(macs); printf("]\n"); fflush(stdout); defent(macc, macs); fgetc(fp); firstchar=(char)fgetc(fp); } getchar(); fclose(fp); redraw(); display_up=1; } #ifndef OSK dumpenv(envp) char **envp; { if(!(efp=fopen(efname, "w"))) { fperror(efname); exit(-1); } while(*envp) fprintf(efp, "$%s\n", *envp++); fflush(efp); fclose(efp); } #endif #ifdef OSK link(str1,str2) char *str1,*str2; { char shellstr[80]; sprintf(shellstr,"copy %s %s",str1,str2); return(system(shellstr)); } #ifndef LINT int super() { #asm move.l #0,errno(a6) moveq.l #0,d1 os9 F$SUser bcc.s NoErr move.w d1,errno(a6) NoErr # endasm if(errno) return(FALSE); else return(TRUE); } #endif #endif SHAR_EOF fi exit 0 # End of shell archive