dslinux/user/pixil/apps/games/minesweep Makefile mine.xpm minesweep.c minesweep.h

amadeus dslinux_amadeus at user.in-berlin.de
Tue Oct 3 13:24:36 CEST 2006


Update of /cvsroot/dslinux/dslinux/user/pixil/apps/games/minesweep
In directory antilope:/tmp/cvs-serv11916/apps/games/minesweep

Added Files:
	Makefile mine.xpm minesweep.c minesweep.h 
Log Message:
adding pristine copy of pixil to HEAD so I can branch from it

--- NEW FILE: minesweep.c ---
/*                                                                       
 * Copyright (c) 2003 Century Software, Inc.   All Rights Reserved.     
 *                                                                       
 * This file is part of the PIXIL Operating Environment                 
 *                                                                       
 * The use, copying and distribution of this file is governed by one    
 * of two licenses, the PIXIL Commercial License, or the GNU General    
 * Public License, version 2.                                           
 *                                                                       
 * Licensees holding a valid PIXIL Commercial License may use this file 
 * in accordance with the PIXIL Commercial License Agreement provided   
 * with the Software. Others are governed under the terms of the GNU   
 * General Public License version 2.                                    
 *                                                                       
 * This file may be distributed and/or modified under the terms of the  
 * GNU General Public License version 2 as published by the Free        
 * Software Foundation and appearing in the file LICENSE.GPL included   
 * in the packaging of this file.                                      
 *                                                                       
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING  
 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A            
 * PARTICULAR PURPOSE.                                                  
 *                                                                       
 * RESTRICTED RIGHTS LEGEND                                             
 *                                                                     
 * Use, duplication, or disclosure by the government is subject to      
 * restriction as set forth in paragraph (b)(3)(b) of the Rights in     
 * Technical Data and Computer Software clause in DAR 7-104.9(a).       
 *                                                                      
 * See http://www.pixil.org/gpl/ for GPL licensing       
 * information.                                                         
 *                                                                      
 * See http://www.pixil.org/license.html or              
 * email cetsales at centurysoftware.com for information about the PIXIL   
 * Commercial License Agreement, or if any conditions of this licensing 
 * are not clear to you.                                                
 */

#include <pixil_config.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <time.h>
#include <getopt.h>
#include <nano-X.h>
#include <nxcolors.h>
#include <unistd.h>

#ifdef CONFIG_PAR
#include <par/par.h>
#endif

#include "minesweep.h"

#define WM_PROPS    (GR_WM_PROPS_MAXIMIZE | GR_WM_PROPS_BORDER |\
		    GR_WM_PROPS_CAPTION |\
                    GR_WM_PROPS_CLOSEBOX)

/* The actual playing field */
static unsigned char minefield[14][14];

/* Various pixmaps and windows */
static GR_WINDOW_ID main_wid, minefield_wid, button_wid, scores_wid;
static GR_WINDOW_ID minefield_pixmap = 0, tileset_pixmap = 0;

/* Global variables */
static GR_FONT_ID g_font;

static int g_width, g_height, g_bombs;

/* The game info structure */

struct
{
    unsigned char state;
    unsigned char flags_set;
    unsigned char tiles_cleared;
    int start_time;
    int timer;
}
game_info;

/* The number colors will alternate between these three colors */
static GR_COLOR text_colors[3] =
  { GR_COLOR_BLUE, GR_COLOR_GREEN, GR_COLOR_RED };

#define KEY_UP 0x01

static unsigned short g_keyflags = 0;

typedef struct
{
    unsigned long date;
    int seconds;
}
score_t;

static score_t g_scores[10];

struct
{
    char str[25];
    GR_WINDOW_ID wid;
}
menus[] =
{
    {
    "Scores", 0}
    ,
	/*  { "Difficulty", 0 }, */
    {
    "", 0}
};

/* Advance declarations */

void start_game(void);
void clear_tile(int x, int y);
void draw_button(int state);

/* Read the top 10 high scores from the file */

void
load_scores(char *filename, score_t * scores)
{
    int i = 0;

    FILE *stream = fopen(filename, "r");
    if (!stream)
	return;

    for (i = 0; i < 10; i++)
	fscanf(stream, "%ld %d\n", &scores[i].date, &scores[i].seconds);

    fclose(stream);
}

void
save_scores(char *filename, score_t * scores)
{
    int i = 0;

    FILE *stream = fopen(filename, "w+");
    if (!stream)
	return;

    for (i = 0; i < 10; i++)
	fprintf(stream, "%ld %d\n", scores[i].date, scores[i].seconds);

    fclose(stream);
}

void
draw_scores(void)
{

    int ypos = 25;
    int i = 0;

    GR_GC_ID gc = GrNewGC();
    GrSetGCFont(gc, g_font);

    GrSetGCForeground(gc, GR_COLOR_BLACK);
    GrSetGCBackground(gc, GR_COLOR_WHITE);

    GrText(scores_wid, gc, 5, 5, "Minesweeper High Scores", -1, GR_TFTOP);

    for (i = 0; i < 10; i++, ypos += 15) {
	char str[50];
	char *ptr = str;

	if (i < 9)
	    ptr += sprintf(ptr, " %d. ", i + 1);
	else
	    ptr += sprintf(ptr, "%d. ", i + 1);

	GrText(scores_wid, gc, 10, ypos, str, -1, GR_TFTOP);

	ptr = str;

	if (g_scores[i].seconds) {
	    struct tm *tm = localtime(&g_scores[i].date);

	    ptr += sprintf(ptr, "%2.2d/%2.2d/%2.2d %2.2d:%2.2d",
			   tm->tm_mon + 1, tm->tm_mday,
			   (tm->tm_year + 1900) % 1000, tm->tm_hour,
			   tm->tm_min);

	    ptr += sprintf(ptr, "    %2.2d:%2.2d",
			   g_scores[i].seconds / 60,
			   g_scores[i].seconds % 60);
	} else
	    ptr += sprintf(ptr, "---------- --:--");

	GrText(scores_wid, gc, 30, ypos, str, -1, GR_TFTOP);
    }

    ypos += 15;
    GrText(scores_wid, gc, 5, ypos, "Click the window to close...", -1,
	   GR_TFTOP);

    GrDestroyGC(gc);
}

void
show_scores(void)
{

    if (!scores_wid) {
	scores_wid =
	    GrNewWindowEx(GR_WM_PROPS_NODECORATE, "Scores", main_wid, 0, 0,
			  240, 300, GR_COLOR_WHITE);

	GrSelectEvents(scores_wid,
		       GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN);
    }

    GrMapWindow(scores_wid);
}


void
load_tileset(char *filename)
{
    GR_GC_ID gc = GrNewGC();
    char path[256];

#ifdef CONFIG_PAR
    db_handle *par_db = db_openDB(db_getDefaultDB(), PAR_DB_MODE_RDONLY);

    if (par_db) {
	par_getScreentopDir(par_db, "icondir", path, sizeof(path) - 1);
	db_closeDB(par_db);
	strcat(path, "/");
	strcat(path, filename);
    } else
#endif
    {
	getcwd(path, sizeof(path));
	strcat(path, "/");
	strcat(path, filename);
    }

    /* Create the pixmap if needed */

    if (!tileset_pixmap)
	tileset_pixmap = GrNewPixmap(TILE_WIDTH * 6,
				     TILE_HEIGHT + BUTTON_HEIGHT, 0);

    /* Load the image directly from the file */
    printf("Trying to draw the image from %s\n", path);

    GrDrawImageFromFile(tileset_pixmap, gc, 0, 0, -1, -1, path, 0);
    GrDestroyGC(gc);
}

void
init_field(void)
{
    int i, x, y;
    int field_size = g_height * g_width;

    /* Reset each tile to be bomb free and regular */

    for (y = 0; y < g_height; y++)
	for (x = 0; x < g_width; x++) {
	    minefield[y][x] = 0;
	    SET_TILE(minefield[y][x], TILE_REGULAR);
	}

    /* Add the given number of bombs to the field  */

    for (i = 0; i < g_bombs; i++) {
	int pos;

	do
	    pos = rand() % field_size;
	while ((minefield[pos / g_height][pos % g_width]) & BOMB_FLAG);

	minefield[pos / g_height][pos % g_width] |= BOMB_FLAG;
    }
}

void
draw_menus(void)
{
    int mx = 5;
    int i = 0;

    GR_GC_ID gc = GrNewGC();

    GrSetGCForeground(gc, GR_COLOR_BLACK);
    GrSetGCBackground(gc, GR_COLOR_WHITE);

    GrSetGCFont(gc, g_font);

    while (strlen(menus[i].str)) {
	int tw, th, tb;

	GrGetGCTextSize(gc, menus[i].str, -1, GR_TFTOP, &tw, &th, &tb);
	GrText(main_wid, gc, mx, 5, menus[i].str, -1, GR_TFTOP);
	GrLine(main_wid, gc, mx, 6 + tb, mx + tw, 6 + tb);

	if (!menus[i].wid) {
	    menus[i].wid = GrNewInputWindow(main_wid, mx, 5, tw, th);
	    GrSelectEvents(menus[i].wid, GR_EVENT_MASK_BUTTON_DOWN);
	    GrMapWindow(menus[i].wid);
	}

	mx += (tw + 10);
	i++;
    }
}

/* Draw the main window */

void
draw_main(void)
{
    char flagstr[32];
    char timestr[32];

    int w = (240 - TILE_WIDTH * g_width) / 2;
    int h =
	((300 - TILE_HEIGHT * g_height) / 2) + (TILE_HEIGHT * g_height) + 5;

    int tw, th, tb;
    GR_GC_ID gc = GrNewGC();

    GrSetGCForeground(gc, GR_COLOR_BLACK);
    GrSetGCBackground(gc, GR_COLOR_WHITE);

    GrSetGCFont(gc, g_font);

    sprintf(flagstr, "Flags: %2.2d/%2.2d", game_info.flags_set, g_bombs);
    GrText(main_wid, gc, w, h, flagstr, -1, GR_TFTOP);

    sprintf(timestr, "Time: %2.2d:%2.2d",
	    game_info.timer / 60, game_info.timer % 60);

    GrGetGCTextSize(gc, timestr, -1, GR_TFTOP, &tw, &th, &tb);

    GrText(main_wid, gc, w + (TILE_WIDTH * g_width) - tw, h,
	   timestr, -1, GR_TFTOP);

    GrDestroyGC(gc);

    draw_menus();
}

void
draw_tile(int tile, int x, int y)
{

    GR_GC_ID gc = GrNewGC();

    GrCopyArea(minefield_pixmap, gc, (x * TILE_WIDTH), (y * TILE_HEIGHT),
	       TILE_WIDTH, TILE_HEIGHT, tileset_pixmap,
	       (tile - 1) * TILE_WIDTH, 0, MWROP_SRCCOPY);

    GrDestroyGC(gc);
}

int
check_neighbors(int x, int y)
{

    int count = 0;

    if (x > 0) {
	if (minefield[y][x - 1] & BOMB_FLAG)
	    count++;

	if (y > 0)
	    if (minefield[y - 1][x - 1] & BOMB_FLAG)
		count++;

	if (y < (g_height) - 1)
	    if (minefield[y + 1][x - 1] & BOMB_FLAG)
		count++;
    }

    if (x < (g_width) - 1) {

	if (minefield[y][x + 1] & BOMB_FLAG)
	    count++;

	if (y > 0)
	    if (minefield[y - 1][x + 1] & BOMB_FLAG)
		count++;

	if (y < (g_height) - 1)
	    if (minefield[y + 1][x + 1] & BOMB_FLAG)
		count++;
    }

    if (y > 0)
	if (minefield[y - 1][x] & BOMB_FLAG)
	    count++;

    if (y < (g_height) - 1)
	if (minefield[y + 1][x] & BOMB_FLAG)
	    count++;

    return (count);
}

void
clear_neighbors(int x, int y)
{

    if (x > 0) {
	clear_tile(x - 1, y);
	if (y > 0)
	    clear_tile(x - 1, y - 1);
	if (y < g_height - 1)
	    clear_tile(x - 1, y + 1);
    }

    if (x < g_width - 1) {
	clear_tile(x + 1, y);
	if (y > 0)
	    clear_tile(x + 1, y - 1);
	if (y < g_height - 1)
	    clear_tile(x + 1, y + 1);
    }

    if (y > 0)
	clear_tile(x, y - 1);
    if (y < g_height - 1)
	clear_tile(x, y + 1);
}

void
draw_empty(int x, int y)
{

    int count;
    GR_GC_ID gc = GrNewGC();

    GrSetGCForeground(gc, GR_RGB(0xC5, 0xC2, 0xC5));

    draw_tile(TILE_DEPRESSED, x, y);

    /* GrFillRect(minefield_pixmap, gc, 
       (x * TILE_WIDTH), (y * TILE_HEIGHT),
       TILE_WIDTH, TILE_HEIGHT); */

    count = check_neighbors(x, y);

    /* If there are bombs around us, then print how many there are */

    if (count) {
	char ch;
	int w, h, b;

	GrSetGCForeground(gc, text_colors[count % 3]);
	GrSetGCUseBackground(gc, 0);
	GrSetGCFont(gc, g_font);

	ch = 48 + count;

	GrGetGCTextSize(gc, &ch, 1, GR_TFTOP, &w, &h, &b);

	GrText(minefield_pixmap, gc,
	       (x * TILE_WIDTH) + ((TILE_WIDTH - w) / 2),
	       (y * TILE_HEIGHT) + ((TILE_HEIGHT - h) / 2), &ch, 1, GR_TFTOP);
    }

    GrDestroyGC(gc);
}

void
draw_field(void)
{

    int x, y;

    GR_GC_ID gc = GrNewGC();

    for (y = 0; y < g_height; y++) {
	for (x = 0; x < g_width; x++) {

	    switch (GET_TILE(minefield[y][x])) {
	    case TILE_REGULAR:
	    case TILE_BOMB:
	    case TILE_FLAG:
	    case TILE_WRONG:
		draw_tile(GET_TILE(minefield[y][x]), x, y);
		break;

	    case TILE_EMPTY:
		draw_empty(x, y);
		break;
	    }
	}
    }

    GrCopyArea(minefield_wid, gc, 0, 0,
	       TILE_WIDTH * g_width,
	       TILE_HEIGHT * g_height, minefield_pixmap, 0, 0, MWROP_SRCCOPY);

    GrDestroyGC(gc);
}

void
set_bomb(int x, int y)
{
    CLEAR_TILE(minefield[y][x]);
    SET_TILE(minefield[y][x], TILE_BOMB);
}

void
set_wrong(int x, int y)
{

    CLEAR_TILE(minefield[y][x]);
    SET_TILE(minefield[y][x], TILE_WRONG);
}

void
set_empty(int x, int y)
{
    CLEAR_TILE(minefield[y][x]);
    SET_TILE(minefield[y][x], TILE_EMPTY);
    game_info.tiles_cleared++;
}

void
clear_tile(int x, int y)
{

    /* Only proceed if this tile has been unchecked */
    if (GET_TILE(minefield[y][x]) == TILE_EMPTY ||
	GET_TILE(minefield[y][x]) == TILE_FLAG)
	return;

    /* If this tile is hiding a bomb, then return */
    if (minefield[y][x] & BOMB_FLAG)
	return;

    set_empty(x, y);

    if (check_neighbors(x, y) != 0)
	return;

    /* Otherwise, see if we can't clear our any of our neighbors too */
    clear_neighbors(x, y);
}

int
is_bomb(int x, int y)
{
    if (minefield[y][x] & BOMB_FLAG)
	if (GET_TILE(minefield[y][x]) != TILE_FLAG)
	    return (1);

    return (0);
}

/* Immediately set the user up as teh winner */

void
handle_cheat(void)
{
    int r, s;

    game_info.tiles_cleared = 0;
    game_info.flags_set = 0;

    for (r = 0; r < g_height; r++)
	for (s = 0; s < g_width; s++) {

	    if (minefield[r][s] & BOMB_FLAG) {
		CLEAR_TILE(minefield[r][s]);
		SET_TILE(minefield[r][s], TILE_FLAG);
		game_info.flags_set++;
	    } else {
		CLEAR_TILE(minefield[r][s]);
		SET_TILE(minefield[r][s], TILE_EMPTY);
		game_info.tiles_cleared++;
	    }
	}

    draw_field();
}

void
handle_minefield_down(GR_EVENT_BUTTON * button)
{

    int x = button->x / TILE_WIDTH;
    int y = button->y / TILE_HEIGHT;

    if (game_info.state == GAME_OVER)
	return;

    /* On the X86 demo, we use a right button press here, otherwise, 
       on the PDAs, we use the key */

#ifdef CONFIG_PLATFORM_X86DEMO
    if (button->buttons & MWBUTTON_R) 
#else
    if ((g_keyflags & KEY_UP) == KEY_UP) 
#endif
      {
	switch (GET_TILE(minefield[y][x])) {
	case TILE_REGULAR:
	    if (game_info.flags_set == g_bombs)
		return;

	    CLEAR_TILE(minefield[y][x]);
	    SET_TILE(minefield[y][x], TILE_FLAG);
	    game_info.flags_set++;

	    break;

	case TILE_FLAG:
	    CLEAR_TILE(minefield[y][x]);
	    SET_TILE(minefield[y][x], TILE_REGULAR);
	    game_info.flags_set--;

	    break;

	default:
	    break;
	}
    } else {
	if (GET_TILE(minefield[y][x]) == TILE_EMPTY) {
	    int bcount = 0;

	    if (x > 0) {
		bcount += is_bomb(x - 1, y);
		if (y > 0)
		    bcount += is_bomb(x - 1, y - 1);
		if (y < g_height - 1)
		    bcount += is_bomb(x - 1, y + 1);
	    }

	    if (x < g_width - 1) {
		bcount += is_bomb(x + 1, y);
		if (y > 0)
		    bcount += is_bomb(x + 1, y - 1);
		if (y < g_height - 1)
		    bcount += is_bomb(x + 1, y + 1);
	    }

	    if (y > 0)
		bcount += is_bomb(x, y - 1);
	    if (y < g_height - 1)
		bcount += is_bomb(x, y + 1);

	    if (!bcount)
		clear_neighbors(x, y);
	} else {

	    if (GET_TILE(minefield[y][x]) == TILE_FLAG)
		goto dofield;

	    if (minefield[y][x] & BOMB_FLAG) {
		int r, s;

		game_info.state = GAME_OVER;

		for (r = 0; r < g_height; r++)
		    for (s = 0; s < g_width; s++) {

			if (minefield[r][s] & BOMB_FLAG) {
			    if (GET_TILE(minefield[r][s]) != TILE_FLAG)
				set_bomb(s, r);
			} else {
			    if (GET_TILE(minefield[r][s]) == TILE_FLAG)
				set_wrong(s, r);
			}
		    }

		draw_button(BUTTON_WRONG);
	    } else
		clear_tile(x, y);
	}
    }

  dofield:
    /* Start the timer if the game is active */

    if (game_info.state == GAME_START) {
	game_info.state = GAME_ACTIVE;
	game_info.start_time = time(0);
    }

    draw_field();
}

void
draw_button(int state)
{

    GR_GC_ID gc = GrNewGC();

    GrCopyArea(button_wid, gc, 0, 0,
	       BUTTON_WIDTH, BUTTON_HEIGHT, tileset_pixmap,
	       (state * BUTTON_WIDTH), TILE_HEIGHT, MWROP_SRCCOPY);

    GrDestroyGC(gc);
}

void
handle_button(GR_EVENT_BUTTON * button, int state)
{

    draw_button(state);

    if (state == 1) {
	start_game();
	draw_field();
    }
}

void
start_game(void)
{

    time_t val = time(0);

    /* Reseed the randomizer */
    srand(val);

    /* Initalize the mine field */
    init_field();

    /* Set some variables */

    game_info.flags_set = 0;
    game_info.tiles_cleared = 0;

    game_info.timer = 0;
    game_info.start_time = 0;

    game_info.state = GAME_START;
}

int
main(int argc, char **argv)
{

    int w, h;

    /* The default game width and height */

    g_width = g_height = 10;
    g_bombs = 0;

    while (1) {
	signed char ch = getopt(argc, argv, "w:h:b:");
	if (ch == -1)
	    break;

	switch (ch) {
	case 'w':
	    g_width = atoi(optarg);
	    if (g_width > 14)
		g_width = 14;
	    if (g_width < 7)
		g_width = 7;
	    break;

	case 'h':
	    g_height = atoi(optarg);
	    if (g_height > 14)
		g_height = 14;
	    if (g_height < 7)
		g_height = 7;
	    break;

	case 'b':
	    g_bombs = atoi(optarg);
	    break;
	}
    }

    /* Load the high scores from the list */

    bzero(g_scores, sizeof(g_scores));
    load_scores("/tmp/scores", g_scores);

    /* Set the number of bombs */

    if (!g_bombs)
	g_bombs = ((g_width * g_height) / 5);
    else if (g_bombs < 5)
	g_bombs = 5;
    else if (g_bombs > ((g_width * g_height) - 1))
	g_bombs = (g_width * g_height) - 1;

    if (GrOpen() == -1) {
	fprintf(stderr, "Error - Unable to open the graphics engine\n");
	exit(-1);
    }

    g_font = GrCreateFont(GR_FONT_GUI_VAR, 0, 0);

    load_tileset("mine.xpm");

    /* Initalize the field */
    start_game();

    /* Creat the main container window */

    main_wid =
	GrNewWindowEx(WM_PROPS, "Minesweeper", GR_ROOT_WINDOW_ID, 0, 0, 240,
		      300, 0xFFFFFFFF);

    GrSelectEvents(main_wid,
		   GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_KEY_DOWN |
		   GR_EVENT_MASK_KEY_UP | GR_EVENT_MASK_CLOSE_REQ);

    /* Make the minefield */

    w = (240 - TILE_WIDTH * g_width) / 2;
    h = (300 - TILE_HEIGHT * g_height) / 2;

    minefield_wid = GrNewWindow(main_wid, w, h,
				TILE_WIDTH * g_width,
				TILE_HEIGHT * g_height,
				0, GR_RGB(0xD5, 0xD6, 0xD5), 0);

    GrSelectEvents(minefield_wid,
		   GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN);

    minefield_pixmap = GrNewPixmap(TILE_WIDTH * g_width,
				   TILE_HEIGHT * g_height, 0);

    /* Finally, create the button that we use for game control */
    button_wid = GrNewWindow(main_wid, (240 - BUTTON_WIDTH) / 2,
			     h - (5 + BUTTON_HEIGHT),
			     BUTTON_WIDTH, BUTTON_HEIGHT, 0, 0, 0);

    GrSelectEvents(button_wid,
		   GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN |
		   GR_EVENT_MASK_BUTTON_UP);

    GrMapWindow(main_wid);

    GrMapWindow(button_wid);
    GrMapWindow(minefield_wid);

    while (1) {
	GR_EVENT event;

	GrGetNextEventTimeout(&event, 1000L);

	switch (event.type) {
	case GR_EVENT_TYPE_EXPOSURE:
	    if (event.exposure.wid == main_wid)
		draw_main();
	    else if (event.exposure.wid == minefield_wid)
		draw_field();
	    else if (event.exposure.wid == button_wid)
		draw_button(BUTTON_REGULAR);
	    else if (event.exposure.wid == scores_wid)
		draw_scores();
	    //      else
	    //draw_dialog();

	    break;

	case GR_EVENT_TYPE_BUTTON_DOWN:
	    if (event.button.wid == button_wid)
		handle_button(&event.button, BUTTON_WRONG);
	    else if (event.button.wid == minefield_wid)
		handle_minefield_down(&event.button);
	    else if (event.button.wid == scores_wid)
		GrUnmapWindow(scores_wid);
	    else if (event.button.wid == menus[0].wid)
		show_scores();
	    //      else
	    //        dialog_handle_keystroke();

	    break;

	case GR_EVENT_TYPE_BUTTON_UP:
	    if (event.button.wid == button_wid)
		handle_button(&event.button, BUTTON_REGULAR);

	    break;

	case GR_EVENT_TYPE_KEY_DOWN: {
	  int togglekey = MWKEY_UP;

	  /* Use the UP key to toggle the flag on the Ipaq */
#ifdef CONFIG_PLATFORM_IPAQ
	  togglekey = MWKEY_UP;
#endif

	  /* Use the accpet key to toggle the flag on the Zaurus */

#ifdef CONFIG_PLATFORM_ZAURUS
	  togglekey = ' ';
#endif

	  if (event.keystroke.wid == main_wid) {
	    if (event.keystroke.ch == togglekey)	      
	      g_keyflags |= KEY_UP;
	    
	    if (event.keystroke.ch == 'c')
	      handle_cheat();
	    }
	}

	  break;

	case GR_EVENT_TYPE_KEY_UP: {
	  int togglekey = MWKEY_UP;

	  /* Use the UP key to toggle the flag on the Ipaq */
#ifdef CONFIG_PLATFORM_IPAQ
	  togglekey = MWKEY_UP;
#endif

	  /* Use the accpet key to toggle the flag on the Zaurus */

#ifdef CONFIG_PLATFORM_ZAURUS
	  togglekey = ' ';
#endif
	  
	  if (event.keystroke.ch == togglekey)
	    g_keyflags &= ~(KEY_UP);
	}

	  break;

	case GR_EVENT_TYPE_TIMEOUT:
	    break;

	case GR_EVENT_TYPE_CLOSE_REQ:
	    exit(0);
	}

	if (game_info.state == GAME_ACTIVE) {
	    int i;
	    int elapsed = time(0) - game_info.start_time;

	    if (((g_width * g_height) - g_bombs) == game_info.tiles_cleared) {
		game_info.state = GAME_OVER;
		draw_button(BUTTON_WON);

		/* Check to see if we have a high score */
		for (i = 0; i < 10; i++) {
		    int t;

		    if (!g_scores[i].seconds || g_scores[i].seconds > elapsed) {

			for (t = 9; t >= (i + 1); t--) {
			    g_scores[t].seconds = g_scores[t - 1].seconds;
			    g_scores[t].date = g_scores[t - 1].date;
			}
			break;
		    }
		}

		if (i < 10) {
		    g_scores[i].seconds = elapsed;
		    g_scores[i].date = time(0);
		    save_scores("/tmp/scores", g_scores);
		}
		//show_name_dialog();
	    } else
		game_info.timer = time(0) - game_info.start_time;
	}

	draw_main();
    }
}


--- NEW FILE: minesweep.h ---
/*                                                                       
 * Copyright (c) 2003 Century Software, Inc.   All Rights Reserved.     
 *                                                                       
 * This file is part of the PIXIL Operating Environment                 
 *                                                                       
 * The use, copying and distribution of this file is governed by one    
 * of two licenses, the PIXIL Commercial License, or the GNU General    
 * Public License, version 2.                                           
 *                                                                       
 * Licensees holding a valid PIXIL Commercial License may use this file 
 * in accordance with the PIXIL Commercial License Agreement provided   
 * with the Software. Others are governed under the terms of the GNU   
 * General Public License version 2.                                    
 *                                                                       
 * This file may be distributed and/or modified under the terms of the  
 * GNU General Public License version 2 as published by the Free        
 * Software Foundation and appearing in the file LICENSE.GPL included   
 * in the packaging of this file.                                      
 *                                                                       
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING  
 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A            
 * PARTICULAR PURPOSE.                                                  
 *                                                                       
 * RESTRICTED RIGHTS LEGEND                                             
 *                                                                     
 * Use, duplication, or disclosure by the government is subject to      
 * restriction as set forth in paragraph (b)(3)(b) of the Rights in     
 * Technical Data and Computer Software clause in DAR 7-104.9(a).       
 *                                                                      
 * See http://www.pixil.org/gpl/ for GPL licensing       
 * information.                                                         
 *                                                                      
 * See http://www.pixil.org/license.html or              
 * email cetsales at centurysoftware.com for information about the PIXIL   
 * Commercial License Agreement, or if any conditions of this licensing 
 * are not clear to you.                                                
 */

#ifndef _MINESWEEP_H_
#define _MINESWEEP_H_

#define VERT_SIZE  12
#define HORIZ_SIZE 12

#define BOMB_COUNT 28

#define TILE_COUNT  3
#define TILE_WIDTH  17
#define TILE_HEIGHT 17

#define BUTTON_WIDTH 34
#define BUTTON_HEIGHT 34

#define BOMB_FLAG 0x01

/* Tile definitions */

#define TILE_EMPTY     0x0
#define TILE_REGULAR   0x1
#define TILE_DEPRESSED 0x2
#define TILE_FLAG      0x3
#define TILE_BOMB      0x4
#define TILE_WRONG     0x5

#define TILE_MASK    0xF

#define BUTTON_REGULAR 0
#define BUTTON_WRONG   1
#define BUTTON_WON     2

/* Tile managment macros */

#define GET_TILE(val) ((val & 0xF0) >> 4)
#define SET_TILE(val, tile) (val |= (tile << 4))
#define CLEAR_TILE(val) (val &= ~(TILE_MASK << 4))

/* Game States */

#define GAME_OVER   0
#define GAME_START  1
#define GAME_ACTIVE 2

#endif

--- NEW FILE: Makefile ---
#games/minesweep/Makefile

TARGET=minesweep
OBJS=minesweep.o
LIBS+=-lnano-X 

ifeq ($(CONFIG_PAR),y)
LIBS+=-lpar
endif

INSTALL_EXTRAS=inst-mine

include $(BASE_DIR)/Rules.make

