Path: news.larc.nasa.gov!amiga-request
From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
Subject: v91i139: mosaic - game of tile placement, Part01/01
Reply-To: sjorr@nsq.uucp (Stephen Orr)
Newsgroups: comp.sources.amiga
Message-ID: <comp.sources.amiga.v91i139@ab20.larc.nasa.gov>
Date: 30 Jul 91 00:18:45 GMT
Approved: tadguy@uunet.UU.NET (Tad Guy)
X-Mail-Submissions-To: amiga@uunet.uu.net
X-Post-Discussions-To: comp.sys.amiga.misc

Submitted-by: sjorr@nsq.uucp (Stephen Orr)
Posting-number: Volume 91, Issue 139
Archive-name: games/mosaic/part01

[ includes uuencoded executable  ...tad ]

The following is both the binaries and source code to a modified
version of mosaic.  It has a few new 'features' including a
functional high score board.  

Mosaic is a simple adaption to X of the PC/MS-DOS game of the same name. 

Mosaic is played with a set of 81 two-by-two tiles on a 24-by-24 playing
area. The objective of the game is to place your tiles such that
squares of the same pattern (color) are connected as much as possible. 

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  mosaic.c mosaic.doc mosaic.h mosaic.man mosaic.scores
#   mosaic.uu readme
# Wrapped by tadguy@ab20 on Mon Jul 29 20:18:43 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'mosaic.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mosaic.c'\"
else
echo shar: Extracting \"'mosaic.c'\" \(20117 characters\)
sed "s/^X//" >'mosaic.c' <<'END_OF_FILE'
X/*
X *  mosaic.c
X *  X version by kirk johnson  october 1990
X *  Amiga version by Loren J. Rittle  Sun Feb 24 06:17:30 1991
X *  Aris, this ones for you...
X *        ...when do I get my pizza :-)
X *
X *  It only took 4-5 hours to port from X, I did it on a dare!
X *  No Copyright N(c) 1991 Loren J. Rittle.  No rights reserved.
X *  Some code generated via PowerWindows 2.5.
X *  I also used their PD event shell as a starting point.
X *  
X *  Original UseNet post header:
X *  Path: news.larc.nasa.gov!elroy.jpl.nasa.gov!usc!cs.utexas.edu!sun-barr!newstop!exodus!kanchenjunga.LCS.MIT.EDU
X *  From: tuna@kanchenjunga.LCS.MIT.EDU (Kirk 'UhOh' Johnson)
X *  Newsgroups: comp.sources.x
X *  Subject: v11i083: mosaic, Part01/01
X *  Message-ID: <8101@exodus.Eng.Sun.COM>
X *  Date: 17 Feb 91 19:12:47 GMT
X *  Sender: news@exodus.Eng.Sun.COM
X *  Lines: 2409
X *  Approved: argv@sun.com
X *  
X *  Submitted-by: tuna@kanchenjunga.LCS.MIT.EDU (Kirk 'UhOh' Johnson)
X *  Posting-number: Volume 11, Issue 83
X *  Archive-name: mosaic/part01
X *
X *  Thanks to Kirk for releasing such a nice simple game program with source...
X *  Hard Drive Installable and Multitasks, thus better than any psygnosis game...
X */
X
X#include <exec/types.h>
X#include <exec/io.h>
X#include <exec/memory.h>
X#include <libraries/dos.h>
X#include <intuition/intuition.h>
X#include <graphics/gfxmacros.h>
X#include <proto/all.h>
X/*#include <stdlib.h>*/
X#include <time.h>
X#include <math.h>
X#include <string.h>
X#include "mosaic.h"
X
X/* modified repel distance from mouse Mar '91 (SO) */
X#define X_OFF 36 /*27 */
X#define Y_OFF 23 /*17 */
X
X#undef _main
Xvoid	_main(void);
X
Xstruct IntuitionBase *IntuitionBase = NULL;
Xstruct GfxBase *GfxBase = NULL;
X
XSHORT BorderVectors1[] =
X{
X  0, 0,
X  65, 0,
X  65, 25,
X  0, 25,
X  0, 0
X};
X
Xstruct Border Border1 =
X{
X  -1, -1,
X  3, 0, JAM1,
X  5,
X  BorderVectors1,
X  NULL
X};
X
Xstruct IntuiText IText1 =
X{
X  3, 0, JAM2,
X  5, 7,
X  NULL,
X  "Restart",
X  NULL
X};
X
Xstruct Gadget Gadget1 =
X{
X  NULL,
X  366, 107,
X  64, 24,
X  NULL,
X  RELVERIFY,
X  BOOLGADGET,
X  (APTR) & Border1,
X  NULL,
X  &IText1,
X  NULL,
X  NULL,
X  NULL,
X  NULL
X};
X
Xstruct IntuiText IText2 =
X{
X  3, 0, JAM2,
X  366, 138,
X  NULL,
X  "Next:",
X  NULL
X};
X
Xstruct NewWindow NewWindowStructure1 =
X{
X  20, 10,
X  440, 188,
X  0, 1,
X  MOUSEBUTTONS + MOUSEMOVE + GADGETUP + CLOSEWINDOW + RAWKEY,
X  WINDOWDRAG + WINDOWDEPTH + REPORTMOUSE + WINDOWCLOSE + ACTIVATE + NOCAREREFRESH,
X  &Gadget1,
X  NULL,
X  "Mosaic, Amiga Version by Loren J. Rittle\0Sun Feb 24 04:36:18 1991",
X  NULL,
X  NULL,
X  450, 188,
X  450, 188,
X  WBENCHSCREEN
X};
X
Xstruct NewWindow NewWindowStructure2 =
X{
X  465, 10,
X  170, 120,
X  0, 1,
X  NULL,
X  WINDOWDRAG + WINDOWDEPTH + NOCAREREFRESH,
X  NULL,
X  NULL,
X  "Mosaic Score",
X  NULL,
X  NULL,
X  450, 188,
X  450, 188,
X  WBENCHSCREEN
X};
X
Xchar *ScoreFile = "mosaic.scores";
X
XWord tile[NTiles];		/* the board */
XWord piece[NPieces];		/* the "deck" of pieces */
XWord nextpiece;			/* index into the deck */
X
XWord size[NTiles];		/* score data structures */
XWord parent[NTiles];
X
XWord tscore[3];			/* total score */
XWord pscore[3];			/* last piece score */
XWord remain[3];			/* tiles remaining */
X
Xstatic char buf[256];
X
XNameAndScore highscore[NHighScores];
X
Xint highlitX = 0;
Xint highlitY = 0;
X
Xint highlitXonDown;
Xint highlitYonDown;
X
XBPTR SpeakFH = NULL;
X
Xstruct Window *wG = NULL;
Xstruct RastPort *rpG;
X
Xstruct Window *wS = NULL;
Xstruct RastPort *rpS;
X
X#define BoundVarVal(var, min, max) \
X{                                  \
X  if ((var) < (min))               \
X    (var) = (min);                 \
X  else if ((var) > (max))          \
X    (var) = (max);                 \
X}
X
XUWORD chip backfill[8] =
X{0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444};
X
XUWORD chip solid[8] =
X{0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
X
X/* modified to _main Mar '91 (SO) */
Xvoid _main()
X{
X  UWORD code;
X  ULONG class;
X  APTR object;
X  int MouseX, MouseY;
X  int x, y;
X
X  struct IntuiMessage *message;
X
X  IntuitionBase = OpenLibrary ("intuition.library", 0);
X  GfxBase = OpenLibrary ("graphics.library", 0);
X  if (!IntuitionBase || !GfxBase)
X    fatal ("Can't open Intuition and/or Graphics Library.");
X
X  wG = OpenWindow (&NewWindowStructure1);
X  if (wG == NULL)
X    fatal ("Can't open a window.");
X  rpG = wG->RPort;
X
X  wS = OpenWindow (&NewWindowStructure2);
X  if (wS == NULL)
X    fatal ("Can't open a window.");
X  rpS = wS->RPort;
X
X  {
X    struct Process* proc = (struct Process *)FindTask(0L);
X    APTR temp = proc->pr_WindowPtr;
X
X    proc->pr_WindowPtr = (APTR)-1L;
X    SpeakFH = Open ("speak:", MODE_NEWFILE);
X    proc->pr_WindowPtr = temp;
X  }
X
X
X  PrintIText (rpG, &IText2, 0, 0);
X
X  ReadHighScores ();
X
Xrestart:
X  InitGame ();
X  drawScore ();
X  SetAPen (rpG, 2);
X  SetAfPt (rpG, (void *) backfill, 3);
X  RectFill (rpG, 20, 14, 24 * 14 + 20, 24 * 7 + 14);
X
X  SetAPen (rpG, 3);
X  for (x = 0; x < 25; x++)
X    {
X      Move (rpG, x * 14 + 20, 14);
X      Draw (rpG, x * 14 + 20, 24 * 7 + 14);
X    }
X
X  for (y = 0; y < 25; y++)
X    {
X      Move (rpG, 20, y * 7 + 14);
X      Draw (rpG, 24 * 14 + 20, y * 7 + 14);
X    }
X
X  while (1)
X    {
X      WaitPort (wG->UserPort);
X      while ((message = (struct IntuiMessage *) GetMsg (wG->UserPort)) != NULL)
X	{
X	  code = message->Code;
X	  object = message->IAddress;
X	  class = message->Class;
X	  MouseX = message->MouseX;
X	  MouseY = message->MouseY;
X	  ReplyMsg ((struct Message *) message);
X	  if (class == CLOSEWINDOW)
X	    QuitGame (0);
X	  /*
X           * This is very kludgy, don't follow this example of how to read
X           * keys... This is a quick hack to allow the 'a' for auto play
X           * feature to work.  Try it, you may hate it! Because, the
X           * AutoPlay() function is not too smart.  LJR
X           */
X	  if ((class == RAWKEY) && (code == 32))
X 	    AutoPlay ();
X	  /* Here again, quick hack to support open/closing of
X	   * score window via 's'.  LJR
X	   */
X	  if ((class == RAWKEY) && (code == 33))
X	    {
X	      if (wS == NULL)
X		{
X	          wS = OpenWindow (&NewWindowStructure2);
X	          if (wS == NULL)
X		    fatal ("Can't open a window.");
X	          rpS = wS->RPort;
X		  drawScore ();
X		}
X	      else
X		{
X		  CloseWindow(wS);
X		  wS = NULL;
X		}
X	    }
X	  if (class == MOUSEMOVE)
X	    MoveBox (MouseX, MouseY);
X	  if (class == MOUSEBUTTONS)
X	    if (code & 0x0080)
X	      {
X		if ((highlitXonDown == highlitX) &&
X		    (highlitYonDown == highlitY))
X		  {
X		    if ((nextpiece < NPieces) &&
X			(DropPiece (highlitY, highlitX, piece[nextpiece])))
X		      {
X			nextpiece += 1;
X			drawNext ();
X
X			if (nextpiece == NPieces)
X			  {
X			    MoveBox (-1, -1);
X			    CheckHighScore ();
X			  }
X		      }
X		    else
X		      if (SpeakFH)
X			Write (SpeakFH, "No Way!", 7);
X		      else
X			DisplayBeep (NULL);
X		  }
X		else
X		  if (SpeakFH)
X		    Write (SpeakFH, "Un-do!", 7);
X		  else
X		    DisplayBeep (NULL);
X	      }
X	    else
X	      {
X		highlitXonDown = highlitX;
X		highlitYonDown = highlitY;
X	      }
X	  if ((class == GADGETUP) || (class == GADGETDOWN))
X	    if (object == (void *) &Gadget1)
X	      goto restart;
X	}
X    }
X
X}
X
Xvoid
XMoveBox (int MouseX, int MouseY)
X{
X  int x, y;
X  int newX = (MouseX - X_OFF) / 14;
X  int newY = (MouseY - Y_OFF) / 7;
X
X  BoundVarVal (newX, 0, 22);
X  BoundVarVal (newY, 0, 22);
X
X  if ((newX == highlitX) && (newY == highlitY))
X    return;
X
X  SetAPen (rpG, 3);
X  for (x = highlitX; x < highlitX + 3; x++)
X    {
X      Move (rpG, x * 14 + 20, highlitY * 7 + 14);
X      Draw (rpG, x * 14 + 20, highlitY * 7 + 14 + 14);
X    }
X
X  for (y = highlitY; y < highlitY + 3; y++)
X    {
X      Move (rpG, highlitX * 14 + 20, y * 7 + 14);
X      Draw (rpG, highlitX * 14 + 20 + 28, y * 7 + 14);
X    }
X
X  SetAfPt (rpG, (void *) backfill, 3);
X  SetAPen (rpG, 2);
X  if (!tile[highlitY * BoardSize + highlitX])
X    RectFill (rpG, highlitX * 14 + 21, highlitY * 7 + 15, (highlitX+1) * 14 + 19, (highlitY+1) * 7 + 13);
X  if (!tile[highlitY * BoardSize + highlitX + 1])
X    RectFill (rpG, (highlitX+1) * 14 + 21, highlitY * 7 + 15, (highlitX+2) * 14 + 19, (highlitY+1) * 7 + 13);
X  if (!tile[(highlitY + 1) * BoardSize + highlitX])
X    RectFill (rpG, highlitX * 14 + 21, (highlitY+1) * 7 + 15, (highlitX+1) * 14 + 19, (highlitY+2) * 7 + 13);
X  if (!tile[(highlitY + 1) * BoardSize + highlitX + 1])
X    RectFill (rpG, (highlitX+1) * 14 + 21, (highlitY+1) * 7 + 15, (highlitX+2) * 14 + 19, (highlitY+2) * 7 + 13);
X
X  if (nextpiece == NPieces)
X    {
X      highlitX = highlitY = 0;
X      return;
X    }
X  highlitX = newX;
X  highlitY = newY;
X
X  SetAPen (rpG, 1);
X  for (x = highlitX; x < highlitX + 3; x++)
X    {
X      Move (rpG, x * 14 + 20, highlitY * 7 + 14);
X      Draw (rpG, x * 14 + 20, highlitY * 7 + 14 + 14);
X    }
X
X  for (y = highlitY; y < highlitY + 3; y++)
X    {
X      Move (rpG, highlitX * 14 + 20, y * 7 + 14);
X      Draw (rpG, highlitX * 14 + 20 + 28, y * 7 + 14);
X    }
X
X  SetAfPt (rpG, (void *) solid, 3);
X  if (!tile[highlitY * BoardSize + highlitX])
X    {
X      SetAPen (rpG, piece[nextpiece] & 0x0003);
X      RectFill (rpG, highlitX * 14 + 21, highlitY * 7 + 15, (highlitX+1) * 14 + 19, (highlitY+1) * 7 + 13);
X    }
X  if (!tile[highlitY * BoardSize + highlitX + 1])
X    {
X      SetAPen (rpG, (piece[nextpiece] & 0x000C)>>2);
X      RectFill (rpG, (highlitX+1) * 14 + 21, highlitY * 7 + 15, (highlitX+2) * 14 + 19, (highlitY+1) * 7 + 13);
X    }
X  if (!tile[(highlitY + 1) * BoardSize + highlitX])
X    {
X      SetAPen (rpG, (piece[nextpiece] & 0x0030)>>4);
X      RectFill (rpG, highlitX * 14 + 21, (highlitY+1) * 7 + 15, (highlitX+1) * 14 + 19, (highlitY+2) * 7 + 13);
X    }
X  if (!tile[(highlitY + 1) * BoardSize + highlitX + 1])
X    {
X      SetAPen (rpG, (piece[nextpiece] & 0x00C0)>>6);
X      RectFill (rpG, (highlitX+1) * 14 + 21, (highlitY+1) * 7 + 15, (highlitX+2) * 14 + 19, (highlitY+2) * 7 + 13);
X    }
X}
X
Xvoid
XQuitGame (int rc)
X{
X  if (wG)
X    CloseWindow (wG);
X  if (wS)
X    CloseWindow (wS);
X  if (SpeakFH)
X    Close (SpeakFH);
X  if (GfxBase != NULL)
X    CloseLibrary (GfxBase);
X  if (IntuitionBase != NULL)
X    CloseLibrary (IntuitionBase);
X  exit (0);
X}
X
Xvoid
Xwarning (char *msg)
X{
X/* removed to be compatible with _main Mar '91 (SO)
X  fflush (stdout);
X  fprintf (stderr, "%s: warning! %s\n", AppName, msg);
X  fflush (stderr);
X*/
X}
X
Xvoid
Xfatal (char *msg)
X{
X/* removed to be compatible with _main Mar '91 (SO)
X  fflush (stdout);
X  fprintf (stderr, "%s: %s\n", AppName, msg);
X*/
X  QuitGame (1);
X}
X
Xvoid
XReadHighScores (void)
X{
X  int i;
X  FILE *s;
X
X  s = fopen (ScoreFile, "r");
X  if (s == NULL)
X    {
X      warning ("unable to open score file; creating new one");
X
X      for (i = 0; i < NHighScores; i++)
X	{
X	  strcpy (highscore[i].uname, ".");
X	  highscore[i].score = -1;
X	}
X
X      WriteHighScores ();
X    }
X  else
X    {
X      for (i = 0; i < NHighScores; i++)
X	{
X	  fgets (buf, 30, s);
X	  if (sscanf (buf, "%s %d",
X		      highscore[i].uname, &highscore[i].score) != 2)
X	    fatal ("incomplete score file read");
X	}
X      fclose (s);
X    }
X}
X
X
Xvoid
XWriteHighScores (void)
X{
X  int i;
X  FILE *s;
X
X  s = fopen (ScoreFile, "w");
X  if (s == NULL)
X    fatal ("unable to open score file");
X
X  for (i = 0; i < NHighScores; i++)
X    fprintf (s, "%s %d\n", highscore[i].uname, highscore[i].score);
X
X  fclose (s);
X}
X
Xvoid
XCheckHighScore (void)
X{
X  int i;
X  int score;
X  char *uname;
X
Xstatic char name[24] = "Your Name Here";
X
X  score = tscore[0] + tscore[1] + tscore[2];
X
X  /*
X   * note that we don't actually try to do any locking of the high score
X   * file during this critical section ...
X   */
X
X  ReadHighScores ();
X
X/* (modified Mar '91 SO)
X    for (i = 0; i < NHighScores; i++)
X      if (strcmp (highscore[i].uname, uname) == 0)
X        break;
X
X    if (i == NHighScores)
X*/
X    i = NHighScores - 1;
X
X  if (score > highscore[i].score)
X    {
X      while ((i > 0) && (score > highscore[i - 1].score))
X	{
X	  strcpy (highscore[i].uname, highscore[i - 1].uname);
X	  highscore[i].score = highscore[i - 1].score;
X	  i -= 1;
X	}
X
X  /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
X   * user name for high score
X   *
X   * Added by Stephen Orr (SandIsoft) (Mar '91)
X   *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
X{
Xstatic struct StringInfo si = {name, NULL, 0, 24};
Xstatic struct Gadget g = {NULL, 4, 2, 128, 9, GADGHCOMP, RELVERIFY|STRINGCENTER, STRGADGET, NULL, NULL, NULL, 0L, (APTR)&si, 0, NULL};
Xstatic struct NewWindow nw = {100, 90, 140, 13, -1,-1, GADGETUP,SMART_REFRESH|ACTIVATE|RMBTRAP,&g,NULL,NULL,NULL,NULL,0,0,0,0,WBENCHSCREEN};
X
Xstruct Window *win;
Xstruct Message *msg;
Xint x;
X
X	win = OpenWindow(&nw);
X	while (!ActivateGadget(&g, win, NULL));
X	Wait(1<<win->UserPort->mp_SigBit);
X	msg = GetMsg(win->UserPort);
X	ReplyMsg(msg);
X	CloseWindow(win);
X
X	if (strlen(name)) uname = name;
X		else uname = "Anonymous";
X
X	for (x=0;x<strlen(name);x++) if (name[x]==' ') name[x] = '_';
X
X/* modified Mar '91 (SO)
X	uname = name;
X	uname = getenv ("USERNAME");
X	if (uname == NULL)
X	uname = "Unknown_Puzzle_Solver";
X*/
X}
X
X      strcpy (highscore[i].uname, uname);
X      highscore[i].score = score;
X
X      WriteHighScores ();
X
X      if (SpeakFH)
X	{
X	  Write (SpeakFH, "Congratulations!", 16);
X	  Write (SpeakFH, name, strlen(name)+1);
X	  Write (SpeakFH, "You got a hi score.", 19);
X	}
X      else
X	DisplayBeep (NULL);
X    }
X  drawHighScores ();
X}
X
Xvoid
XAutoPlay (void)
X{
X  int r, c;
X
X  while (nextpiece < NPieces)
X    {
X      do
X	{
X	  r = rand () % (BoardSize - 1);
X	  c = rand () % (BoardSize - 1);
X	}
X      while (!DropPiece (r, c, piece[nextpiece]));
X
X      nextpiece += 1;
X      drawNext ();
X
X      if (nextpiece == NPieces)
X	{
X	  MoveBox (-1, -1);
X  drawHighScores ();
X/*	  CheckHighScore (); */
X	}
X    }
X}
X
Xvoid
XUpdateAndScore (int r, int c, Word score[])
X{
X  int i;
X
X  i = r * BoardSize + c;
X
X  PossiblyMerge (i, i + 1);
X  PossiblyMerge (i + BoardSize, i + BoardSize + 1);
X
X  PossiblyMerge (i, i + BoardSize);
X  PossiblyMerge (i + 1, i + BoardSize + 1);
X
X  if (c >= 1)
X    {
X      PossiblyMerge (i, i - 1);
X      PossiblyMerge (i + BoardSize, i + BoardSize - 1);
X    }
X  if (r >= 1)
X    {
X      PossiblyMerge (i, i - BoardSize);
X      PossiblyMerge (i + 1, i - BoardSize + 1);
X    }
X  if (c <= (BoardSize - 3))
X    {
X      PossiblyMerge (i + 1, i + 2);
X      PossiblyMerge (i + BoardSize + 1, i + BoardSize + 2);
X    }
X  if (r <= (BoardSize - 3))
X    {
X      PossiblyMerge (i + BoardSize, i + (2 * BoardSize));
X      PossiblyMerge (i + BoardSize + 1, i + (2 * BoardSize) + 1);
X    }
X  /* compute the new score */
X  for (i = 0; i < 3; i++)
X    score[i] = 0;
X  for (i = 0; i < NTiles; i++)
X    if ((tile[i] != 0) && (parent[i] == i))
X      score[tile[i] - 1] += size[i] * size[i];
X}
X
Xvoid
XPossiblyMerge (int i, int j)
X{
X  Word irep;
X  Word jrep;
X  Word scan;
X
X  /* tiles are not the same color */
X  if (tile[i] != tile[j])
X    return;
X
X  /* find i's rep */
X  irep = i;
X  while (parent[irep] != irep)
X    irep = parent[irep];
X
X  /* compress path from i to irep */
X  scan = i;
X  while (parent[scan] != scan)
X    {
X      scan = parent[scan];
X      parent[scan] = irep;
X    }
X
X  /* find j's rep */
X  jrep = j;
X  while (parent[jrep] != jrep)
X    jrep = parent[jrep];
X
X  /* compress path from j to jrep */
X  scan = j;
X  while (parent[scan] != scan)
X    {
X      scan = parent[scan];
X      parent[scan] = jrep;
X    }
X
X  /* tiles are already in the same set */
X  if (irep == jrep)
X    return;
X
X  /* merge the sets */
X  if (size[irep] > size[jrep])
X    {
X      parent[jrep] = irep;
X      size[irep] += size[jrep];
X    }
X  else
X    {
X      parent[irep] = jrep;
X      size[jrep] += size[irep];
X    }
X}
X
Xint
XDropPiece (int r, int c, Word p)
X{
X  int idx;
X  Word type;
X  Word nscore[3];
X
X  idx = r * BoardSize + c;
X
X  /* check for illegal move */
X  if ((tile[idx] != 0) ||
X      (tile[idx + 1] != 0) ||
X      (tile[idx + BoardSize] != 0) ||
X      (tile[idx + BoardSize + 1] != 0))
X    return 0;
X
X  /* place the piece */
X  type = p & 0x03;
X  tile[idx] = type;
X  remain[type - 1] -= 1;
X  p >>= 2;
X
X  type = p & 0x03;
X  tile[idx + 1] = type;
X  remain[type - 1] -= 1;
X  p >>= 2;
X
X  type = p & 0x03;
X  tile[idx + BoardSize] = type;
X  remain[type - 1] -= 1;
X  p >>= 2;
X
X  type = p & 0x03;
X  tile[idx + BoardSize + 1] = p & 0x03;
X  remain[type - 1] -= 1;
X
X  /* update the score */
X  UpdateAndScore (r, c, nscore);
X  for (idx = 0; idx < 3; idx++)
X    {
X      pscore[idx] = nscore[idx] - tscore[idx];
X      tscore[idx] = nscore[idx];
X    }
X
X  /* redraw */
X  drawTile (r++, c);
X  drawTile (r, c++);
X  drawTile (r--, c);
X  drawTile (r, c);
X  drawScore ();
X
X  return 1;
X}
X
Xvoid
XInitGame (void)
X{
X  int i, j, k, l;
X  int idx, swap;
X
X  /* randomize */
X  srand ((int) time (NULL));
X
X  /* clear the board */
X  for (i = 0; i < NTiles; i++)
X    tile[i] = 0;
X
X  /* set up deck */
X  idx = 0;
X  for (i = 1; i <= 3; i++)
X    for (j = 1; j <= 3; j++)
X      for (k = 1; k <= 3; k++)
X	for (l = 1; l <= 3; l++)
X	  piece[idx++] = (i << 6) | (j << 4) | (k << 2) | (l << 0);
X
X  /* shuffle */
X  for (i = 0; i < 1000; i++)
X    {
X      idx = rand () % NPieces;
X      swap = piece[idx];
X      piece[idx] = piece[0];
X      piece[0] = swap;
X    }
X  nextpiece = 0;
X
X  /* clear score data structures */
X  for (i = 0; i < NTiles; i++)
X    {
X      size[i] = 1;
X      parent[i] = i;
X    }
X
X  for (i = 0; i < 3; i++)
X    {
X      tscore[i] = 0;
X      pscore[i] = 0;
X      remain[i] = (NPieces * 4) / 3;
X    }
X  drawNext ();
X}
X
Xvoid
XdrawTile (int r, int c)
X{
X  int x, y;
X
X  x = c * 14 + 20;
X  y = r * 7 + 14;
X
X  SetAfPt (rpG, (void *) solid, 3);
X  SetAPen (rpG, tile[r * BoardSize + c]);
X  RectFill (rpG, x + 1, y + 1, x + 13, y + 6);
X}
X
Xvoid
XdrawHighScores (void)
X{
Xstatic USHORT dither[] = {0x5555, 0xaaaa};
X
X  int i;
X
X  /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
X   * dither background
X   *
X   * Added by Stephen Orr (SandIsoft) (Mar '91)
X   *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
X  SetAPen(rpG,0);
X  SetAfPt(rpG, dither, 1);
X  SetDrMd(rpG, JAM1);
X  RectFill(rpG, 21, 15, 355, 181);
X  SetAfPt(rpG, NULL, 0);
X
X  SetAPen (rpG, 1);
X  SetDrMd(rpG, JAM2);
X  for (i = 0; i < NHighScores; i++)
X    if (highscore[i].score > 0)
X      {
X	sprintf (buf, "%-24s %5d", highscore[i].uname, highscore[i].score);
X	Move (rpG, 50, 30 + i * 14);
X	Text (rpG, buf, strlen (buf));
X      }
X}
X
Xvoid
XdrawNext (void)
X{
X  int p = (nextpiece < NPieces) ? piece[nextpiece] : 0;
X  int x = 26 * 14 + 20;
X  int y = 20 * 7 + 14;
X
X  SetAfPt (rpG, (void *) solid, 3);
X  SetAPen (rpG, p & 0x03);
X  RectFill (rpG, x + 1, y + 1, x + 13, y + 6);
X  p >>= 2;
X  SetAPen (rpG, p & 0x03);
X  RectFill (rpG, x + 15, y + 1, x + 27, y + 6);
X  p >>= 2;
X  SetAPen (rpG, p & 0x03);
X  RectFill (rpG, x + 1, y + 8, x + 13, y + 13);
X  p >>= 2;
X  SetAPen (rpG, p & 0x03);
X  RectFill (rpG, x + 15, y + 8, x + 27, y + 13);
X}
X
Xvoid
XdrawScore (void)
X{
X  int i, total, temp;
X
X  if (!wS)
X    return;
X
X  SetAPen(rpS, 3);
X  Move (rpS, 10, 20);
X  Text (rpS, "to play:", 8);
X
X  Move (rpS, 10, 30);
X  for (i = 0; i < 3; i++)
X    {
X      SetAPen(rpS, i+1);
X      sprintf (buf, "%5d ", remain[i]);
X      Text (rpS, buf, strlen (buf));
X    }
X
X  SetAPen(rpS, 3);
X  Move (rpS, 10, 50);
X  Text (rpS, "total:", 6);
X
X  total = 0;
X  Move (rpS, 10, 60);
X  for (i = 0; i < 3; i++)
X    {
X      SetAPen(rpS, i+1);
X      total += tscore[i];
X      sprintf (buf, "%5d ", tscore[i]);
X      Text (rpS, buf, strlen (buf));
X    }
X
X  /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
X   * calculate yield
X   *
X   * Added by Stephen Orr (SandIsoft) (July '91)
X   *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
X  temp = (34992 + remain[0]*remain[0] + remain[1]*remain[1] + remain[2]*remain[2]
X	- 2*(108*(remain[0]+remain[1]+remain[2])));
X  temp = temp?(100*total/temp):100;
X
X  SetAPen(rpS, 3);
X  sprintf (buf, "%5.5d   Yeild %3.3d\%", total, temp);
X
X  Move (rpS, 10, 70);
X  Text (rpS, buf, strlen (buf));
X
X  Move (rpS, 10, 90);
X  Text (rpS, "piece:", 6);
X
X  total = 0;
X  Move (rpS, 10, 100);
X  for (i = 0; i < 3; i++)
X    {
X      SetAPen(rpS, i+1);
X      total += pscore[i];
X      sprintf (buf, "%5d ", pscore[i]);
X      Text (rpS, buf, strlen (buf));
X    }
X
X  SetAPen(rpS, 3);
X  sprintf (buf, "%5d", total);
X  Move (rpS, 10, 110);
X  Text (rpS, buf, strlen (buf));
X}
END_OF_FILE
if test 20117 -ne `wc -c <'mosaic.c'`; then
    echo shar: \"'mosaic.c'\" unpacked with wrong size!
fi
# end of 'mosaic.c'
fi
if test -f 'mosaic.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mosaic.doc'\"
else
echo shar: Extracting \"'mosaic.doc'\" \(2524 characters\)
sed "s/^X//" >'mosaic.doc' <<'END_OF_FILE'
X"22 January 1991"
Xmosaic
X
XDESCRIPTION
X
XMosaic is a simple adaption to X of the PC/MS-DOS game of the same name. 
X
XMosaic is played with a set of 81 two-by-two tiles on a 24-by-24 playing
Xarea. The objective of the game is to place your tiles such that
Xsquares of the same pattern (color) are connected as much as possible. 
X
XFor the purposes of scoring, similarly patterned squares are connected
Xonly if they share a side; touching diagonally on a corner doesn't
Xcount. 
X
XEach of the 81 tiles is composed of four patterned squares. No two
Xtiles are the same, and each comes up once a game, in random order. 
X
XHOW TO PLAY
X
XWhen playing mosaic, the next tile you have to play is shown in a
Xtwo-by-two window in the upper right corner of the mosaic window.  By
Xmoving the mouse pointer in the playing area window, you control where
Xthat tile will be placed, as indicated by the outline which tracks the
Xmouse pointer.  To place the piece, press any mouse button.
X
XWhile playing, the following key commands are available:
X
X    Quit (Close Window Gadget)
X    New game (restart - at any time)
X    Automatic (press A) randomly place any remaining tiles
X
XAfter you place each tile, mosaic identifies all the connected regions
Xof similarly patterned squares.  Each region then scores according to
Xthe square of the number of squares in the region.
X
XThe idea here is to generate connected regions of the same colour.  For
Xeach of these regions, the total number of sqaures included in the
Xregion is found, and that result is squared.  The 'ultimate' score
Xthen would be for arranging all of the colours into 3 regions (1 for
Xeach) resulting in a score of 108^2 * 3 or 34992.  By the way this
Xis not possible.
X
XMosaic displays the total score, the total score broken down by
Xpattern, and the amount those scores were improved by the most
Xrecently played piece.  This version also shows a yield which
Xrepresents how good your score is when compared to the 'ultimate'
Xscore (if only 3 colour regions existed).  A final yeild of 50%
Xis VERY good, 40% is good, 30% is not fair, and less than 20% is
Xpretty awful.
X
XAUTHOR
X
XMosaic was written by Kirk Johnson <tuna@athena.mit.edu>.  It is based
Xon Joshua Klayman's PC/MS-DOS shareware game of the same name.  This
Xversion is a complete rewrite encompasing only the basic functionality
Xof the original.
X
XThe Amiga version was ported by Loren J. Rittle (l-rittle@uiuc.edu)
Xand modified by Stephen Orr (sjorr@NSQ.UUCP, sjorr@cbmtor.UUCP) or
XBIX: sjorr
X
XBug reports and suggestions are welcome.
END_OF_FILE
if test 2524 -ne `wc -c <'mosaic.doc'`; then
    echo shar: \"'mosaic.doc'\" unpacked with wrong size!
fi
# end of 'mosaic.doc'
fi
if test -f 'mosaic.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mosaic.h'\"
else
echo shar: Extracting \"'mosaic.h'\" \(1519 characters\)
sed "s/^X//" >'mosaic.h' <<'END_OF_FILE'
X/*
X * mosaic.h
X * kirk johnson
X * october 1990
X */
X
X#ifndef _MOSAIC_H_
X#define _MOSAIC_H_
X
X#include <stdio.h>
X
X/* #define DEBUG */
X
X#define AppName   "mosaic"
X
X#define BoardSize (24)		/* width, in tiles */
X#define NPieces   (81)		/* # pieces per game */
X
X#define NTiles (BoardSize*BoardSize)
X
X#define MaxUnameLen  (30)	/* eight chars per uname, max */
X#define MaxScoreLen  (5)	/* five chars per score, max */
X#define NHighScores  (10)	/* # of high scores kept */
X#define NHelpLines   (10)	/* # of lines in help window */
X
X#define MaxPossibleScore  "34992"
X
X
Xtypedef unsigned short Word;
X
Xtypedef struct
X{
X  char uname[MaxUnameLen+1];	/* username */
X  int  score;			/* score */
X} NameAndScore;
X
Xvoid MoveBox (int MouseX, int MouseY);
Xvoid main (void);
Xvoid QuitGame(int rc);
Xvoid warning(char *msg);
Xvoid fatal(char *msg);
Xvoid ReadHighScores(void);
Xvoid WriteHighScores(void);
Xvoid CheckHighScore(void);
Xvoid AutoPlay(void);
Xvoid UpdateAndScore(int r, int c, Word score[]);
Xvoid PossiblyMerge(int i, int j);
Xint DropPiece(int r, int c, Word p);
Xvoid InitGame(void);
Xvoid drawTile(int r, int c);
Xvoid drawHighScores(void);
Xvoid drawNext(void);
Xvoid drawScore(void);
X
Xextern Word tile[NTiles];	/* the board */
Xextern Word piece[NPieces];	/* the "deck" of pieces */
Xextern Word nextpiece;		/* index into the deck */
X
Xextern Word tscore[3];		/* total score */
Xextern Word pscore[3];		/* last piece score */
Xextern Word remain[3];		/* tiles remaining */
X
Xextern NameAndScore highscore[NHighScores];
X
X#endif /* _MOSAIC_H_ */
END_OF_FILE
if test 1519 -ne `wc -c <'mosaic.h'`; then
    echo shar: \"'mosaic.h'\" unpacked with wrong size!
fi
# end of 'mosaic.h'
fi
if test -f 'mosaic.man' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mosaic.man'\"
else
echo shar: Extracting \"'mosaic.man'\" \(4792 characters\)
sed "s/^X//" >'mosaic.man' <<'END_OF_FILE'
X.TH mosaic 6 "22 January 1991"
X.SH NAME
Xmosaic
X.SH SYNOPSIS
Xmosaic [-options ...] 
X.SH DESCRIPTION
X.I Mosaic
Xis a simple adaption to X of the PC/MS-DOS game of the same name. 
X.sp
X.I Mosaic
Xis played with a set of 81 two-by-two tiles on a 24-by-24 playing
Xarea. The objective of the game is to place your tiles such that
Xsquares of the same pattern (color) are connected as much as possible. 
X.sp
XFor the purposes of scoring, similarly patterned squares are connected
Xonly if they share a side; touching diagonally on a corner doesn't
Xcount. 
X.sp
XEach of the 81 tiles is composed of four patterned squares. No two
Xtiles are the same, and each comes up once a game, in random order. 
X.SH HOW TO PLAY
XWhen playing
X.I mosaic,
Xthe next tile you have to play is shown in a two-by-two window in the
Xupper right corner of the
X.I mosaic
Xwindow. By moving the mouse pointer in the playing area window, you
Xcontrol where that tile will be placed, as indicated by the outline
Xwhich tracks the mouse pointer. To place the piece, press any mouse
Xbutton. 
X.sp
XWhile playing, the following key commands are available:
X.TP 4
X.B q
XQuit
X.I mosaic
X.TP 4
X.B s
XShow (or hide, if it's already visible) the high scores window
X.TP 4
X.B h
XHelp - show (or hide, if it's already visible) the help window. When
Xthe help window is visible, no pieces may be placed.
X.TP 4
X.B n
XNew game (only enabled when the current game is completed)
X.TP 4
X.B a
XAutomatic - randomly place any remaining tiles
X.SH SCORING
XAfter you place each tile,
X.I mosaic
Xidentifies all the connected regions of similarly patterned squares. 
XEach region then scores according to the square of the number of
Xsquares in the region. 
X.sp
X.I Mosaic
Xdisplays the total score, the total score broken down by pattern, and
Xthe amount those scores were improved by the most recently played
Xpiece. 
X.SH OPTIONS
X.TP 8
X.B \-help
XPrints a brief help message. 
X.TP 8
X.B \-display \fIdisplay\fP
XSpecifies the name of the X server to contact. 
X.TP 8
X.B \-expert
XBy default,
X.I mosaic
Xshows a "quick help" window upon startup. When this flag is used, the
X"quick help" window is not shown initially.
X.TP 8
X.B \-color
XCauses
X.I mosaic
Xto run in color mode (the default, except when using StaticGray and
XGrayScale visuals).
X.TP 8
X.B \-mono
XCauses
X.I mosaic
Xto run in monochrome mode. When in monochrome mode, only the
Xforeground (\-fg) and background (\-bg) colors are used (the default
Xwhen using StaticGray and GrayScale visuals).
X.TP 8
X.B \-patterns
XCauses
X.I mosaic
Xto use patterned tiles (the default).
X.TP 8
X.B \-solid
XCauses
X.I
Xmosaic
Xto use unpatterned (solid color) tiles. Probably not a good idea if
Xyou're running in monochrome mode.
X.TP 8
X.B \-gw \fInumber\fP
XSpecifies the gutter width (in pixels).
X.TP 8
X.B \-bw \fInumber\fP
XSpecifies the border width (in pixels);
X.TP 8
X.B \-fg \fIcolor\fP
XSpecifies the foreground color. 
X.TP 8
X.B \-bg \fIcolor\fP
XSpecifies the background color.
X.TP 8
X.B \-bd \fIcolor\fP
XSpecifies the border color.
X.TP 8
X.B \-c0 \fIcolor\fP
X.TP 8
X.B \-c1 \fIcolor\fP
X.TP 8
X.B \-c2 \fIcolor\fP
X.TP 8
X.B \-c3 \fIcolor\fP
XSpecifies the colors used to draw the background and tiles in the
Xplaying area.
X.TP 8
X.B \-fn \fIfont\fP
XSpecifies the font used for displaying text.
X.SH X DEFAULTS
X.TP 8
X.B Mono (type: boolean)
XSpecifies that
X.I mosaic
Xshould run in monochrome mode. The default is False.
X.TP 8
X.B Expert (type: boolean)
XWhen true, specifies that the "quick help" window should not be shown
Xupon startup. The default is False.
X.TP 8
X.B Solid (type: boolean)
XSpecifies that
X.I mosaic
Xshould use unpatterned (solid color) tiles. The default is False.
X.TP 8
X.B GutterWidth (type: number)
XSpecifies the gutter width (in pixels).
X.TP 8
X.B BorderWidth (type: number)
XSpecifies the border width (in pixels).
X.TP 8
X.B Foreground (type: color)
XSpecifies the foreground color. The default is \fIwhite\fP.
X.TP 8
X.B Background (type: color)
XSpecifies the background color. The default is \fIblack\fP.
X.TP 8
X.B BorderColor (type: color)
XSpecifies the border color. The default is \fIwhite\fP.
X.TP 8
X.B Color0 (type: color)
XSpecifies tile color zero. The default is \fIwhite\fP.
X.TP 8
X.B Color1 (type: color)
XSpecifies tile color one. The default is \fI#c44\fP.
X.TP 8
X.B Color2 (type: color)
XSpecifies tile color two. The default is \fI#4c4\fP.
X.TP 8
X.B Color3 (type: color)
XSpecifies tile color three. The default is \fI#44c\fP.
X.TP 8
X.B Font (type: color)
XSpecifes the font used for displaying text. The default is
X\fI-*-times-bold-r-*-*-*-180-*-*-*-*-*-*\fP.
X.SH AUTHOR
X.I Mosaic
Xwas written by Kirk Johnson <tuna@athena.mit.edu>. It is based on
XJoshua Klayman's PC/MS-DOS shareware game of the same name. This
Xversion is a complete rewrite encompasing only the basic
Xfunctionality of the original.
X.sp
XBug reports and suggestions are welcome.
END_OF_FILE
if test 4792 -ne `wc -c <'mosaic.man'`; then
    echo shar: \"'mosaic.man'\" unpacked with wrong size!
fi
# end of 'mosaic.man'
fi
if test -f 'mosaic.scores' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mosaic.scores'\"
else
echo shar: Extracting \"'mosaic.scores'\" \(114 characters\)
sed "s/^X//" >'mosaic.scores' <<'END_OF_FILE'
XStephen_Orr 16798
XAnonymous 1
XAnonymous 1
XAnonymous 1
XAnonymous 1
XAnonymous 1
XAnonymous 1
XAnonymous 1
XAnonymous 1
END_OF_FILE
if test 114 -ne `wc -c <'mosaic.scores'`; then
    echo shar: \"'mosaic.scores'\" unpacked with wrong size!
fi
# end of 'mosaic.scores'
fi
if test -f 'mosaic.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mosaic.uu'\"
else
echo shar: Extracting \"'mosaic.uu'\" \(22624 characters\)
sed "s/^X//" >'mosaic.uu' <<'END_OF_FILE'
Xbegin 666 mosaic
XM```#\P`````````$``````````,```A#```%VD````@```7W```#Z0``"$-(J
XMYW[^)$@D`$GY`````"QX``1'^0``!51R`"`\```$HF`")L%1R/_\*4\%E"E./
XM!8Q"K`60<``B/```,`!.KO[.0_H!J'``3J[]V"E`%]AF!G!D8``!+"9N`10IX
XM:P"8!8A*JP"L9P``DB`/D*\`.`:`````@"E`!5@@:P"LT<C1R")H`!#3R=/)7
XM(`)R`!(9*4D%G-"!7H`"0/_\*4`%I$CG0$`B/``!``%.KO\Z3-\"`DJ`9@P@?
XM/````^@O`&<``1P@0"E`!:`@`E.`U($1L@``(`)3@E'(__81O``@(`)3@A&\+
XM`"(@`A&Q(``@`5'*__@0O``B+PA@>"EK`#H%6'!_4H#1K`580>L`7$ZN_H!!?
XMZP!<3J[^C"E`!9`O`"1`("H`)&<8+&P7V"!`(B@``$ZN_Z`I0`6((@!.KO^"L
XM(BH`(&<:)#P```/M3J[_XBE`!9AG"N6(($`G:``(`*0@;`60+PA(;`54(&@`&
XM)"EH``0%G$ZZ`(Y.N@""<`!@!"`O``0N;`64+P`@+`6`9P0@0$Z03KH51DZZH
XM`&Q*K`609RHL;!?8(BP%F&<$3J[_W"(L!8AG!$ZN_Z8L>``$3J[_?")L!9!.S
XMKOZ&8!(@+`6D9PPB;`6@+'@`!$ZN_RXB;!?83J[^8B`?3-]_?DYU9&]S+FQI<
XM8G)A<GD```!.^0````!P84YU3G5(YP<P+B\`&"9O`!PL+P`@+P=.NAYH6$\D4
XM0"`*9@1P_V`V""H``P`#9Q!(>``"0J<O!TZZ%-!/[P`,+P8O"R\J``1.NAK`-
XM3^\`#"H`2JP%;&<$</]@`B`%3-\,X$YU``````````!P84Y5_^1(YR<P)FT`&
XM""1M`!1P`'(`$A,K0/_P*T#_["M`_^A![`1-"#```A@`9R@@+?_H<@I.NARR;
XM<@`2&W0/PH+0@2M`_^AP`!`30>P$30@P``((`&;8$!-R;+`!9@I2BW`!*T#_T
XM\&`.<FBP`68(4HMP`2M`_^P@;0`,3I`N`'!CL!-G%D'L!$T(,``#>`!G"B!MB
XM``Q.D"X`8.IP_[Z`9@P@;0`0((=P`&```X9P`!`3!$``6&<``6@$0``+9P`"5
XMZE-`9RI90&<``HQ?0&<``-I30&<``3Y70&<``Q150&<*5T!G``$Z8``#.'P`@
XM8#)\`"`M_^AG!G(!L(%O)'`MOH!G!G(KOH%F&+Z`9@1P_V`"<``L`"!M``Q.$
XMD"X`4ZW_Z$'L!$T(,``">`!F#"!M`!`@AW``8``"^D*M_^0@+?_D<@I.NAND<
XM(@=T#\*"T($K0/_D(&T`#$Z0+@!3K?_H9PQ![`1-"#```G@`9M`@"F<``K1*%
XMAFH$1*W_Y$JM__!G#"!2("W_Y""`8``"FDJM_^QG#"!2("W_Y#"`8``"B"!2B
XM(*W_Y&```GYP,+Z`;09P-[Z`;PP@;0`0((=P`&```G)"K?_D("W_Y.>`(@=T/
XM!\*"T($K0/_D(&T`#$Z0+@!3K?_H9PQP,+Z`;09P-[Z`;]0@"F<``C!*K?_P+
XM9@P@4B`M_^0@@&```AX@4B"M_^1@``(42JW_Z&8&<`@K0/_H0>P$30@P``=X5
XM`&8,(&T`$""'<`!@``'\*@<@;0`,3I`N`"`M_^AG!G("L(%O/'`PNH!F-G!XH
XMOH!G!G!8OH!F*B!M``Q.D"X`0>P$30@P``=X`&8,(&T`$""'<`!@``&T0JW_$
XMY%.M_^A@0D'L!$T(,``"6`!G"B`%<C"0@2M`_^1![`1-"#```%@`9PH@!7(WA
XMD($K0/_D0>P$30@P``%8`&<*(`5R5Y"!*T#_Y%.M_^AG8D'L!$T(,``'>`!GX
XM5B`M_^3I@"M`_^1![`1-"#```G@`9PH@!W(PD(&!K?_D0>P$30@P``!X`&<*H
XM(`=R-Y"!@:W_Y$'L!$T(,``!>`!G"B`'<E>0@8&M_^0@;0`,3I`N`&"8(`IG2
XM``#N2JW_\&8,(%(@+?_D((!@``#<(%(@K?_D8```TD'L!$T(,``">`!F#"!M'
XM`!`@AW``8```QGP`(`9R"DZZ&70B!W0/PH+0@2P`(&T`#$Z0+@!3K?_H9PQ!M
XM[`1-"#```G@`9M0@"F<``(8@4B`&,(!@?"`*9P@@4E*2(`<0@%.M_^AO'"!M)
XM``Q.D"X`</^^@&<.(`IGZ"!24I(@!Q"`8-YP_[Z`9@H@;0`0((=P`&!*0>L`E
XM`2`(8$(@"F<((%)2DB`'$(`@;0`,3I`N`'#_OH!G$E.M_^AG#$'L!$T(,``#/
XM>`!GU"!20A!@!'``8`P@;0`0((=!ZP`!(`A,WPSD3EU.=0```````'!A3E7_,
XMQ$CG)S`F;0`()&T`#'X`?`!Z`'``&WP`(/_[<@`K0?_V=/\K0O_R0>W_T!M`3
XM__$;0/_\*T'_Y"M!_^@K2/_,$!-G+'(`$@`$00`@9Q1706<444%G"%5!9A9^D
XM`6`.?`%@"GH!8`8;?``!__Q2BV#0$!-R,+`!9@92BQM!__MP*K`39@P@4EB27
XM*U#_]E*+8`Y(;?_V+PM.N@JB4$_7P!`3<BZP`68B4HMP*K`39@P@4EB2*U#_'
XM\E*+8`Y(;?_R+PM.N@IX4$_7P!`3<FRP`68*&WP``?_Q4HM@"')HL`%F`E*+<
XM$!MR`!(`&T#_\`1!`%!G``%L44%G``%Z!$$`"V<``@9306<D!$$`"V<``0Y3-
XM06<``4Q706<``;9506<``.!706<``4Y@``'T2BW_\6<((%)8DB`08`8@4EB2/
XM(!`K0/_L;`IR`42M_^PK0?_H("W_Z&<$<BU@"DH&9P1R*V`"<B`;0?_0<@`2!
XM!H"!<@`2!8"!9PA2K?_,4JW_Y"\M_^PO+?_,3KH)&%!/*T#_R"`M__)*@&H&,
XM<@$K0?_R("W_R"(M__*2@$CM``+_Q&\T(&W_S-'!+P`O""\M_\Q.N@Y$3^\`B
XM#'``$"W_^R(M_\0@;?_,8`(0P%.!9/H@+?_R*T#_R-&M_^1![?_0*TC_S$H'>
XM9P`!,!M\`"#_^V```29*+?_Q9P@@4EB2(!!@!B!26)(@$"M`_^Q@`/]D2BW_S
XM\6<((%)8DB`08`8@4EB2(!`K0/_L2BW__&<2(&W_S!#\`#!R`2M!_^0K2/_,S
XM+P`O+?_,3KH(?%!/*T#_R&``_S(@+?_R2H!J!G`(*T#_\AM\``'_\4HM__%GF
XM""!26)(@$&`&(%)8DB`0*T#_[$HM__QG%B!M_\P0_``P$/P`>'("*T'_Y"M(9
XM_\PO`"\M_\Q.N@A@4$\K0/_(""T`!?_P9@#^T$AM_]!.N@><6$]@`/["(%)8_
XMDB)0*TG_S&8(0?H`V"M(_\P@;?_,2AAF_%.(D>W_S"M(_^0@+?_R2H!K)K'`B
XM;R(K0/_D8!QP`2M`_^0@4EB2(!`;0/_00BW_T6`&<`!@``",("W_Y"(M__:RW
XM@&P(=``K0O_V8`21K?_V2@=G-E.M_^1M&'``(&W_S!`8+P`K2/_,(&T`$$Z0/
XM6$]@XE.M__9M2'``$"W_^R\`(&T`$$Z06$]@Z%.M__9M$G``$"W_^R\`(&T`J
XM$$Z06$]@Z%.M_^1M&'``(&W_S!`8+P`K2/_,(&T`$$Z06$]@XB`+3-\,Y$Y=W
XM3G4``$Y5__1(YP$P)FT`""1M``PK;0`0__8>&DH'9S1P);X`9B*P$F8$4HI@U
XM&B\+2&W_]B\*80#\%$_O``PK0/_Z9P0D0&#2<``0!R\`3I-83V#&3-\,@$Y==
XM3G4O"R9O``A*JP`49PP(*P`#`!MF!'``8#0O+`503KH,XEA/)T``!"=``!!FJ
XM"G`,*4`7U'#_8!8G;`50`!1P\\&K`!AP`"=```PG0``()E].=0``````````\
XM`````$Y5_^Q(YR\0+BT`""9M``PH!W`QP*L`&&<&</]@``)D""L`!P`:5L!$A
XM`$B`2,`L`$JK`!1F``"`""L``@`;9G9P`"=```QR_[Z!9P`"-B\+3KK_4EA/#
XM2H!G#`CK``4`&W#_8``"'@CK``$`&TH&9PX@*P`4(@!$@2=!``Q@""`K`!0G[
XM0``,4ZL`#&T2(&L`!%*K``0@!Q"`<@`2`&`2(`=R`!(`+PLO`6$`_U903R(`>
XM(`%@``'.""L``@`;9UAP_[Z`9@9P`&```;H@!QM`__]*!F<B<`J^@&8<<`(OW
XM`$AZ`:HO*P`<*T#_\$ZZ]@!/[P`,*@!@&G`!+P!(;?__+RL`'"M`__!.NO7DM
XM3^\`#"H`?O]@``#<".L``0`;2@9G3G#_OH!G2%2K``QR"KZ!9B(@:P`$4JL`W
XM!!"\``TB*P`,2H%K"B\++P!A`/ZV4$]2JP`,(&L`!%*K``0@!Q"`("L`#$J`$
XM:@8@!V```1A^_R`K``20JP`0*T#_\&=R""L`!@`:9U)(>``"0J<O*P`<3KH*9
XM8$_O``PK0/_L2@9G.%.M_^QM,D*G+RW_["\K`!Q.N@I`2'@``4AM__TO*P`<9
XM3KH'Y$_O`!A*K`5L9@H0+?_]<AJP`6?(+RW_\"\K`!`O*P`<3KKU"$_O``PJI
XM`&`">@!P_[J`9@@(ZP`%`!M@#+JM__!G!@CK``0`&TH&9PXB*P`4)`%$@B="!
XM``Q@&`@K``(`&V<(<@`G00`,8`@B*P`4)T$`#"!K`!`G2``$OH!G*E.K``QMZ
XM$B!K``12JP`$(`<0@'(`$@!@$B`'<@`2`"\++P%A`/V<4$\B`'`PP*L`&&<$M
XM</]@#'#_N(!F!'``8`(@!$S?"/1.74YU#0H`````2.<'$"9O`!0(*P`'`!I6G
XMP$0`2(!(P"X`<##`JP`89PI"JP`(</]@``%&""L`!P`;9Q0(*P`&`!MG#"\+R
XM2'C__TZZ_2Y03TJK`!1F-$*K``@(*P`"`!MG$'`!)T``%$'K`"`G2``08'8OK
XM"TZZ_*A83TJ`9VH(ZP`%`!MP_V```/!*!V=:5*L`""`K``AN4"!K``12JP`$%
XM?``<$"`&<@V0@6<(<@V0@6<D8"Y3JP`(;1`@:P`$4JL`!'``$!!@``"P+PMA$
XM`/\\6$]@``"D".L`!``;</]@``"8(`9@``"2""L``0`;9DX(ZP```!LO*P`4V
XM+RL`$"\K`!Q.N@8:3^\`#"H`2H5J!@CK``4`&TJ%9@8(ZP`$`!M*A6\:2@=GK
XM"B`%1(`G0``(8`0G10`((&L`$"=(``1P,L"K`!AG%DH'9PAP_R=```A@!G``>
XM)T``"'#_8!Q3JP`(;0X@:P`$4JL`!'``$!!@""\+80#^EEA/3-\(X$YU2.<'%
XM`"XO`!`@+`.D4X`L`$I&:S`@!DC`YX!![!98*C`(`$H%9QH(!0`$9A0@!DC`E
XMYX!![!98+S`(!$ZZ#]A83U-&8,PO!TZZ\AA83TS?`.!.=0``````````````%
XM````3E7_^"\+)FP7F"`+9@1'^@!\&5,7K!EK``$7K1EK``(7KD(L%Z]![!>L.
XM*4@7I$'K``-(;?_X+PA.N@(R4$]6@-?`("W_^"(\```.$$ZZ#XHI0!>@$!-G1
XM'AE`%[`9:P`!%[$9:P`"%[)P`!E`%[-R`2E!%YQ@"$(L%[!"K!><0>P7L"E(@
XM%Z@F7TY=3G5#4U0V````````````````````````````````````````````2
XM`````````$Y5__!(YP<0)FT`"$AM__A.N@@Z6$]Z`!`M__DL``8&``I^`+X&#
XM9")P`!`'5(!R!$ZZ#PY*@68(!H4```%N8`8&A0```6U2!V#:?@$0+?_ZO@!DX
XM%'``$`=R`$'L!"L2,`@`VH%2!V#D<``0!E2`<@1.N@[.2H%F#!`M__IR`K`!W
XM8P)2A7``$"W_^U.`VH`@!7(83KH.C"H`<``0+?_\VH`@!7(\3KH.>BH`<``0:
XM+?_]VH`@!7(\3KH.:"H`<``0+?_^VH!.NOZ"VJP7H"`+9P(FA2`%3-\(X$Y=I
XM3G5(YR`P)F\`$"1+$!)G)'(`$@!![`1-"#```1@`9PIR`!(`=""2@F`$<@`2;
XM`!2!4HI@V"`+3-\,!$YU```@+P`((&\`!$Y5__0B3W(*3KH.2`9!`#`2P4J`Q
XM9O`@"1#AO\EF^D(0D(].74YU```@+P`((&\`!$Y5__0B3R(``D$`!P9!`#`2=
XMP>:(9O`@"1#AO\EF^D(0D(].74YU```P,3(S-#4V-S@Y86)C9&5F("\`""!ON
XM``1#[P`$,@`"00`/$OL0W.B(9O(@"2(/6($0X;*)9OI"$)"!3G4@;P`$(DAR3
XM`'``+P(,$``K9P8,$``M9@)22!`8!```,&T2#```"6X,)`'E@=*"TH'2@&#F4
XM#!$`+68"1($D'R`(4X`@;P`(((&0B4YU3E7_Z$CG,S`F;0`()&T`#"E+%[1!=
XM[0`0?@`K2/_L$!)G``#R?``<`%**0>P$30@P``-H`&;H<"6\@&8``*)P);`2G
XM9B1\`"!L%[0<&"E(%[1![`1-"#```V@`9NAP);R`9[P@!V```+!P*K`29PPKA
XM;?_L_^A8K?_L8`B1R%***TC_Z$*M__0O+?_H2&W_]$AZ`(XO"DZZ[Z)/[P`0C
XM*T#_\$J`5L%$`4B!2,%*@6<")$`D+?_T=O^T@V822H%G`E*'2H=O!"`'8$X@8
XM`V!*2H)G!%.L%[1*K?_P9C0@!V`X<``@;!>T$!@K0/_T*4@7M"!M__1#[`1-V
XM(`@(,0`#"`!FWB`M__2PAF<`_Q8@!V`(4H=@`/\,(`=,WPS,3EU.=2\'?@`@A
XM;!>T'A@I2!>T2H=G!"`'8`)P_RX?3G4``"\'+B\`"%*L%[P@!R!L%[@0P"E(<
XM%[@N'TYU3E4``$CG`#`F;0`()&T`#$*L%[PI2Q>X2&T`$"\*2'K_QDZZ]K8@V
XM;!>X0A`@+!>\3.T,`/_X3EU.=4Y5_^A(YP$R+BT`#$J';@9P_V```-)P"+Z`%
XM9`(N`"`'5H`N``)'__PD;0`(("T`"-"'WZP#N$'L`[0F4"M`__`K2/_T(`MGZ
XM``"0($L@*P`$T<!([0$`_^PB;?_PM\EC$"2+)4<`!"QM__0LBG``8':WR68:4
XM+%,DCB`K``0B`-*')4$`!"QM__0LBG``8%BUR&0(GZP#N'#_8$RUR&8J(!-G`
XM#+/`8PB?K`.X</]@.-^K``0@$V<.L\!F"B`I``31JP`$)I%P`&`>*TO_]"MM#
XM_^S_Z"938`#_;B!M__0@BD*2)4<`!'``3-],@$Y=3G4``````````'!A2.<'B
XM,"XO`!@F;P`<+"\`("\'3KH+L%A/)$`@"F8$</]@'B\&+PLO*@`$3KH(Z$_O8
XM``PJ`$JL!6QG!'#_8`(@!4S?#.!.=0``("P$."(\```.74ZZ"D16@`*`?___4
XM_RE`!#A.=2\'+B\`""E'!#@N'TYU``!.5?_D2.</,"9M``@N+0`,0BW__T*L/
XM!6PK;!?4__)Z`[JL`Z1L$B`%YX!![!982K`(`&<$4H5@Z"`L`Z2PA68,<!@IJ
XM0!?4</]@``$@(`7G@$'L%EC1P"1(("T`$&<&"````F<**WP```/L_^Y@""M\6
XM```#[O_N(#P``(``P*P#O+&'"`<``V<,(`<"0/_\+@``1P`"(`=R`\"!2H!G+
XM"%.`9P13@&8&+`=2AF`,<!8I0!?4</]@``"T(`<"@````P!G``"("`<`"F<6*
XM&WP``?__+RW_[B\+3KH(7%!/*`!@/`@'``EF%DAX`^TO"TZZ!_Y03R@`2H1JR
XM!`C'``D(!P`)9QH;?``!__\I;?_R%]0O+?_N+PM.N@B"4$\H`$HM__]G-B`'2
XM<GC2@<"!2H!G*DJ$:R8O!$ZZ",I(>`/M+PM.N@>L3^\`#"@`8`Y(>`/M+PM."
XMN@>:4$\H`$JL!6QG!'#_8`@DAB5$``0@!4S?#/!.74YU````````````````<
XM```@;P`$(F\`""`O``QO%K/(90S1P-/`$R!3@&;Z3G42V%.`9OI.=0``2.<`4
XM,B9L%\`@"V<4)%,B2R`I``@L>``$3J[_+B9*8.B1R"E(%\0I2!?`3-],`$YUF
XM2.</$"XO`!@L+P`<*B\`("\'3KH)9%A/)D`@"V8$</]@'B\%+P8O*P`$3KH&"
XM*$_O``PH`$JL!6QG!'#_8`(@!$S?"/!.=0``2.<!,BXO`!1P#-Z`(`=R`"QXQ
XM``1.KO\Z)D`@"V8$<`!@."='``A%[!?`(&H`!"=(``21R":(2I)F`B2+("H`_
XM!&<$(D`BBR5+``1*K`.H9@0I2P.H0>L`#"`(3-],@$YU````````````````V
XM2.<#,"XO`!1*AVX&<`!@``"D<`B^@&0"+@`@!U:`+@`"1__\1>P#M"92(`MGW
XM0"`K``2PAVTRL(=F#"!3)(B?K`.X(`M@;B`K``20AW((L(%E%B!+T<<DB"1(3
XM)),E0``$GZP#N"`+8$PD2R938+P@!R(L!#S0@5.`3KH'/B(L!#Q.N@<6+`!06
XMAB`&5H`L``)&__PO!DZZ_OY83R9`(`MG$B\&+PM.NOMB+H=A`/]44$]@`G``)
XM3-\,P$YU``````````!P84Y5_^!(YR\2)FT`"$'M__0B""QL%]A.KO]`("W_Q
XM]"X\```'NBP`*T#_\`R&```!;6\>(`=R!$ZZ!KQ*@68(!(8```%N8`8$A@``[
XM`6U2AV#:#(8```%M9A`@!W($3KH&EDJ!9P12AWP`(`8B!P2!```'O!=!``%TG
XM`!0!*T#_\"`"<@1.N@9P2H%F!'`=8`)P'!E`!$%X`"HM__!P#+B`;!YP`$'LL
XM!$`0,$@`L(5N$'``0>P$0!`P2`":@%*$8-P@!2($4H$700`"*T#_\%*`%T``/
XM`R`M__1R!TZZ!AH6@2`M__AR/$ZZ!@X70``$("W_^'(\3KH&`!=!``4@+?_\)
XM<C).N@7R%T``!B`M__QR,DZZ!>32@1=!``=,WTCT3EU.=0```````'!A+P<N9
XM+P`(4JP7T"!L%\Q3J``,;1(B:``$4J@`!"`'$H!R`!(`8!(@!W(`$@`O""\!>
XM3KKQ/E!/(@`N'TYU3E4``$CG`#`F;0`()&T`#$*L%]`I2Q?,2&T`$"\*2'K_M
XMI$ZZ\%PNBTAX__].NO$&("P7T$SM#`#_^$Y=3G4``$Y5__A(YP`P1^P#P"`+E
XM9PQ*JP`89P8D2R938/`@"V8B2'@`(DZZ_7)83R9`2H!F!'``8!PDBW`A<@`@P
XM2Q#!4<C__"\++RT`#"\M``A.N@`63.T,`/_P3EU.=0``````````<&%.5?_P9
XM2.</,"9M``PD;0`02JH`&&<(+PI.N@&R6$\J+`0H?@%P`!`S>``$0`!A9P935
XM0&<&8`QZ`&`&*CP``(``4H=R*[(S>`!7P$0`2(!(P"@`<``0$P1``&%G#@1`V
XM`!%G0EM`9WQ@``"^2'@`#"\\``"!`B\M``A.NOHN3^\`#"P`</^\@&8&<`!@!
XM``#02H1G!G!`T(!@`G`"+@``1T``8```B$J$9P1P`F`"<```0(``2'@`#"\`T
XM+RT`"$ZZ^>I/[P`,+`!P_[R`9@9P`&```(Q*A&<&<$#0@&`"<`$N`&!(2H1G1
XM!'`"8`)P`0!`@```0`$``$`"`$AX``PO`"\M``A.NOFD3^\`#"P`</^\@&8$;
XM<`!@1DJ$9P9P0-"`8`)P`BX`8`1P`&`RD<@E2``0<``E0``4)48`'"5J`!``>
XM!"5```PE0``(2H5F!B`\``"``"('@H`E00`8(`I,WPSP3EU.=0```````'!AR
XM2.</,"9O`!PN+P`@)&\`)"@+4X<L!TJ&:S!3J@`(;0X@:@`$4JH`!'``$!!@\
XM""\*3KKQ@EA/*@!P_[J`9PQ3AB`%%L!P"KJ`9LQ"$[R'9@1P`&`$($0@"$S?P
XM#/!.=0``2.<#$"9O`!`(*P`!`!MG$"\+2'C__TZZ[JQ03RX`8`)^`'`,P*L`:
XM&&842JL`%&<.+RL`%"\K`!!.NO<V4$]"JP`8+RL`'$ZZ`YQ83RP`</^^@&<&+
XM2H9F`G``3-\(P$YU2.<#$"XO`!!'[`/`(`MG-`@K``(`&V8H""L``0`;9R`@=
XM*P`$D*L`$"P`2H9G$B\&+RL`$"\K`!Q.NN463^\`#"938,@O!TZZ\B!83TS?4
XM",!.=0``2.<W$BXO`"`F;P`D+"\`*$JL!81G!$ZZ`Z!"K`5L(@<D"R8&+&P7C
XMV$ZN_]`J`'#_NH!F#DZN_WPI0`5L<`4I0!?4(`5,WTCL3G4``````````'!A<
XM2.<_`BXO`"`L+P`D*B\`*$JL!81G!$ZZ`TQ"K`5L(`53@"(')`8F`"QL%]A.3
XMKO^^*`!P_[B`9@Y.KO]\*4`%;'`6*4`7U"`%2H!G"E.`9PI3@&<,8!@@!F`45
XM(`30AF`.(@=T`"8"+&P7V$ZN_[Y,WT#\3G5(YS<2+B\`("9O`"0L+P`H2JP%#
XMA&<$3KH"V$*L!6PB!R0+)@8L;!?83J[_UBH`</^Z@&8.3J[_?"E`!6QP!2E`"
XM%]0@!4S?2.Q.=0``2.<C$B9O`!@N+P`<2JP%A&<$3KH"D$*L!6PB"R0'+&P7F
XMV$ZN_^(L`$J&9A).KO]\*4`%;'`"*4`7U'#_8`(@!DS?2,1.=0``3E7__$CG^
XM(1(F;0`(2JP%A&<$3KH"2$*L!6PB"W3^+&P7V$ZN_ZPN`$J'9PHB!TZN_Z9P@
XM_V`F(@LD/````^Y.KO_B+@!*AV823J[_?"E`!6QP`BE`%]1P_V`"(`=,WTB$=
XM3EU.=4Y5__Q(YR$2)FT`"$JL!81G!$ZZ`>1"K`5L(@MT_BQL%]A.KO^L+@!*$
XMAV<,(@=.KO^F(@M.KO^X(@LD/````^Y.KO_B+@!*AV823J[_?"E`!6QP`BE`B
XM%]1P_V`"(`=,WTB$3EU.=0``2.<!`BXO``Q*K`6$9P1.N@&`(@<L;!?83J[_!
XMW'``3-]`@$YU2.<P`"0`)@%(0DA#Q,'&P,#!U$-(0D)"T(),WP`,3G5*@&H`J
XM`!Y$@$J!:@``#$2!80``($2!3G5A```81(!$@4YU2H%J```,1(%A```&1(!.U
XM=2\"2$$T`68``")(0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(0C(")!].=2\#(
XM=A`,00"`9```!N&944,,00@`9```!NF964,,02``9```!N6954-*06L```;CT
XMF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(0<3!D()D```(4T/0@63^<@`R`TA#!
XMY[A(0,%!)A\D'TYU2.<!$"XO``PO!TZZ`#Q83R9`(`MF!'#_8"@(*P`$``-G1
XM!G``)H!@&B\K``1.NO[*6$]P`":`2JP%;&<$</]@`G``3-\(@$YU+P<N+P`(E
XM<``I0`5L2H=K(KZL`Z1L'"`'YX!![!982K`(`&<.(`?G@$'L%EC1P"`(8`AP;
XM"2E`%]1P`"X?3G4``$CG`0)P`"(\```P`"QX``1.KO[.+@`"AP``,`!*AV<@\
XM2JP%A&<:(&P%A$Z02H!F`F`.0JP%A$AX`!1.NNX@6$],WT"`3G5AN$YU````E
XM``/L`````0````$```'Z`````@````,````4````"@````````/R```#Z0``P
XM!=I.5?_X2.<W,D/L`61P`"QX``1.KOW8*4```$/L`79P`$ZN_=@I0``$2JP`!
XM`&<$2H!F"DAL`8AA``HP6$]![`#0+&P``$ZN_S0I0`%<9@I(;`&V80`*%%A/O
XM(&P!7"EH`#(63D'L`0XL;```3J[_-"E``6!F"DAL`<QA``GN6$\@;`%@*6@`+
XM,A92D\DL>``$3J[^VB)`(&D`N'+_(T$`N"]``"`O2``D1>P!XB(*)#P```/N=
XM+&P7V$ZN_^(I0`%8(&\`("%O`"0`N"!L%DY#[`!Z<``B`"QL``!.KO\H80`)1
XMF&$`$!YA`!.((FP63G`"+&P`!$ZN_JH@;!9.(7P```````@@;!9.$7P``P`=Y
XM(FP63G`4<@YT6>6*=EO6@RQL``1.KO[.(FP63G`#3J[^JGX48"(B;!9.(`=RH
XM#BQL``1.KO\0(FP63B`'<EO2@4ZN_PIP#MZ`#(<```%R;=9^#F`@(FP63G`4:
XM(@<L;``$3J[_$")L%DYP6>6((@=.KO\*7H=P0D8`OH!MV"!L`5P@:`!6+'@`Q
XM!$ZN_H!@``&F($LP*``8)F@`'"XH`!0\*``@2,8Z*``B2,4_0``@(D@L>``$(
XM3J[^A@R'```"`&8(0J=A``@H6$\,AP``!`!F#C`O`"!R(+!!9@1A``K>#(<`W
XM``0`9DPP+P`@<B&P069"2JP!8&8L0>P!#BQL``!.KO\T*4`!8&8*2&P!ZF$`'
XM"$Y83R!L`6`I:``R%E)A`!)$8!`@;`%@+&P``$ZN_[A"K`%@<!"^@&8*+P4O4
XM!F$``1)03W`(OH!F``#6,"\`(`@```=G``"^("P!4"(L%D:R@&8``(HB+`%4*
XM)"P62K2!9GPT+`K*=E&T0V1,=@`V`M:#=`!![`HH-#`X`"\"+P`O`6$`#21/0
XM[P`,2H!G*C`L"LI20#E`"LIA`!"P,"P*RG)1L$%F:G#_+P`O`&$``)1A``B<!
XM4$]@6"`L`5AG%"(`0>P"`"0(=@<L;!?83J[_T&`^D<@L;```3J[_H&`R("P!,
XM6&<4(@!![`(()`AV!RQL%]A.KO_08!B1R"QL``!.KO^@8`PI;`%0%D8I;`%4#
XM%DIP0+Z`9P9P(+Z`9@I![`!(M\AG`/VB(&P!7"!H`%8L>``$3J[^C"9`(`MF?
XM`/Y&8`#^+DY5__!(YS\"+B\`-"PO`#@@!W(DD(%R#DZZ$[`J`"`&<A>0@7('R
XM3KH3HBX`2H5J!'H`8`AP%KJ`;P(J`$J':@1^`&`(<!:^@&\"+@"ZK`%09@B^0
XMK`%49P`&/")L%DYP`RQL``1.KOZJ+"P!4"`&<@Y.NA.4*`!R%-B!8#X@+`%43
XMYXB0K`%4<@[0@2(`(FP63B`$+&P`!$ZN_Q`@+`%4YXB0K`%4<AS0@2(`(FP6V
XM3B`$3J[_"E*&<`[8@"`L`5!6@+R`;;@L+`%4(`;GB)"&*`!R#MB!8#@@+`%0'
XM<@Y.NA,H<A30@2)L%DXB!"QL``1.KO\0("P!4'(.3KH3#'(PT($B;!9.(@1.V
XMKO\*4H9>A"`L`516@+R`;;X@;!9.(7P```````@@;!9.$7P``P`=(FP63G`"E
XM+&P`!$ZN_JH@+`%4<AA.NA+"(BP!4-"!T(!![`6H2G`(`&98<`Y.NA*J<A70Z
XM@2(L`50D`28"YXN6@G0/UH(D+`%04H(O0``<(`)R#DZZ$H1R$]"!(BP!5%*!B
XM)`'GBI2!<@W4@2(#+T(`*"0`(FP63B`O`!PF+P`H3J[^SB`L`51R&$ZZ$DXBX
XM+`%0T('0@$'L!:I*<`@`9EP@`5*`<@Y.NA(R<A70@2(L`50D`28"YXN6@G0/2
XMUH(D+`%05((O0``<(`)R#DZZ$@QR$]"!(BP!5%*!)`'GBI2!<@W4@2(#+T(`#
XM*"0`(FP63B`O`!PF+P`H3J[^SBPL`512AB`&<AA.NA'2(BP!4-"!T(!![`6HH
XM2G`(`&98<`Y.NA&Z<A70@2(&YXF2AG0/TH(D+`%04H(O0``<(`(O00`@<@Y.P
XMNA&6<A/0@2(L`514@20!YXJ4@7(-U($O0@`H)``B;!9.("\`'"(O`"`F+P`HV
XM3J[^SBPL`512AB`&<AA.NA%:(BP!4-"!T(!![`6J2G`(`&9<(`%2@'(.3KH1<
XM/G(5T($B!N>)DH9T#]*")"P!4%2"+T``'"`"+T$`('(.3KH1&G(3T($B+`%4]
XM5($D`>>*E(%R#=2!+T(`*"0`(FP63B`O`!PB+P`@)B\`*$ZN_LXP+`K*<E&P'
XM068.<``I0`%4*4`!4&```V(I10%0*4<!5")L%DYP`4ZN_JHN+`%0(`=R#DZZ'
XM$+8J`'(4VH%@/B`L`53GB)"L`51R#M"!(@`B;!9.(`4L;``$3J[_$"`L`53G)
XMB)"L`51R'-"!(@`B;!9.(`5.KO\*4H=P#MJ`("P!4%:`OH!MN"XL`50@!^>("
XMD(<J`'(.VH%@."`L`5!R#DZZ$$IR%-"!(FP63B(%+&P`!$ZN_Q`@+`%0<@Y.U
XMNA`N<C#0@2)L%DXB!4ZN_PI2AUZ%("P!5%:`OH!MOB!L%DXA?````!``""!L6
XM%DX1?``#`!T@+`%4<AA.N@_RT*P!4-"`0>P%J$IP"`!F``""<``P+`K*T(!R(
XM`$'L"B@R,`@`<`/"@"`!(FP63BQL``1.KOZJ("P!4'(.3KH/LG(5T($B+`%4R
XM)`$F`N>+EH)T#]:")"P!4%*"+T``'"`"<@Y.N@^,<A/0@2(L`512@20!YXJ4M
XM@7(-U($B`R]"`"@D`")L%DX@+P`<)B\`*$ZN_LX@+`%4<AA.N@]6T*P!4-"`.
XM0>P%JDIP"`!F``"(<``P+`K*T(!R`$'L"B@R,`@`<`S"@.2!(`$B;!9.+&P`%
XM!$ZN_JH@+`%0(@!2@7`.3KH/$'(5T($B+`%4)`$F`N>+EH)T#]:")"P!4%2"#
XM+T``'"`"<@Y.N@[J<A/0@2(L`512@20!YXJ4@7(-U($B`R]"`"@D`")L%DX@L
XM+P`<)B\`*$ZN_LX@+`%44H!R&$ZZ#K+0K`%0T(!![`6H2G`(`&8``(9P`#`L&
XM"LK0@'(`0>P**#(P"`!P,,*`Z($@`2)L%DXL;``$3J[^JB`L`5!R#DZZ#G!R2
XM%="!(BP!5"0!4H(F`N>+EH)T#]:")"P!4%*"+T``'"`"<@Y.N@Y(<A/0@2(LS
XM`514@20!YXJ4@7(-U($B`R]"`"@D`")L%DX@+P`<)B\`*$ZN_LX@+`%44H!R2
XM&$ZZ#A#0K`%0T(!![`6J2G`(`&8``(QP`#`L"LK0@'(`0>P**#(P"`!P8-"`V
XMPH#L@2`!(FP63BQL``1.KOZJ("P!4"(`4H%P#DZZ#<AR%="!(BP!5"0!4H(F)
XM`N>+EH)T#]:")"P!4%2"+T``'"`"<@Y.N@V@<A/0@2(L`514@20!YXJ4@7(-X
XMU($B`R]"`"@D`")L%DX@+P`<)B\`*$ZN_LY,WT#\3EU.=4Y5```O#B`L`5QG>
XM"B!`+&P``$ZN_[@@+`%@9PH@0"QL``!.KO^X("P!6&<*(@`L;!?83J[_W$JL*
XM``1G#")L``0L>``$3J[^8DJL``!G#")L```L>``$3J[^8D*G3KH,]"QM__Q.;
XM74YU3E4``$Y=3G5.50``2'@``6&&3EU.=4CG`#!(;`(0+RP!3$ZZ#*A03R9`X
XM2H!F,$AL`A)AS%A/1^P4WF`40>P"/B)+$MAF_'#_)T``(-;\`"1![!9&M\AE4
XMY&$``%A@3D7L%-Y@."\+2'@`'DAL$]Y.N@R&0>H`("Z(+PI(;`)`2&P3WDZZZ
XM#'A/[P`858!G"DAL`D9A`/]T6$_4_``D0>P61K7(9<`O"TZZ##Q83TS?#`!.L
XM=4CG`#!(;`)B+RP!3$ZZ#`Q03R9`2H!F"DAL`F1A`/\X6$]%[!3>8!@O*@`@@
XM+PI(;`)^+PM.N@OJ3^\`$-3\`"1![!9&M<AEX"\+3KH+YEA/3-\,`$YU2.<SG
XM,G``,"P3T'(`,BP3SG0`-"P3S-2!U(`N`F$`_O"^K!9";P`!+D?L%B)@$"!*2
XM(DL2V&;\)VH`(``@)DI![!3>M\AC"D7K_]R^J@`@;MY![`+N+&P``$ZN_S0DL
XM0"\*(DI![`+"+&P``)7*3J[^,B1?2H!GZ"!J`%9P`!`H``]R`>&A(`$L>``$J
XM3J[^PB!J`%9.KOZ,(D!.KOZ&($HL;```3J[_N$'L`H4B2$H99OQ3B9/((`EGC
XM!"1(8`1%[`,>?`!@&'`@0>P"A;`P:`!F"D'L`H41O`!?:`!2AD'L`H4B2$H9W
XM9OQ3B9/(O(EMUB!*(DL2V&;\)T<`(&$`_JX@+`%89T8B`$'L`R@D"'80+&P7,
XMV$ZN_]!![`*%(DA*&6;\4XF3R"`)4H`F`"(L`5A![`*%)`A.KO_0(BP!6$'L$
XM`SHD"'833J[_T&`*D<@L;```3J[_H&$`!=1,WTS,3G5(YP,`8&1.N@IJ<A=.\
XMN@I2+@%.N@I><A=.N@I&+`%P`#`L"LK0@'(`0>P**#(P"``O`2\&+P=A``+$P
XM3^\`#$J`9\0P+`K*4D`Y0`K*80`&4#`L"LIR4;!!9A!P_R\`+P!A`/8T80`%=
XM9E!/,"P*RG)1L$%EDDS?`,!.=4Y5_^A(YS\P+BT`""9M`!`@!W(83KH*#-"M(
XM``PL`"H&4H4O!2\&80`!."`&<AC0@2@&<AG8@2Z$+P`O0``L80`!("ZO`"PO+
XM!F$``18NA"\%80`!#D_O`!0,K0````$`#&T@(`93@"\`+P9A``#T(`9R%]"!K
XM+H`O+P`H80``Y$_O``QP`;Z`;2`@!G(8D($O`"\&80``S"`&<A>0@2Z`+P5A4
XM``"^3^\`#`RM````%0`,;AX@!E2`+P`O!6$``*0@!G(:T($N@"\$80``ED_OI
XM``QP%;Z`;B(@!G(PT($O`"\O`"1A``!\(`9R,="!+H`O!&$``&Y/[P`,<``KU
XM0/_L<@4@2Q#`4<G__'P`>@!@0D'L!:C1Q21(,!)G,G(`0>P/3#(P6`"RAF8DW
XM<@`R`-*!0>P*S#`P6`!![`K,P/!8`'0`-#,8_B8"UH`W@QC^4H94A0R&```"!
XM0&VV3-\,_$Y=3G5.5?_D2.<_,"XM``@L+0`,(`;0@$'L!:@R,`@`(`?0@$'L.
XM!:@T,`@`M$%F``#N*`=@`C@3>@`Z!-J%0>P/3-'%)D@P$[!$9NH@2R`'.T#_T
XM[B](`"9@&D'L#TPP,'@`<@`R`-*!0>P/3#&$&``[0/_N?@`^+?_NWH=![`],<
XM,#!X`+!M_^YFT"`&.T#_\&`$.U+_\'X`/BW_\-Z'0>P/3-'')$@P$K!M__!F%
XMY"`&.T#_[F`<0>P/3#`P:`!R`#(`TH%![`],,:W_\!@`.T#_[GP`/"W_[MR&^
XM0>P/3#`P:`"P;?_N9LXP+?_PL$1G+D'L"LS1QR9(,A-![`K,-#!8`"8"UD&TC
XM06,,-(1![`K,,8-8`&`((&\`)C"`-H-,WPS\3EU.=4Y5_^1(YR\P+BT`""PMN
XM``PZ+0`2(`=R&$ZZ!X;0AM"`0>P%J-'`)DA*4V8@0>L``B](`"!*4&840^L`T
XM,"])`!Q*468(1>L`,DI29P9P`&```.0@!0)```,V@'(`,@#2@4'L$]93<!@`T
XM(`7D2"(``D$``R!O`"`P@70`-`'4@D'L$]93<"@`Y$@B``)!``,@;P`<,(%T]
XM`#0!U()![!/64W`H`.1(<@`R`'`#PH`T@7``,`'0@$'L$]93<`@`2&W_[B\&O
XM+P=A`/RX3^\`#'@`8"`P-4CN(@!![!/,DG!(`$'L$](Q@4@`0>P3S#&`2`!4%
XMA'`&N(!MVB`'4H`O!B\'+T``)&$``4(@!E*`+H8O+P`D+T``+&$``3`NKP`LX
XM+R\`*&$``20NKP`P+P=A``$:80`#?'`!3.T,]/_(3EU.=4Y5_^A(YR\00J=.Y
XMN@8R+H!.N@8.6$]P`"M`_^@R/`1_0>P%J!#`4<G__'X!1^P**&`Z?`%@+GH!9
XM8")X`6`6(`7E@"(&Z8$D!^V"A(&$@(2$-L)2A'`#N(!OY%*%<`.Z@&_84H9P7
XM`[R`;\Q2AW`#OH!OP'X`8"1.N@7`<E%.N@6HTH%![`HH,#`8`$'L"B@QK`HH2
XM&``Y0`HH4H<,AP```^AMU$)L"LI^`'P`8!A![`K,,;P``6@`(`=![`],,8!HP
XM`%*'5(8,AP```D!MX'`%<@!![!/,$,%1R/_\<`5![!/2$,%1R/_\+@%@#$'LA
XM$]@QO`!L>`!4AW`&OH!M[F$``69,WPCT3EU.=4Y5__Q(YSL"+B\`)"PO`"@@Q
XM;!9.(7P````0``@@;!9.$7P``P`=(`=R&$ZZ!2[0AM"`<@!![`6H,C`(`"`!+
XM(FP63BQL``1.KOZJ(`9R#DZZ!0HB`'05TH(D!^>*E(<F`G@/UH1X(="$>!34[
XMA"]``!@@`2(#)@(B;!9.)"\`&$ZN_LY,WT#<3EU.=4CG,1(B;!9.<``L;``$#
XM3J[^JD'L`TXB;!9.(T@`"!-\``$`'2)L%DYP`"QL``1.KOZ>(FP63G`5<@\DF
XM/````6-V2D8#3J[^SB!L%DY"J``((&P63D(H`!TB;!9.<`$L;``$3J[^JB)L[
XM%DYP`4ZN_IY'[!3>?AY@3"`K`"!*@&\\+P`O"TAL`U)(;!/>3KH$,$_O`!`B]
XM;!9.<#(B!RQL``1.KO\00>P3WB)(2AEF_%.)D\@@"2)L%DY.KO_$UOP`)'`.4
XMWH!![!9&M\AEK$S?2(Q.=4Y5__Q(YS`","P*RG)1L$%D$G(`,@#2@7``0>P*P
XM*#`P&`!@`G``(&P63B%\````$``((&P63A%\``,`'2(`=`/"@B]```P@`2)L[
XM%DXL;``$3J[^JB)L%DX@/````8%R9$8!)#P```&-=E#6@TZN_LX@+P`,Y(`B'
XM`'0#PH(O0``,(`$B;!9.3J[^JB)L%DX@/````8]R9$8!)#P```&;3J[^SB`O[
XM``SD@"(`=`/"@B]```P@`2)L%DY.KOZJ(FP63B`\```!@7)1TH$D/````8UV)
XM6$8#3J[^SB`O``SD@'(#P($B;!9.3J[^JB)L%DX@/````8]R4=*!)#P```&;D
XM3J[^SDS?0`Q.74YU3E7__$CG,Q)*K`%@9P`"F")L%E)P`RQL``1.KOZJ(FP6D
XM4G`*<A1.KO\0(FP64D'L`UQP"$ZN_\0B;!92<`IR'DZN_Q!^`$?L$]A@2B`'.
XM4H`O0``8(FP64BQL``1.KOZJ<``P&R\`2&P#9DAL$]Y.N@)R3^\`#$'L$]XB!
XM2$H99OQ3B9/((`DB;!92+&P`!$ZN_\0N+P`80>P3WK?(9:XB;!92<`,L;``$H
XM3J[^JB)L%E)P"G(R3J[_$")L%E)![`-L<`9.KO_$?``B;!92<`IR/$ZN_Q!^M
XM`$?L$\Q@4B`'4H`O0``8(FP64BQL``1.KOZJ<``P$]R`<@`R`"\!2&P#=$AL\
XM$]Y.N@'<3^\`#$'L$]XB2$H99OQ3B9/((`DB;!92+&P`!$ZN_\0N+P`85(M!S
XM[!/2M\AEIG``,"P3W'(`,BP3VG0`-"P3V"8"UH'6@"`#<FQ.N@&@T(`R+!/<N
XMPL$V+!/:QL/$PM2#U(&4@"X"!H<``(BP9Q`@!G)D3KH!>"('3KH!-F`"<&0O7
XM0``8(FP64G`#+&P`!$ZN_JHO+P`8+P9(;`-Z2&P3WDZZ`3A/[P`0(FP64G`*!
XM<D8L;``$3J[_$$'L$]XB2$H99OQ3B9/((`DB;!923J[_Q")L%E)P"G):3J[_X
XM$")L%E)![`.0<`9.KO_$?``B;!92<`IR9$ZN_Q!^`$?L$])@4B`'4H`O0``80
XM(FP64BQL``1.KOZJ<``P$]R`<@`R`"\!2&P#F$AL$]Y.N@"P3^\`#$'L$]XB/
XM2$H99OQ3B9/((`DB;!92+&P`!$ZN_\0N+P`85(M![!/8M\AEIB)L%E)P`RQLU
XM``1.KOZJ+P9(;`.>2&P3WDZZ`&8B;!92<`IR;BQL``1.KO\00>P3WB)(2AEF-
XM_%.)D\@@"2)L%E).KO_$3.U(S/_D3EU.=0``3OD``!4@3OD``!]T3OD``!HD*
XM3OD``!GD3OD``!4$3OD``!`T3OD``!Q43OD``!RT3OD``!.*3OD``!OT3OD`^
XM`!(T3OD``!]4```#[`````P````````74@``%R(``!=````7.@``%S0``!=&M
XM```77@``%U@``!<N```73```%V0``!<H````!0````(``!.0```2'@``!U@`_
XM``1Z````_`````````/R0``#Z@````@1$41$$1%$1!$11$01$41$________&
XM_____________P```_(```/J```!50````````````````!!````00`9````)
XM&0````#_____`P``!0````@`````4F5S=&%R=``#``$```4`!P`````````L&
XM```````````!;@!K`$``&`````$``0```!P`````````-```````````````$
XM````3F5X=#H``P`!``%N`(H`````````=`````!-;W-A:6,L($%M:6=A(%9EL
XM<G-I;VX@8GD@3&]R96X@2BX@4FET=&QE`%-U;B!&96(@,C0@,#0Z,S8Z,3@@%
XM,3DY,0``%``*`;@`O``!```&6``"$@X```!(`````````(X```````````'"!
XM`+P!P@"\``%-;W-A:6,@4V-O<F4```'1``H`J@!X``$```````(`!@``````[
XM```````!`````````````<(`O`'"`+P``6UO<V%I8RYS8V]R97,````!/@``X
XM````````````````````````:6YT=6ET:6]N+FQI8G)A<GD`9W)A<&AI8W,N%
XM;&EB<F%R>0``0V%N)W0@;W!E;B!);G1U:71I;VX@86YD+V]R($=R87!H:6-S+
XM($QI8G)A<GDN`$-A;B=T(&]P96X@82!W:6YD;W<N``!#86XG="!O<&5N(&$@I
XM=VEN9&]W+@``<W!E86LZ``!#86XG="!O<&5N(&$@=VEN9&]W+@``3F\@5V%Y(
XM(0!5;BUD;R$``'(`=6YA8FQE('1O(&]P96X@<V-O<F4@9FEL93L@8W)E871I2
XM;F<@;F5W(&]N90`N`"5S("5D`&EN8V]M<&QE=&4@<V-O<F4@9FEL92!R96%DX
XM``!W`'5N86)L92!T;R!O<&5N('-C;W)E(&9I;&4`)7,@)60*`%EO=7(@3F%MU
XM92!(97)E``````````````````*%`````````!@`````````````````````H
XM``````````````````0``@"```D```(!``0````````````````````````"8
XMG@````````!D`%H`C``-__\```!```$0`````L(`````````````````````(
XM`````````````4%N;VYY;6]U<P!#;VYG<F%T=6QA=&EO;G,A``!9;W4@9V]T/
XM(&$@:&D@<V-O<F4N`%55JJHE+3(T<R`E-60`=&\@<&QA>3H``"4U9"```'1O7
XM=&%L.@``)35D(```)34N-60@("!996EL9"`E,RXS9"4``'!I96-E.@``)35DQ
XM(```)35D````````*`````````````````````````````"``````^(`````K
XM``````````````````````````````````````0$````````````````````(
XM`````````````````````````````````````````````````````````````
XM``````````"``!\<'QX?'A\?'A\>'P````$```0`'QP?'A\>'Q\>'QX?`"`@?
XM("`@("`@("@H*"@H("`@("`@("`@("`@("`@("`@2!`0$!`0$!`0$!`0$!`00
XM$(2$A(2$A(2$A(00$!`0$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`0$02
XM$!`0$!""@H*"@H("`@("`@("`@("`@("`@("`@("`A`0$!`@("`@("`@("`@$
XM*"@H*"@@("`@("`@("`@("`@("`@("!($!`0$!`0$!`0$!`0$!`0A(2$A(2$8
XMA(2$A!`0$!`0$!"!@8&!@8$!`0$!`0$!`0$!`0$!`0$!`0$!`1`0$!`0$(*"^
XM@H*"@@("`@("`@("`@("`@("`@("`@("$!`0$"````````(````#[`````X`/
XM```#```#X@```\````,````"Y````IX```%,```!*````.H```#B````A@``\
X6`&(```!:````0````"0````````#\IX`S
X``
Xend
Xsize 16132
END_OF_FILE
if test 22624 -ne `wc -c <'mosaic.uu'`; then
    echo shar: \"'mosaic.uu'\" unpacked with wrong size!
fi
# end of 'mosaic.uu'
fi
if test -f 'readme' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'readme'\"
else
echo shar: Extracting \"'readme'\" \(2054 characters\)
sed "s/^X//" >'readme' <<'END_OF_FILE'
X                README file for mosaic, version 1.0
X                Kirk Johnson
X                January 1991
X
X		Redone for Amiga version by
X		Loren J. Rittle
X		Sun Feb 24 06:32:37 1991
X
X		Enhanced ? by Stephen Orr
X		SandIsoft
X		March & July 1991
X		revisions marked in code and docs (SO)
X
XMANIFEST:
X
X    README		this file
X    mosaic		the Amiga executable image
X    mosaic.[ch]		source code
X    mosaic.man		UNIX man page
X    mosaic.scores	prototype high score file
X
X
XINSTALLATION NOTES:
X
X    [to remake from source `lc -L [-v -O -rr] mosaic.c']
X    copy mosaic <your games directory>
X    copy mosaic.scores <your games directory>
X
X
XABOUT THE HIGH SCORE FILE:
X[I don't think this applies on the Amiga... yet!]
X
X    Mosaic keeps a list of high scores in a simple text file; all
X    users need to have read/write access to this file. You should take
X    care not to put the high score file in a place some users will not
X    have read/write access to.
X
X    After installing mosaic, you may want to double check that other
X    users can get at the high score file by having them play a game and
X    ensuring that their scores appear in the high score file.
X
X    This new version allows you to enter your name into the high score
X    table. (SO)
X
X    This new version reports 'yield' statistics to tell you how
X    well you are fairing, 1% is damn hard to get (bad), 100% is
X    technicaly impossible.  My personal best is 48% (almost 17,000
X    points !!)
X
XMANUAL PAGE:
X
X    Most of it does not apply to the Amiga version...
X
X
XAUTHOR:
X
X    Mosaic was written by Kirk Johnson <tuna@athena.mit.edu>. It is
X    based on Joshua Klayman's PC/MS-DOS shareware game of the same
X    name. This version is a complete rewrite encompasing only the
X    basic functionality of the original.
X
X    X version ported to the Amiga by Loren J. Rittle.
X    Internet E-Mail address: l-rittle@uiuc.edu
X
X    Enhancements marked in the code (SO) by
X    Stephen Orr (SandIsoft)
X    e-mail sjorr@NSQ.UUCP, sjorr@cbmtor.UUCP
X    BIX: sjorr
X
X    Bug reports and suggestions are welcome.
END_OF_FILE
if test 2054 -ne `wc -c <'readme'`; then
    echo shar: \"'readme'\" unpacked with wrong size!
fi
# end of 'readme'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.
