wmtetris: Add wmtetris version 0.1 to repository.

From
http://www.cs.mun.ca/~gstarkes/wmaker/dockapps/files/wmtetris-0.1.tar.gz
This commit is contained in:
Doug Torrance 2016-12-18 21:59:49 -05:00 committed by Carlos R. Mafra
parent da1e047a36
commit ad80340129
9 changed files with 2113 additions and 0 deletions

22
wmtetris/README Normal file
View file

@ -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.

View file

@ -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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <stdarg.h>
#include <X11/Xlib.h>
#include <X11/xpm.h>
#include <X11/extensions/shape.h>
#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<MAX_MOUSE_REGION && !found; i++) {
if (mouse_region[i].enable &&
x <= mouse_region[i].right &&
x >= 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);
}

View file

@ -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

View file

@ -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

739
wmtetris/wmtetris/wmmon.c Normal file
View file

@ -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 <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/param.h>
#include <sys/types.h>
#include <X11/Xlib.h>
#include <X11/xpm.h>
#include <X11/extensions/shape.h>
#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<argc; i++) {
char *arg = argv[i];
if (*arg=='-') {
switch (arg[1]) {
case 'd' :
if (strcmp(arg+1, "display")) {
usage();
exit(1);
}
break;
case 'v' :
printversion();
exit(0);
break;
case 'i' :
stat_current = 1;
break;
case 's' :
stat_current = 2;
break;
default:
usage();
exit(0);
break;
}
}
}
wmmon_routine(argc, argv);
}
/*******************************************************************************\
|* wmmon_routine *|
\*******************************************************************************/
typedef struct {
char name[5]; /* "cpu0..cpuz", eventually.. :) */
int his[55];
int hisaddcnt;
long rt_stat;
long statlast;
long rt_idle;
long idlelast;
} stat_dev;
#define MAX_STAT_DEVICES (4)
stat_dev stat_device[MAX_STAT_DEVICES];
char *left_action;
char *right_action;
char *middle_action;
int checksysdevs(void);
void get_statistics(char *, long *, long *, long *);
void DrawActive(char *);
void update_stat_cpu(stat_dev *);
void update_stat_io(stat_dev *);
void update_stat_mem(stat_dev *st, stat_dev *st2);
void update_stat_swp(stat_dev *);
void wmmon_routine(int argc, char **argv) {
rckeys wmmon_keys[] = {
{ "left", &left_action },
{ "right", &right_action },
{ "middle", &middle_action },
{ NULL, NULL }
};
unsigned long i,j;
long k;
XEvent Event;
int but_stat = -1;
int stat_online;
long starttime;
long curtime;
long nexttime;
long istat;
long idle;
FILE *fp;
char temp[128];
char *p;
int xpm_X = 0, xpm_Y = 0;
long online_time = 0;
long ref_time = 0;
long cnt_time;
fp = fopen("/proc/uptime", "r");
fp_meminfo = fopen("/proc/meminfo", "r");
fp_loadavg = fopen("/proc/loadavg", "r");
fp_stat = fopen("/proc/stat", "r");
if (fp) {
fscanf(fp, "%ld", &online_time);
ref_time = time(0);
fclose(fp);
}
for (i=0; i<MAX_STAT_DEVICES; i++) {
for (j=0; j<55; j++) {
stat_device[i].his[j] = 0;
}
stat_device[i].hisaddcnt = 0;
}
if (LEFT_ACTION) left_action = strdup(LEFT_ACTION);
if (RIGHT_ACTION) right_action = strdup(RIGHT_ACTION);
if (MIDDLE_ACTION) middle_action = strdup(MIDDLE_ACTION);
strcpy(temp, "/etc/wmmonrc");
parse_rcfile(temp, wmmon_keys);
p = getenv("HOME");
strcpy(temp, p);
strcat(temp, "/.wmmonrc");
parse_rcfile(temp, wmmon_keys);
strcpy(temp, "/etc/wmmonrc.fixed");
parse_rcfile(temp, wmmon_keys);
stat_online = checksysdevs();
openXwindow(argc, argv, wmmon_master_xpm, wmmon_mask_bits, wmmon_mask_width, wmmon_mask_height);
/* add mouse region */
AddMouseRegion(0, 12, 13, 58, 57);
AddMouseRegion(1, 5, 5, 24, 14);
starttime = time(0);
nexttime = starttime + 10;
for (i=0; i<stat_online; i++) {
get_statistics(stat_device[i].name, &k, &istat, &idle);
stat_device[i].statlast = istat;
stat_device[i].idlelast = idle;
}
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);
}
DrawActive(stat_device[stat_current].name);
while (1) {
curtime = time(0);
waitpid(0, NULL, WNOHANG);
update_stat_cpu(&stat_device[0]);
update_stat_io(&stat_device[1]);
if(stat_current == 2) {
update_stat_mem(&stat_device[2], &stat_device[3]);
// update_stat_swp(&stat_device[3]);
}
if (stat_current < 2) {
i = stat_current;
/* Load ding is 45 pixels hoog */
copyXPMArea(0, 64, 32, 12, 28, 4);
j = (stat_device[i].rt_stat + stat_device[i].rt_idle);
if (j != 0) {
j = (stat_device[i].rt_stat * 100) / j;
}
j = j * 0.32;
if (j > 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<stat_online; i++) {
if (stat_device[i].his[54])
stat_device[i].his[54] /= stat_device[i].hisaddcnt;
for (j=1; j<55; j++) {
stat_device[i].his[j-1] = stat_device[i].his[j];
}
if (i == stat_current) {
if (i == 0) DrawStats(stat_device[i].his, 54, 40, 5, 58);
if (i == 1) DrawStats_io(stat_device[i].his, 54, 40, 5, 58);
}
stat_device[i].his[54] = 0;
stat_device[i].hisaddcnt = 0;
}
}
RedrawWindowXY(xpm_X, xpm_Y);
while (XPending(display)) {
XNextEvent(display, &Event);
switch (Event.type) {
case Expose:
RedrawWindowXY(xpm_X, xpm_Y);
break;
case DestroyNotify:
XCloseDisplay(display);
exit(0);
break;
case ButtonPress:
but_stat = CheckMouseRegion(Event.xbutton.x, Event.xbutton.y);
break;
case ButtonRelease:
i = CheckMouseRegion(Event.xbutton.x, Event.xbutton.y);
if (but_stat == i && but_stat >= 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<num; j++) {
if (p[0] > pixels_per_byte)
pixels_per_byte += 100;
p += 1;
}
p = his;
for (k=0; k<num; k++) {
d = (1.0 * p[0] / pixels_per_byte) * size;
for (j=0; j<size; j++) {
if (j < d - 3)
copyXPMArea(2, 88, 1, 1, k+x_left, y_bottom-j);
else if (j < d)
copyXPMArea(2, 89, 1, 1, k+x_left, y_bottom-j);
else
copyXPMArea(2, 90, 1, 1, k+x_left, y_bottom-j);
}
p += 1;
}
/* Nu horizontaal op 100/200/300 etc lijntje trekken! */
for (j = pixels_per_byte-100; j > 0; j-=100) {
for (k=0; k<num; k++) {
d = (40.0 / pixels_per_byte) * j;
copyXPMArea(2, 91, 1, 1, k+x_left, y_bottom-d);
}
}
}
/*******************************************************************************\
|* DrawStats_io *|
\*******************************************************************************/
void DrawStats_io(int *his, int num, int size, int x_left, int y_bottom) {
float pixels_per_byte;
int j,k;
int *p;
int d;
static int global_io_scale = 1;
p = his;
for (j=0; j<num; j++) {
if (p[j] > 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<num; k++) {
d = (1.0 * p[0] / pixels_per_byte);
for (j=0; j<size; j++) {
if (j < d - 3)
copyXPMArea(2, 88, 1, 1, k+x_left, y_bottom-j);
else if (j < d)
copyXPMArea(2, 89, 1, 1, k+x_left, y_bottom-j);
else
copyXPMArea(2, 90, 1, 1, k+x_left, y_bottom-j);
}
p += 1;
}
}
/*******************************************************************************\
|* usage *|
\*******************************************************************************/
void usage(void) {
fprintf(stderr, "\nwmmon - programming: tijno, (de)bugging & design warp, webhosting: bobby\n\n");
fprintf(stderr, "usage:\n");
fprintf(stderr, "\t-display <display name>\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);
}
}

View file

@ -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};

View file

@ -0,0 +1,302 @@
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/xpm.h>
#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;
}

View file

@ -0,0 +1,40 @@
/* wmapm.h -- Header file for WMAPM
*
* wmapm-1.2 (C) 1998 Chris D. Faulhaber <jedgar@speck.ml.org>
*
* 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

View file

@ -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+ + + + + ",
"+ + + + + + + + + + + + + ",
"+ + + + + + + + + + + + + ",
"+ + + + + + + + + + + + + ",
"+ + + + + + + + + + + + + ",
"+ + + + + + + + + + + + + ",
"+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "};