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:
		
							parent
							
								
									da1e047a36
								
							
						
					
					
						commit
						ad80340129
					
				
					 9 changed files with 2113 additions and 0 deletions
				
			
		
							
								
								
									
										22
									
								
								wmtetris/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								wmtetris/README
									
									
									
									
									
										Normal 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.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										366
									
								
								wmtetris/wmgeneral/wmgeneral.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										366
									
								
								wmtetris/wmgeneral/wmgeneral.c
									
									
									
									
									
										Normal 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);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								wmtetris/wmgeneral/wmgeneral.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								wmtetris/wmgeneral/wmgeneral.h
									
									
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										16
									
								
								wmtetris/wmtetris/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								wmtetris/wmtetris/Makefile
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										739
									
								
								wmtetris/wmtetris/wmmon.c
									
									
									
									
									
										Normal 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);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								wmtetris/wmtetris/wmtetris-mask.xbm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								wmtetris/wmtetris/wmtetris-mask.xbm
									
									
									
									
									
										Normal 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};
 | 
			
		||||
							
								
								
									
										302
									
								
								wmtetris/wmtetris/wmtetris.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								wmtetris/wmtetris/wmtetris.c
									
									
									
									
									
										Normal 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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								wmtetris/wmtetris/wmtetris.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								wmtetris/wmtetris/wmtetris.h
									
									
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										532
									
								
								wmtetris/wmtetris/wmtetris.xpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								wmtetris/wmtetris/wmtetris.xpm
									
									
									
									
									
										Normal 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+                                                  + + + + ",
 | 
			
		||||
"+ + + + + + + + +                                                                                                                                                                                                                                       + + + + ",
 | 
			
		||||
"+ + + + + + + + +                                                                                                                                                                                                                                       + + + + ",
 | 
			
		||||
"+ + + + + + + + +                                                                                                                                                                                                                                       + + + + ",
 | 
			
		||||
"+ + + + + + + + +                                                                                                                                                                                                                                       + + + + ",
 | 
			
		||||
"+ + + + + + + + +                                                                                                                                                                                                                                       + + + + ",
 | 
			
		||||
"+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "};
 | 
			
		||||
		Loading…
	
		Reference in a new issue