inst-mine:
	mkdir -p $(INSTALL_DIR)/share/images/
	cp mine.xpm $(INSTALL_DIR)/share/images/


--- NEW FILE: mine.xpm ---
/* XPM */
static char * mine2_xpm[] = {
"102 51 365 2",
"  	c None",
". 	c #FFFFFF",
"+ 	c #78C9E4",
"@ 	c #81CDE6",
"# 	c #6AC3E1",
"$ 	c #59BDDE",
"% 	c #46B5DA",
"& 	c #3BB1D8",
"* 	c #31ADD6",
"= 	c #26A6D1",
"- 	c #1C9CC7",
"; 	c #1094C0",
"> 	c #666666",
", 	c #5C5C5C",
"' 	c #757575",
") 	c #858585",
"! 	c #8D8D8D",
"~ 	c #999999",
"{ 	c #F3F3F3",
"] 	c #B9B9B9",
"^ 	c #ACACAC",
"/ 	c #E9E9E9",
"( 	c #0099CC",
"_ 	c #0889B4",
": 	c #BEBEBE",
"< 	c #A5A5A5",
"[ 	c #D7D7D7",
"} 	c #CCCCCC",
"| 	c #8E8E8E",
"1 	c #7D7D7D",
"2 	c #DCDCDC",
"3 	c #FF0808",
"4 	c #FFD5D5",
"5 	c #007DA7",
"6 	c #B4B4B4",
"7 	c #EBEBEB",
"8 	c #5B5B5B",
"9 	c #001607",
"0 	c #767676",
"a 	c #EFEFEF",
"b 	c #FF0000",
"c 	c #FF3333",
"d 	c #00759C",
"e 	c #C3C3C3",
"f 	c #001E0A",
"g 	c #004116",
"h 	c #007126",
"i 	c #00280D",
"j 	c #3B3B3B",
"k 	c #4D4D4D",
"l 	c #D3D3D3",
"m 	c #FFC2C2",
"n 	c #FF1919",
"o 	c #F92828",
"p 	c #002C0F",
"q 	c #006A8D",
"r 	c #E7E7E7",
"s 	c #868686",
"t 	c #1D1D1D",
"u 	c #005D1F",
"v 	c #008D2F",
"w 	c #009933",
"x 	c #00822B",
"y 	c #434343",
"z 	c #F7F7F7",
"A 	c #333333",
"B 	c #E1E1E1",
"C 	c #AE5A5A",
"D 	c #BC1808",
"E 	c #13862C",
"F 	c #444444",
"G 	c #004C19",
"H 	c #006120",
"I 	c #424242",
"J 	c #0F0F0F",
"K 	c #1A1A1A",
"L 	c #595959",
"M 	c #774517",
"N 	c #A13813",
"O 	c #005F20",
"P 	c #4C4C4C",
"Q 	c #007E2A",
"R 	c #003110",
"S 	c #B2B2B2",
"T 	c #848484",
"U 	c #A8A8A8",
"V 	c #000000",
"W 	c #080808",
"X 	c #7D4E1A",
"Y 	c #DBDBDB",
"Z 	c #000803",
"` 	c #515151",
" .	c #8F8F8F",
"..	c #A2230C",
"+.	c #770402",
"@.	c #3A3A3A",
"#.	c #756262",
"$.	c #BC0B03",
"%.	c #FFACAC",
"&.	c #D90D0D",
"*.	c #1E1E1E",
"=.	c #613B3B",
"-.	c #FFB3B3",
";.	c #3AB0D8",
">.	c #3D3D3D",
",.	c #FFECEC",
"'.	c #006283",
").	c #005C7A",
"!.	c #A7A7A7",
"~.	c #004C66",
"{.	c #00526D",
"].	c #E1F3F9",
"^.	c #C6E8F4",
"/.	c #A5DBED",
"(.	c #93D4E9",
"_.	c #7DCBE5",
":.	c #72C7E3",
"<.	c #8BD0E8",
"[.	c #ADDEEF",
"}.	c #E4F4FA",
"|.	c #A3DAED",
"1.	c #E0F3F9",
"2.	c #D7EFF7",
"3.	c #9DD8EC",
"4.	c #65C2E0",
"5.	c #5ABDDE",
"6.	c #BCE4F2",
"7.	c #A1D9EC",
"8.	c #85CEE7",
"9.	c #79C9E4",
"0.	c #51B9DC",
"a.	c #61C0DF",
"b.	c #B3E1F0",
"c.	c #54BBDD",
"d.	c #49B6DB",
"e.	c #3CB1D8",
"f.	c #B2E0F0",
"g.	c #43B4D9",
"h.	c #F1F9FC",
"i.	c #39ADD4",
"j.	c #2BAAD5",
"k.	c #CFECF5",
"l.	c #21A6D3",
"m.	c #30ACD6",
"n.	c #19A3D1",
"o.	c #29A9D4",
"p.	c #4EB6D8",
"q.	c #18A3D1",
"r.	c #F0F6F8",
"s.	c #2AA9D4",
"t.	c #8DAEB9",
"u.	c #7A8588",
"v.	c #ADACAB",
"w.	c #6293A3",
"x.	c #4F727E",
"y.	c #5597AC",
"z.	c #089CCE",
"A.	c #AED3E0",
"B.	c #78888C",
"C.	c #6F787B",
"D.	c #92918F",
"E.	c #D6DCDE",
"F.	c #82B9CB",
"G.	c #507580",
"H.	c #43656F",
"I.	c #90A7AE",
"J.	c #ABAAAA",
"K.	c #4F7B88",
"L.	c #878684",
"M.	c #505452",
"N.	c #F1F1F1",
"O.	c #9BD1E3",
"P.	c #2F3B3E",
"Q.	c #555858",
"R.	c #3A5F69",
"S.	c #98C2D0",
"T.	c #22211F",
"U.	c #8D8B8A",
"V.	c #AEADAC",
"W.	c #7B7B7A",
"X.	c #5B5957",
"Y.	c #B5B4B3",
"Z.	c #759CA8",
"`.	c #4D5455",
" +	c #242929",
".+	c #48A4C2",
"++	c #ABD9E8",
"@+	c #5A5B58",
"#+	c #535353",
"$+	c #43413F",
"%+	c #41646E",
"&+	c #6A838A",
"*+	c #807E7C",
"=+	c #DFF0F6",
"-+	c #4A5B5F",
";+	c #3F798B",
">+	c #0093C4",
",+	c #CFE9F2",
"'+	c #93C9DA",
")+	c #C6C5C4",
"!+	c #4A4A48",
"~+	c #3C5258",
"{+	c #3EAACD",
"]+	c #637A80",
"^+	c #C5C4C4",
"/+	c #484848",
"(+	c #ABB6BA",
"_+	c #C0D4D9",
":+	c #A0C5D1",
"<+	c #80A3AF",
"[+	c #407483",
"}+	c #434A4A",
"|+	c #E5E5E5",
"1+	c #464543",
"2+	c #BFD4DC",
"3+	c #8DB2BF",
"4+	c #494F50",
"5+	c #3A4B50",
"6+	c #13A1D0",
"7+	c #6E96A3",
"8+	c #6E6F6E",
"9+	c #52666B",
"0+	c #32839E",
"a+	c #80C4DB",
"b+	c #43595F",
"c+	c #292929",
"d+	c #191817",
"e+	c #222222",
"f+	c #829BA3",
"g+	c #192020",
"h+	c #184C5B",
"i+	c #80C5DD",
"j+	c #79ACBC",
"k+	c #797776",
"l+	c #85989E",
"m+	c #309FC4",
"n+	c #40A5C7",
"o+	c #637B81",
"p+	c #A6A6A6",
"q+	c #282623",
"r+	c #949391",
"s+	c #1C1A18",
"t+	c #2B6C81",
"u+	c #EDEDEC",
"v+	c #0D0B0A",
"w+	c #898988",
"x+	c #2E4950",
"y+	c #2A5A6A",
"z+	c #16637D",
"A+	c #057296",
"B+	c #3D9AB9",
"C+	c #71A6B7",
"D+	c #608895",
"E+	c #505758",
"F+	c #2C8FB0",
"G+	c #109FCF",
"H+	c #008CBB",
"I+	c #2093BA",
"J+	c #4C6A73",
"K+	c #394041",
"L+	c #2B6375",
"M+	c #008DBC",
"N+	c #5593A7",
"O+	c #25363A",
"P+	c #777777",
"Q+	c #0A0808",
"R+	c #19363E",
"S+	c #127393",
"T+	c #1E7592",
"U+	c #80B5C7",
"V+	c #0183AE",
"W+	c #56818F",
"X+	c #267792",
"Y+	c #0082AE",
"Z+	c #536E77",
"`+	c #008BBA",
" @	c #017FAA",
".@	c #B3B3B3",
"+@	c #262421",
"@@	c #6DBDD7",
"#@	c #23201E",
"$@	c #0089B6",
"%@	c #007FA9",
"&@	c #70B8D0",
"*@	c #46565A",
"=@	c #9CD4E6",
"-@	c #28A1C9",
";@	c #018AB7",
">@	c #86B6C5",
",@	c #73A9BB",
"'@	c #60A3B9",
")@	c #1B1917",
"!@	c #4D8294",
"~@	c #007BA5",
"{@	c #2086A8",
"]@	c #58B3D1",
"^@	c #182B2F",
"/@	c #0F9DCC",
"(@	c #0084B0",
"_@	c #5D9AAE",
":@	c #386370",
"<@	c #3087A4",
"[@	c #397284",
"}@	c #2E5C6A",
"|@	c #68BBD6",
"1@	c #3C6876",
"2@	c #1C6F8A",
"3@	c #2284A4",
"4@	c #0087B4",
"5@	c #4094B0",
"6@	c #358EAB",
"7@	c #508494",
"8@	c #4AA3BF",
"9@	c #2E85A1",
"0@	c #317A92",
"a@	c #2997BB",
"b@	c #1184AA",
"c@	c #00749B",
"d@	c #0E556C",
"e@	c #096583",
"f@	c #007096",
"g@	c #D0E4EA",
"h@	c #23454F",
"i@	c #134250",
"j@	c #207E9D",
"k@	c #4DB3D5",
"l@	c #306F82",
"m@	c #113A47",
"n@	c #12313A",
"o@	c #006B8F",
"p@	c #A0C8D5",
"q@	c #1C444F",
"r@	c #274F5B",
"s@	c #216373",
"t@	c #215667",
"u@	c #175163",
"v@	c #1682A7",
"w@	c #2C90B0",
"x@	c #096685",
"y@	c #103B48",
"z@	c #1390BA",
"A@	c #106D8C",
"B@	c #103D4B",
"C@	c #115C75",
"D@	c #183F4B",
"E@	c #249FC8",
"F@	c #B0D1DC",
"G@	c #167493",
"H@	c #1B4C5B",
"I@	c #056585",
"J@	c #158BB2",
"K@	c #147B9C",
"L@	c #174958",
"M@	c #1186AD",
"N@	c #158EB6",
"O@	c #0F7394",
"P@	c #117CA0",
"Q@	c #13789A",
"R@	c #134351",
"S@	c #0D5166",
"T@	c #60B0CB",
"U@	c #F2F2F2",
"V@	c #E6E6E6",
"W@	c #608A99",
"X@	c #7D9197",
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". + @ # $ % & & & & & & & * = - ; . > , > ' ) ) ) ) ) ) ) ) ! ! ~ ~ . . . . . . . . . . . . . . . . . . . . . . . . . . { ] ~ ^ / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". @ ( ( ( ( ( ( ( ( ( ( ( ( ( ( _ . , : : : : : : : : : : : : : : < . . . . . . . . . . . . [ } . . . . . . . . . . . . | 1 ^ ~ ' 2 . . . . . . 3 3 4 . . . . . [ } . . . . . . . . . . . . . . . . . . . . ",
". # ( ( ( ( ( ( ( ( ( ( ( ( ( ( 5 . > : : : : : : : : : : : : : : 6 . . . . . . . . . 7 ~ 8 9 0 . . . . . . . . . . . } 1 . . . } a . . . . . . 3 b c 4 . 7 ~ 8 9 0 . . . . . . . . . . . . . . . . . . . . ",
". $ ( ( ( ( ( ( ( ( ( ( ( ( ( ( d . ' : : : : : : : : : : : : : : : . . . . . . . e > f g h i } . . . . . . . . . . } j k l . . . . . . . . . . m n b o > f g h p } . . . . . . . . . . . . . . . . . . . . ",
". % ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . r s t i u v w x y z . . . . . . . . . | j A A A ~ . . . . . . . . . B C b b D E w x F z . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . r y f G x w w w w H 0 . . . . . . . . . I A I j J K A L . . . . . . r F f G M b b N w O 0 . . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . [ P i G Q w w w w R S . . . . . . . . T A ' U T j V W A ~ . . . . . [ P p G Q X b b X R S . . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . Y ! y R H v w Z z . . . . . . . . j I U . U ` V V K A . . . . . . . B  .F R ..b b +.z . . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . e > i i @.. . . . . . . . . A j T U T j V V W A . . . . . . . . . . e #.$.b b %.. . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . . . r y ! . . . . . . . . . A J j ` j W V V J A . . . . . . . . . . . . r &.b n m . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . . . . y Y . . . . . . . . . A K V V V V V V *.A . . . . . . . . . . . . . =.o 3 -.. . . . . . . . . . . . . . . . . . . . ",
". ;.( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . . . 7 @.. . . . . . . . . . ~ A W V V V V J A ~ . . . . . . . . . . . . 7 >.4 m ,.. . . . . . . . . . . . . . . . . . . . ",
". * ( ( ( ( ( ( ( ( ( ( ( ( ( ( '.. ! : : : : : : : : : : : : : : : . . . . . . . . . S > . . . . . . . . . . . L A *.W W *.A L . . . . . . . . . . . . . S > . . . . . . . . . . . . . . . . . . . . . . . ",
". = ( ( ( ( ( ( ( ( ( ( ( ( ( ( ).. ! : : : : : : : : : : : : : : : . . . . . . . . . !.!.. . . . . . . . . . . . ~ A A A A ~ . . . . . . . . . . . . . . !.!.. . . . . . . . . . . . . . . . . . . . . . . ",
". - ( ( ( ( ( ( ( ( ( ( ( ( ( ( ~.. ~ : : : : : : : : : : : : : : : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". ; _ 5 d q q q q q q q q '.).~.{.. < < 6 : : : : : : : : : : : : : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . ].^./.(._._.:._.<.[.].. . . . . . . . . . . . . . . . . . . . . . . ].^./.(._._.:._.<.[.].. . . . . . . . . . . . . . . . . . . . . . . . }.^.|.(._._.:._.<.[.1.. . . . . . . . . . . ",
". . . . . . . . . 2.3.(.(.(.(.<.<._._.:.4.5.# 6.. . . . . . . . . . . . . . . . . . . 2.3.(.(.(.(.<.<._._.:.4.5.# 6.. . . . . . . . . . . . . . . . . . . . 2.3.(.(.(.(.<.<._._.:.# 5.# 6.. . . . . . . . . ",
". . . . . . . 2.7.7.7.7.7.7.7.7.(.<.8.9.:.4.5.0.5.6.. . . . . . . . . . . . . . . 2.7.7.7.7.7.7.7.7.(.<.8.9.:.4.5.0.5.6.. . . . . . . . . . . . . . . . 2.3.3.3.3.3.3.3.3.(.<.8._.:.a.5.0.5.6.. . . . . . . ",
". . . . . . b.(.3./.[.[.[.[.[./.3.3.<.8.9.# a.c.d.;._.. . . . . . . . . . . . . b.(.3./.[.[.[.[.[./.3.3.<.8.9.# a.c.d.e._.. . . . . . . . . . . . . . f.(.3./.[.[.[.[.[./.3.3.<.8._.# a.c.d.;._.. . . . . . ",
". . . . . 7.(.7.[.[.b.6.6.6.6.[.[.7.(.<._.:.# 5.0.g.;.0.h.. . . . . . . . . . 7.(.7.[.[.b.6.6.6.6.[.[.7.(.<._.:.# 5.0.g.i.0.h.. . . . . . . . . . . |.(.3.[.[.f.6.6.6.6.f.[.3.3.<._.:.# 5.0.g.;.0.h.. . . . ",
". . . . 3.(.3.[.b.6.^.^.^.^.^.6.b.[.3.(.8.9.# a.c.d.;.j.d.. . . . . . . . . 3.(.3.[.b.6.^.^.^.^.^.6.b.[.3.(.8.9.# a.c.d.e.j.d.. . . . . . . . . . 3.(.3.[.f.6.^.^.^.^.^.6.f.[.3.(.8._.# a.c.d.;.j.d.. . . . ",
". . . [.<.(./.[.6.^.k.2.2.2.k.^.6.[./.(.<._.:.4.5.d.;.* l.# . . . . . . . [.<.(./.[.6.^.k.2.2.2.k.^.6.[./.(.<._.:.4.5.d.e.m.l.# . . . . . . . . [.<.(./.f.6.^.k.2.2.2.k.^.6.f./.(.<._.:.a.5.d.;.* l.# . . . ",
". . 2.8.(.3.[.b.^.k.2.].].].2.k.^.b.[.3.(.8.:.# 5.0.g.* l.n.b.. . . . . 2.8.(.3.[.b.^.k.2.].].].2.k.^.b.[.3.(.8.:.# 5.0.g.m.o.n.b.. . . . . . 2.8.(.3.[.f.^.k.2.1.1.1.2.k.^.f.[.3.(.8.:.# 5.p.g.* l.q.f.. . ",
". . <.8.(.7.[.6.^.2.].r.h.h.].2.^.6.[.7.(.8.9.# 5.0.g.* s.n.s.. . . . . <.8.(.7.[.6.^.2.].r.h.h.].2.^.6.[.7.(.8.9.# 5.0.g.m.o.n.o.. . . . . . <.8.(.3.[.6.^.2.1.r.h.h.1.2.^.6.[.3.(.8.:.# 5.0.g.* s.q.s.. . ",
". ^.9.8.(.7.[.6.t.u.v.r.. h.].2.^.6.[.7.<.w.x.y.5.0.g.* s.n.z.7.. . . ^.9.8.(.7.[.A.B.C.D.E.. h.].2.^.6.[.7.F.G.H.G.c.c.g.m.o.n.z.7.. . . . ^._.8.(.|.[.6.I.u.J.r.. h.}.2.^.6.[.|.<.w.K.y.5.0.g.* s.q.z.3.. ",
". _._.8.(.7.7.> > L.> M.N.r.].2.^.6.[.O.P.> L.Q.R.0.g.* s.n.z.l.. . . _._.8.(.7.S.T.U.V.W.X.Y.r.].2.^.6.[.Z.`.U.V.W. +.+g.m.o.n.z.l.. . . . _._.8.(.3.++> @+) > #+r.r.1.2.^.6.[.(.$+> ) @+%+p.g.* s.q.z.l.. ",
"].# :.8.(.3.&+> N.. . *+> =+=+k.^.b./.-+L.. . N.Q.;+g.* l.n.z.>+,+. ].# :.8.(.'+`.)+. . . } !+,+2.k.^.b.'+!+} . . . Y.~+{+m.o.n.z.>+,+. . 1.# :.8.(.(.]+ at +} ^+6 @+/+(+_+k.^.:+<+$+ at +6 ^+^+#+[+;.* l.q.z.>+k.",
"[.4.:._.<.<.}+|+. . . . 1+2+k.^.6.[.3+4+. . . . |+5+;.* l.6+z.>+9.. [.4.:._.<.7+8+. . . )+A T.C.k.^.6.[.9+T.A )+. . . > 0+m.l.6+z.>+a+. . [.a.:._.b+A A /+$+A c+c+d+e+A I.f+A $+/+> > /+A c+d+g+h+l.q.z.>+i+",
"9.a.# 9.8.j+M.. . . . . k+l+^.6.b.[.&+*+. . . . . }+m+j.l.6+z.>+n+. _.a.# 9.8.o+p+. . . q+r+X.s+^.6.b.[.s+> U.q+. . . p+t+j.l.6+z.>+{+. u+w.[+%+/+A J.. ^+) /+v+V V V e+#+b+e+w+} . } ~ @+c+V V g+x+y+z+A+B+",
"4.5.# :._.C+> . . . . . U.l+b.b.[.7.D+~ . . . . . E+F+s.n.G+( H+I+. 4.5.# :._.J+Y.. . . q+D.K+s+b.b.[.7.s+!+W.q+. . . p+L+o.n.G+( M+I+. ^+b+K.N+O+#+J.^+J.P+$+V V V Q+c+++++e+> 6 } 6 w+#+e+V V Q+R+S+z+h+T+",
"d.c.a.# 9.U+M.r.^+A A ^+> t.[./.3.3.w.> ^+A A ^+N.}+m+l.n.z.( H+V+. d.c.a.# 9.W+W.. . . )+A T.o+[./.3.3.G.T.A )+. . . 8+X+l.n.z.( M+Y+. . d.c.a.d+#+P+) P+#+e+V V V v+Z+/.3.Z+/+w+~ w+> $+J V V V g+z.( `+ @",
"g.0.5.4.:.9.-+. at +@~ U.+@}+O.3.3.(.<.@@}+#@~ U.+ at v.R.j.l.6+z.>+$@%@. g.0.5.4.:.&@*@} . . . V.X.=@3.3.(.<.a+*@Y.. . . )+*@- at l.6+z.>+;@%@. . g.0.5.x+d+$+/+$+e+V V V V e+>@(.(., at c+#+ at +@+$+g+V V V v+h+z.>+`+ @",
";.d.0.5.4.:.'@4+#@U.> )@w.(.(.<.<._._.!@)@*+k+#@4+F+l.n.G+( H+V+~@. e.d.0.5.4.:.'@T.W.~ 8+K+F.(.(.<.<._._.'@A 8+~ W. +{@o.n.G+( M+Y+~@. . ;.d.0.]@O+J J V V V V V d+Z+(.<.<._.%+e+c+e+J V V V J ^@/@( `+(@~@",
"0.g.d.c.5.4.4._ at A )@)@x.8.8.8.8.9.9.# # :@)@)@P.<@s.l.6+z.>+$@%@{@. 0.e.d.c.5.4.4.:.J+J+W+8.8.8.8.8.9.9.# # 5.[@}@L+m.o.l.6+z.>+;@%@{@. . p.g.d.c.]@K.O+g+J v+J e+K.i+8.8._.:.|@1 at g+J v+J g+R+2@/@z.>+`+ @3@",
"a.;.;.d.0.5.a.# # @@:.9.9.9.9.:.:.# a.5.0.d.n+;.j.l.6+z.( H+4@~@5 at . a.i.g.d.0.5.a.# # :.:.9.9.9.9.:.:.# a.5.0.d.g.i.j.l.6+z.( M+4@~@6 at . . a.;.;.d.0.5.5.'@N+7 at N+|@_.:.:.:.:.# a.5.8 at 9@0 at 9@a at l.q.b@(@`+(@~@5@",
"(.j.;.;.d.0.0.5.a.a.# # # # # # a.a.c.c.d.g.;.j.l.n.G+( >+$@%@c at U+. (.j.i.e.d.0.0.5.a.a.# # # # # # a.a.c.c.d.e.e.j.l.n.G+( >+;@%@c at F.. . (.j.;.0 at 1@0.0.5.a.a.# # # # # # a.a.c.c.d.g.;.j.l.q./@d at e@`+ @c@>@",
"2.l.j.* ;.g.d.0.0.5.5.5.5.5.5.5.c.c.d.g.;.;.j.l.n.G+z.>+H+V+~@f at g@. 2.l.j.m.e.g.d.0.0.5.5.5.5.5.5.5.c.c.d.g.e.e.j.l.n.G+z.>+M+Y+~@f@,+. . 2.l.j.9 at h@g.d.0.0.5.5.5.5.5.5.5.c.c.d.g.;.;.j.l.q./@( i at A+(@~@A+g@",
". ;.l.s.* * ;.g.g.d.0.0.0.0.0.0.d.g.g.;.* s.l.n.G+z.$@$@$@~@f at j@. . . i.l.o.m.m.e.g.g.d.d.k at .+0+[@[@[@l at l@0+m+o.l.n.G+z.>+M+Y+~@f at j@. . . . ;.l.l.R+9@;.g.g.d.d.0.0.0.0.0.d.g.g.;.* s.l.q./@z.A+m@(@~@c at j@. ",
". /.6+l.l.j.* ;.;.;.g.g.g.g.g.;.;.;.* j.j.l.6+6+z.~@n at c@%@c at o@p at . . . /.6+l.l.j.m.m.i.6@}@q at r@}@L+l at t+t+s@t at q@q at u@v@( ( M+4@%@c at o@S.. . . . /.q.q.3 at h@w@;.;.;.g.g.g.g.g.;.;.;.* j.j.l.q./@z. @m at o@~@c at o@:+. ",
". . s.6+n.n.l.s.s.* * * * * * * * s.s.l.n.6+z.z.x at y@x@%@c at o@j at . . . . . o.6+n.n.l.- at t@q at X+m+m.m.m.m.m.o.o.l.n.z@A at B@u@;@;@%@c at o@j at . . . . . . s./@q.T+h at 2@j.* * * * * * * * s.s.l.q.q.z.z.e at g+e@~@c at o@j at . . ",
". . [.z.z.6+6+C at D@X+E at s.s.s.l.l.l.l.n.6+6+z.f@n at n@f@%@c at o@o at F@. . . . . [.z.z.6+6+G at H@l.o.o.o.o.o.o.l.l.n.6+6+z.( >+B at I@%@c at o@o at A.. . . . . . f.z.z.q.J at R+R+3@l.s.s.s.l.l.l.q.q.q./@>+A+m at i@c@~@c at o@o at ++. . ",
". . . a.( ( z.G+K at L@D at L@C at K@M at N@N at M@O at x@L@#@y at x@V+~@c at o@o@'@. . . . . . . a.( ( z.P at P@6+n.n.n.n.n.n.6+6+z.z.( >+>+;@o at I@c at o@o@'@. . . . . . . . a.( ( z./@S+h+^@h+z+j at J@J at J@b at Q@z+h+m at i@e@ @~@c at o@o@'@. . . ",
". . . . m+>+>+( ( z.H+O at C@R at R@y at y@y at R@S at x@V+V+%@~@f at o@o@<@. . . . . . . . . m+>+>+( z.z.z.z.z.z.z.z.z.z.( >+>+;@;@%@~@f at o@o at 0+. . . . . . . . . . s.>+>+( ( z.>+Q at d@h+i at i@m at i@h+d at e@~@(@ @~@c at o@o at 9@. . . . ",
". . . . h.m+H+H+>+>+>+( ( ( >+>+>+>+H+$@$@%@~@c at f@o at o@<@r.. . . . . . . . . h.m+M+M+>+>+>+( ( ( >+>+>+>+M+M+Y+Y+~@c at f@o at o@0+r.. . . . . . . . . . h.a@`+`+>+>+>+( ( ( >+>+>+`+`+`+(@ @~@c at c@o at o@9 at r.. . . . ",
". . . . . . T at V+4@4 at 4@H+H+H+H+$@$@$@V+%@~@c at f@o at o@o@'@. . . . . . . . . . . . . T at Y+4@4 at 4@M+M+M+M+M+4 at 4@Y+%@~@c at f@o at o@o@'@. . . . . . . . . . . . . . ]@(@(@`+`+`+`+`+`+`+`+(@(@ @~@c at c@o at o@o@'@. . . . . . ",
". . . . N.|+} 3+M@%@%@%@%@%@%@%@~@~@~@c at f@o at o@o at O@t.} |+N.. . . . . . . . . U at V@} t.v@%@%@%@%@%@%@%@~@~@~@c at f@o at o@o at G@t.} V at U@. . . . . . . . . . r.V@} 3+b@~@ @ @ @ @ @~@~@~@~@c at c@o at o@o at S+3+} V at r.. . . . ",
". . } p+~ ~ ~ ~ ~ D+K at c@c at c@c at f@f at f@o at o@o at o@O at D+~ ~ ~ ~ ~ p+} . . . . . } p+~ ~ ~ ~ ~ W at P@c at c@c at c@f at f@f at o@o at o@o at G@W@~ ~ ~ ~ ~ p+} . . . . . . } p+~ ~ ~ ~ ~ D+Q at c@c at c@c at c@c at o@o at o@o at o@S+D+~ ~ ~ ~ ~ p+} . . ",
". . } p+~ ~ ~ ~ ~ ~ ~ X@!@X+O at o@o at o@O at X+!@X@~ ~ ~ ~ ~ ~ ~ p+} . . . . . } p+~ ~ ~ ~ ~ ~ ~ X@!@X+G at o@o at o@G at X+!@X@~ ~ ~ ~ ~ ~ ~ p+} . . . . . . } p+~ ~ ~ ~ ~ ~ ~ X@!@T+S+o at o@o at S+T+!@X@~ ~ ~ ~ ~ ~ ~ p+} . . ",
". . . . N.|+} } . at .@. at p+~ ~ ~ ~ ~ ~ ~ ~ ~ p+. at .@.@} } |+N.. . . . . . . . . U at V@} } Y.Y.Y.p+~ ~ ~ ~ ~ ~ ~ ~ ~ p+Y.Y.Y.} } V at U@. . . . . . . . . . r.V@} } 6 6 6 p+~ ~ ~ ~ ~ ~ ~ ~ ~ p+6 6 6 } } V at r.. . . . "};




More information about the dslinux-commit mailing list