Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!utgpu!water!watmath!clyde!cbosgd!ucbvax!ucbcad!ames!ll-xn!mit-eddie!uw-beaver!tektronix!tekgen!tekred!games-request
From: games-request@tekred.UUCP
Newsgroups: comp.sources.games
Subject: v01i082:  xconq - multiplayer strategy game for X-windows, Part02/07
Message-ID: <1384@tekred.TEK.COM>
Date: Thu, 9-Jul-87 20:53:13 EDT
Article-I.D.: tekred.1384
Posted: Thu Jul  9 20:53:13 1987
Date-Received: Sun, 12-Jul-87 07:44:23 EDT
Sender: billr@tekred.TEK.COM
Lines: 1388
Approved: billr@tekred.TEK.COM

Submitted by: "Stanley T. Shebs" 
Comp.sources.games: Volume 1, Issue 82
Archive-name: xconq/Part02


#! /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 mkmap.6 <<'END_OF_mkmap.6'
X.TH MKMAP 6 Utah
X.SH NAME
Xmkmap - random map generator
X.SH SYNOPSIS
X.B mkmap
Xwidth height [+][bcfshad]*[2-7]
X.SH DESCRIPTION
X.I Mkmap
Xis used by
X.I xconq(6)
Xto generate random world maps complete with randomly
Xnamed cities.  The resulting map is written to standard output, in a format
Xunderstood by
X.I xconq.
XThe output can also be piped into
X.I xmap(6)
Xfor display.  The width and height are integer values, between 20 and
X299, inclusive.
X.PP
XThe optional argument is a key to enable/disable various processing stages
Xwithin the generator.  The + sign indicates that the remainder of the
Xkey lists the stages that are enabled; otherwise, the key lists
Xstages to be disabled.
X.TP 5
X.B b
XControl creation of blobs prior to fractal subdivision.
X.TP 5
X.B c
XControl creation of curves prior to fractal subdivision.
X.TP 5
X.B f
XControl fractal subdivision.
X.TP 5
X.B s
XControl smoothing after subdivision.
X.TP 5
X.B h
XControl histogram computation.
X.TP 5
X.B a
XControl anomaly fixup.
X.TP
X.B d
XSuppress final map generation and produce a relief map instead.
XThe relief map is tagged differently and will be recognized as such by
X.I xmap(6);
Xbut
X.I xconq(6)
Xwill simply fail.
X.TP
X.B 2-7
XPlace exactly as many large cities on the map as given by the number.
XOtherwise, the number of cities is a fixed percentage of the map size.
X.PP
XThe keys are intended for debugging and testing the generation algorithms,
Xalthough they could be used to generate (very) unusual maps.
X.SH AUTHOR
XStan Shebs (shebs@cs.utah.edu)
X.SH "SEE ALSO"
Xxconq(6), xmap(6)
X.SH DIAGNOSTICS
XWill complain if there are insufficient city names to go around; this
Xhappens only on very large maps.
X.SH BUGS
XThe fractal algorithm has a persistent tendency to generate
X"Mediterranean worlds" or "Pangaean worlds", in which the entire map is
Xcharacterized by having either a huge sea or huge landmass in the middle.
XAttempts to fix this have been only partly successful.
X
XNot all combinations of keys will work.  The serious experimenter
Xshould consult the source code to understand what will work.
X
END_OF_mkmap.6
if test 2051 -ne `wc -c mkmap.c <<'END_OF_mkmap.c'
X/* Copyright (c) 1987  Stanley T. Shebs, University of Utah. */
X/* This program may be used, copied, modified, and redistributed freely */
X/* for noncommercial purposes, so long as this notice remains intact. */
X
X/* RCS $Header: mkmap.c,v 1.2 87/06/06 20:04:49 shebs Exp $ */
X
X/* This program uses a fractal terrain generation method adapted from the */
X/* Carpenter et al subdivision algorithms (CACM June 82).  This rendition */
X/* has been integerized for speed and includes some pre-/post-processing */
X/* steps to produce maps more suitable for conquest. */
X
X#include 
X#include 
X
X#define TRUE (1)
X#define FALSE (0)
X
X#ifndef BSD
X#define index strchr
X#endif BSD
X
X/* This is just the collection of names for random cities. */
X
X#include "mkmap.h"
X
X/* Largest map allowed. */
X
X#define SIZE 300 
X 
X#define CONTOURS 64 
X#define WCONTOURS 4
X 
X#define MAXALT 16384
X#define BUCKETS 1024
X#define BUCKSIZE 16
X
X/* Special elevations being used as flags - outside allowed range */
X
X#define TOWN 32001
X#define CITY 32002
X
X#define avg(a,b) (((a) + (b)) / 2)
X
X#define abs(a) (((a) >= 0) ? (a) : -(a))
X
X#define sgn(a) (((a) < 0) ? -1 : (((a) > 0) ? 1 : 0))
X
X#define random(n) (rand() % (n))
X
X#define init_random() (srand(getpid()))
X
X#define flip_coin() (random(2))
X
Xint cnameused[MAXCITYNAMES];
X
Xint world[SIZE][SIZE], height, width, aux[SIZE][SIZE];
Xint water[SIZE][SIZE];
Xint histo[BUCKETS], contours[CONTOURS], wcontours[4];
Xint sealevel, mtnlevel, icelevel, desertlevel, forestlevel;
Xint curvize, blockize, fractalize, smoothout, histify, deanomalize;
Xint dumpraw;
Xint numtowns, numcities, rawnum, numnames;
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X    int deflt = FALSE;
X
X    curvize = blockize = fractalize = smoothout = histify = deanomalize = TRUE;
X    dumpraw = FALSE;
X    rawnum = 0;
X
X    switch (argc-1) {
X    case 3:
X	if (index(argv[3], '+') != NULL) {
X	    blockize = fractalize = smoothout = histify = deanomalize = FALSE;
X	    deflt = TRUE;
X	}
X	if (index(argv[3], 'b') != NULL) blockize = deflt;
X	if (index(argv[3], 'c') != NULL) curvize = deflt;
X	if (index(argv[3], 'f') != NULL) fractalize = deflt;
X	if (index(argv[3], 's') != NULL) smoothout = deflt;
X	if (index(argv[3], 'h') != NULL) histify = deflt;
X	if (index(argv[3], 'a') != NULL) deanomalize = deflt;
X	if (index(argv[3], 'd') != NULL) dumpraw = TRUE;
X	if (index(argv[3], '2') != NULL) rawnum = 2;
X	if (index(argv[3], '3') != NULL) rawnum = 3;
X	if (index(argv[3], '4') != NULL) rawnum = 4;
X	if (index(argv[3], '5') != NULL) rawnum = 5;
X	if (index(argv[3], '6') != NULL) rawnum = 6;
X	if (index(argv[3], '7') != NULL) rawnum = 7;
X    case 2:
X	width = atoi(argv[1]);
X	height = atoi(argv[2]);
X	break;
X    default:
X	fprintf(stderr, "Usage: mkmap width height [+][bcfshad]*[2-7]\n");
X	exit(1);
X    }
X    if (width < 20 || height < 20 || width >= SIZE || height >= SIZE) {
X	fprintf(stderr, "Cannot generate a %dx%d map\n", width, height);
X	exit(1);
X    }
X    numtowns = width * height / 100;
X    numcities = numtowns / 5;
X    if (rawnum) numcities = rawnum;
X    init_random();
X    init_map(world, 0);
X    if (blockize) {
X	add_blocks(world);
X	limit_map(world, MAXALT, 0);
X	if (smoothout) smooth_map(world);
X    }
X    if (curvize) {
X	add_curves(world);
X	limit_map(world, MAXALT, 0);
X/*	if (smoothout) smooth_map(world); */
X    }
X    if (fractalize) {
X	init_map(aux, MAXALT/4);
X	gen_fractal(aux, MAXALT/4, .8);
X	limit_map(aux, MAXALT, 0);
X	add_maps(world, aux, world);
X    }
X    if (smoothout) smooth_map(world);
X    limit_map(world, MAXALT, 0);
X    sealevel = 0;
X    mtnlevel = 32000;
X    if (histify)
X	set_levels(world, &sealevel, .7, &mtnlevel, .95, contours, CONTOURS);
X    icelevel = mtnlevel + 2000;
X    add_border(world, icelevel);
X    if (deanomalize) reduce_fragments();
X    init_map(water, MAXALT/2);
X    gen_fractal(water, MAXALT/2, .6);
X    desertlevel = 0;
X    forestlevel = 32000;
X    if (histify)
X	set_levels(water, &desertlevel, .2, &forestlevel, .8, wcontours, 4);
X    water_coasts();
X    write_header();
X    if (dumpraw) {
X	dump_relief_map();
X    } else {
X	place_cities();
X	dump_map();
X    }
X}
X
X/* fill in with some initial values */
X
Xinit_map(map, value)
Xint map[SIZE][SIZE], value;
X{
X    int x, y;
X    
X    for (x = 0; x < width; ++x)
X	for (y = 0; y < height; ++y)
X	    map[x][y] = value;
X}
X
X/* Put in random large blobs.  Should be polygons instead of rectangles. */
X
Xadd_blocks(map)
Xint map[SIZE][SIZE];
X{
X    int i, x, y, x0, x1, x2, y0, y1, y2, dx, dy, flag, elev, blocks;
X    float relelev;
X
X    blocks = width * height / 200;
X    for (i = 0; i < blocks; ++i) {
X	dx = random(width/5) + 2;
X	x0 = random(width - dx);
X	x1 = x0 + dx;
X	x2 = x0 + dx / 2;
X	dy = random(height/5) + 2;
X	y0 = random(height - dy);
X	y1 = y0 + dy;
X	y2 = y0 + dy / 2;
X	flag = flip_coin() ? 1 : -1;
X	for (y = y0; y < y1; ++y) {
X	    for (x = x0; x < x1; ++x) {
X		relelev = ((abs(x - x2) / ((float) dx)) +
X			   (abs(y - y2) / ((float) dy)));
X		elev = MAXALT/32 - relelev * MAXALT/24;
X		map[x][y] += flag * (MAXALT/32 + elev);
X	    }
X	}
X    }
X    /* add some spikes which will get averaged in */
X    flag = (height / 40) * (width / 50);
X    for (i = 0; i < flag; ++i) {
X	x0 = random(width-2)+1;  y0 = random(height-2)+1;
X	map[x0][y0] = MAXALT/2;
X    }
X}
X
Xfloat
Xexpt(f, i)
Xfloat f;
Xint i;
X{
X    float rslt;
X
X    rslt = 1;
X    while (i-- > 0) rslt = rslt * f;
X    return rslt;
X}
X
X/* Put in random Bezier mountain chains.  Number and size are scaled to */
X/* the size of the map. */
X
Xadd_curves(map)
Xint map[SIZE][SIZE];
X{
X    int i, j, k, n, x, y, flag, curves;
X    float u, f, cpx[4], cpy[4], px[SIZE], py[SIZE];
X
X    curves = width * height / 2000;
X    for (n = 0; n < curves; ++n) {
X	cpx[0] = 1.0 * (random(width-2)+1);
X	cpy[0] = 1.0 * (random(height-2)+1);
X	for (j = 1; j < 4; ++j) {
X	    cpx[j] = cpx[0] + (random(height) - height/2);
X	    if (cpx[j] > width-1) cpx[j] = width-1;
X	    if (cpx[j] < 0) cpx[j] = 0;
X	    cpy[j] = cpy[0] + (random(height) - height/2);
X	    if (cpy[j] > height-1) cpy[j] = height-1;
X	    if (cpy[j] < 0) cpy[j] = 0;
X	}
X	for (i = 0; i < 40; ++i) {
X	    u = (1.0 * i) / 40;
X	    px[i] = py[i] = 0.0;
X	    for (j = 0; j < 4; ++j) {
X		f = comb(3,j)*expt(u,j)*expt(1-u,3-j);
X		px[i] += cpx[j]*f; 
X		py[i] += cpy[j]*f;
X	    }
X	}
X	flag = random(3) ? 1 : -1;
X	for (i = 0; i < 40; ++i) {
X	    x = px[i];  y = py[i];
X/*	    map[x][y] += flag * MAXALT/4; */
X	    map[x][y] = flag * MAXALT/4 + flip_coin() * MAXALT/16;
X	}
X    }
X}
X
Xcomb(n, i)
Xint n, i;
X{
X    if (i <= 0) return 1;
X    else if (n <= 0) return 0;
X    else return (comb(n-1, i) + comb(n-1,i-1));
X}
X
X/* Ensure that map values stay within given range */
X
Xlimit_map(map, hi, lo)
Xint map[SIZE][SIZE], hi, lo;
X{
X    int x, y;
X    
X    for (x = 0; x < width; ++x) {
X	for (y = 0; y < height; ++y) {
X	    if (map[x][y] > hi) map[x][y] = hi;
X	    if (map[x][y] < lo) map[x][y] = lo;
X	}
X    }
X}
X
X/* Put a fractal surface into a given array */
X
Xgen_fractal(map, range, scale)
Xint map[SIZE][SIZE], range;
Xfloat scale;
X{
X    subdivide(map, 0, 0, width-1, height-1, range, scale);
X}
X
X/* Recursive subdivision step of fractalization */
X
Xsubdivide(map, x0, y0, x2, y2, range, scale)
Xint map[SIZE][SIZE], x0, y0, x2, y2, range;
Xfloat scale;
X{
X    int dx, dy, x1a, y1a, x1b, y1b, newmax, wx2, avalt, fudge, var;
X
X    dx = x2 - x0;  dy = y2 - y0;
X    x1a = (x0 + x2) / 2;  y1a = (y0 + y2) / 2;
X    x1b = x1a + dx % 2;   y1b = y1a + dy % 2;
X    wx2 = x2 % (width-1);
X    avalt = (map[x0][y0] + map[x0][y2] + map[wx2][y0] + map[wx2][y2]) / 4;
X    var = normal(range);
X    map[x1a][y1a] = avalt + var;
X    map[x1b][y1a] = avalt + var;
X    map[x1a][y1b] = avalt + var;
X    map[x1b][y1b] = avalt + var;
X    fudge = range / 10;
X    map[x0][y1a] = avg(map[x0][y0], map[x0][y2]) + normal(fudge);
X    map[x0][y1b] = avg(map[x0][y0], map[x0][y2]) + normal(fudge);
X    map[x1a][y0] = avg(map[x0][y0], map[wx2][y0]) + normal(fudge);
X    map[x1b][y0] = avg(map[x0][y0], map[wx2][y0]) + normal(fudge);
X    map[x1a][y2] = avg(map[x0][y2], map[wx2][y2]) + normal(fudge);
X    map[x1b][y2] = avg(map[x0][y2], map[wx2][y2]) + normal(fudge);
X    map[wx2][y1a] = avg(map[wx2][y0], map[wx2][y2]) + normal(fudge);
X    map[wx2][y1b] = avg(map[wx2][y0], map[wx2][y2]) + normal(fudge);
X
X    newmax = range * scale;
X    if (dx < 4 && dy < 4) {
X	return;
X    } else if ((dx == 2 || dx == 3) && dy > 3) {
X	subdivide(map, x0, y0, x2, y1a, newmax, scale);
X	subdivide(map, x0, y1b, x2, y2, newmax, scale);
X    } else if ((dy == 2 || dy == 3) && dx > 3) {
X	subdivide(map, x0, y0, x1a, y2, newmax, scale);
X	subdivide(map, x1b, y0, x2, y2, newmax, scale);
X    } else {
X	subdivide(map, x0, y0,   x1a, y1a, newmax, scale);
X	subdivide(map, x0, y1b,  x1a, y2,  newmax, scale);
X	subdivide(map, x1b, y0,  x2, y1a,  newmax, scale);
X	subdivide(map, x1b, y1b, x2, y2,   newmax, scale);
X    }
X}
X
X/* compute a normal (actually binomial) distribution */
X
Xnormal(range)
Xint range;
X{
X    int k, sum = 0;
X
X    for (k = 0; k < 10; ++k)
X	sum += random(range * 2) - range;
X    return sum / 10;
X}
X
X/* form point-by-point sum of two maps */
X
Xadd_maps(m1, m2, rslt)
Xint m1[SIZE][SIZE], m2[SIZE][SIZE], rslt[SIZE][SIZE];
X{
X    int x, y;
X
X    for (x = 0; x < width; ++x) {
X	for (y = 0; y < height; ++y) {
X	    rslt[x][y] = m1[x][y] + m2[x][y];
X	}
X    }
X}
X
X/* average out things to keep peaks from getting too sharp */
X
Xsmooth_map(map)
Xint map[SIZE][SIZE];
X{
X    int x, y, ix, iy, sum;
X
X    for (x = 1; x < width-1; ++x) {
X	for (y = 1; y < height-1; ++y) {
X	    sum = 0;
X	    for (ix = x-1; ix <= x+1; ++ix)
X		for (iy = y-1; iy <= y+1; ++iy)
X		    sum += map[ix][iy];
X	    aux[x][y] = sum / 9;
X	}
X    }
X    for (x = 1; x < width-1; ++x) {
X	for (y = 1; y < height-1; ++y) {
X	    map[x][y] = aux[x][y];
X	}
X    }
X}
X
X/* histogram and use to compute sea level and mountain level */
X
Xset_levels(map, lev1p, level1, lev2p, level2, contours, numconts)
Xint map[SIZE][SIZE], *lev1p, *lev2p, contours[], numconts;
Xfloat level1, level2;
X{
X    int i, k, x, y, sum;
X    
X    for (i = 0; i < BUCKETS; ++i)
X	histo[i] = 0;
X    for (k = 0; k < numconts; ++k)
X	contours[k] = 0;
X    for (x = 0; x < width; ++x) {
X	for (y = 0; y < height; ++y) {
X	    ++histo[(map[x][y]/BUCKSIZE)];
X	}
X    }
X    sum = 0;
X    k = 0;
X    for (i = 0; i < BUCKETS; ++i) {
X	sum += histo[i];
X	if (sum > ((k+1) / (float) numconts * width * height))
X	    contours[k++] = i * BUCKSIZE;
X	if (k >= numconts) break;
X    }
X    sum = 0;
X    for (i = 0; i < BUCKETS; ++i) {
X	sum += histo[i];
X	if (sum > (level1 * width * height)) {
X	    *lev1p = i * BUCKSIZE;
X	    break;
X	}
X    }
X    sum = 0;
X    for (i = 0; i < BUCKETS; ++i) {
X	sum += histo[i];
X	if (sum > (level2 * width * height)) {
X	    *lev2p = i * BUCKSIZE;
X	    break;
X	}
X    }
X}
X
X/* Make sea for northern and southern edges of world */
X
Xadd_border(map, value)
Xint map[SIZE][SIZE], value;
X{
X    int x;
X
X    for (x = 0; x < width; ++x) {
X	map[x][0] = value;
X	map[x][height-1] = value;
X    }
X}
X
X/* Correct some anomalous conditions that fractals don't care about, */
X/* but which are undesirable for the game */
X
Xreduce_fragments()
X{
X    int x, y;
X
X    for (y = 1; y < height-1; ++y) {
X	for (x = 0; x < width; ++x) {
X	    /* Remove most of single-square islands */
X	    if (small_island(x, y) && random(2))
X		world[x][y] = sealevel - 100;
X	    /* Remove most of single-square lakes */
X	    if (small_lake(x, y) && random(2))
X		world[x][y] = avg(avg(world[x-1][y], world[x+1][y]),
X			      avg(world[x][y-1], world[x][y+1]));
X	    /* Diagonals of land and sea are strange - get rid of most */
X	    if (world[x][y] > sealevel && world[x+1][y+1] > sealevel &&
X		world[x+1][y] < sealevel && world[x][y+1] < sealevel)
X		if (flip_coin())
X		    world[x][y] = sealevel - 100;
X	        else
X		    world[x+1][y+1] = sealevel - 100;
X	    /* Diagonals in opposite direction */
X	    if (world[x][y] < sealevel && world[x+1][y+1] < sealevel &&
X		world[x+1][y] > sealevel && world[x][y+1] > sealevel) {
X		if (flip_coin())
X		    world[x+1][y] = sealevel - 100;
X	        else
X		    world[x][y+1] = sealevel - 100;
X	    }
X	}
X    }
X}
X
X/* predicate to detect a single-square island */
X
Xsmall_island(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    if (world[x][y] < sealevel) return FALSE;
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (ix != x && iy != y && world[ix][iy] > sealevel) return FALSE;
X    return TRUE;
X}    
X
X/* predicate to detect a single-square lake */
X
Xsmall_lake(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    if (world[x][y] > sealevel) return FALSE;
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (ix != x && iy != y && world[ix][iy] < sealevel) return FALSE;
X    return TRUE;
X}    
X
X/* Some places along coast line are arable */
X
Xwater_coasts()
X{
X    int x, y;
X
X    for (y = 0; y < height; ++y) {
X	for (x = 0; x < width; ++x) {
X	    if (adj_water(x, y) && water[x][y] < desertlevel && !random(4))
X		water[x][y] = desertlevel + 10;
X	}
X    }
X}
X
Xadj_water(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (world[ix][iy] < sealevel) return TRUE;
X    return FALSE;
X}    
X    
X/* place towns and cities */
X
Xplace_cities()
X{
X    int i, j, x, y, dx, dy, dx2, dy2, tries;
X
X    numnames = numcities;
X    for (i = 0; i < numcities; ++i) {
X	while (TRUE) {
X	    x = random(width-4)+2;  y = random(height-4)+2;
X	    if (!(world[x][y] < sealevel || world[x][y] >= icelevel ||
X		  close_city(x, y) ||
X		  (inland(x, y) && random(4)) || in_waste(x, y)))
X		break;
X	}
X	world[x][y] = CITY;
X	for (j = 0; j < 5; ++j) {
X	    tries = 0;
X	    while (tries++ < 500) {
X		dx = random(7)-3;  dy = random(7)-3;
X		if ((abs(dx) > 1 || abs(dy) > 1) &&
X		    x+dx > 0 && y+dy > 0 && x+dx < width && y+dy < height &&
X		    (world[x+dx][y+dy] > sealevel || !random(4)) &&
X		    (world[x+dx][y+dy] < icelevel) &&
X		    (!adj_city(x+dx, y+dy)))
X		    break;
X	    }
X	    world[x+dx][y+dy] = TOWN;
X	    dx2 = sgn(dx);  dy2 = sgn(dy);
X	    if (world[x+dx-dx2][y+dy-dy2] != TOWN)
X		world[x+dx-dx2][y+dy-dy2] = sealevel + 100;
X	}
X	numnames += 5;
X    }
X    numtowns -= 5 * numcities;  /* makes numtowns = 0 all the time? */
X    if (numtowns < 0) numtowns = 0;
X    numtowns += (width * height) / 500;
X    numnames += numtowns;
X    for (i = 0; i < numtowns; ++i) {
X	while (TRUE) {
X	    x = random(width);  y = random(height);
X	    if (!(world[x][y] < sealevel || world[x][y] >= icelevel ||
X		  adj_city(x, y) ||
X		  (inland(x, y) && random(4)) ||
X		  (in_waste(x, y) && random(10))))
X		break;
X	}
X	world[x][y] = TOWN;
X    }
X    for (y = 0; y < height; ++y) {
X	for (x = 0; x < width; ++x) {
X	    if (world[x][y] == CITY || world[x][y] == TOWN && !random(4))
X		deforest_vicinity(x, y);
X	}
X    }
X}
X
Xadj_city(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (world[ix][iy] == CITY || world[ix][iy] == TOWN) return TRUE;
X    return FALSE;
X}
X
Xclose_city(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    for (ix = x-4; ix <= x+4; ++ix)
X	for (iy = y-4; iy <= y+4; ++iy)
X	    if (world[ix][iy] == CITY || world[ix][iy] == TOWN) return TRUE;
X    return FALSE;
X}
X
Xin_waste(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (world[ix][iy] < mtnlevel && water[ix][iy] > desertlevel)
X		return FALSE;
X    return TRUE;
X}
X
Xinland(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (world[ix][iy] < sealevel) return FALSE;
X    return TRUE;
X}
X
Xdeforest_vicinity(x, y)
Xint x, y;
X{
X    int ix, iy;
X
X    for (ix = x-1; ix <= x+1; ++ix)
X	for (iy = y-1; iy <= y+1; ++iy)
X	    if (flip_coin())
X		water[ix][iy] = forestlevel - 10;
X}
X	
X/* print final result */
X
X/* Decrementing the width seems strange, but it makes reading work */
X
Xwrite_header()
X{
X    printf("%c %d %d 0 0 100\n", (dumpraw ? 'R' : 'M'), width, height);
X}
X
Xdump_map()
X{
X    int i, n, x, y;
X
X    for (y = height-1; y >= 0; --y) {
X	for (x = 0; x < width; ++x) {
X	    printf("%c", terrain(x, y));
X	}
X	printf("\n");
X    }
X    /* Now dump out names of cities */
X    for (i = 0; i < MAXCITYNAMES; ++i)
X	cnameused[i] = FALSE;
X    if (numnames > MAXCITYNAMES) {
X	fprintf(stderr, "Not enough names for %d places\n", numnames);
X	exit(1);
X    }
X    for (i = 0; i < numnames; ++i) {
X	while (cnameused[(n = rand() % MAXCITYNAMES)]);
X	cnameused[n] = TRUE;
X	printf("%s\n", citynames[n]);
X    }
X}
X
Xterrain(x, y)
Xint x, y;
X{
X    int elev, moisture;
X
X    elev = world[x][y];
X    moisture = water[x][y];
X
X    if (elev == TOWN)
X	return '*';
X    else if (elev == CITY)
X	return '@';
X    else if (elev >= icelevel ||
X	     (elev > mtnlevel &&
X	      (y > height-height/10 || y < height/10) &&
X	      random(10)))
X	return '_';
X    else if (elev > mtnlevel)
X	return '^';
X    else if (elev > sealevel) {
X	if (moisture < desertlevel)
X	    return '~';
X	else if (moisture > forestlevel)
X	    return '%';
X        else
X	    return '+';
X    } else if (elev > sealevel - 30)
X	return ',';
X    else
X	return '.';
X}
X
X/* The following is used for other displays */
X
Xdump_relief_map()
X{
X    int k, x, y;
X
X    printf("%d %d %d %d %d %d %d\n",
X	   sealevel, mtnlevel, icelevel, 
X	   desertlevel, forestlevel, CONTOURS, WCONTOURS);
X    for (k = 0; k < CONTOURS; ++k)
X	printf("%d ", contours[k]);
X    printf("\n");
X    for (k = 0; k < WCONTOURS; ++k)
X	printf("%d ", wcontours[k]);
X    printf("\n");
X    for (y = height-1; y >= 0; --y) {
X	for (x = 0; x < width; ++x) {
X	    if (histify) {
X		for (k = 0; k < CONTOURS; ++k) {
X		    if (world[x][y] < contours[k]) break;
X		}
X	    } else k = world[x][y] / 128;
X	    printf("%d ", k);
X	    for (k = 0; k < WCONTOURS; ++k) {
X		if (water[x][y] < wcontours[k]) break;
X	    }
X	    printf("%d ", k);
X	}
X	printf("\n");
X    }
X    printf("\n");
X}
END_OF_mkmap.c
if test 17689 -ne `wc -c preshar.7.u <<'END_OF_preshar.7.u'
Xbegin 644 preshar.7.Z
XM'YV0(T*`>"$FC9L7<]`H&`&""IHTT+(*GS)@Z=(!2+7L6
XMQ)TT.8L:1(@&!`HW;\".29@BZ!L08ZR&B1L4#5"Z5U..2*!4#$(X2NDLI)S&
XMLE4U;PQNKOPB\>(RW:W,Z-=Q?'V]#_GHTR>V3OG-'QN_@P[DPQQANJ.301&%PY!%0B9$4%QDZ@-#$
XM&V(I48=8(.``@@PRZ`!##CK$D,-*.>!P@P)>P?&&;"!`$0052.S0XHM(]$"0
XM03J0X"*,"DC7U1Q@M6`&"">0-@=F>)V@@%`%)N`6&HE5"LP)!P@DQ!!4&ZTI8,:*)'5$TU=^N2H#"#.`0`,(-8!@`P@W9`A"
XM#BDHD,!;08X10PLWC$@'K(.VZ@()7FFV+%P@M#`&#C"T`,*KJ_HP+1PR*-N&
XM'>3N>BZ*;I"1JAQMD)OJGGW^&>B<:,1$!@@KX%&HFH&
XM86>4(90<"CP')%`MD"$"%S"(P"I+6\0@PPPTU&###3CDT$6U,2A`[]DNI+UV
XMVV_'W<6]?`J];T?^`BRPT4CG+&L:"-.T<,,KHP;QF#Q-/$;%/F(X[:=CICQ#.=8/VL9^#Z$CVP
XM9;:#SIJ23?`:[`S!P@""\S'``(,"7U1O_?789Z^]]@JXX/WWX(_@A]^M'__^2K0G_[DYSW[_<][`A2@
XM'PC8E`."KP0E2.``OV=`]JF@!"X`@OH"*$'_.1"!$M2?!QGX/@ZNP(3Y(V$#
XM7<"__T4PA.NKWP==\,(.BJ^"XF/!"C#H`A;44(#DPV'X=@C!"T(P@><3X@,A
XMR,0FYH^'Y7N?#YLXQ2:B3XE+A&(/F<@^^ZW`"V#T@A;'!\'WN>^+801C&]-48'[0V`>Y;A)+M[1A)#TPPDM:3[U
XMS=&*X\N?'\+(/_[%\(Q>H!\LQZ?#_=52E;4L(/F.6$)?VA*.XGOA_=2GRBCF
XM,'\S9.3\=AA-9(*OEWBLY@J?J^;X-R>`JQP$S$`YPP*:(*8PK"&,G`!
XM!$-(3L6@D*`PK.8,=2!#&A1`A3>\`2-R$@)&*G6'.;S3"&'(R!P4$`0ZL"$,
XM5PC#&,,[/5HII-9!#WI(
XM$!D,"@(A&%4!00O>XAJGL']![F$NDYAC+F>Q'VUN>+!)T&QPMZ31C:PC)3M9
XME587F,AM:7)@PD/LR#2SFKTF-V@`#QQR!R/I=OH8V*+0"5K#(XY4-
XMH,>AE8!+6-"3'O7"R=G.>O:SH`VM:$=+VM*:]K2H3:UJ5\M:<%[HVZ7F[\O,/>YT(VN=)\[
XM1/HY$(O++*X#O>`"+U@OE],5X?J@B43>PA"$P.VF>F.9WN]!,WT3]&3\F`M?
XMZ:(PO/C-+WT/",0/"K&]U:TF=[O[!?#JE[STLZ1YE[O>!K-7N.\3(`-UB$W=
XMWO>Y!CZP_BZLX?TZT(8'Q"YQK0O?[79W!07NL`"/V-M8HK>^YW6PC!L)X/JB
XM=\+YXS!N-?A<%.KXMC_&<(;#JTT0_T_$U25Q-UU98/`RT;;13=\?:;A')BKY
XMCE/&[8S72S\-!G#$.E3D,Y_+X_/>=LC0+7-^N:MA47ZXO-?E;XV[Z=T4JP^"
XMF83N'_=<21+?F<\83'!_M_Q:Z^88S"R0'S99X./\PCB!N41ECB<-9$<_&K^_
XM'?0BY[Q-_"V2T&Z.9`2?#.55PK",/.0BH(F)0$!3.=#BO3*HT7=H[_%XFFK>
XML'$3&&3RZKC7N&VT!$M=7A5+F-,;KJ8!Q_OI6?N6AJ_6'Y[1',(]4G+5B&PU
XMMG_X:&=G5]#JT^#WM@#?B-X-JCB0['OO,AG);&_?#X,%9O&=
XMP0CL"%+YU=LN(Q$!K65[QSO)*WA!NU7`P1^F&X;G1G>>\#^CVLHQYO3&03C$AKN;TLO-=<4?#FD!YA*\Q,;OKU-8
XM8EJO5^,K?_4CB^M*/D*7@_!%^<#UO6<%LU?607?QA1T^[(G3G+D[SY_5-1ER
XMYG8=AO*#^I:!'O789EB2!W9OR1&<8/H(+_>Z5VE;#F;XZP',]="O#L.<
XM:_WK9\:Z)57^<[@?$(-`&++1,9UD@N/Q[8]FM^'A]V-2HO'EK@0\$/E^9LW/
XM7;?@K;A[B2MCLD<]@D,&N>?-S/8GUO#2?IZ\G*N>QLN'L-0H3'2%>1V_1'>0
XMP6Z']-85J,H0_E*_S[:WZ8-^0C2KL5\YRCN%
XMN]?T[H-_V_I.W/L2_*4MB:_^XDN0W)!W\8R7OW+4WUGK>-;ZVH9B
XM9WWHXW)?!$DHU$.NA'DOYUOAIVF71GZX97E<1TJYU'X6V'Z,EWP]-W8"B#ZC
XMMC_"MWCV]6*#IVF$-WES%VF1YF?0U$NV=7/Q-T0Y=T>P=7M#9G=RU&1@=($\
XMJ'[[]WG`I6;>1G\;-VJUI']HA'JK5X*W-G0H)&8=F%U69UM#U&[R!679ETO+
XMY'W7%%UI]&7P15O?58$]6(9$AC^]9'!$:'`0Q(,ZQ&)X]WXV!GLQ&(7)A68<
XM)'F49UTZM'50^':4IH7?$W['IS^)5WN7)X9-9DQEV(,[MFYVV&F12$E?Q(/9
XM)TE+N&OW!8632&N:)(3S0X,)5G>^UVZ=9V"2QWZ%2'M_YWV-Z(@P9VAP1CY@
XMJ(:=*(H[.$OJAW,%!G\*.&DH5$/B=HOQ9FYNYG;P`(ZJA'-^MVL2Q&)`<'&R=X((5&9Y]F&#
XM6(`(A(,U1TK:Z';2N$%A5#V95(VO:&%/%V]ZJ'S$.&ZN5$OAF)"VA(BZ=FPB
XM1WWLZ&P1:60#>&6".%[Z4W=(F$G02(/%EX]HQ(]I5(T4>(T#M%M-.#[W:(L%
XMB5[A*(WEB'D5UG!BE&PM&6'X0VX#*3X#-GH8.8\66&I;YPN8JVAT*-N(\%
XM=CU).9)&.7P-.4`DE'>B6&Y!-Y7>N`(:!(M]AY4F-XM;B3^T1VQ+%EL8V(I>
XM]X5)J8-KN9@YYXL4(9%)$.9IT2'?4>'P-
XMQHA'^'>JZ'XE.8VUQ9AK:7&AN8&&9YGVAHV-^'XII%O\U8'IE9&TI)=7]IGC
XMDY<8B(->P$$7N%Q'J9:NR9"5QF/(U7\"2)L;QS\L4$N9293K=UL-*)R@65U9
XM^)+^N%L'"#[#"%\6:'-0EIR_.&G+B3W-F8GSY6E12)W5V4/`:8Z\]IV>B$;^
XM6(AFF9SI9#_^:'\`P0M))[YV$C@E9_&%)AUMJ#H%VZLMT%;V4HWF4T4^DO9Z7[>&3[8
XMQ)^;]CT@^J,6V%T5VH/?,V066IBY%I\M:F[M*7_UR:-#ND!12I:$MY(\:II`
XMFJ7>\XIS27RIB:,JNIAG>),2NG+6::$GR*$MB:59^J&9N:5<.DTI6I7')VF'
XM&9,`*3X[.9U:B'^J932J056F-4*EWD*)_6Q6[L2)G*!J7ATT+768FS
XM)*A2Q*I1YZFXVC^A2J``MG["5FD):'+ZQGO?9ZO<6$W&.FN99T*\Q:SQ.*.Y
XMBI!`ZJ,_VJO2]7^A]T=:QHF7%*/=M*?65UP9]D&T&HELZJF_^9_>*X`ZX_@`Z(&&V-QE[#Q,X_X*DPA^W3!^GBT*K&F]F4!
XMQ*F&9[$76XT$&Z?_XXL<*FT)2T`UZZTC.V('JTTL6W8O"Z3R!K-OEH<*^W)-
XMIW(-RZ<[VY\VFZQ56)OX$[2WN7XXFK&*2JXMYHE)E[011D>W:*EK^D5[UDT_
XM>YIEOI"4.:"5WON$I_NTK@>DU^Y)EV
XM]+7(2I!Y6TT!Y&^UFHPH"*ETJI_,Q+81^(Z@YH#T28GU-;I@!FW$^+C?N4,U
XM-EZ-NXZZW%+-WE_
XMY,-^],/;9H,<&X7`^[7.:V\RW$4T+&,%N'0,['$05$6R-T9L]$8]',=:/,*Z
XM*<)K?&WQ9F7?^<3VFGUH',1_S$1C+,(D-\?#2H<1[&P^=%R/Y,98MDG\R<<<
XM;%LXO&*K-L@Z;,A)BY'[&8E3%':._&HU&;<>9,KYFTNLC,.8;'V`YL/85GZW*+W*E,5X1LM3IL@4]LN2
XMJ,N^U5[ZB,K:VG3:ZD/%?&U[5D6K=FGAVY(LALR*Z\:[)7#K=]U\*Z%\*\F46"
XM_,,7B<+$2'T0V,3^O$3[#%RQQ8'K3*Z47$0!=UQOZ$/S[&KQ3$4!1[C!RI_A
XM?$V)MK*4Q+L4K^&\1YL&;
XM)&NAW*HTS5\V?=.K1LS`W--/W<4XJ<,J)WE)/8A51,6)MDM9?61++6=-[=1T
XM3)$H.,?=*=,MJTA=_=52U-;3UI%^Y-*O!="@:7MD7=9;&Z[M;&7="=1CRTEN
XM/4R>Y-/.7+YV?==CK!-(D!->Z!V$4
XM3)EVK=:5N]A;G(%\?5OZEM;0C$'RD\0]%-N\A,X]I*\!_&&)K=A.MG:6YL73
XM%7YA[4#1^=41F=NZ#<*;C-J\:6$)!-P%2=ISG=2PC;?![4#A:;-]-EV.397A
XMY=S1!]VW&-EC--W.AD,`7-WN=;]Z#5V=B%_>'9:ZO&+)--CJ9=QW/8&HVK,=
XMN)UIA[S5"V["R<;4G=`5JTG=E=]47<,?=)J-;;O+F[>XI7L]](;T348SC=YZ
XM^\`-GN#6Q]^];7Z)/+8)Y.$;2D3=Y-9E"MYV.(&>J=P"R.#3]6""V+0+E'XP
XM3MDV7,I7A.':-$N+V-^1"./,K3Y?`)B2OM>,\'DU0CN`.W>&G^9%@BK_I+=A>`&5I"\BN9A..-@6>!?NN5QN^:"].4SY.-X&GCG>8O6:-9[KN)H&[A9
XMJN?=Y.0\6I1U/EV)CN?_R.AQ%.*^#>EM*NE*3>@'!(Y1SM[?N>AU..7_&K2B
XM/D.4SI]A7L+N5JAF..8Z_>2NCNO^1>H.9.@?3%VVGH^@:,I4>^:EM[../CZ&
XM+EU0BJ*>WJ&[7FL-%NN_"\%<#IJ9FWG13L`OR^FP[NM,G8G^.NS\;7?+WMZQ
XM&ZU(V*=)).Y;F&'G%K)NKG_;/;*@_I_GJG_)#N_Q=NC@GNI5WNT<#.J^-.*%
XMR)YJ7M_^;D%G3*R\KNUGSNK5:T*GR;-T6JK]WO"]J:\PI$A6BJ\7%O+K_.;(
XMN.YGSJV%U_#$!?#IWKJ^'N@^>4(>+O,AQO*`Z7DX#^\@:'/E7FC6M/,@I'GW
XM+O3QK9X$OZY!O_-(F.U&C^$"5.S6F\M&W_01__10+YM<9EW6/J.%>_58'_9%
XMC4==/[;4)O9HO_7WBO4E:_-I']84S[795/;/?6*O_O;HK5UP*TU8[W=XC_,Y
XM_5J1YDQ]KY5_?_CC@^6$;_27'O>(7_@!2/?%S`)#]OB6#]^#;O24;_A/__*$
XMSFF2WXE;=_FD;T:=3_E@7_J/'_J3*)BJW^5HS_HKCOHY>MZO__>R'XG'>_N\
XMO_983_GUVONWG_OFVH<++_R63_SFJO6EB?Q?KOS.'_WL*_W4W_#07_W8OW'7
XMG_W(-S(&'8@<8QQ*@?W,`,*B!!#$'
XMKH8"D`)I@*6`@".P(M9`'E`!58#^*862``*F@$T@`Y7"#E3`AG`"ZL!(R!D-
XM(3NL0`5P!![*'#@#;^`.J(`I,`;JBA,H`W>`3@")NC`$A(/",!E9PPVH`")0
XM$H#"A!@0.=#^X3_]1P*=@$Q0@)TA#B@&A`#>>`BL(LFH%),`J?`@5OP:E@5
XM.>`&PD!6``%6T`Z\@37P5#+%Y3"`XR(9M@@7\$Z6@#WI"(MA#:0!-6``F0"%
XML"A*,!5&#*0@!0+#YQ"%;6`)P@5;(5#D`*90`4<`-:P&L9!2MF`8N`,@(`G(
XM`6)(!U;@$'@(=*`B*(`AD%!8RDT``41`2P#$4M$&+L2_*`+Y3V&`@"=@%=S`
XM)@0!5>"AN(%W4@7(`%!0`*EP"NH.$&`$Z)\;6`-F`#B`!2A`__`)4%@"G\(.
XM@,`U0/\,`A@$`4O@=*P!F5!5'@H._`@)86)\1)@H`[/#&V`#)V`&6H%'^`;J
XM@$U0`?RP%^H3$G@%#())&`X\(?Z]DZ)B!ZP"3*PG+"5>5`2>@BB:H3U1&&\`
XM%\Y`>N(EYH`*Z(@*PU9,`3H`%^B`/P0+3>!"I`%;L0851B\$B)D"#@`(/"@3
XM5F!`-(9K0`58@9^8%16`,AP7@Y$-X$#D<%+>8!BH&L%!!5K`*>`@'$H9V(&5
XM\2R\CK7(#$&`$G@#:"!G1`0G4!(P1E7))ZSA*H"%B!@&2L([L2KY,$&`@"B0
XM!N)`&C`9H%`!/`&+F/\J0A``$O0/&BH.*%`J).*_F!"'4#&P@1<0!>I`&<`H
XM8P`$,($\0"$DA%DH"2H@">3#$2@6M(!*L0IB``04%=1@%%0`+;PI:``X@,%T
XMXA1)@HI0"G.@!7#&I>(+-4(_"0Z'\`T@Q9)P4EYB4KF$)*$."(S^-P:`0CH$
XM#!5!H"A&^F<13R,TM`H9@SVR@3O@"]L)4!`"9J%J'(9^DA6*8IQPA%NP#*@.
XM31$$WE\8:`$-I2+7`A=`#%[$/A@&3\0;GHDK1C_?03.)`EW(86T2I.`S>L22^@:A251)$
XM@:P4=[$;CH1X:%(<8E90`50`.%P-*E`0X"/C&(`)H9T<0D`I*%^@8<21H^,,
XMY`$6:1X?87KT$B1P1>X$-6`0#&!4T`KOA`FPDXPR!/!"'H`G9^$C&,<6@1?J
XMX2;L"S^0IH"`+-`!54"L?">TI#&DA&?`29&`'/@>3(%4:@F/HC7@R
XM#4C#.DD,Z^0;T"=D(@CX1"]A`(6D&SB*1;!2,$@2Z`Q/(41Y)Z62#IS*)!`O
XMP"!K^(D3H53>%*>X&!B'1[F.%I$-5,+]IP*:XZCD&FUR*)Z%=:D/VV00^(CU
XM!`04`3F@!X"#"_2,J*$FD$"!,@U/0J5$C^J1!#)!+:@0H0!UW`F3DDQ@%>A`
XM_UX@IRB!=*`S6L,Z,!%22D(X"8CPG1"!(:`"A`!P")">0SI"!)^@!(FC;*@#
XM)I%G^$LF$1&2@!YH`UJP(3Q&+Z$'`"+^*PD8I2&`04XI%BBC5F0<&W,B=LE'
XM"!%ZX'Y4"K."%[[$IM@1\$)%H"=G@5X!EJ8$$S&O\`"+I%,=,LP$%4H)$-A`^8D#CA'.2`Z@<(3
XM6`,/!4JL!G!I*LWFN&"(V#%Q?D$22`5DBD?,CA[Q)6J!2*D'H$0=@(D4$#]B`"'Y560$]:0JOS+K'$6S.+T!"B`X2J:$XV`.5>A
XM$J0"7C`?B@4L\%1\IWC4@@KP(:R&A5@\UT`84`'-LPGR#(_R3TR"P,"0].(D
XMF(QZT5`D8CZ$)Q#E,4I$.L$1RT#1-`)U@!@.P_<9/S,%SX@*4G-1E`$<"!`3
XMB@U\`4:`#KR3*U`JT`"@]`JT$R.\DR#0`%5B$I@#]`\C,`ZK<@;0@"@\B'.@
XM2;I-URD>UZ9!J((E@6ERPK99&B\$.@F4@Z$Z%@$V0!_GP.1,$/2OG9!#A=%"
XM.2?C@)QXH"3\2GI9!"0E'-@*)#`*2-$Q*1M%)92PB@K@5BY$NZ$N\AQ3"-NZ$'0@F7605/`D:T@"FR?0X)M!P%=W`+%62"+1W%L53
XM2B;3"87X'%;A5*H3>^(`ZTG7U"@9@8M6C7]!3^C`7:2#;@!H1LLY$#Q98!B0
XMI2(2*>J$Y\E0^L5)>8SUCYY(PSZY0J'$<]`(3'`,$-`CL#9W@BZM`Y3T2;33
XMJ!DJ2295(8Z<0O])QS`P%<'I7>2';(!9Y,.6R403BB/4B@_E5`[2G=`,+85@
XMG(N<`E,6B,/H#$&C_KL0"F"A_L2L\#N;@%L@H%,`.-0)TG@&;JEX/)&`(0T\
XM5*W1"T<"SV"GW_2A3$#Z5P)+X_[#@>_$(H++1:@//:I>Z8&L4UR:QS!!)\2"
XM%4`-'/.IG%1EN4L5`$K<"352+-A,.M`"?&$+((D&H4#6U/RH,K/#23@,?M0S
XMMM,IJ0F-BBA=BE+5G]Q%))`'DB0X_1>N4PJP2+7J5$\'ISB8OW$DT%0FV`)Z
XMX4[@)Q.T#D0'EB(O*P(3=)]*\CQ>Q[-H%F2I07@#]+2FL@$[<%)6A$:QB&+!
XMJNP$)VD5?24$K),[8296C/.H4CRI55D-,[&6'H8BF`;*:D0%"AX%,+2!JWH$
XM,6(]<0.B,Z@`T.`(46IJ&F@!.!"1/D<@24]:*C^%)Z82GE`(=O(/G\`9\`DQ
XM@51<5H@P0BUBU8`G@A4N5`0ZN!KTJ0(HKBT%7/)'C>!1XV4CW"BF89_BP(B0
XM+;.#3]`H!8$,3$"Q@!'#8F#XFJ6BGW*$HL@B`N+:?"BS,@P4Q7@A)P#J&RT#
XMHE`LT,&$B3A``DI\!).)=6H5(F5)?2!'P":G2?!K`YX@7(
XMJB!APE5DI0"6-*+/@D`W%4;&;!$)!294#8T)4R=E;M4(22"WYM.#Z@LC@F:=
XMJ=VU4RH`(U`J8BR=?*I2HGA*"/<:0%NL&\B8Z41OZA.(J`9\Z%+I*JGT`+(3
XMM?(^R24VO`KKD0ENB:L@'QFL/?&4(K5J3,JS2B'`K$MY"='!#``%![M%W:1L
XM>"<3`D+"0NFX"%U@U3B9U;"U5H1/25DMBI(,D@GB+F16_YD'.FL8F*\:4`&(
XM2OJH!UHFNFR`))`#@D$N&37S(;CTDD4SD?+"A?(I9R9P.)7_4GSR1R\A##$B
XM1E`JXG%%^+]?>AE3(41IK&\VI^34C((`,X4BM;7ZCSLRE/S8)%F*2:FIL):>
XM=,B6"0%Q;8'XC10XMT8A*B*XR)[?B1P0,=T"JHH:\T&EOZF%PF6!1>E),ZSE1
XM%,:8>(G(,2XT0(NX6E.C`,R!:?7."DRE$%4P"L6=`FTU4WS`=PL<$\I+K"@8
XMX9HVR*2(4>0`_8NR<@`S8+Q.%F',7))[]L,GD;5P)R==*)Z<41K4='LCFNRE-0-)D>R6
XMJ$?"6ASGX5J+#_.-/3&'R'YO@!F^EC?=!)GFB^MRU+(12YH7%?66&F3R=A->
XMBKYJAF8%F[<$K%#=8^-[7*:00!]DY&#DCNNRO?HMSK7?R:3S&I7PI3A;SU$1
XMG0!R8=1,ZD4W3LSTK%(?+4>8\-ADM>%*TT%JOQ$7T[6N?93
XMNPL?6&X!2]_8T^O,F+BZ7X8(P*DXB@3@5)5[`4.T+LU4MJ+WS`;32](D9$99
XM.:IG8X(YKW"Y.E:HSSW@]:)!Q-.!$[^I[X/P']:EJC`/(6E4(+CWECM6):$\
XM5-N[+9G.])X26=/!B(V&`U^6A@6IO!T,@0<>S?)&".0(+9/M]'6P71V[(U'X
XMYA$:'B.[W%XTN3`,[O-^C^R$[F974G)=G,AP/:Y04HC@3VUJ=:"FA6PGE81]N["A"E41
XMK>8EJ!,FE;C;\:M-GBI1(:HN=:>T$73#+BPXYW4\1P>(N11[8L7Z%T'I8&W2
XM>B%P+5(R@J83DZMH]4@P$.EE09NWO#&?@'>)/PPQ3D\JR=3HJ1CTBN&.7P)O
XMM9AHK6*2=8S]6[5+;1@'=2VY(P3H6`B?`TS@JL7IJ7#,A:TQ]-W%W\;#33S@
XMDUU(CW#B7E`KUM7>&0RW#@SGPV5$.!D1'I5C[6S.W2M&<^N":"[7QX[A,?M=
XM>>;*XQWD\W'%]IG'4D]W;C"ILXVWX@`/H9EJ2"]9\9#@%,8JTR3Z>G_L(SL>
XM9GQOQHL>(B(JSLD]'M.VS&0,2'Y>F1=W/3)8`[7(GKFBR67+P50RENQ`PMC`
XM$4MM)P!W9%YVQ88R!`XVH";D&9K#EI276\HC2+W0
XMX\IUC*#O^AA(`*;LV1[SVX^U4YWV.\M7*R
XMP6K&3DKR<9VQ;+V`CU\>>^\ED;&^M=Q]%]P\!L:>K[X,O*K.T%PNS2R#45Z]P[TB"S2[Y1YWFA^R:%9UA&Z$/)+*\ZXZ3OG)$M'_T@S\PYHS4LGZSN
XM3O';(S&"6?$A/B43GP\SO*O/O4\PV^?[7.#RLY_C?=N/]`7HRS>@D]]:?`/M
XM[R>&PREP!Q`L1.@+\<\D[`0&*07SWWJL@1`%!^I`'A@8V*L1=`-(4&$LP9+P
XMH'TI%-2!]\]"9]H.^`%3-!5LFB=P#P9&%_T2@R$6+`BYL$*_Z'W8#Q/$!TR*
XM_9$$6L-X,6V+P$Z`CWVA')[#=$@OF"(%?(?4%ETF!&7A"F&A+-31+[$/(+0(AQ0@DRZ74($U/B2FR)Q+)`4,;%8!DQ(YW6
XMC(PAY"K'_>@&!&N6#)DU!32*1EL)!,N"G$@`9!$BG,6&2!<_A1OHA3WRZ?I'
XMU#@<@$0G]*$)8CTF@+](,5Y`3$P0,U$E5@&6>$WCM$:IN<+Q!##*>>@H36&F
XM.)?P43X":AC[)UWU5;BOF56PG@[5*`77X4LU8E$S([;\27&
XMR/Y((SG%C)Z"ZS%-T@D:)1`";]X]8".V[^R>/I4DRF3C@#*1,@LDR)`C/I'UA(G(O3
XM>BK&V9D\;2=VE(K>YZ2"%M].6:2/2:\HC&:DCE9B@5*5ZV9<(
XM3:4I)^S;/&.8`DVDR%/#H*5HJ),4JU]HP/6Q2B@1?@4=7I^PP"]$\,U->R
XM^@$7=]1MJTAUF9[5ERA7=X):;9G`P:4B[2TK"<5IOX:`RWMALDC1V@5AMQ,D
XMT0^%L2H%3P$8>#1O-8M'-5,4S)S;-*]I<'7=+55JGTF1[3:OJ4M)*CAPH+97
XM37ASU>G)[G]9`U-BE0N[(R\C+=RP!4+%!@<6NP1<+(?EC_BO6G-.,R@Q$T0+
XM(+.?LC6&PP'H!J)*G-:RB'6@>MDVNZ/AK'2HMSU*5D
XM[-5`;<\VIBT0&!#6ZE3/V`1_;0I?C^"V)(C;>W_5-CM"S<&^9[:WECG96@ZY<__<8M88'U9)&7*.@VVO-HX?#R8VX13PO
XM!($QSJ_OH&SPH#17_P$%F$L&9&ZDKKG"%H)B46J=)L_"PG2.@$'C0L@>V7$/
XMH4ODL$N7OV:*.QYO#[:':-QG\P@FQ%
XM9#@)N!)W40?*H"M9@F7<79A!."[L`$X@/+0X29TAV$1O$`#D@L/3R[+
XM`T3H2">6A;(XCV'.*Z;'29[+?!G^*G,80O>0N9Q:YM`\A!3DWIO,H[DUG^9L
XM^9E;\VV^`BB=B^.\Q)>;=UZ9/*:T^>81Y^-\N<%>
XMP+SY-Z\^[9R>TQS[=GDWECY_Y^K\GOO>?\YY]'%XBQHS.%?H
XM`#VU-?0S;,XA>D07R^1K]O27Q'SW+'K]8E@=+$W-(F0LJ&211R_HG'E5C?0)
XM'+P2^DE7,0QK#FFMS[2:7?I+US"TB2@KWX3NFGO.3;_H;3D]YW/7C*`Z#!#6
XMYS%](@/DOKR/?SI*Q^B].B;JJ;M4]\,_;6+'7:7'U
XMAT-_%(Q2GTO?;-`FO>'U1\YWHW
XM?S,U**X7&ORKTOVZL:GK)-@-LYS<4K0,^V$'[-_'%&6:S0SG$)F=S@
XMK[/.?@-0?_F_$/VA9W9_3H6C.O-CYX:]\DJ7ULOA.#M.GL/%JJCW&/T"VI5S
XM/FWH?*\'=[FNVEF=!L;L%!TA
XM1Y><;HC)#'1GQB9]M8MEPBQ*=`X!)K_&5[9_+^F.7ZXZ=\_N1HO_7G?;+MJG
XM>TI'8>'=@:UWRWO^VE/`Y^4WN#7ZZ;+#IDMU">SG/\+C=WBAX!:_:
XM.CP]M^D"OK+[]OQAGY;P;-\@V@JY\YT!S]U5/(JW3Y`YOP`R#$_CH[N-'_!K
XM:*.W+?L2VF/OAR?M"60J'77>0^+SBXR/YT9>H%=T"1+DK3MS>_+%2YX#N>9^
XM6ZI\@']S-`?$2_/FK&'4>X7?YN2GQ,QXX)[DV^]^-_*W??UJ>0%"FU*7]^+J
XM<'[.R_EJKCZH^XYW\LJ<9RGW#\?E^[P9>R$SY_^N)A7CK@;[D>?SU.GAQ"?P
XM3NC=_*./\BS^`(OW4\28CB^AJ?13WM#+F*:$0@IQEB_-ZUS/9_KWOI";4_V2
XM2%+>I3=AXR6!ECFLO_28_J^;L15OG,3;ES\R;@00]*
XMQG9?'<8D86JNVJT]_"7WT1W8:-]GU)'\\#/_]MF_T,;X8G
XM/K5W:%%_O9^1Z3+ZBHS.G^<]B]CW?!3OS"'[^R#Z*;^T:WWW`H1-B"_JQV`=
XMG[-W@N_4O4BRG^D#V:QG=ZR_XAD,.K?[D0HJ3Q-AK'L73',7\W/Y[]-]`9_N
XM`Q)@%^M?GZ*/^\5_L%B5[#U9V)W=3_ZC;XSVGM82\]F^M2M^$'+F^WI.MOP3
XM"3`W7\S'\Z.Y$F'W[GBOUV-\OI%%ODP?[46?VD$HS4OX'3_""?507MDO^]`$
XM\;9SZ<6\Y8N\"_]43_:%.W&W]*9=L1LYX(_K=8MP+\Y7OW3M9^K/_`E^@';M
XMR)^TA7F5G]N?LLG:R/PJI;/Z:@_I!;U&3SO2;/LC^W1CL/[+U4-XFV[N_RX<
XMC)>Q/2L^5-*?NL/_?6:4GVEFJ)AV`N``R(79+^D*P,+K1&;;W7AG^HAV2LFQ
XM@P":*\?>\:<`2'P"BP4HU!E_QYX<5D`P@+G(L2/DX#NJEV!'00@Q%:`)"./L
XM?]'(8T;_R70K("56`KJ`<1BJY]^]+B&@K+$!4B`XX"V&ZG4[?TX0V'Y4*#<$
XM*6$$9BY#H$YW:2R!1,N0H@`T@%`@$[C^[7S/114(HB@`6B"OAA&DB`]DH"/X
XM"-J!GAT>J`B^*EV@)7@)_F9@W\/QME""C>`GZ*FH7J,@*<@'FH(`8.)0%C!PL`$=7`9D'5T"K5",I%,D%'9$YO0
XMN@4(-4UQ`1TP)AA+*T*!H*2)!L11FD:W/6GP4"JD&K4`&1NG(!FQ2O=@FU83
XM\&@)D4;`N@$&-D%5X26=0G?!,40+G0'653&HKT5"X)"D=0U51W'1*?0Y1'&R
XMP1P0$X1Q`5%'F&HU:'+`JG`%B$BK@9(4_\A2>D`]V`YB"M]5UC83Y@4`U345
XM$1`!$!)FY1%>!0_%[Q1/0`$4@D$M5)
XMC=9O(%+<0^01?X5.)!4=TE8X9ZU1&5%&.!K9$\"!I)514$56D;[FJ$4$M)!!
XM4#211*550`$A@052@&/06D4$1]4E]")Y5'1`T?0$O#]P@1[P765J$<%:U!:]
XM125;1`$=*`36D)?@<8%,$!#3Q1-8%4YA1%0OR%5;0411'=5%CUH8$$:51II"
XM2V@D\1/\E8\%46`$IY$H5*EI!EJ`>F0KQ#\7Q<051M4$J,%H]!N8`=!07(!C
XM/6H1A9=$5D!)CD'6!!8<2`H3/^$9?@V2UL4T3L@_!1*W]1'>1?^11>0+"0R!
XMDI<@%AAK#]PAM#;95A=3IJ!1-$!;874TLH%%7N$&!!:YAAQ2I8#_S'&N40GT
XM'$$46%2!D!_J%+10B#0B101&@+:4%@44YX0"I!OM2)S"/I0&H$9DP#O1#4U1
XM.)!MQ1&\6N>@9_6P38-`4R`D:6ELR1.#91-4!/W$66!1V%:B$&A0-.E+:='^
XM`Q-J<;00E%`@\$.R03=X#HI*ZY5_&#@10=W61>$:\D/Z1-$TLO%'HA`-U!F(
XM0/D0UX``,4FN(10E10EPA%.$`P4+T0,Q!#S9`TO=G&!+'#'%!X2@I2>S?R-*3>`$^
XM'Q'Q2C2*:(BF""F2$DW$IGCGV7Z68I&2*7J*:DRY(JQ\BJ)&7"/%>'H[RZ5X
XM*@X:XBIYA=4#CMXKL8+EYDC1^^\BN>
XM?Q,>)B+4"#>+HKX8GPPS`>!6\B_J><$BP;-O[(M.C?Y7*@X2&Z#K=8[,$0XC
XMM7@P$C3,31DC*PZ,"5V[:"^2*^GBQOC#P'[+(L4(,AIY(N->)BT:BR=CV:>L
XM8'\'Q,>HIE0;&.-99W)`C'O&HN?C%6;/GS9A,YH73%],HK4ARHFC;5>T$AZ*8T7X&QA*D8P#&#"N$IHC%2CE0/9+2E5HRS2
XM8"R,U@WX\LT`S1T__!CU'9E(^VH]*41E:/XYYN@9#%(
XMZD*!D!HU!+17W`U^C1^MU_!%8'@CJY@\NGGF!]%CT6B.A@2W4X25=&N.BX>"
XML8!8HXJAI&R/%9C?\ZZ`??GBM,'MP!Y%3?]ALIP;Z:/UN.XQ)LDC>&-",&3!
XMQTN&WWPIW<]XC?A8O\X_^T^4ATN@HA8'=%,,U9OF##8SM_(
XM.Z*/VB/%F##Z'/L*>X$_."W=8NG%^Z(OL(ZQWCFTC^(U!1IEOV?RO8L]I`SFGM$B84@6
XM4G.T=+^?XBBF'!V03JO70'J0\I\,$NPD?P*?$QAWY!DY9,@!;&1F"J0+B45&
XM9L%*T5-N#!^N&$+FS121Z(<&B?\-/&KC^GA&WB5K(U<2\24@7MD`\FG$=Y`C
XM.8)?D)%5!^VXEB21$@DJ,D/\CUV?G*%<`(Y@I!%)2!Z/=F1WL0$N8]A?"CGX
XMY&"38WMG\^D7;9@AR3]2C&5'LH*1>3P19.^70'XOWD=S8C=^>JDDT%A^/#C=
XM77>'>;@C*R0]ID(:%XO)@7,N_F%$('J1BL`7909EAWK-CHECL;'2J8UUY"%Y
XMX+R2M8L*J+RH,W/':2>9O"53I'*S>V20G^(S24H.%U!'LD'RD"O"I.=BBCR2
XM\H?EQ6$4CR&=!('.X#@RQBK%=1JE1NA(TX_+%K#AW9AG@6,=8D::>
XMD*=U0),@'_BGM]B3PU3[`'Q:R)'MY!>!4^:4M`D,^<%$+.@?<.?J%8YARNPR4TJ59V2QDE-Z&U^&N")V9",6
XMC1,"2;HE9>-$2>]!9;>'J1B'.5_2H\/276`OT$TSV4R2CO9,HZ.;&("RXFE2
XM3!9F8%@<<=IU*Y')^-A.HA\2I$'93J8YRX6N$I3(E2<@!]-)(AMWF=O!A5PY
XMG=Y.8K(<.HC*9$DQ+CE0#'?#=7PNX4E)TI^4(Q?(KA)8DI8ART"&>WF6=&,L
XMD4,B9&@&D2):6I*72\C24L)VWR.,4K=\?%^?HK);8HJ])>QSNOAE<",<)JJT
XM'Z]E83+903@!76<6I$"7E&5QTOWH>[T@.))=:BIY3\L2X6$N&,L@\5W"EK'E
XM.)E5WGIZ'I`27:*7L>76X:S\ENZ.JFCC?"CO)7]#PSR.^"1P!]39DU
XMLCFEI#Z)61:!9\EY67SP/@F*PA*@N)<*)@18W3PC,L_]D8T=EWU@%DGJ*';`
XMRX6)78Z6/LAVZ8F\$&U*?JEA_CVI2\8#HIB8$J;88V$:*OFE*D%?EC[TBX>Y
XMBT28)V;:TV':F#0Z4;\$"4FD>F9`9GWEP$X9/J8
XM5N!V:5T^F;QE&RAE.ID_2HRY[;28,8]U<:AHF5MFCMEE>IDPII*IE]26I<^4
XM264BEZ<@I??WJ)D!)I1)M?27-(AZZ:H@F'%FE6D"?I!37M,"9^:9;&802-KT
XM&B@@EIEEFIG?CEHC9((I=V95L@?^)V#FG.F!@21B)F>6!Y:9;*X9S!@8_F*Q)INH"6(R8X8")[>J`J=FB&FD:@U\AC
XM%B*EC*!!VV1[@B"FJ6>F@9Z.H5FPO!GW5[3W])DBNJ6O&6C6@7&/L`FBL#JE
XM"((1V_0>X%P0N&J&@6N+)^("2G7"U^0A"9D'@X9*A5!\XRZ)I
XM!(J;GZ"ZN0128!R='\ANZH+`IHV1H;B;4."\26\"F]3FG[D$ZIO[)AEX0L@/
XMR(DA"'`&G`(G>O((RHK_4@]T#NY&5P%6L%!X5+V1)B3`!0'O4;+D&EI8@,%P
XM<`$1;/9/=B##,0KXS["U%>!50)/$R4\@4=#!#951(55C@!^W5/Q29M(SZ"F`
XM0WT:>]40/6R:`H94/!U"CD&+\`4!G6Z0$)`'>'`G9SAD="*=2P$--2Z<;HX!
XM-J1X1C0:!E6
XMS])R5;+9GC^7,*A"500
XMT'I^36D07:@,QA.!077T+T$'$=7P*2$<%?N2G,"A/131P<&$!,"0)"\]
XM!"M7Y+D/F0P!U40P$CI07%)4('R:1?;GA`5RJ5!Q`5=(&M4!SX&CX`8Y!,^1
XMU4:`%EP#$TZ`'W"="<"XL#'M207B8F`CEDD*4`G4!C1:O5`"T(`:0!3GSUD1
XM%(83E/?93*50&D4(>C!96+9G=61KR7)B01%0"5T%)6=QM2(41!'!$)4NR5I`
XM)U*$@^8$^Z<_Y!OQ3#T2D[`>96Q96]7P&]0+E%'6<&P-0"SH$4H0IEMNT/9)
XM$C0$&9-KZ!W9GD1G1"!ZP@I<$O"V7A%RBM-,H'4J3G=15!!=Q4,]$-#D`O%H
XMJM;"15@)!U*:!KJ!`E990T5@K&D-$=P=*C[)H0XH<&C(F00;*!_J*=V>;T&<
XML`,1HD>35'4ZF)T`&Y<8+;E!1H130
XM";P01"%Q\DFCJ!;P&YP!JP&/UA/>4!N0`NI]#D!;4,F)(^8$W>!^],810*::
XM1T6)*E>D%KJD@3J@'L5M"!_YAYB"&V0`)0$)12SD!F$!I5%Z-`?,H4N``HI4
XMN010@NKY??Y`9R31>J`2HGQ`J;4(YT%A]04Q?_X0I[#1'`'=6Z)I]*U=DX$YZ=2
XM`(?"1UK78F$E+WI==!@+Y*DGGSHQZB./E_RY+X\I?:J?W@\S9G\*Z#&/\-=;EIQ>
XM=P'&?3J?JA@SQY)GEZ:5L.2!BMDEJ`IJB!%>/'D5Q[QC2V*GW4_%:'%P'C.'
XM[U>A1BCN#4$9`GIC(ZH9H8*!'R9JF(=LR*=,V&5ZW#&HEU^*:J$*IIP?D[*2
XM.*>$Z?%W0W"F!:"/QZ-FIJ`/CAJD+HTVJE02FBY_0NJ1DZ1.ET%$BJ?Q\:5>
XM8YK)UUP12.J1:KN4FD]JE"HQYG[%%W(1[7"IM*F'^D%2>D;J8->E)A%>)+JH
XMR:A_:^J/.F#&,4!`E<'*F'_;F?2C`*0TZH7DJIAJJF'(8'01I8)ZJFH37PT\\\-D
XMDCT*8[>F/C$3S`_SM_1^]RFPZLCP&3R,CB.=#*EY:0KS/J@PVXP*XT(D%WWD
XMKUJ$I*I\2S7AR%25I:I\>DE*JKFJM'IXB)#B7V):,8*K68VX.JWB7ILJ@$9G
XMSC?BJN$RV,@Q7:J'NL`('6T,R5&O\JF@QD3#AH@T2:J9"J[>JX3-M0''%&6Y
XMZ9XZ,JIDL.KLA:U:&T]J]T"H]JO^JK9*WU2LMBK<49/UJ=GJL1JGEBD;Z[J2
XMK5JL01FBFOD4JAVK'-.P6F08J\F:FFT9&VO)BKB4+2MKBNJ[\"TA:RW#1LBL
XM%!FB>K/2JP8K'7&Q`JP\3U@CMLBJ?FK+JM`'D%9*./#1(I1*ZY*U$RG`,W9.DP@CJJECUVS9Q0Q=NODRKCBK.--+3.R
XM*JU9C'^FL?:MTTO)^$J(,^KJLZI%7*ZNJX!FQ1BNAX3G6KH.KA:,5[-J%&=Z
XMJZ^3VVRNK6M3!K:H&NIJLKJT%C)$Z[B*^!@WR:OKFKI6KFQ$JLJV;AL6S/(*
XMS,"NN:LVP['V,O?&P8K[9#*DJ_"8:J"MV^NLBJVN/E$(1V.3O:Y0ZQQ#OKXT
XMUFOZVKH*KHC+^\IQN*_WJS\SO\ZMDTB=NK\.-0U&Y[JJTC7S3>PSB301_NL<
XMMD:,'-?JU-K1**H0Z],C^00<9&NAZD+@K_6K!`O."#:&:_5JX1"PA^L`J[R"
XML/SK/M<8TP^/QC.
XM_XJP#B`H;!U!3I:PUL&JVMC15S;_BP1D^!UIV).U)L_8&I
XM9J5++,;#/KS`8W;>PC%LUJ
XM8E&9*UN7T#O7["28_.`KW6S[492\]JLRQ)01O.WK.!K$5[S6*T&:U&:\P^M!!M1*O.)M5++FN7#7S>R#`[>4BU
XMRQ@RV:9.LR,+5DN\='^Q7U>K^H![IN8A6Y!XM5/M9>J.4;1*&>GS\5B-,&01
XMYLO>/MR72AOZL;7:F5N;S/9G,>1<:[4Z/)>'O8+6XCTVK?9#DMY1[1(OY1HF
XM`6NG0=6XG02(EN]F'S)-=%OY5!2]AH\:9'NZM45#(CZ4#P57/,%Y)`HE5"#`
XM[I1#Z5'[8%\5&BQ5+<`^^E<5%4P5D+0&L4C"T7<56-E6"5&GU+SA0#J%&`04
XMP*+D)Z+55Z52BM5#85N%5C82;,0B011V(4NA!W@*JF@+X!$I!%'!;Q5<*0!)
XM@$Y:*>Q#PQ6B15E!5ND0N991]!,1%W:K(B@$Y16W]%\U6`]67E0<@6G*`HL6C:4&G$&T8<D4VI!FR!6Z<2(%'2=S,13QDLXE)UP!>EO"M$\<7:B3
XM%*5T@4Z*W&_K"WE$+,5P*"M!`49AN:40``YB:=?E.%!R0FG$P"6279G#4$$/TY.2Y1=NNZ=1%?70GV@+NY'
XMJ]*`.E]JE
XM>]4AM4`M'>M/(KNX1:3G,OZZ40FX:_W5DVZ=HY?6K6?F;I>'[E)E>-^ZRS2V
XMNZ)>/3;JCJE3F5X7^9F[FEU#)TU2+/8F($CO#G\@7N@%]/BJ*V6[V^\:?>++
XMY]=)VH\#;[+KSVESTV4F&-1.J'V?N\LT3A-V9J,7^F6\"AV8JO'>M<4NATG2
XM-;LO'CA?.TN(KCR*KL6
XM8\1;MQ25IFZ!Y_2(?<%NS/OS&KT)SJP+[HJ\K>X5^/0)O0!&?;?'ZGY5"-4;
XM_\%T.^`]1M*9NU,J@'9OD7?Y8KZ;[N;+Z#%XF2^XA_;*
XMDL@'09?FV76D8NY'W<%_[ER>E^V"OM37ZPO[_KV^%]2+,L9YMF_JR_J^>NY?
XMVRLSAGKB[OIEZP$8!ZWDNS3NO4'=X:OYU;W#+^_[!1:H&:\5XNC4=OONL,?-
XMD7T/"/0;^*_2,OAVO41>M4?V:IA/
XMK;*G_?YZ@*3@)]AMM0B9C`>FOGZ%W:_7_L:4(.WXE_%R?"&?`>ST=J?%"*&R
XM[G)S"#":0Z/J.08P8FKX?B_PWO2%^`IYK)*?2S2G`GO`[-Y@^70@(KJO[&C-S<`@<.1+LCR4-+"'
XM(<[QP"?PEYI\A&3`EX;19+Y?]0L1/``;P?MO"BG\]BRK)"@I`O?`M*_;(4#R
XM7@?F^GOMIL!7,)-JW\06Y%4-AOD@X/TNJA[O'L]>1GO$OQ[T,'U
XM+WDQ]CQ^1D[=,04GDYONQ7=K\@^=\*.7_&9T`*\LAED&&7FC%MQ[=1"H<*^(
XM^DTDWVX>R:A`DC1=%B9"\,$\;2Y,!JMZ?_#/"'U`$\RP)[R?]K+P2/78Q7!@
XMHIV#FENPP87OE/W&5[;?`K"0/$`3$G[$9F
XMNK;*3P)#0L)92T,<"1,P7*IXP>KA*NC#16P.%W@]W66)+4)_HQZ>.6PR._4P
XM`,$UCK[3WU8R1YZTJVPM8?\%.C6?4(*'V+7I+S'6_[7`B=U>Z3,&CB/+?1'*
XM4F::96OZ+OJE&"!%W*Z\LN]C>>J:0BXF<9MRX?R3RRG_>\PIQ2UM(N:E6I3`
XMZ3W\EP"8%PNU4CXTE;%I%GR3.)=42Z*2!&ZGNV\Q8Y;Q-Z;LD+(6[Z:]Z;O;
XMZWHF6B"<,A>7IJXF4MS_ZK3CA2&(!-8/?F!A.^#Q%\7D)TBP0*:"IE_,I%:_
XM@3&]R1A7@?:9NAD5+YB;,"$X"_:7F;&^T,7H\&JO'Y'%Y?*BH_[P%
XM;0`*\`,D"[!HPVD1`@")+9A"=
XMH!L92BH"5G&!AJ)U$BR$)P5)@%"\M?]T%`G%^N2"'DM1:#$I(>&C6R3/!
XM6.]/CYS!U:,D*6^T<%EH>9)CH#@=3(5A[CEQ,E@@%<*5#V$5B.B'Y(^R10L%
XM^+03+,BS:(C&3S1:LBC763PI!I*5:TB21A6V+4T:(*NC#9&<@)*ZI#;IO+1Z
XM1DZI(9Y5"VV
XMZ[*['"_3R_LROEPOD\O:,CAA%YH!F@$&U$)I!E6B$2`K!Z6U>!W\7L_R5(KK/##WI(KNPLSF-LQC%UD1YT;,:`5ZX"N_75!IQCPL
XMVUU5*=[E,6>EYT%Z<#R(S(>N[Y`PG\S>@=G,=B4/U;*OT#)+NB]STDPTV\LW
XML[Z,-RO-SYS>@='H>Z48^4"SH,OASI0:.)->?O/\83<;S7OSW:PW/\XT,])\
XM-`LPB[/DW#@SSI!SWAPY4\Z3\S;;.1\KG[/V4SESSI>SY4PN]Q.M`=-<,&=`
XM:(!FD%0(A-D!U*Q52')K+JT<=@VEB$%1>C6?%;QR>W#GEHEY+L8L+$^E;2+'
XM?)4BR[3#>>`[G\U>:=K,)XJE;/-XL#R_S2NS##`W8\LPL^:L/?/-F[/G7#J3
XMSMY#"U`"S"KX;B52`K0`/O/W(#Z3SX3S<'*0G,_I<_@\/IO`@%TX`C]_99DS
XM][P].\[=,^C\/7O/^?-5JSH[S:VS[,QUT*+,$?3Q0R\X##7`]KP24
XM5^ASYT'6FHW)#%\[_L_\,
XM0YO.,O0+G403LTU*!G,!/06,T:\SIZ`,3@%G=,(L-=O.EAP#
XM_3#OSF`BREP?3-`6<]<\//>YQ;,&W3$'NLGR>?!',\^&;@C]/$/+)+1WL$A3
XMSW&S"BWI8L\!\S>1/>O/G#3_O#WC)E9Q\I4&FR,Q<+U@5DN$=)*$9T#\IEJA`Y]$.L^Z<*_/.YP%^$%-LS4]I*>XD?L
XMFC*&#F%4/Q!(M8.A5(_$Z3&'1UNG-7
XMXQ%Y-4=FZ3PF*LT%@54#$+,$8*W5"-9$3&&=4A_6Y$TL':5`+$I&5S-8PX*0
XM=38A6<\8OT1EK=(TUI@8.-+XD`\4AEU-Y]@9H/5*O5YXUJ0U+V%:X]"%A&TA
XM5MG%UI,U_EQ(V-3,QP<3_'@CNC7E`I')%QQJ&D)2XZ5GA'!==AC7
XMS`=R;45G/QMU2])=4;]44_7TG5UW:%.U-BU1/T,`HCO!.&4%Z@39``*
XME%%XUWW!3@@D=-<=U'9]7A-=I5H-REV?5`27905>B]=+A<-V"EE'X?59H%_Y
XM!%R#>:W%D;GM-=VF&NW7*X)ZK<4)27$"BU`$O-?ZTEEP*BW8Z_4)91RQ1_EU
XM1H%@3USX-7UM<`E.PE3NIE_S21.V?ZTR/4\L@HC=8)@UD4[>Q
XM,@+-,"_0[;0#;79!T*\!?^`?]'),P8"@.."YP++PK";BT\6RV(Q()\]1=G_P
XMR04(5C;@-3*+T-"S02UEC]E5-H&@)$P!ES2*D';5#0JIIK`KU`TEDE*`*E@/
XM"@#T(.E6R]*#0WTHK@2$MJM@:!?:B+:KP%#`B=]/GTUH.P^`]J`]:!_:E':B
XMC6A+B%N!IG`#3`^_T2NE`.P*DE<,X"J8"(3VKC!Y2;HW;G#P:4NZD]>(\'C1
XMS;X",6<=RE+HTJIM:.<`PT(.,#?K"K+VJ2S`@=HLL_.0`]S9O$*LC6H+%#N!
XMR1`4VMH;0J`];+/:S3:J72`F44\"LQT#W`"[PK/M9Y_:SL.094!9VS?`KY`#
XM_`K;MJSMM0E081NXG6W_"L0VMVT`P4X%`K']Z!X+PT*YC6I#3I+3JMT"Z`K7
XM]K%0+.S;K+:L'2B9!`N%O/UJYP#%0J\0++C;GY/B5!Q:VSB`XU4L0%[&=K=-
XM-IV#NP+`;3T'"R5"MS`W,]P&KMAD;><`CI>&\"OPVO-Z^M(40/0+>DRW.CVGJ2G&!P6]TPP*Y@=6?=&N*=M%PEW9:%
XMT-UV%]VH=IQT)H'*;?>UK7/7W6,WWDUOK=HVMZ&->-O;W;:65!;\W*5VU)_QG2$)6'SWM5TL1`^_
XM`M&-=[M,#Y)J1'6'W3"`Z)UYR]H*$F-D$5'=F46AZ"O@W0?2&T!Y&]HXP-J=
XM>PL+J7>W32#)W84V#H![!PO#@JG->W=;`1(>`&X?WFVI]1UX?T?/T]?;
XMP`+>C1[2W-'WX5U]$]IO=\RM'&(`-\WCIW\UTMM5ED1'T*I77%7
XM2WG17A1O]445`["]<;/0#?CNC6JSAAAWH8UK@^"PMN8M%W4$([?C[7([X.O/
XM9:A60-R'MZN-62C>E&'7'7T+W2."W7V!VX4G554$?2/?D*[D-7PSW)_:/*0/
XM>N`Q0-@M:F\(,#A*=!%*X-8SI.LJW-WMMP$$&)I$(_?)_803X$-66!@2R08T
XM^$KPAAK5"GX+PW:D`4WMTB0AON>*W,
XMB'@W)!"B!BDA)1Y_F^&]PJ\@BLO:IA`IY('#`'TXN0V#'P$)EBEN@M/AJO@=
XMO@]J0L6@)ZYSQP"_@O[]@Y]'4=*N-(C?`*FXL7"(R]J*$",D&@#;UW8;SF[#
XMX.5@&_1_%]V%8@S0ELKB95`ZB`9-%,"W&3Z-F]\*4`_$B%/A_;:HO7X/XZBV
XM-G@$Z8@C]YW=A#/?HSBJC:'=0#F0#FYS1^/DMZN`B`>?'I`\KH"WX<7"B)"6
XM9N)Y4P(^>7GAQ<+\C7=':///22&05^!J`Z1=?C/<58`M%!$,<^BTPJQD3\U,
X8=M5<,4P&1AJ;>Q%8"7;2@H`BZ!5@P?1P
X`
Xend
END_OF_preshar.7.u
if test 32178 -ne `wc -c