diff --git a/wmtetris/README b/wmtetris/README new file mode 100644 index 0000000..96923b7 --- /dev/null +++ b/wmtetris/README @@ -0,0 +1,22 @@ +Here it is, just what you always wanted -- tetris for the dock. + +To install, type make or something. + +I started with the wmapm code and made just enough changes to make it +play tetris and not show your laptop's battery status. So if you want +actual documentation, refer to the files that come with wmapm. + +This is commercial software. If you decide to keep it after your 21 day +evaluation period, you are required by law to send me the registration +fee of $899 U.S. Failure to promptly transfer these funds may result in +criminal prosecution for violation of U.S. copyright law and Bill Gates +will shake is finger at you and condemn you as a thief of "intellectual +property". + +WMTETRIS IS PROVIDED "AS IS", AND COMES WITH NO WARRANTY WHATSOEVER, +INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTEES OF NOT MAKING YOU +FEEL LIKE A JERK FOR DOWNLOADING CRAPPY SOFTWARE, AND OF NOT CAUSING A +CULT FOLLOWING TO DEVELOP ;-). + +Comments, questions, and psychiatric referrals to srs25@cornell.edu. + diff --git a/wmtetris/wmgeneral/wmgeneral.c b/wmtetris/wmgeneral/wmgeneral.c new file mode 100644 index 0000000..a4f13c1 --- /dev/null +++ b/wmtetris/wmgeneral/wmgeneral.c @@ -0,0 +1,366 @@ +/* + Best viewed with vim5, using ts=4 + + wmgeneral was taken from wmppp. + + It has a lot of routines which most of the wm* programs use. + + ------------------------------------------------------------ + + Author: Martijn Pieterse (pieterse@xs4all.nl) + + --- + CHANGES: + --- + 02/05/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * changed the read_rc_file to parse_rcfile, as suggester by Marcelo E. Magallon + * debugged the parse_rc file. + 30/04/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Ripped similar code from all the wm* programs, + and put them in a single file. + +*/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "wmgeneral.h" + + /*****************/ + /* X11 Variables */ +/*****************/ + +Window Root; +int screen; +int x_fd; +int d_depth; +XSizeHints mysizehints; +XWMHints mywmhints; +Pixel back_pix, fore_pix; +char *Geometry = ""; +Window iconwin, win; +GC NormalGC; +XpmIcon wmgen; +Pixmap pixmask; + + /*****************/ + /* Mouse Regions */ +/*****************/ + +typedef struct { + int enable; + int top; + int bottom; + int left; + int right; +} MOUSE_REGION; + +#define MAX_MOUSE_REGION (8) +MOUSE_REGION mouse_region[MAX_MOUSE_REGION]; + + /***********************/ + /* Function Prototypes */ +/***********************/ + +static void GetXPM(XpmIcon *, char **); +static Pixel GetColor(char *); +void RedrawWindow(void); +void AddMouseRegion(int, int, int, int, int); +int CheckMouseRegion(int, int); + +/*******************************************************************************\ +|* read_rc_file *| +\*******************************************************************************/ + +void parse_rcfile(const char *filename, rckeys *keys) { + + char *p; + char temp[128]; + char *tokens = " :\t\n"; + FILE *fp; + int i,key; + + fp = fopen(filename, "r"); + if (fp) { + while (fgets(temp, 128, fp)) { + key = 0; + while (key >= 0 && keys[key].label) { + if ((p = strstr(temp, keys[key].label))) { + p += strlen(keys[key].label); + p += strspn(p, tokens); + if ((i = strcspn(p, "#\n"))) p[i] = 0; + free(*keys[key].var); + *keys[key].var = strdup(p); + key = -1; + } else key++; + } + } + fclose(fp); + } +} + + +/*******************************************************************************\ +|* GetXPM *| +\*******************************************************************************/ + +static void GetXPM(XpmIcon *wmgen, char *pixmap_bytes[]) { + + XWindowAttributes attributes; + int err; + + /* For the colormap */ + XGetWindowAttributes(display, Root, &attributes); + + wmgen->attributes.valuemask |= (XpmReturnPixels | XpmReturnExtensions); + + err = XpmCreatePixmapFromData(display, Root, pixmap_bytes, &(wmgen->pixmap), + &(wmgen->mask), &(wmgen->attributes)); + + if (err != XpmSuccess) { + fprintf(stderr, "Not enough free colorcells.\n"); + exit(1); + } +} + +/*******************************************************************************\ +|* GetColor *| +\*******************************************************************************/ + +static Pixel GetColor(char *name) { + + XColor color; + XWindowAttributes attributes; + + XGetWindowAttributes(display, Root, &attributes); + + color.pixel = 0; + if (!XParseColor(display, attributes.colormap, name, &color)) { + fprintf(stderr, "wm.app: can't parse %s.\n", name); + } else if (!XAllocColor(display, attributes.colormap, &color)) { + fprintf(stderr, "wm.app: can't allocate %s.\n", name); + } + return color.pixel; +} + +/*******************************************************************************\ +|* flush_expose *| +\*******************************************************************************/ + +static int flush_expose(Window w) { + + XEvent dummy; + int i=0; + + while (XCheckTypedWindowEvent(display, w, Expose, &dummy)) + i++; + + return i; +} + +/*******************************************************************************\ +|* RedrawWindow *| +\*******************************************************************************/ + +void RedrawWindow(void) { + + flush_expose(iconwin); + XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, + 0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0); + flush_expose(win); + XCopyArea(display, wmgen.pixmap, win, NormalGC, + 0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0); +} + +/*******************************************************************************\ +|* RedrawWindowXY *| +\*******************************************************************************/ + +void RedrawWindowXY(int x, int y) { + + flush_expose(iconwin); + XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, + x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0); + flush_expose(win); + XCopyArea(display, wmgen.pixmap, win, NormalGC, + x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0); +} + +/*******************************************************************************\ +|* AddMouseRegion *| +\*******************************************************************************/ + +void AddMouseRegion(int index, int left, int top, int right, int bottom) { + + if (index < MAX_MOUSE_REGION) { + mouse_region[index].enable = 1; + mouse_region[index].top = top; + mouse_region[index].left = left; + mouse_region[index].bottom = bottom; + mouse_region[index].right = right; + } +} + +/*******************************************************************************\ +|* CheckMouseRegion *| +\*******************************************************************************/ + +int CheckMouseRegion(int x, int y) { + + int i; + int found; + + found = 0; + + for (i=0; i= mouse_region[i].left && + y <= mouse_region[i].bottom && + y >= mouse_region[i].top) + found = 1; + } + if (!found) return -1; + return (i-1); +} + +/*******************************************************************************\ +|* copyXPMArea *| +\*******************************************************************************/ + +void copyXPMArea(int x, int y, int sx, int sy, int dx, int dy) { + + XCopyArea(display, wmgen.pixmap, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy); + +} + +/*******************************************************************************\ +|* copyXBMArea *| +\*******************************************************************************/ + +void copyXBMArea(int x, int y, int sx, int sy, int dx, int dy) { + + XCopyArea(display, wmgen.mask, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy); +} + + +/*******************************************************************************\ +|* setMaskXY *| +\*******************************************************************************/ + +void setMaskXY(int x, int y) { + + XShapeCombineMask(display, win, ShapeBounding, x, y, pixmask, ShapeSet); + XShapeCombineMask(display, iconwin, ShapeBounding, x, y, pixmask, ShapeSet); +} + +/*******************************************************************************\ +|* openXwindow *| +\*******************************************************************************/ +void openXwindow(int argc, char *argv[], char *pixmap_bytes[], char *pixmask_bits, int pixmask_width, int pixmask_height) { + + unsigned int borderwidth = 1; + XClassHint classHint; + char *display_name = NULL; + char *wname = argv[0]; + XTextProperty name; + + XGCValues gcv; + unsigned long gcm; + + + int dummy=0; + int i; + + for (i=1; argv[i]; i++) { + if (!strcmp(argv[i], "-display")) + display_name = argv[i+1]; + } + + if (!(display = XOpenDisplay(display_name))) { + fprintf(stderr, "%s: can't open display %s\n", + wname, XDisplayName(display_name)); + exit(1); + } + screen = DefaultScreen(display); + Root = RootWindow(display, screen); + d_depth = DefaultDepth(display, screen); + x_fd = XConnectionNumber(display); + + /* Convert XPM to XImage */ + GetXPM(&wmgen, pixmap_bytes); + + /* Create a window to hold the stuff */ + mysizehints.flags = USSize | USPosition; + mysizehints.x = 0; + mysizehints.y = 0; + + back_pix = GetColor("white"); + fore_pix = GetColor("black"); + + XWMGeometry(display, screen, Geometry, NULL, borderwidth, &mysizehints, + &mysizehints.x, &mysizehints.y,&mysizehints.width,&mysizehints.height, &dummy); + + mysizehints.width = 64; + mysizehints.height = 64; + + win = XCreateSimpleWindow(display, Root, mysizehints.x, mysizehints.y, + mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix); + + iconwin = XCreateSimpleWindow(display, win, mysizehints.x, mysizehints.y, + mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix); + + /* Activate hints */ + XSetWMNormalHints(display, win, &mysizehints); + classHint.res_name = wname; + classHint.res_class = wname; + XSetClassHint(display, win, &classHint); + + XSelectInput(display, win, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); + XSelectInput(display, iconwin, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); + + if (XStringListToTextProperty(&wname, 1, &name) == 0) { + fprintf(stderr, "%s: can't allocate window name\n", wname); + exit(1); + } + + XSetWMName(display, win, &name); + + /* Create GC for drawing */ + + gcm = GCForeground | GCBackground | GCGraphicsExposures; + gcv.foreground = fore_pix; + gcv.background = back_pix; + gcv.graphics_exposures = 0; + NormalGC = XCreateGC(display, Root, gcm, &gcv); + + /* ONLYSHAPE ON */ + + pixmask = XCreateBitmapFromData(display, win, pixmask_bits, pixmask_width, pixmask_height); + + XShapeCombineMask(display, win, ShapeBounding, 0, 0, pixmask, ShapeSet); + XShapeCombineMask(display, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet); + + /* ONLYSHAPE OFF */ + + mywmhints.initial_state = WithdrawnState; + mywmhints.icon_window = iconwin; + mywmhints.icon_x = mysizehints.x; + mywmhints.icon_y = mysizehints.y; + mywmhints.window_group = win; + mywmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint; + + XSetWMHints(display, win, &mywmhints); + + XSetCommand(display, win, argv, argc); + XMapWindow(display, win); + +} diff --git a/wmtetris/wmgeneral/wmgeneral.h b/wmtetris/wmgeneral/wmgeneral.h new file mode 100644 index 0000000..55b37dd --- /dev/null +++ b/wmtetris/wmgeneral/wmgeneral.h @@ -0,0 +1,50 @@ +#ifndef WMGENERAL_H_INCLUDED +#define WMGENERAL_H_INCLUDED + + /***********/ + /* Defines */ +/***********/ + +#define MAX_MOUSE_REGION (8) + + /************/ + /* Typedefs */ +/************/ + +typedef struct _rckeys rckeys; + +struct _rckeys { + const char *label; + char **var; +}; + +typedef struct { + Pixmap pixmap; + Pixmap mask; + XpmAttributes attributes; +} XpmIcon; + + /*******************/ + /* Global variable */ +/*******************/ + +Display *display; + + /***********************/ + /* Function Prototypes */ +/***********************/ + +void AddMouseRegion(int index, int left, int top, int right, int bottom); +int CheckMouseRegion(int x, int y); + +void openXwindow(int argc, char *argv[], char **, char *, int, int); +void RedrawWindow(void); +void RedrawWindowXY(int x, int y); + +void copyXPMArea(int, int, int, int, int, int); +void copyXBMArea(int, int, int, int, int, int); +void setMaskXY(int, int); + +void parse_rcfile(const char *, rckeys *); + +#endif diff --git a/wmtetris/wmtetris/Makefile b/wmtetris/wmtetris/Makefile new file mode 100644 index 0000000..0594796 --- /dev/null +++ b/wmtetris/wmtetris/Makefile @@ -0,0 +1,16 @@ +LIBDIR = -L/usr/X11R6/lib +LIBS = -lXpm -lXext +OBJS = wmtetris.o \ + ../wmgeneral/wmgeneral.o \ + +wmtetris: $(OBJS) + cc -O -o wmtetris $^ $(LIBDIR) $(LIBS) + +%.o: %.c + cc -O -c -o $@ $< + +clean: + for i in $(OBJS) ; do \ + rm -f $$i;\ + done + rm -f wmtetris diff --git a/wmtetris/wmtetris/wmmon.c b/wmtetris/wmtetris/wmmon.c new file mode 100644 index 0000000..da5242f --- /dev/null +++ b/wmtetris/wmtetris/wmmon.c @@ -0,0 +1,739 @@ +/* + Code based on wmppp/wmifs + + [Orig WMPPP comments] + + This code was mainly put together by looking at the + following programs: + + asclock + A neat piece of equip, used to display the date + and time on the screen. + Comes with every AfterStep installation. + + Source used: + How do I create a not so solid window? + How do I open a window? + How do I use pixmaps? + + ------------------------------------------------------------ + + Authors: Martijn Pieterse (pieterse@xs4all.nl) + Antoine Nulle (warp@xs4all.nl) + + This program is distributed under the GPL license. + (as were asclock and pppstats) + + ---- + Changes: + ---- + + 18/05/1998 (Antoine Nulle, warp@xs4all.nl) + * MEM/SWAP/UPTIME only updated when visible + * Using global file descriptors to reduce file + system overhead, both updates are based on a diff + supplied by Dave Harden (dharden@wisewire.com) + 15/05/1998 (Antoine Nulle, warp@xs4all.nl) + * Fixed memory overflow in the MEM gaugebar + * MEM gauge displays now real used mem + (buffered + cached mem removed) + 14/05/1998 (Antoine Nulle, warp@xs4all.nl) + * Added -i & -s kludge for selecting startupmode, + tijno, don't hate me for this :) + 12/05/1998 (Antoine Nulle, warp@xs4all.nl) + * Finetuned master-xpm, tijno don't worry, no + reprogramming needed this time ;-) + 07/05/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Added disk i/o + 03/05/1998 (Antoine Nulle, warp@xs4all.nl) + * Added new master-xpm which contains the gfx + for the upcoming SysInfo part :P + 02/05/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Removed a lot of code, that was put in wmgeneral + 23/04/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Added zombie destroying code (aka wait :) ) + 18/04/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Added CPU-on-screen. + * Added -display command line + 15/04/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * Fixed a bug in the stats routine + (Top 3 bright pixels were not shown when 100% loaded) + * Changed xpm to a no-title one. + This included the reprogramming of all positions. + warpstah, i hate you! ;) + 05/04/1998 (Martijn Pieterse, pieterse@xs4all.nl) + * First Working Version +*/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "../wmgeneral/wmgeneral.h" +#include "../wmgeneral/misc.h" + +#include "wmmon-master.xpm" +#include "wmmon-mask.xbm" + + /***********/ + /* Defines */ +/***********/ + +#define LEFT_ACTION (NULL) +#define RIGHT_ACTION (NULL) +#define MIDDLE_ACTION (NULL) + +#define WMMON_VERSION "1.0.b2" + + /********************/ + /* Global Variables */ +/********************/ + +char *ProgName; +int stat_current = 0; /* now global */ +FILE *fp_meminfo; +FILE *fp_stat; +FILE *fp_loadavg; + +/* functions */ +void usage(void); +void printversion(void); +void DrawStats(int *, int, int, int, int); +void DrawStats_io(int *, int, int, int, int); + +void wmmon_routine(int, char **); + +void main(int argc, char *argv[]) { + + int i; + + + /* Parse Command Line */ + + ProgName = argv[0]; + if (strlen(ProgName) >= 5) + ProgName += (strlen(ProgName) - 5); + + for (i=1; i 32) j = 32; + copyXPMArea(32, 64, j, 12, 28, 4); + } else { + /* Nu zal ie wel 3 zijn. */ + + copyXPMArea(0, 64, 32, 12, 28+64, 4); + copyXPMArea(0, 64, 32, 12, 28+64, 18); + + j = stat_device[2].rt_idle; + if (j != 0) { + j = (stat_device[2].rt_stat * 100) / j; + } + j = j * 0.32; + if (j > 32) j = 32; + copyXPMArea(32, 64, j, 12, 28+64, 4); + /*--------------------- ------------------*/ + j = stat_device[3].rt_idle; + if (j != 0) { + j = (stat_device[3].rt_stat * 100) / j; + } + j = j * 0.32; + if (j > 32) j = 32; + copyXPMArea(32, 64, j, 12, 28+64, 18); + + /*----------- online tijd neerzetten! ----------*/ + + cnt_time = time(0) - ref_time + online_time; + + /* cnt_time = uptime in seconden */ + /* + secs = 108,47 + mins = 89,47 + uren = 70,47 + digits = 40,78, 6breed, 9hoog + */ + i = cnt_time % 60; + cnt_time /= 60; + copyXPMArea(40 + (i % 10)*7, 78, 6, 9, 115, 47); + copyXPMArea(40 + (i / 10)*7, 78, 6, 9, 108, 47); + + i = cnt_time % 60; + cnt_time /= 60; + copyXPMArea(40 + (i % 10)*7, 78, 6, 9, 96, 47); + copyXPMArea(40 + (i / 10)*7, 78, 6, 9, 89, 47); + + i = cnt_time % 24; + cnt_time /= 24; + copyXPMArea(40 + (i % 10)*7, 78, 6, 9, 77, 47); + copyXPMArea(40 + (i / 10)*7, 78, 6, 9, 70, 47); + + /* De rest is dagen! 5x7*/ + + i = cnt_time; + copyXPMArea(66 + (i % 10)*6, 66, 5, 7, 88, 35); + i /= 10; + copyXPMArea(66 + (i % 10)*6, 66, 5, 7, 82, 35); + i /= 10; + copyXPMArea(66 + (i % 10)*6, 66, 5, 7, 76, 35); + i /= 10; + copyXPMArea(66 + (i % 10)*6, 66, 5, 7, 70, 35); + } + + if (curtime >= nexttime) { + nexttime+=10; + + for (i=0; i= 0) { + switch (but_stat) { + case 0: + switch (Event.xbutton.button) { + case 1: + if (left_action) + execCommand(left_action); + break; + case 2: + if (middle_action) + execCommand(middle_action); + break; + case 3: + if (right_action) + execCommand(right_action); + break; + } + case 1: + stat_current++; + printf("current stat is :%d\n", stat_current); + if (stat_current == stat_online) + stat_current = 0; + + DrawActive(stat_device[stat_current].name); + if (stat_current == 0) DrawStats(stat_device[stat_current].his, 54, 40, 5, 58); + if (stat_current == 1) { + DrawStats_io(stat_device[stat_current].his, 54, 40, 5, 58); + } + if (stat_current == 2) { + xpm_X = 64; + setMaskXY(-64, 0); + } else { + xpm_X = 0; + setMaskXY(0, 0); + } + RedrawWindowXY(xpm_X, xpm_Y); + break; + } + } + break; + } + } + + usleep( stat_current == 0 ? 100000L : 200000L); + } +} + +void update_stat_cpu(stat_dev *st) { + + long k, istat, idle; + + get_statistics(st->name, &k, &istat, &idle); + + st->rt_idle = idle - st->idlelast; + st->idlelast = idle; + + st->rt_stat = istat - st->statlast; + st->statlast = istat; + + st->his[54] += k; + st->hisaddcnt += 1; +} + +void update_stat_io(stat_dev *st) { + + long j, k, istat, idle; + static long maxdiskio = 0; + + get_statistics(st->name, &k, &istat, &idle); + + st->rt_idle = idle - st->idlelast; + st->idlelast = idle; + + st->rt_stat = istat - st->statlast; + st->statlast = istat; + + j = st->rt_stat; + if (maxdiskio < j) { + maxdiskio = j; + } + st->rt_idle = maxdiskio - j; + + st->his[54] += st->rt_stat; + st->hisaddcnt += 1; +} + +void update_stat_mem(stat_dev *st, stat_dev *st2) { + + char temp[128]; + unsigned long free, shared, buffers, cached; + + freopen("/proc/meminfo", "r", fp_meminfo); + while (fgets(temp, 128, fp_meminfo)) { + if (strstr(temp, "Mem:")) { + sscanf(temp, "Mem: %ld %ld %ld %ld %ld %ld", + &st->rt_idle, &st->rt_stat, + &free, &shared, &buffers, &cached); + st->rt_idle >>= 10; + st->rt_stat -= buffers+cached; + st->rt_stat >>= 10; +// break; + } + if (strstr(temp, "Swap:")) { + sscanf(temp, "Swap: %ld %ld", &st2->rt_idle, &st2->rt_stat); + st2->rt_idle >>= 10; + st2->rt_stat >>= 10; + break; + } + } +} + +void update_stat_swp(stat_dev *st) { + + char temp[128]; + + fseek(fp_meminfo, 0, SEEK_SET); + while (fgets(temp, 128, fp_meminfo)) { + if (strstr(temp, "Swap:")) { + sscanf(temp, "Swap: %ld %ld", &st->rt_idle, &st->rt_stat); + st->rt_idle >>= 10; + st->rt_stat >>= 10; + break; + } + } + +} + +/*******************************************************************************\ +|* get_statistics *| +\*******************************************************************************/ + +void get_statistics(char *devname, long *is, long *ds, long *idle) { + + int i; + char temp[128]; + char *p; + char *tokens = " \t\n"; + float f; + long maxdiskio=0; + + *is = 0; + *ds = 0; + *idle = 0; + + if (!strncmp(devname, "cpu", 3)) { + fseek(fp_stat, 0, SEEK_SET); + while (fgets(temp, 128, fp_stat)) { + if (strstr(temp, "cpu")) { + p = strtok(temp, tokens); + /* 1..3, 4 == idle, we don't want idle! */ + for (i=0; i<3; i++) { + p = strtok(NULL, tokens); + *ds += atol(p); + } + p = strtok(NULL, tokens); + *idle = atol(p); + } + } + fp_loadavg = freopen("/proc/loadavg", "r", fp_loadavg); + fscanf(fp_loadavg, "%f", &f); + *is = (long) (100 * f); + } + + if (!strncmp(devname, "i/o", 3)) { + + fseek(fp_stat, 0, SEEK_SET); + while (fgets(temp, 128, fp_stat)) { + if (strstr(temp, "disk_rio") || strstr(temp, "disk_wio")) { + p = strtok(temp, tokens); + /* 1..4 */ + for (i=0; i<4; i++) { + p = strtok(NULL, tokens); + *ds += atol(p); + } + } + } + if (*ds > maxdiskio) maxdiskio = *ds; + } +} + +/*******************************************************************************\ +|* checksysdevs *| +\*******************************************************************************/ + +int checksysdevs(void) { + + strcpy(stat_device[0].name, "cpu0"); + strcpy(stat_device[1].name, "i/o"); + strcpy(stat_device[2].name, "sys"); + + return 3; +} + + +/*******************************************************************************\ +|* void DrawActive(char *) *| +\*******************************************************************************/ + +void DrawActive(char *name) { + + /* Alles op X,77 + CPU: 0 + I/O: 21 + + 20 Breed, 10 hoog + Destinatie: 5,5 + */ + + if (name[0] == 'c') { + copyXPMArea(0, 77, 19, 10, 5, 5); + } else if (name[0] == 'i') { + copyXPMArea(19, 77, 19, 10, 5, 5); + } + +} + +/*******************************************************************************\ +|* DrawStats *| +\*******************************************************************************/ + +void DrawStats(int *his, int num, int size, int x_left, int y_bottom) { + + int pixels_per_byte; + int j,k; + int *p; + int d; + + pixels_per_byte = 100; + p = his; + for (j=0; j pixels_per_byte) + pixels_per_byte += 100; + p += 1; + } + + p = his; + + for (k=0; k 0; j-=100) { + for (k=0; k global_io_scale) global_io_scale = p[j]; + } + + pixels_per_byte = 1.0 * global_io_scale / size; + if (pixels_per_byte == 0) pixels_per_byte = 1; + + for (k=0; k\n"); + fprintf(stderr, "\t-h\tthis screen\n"); + fprintf(stderr, "\t-v\tprint the version number\n"); + fprintf(stderr, "\t-i\tstartup in DiskIO mode\n"); + fprintf(stderr, "\t-s\tstartup in SysInfo mode\n"); + fprintf(stderr, "\n"); +} + +/*******************************************************************************\ +|* printversion *| +\*******************************************************************************/ + +void printversion(void) { + + if (!strcmp(ProgName, "wmmon")) { + fprintf(stderr, "%s\n", WMMON_VERSION); + } +} diff --git a/wmtetris/wmtetris/wmtetris-mask.xbm b/wmtetris/wmtetris/wmtetris-mask.xbm new file mode 100644 index 0000000..43678dc --- /dev/null +++ b/wmtetris/wmtetris/wmtetris-mask.xbm @@ -0,0 +1,46 @@ +#define wmtetris_mask_width 64 +#define wmtetris_mask_height 64 +static unsigned char wmtetris_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/wmtetris/wmtetris/wmtetris.c b/wmtetris/wmtetris/wmtetris.c new file mode 100644 index 0000000..fc8fff5 --- /dev/null +++ b/wmtetris/wmtetris/wmtetris.c @@ -0,0 +1,302 @@ +#include +#include +#include +#include + +#include +#include + +#include "../wmgeneral/wmgeneral.h" + +#include "wmtetris.xpm" +#include "wmtetris-mask.xbm" + +#define TEMPORAL_RESOLUTION 10000 +#define INITIAL_DELAY 250000 +#define FAST_MODE_DELAY 30000 +#define DELAY_INCREMENT 20000 + +#define BLOCK_SIZE 3 +#define BOARD_POS_X 4 +#define BOARD_POS_Y 6 +#define BOARD_WIDTH 13 +#define BOARD_HEIGHT 18 +#define NEXT_POS_X 46 +#define NEXT_POS_Y 7 + +#define BUTTONC 6 +#define BUTTON_NONE 0 +#define BUTTON_ROTATE_LEFT 1 +#define BUTTON_ROTATE_RIGHT 2 +#define BUTTON_MOVE_LEFT 3 +#define BUTTON_MOVE_RIGHT 4 +#define BUTTON_MOVE_DOWN 5 + +static int buttons[6][4] = { + { 0, 0, 64, 64}, + {43, 31, 51, 40}, + {52, 31, 60, 40}, + {43, 41, 51, 50}, + {52, 41, 60, 50}, + {43, 51, 60, 60} +}; + +static int initial_figures[7][4][2] = { + { {0, 1}, {1, 1}, {2, 1}, {3, 1} }, + { {0, 1}, {1, 1}, {2, 1}, {2, 2} }, + { {0, 2}, {1, 2}, {2, 2}, {2, 1} }, + { {0, 2}, {1, 1}, {1, 2}, {2, 2} }, + { {0, 2}, {1, 2}, {1, 1}, {2, 1} }, + { {0, 1}, {1, 1}, {1, 2}, {2, 2} }, + { {1, 1}, {2, 1}, {1, 2}, {2, 2} } +}; + +unsigned char board[BOARD_WIDTH][BOARD_HEIGHT]; +int score=0; + +int which_button(int x, int y); +int rotate_figure(int direction, int figure[4][2], int fig_x, int fig_y); +void draw_figure(int figure[4][2], int type, int x, int y); +void draw_next_figure(int figure[4][2], int type); +void general_draw_figure(int base_x, int base_y, int figure[4][2], + int type, int x, int y); +void full_refresh(); +int check_figure_position(int fig_x, int fig_y, int figure[4][2]); + +int main(int argc, char *argv[]) { + int i, x, y, step, input, fast_mode, progress, + fig_x, fig_y, new_figure=1, figure_type, next_figure_type; + int figure[4][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, + next_figure[4][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }; + unsigned long delay = INITIAL_DELAY, start_time; + XEvent event; + + srand(time()); + + for (y = 0; y < BOARD_HEIGHT; y++) + for (x = 0; x < BOARD_WIDTH; x++) + board[x][y] = 0; + + openXwindow(argc, argv, wmtetris_xpm, wmtetris_mask_bits, + wmtetris_mask_width, wmtetris_mask_height); + copyXPMArea(64, 0, 64, 64, 0, 0); + RedrawWindow(); + + fast_mode=0; + figure_type = random() % 7; + for (i = 0; i < 4; i++) { + figure[i][0] = initial_figures[figure_type][i][0]; + figure[i][1] = initial_figures[figure_type][i][1]; + } + next_figure_type = random() % 7; + for (i = 0; i < 4; i++) { + next_figure[i][0] = initial_figures[next_figure_type][i][0]; + next_figure[i][1] = initial_figures[next_figure_type][i][1]; + } + draw_next_figure(next_figure, next_figure_type); + fig_x = BOARD_WIDTH / 2 - 1; + fig_y = 0; + draw_figure(figure, figure_type, fig_x, fig_y); + RedrawWindow(); + + while (1) { + if (check_figure_position(fig_x, fig_y + 1, figure)) { + new_figure = 0; + draw_figure(figure, -1, fig_x, fig_y); + fig_y++; + } else { + new_figure = 1; + for (i = 0; i < 4; i++) { + board [fig_x + figure[i][0]] [fig_y + figure[i][1]] = figure_type + 1; + } + + progress=0; + for (y = 0; y < BOARD_HEIGHT; y++) { + for (x = 0; x < BOARD_WIDTH; x++) + if (!board[x][y]) + break; + if (x == BOARD_WIDTH) { + for (i = y; i > 0; i--) + for (x = 0; x < BOARD_WIDTH; x++) + board[x][i] = board[x][i-1]; + progress++; + } + } + score += progress*progress; + + full_refresh(); + + i = score; + for (x = 3; x >= 0; x--) { + copyXPMArea(4 * (i % 10), 100, 3, 5, 44 + 4*x, 24); + i /= 10; + } + + figure_type = next_figure_type; + next_figure_type = random() % 7; + for (i = 0; i < 4; i++) { + figure[i][0] = next_figure[i][0]; + figure[i][1] = next_figure[i][1]; + next_figure[i][0] = initial_figures[next_figure_type][i][0]; + next_figure[i][1] = initial_figures[next_figure_type][i][1]; + } + draw_next_figure(next_figure, next_figure_type); + fig_x = BOARD_WIDTH / 2 - 1; + fig_y = 0; + } + draw_figure(figure, figure_type, fig_x, fig_y); + RedrawWindow(); + + if (new_figure) { + if (!check_figure_position(fig_x, fig_y, figure)) { + copyXPMArea(64, 64, 23, 15, 12, 24); + RedrawWindow(); + while (1) { + XNextEvent(display, &event); + if (event.type == ButtonPress) + break; + if (event.type == Expose) + RedrawWindow(); + } + exit(0); + } + } + + for (step = 0; step < (fast_mode ? FAST_MODE_DELAY / TEMPORAL_RESOLUTION : INITIAL_DELAY / TEMPORAL_RESOLUTION); step++) { + while (XPending(display)) { + input = 0; + + XNextEvent(display, &event); + switch (event.type) { + case ButtonRelease: + fast_mode = 0; + break; + case ButtonPress: + if (!(input = + which_button(event.xbutton.x, event.xbutton.y))) { +/* + switch (event.xbutton.button) { + case 1: + input = BUTTON_MOVE_LEFT; + break; + case 3: + input = BUTTON_MOVE_RIGHT; + break; + case 2: + input = BUTTON_ROTATE_RIGHT; + break; + } +*/ + } + } + if (input) { + draw_figure(figure, -1, fig_x, fig_y); + switch (input) { + case BUTTON_ROTATE_LEFT: + rotate_figure(0, figure, fig_x, fig_y); + break; + case BUTTON_ROTATE_RIGHT: + rotate_figure(1, figure, fig_x, fig_y); + break; + case BUTTON_MOVE_LEFT: + if (check_figure_position(fig_x - 1, fig_y, figure)) + fig_x--; + break; + case BUTTON_MOVE_RIGHT: + if (check_figure_position(fig_x + 1, fig_y, figure)) + fig_x++; + break; + case BUTTON_MOVE_DOWN: + fast_mode = 1; + break; + } + draw_figure(figure, figure_type, fig_x, fig_y); + RedrawWindow(); + } + } + usleep(TEMPORAL_RESOLUTION); + } + } +} + +int which_button(int x, int y) { + int i; + + for (i = BUTTONC - 1; i >= 0; i--) { + if ((buttons[i][0] <= x && x < buttons[i][2]) && + (buttons[i][1] <= y && y < buttons[i][3])) + break; + } + return i; +} + +int rotate_figure(int direction, int figure[4][2], int fig_x, int fig_y) { + int i, temp[4][2]; + + for (i = 0; i < 4; i++) { + temp[i][0] = direction ? 3 - figure[i][1] : figure[i][1]; + temp[i][1] = direction ? figure[i][0] : 3 - figure[i][0]; + } + if (check_figure_position(fig_x, fig_y, temp)) { + for (i = 0; i < 4; i++) { + figure[i][0] = temp[i][0]; + figure[i][1] = temp[i][1]; + } + return 1; + } else { + return 0; + } +} + +void draw_figure(int figure[4][2], int type, int x, int y) { + general_draw_figure(BOARD_POS_X, BOARD_POS_Y, figure, type, x, y); +} + +void draw_next_figure(int figure[4][2], int type) { + copyXPMArea(64 + NEXT_POS_X, NEXT_POS_Y, BLOCK_SIZE * 4, BLOCK_SIZE * 4, + NEXT_POS_X, NEXT_POS_Y); + general_draw_figure(NEXT_POS_X, NEXT_POS_Y, figure, type, 0, 0); +} + +void general_draw_figure(int base_x, int base_y, int figure[4][2], + int type, int x, int y) +{ + int i, block_x, block_y; + + for (i = 0; i < 4; i++) { + block_x = base_x + BLOCK_SIZE * (x + figure[i][0]); + block_y = base_y + BLOCK_SIZE * (y + figure[i][1]); + if (type == -1) + copyXPMArea(64 + block_x, block_y, BLOCK_SIZE, BLOCK_SIZE, block_x, block_y); + else + copyXPMArea(0, 64 + BLOCK_SIZE * type, BLOCK_SIZE, BLOCK_SIZE, block_x, block_y); + } +} + +void full_refresh() { + int x, y; + + for (y = 0; y < BOARD_HEIGHT; y++) + for (x = 0; x < BOARD_WIDTH; x++) + if (board[x][y]) + copyXPMArea(0, 64 + BLOCK_SIZE * (board[x][y] - 1), BLOCK_SIZE, BLOCK_SIZE, + BOARD_POS_X + BLOCK_SIZE * x, BOARD_POS_Y + BLOCK_SIZE * y); + else + copyXPMArea(64 + BOARD_POS_X + BLOCK_SIZE * x, BOARD_POS_Y + BLOCK_SIZE * y, + BLOCK_SIZE, BLOCK_SIZE, + BOARD_POS_X + BLOCK_SIZE * x, BOARD_POS_Y + BLOCK_SIZE * y); +} + +int check_figure_position(int fig_x, int fig_y, int figure[4][2]) { + int i, x, y; + + for (i = 0; i < 4; i++) { + x = fig_x + figure[i][0]; + y = fig_y + figure[i][1]; + if ((x < 0) || (x >= BOARD_WIDTH) || (y < 0) || (y >= BOARD_HEIGHT)) + return 0; + if (board[x][y]) + return 0; + } + return 1; +} diff --git a/wmtetris/wmtetris/wmtetris.h b/wmtetris/wmtetris/wmtetris.h new file mode 100644 index 0000000..16d612a --- /dev/null +++ b/wmtetris/wmtetris/wmtetris.h @@ -0,0 +1,40 @@ +/* wmapm.h -- Header file for WMAPM + * + * wmapm-1.2 (C) 1998 Chris D. Faulhaber + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + ***********************************************************************/ + +#define DELAY 250000 /* Delay between refreshes (in microseconds) */ + +#define WMAPM_VERSION "1.2" + +typedef struct apm_info { + const char driver_version[10]; + int apm_version_major; + int apm_version_minor; + int apm_flags; + int ac_line_status; + int battery_status; + int battery_flags; + int battery_percentage; + int battery_time; + int using_minutes; +} apm_info; + +#ifndef APM_32_BIT_SUPPORT +#define APM_32_BIT_SUPPORT 0x0002 +#endif diff --git a/wmtetris/wmtetris/wmtetris.xpm b/wmtetris/wmtetris/wmtetris.xpm new file mode 100644 index 0000000..52a491b --- /dev/null +++ b/wmtetris/wmtetris/wmtetris.xpm @@ -0,0 +1,532 @@ +/* XPM */ +static char * wmtetris_xpm[] = { +"128 120 409 2", +" c None", +". c #000000", +"+ c #0000FF", +"@ c #010000", +"# c #020000", +"$ c #030000", +"% c #040000", +"& c #4D4D4D", +"* c #494949", +"= c #454545", +"- c #424242", +"; c #3F3F3F", +"> c #3D3D3D", +", c #3C3C3C", +"' c #3A3A3A", +") c #717571", +"! c #9E9A9E", +"~ c #181818", +"{ c #BEBEBE", +"] c #CFCFCF", +"^ c #8E8A8E", +"/ c #616561", +"( c #CFCBCF", +"_ c #A6A2A6", +": c #DFDFDF", +"< c #EFEBEF", +"[ c #E7E7E7", +"} c #BEBABE", +"| c #DFDBDF", +"1 c #969296", +"2 c #C7C7C7", +"3 c #E7E3E7", +"4 c #AEAEAE", +"5 c #696969", +"6 c #B6AEAE", +"7 c #717171", +"8 c #B6B2B6", +"9 c #383430", +"0 c #050000", +"a c #414141", +"b c #3E3E3E", +"c c #383838", +"d c #363636", +"e c #343434", +"f c #5F635F", +"g c #848484", +"h c #060A06", +"i c #5F5F5F", +"j c #A4A4A4", +"k c #B4B4B4", +"l c #B4B0B4", +"m c #C5BDBD", +"n c #161A16", +"o c #9C989C", +"p c #47433F", +"q c #161616", +"r c #949494", +"s c #474747", +"t c #16120E", +"u c #949094", +"v c #4F4F4F", +"w c #948C8C", +"x c #57534F", +"y c #8C8C8C", +"z c #575757", +"A c #160E0E", +"B c #8C888C", +"C c #5F5B57", +"D c #060000", +"E c #2E2A26", +"F c #070000", +"G c #393939", +"H c #353535", +"I c #333333", +"J c #313131", +"K c #2F2F2F", +"L c #4D514D", +"M c #8A868A", +"N c #8A8A8A", +"O c #7A7A7A", +"P c #928E92", +"Q c #929292", +"R c #8A8282", +"S c #2D312D", +"T c #0C0C0C", +"U c #827E82", +"V c #0C0804", +"W c #AAA6AA", +"X c #A2A2A2", +"Y c #040404", +"Z c #45413D", +"` c #0C0404", +" . c #827A7A", +".. c #726E72", +"+. c #7A7272", +"@. c #4D4945", +"#. c #241C1C", +"$. c #928A8A", +"%. c #140804", +"&. c #080000", +"*. c #2E2E2E", +"=. c #2B2B2B", +"-. c #292929", +";. c #3B3F3B", +">. c #808080", +",. c #787878", +"'. c #787478", +"). c #1A1A1A", +"!. c #686868", +"~. c #231E1A", +"{. c #686468", +"]. c #232323", +"^. c #2B2323", +"/. c #685F5B", +"(. c #332F2B", +"_. c #5B5753", +":. c #2B2723", +"<. c #5B5B5B", +"[. c #3B3733", +"}. c #120A0A", +"|. c #433F3B", +"1. c #0A0000", +"2. c #2D2D2D", +"3. c #272727", +"4. c #252525", +"5. c #242424", +"6. c #292D29", +"7. c #5E5551", +"8. c #191410", +"9. c #494D49", +"0. c #5E5A5E", +"a. c #5E5E5E", +"b. c #100C08", +"c. c #515151", +"d. c #191010", +"e. c #514D49", +"f. c #666266", +"g. c #211D19", +"h. c #292521", +"i. c #080400", +"j. c #413D39", +"k. c #312D29", +"l. c #0C0000", +"m. c #212121", +"n. c #1F1F1F", +"o. c #090000", +"p. c #0B0000", +"q. c #0D0000", +"r. c #1E1E1E", +"s. c #191919", +"t. c #0E0000", +"u. c #0F0000", +"v. c #141414", +"w. c #100000", +"x. c #0E0E0E", +"y. c #110000", +"z. c #120000", +"A. c #130000", +"B. c #140000", +"C. c #150000", +"D. c #160000", +"E. c #170000", +"F. c #180000", +"G. c #190000", +"H. c #1A0000", +"I. c #1B0000", +"J. c #1C0000", +"K. c #1D0000", +"L. c #1E0000", +"M. c #4E4E4E", +"N. c #4A4A4A", +"O. c #444444", +"P. c #404040", +"Q. c #1F0000", +"R. c #200000", +"S. c #210000", +"T. c #220000", +"U. c #230000", +"V. c #008F00", +"W. c #00E100", +"X. c #240000", +"Y. c #250000", +"Z. c #260000", +"`. c #270000", +" + c #280000", +".+ c #290000", +"++ c #2A0000", +"@+ c #2B0000", +"#+ c #2C0000", +"$+ c #2D0000", +"%+ c #2E0000", +"&+ c #D7D3D7", +"*+ c #9E9E9E", +"=+ c #2F0000", +"-+ c #515551", +";+ c #300000", +">+ c #310000", +",+ c #303430", +"'+ c #000400", +")+ c #320000", +"!+ c #282C28", +"~+ c #080C08", +"{+ c #969696", +"]+ c #330000", +"^+ c #340000", +"/+ c #350000", +"(+ c #360000", +"_+ c #370000", +":+ c #380000", +"<+ c #390000", +"[+ c #3A0000", +"}+ c #3B0000", +"|+ c #3C0000", +"1+ c #3D0000", +"2+ c #3E0000", +"3+ c #3F0000", +"4+ c #400000", +"5+ c #410000", +"6+ c #420000", +"7+ c #616161", +"8+ c #430000", +"9+ c #440000", +"0+ c #450000", +"a+ c #460000", +"b+ c #470000", +"c+ c #480000", +"d+ c #490000", +"e+ c #4A0000", +"f+ c #4B0000", +"g+ c #4C0000", +"h+ c #4D0000", +"i+ c #4E0000", +"j+ c #4F0000", +"k+ c #500000", +"l+ c #510000", +"m+ c #6B6B6B", +"n+ c #0D0D0D", +"o+ c #520000", +"p+ c #530000", +"q+ c #540000", +"r+ c #505050", +"s+ c #550000", +"t+ c #560000", +"u+ c #131313", +"v+ c #570000", +"w+ c #580000", +"x+ c #590000", +"y+ c #00C700", +"z+ c #00B200", +"A+ c #009A00", +"B+ c #FFFFFF", +"C+ c #F8F8F8", +"D+ c #F2F2F2", +"E+ c #EFEFEF", +"F+ c #EDEDED", +"G+ c #ECECEC", +"H+ c #EAEAEA", +"I+ c #E9E9E9", +"J+ c #008600", +"K+ c #FEFEFE", +"L+ c #FBFBFB", +"M+ c #F9F9F9", +"N+ c #F5F5F5", +"O+ c #F3F3F3", +"P+ c #EBEBEB", +"Q+ c #E8E8E8", +"R+ c #E4E4E4", +"S+ c #E2E2E2", +"T+ c #006D00", +"U+ c #F4F4F4", +"V+ c #E6E6E6", +"W+ c #E5E5E5", +"X+ c #E0E0E0", +"Y+ c #DEDEDE", +"Z+ c #DDDDDD", +"`+ c #DBDBDB", +" @ c #D8D8D8", +".@ c #D7D7D7", +"+@ c #00C7C7", +"@@ c #00B2B6", +"#@ c #009A9E", +"$@ c #E3E3E3", +"%@ c #D9D9D9", +"&@ c #D6D6D6", +"*@ c #D5D5D5", +"=@ c #D3D3D3", +"-@ c #D1D1D1", +";@ c #D0D0D0", +">@ c #CDCDCD", +",@ c #CBCBCB", +"'@ c #CACACA", +")@ c #C8C8C8", +"!@ c #008686", +"~@ c #DCDCDC", +"{@ c #D4D4D4", +"]@ c #CECECE", +"^@ c #C9C9C9", +"/@ c #C6C6C6", +"(@ c #C5C5C5", +"_@ c #C1C1C1", +":@ c #C0C0C0", +"<@ c #006D69", +"[@ c #0000C0", +"}@ c #D2D2D2", +"|@ c #CCCCCC", +"1@ c #C4C4C4", +"2@ c #C3C3C3", +"3@ c #BFBFBF", +"4@ c #BBBBBB", +"5@ c #B9B9B9", +"6@ c #B6B6B6", +"7@ c #B5B5B5", +"8@ c #0000C7", +"9@ c #0000B6", +"0@ c #00009E", +"a@ c #C2C2C2", +"b@ c #BDBDBD", +"c@ c #BCBCBC", +"d@ c #B7B7B7", +"e@ c #B2B2B2", +"f@ c #AFAFAF", +"g@ c #ABABAB", +"h@ c #A9A9A9", +"i@ c #A8A8A8", +"j@ c #A6A6A6", +"k@ c #A5A5A5", +"l@ c #000086", +"m@ c #000069", +"n@ c #ADADAD", +"o@ c #A7A7A7", +"p@ c #A0A0A0", +"q@ c #9D9D9D", +"r@ c #9C9C9C", +"s@ c #9A9A9A", +"t@ c #999999", +"u@ c #979797", +"v@ c #919191", +"w@ c #8F8F8F", +"x@ c #C700C7", +"y@ c #B600B6", +"z@ c #9E009E", +"A@ c #A3A3A3", +"B@ c #9B9B9B", +"C@ c #959595", +"D@ c #909090", +"E@ c #898989", +"F@ c #878787", +"G@ c #828282", +"H@ c #860086", +"I@ c #989898", +"J@ c #939393", +"K@ c #8E8E8E", +"L@ c #8B8B8B", +"M@ c #858585", +"N@ c #7D7D7D", +"O@ c #7C7C7C", +"P@ c #797979", +"Q@ c #777777", +"R@ c #690069", +"S@ c #888888", +"T@ c #838383", +"U@ c #7E7E7E", +"V@ c #7B7B7B", +"W@ c #767676", +"X@ c #727272", +"Y@ c #707070", +"Z@ c #6F6F6F", +"`@ c #6D6D6D", +" # c #C70000", +".# c #B60000", +"+# c #9E0000", +"@# c #868686", +"## c #282828", +"$# c #818181", +"%# c #747474", +"&# c #737373", +"*# c #6E6E6E", +"=# c #666666", +"-# c #656565", +";# c #636363", +"># c #860000", +",# c #757575", +"'# c #6C6C6C", +")# c #646464", +"!# c #5A5A5A", +"~# c #585858", +"{# c #565656", +"]# c #690000", +"^# c #BAB8BA", +"/# c #6A6A6A", +"(# c #676767", +"_# c #595959", +":# c #545454", +"<# c #535353", +"[# c #4B4B4B", +"}# c #C7C700", +"|# c #B6B200", +"1# c #9E9A00", +"2# c #868600", +"3# c #696D00", +"4# c #797D79", +"5# c #696D69", +"6# c #414541", +"7# c #202020", +"8# c #383C38", +"9# c #202420", +"0# c #595D59", +"a# c #101410", +"b# c #CF0000", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + . . . . . . . . . . . . . . . . @ @ @ @ @ @ @ # # # # # # $ $ $ $ $ $ $ % % % & * = - ; > , ' ' ' , > ; - = * & + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + . ) ! ~ ) { ] ^ / ( _ : < [ } ( < [ | 1 | < [ { 2 < 3 4 5 | < [ 6 7 ( 3 8 9 0 * = a b ' c d e e e d c ' b a = * + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + @ f g h i j k k l m ; n o p q r s . . . t u v t w x t y z A B C A B i D ; E F = a > G H I J K K K J I H G > a = + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + $ L M N O P Q O R Q S T U H V R W X L . Y O Z ` .X X ..` % +.@.. #.$.X +.%.&.- b G e J *.=.-.-.-.=.*.J e G b - + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + % ;.>.,.>.'.,.).# !.~.# {.].# {.^.. . . . /.(.# /._.{.:.. . <.[.. ^.}.. _.|.1.; ' H J 2.-.3.4.5.4.3.-.2.J H ' ; + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + D 6.7.8.9.0.a.b.. c.d.. e.8.. e.f.f.f.b.. * g.. * h.i.e.j.f.0.a.e.k.a.f.c.&.l.> c I *.-.4.m.n.n.n.m.4.-.*.I c > + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + F &.&.&.&.&.&.&.o.o.o.o.o.o.1.1.1.1.1.1.1.p.p.p.p.p.p.p.l.l.l.l.l.l.q.q.q.q.q., d J =.3.m.r.).s.).r.m.3.=.J d , + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + o.o.o.o.1.1.1.1.1.1.1.p.p.p.p.p.p.l.l.l.l.l.l.l.q.q.q.q.q.q.t.t.t.t.t.t.t.u.u.' e K -.4.n.).q v.q ).n.4.-.K e ' + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + p.p.p.p.p.p.p.l.l.l.l.l.l.l.q.q.q.q.q.q.t.t.t.t.t.t.t.u.u.u.u.u.u.u.w.w.w.w.w.' e K -.5.n.s.v.x.v.s.n.5.-.K e ' + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + l.l.l.q.q.q.q.q.q.q.t.t.t.t.t.t.t.u.u.u.u.u.u.w.w.w.w.w.w.w.y.y.y.y.y.y.y.z.z.' e K -.4.n.).q v.q ).n.4.-.K e ' + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + t.t.t.t.t.t.u.u.u.u.u.u.u.w.w.w.w.w.w.w.y.y.y.y.y.y.z.z.z.z.z.z.z.A.A.A.A.A.A., d J =.3.m.r.).s.).r.m.3.=.J d , + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + u.u.u.w.w.w.w.w.w.y.y.y.y.y.y.y.z.z.z.z.z.z.z.A.A.A.A.A.A.B.B.B.B.B.B.B.C.C.C.> c I *.-.4.m.n.n.n.m.4.-.*.I c > + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + y.y.y.y.y.y.z.z.z.z.z.z.A.A.A.A.A.A.A.B.B.B.B.B.B.B.C.C.C.C.C.C.D.D.D.D.D.D.D.; ' H J 2.-.3.4.5.4.3.-.2.J H ' ; + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + z.z.A.A.A.A.A.A.A.B.B.B.B.B.B.C.C.C.C.C.C.C.D.D.D.D.D.D.D.E.E.E.E.E.E.F.F.F.F.- b G e J *.=.-.-.-.=.*.J e G b - + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + B.B.B.B.B.C.C.C.C.C.C.C.D.D.D.D.D.D.E.E.E.E.E.E.E.F.F.F.F.F.F.G.G.G.G.G.G.G.H.= a > G H I J K K K J I H G > a = + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + C.D.D.D.D.D.D.D.E.E.E.E.E.E.E.F.F.F.F.F.F.G.G.G.G.G.G.G.H.H.H.H.H.H.H.I.I.I.I.* = a b ' c d e e e d c ' b a = * + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + E.E.E.E.F.F.F.F.F.F.F.G.G.G.G.G.G.G.H.H.H.H.H.H.I.I.I.I.I.I.I.J.J.J.J.J.J.J.K.& * = - ; > , ' ' ' , > ; - = * & + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + G.G.G.G.G.G.G.H.H.H.H.H.H.H.I.I.I.I.I.I.J.J.J.J.J.J.J.K.K.K.K.K.K.K.L.L.L.L.L.c.M.N.s O.- a P.; P.a - O.s N.M.c.+ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + H.H.H.H.I.I.I.I.I.I.J.J.J.J.J.J.J.K.K.K.K.K.K.K.L.L.L.L.L.L.Q.Q.Q.Q.Q.Q.Q.R.R.. . . . . . . . . . . . . . . . . + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + J.J.J.J.J.J.J.K.K.K.K.K.K.L.L.L.L.L.L.L.Q.Q.Q.Q.Q.Q.Q.R.R.R.R.R.R.S.S.S.S.S.S.. . . . . . . . . . . . . . . . . + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + K.K.K.L.L.L.L.L.L.L.Q.Q.Q.Q.Q.Q.R.R.R.R.R.R.R.S.S.S.S.S.S.S.T.T.T.T.T.T.U.U.U.. V.W.V.. V.W.V.. V.W.V.. V.W.V.. + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + Q.Q.Q.Q.Q.Q.R.R.R.R.R.R.S.S.S.S.S.S.S.T.T.T.T.T.T.T.U.U.U.U.U.U.U.X.X.X.X.X.X.. W.. W.. W.. W.. W.. W.. W.. W.. + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + R.R.S.S.S.S.S.S.S.T.T.T.T.T.T.T.U.U.U.U.U.U.X.X.X.X.X.X.X.Y.Y.Y.Y.Y.Y.Y.Z.Z.Z.. W.. W.. W.. W.. W.. W.. W.. W.. + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + T.T.T.T.T.U.U.U.U.U.U.U.X.X.X.X.X.X.X.Y.Y.Y.Y.Y.Y.Z.Z.Z.Z.Z.Z.Z.`.`.`.`.`.`.`.. W.. W.. W.. W.. W.. W.. W.. W.. + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + U.U.X.X.X.X.X.X.Y.Y.Y.Y.Y.Y.Y.Z.Z.Z.Z.Z.Z.`.`.`.`.`.`.`. + + + + + + +.+.+.+.+. V.W.V.. V.W.V.. V.W.V.. V.W.V.. + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + Y.Y.Y.Y.Y.Z.Z.Z.Z.Z.Z.`.`.`.`.`.`.`. + + + + + + +.+.+.+.+.+.+++++++++++++++@+. . . . . . . . . . . . . . . . . + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + Z.`.`.`.`.`.`.`. + + + + + +.+.+.+.+.+.+.+++++++++++++++@+@+@+@+@+@+#+#+#+#+#+. . . . . . . . . . . . . . . . . + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + +.+.+.+.+.+.+.+++++++++++++@+@+@+@+@+@+@+#+#+#+#+#+#+$+$+$+$+$+$+$+%+%+&+&+&+&+&+&+&+*+. &+&+&+&+&+&+&+*++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + ++++++++++++++@+@+@+@+@+@+@+#+#+#+#+#+#+$+$+$+$+$+$+$+%+%+%+%+%+%+%+=+=+=+=+=+&+*+*+*+*+*+*+-+. &+*+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + @+@+@+#+#+#+#+#+#+#+$+$+$+$+$+$+$+%+%+%+%+%+%+=+=+=+=+=+=+=+;+;+;+;+;+;+;+>+>+&+1 ,+'+'+,+1 -+. &+1 ,+'+'+,+1 -++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + $+$+$+$+$+$+%+%+%+%+%+%+%+=+=+=+=+=+=+=+;+;+;+;+;+;+>+>+>+>+>+>+>+)+)+)+)+)+)+&+!+~+{+{+~+!+-+. &+!+~+{+{+~+!+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + %+%+%+=+=+=+=+=+=+;+;+;+;+;+;+;+>+>+>+>+>+>+)+)+)+)+)+)+)+]+]+]+]+]+]+]+^+^+^+&+. 7 *+9.*+. -+. &+. *+9.*+7 . -++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + ;+;+;+;+;+;+>+>+>+>+>+>+)+)+)+)+)+)+)+]+]+]+]+]+]+]+^+^+^+^+^+^+/+/+/+/+/+/+/+&+!+. 7 . 9.*+-+. &+*+9.. 7 . !+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + >+>+)+)+)+)+)+)+]+]+]+]+]+]+]+^+^+^+^+^+^+^+/+/+/+/+/+/+/+(+(+(+(+(+(+_+_+_+_+&+1 !+. . . 9.-+. &+9.. . . !+1 -++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + ]+]+]+]+]+^+^+^+^+^+^+/+/+/+/+/+/+/+(+(+(+(+(+(+(+_+_+_+_+_+_+:+:+:+:+:+:+:+<+&+*+*+*+*+*+*+-+. &+*+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + ^+/+/+/+/+/+/+/+(+(+(+(+(+(+(+_+_+_+_+_+_+:+:+:+:+:+:+:+<+<+<+<+<+<+<+[+[+[+[+*+-+-+-+-+-+-+-+. *+-+-+-+-+-+-+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + (+(+(+(+_+_+_+_+_+_+_+:+:+:+:+:+:+<+<+<+<+<+<+<+[+[+[+[+[+[+[+}+}+}+}+}+}+}+|+. . . . . . . . . . . . . . . . . + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + :+:+:+:+:+:+:+<+<+<+<+<+<+<+[+[+[+[+[+[+}+}+}+}+}+}+}+|+|+|+|+|+|+|+1+1+1+1+1+&+&+&+&+&+&+&+*+. &+&+&+&+&+&+&+*++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + <+<+<+<+[+[+[+[+[+[+}+}+}+}+}+}+}+|+|+|+|+|+|+|+1+1+1+1+1+1+2+2+2+2+2+2+2+3+3+&+*+*+*+*+*+*+-+. &+*+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + }+}+}+}+}+}+}+|+|+|+|+|+|+1+1+1+1+1+1+1+2+2+2+2+2+2+3+3+3+3+3+3+3+4+4+4+4+4+4+&+*+*+*+) * *+-+. &+*+* ) *+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + |+|+|+1+1+1+1+1+1+1+2+2+2+2+2+2+3+3+3+3+3+3+3+4+4+4+4+4+4+5+5+5+5+5+5+5+6+6+6+&+*+7+c . . *+-+. &+*+. . c 7+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + 2+2+2+2+2+2+3+3+3+3+3+3+3+4+4+4+4+4+4+5+5+5+5+5+5+5+6+6+6+6+6+6+6+8+8+8+8+8+8+&+c ~+'+. . *+-+. &+*+. . '+~+c -++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + 3+3+4+4+4+4+4+4+4+5+5+5+5+5+5+6+6+6+6+6+6+6+8+8+8+8+8+8+8+9+9+9+9+9+9+9+0+0+0+&+*+7+c . . *+-+. &+*+. . c 7+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + 5+5+5+5+5+6+6+6+6+6+6+6+8+8+8+8+8+8+8+9+9+9+9+9+9+0+0+0+0+0+0+0+a+a+a+a+a+a+b+&+*+*+*+) * *+-+. &+*+* ) *+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + 6+6+8+8+8+8+8+8+9+9+9+9+9+9+9+0+0+0+0+0+0+0+a+a+a+a+a+a+b+b+b+b+b+b+b+c+c+c+c+&+*+*+*+*+*+*+-+. &+*+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + 9+9+9+9+9+0+0+0+0+0+0+a+a+a+a+a+a+a+b+b+b+b+b+b+b+c+c+c+c+c+c+d+d+d+d+d+d+d+e+*+-+-+-+-+-+-+-+. *+-+-+-+-+-+-+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + 0+a+a+a+a+a+a+a+b+b+b+b+b+b+c+c+c+c+c+c+c+d+d+d+d+d+d+d+e+e+e+e+e+e+f+f+f+f+f+. . . . . . . . . . . . . . . . . + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + b+b+b+b+c+c+c+c+c+c+c+d+d+d+d+d+d+e+e+e+e+e+e+e+f+f+f+f+f+f+f+g+g+g+g+g+g+h+h+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+*++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + d+d+d+d+d+d+d+e+e+e+e+e+e+f+f+f+f+f+f+f+g+g+g+g+g+g+g+h+h+h+h+h+h+i+i+i+i+i+i+&+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + e+e+e+f+f+f+f+f+f+f+g+g+g+g+g+g+g+h+h+h+h+h+h+i+i+i+i+i+i+i+j+j+j+j+j+j+j+k+k+&+*+* . . . . . . . . . . . * *+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + g+g+g+g+g+g+h+h+h+h+h+h+h+i+i+i+i+i+i+i+j+j+j+j+j+j+k+k+k+k+k+k+k+l+l+l+l+l+l+&+*+*+m+n+. . . . . . . n+m+*+*+9.+ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + h+h+i+i+i+i+i+i+i+j+j+j+j+j+j+j+k+k+k+k+k+k+k+l+l+l+l+l+l+o+o+o+o+o+o+o+p+p+p+&+*+*+*+y *.. . . . . *.y *+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + j+j+j+j+j+j+k+k+k+k+k+k+l+l+l+l+l+l+l+o+o+o+o+o+o+o+p+p+p+p+p+p+q+q+q+q+q+q+q+&+*+*+*+*+*+r+. . . r+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + k+k+l+l+l+l+l+l+l+o+o+o+o+o+o+p+p+p+p+p+p+p+q+q+q+q+q+q+q+s+s+s+s+s+s+t+t+t+t+&+*+*+*+*+*+*+7 u+7 *+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + o+o+o+o+o+p+p+p+p+p+p+p+q+q+q+q+q+q+s+s+s+s+s+s+s+t+t+t+t+t+t+v+v+v+v+v+v+v+w+&+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + p+q+q+q+q+q+q+q+s+s+s+s+s+s+s+t+t+t+t+t+t+v+v+v+v+v+v+v+w+w+w+w+w+w+w+x+x+x+x+*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++ + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"y+z+A++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . B+B+B+. . . . B+. . . C+. . . D+. E+F+G+H+I+ B+B+B+ B+ B+ B+ B+B+B+B+B+. . . + + + ", +"z+A+J++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + B+K+. L+M+. . N+O+D+. . F+P+. Q+[ . R+S+. . . B+B+ B+B+ B+B+B+ B+B+ B+B+ B+B+ . . . + + + ", +"A+J+T++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U+O+. . . . P+I+. V+W+. S+X+Y+Z+`+. @.@. . . B+B+ B+B+ B+B+ B+B+B+B+B+ B+B+ . . . + + + ", +"+@@@#@+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I+[ V+R+$@. : Y+. `+%@. &@*@=@-@;@. >@,@'@)@. B+B+B+B+B+ B+B+ B+B+ B+B+B+B+B+ B+B+B+B+ . . . + + + ", +"@@#@!@+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Z+~@. %@.@. {@=@-@] ]@. ,@^@)@/@(@. _@:@. . . B+B+ B+B+ B+B+B+B+B+ B+B+B+B+B+ B+B+ . . . + + + ", +"#@!@<@+ + + + + + + + + + + + + + + + + + + + + + [@+ + + + + + + + + + + + + + + + + + + + + + + }@;@. >@|@. ^@2 . 1@2@. 3@{ . 4@5@. 6@7@. . . B+B+ B+B+ B+B+ B+B+ B+B+ B+B+ B+B+ . . . + + + ", +"8@9@0@+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+. . . . . . . . . . . . . . . . . . + + + + + + . (@1@a@:@. b@c@. 5@d@. k e@. f@4 . g@h@i@j@k@ B+B+B+B+ B+B+ B+B+ B+B+ B+B+ B+B+B+B+B+. . . + + + ", +"9@0@l@+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+. . . . . . . . . . . . . . . . . . . + + + + + + . . . . . . . . . . . . . . . . . . . . . . . . . . + + + ", +"0@l@m@+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+. . . . . . . . . . . . . . . . . . . . + + . . . . . 4 n@g@. . o@k@. X p@. q@r@s@t@u@. r Q v@w@. B+B+B+ B+B+ B+B+ B+B+B+B+B+ B+B+B+B+ . . . + + + ", +"x@y@z@+ + + + + + + + + *+*+*+*+*+*+ . . . . . . . . . . . . . . . . . . + + . . . . k@A@. p@*+. B@s@. u@C@. Q D@. . . . E@F@. g G@ B+B+ B+B+ B+B+ B+B+ B+B+ B+B+ B+B+. . . + + + ", +"y@z@H@+ + + + + + + + + *+*+*+*+*+*+ . . . . . . . . . . . . . . . . . . . + + . . . . t@I@. r J@. D@K@. L@N . F@M@. . . . N@O@. P@Q@ B+B+ B+B+ B+B+ B+B+ B+B+ B+B+ B+B+. . . + + + ", +"z@H@R@+ + + + + + + + + *+*+*+*+*+*+ . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + . . . . K@y . E@S@. g T@. >.U@. V@O ,.W@. . X@Y@Z@`@. B+B+ B+B+ B+B+ B+B+ B+B+B+B+ B+B+B+B+ . . . + + + ", +" #.#+#+ + + + + + + + + *+*+*+*+*+*+ @###. . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + . . . . G@$#. U@O@. P@Q@. %#&#. Y@*#. . . . =#-#;#. . B+B+ B+B+ B+B+ B+B+ B+B+ B+B+B+ . . . + + + ", +".#+#>#+ + + + + + + + + *+*+*+*+*+*+ *+*+*+* . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + . . . . Q@,#. X@7 . . '#m+5 . . )#;#. . . . <.!#~#{#. B+B+ B+B+ B+B+B+ B+B+ B+B+B+B+ . . . + + + ", +"+#>#]#+ + + + + + + ^#^#*+*+*+*+*+*+ *+*+*+*+m+n+. . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + . . . . . /#5 (#. . . . i . . . _#z {#:#<#. r+M.. [#* B+B+B+ B+ B+B+B+B+B+ B+B+ B+B+. . . + + + ", +"}#|#1#+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+y *.. . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + . . . . . . . . . . . . . . . . . . . . . . . + + + + + + ", +"|#1#2#+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+*+r+. . . . . . . . . . . . &+&+&+&+&+&+&+*+&+&+&+&+&+&+&+*+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"1#2#3#+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+7 u+. . . . . . . . . &+*+*+*+*+*+*+-+&+*+*+*+*+*+*+-+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"_ 1 4#+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+Q H . . . . . . . &+1 ,+'+'+,+1 -+&+1 ,+'+'+,+1 -+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"1 4#5#+ + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+{# . . . . . . &+!+~+{+{+~+!+-+&+!+~+{+{+~+!+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"4#5#_#+ + + + + + + + + *+*+*+*+*+*+ *+*+*+*+*+*+*+*+*+*+q@ . . . . . . &+. 7 *+9.*+. -+&+. *+9.*+7 . -+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + *+*+*+*+*+*+ *+*+*+*+*+*+*+q@ . . . . . . &+!+. 7 . 9.*+-+&+*+9.. 7 . !+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+I . . . . . . . . . . . &+1 !+. . . 9.-+&+9.. . . !+1 -+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+:#. . . . . . . . . . . . &+*+*+*+*+*+*+-+&+*+*+*+*+*+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + *+W@. . . . . . . . . . . . . *+-+-+-+-+-+-+-+*+-+-+-+-+-+-+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + + . . . . . . . . . . . . . . &+&+&+&+&+&+&+*+&+&+&+&+&+&+&+*+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + + . . . . . . . . . . . . . . &+*+*+*+*+*+*+-+&+*+*+*+*+*+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+. . . . &+*+*+*+) * *+-+&+*+* ) *+*+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+. . . . &+*+7+c . . *+-+&+*+. . c 7+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + *+*+*+*+*+*+*+*+*+*+*+. . . . &+c ~+'+. . *+-+&+*+. . '+~+c -+ . . . . . 5 6#7#. . . . . . . 7#6#5 . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +" &+*+7+c . . *+-+&+*+. . c 7+*+-+ . . . . . *+@#_#!+. . . . . !+_#@#*+ . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +" &+*+*+*+) * *+-+&+*+* ) *+*+*+-+ . . . . . *+*+*+4#8#. . . 8#4#*+*+*+ . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +" &+*+*+*+*+*+*+-+&+*+*+*+*+*+*+-+ . . . . . *+*+*+*+*+5 . 5 *+*+*+*+*+ . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +" *+-+-+-+-+-+-+-+*+-+-+-+-+-+-+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +" &+&+&+&+&+&+&+&+&+&+&+&+&+&+&+*+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . &+*+*+*+*+*+*+*+*+*+*+*+*+*+*+-+ . . . . . . . _#9#. . . . 9#_#. . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"V.W.V.. . W.. . W.W.V.. W.W.V.. W.. W.. W.W.W.. V.W.W.. W.W.W.. V.W.V.. V.W.V.. &+*+*+*+*+*+*+*+*+*+*+*+*+*+*+-+ . . . . . . . {+0#a#. . a#0#{+. . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"W.. W.. W.W.. . . . W.. . . W.. W.. W.. W.. . . W.. . . . . W.. W.. W.. W.. W.. &+5 6#7#. . . . . . . . 7#6#5 9. . . . . . . . *+! 0#'+'+0#! *+. . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"W.. W.. . W.. . V.W.V.. W.W.V.. V.W.W.. W.W.V.. W.W.V.. . . W.. V.W.V.. V.W.W.. &+*+@#_#!+. . . . . . !+_#@#*+-+ . . . . . . . *+*+*+9.9.*+*+*+. . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"W.. W.. . W.. . W.. . . . . W.. . . W.. . . W.. W.. W.. . . W.. W.. W.. . . W.. &+*+*+*+4#8#. . . . 8#4#*+*+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"V.W.V.. . W.. . W.W.W.. W.W.V.. . . W.. W.W.V.. V.W.V.. . . W.. V.W.V.. W.W.V.. &+*+*+*+*+*+5 . . 5 *+*+*+*+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . &+*+*+*+*+*+*+*+*+*+*+*+*+*+*+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"b#b#b#. . b#. . b#b#b#. b#b#b#. b#. b#. b#b#b#. b#b#b#. b#b#b#. b#b#b#. b#b#b#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + ", +"b#. b#. b#b#. . . . b#. . . b#. b#. b#. b#. . . b#. . . . . b#. b#. b#. b#. b#. + + + + ", +"b#. b#. . b#. . b#b#b#. b#b#b#. b#b#b#. b#b#b#. b#b#b#. . . b#. b#b#b#. b#b#b#. B+ B+ B+ B+ B+B+B+B+B+ B+B+B+B+B+ B+B+B+B+B+ B+B+B+B+ B+B+B+B+B+ B+B+B+ + + + + ", +"b#. b#. . b#. . b#. . . . . b#. . . b#. . . b#. b#. b#. . . b#. b#. b#. . . b#. B+ B+ B+ B+ B+ B+ B+ B+ B+ B+ B+ B+ + + + + ", +"b#b#b#. . b#. . b#b#b#. b#b#b#. . . b#. b#b#b#. b#b#b#. . . b#. b#b#b#. b#b#b#. B+ B+ B+ B+ B+ B+ B+ B+B+B+B+ B+ B+B+B+B+ B+ B+B+B+ + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B+ B+ B+ B+ B+ B+ B+ B+ B+ B+ B+ B+ + + + + ", +" B+ B+ B+ B+ B+ B+B+B+B+B+ B+ B+ B+ B+B+B+B+B+ B+B+B+ + + + + ", +"+ + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "};