/******************************************************************************

   gimpmask.c  --  "GIMP MASK", A Masking Plug-In for GIMP

   Copyright (c) 1998  Hirotsuna Mizuno <s1041150@u-aizu.ac.jp>

   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 of the License, 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; if not, write to the Free Software Foundation Inc., 675
   Mass Ave, Cambridge, MA 02139, USA.

 ******************************************************************************

   HOW TO COMPILE AND INSTALL:

   CFLAGS=-O3 gimptool-2.0 --install gimpmask.c

 ******************************************************************************

   If  you have  any comments,  please send them to  <s1041150@u-aizu.ac.jp>.
   I'll try to read all your comments, but please remember that I am NOT good
   at English.

 *
 * Modified for 1.2 and the Graphics Muse Tools CD
 * by Michael J. Hammel
 * 01/2002

 * very minor modifications to make this work for GIMP 2.x
 * by Anonymous
 * 06 June 2010
 ******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <gtk/gtk.h>
#include <libgimp/gimp.h>

#define PROCEDURE_NAME  "plug_in_gimpmask"
#define PLUG_IN_MENU    "<Image>/Filters/Misc/GIMP Mask"

/******************************************************************************
 * PROTOTYPES                                                                 *
 ******************************************************************************/

static gint dialog_show ( int );
static void cp_code_get ( gint32 );

/******************************************************************************
 * PARAMETERS for PLUG-IN                                                     *
 ******************************************************************************/

#define CP_CODE_MAX_LENGTH      16

#define MASK_TYPE_CP             0
#define MASK_TYPE_FL             1
#define MASK_TYPE_Q0             2
#define MASK_TYPE_MEKO           3

#define MEKO_DIRECTION_PLUS      0
#define MEKO_DIRECTION_MINUS     1

typedef struct _parameter_t parameter_t;
struct _parameter_t {
  gint mask_type;
  char cp_code[CP_CODE_MAX_LENGTH+1];
  gint offset_x;
  gint offset_y;
  gint direction;
};

static parameter_t parameters = {
  MASK_TYPE_CP,
  "GIMP",
  0,
  0,
  MEKO_DIRECTION_MINUS
};

static gint32 image_ID = 0;

/******************************************************************************
 * SELECTION                                                                  *
 ******************************************************************************/

typedef struct _selection_t selection_t;
struct _selection_t {
  gint     x1;
  gint     y1;
  gint     x2;
  gint     y2;
  gint     width;
  gint     height;
  gdouble  center_x;
  gdouble  center_y;
};

static selection_t selection;

static void
selection_init ( GimpDrawable *drawable )
{
  gimp_drawable_mask_bounds( drawable->drawable_id, 
			     &selection.x1, &selection.y1,
			     &selection.x2, &selection.y2 );
  selection.width    = selection.x2 - selection.x1;
  selection.height   = selection.y2 - selection.y1;
  selection.center_x = selection.x1 + (gdouble)selection.width / 2.0;
  selection.center_y = selection.y1 + (gdouble)selection.height / 2.0;
}

/******************************************************************************
 * PIXELS                                                                     *
 ******************************************************************************/

typedef struct _pixel_t pixel_t;
struct _pixel_t {
  guchar r;
  guchar g;
  guchar b;
  guchar a;
};

static gint        image_bpp;
static guchar    **spixels;
static guchar    **dpixels;
static GimpPixelRgn   sPR;
static GimpPixelRgn   dPR;

/*----------------------------------------------------------------------------*/

static void
pixels_init ( GimpDrawable *drawable )
{
  gint y;

  image_bpp = gimp_drawable_bpp( drawable->drawable_id );
  
  gimp_pixel_rgn_init( &sPR, drawable, selection.x1, selection.y1,
		       selection.width, selection.height, FALSE, FALSE );
  gimp_pixel_rgn_init( &dPR, drawable, selection.x1, selection.y1,
		       selection.width, selection.height, TRUE,  TRUE );
  
  spixels = (guchar**)g_malloc( sizeof(guchar*) * selection.height );
  dpixels = (guchar**)g_malloc( sizeof(guchar*) * selection.height );
  for( y = 0; y < selection.height; y++ ){
    spixels[y] = (guchar*)g_malloc( sizeof(guchar) * image_bpp * selection.width );
    dpixels[y] = (guchar*)g_malloc( sizeof(guchar) * image_bpp * selection.width );
    gimp_pixel_rgn_get_row( &sPR, spixels[y],
			    selection.x1, selection.y1 + y, selection.width );
    gimp_pixel_rgn_get_row( &sPR, dpixels[y],
			    selection.x1, selection.y1+  y, selection.width );
  }
}

/*----------------------------------------------------------------------------*/

static void
pixels_free ( void )
{
  gint y;
  
  for( y = 0; y < selection.height; ++y ){
    g_free( spixels[y] );
    g_free( dpixels[y] );
  }
  g_free( spixels );
  g_free( dpixels );
}

/*----------------------------------------------------------------------------*/

static void
pixels_get ( gint     x,
	     gint     y,
	     pixel_t *pixel )
{
  x = CLAMP( x, 0, selection.width );
  y = CLAMP( y, 0, selection.height );
  
  switch( image_bpp ){
  case 1: /* GRAY */
    pixel->r = spixels[y][x*image_bpp];
    pixel->g = spixels[y][x*image_bpp];
    pixel->b = spixels[y][x*image_bpp];
    pixel->a = 255;
    break;
  case 2: /* GRAY+A */
    pixel->r = spixels[y][x*image_bpp];
    pixel->g = spixels[y][x*image_bpp];
    pixel->b = spixels[y][x*image_bpp];
    pixel->a = spixels[y][x*image_bpp+1];
    break;
  case 3: /* RGB */
    pixel->r = spixels[y][x*image_bpp];
    pixel->g = spixels[y][x*image_bpp+1];
    pixel->b = spixels[y][x*image_bpp+2];
    pixel->a = 255;
    break;
  case 4: /* RGB+A */
    pixel->r = spixels[y][x*image_bpp];
    pixel->g = spixels[y][x*image_bpp+1];
    pixel->b = spixels[y][x*image_bpp+2];
    pixel->a = spixels[y][x*image_bpp+3];
    break;
  }
}

/*----------------------------------------------------------------------------*/

static void
pixels_set ( gint     x,
	     gint     y,
	     pixel_t *pixel )
{
  x = CLAMP( x, 0, selection.width );
  y = CLAMP( y, 0, selection.height );
  
  switch( image_bpp ){
  case 1: /* GRAY */
    dpixels[y][x*image_bpp]   = pixel->r;
    break;
  case 2: /* GRAY+A */
    dpixels[y][x*image_bpp]   = pixel->r;
    dpixels[y][x*image_bpp+1] = pixel->a;
    break;
  case 3: /* RGB */
    dpixels[y][x*image_bpp]   = pixel->r;
    dpixels[y][x*image_bpp+1] = pixel->g;
    dpixels[y][x*image_bpp+2] = pixel->b;
    break;
  case 4: /* RGB+A */
    dpixels[y][x*image_bpp]   = pixel->r;
    dpixels[y][x*image_bpp+1] = pixel->g;
    dpixels[y][x*image_bpp+2] = pixel->b;
    dpixels[y][x*image_bpp+3] = pixel->a;
    break;
  }
}

/*----------------------------------------------------------------------------*/

static void
pixels_store_row ( gint y )
{
  gimp_pixel_rgn_set_row( &dPR, dpixels[y], selection.x1, selection.y1 + y,
			  selection.width );
}

/*----------------------------------------------------------------------------*/

static void
pixels_invert ( pixel_t *pixel )
{
  pixel->r = 255 - pixel->r;
  pixel->g = 255 - pixel->g;
  pixel->b = 255 - pixel->b;
}

/******************************************************************************
 * PLUG-IN PROCEDURES                                                         *
 ******************************************************************************/

static void query ( void );
static void run ( gchar *, gint, GimpParam *, gint *, GimpParam ** );
static void mask ( GimpDrawable * );

GimpPlugInInfo PLUG_IN_INFO = {
  NULL,  /*  init_proc */
  NULL,  /*  quit_proc */
  query, /* query_proc */
  run    /*   run_proc */
};

MAIN()

/******************************************************************************
 * QUERY PROCEDURE                                                            *
 ******************************************************************************/

static void
query ( void )
{
  static GimpParamDef  args[] = {
    { GIMP_PDB_INT32,    "run_mode",  "interactive / non-interactive"     },
    { GIMP_PDB_IMAGE,    "image",     "input image"                       },
    { GIMP_PDB_DRAWABLE, "drawable",  "input drawable"                    },
    { GIMP_PDB_INT32,    "mask_type", "mask type [0:CP 1:FL 2:Q0 3:MEKO]" },
    { GIMP_PDB_STRING,   "cp_code",   "CP code"                           },
    { GIMP_PDB_INT32,    "direction", "MEKO direction [0:PLUS 1:MINUS]"   }
  };
  static int        nargs = sizeof args / sizeof args[0];
  static GimpParamDef *rets  = NULL;
  static int        nrets = 0;

  gimp_install_procedure( PROCEDURE_NAME,
			  "GIMP MASK",
			  "GIMP MASK",
			  "Hirotsuna Mizuno <s1041150@u-aizu.ac.jp>",
			  "Copyright (c) 1997-1998 Hirotsuna Mizuno",
			  "May 1, 1998",
			  PLUG_IN_MENU,
			  "RGB*",
			  GIMP_PLUGIN,
			  nargs,
			  nrets,
			  args,
			  rets );
}

/******************************************************************************
 * RUN PROCEDURE                                                              *
 ******************************************************************************/

static void
run ( gchar   *name,
      gint     nargs,
      GimpParam  *args,
      gint    *nrets,
      GimpParam **rets )
{
  GimpDrawable     *drawable;
  GimpRunMode   run_mode;
  GimpPDBStatusType    status;
  static GimpParam  returns[1];

  run_mode = args[0].data.d_int32;
  status   = GIMP_PDB_SUCCESS;

  image_ID = args[1].data.d_image;
  
  drawable = gimp_drawable_get( args[2].data.d_drawable );
  selection_init( drawable );
  pixels_init( drawable );

  if( !gimp_drawable_is_rgb( drawable->drawable_id ) ){
    status = GIMP_PDB_EXECUTION_ERROR;
  } else switch( run_mode ){
  case GIMP_RUN_WITH_LAST_VALS:
    gimp_get_data( PROCEDURE_NAME, &parameters );
    break;
  case GIMP_RUN_INTERACTIVE:
    gimp_get_data( PROCEDURE_NAME, &parameters );
    cp_code_get( image_ID );
    if( dialog_show(gimp_drawable_bpp(drawable->drawable_id) < 3 ? 1 : 3) ){
      gimp_set_data( PROCEDURE_NAME, &parameters, sizeof (parameter_t) );
    } else {
      status = GIMP_PDB_EXECUTION_ERROR;
    }
    break;
  case GIMP_RUN_NONINTERACTIVE:
    if( nargs == 6 ){
      parameters.mask_type = args[3].data.d_int32;
      g_snprintf( parameters.cp_code, CP_CODE_MAX_LENGTH, "%s", 
		  args[4].data.d_string );
      parameters.direction = args[5].data.d_int32;
    } else {
      status = GIMP_PDB_CALLING_ERROR;
    }
    break;
  }

  if( status == GIMP_PDB_SUCCESS ){
    gimp_progress_init( "masking..." );
    mask( drawable );
    gimp_drawable_flush( drawable );
    gimp_drawable_merge_shadow( drawable->drawable_id, TRUE );
    gimp_drawable_update( drawable->drawable_id, selection.x1, selection.y1,
			  selection.width, selection.height );
    if( run_mode != GIMP_RUN_NONINTERACTIVE ){
      gimp_displays_flush();
    }
  }

  pixels_free();
  gimp_drawable_detach( drawable );

  returns[0].type          = GIMP_PDB_STATUS;
  returns[0].data.d_status = status;
  *nrets = 1;
  *rets  = returns;
}

/******************************************************************************
 * CP MASK                                                                    *
 ******************************************************************************/

static void cp_init( char*, gint, gint );
static gint cp_transform( gint, gint, gint*, gint* );
static void cp_free( void );

/*----------------------------------------------------------------------------*/

static void
mask_cp ( GimpDrawable *drawable )
{
  static const gint CP_CELL_SIZE = 8;
  gint    cell_width, cell_height;
  gint    x, y, src_x, src_y;
  gint    u, v, dst_x, dst_y;
  gint    xx, yy;
  gint    rot;
  pixel_t src_pixel, dst_pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, CP_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, CP_CELL_SIZE );
  cell_height = d.quot;

  cp_init( parameters.cp_code, cell_width, cell_height );

  for( y = 0; y < cell_height; ++y ){
    for( x = 0; x < cell_width; ++x ){
      rot = cp_transform( x, y, &u, &v );
      src_x = CP_CELL_SIZE * u + parameters.offset_x;
      src_y = CP_CELL_SIZE * v + parameters.offset_y;
      dst_x = CP_CELL_SIZE * x + parameters.offset_x;
      dst_y = CP_CELL_SIZE * y + parameters.offset_y;
      for( yy = 0; yy < CP_CELL_SIZE; yy++ ){
	for( xx = 0; xx < CP_CELL_SIZE; xx++ ){
	  if( rot ){
	    pixels_get( src_x + yy, src_y + xx, &src_pixel );
	  } else {
	    pixels_get( src_x + xx, src_y + yy, &src_pixel );
	  }
	  pixels_invert( &src_pixel );
	  dst_pixel.r = src_pixel.g;
	  dst_pixel.g = src_pixel.r;
	  dst_pixel.b = src_pixel.b;
	  dst_pixel.a = src_pixel.a;
	  pixels_set( dst_x + xx, dst_y + yy, &dst_pixel );
	}
      }
    }
    gimp_progress_update( (gdouble)y / (gdouble)cell_height );
  }

  cp_free();

  for( y = 0; y < selection.height; ++y ){
    pixels_store_row( y );
  }
}

/******************************************************************************
 * FL MASK                                                                    *
 ******************************************************************************/

static void fl_init ( gint, gint );
static gint fl_transform ( gint, gint, gint*, gint* );
static void fl_free ( void );

/*----------------------------------------------------------------------------*/

static void
mask_fl ( GimpDrawable *drawable )
{
  static const gint FL_CELL_SIZE = 8;
  gint    cell_width, cell_height;
  gint    x, y, src_x, src_y;
  gint    u, v, dst_x, dst_y;
  gint    xx, yy;
  gint    inv;
  pixel_t pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, FL_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, FL_CELL_SIZE );
  cell_height = d.quot;

  fl_init( cell_width, cell_height );

  for( y = 0; y < cell_height; y++ ){
    for( x = 0; x < cell_width; x++ ){
      inv = fl_transform( x, y, &u, &v );
      src_x = FL_CELL_SIZE * x + parameters.offset_x;
      src_y = FL_CELL_SIZE * y + parameters.offset_y;
      dst_x = FL_CELL_SIZE * u + parameters.offset_x;
      dst_y = FL_CELL_SIZE * v + parameters.offset_y;
      for( yy = 0; yy < FL_CELL_SIZE; yy++ ){
	for( xx = 0; xx < FL_CELL_SIZE; xx++ ){
	  pixels_get( src_x + xx, src_y + yy, &pixel );
	  if( inv ) pixels_invert( &pixel );
	  pixels_set( dst_x + xx, dst_y + yy, &pixel );
	}
      }
    }
    gimp_progress_update( (gdouble)y / (gdouble)cell_height );
  }

  fl_free();

  for( y = 0; y < selection.height; y++ ){
    pixels_store_row( y );
  }
}

/******************************************************************************
 * Q0 MASK                                                                    *
 ******************************************************************************/

static void 
mask_q0 ( GimpDrawable *drawable )
{
  static const gint Q0_CELL_SIZE = 8;
  gint    cell_width, cell_height;
  gint    x, y, px, py;
  gint    xx, yy;
  pixel_t pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, Q0_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, Q0_CELL_SIZE );
  cell_height = d.quot;

  for( y = 0; y < cell_height; y++ ){
    for( x = 0; x < cell_width; x++ ){
      px = Q0_CELL_SIZE * x + parameters.offset_x;
      py = Q0_CELL_SIZE * y + parameters.offset_y;
      for( yy = 0; yy < Q0_CELL_SIZE; yy++ ){
	for( xx = 0; xx < Q0_CELL_SIZE; xx++ ){
	  pixels_get( px + xx, py + yy, &pixel );
	  pixels_invert( &pixel );
	  pixels_set( px + Q0_CELL_SIZE - xx - 1, py + Q0_CELL_SIZE - yy - 1,
		      &pixel );
	}
      }
    }
    gimp_progress_update( (gdouble)y / (gdouble)cell_height );
  }

  for( y = 0; y < selection.height; ++y ){
    pixels_store_row( y );
  }
}

/******************************************************************************
 * MEKO MASK                                                                  *
 ******************************************************************************/

static void meko_init ( gint, gint );
static void meko_transform ( gint, gint, gint*, gint* );
static void meko_free ( void );

/*----------------------------------------------------------------------------*/

static void
mask_meko ( GimpDrawable *drawable )
{
  static const gint MEKO_CELL_SIZE = 16;
  gint    cell_width, cell_height;
  gint    x, y, src_x, src_y;
  gint    u, v, dst_x, dst_y;
  gint    xx, yy;
  pixel_t pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, MEKO_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, MEKO_CELL_SIZE );
  cell_height = d.quot;

  meko_init( cell_width, cell_height );

  for( y = 0; y < cell_height; y++ ){
    for( x = 0; x < cell_width; x++ ){
      meko_transform( x, y, &u, &v );
      if( parameters.direction == MEKO_DIRECTION_PLUS ){
	src_x = MEKO_CELL_SIZE * x + parameters.offset_x;
	src_y = MEKO_CELL_SIZE * y + parameters.offset_y;
	dst_x = MEKO_CELL_SIZE * u + parameters.offset_x;
	dst_y = MEKO_CELL_SIZE * v + parameters.offset_y;
      } else {
	src_x = MEKO_CELL_SIZE * u + parameters.offset_x;
	src_y = MEKO_CELL_SIZE * v + parameters.offset_y;
	dst_x = MEKO_CELL_SIZE * x + parameters.offset_x;
	dst_y = MEKO_CELL_SIZE * y + parameters.offset_y;
      }
      for( yy = 0; yy < MEKO_CELL_SIZE; yy++ ){
	for( xx = 0; xx < MEKO_CELL_SIZE; xx++ ){
	  pixels_get( src_x + xx, src_y + yy, &pixel );
	  pixels_invert( &pixel );
	  pixels_set( dst_x + xx, dst_y + yy, &pixel );
	}
      }
    }
    gimp_progress_update( (gdouble)y / (gdouble)cell_height );
  }

  meko_free();

  for( y = 0; y < selection.height; y++ ){
    pixels_store_row( y );
  }
}

/******************************************************************************
 * MASK PROCEDURE                                                             *
 ******************************************************************************/

static void
mask ( GimpDrawable *drawable )
{
  switch( parameters.mask_type ){
  case MASK_TYPE_CP:
    mask_cp( drawable );
    break;
  case MASK_TYPE_FL:
    mask_fl( drawable );
    break;
  case MASK_TYPE_Q0:
    mask_q0( drawable );
    break;
  case MASK_TYPE_MEKO:
    mask_meko( drawable );
    break;
  }
}

/******************************************************************************
 * PREVIEW                                                                    *
 ******************************************************************************/

static GtkWidget *preview              = NULL;
static gint       preview_width        = 0;
static gint       preview_height       = 0;

static gint       preview_bpp          = 0;
static guchar   **preview_pixels       = NULL;

/*----------------------------------------------------------------------------*/

static void
preview_init ( int bpp )
{
  gint y;

  //  preview_bpp = (gint)( gtk_preview_get_info()->bpp );
  preview_bpp = bpp;
  
  preview_pixels = g_malloc( sizeof (guchar *) * preview_height );
  for( y = 0; y < preview_height; ++y ){
    preview_pixels[y]
      = g_malloc( sizeof (guchar) * preview_bpp * preview_width );
  }
}

/*----------------------------------------------------------------------------*/

static void
preview_free ( void )
{
  gint y;

  for( y = 0; y < preview_height; ++y ) g_free( preview_pixels[y] );
  g_free( preview_pixels );
}

/*----------------------------------------------------------------------------*/

static void
preview_mask_cp ( void )
{
  static  const gint CP_CELL_SIZE = 8;
  gint    cell_width, cell_height;
  gint    x, y, src_x, src_y;
  gint    u, v, dst_x, dst_y;
  gint    xx, yy;
  gint    rot;
  pixel_t src_pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, CP_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, CP_CELL_SIZE );
  cell_height = d.quot;

  cp_init( parameters.cp_code, cell_width, cell_height );

  for( y = 0; y < cell_height; ++y ){
    for( x = 0; x < cell_width; ++x ){
      rot = cp_transform( x, y, &u, &v );
      dst_x = CP_CELL_SIZE * x + parameters.offset_x;
      dst_y = CP_CELL_SIZE * y + parameters.offset_y;
      src_x = CP_CELL_SIZE * u + parameters.offset_x;
      src_y = CP_CELL_SIZE * v + parameters.offset_y;
      for( yy = 0; yy < CP_CELL_SIZE; yy++ ){
	for( xx = 0; xx < CP_CELL_SIZE; xx++ ){
	  if( dst_x + xx < preview_width &&
	      dst_y + yy < preview_height ){
	    if( rot ){
	      pixels_get( src_x + yy, src_y + xx, &src_pixel );
	    } else {
	      pixels_get( src_x + xx, src_y + yy, &src_pixel );
	    }
	    pixels_invert( &src_pixel );

	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp]   = src_pixel.g;
	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp+1] = src_pixel.r;
	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp+2] = src_pixel.b;
	  }
	}
      }
    }
  }

  cp_free();
}

/*----------------------------------------------------------------------------*/

static void
preview_mask_fl ( void )
{
  static const gint FL_CELL_SIZE = 8;
  gint    cell_width, cell_height;
  gint    x, y, src_x, src_y;
  gint    u, v, dst_x, dst_y;
  gint    xx, yy;
  gint    inv;
  pixel_t pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, FL_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, FL_CELL_SIZE );
  cell_height = d.quot;

  fl_init( cell_width, cell_height );

  for( y = 0; y < cell_height; y++ ){
    for( x = 0; x < cell_width; x++ ){
      inv = fl_transform( x, y, &u, &v );
      src_x = FL_CELL_SIZE * x + parameters.offset_x;
      src_y = FL_CELL_SIZE * y + parameters.offset_y;
      dst_x = FL_CELL_SIZE * u + parameters.offset_x;
      dst_y = FL_CELL_SIZE * v + parameters.offset_y;
      for( yy = 0; yy < FL_CELL_SIZE; yy++ ){
	for( xx = 0; xx < FL_CELL_SIZE; xx++ ){
	  if( ( dst_x + xx < preview_width ) &&
	      ( dst_y + yy < preview_height ) ){
	    pixels_get( src_x + xx, src_y + yy, &pixel );
	    if( inv ) pixels_invert( &pixel );

	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp]   = pixel.r;
	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp+1] = pixel.g;
	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp+2] = pixel.b;
	  }
	}
      }
    }
  }

  fl_free();
}

/*----------------------------------------------------------------------------*/

static void 
preview_mask_q0 ( void )
{
  static const gint Q0_CELL_SIZE = 8;
  gint    cell_width, cell_height;
  gint    x, y, px, py;
  gint    xx, yy;
  gint    src_x, src_y, dst_x, dst_y;
  pixel_t pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, Q0_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, Q0_CELL_SIZE );
  cell_height = d.quot;

  for( y = 0; y < cell_height; ++y ){
    for( x = 0; x < cell_width; ++x ){
      px = Q0_CELL_SIZE * x + parameters.offset_x;
      py = Q0_CELL_SIZE * y + parameters.offset_y;
      for( yy = 0; yy < Q0_CELL_SIZE; ++yy ){
	for( xx = 0; xx < Q0_CELL_SIZE; ++xx ){
	  src_x = px + xx;
	  src_y = py + yy;
	  dst_x = px + Q0_CELL_SIZE - xx - 1;
	  dst_y = py + Q0_CELL_SIZE - yy - 1;
	  if( ( dst_x < preview_width ) &&
	      ( dst_y < preview_height ) ){
	    pixels_get( src_x, src_y, &pixel );
	    pixels_invert( &pixel );

	    preview_pixels[dst_y][dst_x*preview_bpp]   = pixel.r;
	    preview_pixels[dst_y][dst_x*preview_bpp+1] = pixel.g;
	    preview_pixels[dst_y][dst_x*preview_bpp+2] = pixel.b;
	  }
	}
      }
    }
  }
}

/*----------------------------------------------------------------------------*/

static void
preview_mask_meko ( void )
{
  static const gint MEKO_CELL_SIZE = 16;
  gint    cell_width, cell_height;
  gint    x, y, src_x, src_y;
  gint    u, v, dst_x, dst_y;
  gint    xx, yy;
  pixel_t pixel;
  div_t   d;

  d = div( selection.width - parameters.offset_x, MEKO_CELL_SIZE );
  cell_width = d.quot;
  d = div( selection.height - parameters.offset_y, MEKO_CELL_SIZE );
  cell_height = d.quot;

  meko_init( cell_width, cell_height );

  for( y = 0; y < cell_height; ++y ){
    for( x = 0; x < cell_width; ++x ){
      meko_transform( x, y, &u, &v );
      if( parameters.direction == MEKO_DIRECTION_PLUS ){
	src_x = MEKO_CELL_SIZE * x + parameters.offset_x;
	src_y = MEKO_CELL_SIZE * y + parameters.offset_y;
	dst_x = MEKO_CELL_SIZE * u + parameters.offset_x;
	dst_y = MEKO_CELL_SIZE * v + parameters.offset_y;
      } else {
	src_x = MEKO_CELL_SIZE * u + parameters.offset_x;
	src_y = MEKO_CELL_SIZE * v + parameters.offset_y;
	dst_x = MEKO_CELL_SIZE * x + parameters.offset_x;
	dst_y = MEKO_CELL_SIZE * y + parameters.offset_y;
      }
      for( yy = 0; yy < MEKO_CELL_SIZE; ++yy ){
	for( xx = 0; xx < MEKO_CELL_SIZE; ++xx ){
	  if( ( dst_x + xx < preview_width ) &&
	      ( dst_y + yy < preview_height ) ){
	    pixels_get( src_x + xx, src_y + yy, &pixel );
	    pixels_invert( &pixel );

	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp]   = pixel.r;
	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp+1] = pixel.g;
	    preview_pixels[dst_y+yy][(dst_x+xx)*preview_bpp+2] = pixel.b;
	  }
	}
      }
    }
  }
  meko_free();
}

/*----------------------------------------------------------------------------*/

static void
preview_update ( void )
{
  gint    x, y;
  pixel_t src_pixel;

  gtk_widget_push_visual( gtk_preview_get_visual() );
  gtk_widget_push_colormap( gtk_preview_get_cmap() );

  for( y = 0; y < preview_height; ++y ){
    for( x = 0; x < preview_width; ++x ){
      pixels_get( x, y, &src_pixel );
      preview_pixels[y][x*preview_bpp]   = src_pixel.r;
      preview_pixels[y][x*preview_bpp+1] = src_pixel.g;
      preview_pixels[y][x*preview_bpp+2] = src_pixel.b;
    }
  }

  switch( parameters.mask_type ){
  case MASK_TYPE_CP:
    preview_mask_cp();
    break;
  case MASK_TYPE_FL:
    preview_mask_fl();
    break;
  case MASK_TYPE_Q0:
    preview_mask_q0();
    break;
  case MASK_TYPE_MEKO:
    preview_mask_meko();
    break;
  }

  for( y = 0; y < preview_height; ++y ){
    gtk_preview_draw_row( GTK_PREVIEW(preview),
			  preview_pixels[y], 0, y, preview_width );
  }

  gtk_widget_pop_colormap();
  gtk_widget_pop_visual();

  gtk_widget_draw( preview, NULL );
}

/******************************************************************************
 * ABOUT DIALOG                                                               *
 ******************************************************************************/

static void
show_about_dialog ( void )
{
  GtkWidget *window = NULL;
  GtkWidget *box    = NULL;
  GtkWidget *button = NULL;
  GtkWidget *label  = NULL;

  window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
  gtk_window_set_title( GTK_WINDOW(window), "about GIMP MASK" );
  gtk_window_position( GTK_WINDOW(window), GTK_WIN_POS_CENTER );

  box = gtk_vbox_new( TRUE, 0 );
  gtk_container_border_width( GTK_CONTAINER(window), 10 );
  gtk_container_add( GTK_CONTAINER(window), box );
  gtk_widget_show( box );

  label = gtk_label_new( "GIMP MASK Version 1.0" );
  gtk_box_pack_start( GTK_BOX(box), label, FALSE, FALSE, 0 );
  gtk_widget_show( label );

  label = gtk_label_new( "Copyright (c)1997-1998 Hirotsuna Mizuno" );
  gtk_box_pack_start( GTK_BOX(box), label, FALSE, FALSE, 0 );
  gtk_widget_show( label );

  label = gtk_label_new( "s1041150@u-aizu.ac.jp" );
  gtk_box_pack_start( GTK_BOX(box), label, FALSE, FALSE, 0 );
  gtk_widget_show( label );

  button = gtk_button_new_with_label( "CLOSE" );
  gtk_box_pack_start( GTK_BOX(box), button, FALSE, FALSE, 10 );
  gtk_signal_connect_object( GTK_OBJECT(button), "clicked",
			     GTK_SIGNAL_FUNC(gtk_widget_destroy),
			     GTK_OBJECT(window) );
  gtk_widget_show( button );

  gtk_widget_show( window );
}

/******************************************************************************
 * DIALOG BOX                                                                 *
 ******************************************************************************/

static void    cp_detect_dialog_show ( GtkEntry * );
static gchar * cp_detect_from_file ( gchar * );

static GtkWidget *dialog               = NULL;
static gint       dialog_status        = FALSE;
static GtkWidget *dialog_cp_options    = NULL;
static GtkWidget *dialog_meko_options  = NULL;
static gint       dialog_timer_cp_code = 0;

/*----------------------------------------------------------------------------*/

static void
dialog_callback_destroy ( GtkDialog *dialog, gpointer data )
{
  gtk_main_quit();
  gdk_flush();
  preview_free();
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_ok ( GtkButton *button, gpointer data )
{
  dialog_status = TRUE;
  gtk_widget_destroy( dialog );
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_cancel ( GtkButton *button, gpointer data )
{
  dialog_status = FALSE;
  gtk_widget_destroy( dialog );
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_help ( GtkWidget *button, gpointer data )
{
  show_about_dialog();
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_cp ( GtkToggleButton *button, gpointer data )
{
  if( button->active ){
    if( parameters.mask_type != MASK_TYPE_CP ){
      parameters.mask_type = MASK_TYPE_CP;
      gtk_widget_set_sensitive( dialog_cp_options, TRUE );
      gtk_widget_set_sensitive( dialog_meko_options, FALSE );
      preview_update();
    }
  }
}

/*----------------------------------------------------------------------------*/

static gint
dialog_callback_cp_timeout ( gpointer entry )
{
  char *string = gtk_entry_get_text( GTK_ENTRY(entry) );

  dialog_timer_cp_code = 0;

  if( g_strcasecmp( parameters.cp_code, string ) ){
    g_snprintf( parameters.cp_code, CP_CODE_MAX_LENGTH, "%s", string );
    preview_update();
  }
  return FALSE;
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_cp_code ( GtkEntry *entry, gpointer data )
{
  if( dialog_timer_cp_code != 0 ){
    gtk_timeout_remove( dialog_timer_cp_code );
  }
  dialog_timer_cp_code = gtk_timeout_add( 750,
					  dialog_callback_cp_timeout, entry );
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_cp_detect ( GtkButton *button, GtkEntry *entry )
{
  cp_detect_dialog_show( entry );
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_fl ( GtkToggleButton *button, gpointer data )
{
  if( button->active ){
    if( parameters.mask_type != MASK_TYPE_FL ){
      parameters.mask_type = MASK_TYPE_FL;
      gtk_widget_set_sensitive( dialog_cp_options, FALSE );
      gtk_widget_set_sensitive( dialog_meko_options, FALSE );
      preview_update();
    }
  }
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_q0 ( GtkToggleButton *button, gpointer data )
{
  if( button->active ){
    if( parameters.mask_type != MASK_TYPE_Q0 ){
      parameters.mask_type = MASK_TYPE_Q0;
      gtk_widget_set_sensitive( dialog_cp_options, FALSE );
      gtk_widget_set_sensitive( dialog_meko_options, FALSE );
      preview_update();
    }
  }
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_meko ( GtkToggleButton *button, gpointer data )
{
  if( button->active ){
    if( parameters.mask_type != MASK_TYPE_MEKO ){
      parameters.mask_type = MASK_TYPE_MEKO;
      gtk_widget_set_sensitive( dialog_cp_options, FALSE );
      gtk_widget_set_sensitive( dialog_meko_options, TRUE );
      preview_update();
    }
  }
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_meko_plus ( GtkToggleButton *button, gpointer data )
{
  if( button->active ){
    if( parameters.direction != MEKO_DIRECTION_PLUS ){
      parameters.direction = MEKO_DIRECTION_PLUS;
      preview_update();
    }
  }
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_meko_minus ( GtkToggleButton *button, gpointer data )
{
  if( button->active ){
    if( parameters.direction != MEKO_DIRECTION_MINUS ){
      parameters.direction = MEKO_DIRECTION_MINUS;
      preview_update();
    }
  }
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_offset_x ( GtkAdjustment *adj, gpointer data )
{
  if( parameters.offset_x != (gint)adj->value ){
    parameters.offset_x = (gint)adj->value;
    preview_update();
  }
}

/*----------------------------------------------------------------------------*/

static void
dialog_callback_offset_y ( GtkAdjustment *adj, gpointer data )
{
  if( parameters.offset_y != (gint)adj->value ){
    parameters.offset_y = (gint)adj->value;
    preview_update();
  }
}

/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/

static gint
dialog_show ( int preview_bpp )
{
  GtkWidget *main_box;
  GtkWidget *notebook;

  dialog_status = FALSE;

  {
    gint    argc = 1;
    gchar **argv = g_new( gchar *, 1 );
    argv[0]      = g_strdup( "GIMP MASK" );
    
    gtk_init( &argc, &argv );
    gtk_rc_parse( gimp_gtkrc() );

    gdk_set_use_xshm( TRUE );
    gtk_preview_set_gamma( gimp_gamma() );
    gtk_preview_set_install_cmap( gimp_install_cmap() );
    gtk_widget_set_default_visual( gtk_preview_get_visual() );
    gtk_widget_set_default_colormap( gtk_preview_get_cmap() );
  }

  /* dialog */
  {
    dialog = gtk_dialog_new();
    gtk_signal_connect( GTK_OBJECT(dialog), "destroy",
			GTK_SIGNAL_FUNC(dialog_callback_destroy), NULL );
    gtk_container_border_width( GTK_CONTAINER(dialog), 0 );
    gtk_window_set_title( GTK_WINDOW(dialog), "GIMP MASK" );
    gtk_window_position( GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE );
  }

  /* main horizontal box */
  {
    main_box = gtk_hbox_new( FALSE, 0 );
    gtk_container_border_width( GTK_CONTAINER(main_box), 0 );
    gtk_container_border_width( GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 0 );
    gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->vbox),
			main_box, TRUE, TRUE, 0 );
    gtk_widget_show( main_box );
  }

  /* notebook */
  {
    notebook = gtk_notebook_new();
    gtk_notebook_set_tab_pos( GTK_NOTEBOOK(notebook), GTK_POS_TOP );
    gtk_box_pack_end( GTK_BOX(main_box), notebook, TRUE, TRUE, 0 );
    gtk_widget_show( notebook );
  }

  /* OK button */
  {
    GtkWidget *button = gtk_button_new_with_label( "OK" );
    gtk_signal_connect( GTK_OBJECT(button), "clicked",
			GTK_SIGNAL_FUNC(dialog_callback_ok), NULL );
    gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->action_area),
			button, TRUE, TRUE, 0 );
    GTK_WIDGET_SET_FLAGS( button, GTK_CAN_DEFAULT );
    gtk_widget_grab_default( button );
    gtk_widget_show( button );
  }

  /* CANCEL button */
  {
    GtkWidget *button = gtk_button_new_with_label( "Cancel" );
    gtk_signal_connect( GTK_OBJECT(button), "clicked",
			GTK_SIGNAL_FUNC(dialog_callback_cancel), NULL );
    gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->action_area),
			button, TRUE, TRUE, 0 );
    gtk_widget_show( button );
  }

  /* HELP button */
  {
    GtkWidget *button = gtk_button_new_with_label( "About" );
    gtk_signal_connect( GTK_OBJECT(button), "clicked",
			GTK_SIGNAL_FUNC(dialog_callback_help), NULL );
    gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->action_area),
			button, TRUE, TRUE, 0 );
    gtk_widget_show( button );
  }

  /* Preview */
  {
    const gint frame_width  = 160;
    const gint frame_height = 240;
    GtkWidget *vbox    = gtk_vbox_new( FALSE, 0 );
    GtkWidget *frame   = gtk_frame_new( NULL );

    preview_width  = MIN( frame_width,  selection.width );
    preview_height = MIN( frame_height, selection.height );
    preview_init(preview_bpp);
    
    gtk_frame_set_shadow_type( GTK_FRAME(frame), GTK_SHADOW_IN );
    gtk_widget_set_usize( frame, preview_width, preview_height );
    gtk_container_border_width( GTK_CONTAINER(frame), 0 );
    gtk_container_border_width( GTK_CONTAINER(vbox), 10 );
    gtk_box_pack_start( GTK_BOX(vbox), frame, TRUE, FALSE, 0 );

    preview = gtk_preview_new( GTK_PREVIEW_COLOR );
    gtk_preview_size( GTK_PREVIEW(preview), preview_width, preview_height );
    gtk_container_add( GTK_CONTAINER(frame), preview );

    gtk_widget_show( preview );
    gtk_widget_show( frame );
    gtk_widget_show( vbox );

    preview_update();

    gtk_box_pack_start( GTK_BOX(main_box), vbox, FALSE, FALSE, 0 );
  }

  /* Mask Types */
  {
    GtkWidget *frame = gtk_frame_new( NULL );
    GtkWidget *vbox  = gtk_vbox_new( FALSE, 5 );
    GtkWidget *label = gtk_label_new( "Mask Type" );
    GSList    *group = NULL;
    GtkWidget *radio = NULL;

    gtk_widget_set_usize( label, 80, 16 );
    gtk_container_border_width( GTK_CONTAINER(frame), 10 );
    gtk_container_border_width( GTK_CONTAINER(vbox), 10 );
    gtk_container_add( GTK_CONTAINER(frame), vbox );
    gtk_widget_show( vbox );

    radio = gtk_radio_button_new_with_label( group, "CP Mask" );
    gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(radio),
				 parameters.mask_type == MASK_TYPE_CP );
    gtk_signal_connect( GTK_OBJECT(radio), "toggled",
			GTK_SIGNAL_FUNC(dialog_callback_cp), NULL );
    group = gtk_radio_button_group( GTK_RADIO_BUTTON(radio) );
    gtk_box_pack_start( GTK_BOX(vbox), radio, FALSE, FALSE, 0 );
    gtk_widget_show( radio );

    { /* CP Options */
      GtkWidget *hbox   = gtk_hbox_new( FALSE, 5 );
      GtkWidget *space  = gtk_label_new( "" );
      GtkWidget *label  = gtk_label_new( "Code:" );
      GtkWidget *entry  = gtk_entry_new_with_max_length( 16 );
      GtkWidget *button = gtk_button_new_with_label( "Detect... " );

      gtk_entry_set_text( GTK_ENTRY(entry), parameters.cp_code );
      gtk_signal_connect( GTK_OBJECT(button), "clicked",
			  GTK_SIGNAL_FUNC(dialog_callback_cp_detect ),
			  entry );
      gtk_signal_connect( GTK_OBJECT(entry), "changed",
			  GTK_SIGNAL_FUNC(dialog_callback_cp_code), NULL );
      
      gtk_widget_set_usize( space, 30, 10 );
      gtk_box_pack_start( GTK_BOX(hbox), space, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), entry, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), button, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, FALSE, 0 );

      gtk_widget_show( space );
      gtk_widget_show( label );
      gtk_widget_show( entry );
      gtk_widget_show( button );
      gtk_widget_show( hbox );

      dialog_cp_options = hbox;
      gtk_widget_set_sensitive( dialog_cp_options,
				parameters.mask_type == MASK_TYPE_CP );
    }

    radio  = gtk_radio_button_new_with_label( group, "FL Mask" );
    gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(radio),
				 parameters.mask_type == MASK_TYPE_FL );
    gtk_signal_connect( GTK_OBJECT(radio), "toggled",
			GTK_SIGNAL_FUNC(dialog_callback_fl), NULL );
    group = gtk_radio_button_group( GTK_RADIO_BUTTON(radio) );
    gtk_box_pack_start( GTK_BOX(vbox), radio, FALSE, FALSE, 0 );
    gtk_widget_show( radio );

    radio  = gtk_radio_button_new_with_label( group, "Q0 Mask" );
    gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(radio),
				 parameters.mask_type == MASK_TYPE_Q0 );
    gtk_signal_connect( GTK_OBJECT(radio), "toggled",
			GTK_SIGNAL_FUNC(dialog_callback_q0), NULL );
    group = gtk_radio_button_group( GTK_RADIO_BUTTON(radio) );
    gtk_box_pack_start( GTK_BOX(vbox), radio, FALSE, FALSE, 0 );
    gtk_widget_show( radio );

    radio  = gtk_radio_button_new_with_label( group, "MEKO Mask" );
    gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(radio),
				 parameters.mask_type == MASK_TYPE_MEKO );
    gtk_signal_connect( GTK_OBJECT(radio), "toggled",
			GTK_SIGNAL_FUNC(dialog_callback_meko), NULL );
    group = gtk_radio_button_group( GTK_RADIO_BUTTON(radio) );
    gtk_box_pack_start( GTK_BOX(vbox), radio, FALSE, FALSE, 0 );
    gtk_widget_show( radio );
    
    { /* MEKO Options */
      GtkWidget *hbox    = gtk_hbox_new( FALSE, 5 );
      GtkWidget *space  = gtk_label_new( "" );
      GtkWidget *label   = gtk_label_new( "Direction:" );
      GtkWidget *plus    = gtk_radio_button_new_with_label( NULL, "+" );
      GSList    *grp     = gtk_radio_button_group( GTK_RADIO_BUTTON(plus) );
      GtkWidget *minus   = gtk_radio_button_new_with_label( grp, "-" );

      switch( parameters.direction ){
      case MEKO_DIRECTION_PLUS:
	gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(plus), TRUE );
	break;
      case MEKO_DIRECTION_MINUS:
	gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(minus), TRUE );
	break;
      }

      gtk_signal_connect( GTK_OBJECT(plus), "toggled",
			  GTK_SIGNAL_FUNC(dialog_callback_meko_plus), NULL );
      gtk_signal_connect( GTK_OBJECT(minus), "toggled",
			  GTK_SIGNAL_FUNC(dialog_callback_meko_minus), NULL );
      
      gtk_widget_set_usize( space, 30, 10 );
      gtk_box_pack_start( GTK_BOX(hbox), space, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), plus, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), minus, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, FALSE, 0 );
      gtk_widget_show( space );
      gtk_widget_show( label );
      gtk_widget_show( plus );
      gtk_widget_show( minus );
      gtk_widget_show( hbox );

      dialog_meko_options = hbox;
      gtk_widget_set_sensitive( dialog_meko_options,
				parameters.mask_type == MASK_TYPE_MEKO );
    }
    
    gtk_widget_show( frame );
    gtk_notebook_append_page( GTK_NOTEBOOK(notebook), frame, label );
  }

  /* Adjustment */
  {
    GtkWidget *frame = gtk_frame_new( NULL );
    GtkWidget *vbox  = gtk_vbox_new( FALSE, 5 );
    GtkWidget *label = gtk_label_new( "Adjustment" );

    gtk_widget_set_usize( label, 80, 16 );
    gtk_container_border_width( GTK_CONTAINER(frame), 10 );
    gtk_container_border_width( GTK_CONTAINER(vbox), 10 );
    gtk_container_add( GTK_CONTAINER(frame), vbox );
    gtk_widget_show( vbox );

    { /* X Offset */
      GtkWidget *hbox  = gtk_hbox_new( FALSE, 5 );
      GtkWidget *label = gtk_label_new( "X Offset:" );
      gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, FALSE, 0 );
      gtk_widget_show( label );
      gtk_widget_show( hbox );
    }

    { /* X Offset */
      GtkWidget *hbox    = gtk_hbox_new( FALSE, 5 );
      GtkWidget *space   = gtk_label_new( "" );
      GtkObject *adj     = gtk_adjustment_new( (gfloat)parameters.offset_x,
					       0.0, 8.0, 1.0, 0.0, 1.0 );
      GtkWidget *spinner = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 0, 0 );
      GtkWidget *label   = gtk_label_new( "pixels" );

      gtk_signal_connect( GTK_OBJECT(adj), "value_changed",
			  GTK_SIGNAL_FUNC(dialog_callback_offset_x), NULL );

      gtk_widget_set_usize( space, 30, 10 );
      gtk_box_pack_start( GTK_BOX(hbox), space, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), spinner, FALSE, TRUE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, FALSE, 0 );
      gtk_widget_show( space );
      gtk_widget_show( spinner );
      gtk_widget_show( label );
      gtk_widget_show( hbox );
    }
    
    { /* Y Offset */
      GtkWidget *hbox  = gtk_hbox_new( FALSE, 5 );
      GtkWidget *label = gtk_label_new( "Y Offset:" );
      gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, FALSE, 0 );
      gtk_widget_show( label );
      gtk_widget_show( hbox );
    }

    { /* Y Offset */
      GtkWidget *hbox    = gtk_hbox_new( FALSE, 5 );
      GtkWidget *space   = gtk_label_new( "" );
      GtkObject *adj     = gtk_adjustment_new( (gfloat)parameters.offset_y,
					       0.0, 8.0, 1.0, 0.0, 1.0 );
      GtkWidget *spinner = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 0, 0 );
      GtkWidget *label   = gtk_label_new( "pixels" );

      gtk_signal_connect( GTK_OBJECT(adj), "value_changed",
			  GTK_SIGNAL_FUNC(dialog_callback_offset_y), NULL );
      
      gtk_widget_set_usize( space, 30, 10 );
      gtk_box_pack_start( GTK_BOX(hbox), space, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), spinner, FALSE, TRUE, 0 );
      gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
      gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, FALSE, 0 );
      gtk_widget_show( space );
      gtk_widget_show( spinner );
      gtk_widget_show( label );
      gtk_widget_show( hbox );
    }
    
    gtk_widget_show( frame );
    gtk_notebook_append_page( GTK_NOTEBOOK(notebook), frame, label );
  }

  gtk_widget_show( dialog );

  gtk_main();

  return dialog_status;
}

/******************************************************************************
 * FILE DIALOG for CP Detect                                                  *
 ******************************************************************************/

static GtkWidget *cp_detect_dialog = NULL;
static GtkEntry  *cp_code_entry    = NULL;

/*----------------------------------------------------------------------------*/

static void
cp_detect_dialog_callback_destroy ( GtkFileSelection *fselect, gpointer data )
{
  gtk_widget_set_sensitive( dialog, TRUE );
}

/*----------------------------------------------------------------------------*/

static void
cp_detect_dialog_callback_ok ( GtkButton *button, gpointer data )
{
  gchar *filename;
  gchar *detected_code;

  filename =
    gtk_file_selection_get_filename( GTK_FILE_SELECTION(cp_detect_dialog) );
  
  detected_code = cp_detect_from_file( filename );
  if( detected_code != NULL ){
    gtk_entry_set_text( cp_code_entry, detected_code );
  } else {
    g_warning( "Can't Detect CP CODE" );
  }

  gtk_widget_destroy( cp_detect_dialog );
}

/*----------------------------------------------------------------------------*/

static void
cp_detect_dialog_callback_cancel ( GtkButton *button, gpointer data )
{
  gtk_widget_destroy( cp_detect_dialog );
}

/*----------------------------------------------------------------------------*/

static void
cp_detect_dialog_show ( GtkEntry *entry )
{
  char *filename;
  
  gtk_widget_set_sensitive( dialog, FALSE );
  
  cp_code_entry    = entry;
  cp_detect_dialog = gtk_file_selection_new( "CP Detect" );

  gtk_window_position( GTK_WINDOW(cp_detect_dialog), GTK_WIN_POS_MOUSE );

  gtk_signal_connect
    ( GTK_OBJECT(cp_detect_dialog), "destroy",
      GTK_SIGNAL_FUNC(cp_detect_dialog_callback_destroy), NULL );
  gtk_signal_connect
    ( GTK_OBJECT(GTK_FILE_SELECTION(cp_detect_dialog)->ok_button),
      "clicked", GTK_SIGNAL_FUNC(cp_detect_dialog_callback_ok), NULL );
  gtk_signal_connect
    ( GTK_OBJECT(GTK_FILE_SELECTION(cp_detect_dialog)->cancel_button),
      "clicked", GTK_SIGNAL_FUNC(cp_detect_dialog_callback_cancel), NULL );

  filename = gimp_image_get_filename( image_ID );
  if( filename ) if( *filename ){
    gtk_file_selection_set_filename( GTK_FILE_SELECTION(cp_detect_dialog),
				     filename );
  }

  gtk_widget_show( cp_detect_dialog );
}

/******************************************************************************
 * CP DETECT                                                                  *
 ******************************************************************************/

static guchar cp_key0[] = {
  0x14, 0x17, 0x16, 0x11, 0x10, 0x13, 0x12, 0x1d, 0x1c, 0x1f, 0x1e, 0x19, 0x18,
  0x1b, 0x1a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f
};
static guchar cp_key1[] = {
  0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e,
  0x0d, 0x0c, 0x13, 0x12, 0x11, 0x10, 0x17, 0x16, 0x15, 0x14, 0x1b, 0x1a, 0x19 
};
static guchar cp_key2[] = {
  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
  0x06, 0x07, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x10, 0x11, 0x12
};
static guchar cp_key3[] = {
  0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04,
  0x07, 0x06, 0x19, 0x18, 0x1b, 0x1a, 0x1d, 0x1c, 0x1f, 0x1e, 0x11, 0x10, 0x13
};
static guchar cp_key4[] = {
  0x34, 0x37, 0x36, 0x31, 0x30, 0x33, 0x32, 0x3d, 0x3c, 0x3f, 0x3e, 0x39, 0x38,
  0x3b, 0x3a, 0x25, 0x24, 0x27, 0x26, 0x21, 0x20, 0x23, 0x22, 0x2d, 0x2c, 0x2f
};
static guchar cp_key5[] = {
  0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03,
  0x00, 0x01, 0x1e, 0x1f, 0x1c, 0x1d, 0x1a, 0x1b, 0x18, 0x19, 0x16, 0x17, 0x14
};
static guchar cp_key6[] = {
  0x2a, 0x29, 0x28, 0x2f, 0x2e, 0x2d, 0x2c, 0x23, 0x22, 0x21, 0x20, 0x27, 0x26,
  0x25, 0x24, 0x3b, 0x3a, 0x39, 0x38, 0x3f, 0x3e, 0x3d, 0x3c, 0x33, 0x32, 0x31
};
static guchar cp_key7[] = {
  0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02,
  0x01, 0x00, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15
};

static guchar *cp_tag[] = {
  cp_key6, cp_key3, cp_key0, cp_key1, cp_key2, cp_key3, cp_key4, cp_key1,
  cp_key2, cp_key3, cp_key5, cp_key7, cp_key6, cp_key3, cp_key0, cp_key1
};

/*----------------------------------------------------------------------------*/

static gchar *
cp_detect_from_file ( gchar *filename )
{
  static gchar  cp_code[CP_CODE_MAX_LENGTH+1];
  gchar         buffer[CP_CODE_MAX_LENGTH];
  FILE         *file;
  gint          i;
  gint          x;
  gint          done;

  file = fopen( filename, "r" );
  if( ! file ) return NULL;

  for( i = 0; i < CP_CODE_MAX_LENGTH + 1; ++i ) cp_code[i] = '\0';
  for( i = 0; i < 0x14; ++i ) (void)fgetc( file );
  for( i = 0; i < 16; ++i ) buffer[i] = fgetc( file );
  fclose( file );
  
  for( done = FALSE, x = 0; x <= 16 && ! done; ++x ){
    for( done = TRUE, i = 'A'; i <= 'Z'; ++i ){
      if( cp_tag[x][i-'A'] == buffer[x] ){
	cp_code[x] = i;
	done = FALSE;
      }
    }
  }
  if( x == 0 ) return NULL;

  return cp_code;
}

/******************************************************************************
 * CP MASK                                                                    *
 ******************************************************************************/

static guchar cp_key[] = {
  0x10, 0x17, 0x13, 0x15, 0x09, 0x08, 0x0a, 0x14, 0x06, 0x05, 0x16, 0x02, 0x0d,
  0x03, 0x01, 0x04, 0x19, 0x0c, 0x0f, 0x0e, 0x12, 0x07, 0x0b, 0x18, 0x11, 0x1a
};

/*----------------------------------------------------------------------------*/

typedef struct _cp_cell_t cp_cell_t;
struct _cp_cell_t {
  gint pair;
  gint flag;
};

/*----------------------------------------------------------------------------*/

static cp_cell_t *cp_table;
static gint       cp_width;
static gint       cp_height;

/*----------------------------------------------------------------------------*/

static void
cp_init ( gchar *code, gint width, gint height )
{
  char *cursor;
  gint *table;
  gint  i, j, x, y, cells, len;

  if( strlen( code ) == 0 ) g_snprintf( code, 4, "%s", "GIMP" );
  for( cursor = code; *cursor; ++cursor ){
    if( !isalpha( *cursor ) ){
      g_warning( "invalid char '%c' in CP code.", *cursor );
      *cursor = 'X';
    }
    if( islower( *cursor ) ) *cursor = toupper( *cursor );
  }
  
  cp_width  = width;
  cp_height = height;
  cells = width * height;
  len = strlen( code );

  table = (gint*)g_malloc( sizeof(gint) * cells );
  cp_table = (cp_cell_t*)g_malloc( sizeof(cp_cell_t) * cells );

  for( i = 0; i < cells; i++ ){
    table[i] = -1;
    cp_table[i].pair = i;
    cp_table[i].flag = FALSE;
  }

  x = cells - 1;
  y = len + cells % len;

  for( i = 0; i < cells; i++ ){
    x = cp_key[code[i % len]-'A'] + x + y;
    if( cells <= x ) x %= cells;
    while( table[x] != -1 ){
      if( i & 01 ){
	if( x == 0 ) x = cells;
	x--;
      } else {
	if( cells <= ++x ) x = 0;
      }
    }
    table[x] = i;
    y++;
  }

  for( i = 0, j = cells - 1; i < j; i++, j-- ){
    cp_table[table[i]].pair = table[j];
    cp_table[table[j]].pair = table[i];
    if( (table[i] ^ table[j]) & 0x01 ){
      cp_table[table[i]].flag = TRUE;
      cp_table[table[j]].flag = TRUE;
    }
  }

  g_free( table );
}

/*----------------------------------------------------------------------------*/

static gint
cp_transform ( gint  sx,
	       gint  sy,
	       gint *dx,
	       gint *dy )
{
  gint  src, dst;
  div_t d;

  src = sy * cp_width + sx;
  dst = cp_table[src].pair;
  d = div( dst, cp_width );
  *dx = d.rem;
  *dy = d.quot;

  return cp_table[src].flag;
}

/*----------------------------------------------------------------------------*/

static void
cp_free ( void )
{
  g_free( cp_table );
}

/*----------------------------------------------------------------------------*/

static void
cp_code_get ( gint32 image_ID )
{
  char *filename;
  char *cp_code;
  filename = gimp_image_get_filename( image_ID );
  if( filename ) if( *filename ){
    cp_code = cp_detect_from_file( filename );
    if( cp_code ) if( *cp_code ){
      g_snprintf( parameters.cp_code, CP_CODE_MAX_LENGTH, "%s", cp_code );
    }
  }
}

/******************************************************************************
 * FL MASK                                                                    *
 ******************************************************************************/

typedef struct _fl_cell_t fl_cell_t;
struct _fl_cell_t {
  gint no;
  gint pair;
};

/*----------------------------------------------------------------------------*/

static fl_cell_t **fl_table;
static gint       *fl_x;
static gint       *fl_y;

/*----------------------------------------------------------------------------*/

static void
fl_init ( gint width,
	  gint height )
{
  gint x, y;
  gint dx[] = { 1, 0, -1, 0 };
  gint dy[] = { 0, -1, 0, 1 };
  gint d, i;

  fl_x = (gint*)g_malloc( sizeof(gint) * width * height );
  fl_y = (gint*)g_malloc( sizeof(gint) * width * height );

  fl_table = (fl_cell_t**)g_malloc( sizeof(fl_cell_t*) * height );
  for( y = 0; y < height; y++ ){
    fl_table[y] = (fl_cell_t*)g_malloc( sizeof(fl_cell_t) * width );
    for( x = 0; x < width; x++ ) fl_table[y][x].no = -1;
  }

  for( x = d = i = 0, y = height - 1; i < width * height; i++ ){
    fl_x[i] = x;
    fl_y[i] = y;
    fl_table[y][x].no   = i;
    fl_table[y][x].pair = width * height - i - 1;
    x += dx[d];
    y += dy[d];
    if( x < 0 || width <= x || y < 0 || height <= y ||0 <= fl_table[y][x].no ){
      x -= dx[d];
      y -= dy[d];
      d = ( d + 1 ) % 4;
      x += dx[d];
      y += dy[d];
    }
  }
}

/*----------------------------------------------------------------------------*/

static gint
fl_transform ( gint  sx,
	       gint  sy,
	       gint *dx,
	       gint *dy )
{
  *dx = fl_x[fl_table[sy][sx].pair];
  *dy = fl_y[fl_table[sy][sx].pair];
  return ( fl_table[sy][sx].no != fl_table[sy][sx].pair );
}

/*----------------------------------------------------------------------------*/

static void
fl_free ( void )
{
  gint y;
  for( y = 0; y < sizeof( fl_table ) / sizeof( fl_table[0] ); y++ ){
    g_free( fl_table[y] );
  }
  g_free( fl_table );
  g_free( fl_x );
  g_free( fl_y );
}

/******************************************************************************
 * MEKO MASK                                                                  *
 ******************************************************************************/

static gushort meko_key[] = {
  0x2064,0x16f2,0x0ad2,0x0e1f,0x0a31,0x17ce,0x0de8,0x1c41,0x0878,0x1349,0x184b,
  0x1b51,0x0841,0x19a3,0x0820,0x0c12,0x1117,0x2117,0x1bc1,0x1f13,0x19ed,0x0230,
  0x040d,0x1957,0x116d,0x0fd6,0x1e4f,0x0c28,0x1d28,0x077a,0x205e,0x053d,0x0686,
  0x13ac,0x1a0e,0x16de,0x1607,0x1504,0x0ced,0x088f,0x159d,0x0ef4,0x0c3f,0x1120,
  0x225d,0x0b43,0x1b2d,0x184c,0x043d,0x1221,0x0a12,0x225c,0x04f0,0x1399,0x1289,
  0x1899,0x1b0b,0x1a2b,0x1383,0x084a,0x1dee,0x118c,0x2395,0x00f5,0x16cd,0x0a9c,
  0x0e73,0x1ff9,0x0288,0x0014,0x0ea9,0x17b3,0x13af,0x03a7,0x0ce7,0x20ac,0x0e93,
  0x1f1e,0x207d,0x00b4,0x1833,0x1dd4,0x09fd,0x0819,0x052a,0x16c9,0x1893,0x2134,
  0x0d8f,0x1597,0x1573,0x22b5,0x1b55,0x04ce,0x0bb1,0x02fd,0x0685,0x0aad,0x18da,
  0x0a6c,0x0e92,0x15c5,0x0695,0x0a70,0x1d67,0x11d0,0x0cc9,0x1e8a,0x12ac,0x0ef1,
  0x220d,0x04fb,0x1034,0x00f4,0x0e6d,0x1f90,0x1649,0x108c,0x0aaa,0x1160,0x238f,
  0x056c,0x0e0c,0x20a7,0x0658,0x0502,0x1973,0x0fb2,0x12d8,0x0d94,0x1201,0x03ba,
  0x167e,0x237f,0x0d38,0x00e0,0x2183,0x201b,0x1192,0x08c1,0x1240,0x20cb,0x073f,
  0x10de,0x1379,0x163a,0x1d2e,0x0a15,0x19db,0x02cd,0x01bc,0x032c,0x23b9,0x1fd2,
  0x1e7d,0x1518,0x2148,0x0e72,0x235e,0x1df0,0x0538,0x1bcb,0x0926,0x1c17,0x0134,
  0x175a,0x1872,0x0ecf,0x06eb,0x0045,0x100d,0x06ef,0x1efe,0x0777,0x006c,0x0386,
  0x1da4,0x1351,0x07ab,0x21ea,0x1ff2,0x1017,0x182b,0x047b,0x1531,0x19de,0x0f3a,
  0x186c,0x052e,0x1a15,0x23e5,0x1901,0x0b44,0x0458,0x20e8,0x20af,0x0793,0x23dd,
  0x1f3b,0x17d4,0x1879,0x2262,0x101d,0x224a,0x0d12,0x01f0,0x1b7d,0x1bee,0x224f,
  0x04c7,0x1d8f,0x132f,0x1e94,0x0f26,0x2193,0x164a,0x1b0a,0x22f2,0x0393,0x00da,
  0x0924,0x1dcd,0x17a2,0x038d,0x0263,0x10aa,0x2344,0x089b,0x0085,0x0c80,0x196a,
  0x16e7,0x09c5,0x0903,0x08d3,0x21ae,0x0255,0x049d,0x1f67,0x207c,0x0cca,0x055c,
  0x0e8f,0x1fd3,0x15a9,0x1b9e,0x1640,0x0983,0x08cc,0x0ce6,0x0e5e,0x15cf,0x2248,
  0x0bdb,0x1fb4,0x1bd6,0x08b2,0x092b,0x10b7,0x1832,0x1558,0x214f,0x005a,0x1e9d,
  0x15dc,0x1dab,0x0435,0x199f,0x0b42,0x23da,0x1bcd,0x1339,0x095c,0x1a89,0x08fa,
  0x2379,0x0f74,0x060a,0x1408,0x0eb3,0x1559,0x00ac,0x0d0d,0x14d4,0x07b1,0x1acc,
  0x1707,0x03c4,0x0fbe,0x0c76,0x21a8,0x0a0b,0x0d60,0x1e97,0x1625,0x117a,0x0415,
  0x008f,0x1f9c,0x00a6,0x19c5,0x04e7,0x21f2,0x0e08,0x17ba,0x10b9,0x0656,0x22c4,
  0x2048,0x070e,0x15cb,0x01f3,0x0488,0x1167,0x14a2,0x08cf,0x0ac2,0x12be,0x20a1,
  0x0501,0x01b2,0x004b,0x10e2,0x09c9,0x01fa,0x05b7,0x0e20,0x0d55,0x003b,0x1413,
  0x1f7e,0x1a03,0x06cb,0x21c4,0x1fa5,0x1e15,0x0c14,0x0a93,0x133b,0x0498,0x1eb7,
  0x0bfb,0x1774,0x1f14,0x21d0,0x1930,0x04ff,0x0245,0x1b0c,0x2368,0x198c,0x1487,
  0x08c2,0x20a0,0x18be,0x010b,0x16ae,0x1c65,0x08ea,0x23e8,0x09d0,0x158b,0x237d,
  0x1f72,0x2051,0x188e,0x04a7,0x2074,0x1e91,0x1557,0x07dc,0x2136,0x0f50,0x234c,
  0x1602,0x0572,0x20db,0x00b8,0x1929,0x17a5,0x0e82,0x0d86,0x03bd,0x1b02,0x2323,
  0x0445,0x1ab6,0x02b4,0x0d1a,0x1524,0x03fe,0x1231,0x189a,0x18de,0x15f6,0x17eb,
  0x0b89,0x14ca,0x0910,0x09b9,0x1380,0x0559,0x169d,0x22a0,0x00d0,0x0f7a,0x0fb7,
  0x1fff,0x1996,0x06ff,0x0fa5,0x1c83,0x0c61,0x1ece,0x061f,0x193e,0x232e,0x048e,
  0x0b5a,0x03d4,0x1cf9,0x0b0f,0x2274,0x18ef,0x1cb5,0x1caf,0x18b1,0x0ff3,0x0712,
  0x19cd,0x1e6e,0x0a25,0x1375,0x0525,0x19da,0x0042,0x0bf4,0x1ffc,0x03d0,0x1974,
  0x1c33,0x0db3,0x0180,0x0e8c,0x22eb,0x1121,0x00a1,0x02fc,0x1b3c,0x1d68,0x15fd,
  0x22bf,0x1c5d,0x15ab,0x1bb7,0x00f6,0x2219,0x09fb,0x18df,0x19d5,0x1396,0x044a,
  0x1381,0x218d,0x1aef,0x0603,0x22e1,0x237b,0x0bd3,0x110b,0x171a,0x201f,0x0c92,
  0x059c,0x1b10,0x14ab,0x21e1,0x074b,0x1c8d,0x083e,0x1684,0x117c,0x0d73,0x1740,
  0x0f45,0x016c,0x153e,0x15fe,0x08c5,0x2080,0x166e,0x05a2,0x1897,0x18eb,0x0038,
  0x1f4b,0x1eba,0x07f5,0x0db4,0x22e9,0x0977,0x0724,0x0287,0x0dcb,0x0efd,0x11a7,
  0x0c66,0x1393,0x078e,0x2017,0x1849,0x03b6,0x175f,0x1e05,0x1fb7,0x0af6,0x03ac,
  0x02ff,0x10ee,0x07e6,0x1529,0x1ec1,0x005d,0x14bb,0x074f,0x098e,0x214b,0x0eb2,
  0x0b96,0x1940,0x11fb,0x0721,0x180f,0x2346,0x1163,0x1be9,0x1bc4,0x1b7e,0x03d7,
  0x19c0,0x23f6,0x0c0c,0x1f60,0x0cd4,0x1882,0x22fb,0x21eb,0x0948,0x122b,0x0474,
  0x121b,0x09c2,0x17cf,0x1993,0x2112,0x2259,0x2292,0x142a,0x00d2,0x125b,0x0e63,
  0x0f81,0x0e2e,0x01ec,0x0d11,0x1791,0x2353,0x0bc5,0x239b,0x1b97,0x1f68,0x173c,
  0x1dad,0x0778,0x165c,0x09e2,0x0d5d,0x0e9c,0x1fbb,0x22ff,0x14df,0x0f96,0x1d08,
  0x1ecd,0x2114,0x10ef,0x21f4,0x0f04,0x040b,0x07d6,0x01e1,0x1c95,0x0441,0x163d,
  0x17ee,0x032b,0x0fe6,0x2273,0x18f5,0x21fa,0x0ed3,0x18dc,0x0001,0x014c,0x1144,
  0x032a,0x0717,0x1d14,0x04f1,0x0225,0x14e3,0x026f,0x147d,0x076c,0x135b,0x1966,
  0x15bf,0x12d3,0x0785,0x097d,0x036f,0x1b88,0x1ce2,0x1360,0x0a8b,0x1fbc,0x101f,
  0x005b,0x0a29,0x1303,0x1cd5,0x0706,0x066e,0x04d7,0x0d9c,0x1b25,0x014f,0x1182,
  0x1ff0,0x1452,0x0683,0x096c,0x0f79,0x0c1c,0x2394,0x1306,0x1fad,0x081f,0x1a7d,
  0x181f,0x0d45,0x219a,0x167a,0x1813,0x0329,0x1876,0x126d,0x097c,0x0eb6,0x1820,
  0x1374,0x2121,0x11e4,0x0ab4,0x071e,0x03ab,0x0fa1,0x1e0a,0x1e59,0x1c85,0x0197,
  0x1cca,0x1148,0x1a81,0x0d04,0x1955,0x1705,0x0ed9,0x01d9,0x102e,0x0480,0x0475,
  0x1641,0x0101,0x18a1,0x09b3,0x1b5f,0x1cfd,0x054e,0x06d5,0x1a95,0x0301,0x05f6,
  0x150c,0x0086,0x04dc,0x05bd,0x004e,0x043c,0x1020,0x136b,0x0b6d,0x00b3,0x0fca,
  0x1cfc,0x16d4,0x1e32,0x09e3,0x1588,0x1b58,0x0a9a,0x036a,0x0c8b,0x11ef,0x1823,
  0x0af3,0x1448,0x1dca,0x1931,0x05d6,0x0cf9,0x1207,0x063f,0x0f88,0x0d46,0x1fce,
  0x162f,0x08cd,0x13a6,0x181b,0x2107,0x2197,0x01af,0x09a1,0x07aa,0x01bf,0x1932,
  0x118f,0x1eb0,0x0a7f,0x087d,0x0e2f,0x1fe0,0x12ef,0x1bef,0x1d4d,0x1c19,0x1856,
  0x1d19,0x1294,0x1d57,0x176c,0x02dc,0x101c,0x22b7,0x0135,0x17b5,0x0310,0x1548,
  0x1d2a,0x1626,0x0b31,0x1e7c,0x1be7,0x140c,0x1b81,0x019e,0x1f11,0x11c6,0x0939,
  0x2182,0x05bb,0x06c8,0x00e4,0x0529,0x1b26,0x13fc,0x1202,0x1a32,0x07f3,0x098d,
  0x0e58,0x01b7,0x1db0,0x0152,0x189c,0x2073,0x0d56,0x1d5b,0x0d36,0x09cc,0x18a8,
  0x0e5d,0x143c,0x1063,0x16ca,0x13ca,0x1e38,0x2359,0x1b9c,0x0a8a,0x0a84,0x046c,
  0x0ff5,0x0d97,0x0a27,0x0e6b,0x10c2,0x1619,0x0dee,0x1ddc,0x0576,0x01c8,0x1069,
  0x0d4f,0x20ad,0x198b,0x09d5,0x0b22,0x033f,0x20aa,0x1ccc,0x005f,0x0d68,0x19cb,
  0x1081,0x1d97,0x0ae2,0x1c5c,0x0f05,0x123c,0x0b20,0x2371,0x0ceb,0x00cb,0x1f06,
  0x00bb,0x191b,0x0117,0x2376,0x17bc,0x19ce,0x216d,0x1f07,0x1455,0x14b8,0x1c6a,
  0x1b80,0x0e5b,0x1851,0x0172,0x23aa,0x0a22,0x0d7f,0x0720,0x0136,0x0666,0x1019,
  0x13fe,0x1ace,0x0b51,0x0c24,0x050e,0x1873,0x08ae,0x16ab,0x1a90,0x0a76,0x1552,
  0x19c4,0x0fab,0x0abc,0x06c1,0x050a,0x0e49,0x1fcb,0x11a1,0x1387,0x0c47,0x2174,
  0x0570,0x1ba2,0x1104,0x00ad,0x1444,0x2383,0x08c7,0x1127,0x056d,0x0d7e,0x1cb9,
  0x02fa,0x100a,0x0c51,0x0fba,0x1a94,0x128b,0x1859,0x2190,0x1b20,0x1f56,0x186f,
  0x01d8,0x01f2,0x10a3,0x192c,0x0528,0x211b,0x1c92,0x0239,0x0334,0x14c0,0x1d5a,
  0x1de9,0x12f2,0x0a44,0x17ca,0x0f62,0x15d8,0x069f,0x1d07,0x11fa,0x0816,0x153c,
  0x1c81,0x02f1,0x2342,0x23f7,0x0160,0x117f,0x1bb9,0x1039,0x2063,0x1e3b,0x0c57,
  0x13e1,0x139a,0x1f12,0x15ea,0x1d48,0x19c3,0x1a31,0x050c,0x13c5,0x0091,0x13a7,
  0x1765,0x01f8,0x1b75,0x0ea2,0x1b6d,0x09ec,0x0312,0x113d,0x012d,0x18c3,0x08a0,
  0x0452,0x0d87,0x167d,0x1da9,0x0ff6,0x2340,0x19ad,0x007b,0x0cbc,0x1d1a,0x1ae4,
  0x09b4,0x11b2,0x1b2c,0x14ce,0x1c5e,0x0222,0x162d,0x0c63,0x0584,0x0040,0x1d1f,
  0x1af7,0x0c96,0x132c,0x086b,0x136f,0x19e1,0x0dda,0x22a5,0x22f7,0x2249,0x20c5,
  0x0a19,0x0fdc,0x1834,0x0c58,0x1c56,0x01dc,0x1d84,0x0a66,0x2336,0x0955,0x0900,
  0x1ed6,0x0361,0x0d58,0x1d4b,0x10c0,0x1852,0x040e,0x0f0b,0x1978,0x12e8,0x2261,
  0x05fe,0x0bd2,0x13c8,0x0f3c,0x07a4,0x18cc,0x0a00,0x0642,0x0d65,0x1da8,0x0d15,
  0x2168,0x05b5,0x0df8,0x2352,0x0408,0x07d9,0x15fa,0x0e88,0x0c85,0x1fab,0x16f5,
  0x1798,0x12bd,0x1fb3,0x09b6,0x12c2,0x17fa,0x1be6,0x1434,0x1dd6,0x0e18,0x08f5,
  0x07a7,0x0aa9,0x0099,0x1e5b,0x09f4,0x1c02,0x0737,0x08b9,0x0504,0x0c05,0x0813,
  0x1716,0x06be,0x1eca,0x1995,0x0d63,0x0745,0x1870,0x221d,0x0c6e,0x20d2,0x23c0,
  0x11d8,0x0d23,0x1924,0x0d34,0x10af,0x2339,0x1f37,0x0acc,0x228e,0x20b1,0x127e,
  0x0293,0x0294,0x18d2,0x0f77,0x1c89,0x035f,0x1441,0x0143,0x219c,0x042f,0x092e,
  0x1ac0,0x0932,0x1d93,0x1ae6,0x1e03,0x0f87,0x16b4,0x15b1,0x066f,0x07a1,0x21a6,
  0x20bd,0x201c,0x10f2,0x16b2,0x13b8,0x0c90,0x013e,0x191c,0x1aca,0x10e0,0x12da,
  0x0047,0x15b8,0x1e51,0x0693,0x02cf,0x169a,0x1571,0x2167,0x022f,0x2150,0x11a0,
  0x137d,0x143a,0x02d9,0x07ac,0x0b18,0x1730,0x0e1b,0x0bc3,0x2178,0x1656,0x1041,
  0x1fde,0x044c,0x21ec,0x1cf0,0x04a0,0x17f2,0x1d8b,0x172b,0x0826,0x0b38,0x1fb6,
  0x07ba,0x1632,0x0bff,0x12b8,0x0073,0x1d94,0x0457,0x05b8,0x0ca6,0x08ec,0x1663,
  0x07cf,0x0e04,0x2116,0x23d6,0x1f6f,0x0884,0x17d1,0x0b14,0x1222,0x0774,0x16c8,
  0x16a8,0x1dcf,0x1e21,0x1a42,0x0cf4,0x184f,0x1ad3,0x1da5,0x04f9,0x0f39,0x2173,
  0x091b,0x0648,0x21a7,0x1481,0x15fb,0x0c69,0x064b,0x00be,0x08d5,0x211d,0x07e5,
  0x22f6,0x10a7,0x0791,0x1f88,0x0fb6,0x2004,0x014e,0x187e,0x17d7,0x2345,0x0c83,
  0x0de6,0x12b6,0x0365,0x1d4a,0x1c43,0x1266,0x083d,0x1a5f,0x0029,0x223b,0x1809,
  0x0589,0x001c,0x0f90,0x1b77,0x10cc,0x12cb,0x0703,0x0471,0x0e6e,0x05e6,0x0e95,
  0x0912,0x18dd,0x1eea,0x02ca,0x04c2,0x0bdc,0x0ee6,0x158a,0x189b,0x17ad,0x0cd8,
  0x1246,0x1457,0x0938,0x1d87,0x175c,0x0a85,0x1f20,0x17ec,0x08e7,0x0678,0x0978,
  0x145e,0x00cf,0x001f,0x0d90,0x09f6,0x20e4,0x217d,0x13e7,0x1ce0,0x1400,0x156d,
  0x084c,0x1881,0x0140,0x208b,0x21e5,0x041a,0x02a0,0x0f23,0x22ca,0x0520,0x087a,
  0x1fac,0x0fe2,0x15cd,0x05cf,0x1c34,0x0ba3,0x033d,0x14db,0x1251,0x0071,0x15ff,
  0x0139,0x21fb,0x003c,0x0629,0x008a,0x03ed,0x0ea7,0x018b,0x146d,0x19d4,0x167f,
  0x1f24,0x21fc,0x04e9,0x057f,0x0cb5,0x0f76,0x1b1a,0x19b0,0x1cdb,0x211e,0x0775,
  0x17d9,0x0494,0x0c1f,0x0db6,0x2184,0x1702,0x1165,0x1c4a,0x1043,0x0a5a,0x1004,
  0x03be,0x0b33,0x151a,0x038b,0x12ed,0x1287,0x2205,0x1f05,0x1ac8,0x19e3,0x1506,
  0x0891,0x05da,0x1c04,0x1ed3,0x0a11,0x061c,0x0dc5,0x01d5,0x1459,0x032e,0x1a7b,
  0x12e3,0x1a8b,0x17d3,0x1391,0x0ada,0x0a24,0x13e9,0x05db,0x2050,0x12c9,0x216a,
  0x0a09,0x149d,0x142b,0x0fd3,0x229d,0x19fa,0x0547,0x1984,0x0e06,0x1827,0x0477,
  0x19d1,0x05df,0x1248,0x12ff,0x01a2,0x10e8,0x095b,0x2227,0x1262,0x00dc,0x0354,
  0x07e8,0x03df,0x01fc,0x1ac1,0x0272,0x1aed,0x090b,0x209e,0x1ccb,0x1aa5,0x218b,
  0x1d9c,0x1467,0x12b2,0x0d2c,0x1b3d,0x0ec1,0x13f3,0x1330,0x1629,0x1576,0x2275,
  0x0684,0x0c41,0x0cd9,0x1836,0x1280,0x104d,0x168d,0x1de8,0x0e66,0x0a8c,0x2027,
  0x0448,0x0da8,0x0a50,0x1a4f,0x1a1a,0x0cf1,0x2180,0x03c5,0x1caa,0x0b84,0x18ee,
  0x026b,0x1e44,0x1f92,0x14f6,0x210e,0x0444,0x030a,0x140e,0x0f6b,0x0f44,0x0894,
  0x1407,0x085a,0x091e,0x02b7,0x0b83,0x2238,0x1e25,0x0a32,0x19f5,0x06a9,0x239e,
  0x10d9,0x2019,0x21a2,0x08a7,0x17df,0x1a82,0x138f,0x08aa,0x12e6,0x074d,0x1cdd,
  0x1fe1,0x0691,0x1f89,0x0810,0x05a9,0x00ab,0x0ad4,0x0623,0x02d4,0x09d3,0x1232,
  0x2002,0x1fc3,0x1b73,0x0704,0x0150,0x197d,0x1646,0x0595,0x1bad,0x2146,0x0ad5,
  0x074c,0x03fd,0x1018,0x1f08,0x0989,0x1204,0x0499,0x17e4,0x001e,0x0a23,0x13bc,
  0x1150,0x119c,0x056b,0x0bd7,0x0b8a,0x0ad7,0x05a1,0x0aa6,0x1b27,0x18d1,0x0d42,
  0x14e9,0x0779,0x027a,0x1c76,0x01a7,0x1fb0,0x1270,0x16c6,0x0142,0x1ff6,0x1172,
  0x11eb,0x212c,0x071d,0x1543,0x170c,0x0f2f,0x1f9d,0x0f95,0x1cc7,0x043b,0x12ea,
  0x0f10,0x1d6e,0x0722,0x00d6,0x1829,0x1244,0x1e0b,0x18cf,0x1c16,0x22de,0x093b,
  0x01fd,0x15ef,0x2087,0x1e24,0x02fb,0x1f1a,0x009d,0x0c20,0x0a35,0x18f9,0x0363,
  0x16ed,0x0f4c,0x22b3,0x20a6,0x23c9,0x0c9d,0x10cf,0x0fc2,0x0ab1,0x1514,0x1d88,
  0x1637,0x0844,0x06af,0x06a7,0x0400,0x1f96,0x15d3,0x1566,0x0a06,0x1a38,0x006a,
  0x03ea,0x1e4b,0x119f,0x1b8b,0x1049,0x1080,0x1b21,0x13be,0x0f57,0x18f6,0x22e4,
  0x1e9f,0x1be1,0x1353,0x1644,0x0a45,0x1aa3,0x01c9,0x06f7,0x10eb,0x0032,0x07f8,
  0x1ced,0x202c,0x0957,0x17b2,0x006b,0x1456,0x03da,0x061b,0x1a60,0x1c9a,0x137b,
  0x1ea2,0x1d61,0x0000,0x17fb,0x1be2,0x046a,0x1cbf,0x2192,0x1f0e,0x1968,0x0ae9,
  0x1508,0x0182,0x2324,0x2113,0x13cc,0x09f5,0x0b62,0x1283,0x0ffc,0x150b,0x0794,
  0x0a0d,0x236b,0x1590,0x0808,0x05d2,0x105a,0x1c80,0x207f,0x05cb,0x12fb,0x22be,
  0x012a,0x0dc3,0x01cf,0x023c,0x063d,0x060f,0x0447,0x2257,0x01c2,0x050b,0x03a1,
  0x0780,0x1782,0x12e7,0x1e52,0x135c,0x151c,0x14eb,0x1b4e,0x2250,0x168c,0x118d,
  0x031d,0x0680,0x2088,0x12d7,0x2133,0x14e0,0x1be5,0x201e,0x0c3b,0x23ac,0x1b22,
  0x01d0,0x0b17,0x1904,0x139f,0x1daa,0x1418,0x0327,0x1527,0x0920,0x0715,0x03c3,
  0x052c,0x0e8a,0x0812,0x017d,0x0c1d,0x02aa,0x1a7f,0x1de4,0x058f,0x194e,0x2343,
  0x0f11,0x1f18,0x0b05,0x2271,0x08e1,0x1cc6,0x1d38,0x20e7,0x12de,0x00e5,0x180c,
  0x0ac7,0x0c27,0x1c97,0x2304,0x10e6,0x071f,0x0c03,0x0249,0x1faa,0x0374,0x1e99,
  0x1fd5,0x2254,0x1b4c,0x0a92,0x2172,0x0b36,0x011b,0x1cb2,0x0560,0x18f4,0x0460,
  0x0b24,0x1910,0x0596,0x1c30,0x0be5,0x1b79,0x1e40,0x21ca,0x0997,0x0f89,0x0173,
  0x215c,0x0d4e,0x1e14,0x1a45,0x227e,0x18f7,0x1314,0x0c71,0x1d55,0x02b8,0x0c45,
  0x2232,0x10dc,0x155a,0x1581,0x14a6,0x1683,0x108b,0x0247,0x2247,0x1f69,0x1ec7,
  0x0f1d,0x0a2a,0x10fa,0x1660,0x16ce,0x0d18,0x0ddd,0x0bc6,0x0269,0x1911,0x187b,
  0x16f7,0x188a,0x1fa0,0x1ea6,0x11b5,0x04c9,0x214e,0x065f,0x017a,0x05ce,0x1c32,
  0x194d,0x1c44,0x02c1,0x1bcf,0x235b,0x228d,0x1a2c,0x03a3,0x017b,0x12d0,0x19e8,
  0x08ef,0x1f25,0x1e65,0x0ba9,0x0dd9,0x1cf8,0x103a,0x1e22,0x15dd,0x03d3,0x1ede,
  0x1cf7,0x03c1,0x04f3,0x2240,0x1ffe,0x03bb,0x0d7d,0x1ebf,0x1ba5,0x18e6,0x1ccf,
  0x1d8c,0x202e,0x0ba2,0x1a75,0x0065,0x104e,0x0661,0x1b85,0x1a7a,0x0dd5,0x0450,
  0x1cee,0x026e,0x1c0c,0x10b2,0x20f2,0x0aa7,0x12f4,0x08eb,0x23ab,0x07b3,0x130b,
  0x094d,0x1ea3,0x18f2,0x0c9c,0x1363,0x2036,0x13a8,0x16b1,0x1428,0x1f02,0x01e8,
  0x039e,0x1bed,0x1d98,0x08e2,0x14d6,0x1e56,0x2388,0x0c1e,0x19ee,0x04aa,0x0eb8,
  0x09e5,0x233e,0x1d66,0x07c5,0x211a,0x1088,0x0954,0x0e2a,0x1bc8,0x07a3,0x1e1e,
  0x1d36,0x1b87,0x1544,0x0137,0x11db,0x01c0,0x0845,0x216b,0x1bfc,0x08f6,0x0a5d,
  0x1edf,0x0fde,0x0731,0x110a,0x0fb9,0x0e86,0x1415,0x14e7,0x17a3,0x02bc,0x0c60,
  0x2111,0x0b41,0x234b,0x1c60,0x118a,0x0fdf,0x17cd,0x1323,0x087f,0x0025,0x165d,
  0x1606,0x0823,0x1368,0x07f2,0x0743,0x02e4,0x23d0,0x0803,0x14ae,0x1465,0x0fe3,
  0x02bb,0x0acf,0x137f,0x2212,0x1272,0x01b6,0x0c07,0x08ab,0x11e1,0x0274,0x171f,
  0x1126,0x09d2,0x1c01,0x23c5,0x1ab0,0x0f3e,0x0dac,0x00d5,0x14c2,0x17c1,0x028f,
  0x0de9,0x06c3,0x0de2,0x1a70,0x1aec,0x1638,0x1727,0x15ed,0x1532,0x13fd,0x123f,
  0x207e,0x0825,0x0066,0x14ec,0x1ee4,0x1fe9,0x14b3,0x1692,0x0557,0x07a0,0x11d6,
  0x21dd,0x05fa,0x2014,0x0a0c,0x152b,0x0425,0x00d7,0x00f2,0x0316,0x0eca,0x1b14,
  0x0896,0x15b3,0x0b80,0x1d20,0x0af5,0x09c8,0x0bf6,0x134f,0x0e00,0x1b99,0x0953,
  0x2341,0x21c7,0x1811,0x1032,0x1898,0x1286,0x1998,0x06b0,0x19fb,0x0790,0x15a6,
  0x16fb,0x16c4,0x0b28,0x0c7b,0x0fed,0x19ac,0x113f,0x1ec3,0x0a52,0x132a,0x048d,
  0x1b07,0x11d1,0x1f75,0x0838,0x04a5,0x04cb,0x046e,0x0a58,0x076e,0x12db,0x0ae8,
  0x185f,0x15e3,0x18a5,0x18ce,0x0236,0x0a46,0x1886,0x0b69,0x03cd,0x17e6,0x0a21,
  0x06d1,0x0964,0x0630,0x231b,0x1642,0x19ff,0x1880,0x1b6b,0x105c,0x0fcc,0x0043,
  0x1a4e,0x1554,0x0781,0x0034,0x1d16,0x1522,0x1abf,0x0f03,0x1b47,0x1a21,0x1e8e,
  0x007a,0x1e3e,0x0eb0,0x0dd7,0x0534,0x0241,0x051d,0x0c8f,0x0b55,0x1589,0x0256,
  0x194b,0x1d31,0x0828,0x09ad,0x075f,0x02af,0x0baf,0x1c49,0x20ed,0x1d21,0x0e6a,
  0x1723,0x19f6,0x114e,0x1419,0x1952,0x0f40,0x0b0d,0x2201,0x1d29,0x19c9,0x0a2f,
  0x1515,0x1f27,0x1cde,0x0dd3,0x1768,0x0e56,0x1a9c,0x12a4,0x11be,0x0b46,0x0dae,
  0x0afc,0x164b,0x08d7,0x003a,0x0bdd,0x1e4e,0x0bcf,0x105e,0x2000,0x1ba1,0x19f4,
  0x2100,0x20d7,0x2398,0x1c2e,0x04be,0x0199,0x221e,0x0532,0x07b7,0x155b,0x006d,
  0x16c1,0x1c74,0x0d61,0x17e2,0x0aff,0x1ac4,0x00e9,0x09e4,0x11bb,0x0674,0x22bd,
  0x1186,0x0578,0x202a,0x123b,0x15e8,0x0e8b,0x0403,0x097a,0x0105,0x14ed,0x14cb,
  0x0fdd,0x03ff,0x17af,0x1e39,0x02f3,0x13d3,0x0c89,0x20bc,0x20b2,0x15bc,0x1cac,
  0x2372,0x1b48,0x08d2,0x0446,0x1177,0x0d1f,0x17c6,0x1989,0x0516,0x0ddc,0x024d,
  0x16aa,0x09ee,0x1062,0x0b50,0x1f77,0x037f,0x07d2,0x093c,0x238a,0x0583,0x2375,
  0x0ca3,0x18ea,0x182a,0x0621,0x1036,0x02b5,0x01e2,0x22db,0x0963,0x2399,0x060c,
  0x1152,0x0f91,0x048a,0x1a7e,0x1e87,0x1bb0,0x15c4,0x1112,0x1021,0x11e2,0x0c56,
  0x07dd,0x1d46,0x0210,0x04f5,0x1c0e,0x0b8e,0x1040,0x1a6c,0x1af8,0x08d8,0x1313,
  0x1c8a,0x20b8,0x0b54,0x08a4,0x0094,0x131e,0x0a86,0x0a28,0x0d10,0x0a74,0x1ad2,
  0x0653,0x172c,0x21c1,0x1490,0x04fc,0x0bfa,0x1347,0x0b2f,0x1dc4,0x23db,0x0fb8,
  0x23bb,0x0c72,0x03e5,0x186a,0x0f9d,0x1295,0x1808,0x04c6,0x1960,0x1fa7,0x0de0,
  0x239f,0x1d5f,0x0eed,0x1f79,0x2068,0x06b8,0x0d99,0x15f5,0x1028,0x0202,0x0bad,
  0x0098,0x060d,0x0e84,0x18fb,0x1549,0x1e63,0x0ed6,0x009a,0x0b72,0x0b7b,0x06b1,
  0x0341,0x08f4,0x112a,0x18d5,0x0919,0x1731,0x19a5,0x16fa,0x0195,0x0f9c,0x123d,
  0x0968,0x0e17,0x0ebf,0x0d27,0x1a33,0x17fd,0x221b,0x208c,0x0694,0x1713,0x1696,
  0x0692,0x0006,0x1c3e,0x1617,0x0267,0x111d,0x2122,0x025e,0x200e,0x0d22,0x1627,
  0x1329,0x0048,0x1265,0x0d7a,0x1402,0x149c,0x02a1,0x022c,0x0f75,0x0783,0x124a,
  0x1134,0x0e1e,0x1c4c,0x1cb0,0x17f1,0x046f,0x0280,0x068b,0x1c46,0x1fda,0x0d82,
  0x1cd1,0x0590,0x056e,0x015a,0x121f,0x0b1d,0x019d,0x1eb5,0x0a82,0x16e8,0x117d,
  0x098f,0x1513,0x122a,0x0c18,0x0fa0,0x1eb1,0x0dd0,0x0e4a,0x23f8,0x190b,0x2053,
  0x16c0,0x18a3,0x0127,0x0ae1,0x0f52,0x12af,0x0e24,0x0c32,0x08a6,0x1d3f,0x00ca,
  0x229b,0x11f6,0x1a46,0x1bf3,0x1ec6,0x0275,0x13b4,0x1210,0x0a49,0x057c,0x0e3f,
  0x206b,0x05dc,0x21d5,0x18a7,0x14d3,0x1f57,0x1ff8,0x2220,0x0962,0x1bff,0x2301,
  0x08af,0x1eec,0x20cf,0x17e9,0x2302,0x0fbd,0x1bc9,0x0585,0x0784,0x17be,0x1b2b,
  0x111a,0x0ab3,0x1f1f,0x0505,0x0019,0x235f,0x0b59,0x039a,0x03f7,0x193c,0x1994,
  0x1c1e,0x0cbb,0x0d72,0x1706,0x1c37,0x0002,0x098b,0x2046,0x056a,0x0a1e,0x0a04,
  0x11c2,0x0883,0x06b3,0x0b48,0x07df,0x1122,0x04ee,0x215d,0x11d7,0x12a9,0x0f9a,
  0x0104,0x1618,0x175e,0x1a28,0x1d13,0x1dc9,0x0111,0x110c,0x1779,0x146e,0x1928,
  0x15b0,0x072c,0x0773,0x1ca2,0x0c3c,0x0bf2,0x1587,0x2269,0x10b0,0x0a6f,0x214d,
  0x0eec,0x1ef6,0x14ee,0x20c4,0x1a65,0x1a0b,0x23fa,0x0336,0x1603,0x0946,0x0d6b,
  0x0545,0x1b9a,0x0605,0x0c95,0x2185,0x0ee3,0x1f98,0x1eb3,0x0a39,0x05ec,0x1a5c,
  0x123a,0x0848,0x234e,0x023a,0x183e,0x16bd,0x014d,0x106a,0x0ef5,0x213c,0x0046,
  0x0395,0x2321,0x238d,0x1aee,0x1170,0x03dd,0x1c70,0x1d65,0x0cf0,0x224d,0x1f87,
  0x1d0a,0x09a4,0x14cf,0x0a02,0x0093,0x121a,0x02ef,0x22cc,0x0b8d,0x1e00,0x0b58,
  0x0ff9,0x1d62,0x1e6b,0x2387,0x138b,0x052d,0x081c,0x10a0,0x0194,0x22f9,0x1e5f,
  0x1e3d,0x06c9,0x167c,0x0096,0x1570,0x19a7,0x0b98,0x18ba,0x12aa,0x11cc,0x22c7,
  0x0064,0x0440,0x0b7e,0x23bf,0x01a6,0x09ed,0x000b,0x0834,0x008e,0x0a7e,0x0d32,
  0x0744,0x207a,0x03af,0x062b,0x21db,0x1b37,0x1fb1,0x1653,0x1807,0x141f,0x18af,
  0x1343,0x0d28,0x221a,0x1064,0x1bab,0x199d,0x19e9,0x23ff,0x22ef,0x0cb1,0x0ec2,
  0x0958,0x09d7,0x20ee,0x1aaf,0x1267,0x020b,0x1e58,0x0f2a,0x1b2f,0x0a7b,0x0ef2,
  0x2334,0x0131,0x164d,0x238e,0x0352,0x1c71,0x1b9b,0x1f54,0x08dd,0x069c,0x0c65,
  0x1feb,0x21c2,0x0c38,0x1743,0x23e1,0x10c1,0x110e,0x13ee,0x239a,0x125d,0x21dc,
  0x057b,0x1b1f,0x0d26,0x0121,0x02c5,0x0189,0x0867,0x190f,0x0a8e,0x064e,0x0c31,
  0x2149,0x0a5c,0x1b06,0x0a6d,0x2277,0x0dfc,0x1b2a,0x0fbc,0x051a,0x0767,0x00bf,
  0x1862,0x1414,0x1cda,0x1484,0x1098,0x0657,0x1c29,0x1c9f,0x0dbf,0x1b28,0x1aad,
  0x204c,0x077b,0x0888,0x0aca,0x1575,0x1780,0x1ac5,0x085e,0x14cd,0x1cb3,0x033c,
  0x1e62,0x1650,0x0f7e,0x1ce4,0x059e,0x20d6,0x072d,0x1371,0x2332,0x115f,0x204e,
  0x0282,0x11bf,0x08ce,0x1c10,0x11ad,0x10ff,0x15bd,0x04e1,0x22d9,0x1634,0x048b,
  0x0346,0x185a,0x083b,0x06f9,0x2124,0x072e,0x1aba,0x050d,0x18bc,0x003e,0x090a,
  0x1f2c,0x1734,0x0ee7,0x131a,0x0bb5,0x042e,0x12ad,0x1d5e,0x20ef,0x0c7f,0x1245,
  0x1ad5,0x0895,0x00ed,0x2314,0x19b9,0x055d,0x20a5,0x112c,0x0436,0x16da,0x0e12,
  0x0276,0x178b,0x0ebd,0x0b2e,0x23d5,0x0941,0x1c14,0x1fa2,0x0a90,0x1a99,0x1891,
  0x02bf,0x1305,0x1b18,0x0e0f,0x0bc1,0x0cd7,0x05ab,0x1ed5,0x1d53,0x04d0,0x0d98,
  0x062f,0x0bcc,0x0b88,0x2031,0x0295,0x1f29,0x1ecb,0x0db9,0x00c8,0x2396,0x0a17,
  0x1773,0x1ac9,0x0459,0x1ad6,0x22cf,0x1dc2,0x1bb8,0x1a23,0x1dfe,0x0604,0x213a,
  0x1357,0x1ea1,0x20d3,0x1137,0x1233,0x198d,0x1b04,0x041e,0x200d,0x233a,0x02a5,
  0x0ca7,0x0e15,0x17fe,0x216e,0x07c0,0x0bb0,0x0b9c,0x0a8f,0x0b15,0x0bda,0x14b0,
  0x15ca,0x189e,0x19dc,0x1ed9,0x0076,0x0a97,0x0918,0x0bed,0x0b81,0x0e0a,0x11dc,
  0x165a,0x037d,0x1b74,0x1438,0x1129,0x22a2,0x0373,0x0d43,0x20f0,0x0dde,0x0ab2,
  0x0771,0x22f5,0x05f5,0x0662,0x1b39,0x16b0,0x1ef3,0x0af2,0x0e44,0x0221,0x0a6e,
  0x0d47,0x1dac,0x18f1,0x10f6,0x2094,0x2294,0x0b21,0x0192,0x1a1e,0x03c9,0x1777,
  0x1462,0x2089,0x0a4f,0x1a12,0x1a6b,0x1737,0x1d18,0x0c98,0x2207,0x1fdd,0x2176,
  0x0109,0x0537,0x00bd,0x1916,0x1c2a,0x1377,0x1094,0x1d72,0x00ee,0x0057,0x1463,
  0x171b,0x00eb,0x1af0,0x15b9,0x0368,0x04cc,0x05ac,0x07ca,0x1a62,0x0afd,0x0c00,
  0x0548,0x153b,0x00ae,0x08f1,0x17c9,0x0428,0x07f0,0x23d8,0x0dd4,0x201d,0x0c4d,
  0x04ea,0x0161,0x0c02,0x016d,0x145d,0x1ca8,0x02f7,0x17f3,0x1fec,0x1933,0x0e23,
  0x0639,0x1cd8,0x20b7,0x0284,0x1016,0x0dc7,0x05a5,0x0e70,0x1a43,0x1dcb,0x09e8,
  0x13a9,0x06f5,0x1454,0x033a,0x1e82,0x088d,0x0736,0x14c5,0x14fb,0x190e,0x0b60,
  0x13ea,0x1260,0x0f8d,0x140b,0x1edc,0x1e93,0x1095,0x2258,0x088e,0x22f0,0x08f2,
  0x2364,0x1f97,0x1024,0x064f,0x0c5f,0x2052,0x1be4,0x1ee9,0x1fe3,0x15a8,0x0db1,
  0x0d1d,0x17f7,0x20d8,0x07f6,0x2077,0x15e0,0x1c2f,0x1709,0x05be,0x1b1b,0x2162,
  0x1a39,0x1c2c,0x13f7,0x19ec,0x20d4,0x0655,0x049c,0x17aa,0x20e6,0x04f4,0x01de,
  0x038f,0x21ff,0x12bb,0x14c3,0x1d23,0x0730,0x0e5a,0x1add,0x2300,0x1118,0x21d7,
  0x0fc5,0x0497,0x0390,0x11ea,0x18e5,0x1ef4,0x1eae,0x028a,0x102b,0x1365,0x05b1,
  0x18ed,0x0016,0x0012,0x0887,0x1e68,0x0933,0x1166,0x0f5d,0x1297,0x06b9,0x18c5,
  0x0f80,0x2305,0x12a0,0x0aa8,0x1766,0x1e2c,0x021d,0x1b30,0x0d3c,0x1585,0x1815,
  0x1b8d,0x00c1,0x02dd,0x0bd6,0x06dc,0x06ad,0x025b,0x0a59,0x1d6b,0x15e2,0x1388,
  0x1ae3,0x1e26,0x21af,0x1cad,0x02b0,0x09b8,0x0cfa,0x1ded,0x2267,0x0aba,0x21f9,
  0x0ab8,0x1278,0x1c58,0x1bca,0x1042,0x1f4d,0x1f5b,0x1b09,0x0b08,0x0217,0x2097,
  0x05bc,0x1219,0x1c6b,0x1885,0x1a69,0x01d1,0x0246,0x077c,0x13c4,0x11e9,0x01dd,
  0x206f,0x0a41,0x16dd,0x08e9,0x1578,0x0846,0x0b99,0x0c4e,0x03a6,0x17f5,0x13ab,
  0x1d2d,0x1b03,0x1f7f,0x0a96,0x1726,0x1ad9,0x1180,0x0b0c,0x0796,0x1718,0x0cea,
  0x0d8b,0x1b78,0x1c66,0x1bfa,0x07c3,0x1195,0x06c2,0x041c,0x11ec,0x148e,0x0e52,
  0x1987,0x08bc,0x0b7c,0x02c8,0x073d,0x23de,0x1a8e,0x1d7c,0x220e,0x01e0,0x14c7,
  0x18b7,0x20e0,0x0739,0x088b,0x0cf5,0x1498,0x0487,0x1699,0x035d,0x0416,0x0406,
  0x0c67,0x1188,0x1a30,0x00f7,0x063c,0x09b7,0x030f,0x09bd,0x0d5f,0x022d,0x1d00,
  0x1c45,0x1afa,0x0d16,0x0325,0x1794,0x21e0,0x18ad,0x09fc,0x0f48,0x1f49,0x0463,
  0x11e0,0x1bf4,0x2169,0x077d,0x0644,0x1497,0x1a51,0x0fc0,0x14de,0x2049,0x0110,
  0x0a3d,0x062d,0x08be,0x16b3,0x0021,0x20c3,0x0ba5,0x21b4,0x05aa,0x0b16,0x19c1,
  0x2128,0x0468,0x0e07,0x1f3a,0x052b,0x1161,0x0b9a,0x13ff,0x17d8,0x161b,0x2029,
  0x0fa3,0x0e29,0x0b70,0x1605,0x1a3f,0x1e78,0x1ec4,0x1429,0x1906,0x19bf,0x07ec,
  0x1dfa,0x2035,0x0a67,0x22a8,0x1863,0x21e4,0x04e2,0x1175,0x0411,0x1b56,0x037c,
  0x0262,0x0865,0x000a,0x2287,0x1279,0x1fd9,0x1667,0x1dc1,0x1af3,0x0148,0x0c59,
  0x199a,0x0943,0x0d07,0x233c,0x073a,0x14ad,0x12cf,0x0971,0x19eb,0x1ef9,0x15f9,
  0x0adc,0x1101,0x1ad4,0x0540,0x0727,0x0986,0x0d69,0x0a20,0x21a5,0x10ca,0x21c6,
  0x0eaa,0x06fc,0x0e47,0x15f4,0x222c,0x02c2,0x0580,0x05c0,0x11da,0x10d4,0x0dcf,
  0x0451,0x021a,0x228c,0x2104,0x1e7a,0x150f,0x043f,0x1b4b,0x0b76,0x1384,0x0208,
  0x0f33,0x001b,0x1a04,0x21bd,0x006e,0x1889,0x00aa,0x12c5,0x03fc,0x11f8,0x0d2f,
  0x0cdf,0x1f8c,0x0526,0x1659,0x17ea,0x0bca,0x119d,0x12b7,0x1392,0x0ab6,0x1331,
  0x1198,0x15ec,0x01c1,0x22ab,0x130c,0x14f0,0x227b,0x07e9,0x1e4c,0x016b,0x0a13,
  0x0e37,0x1136,0x1c8e,0x112f,0x1ce8,0x18d8,0x0372,0x011a,0x1411,0x07d1,0x076b,
  0x085c,0x0084,0x0714,0x0e3c,0x21f7,0x0f6c,0x23e9,0x0385,0x1b17,0x179c,0x159a,
  0x0506,0x135a,0x0882,0x1c36,0x1aa6,0x1e11,0x1a1f,0x1ef5,0x0e9d,0x0335,0x1658,
  0x04b8,0x06a2,0x061e,0x17b6,0x1db6,0x12bf,0x0443,0x220a,0x1983,0x07b0,0x1890,
  0x177a,0x038a,0x1496,0x1220,0x18b3,0x1149,0x0fa4,0x10ea,0x0620,0x11b1,0x01b1,
  0x08ba,0x0081,0x0fec,0x111c,0x0c1b,0x1382,0x0427,0x1582,0x1d54,0x0ee2,0x022a,
  0x0aab,0x23ea,0x1922,0x0399,0x2127,0x06ca,0x12d5,0x0a0a,0x1745,0x1f8f,0x009b,
  0x21b6,0x1bc2,0x0eee,0x00b6,0x0672,0x16d7,0x13e4,0x0abf,0x0f29,0x03d2,0x20e3,
  0x185b,0x08fe,0x0fb0,0x1cbc,0x2024,0x0a16,0x0c2c,0x0b23,0x134a,0x0ade,0x03e2,
  0x0a0f,0x2102,0x0caa,0x19d0,0x220f,0x06e2,0x2391,0x13cf,0x1edd,0x15b4,0x1012,
  0x1f15,0x23df,0x0735,0x223f,0x144b,0x12fc,0x1c86,0x1ce7,0x0da7,0x082f,0x1720,
  0x15c7,0x0212,0x22fd,0x133f,0x068c,0x169e,0x0c4f,0x1c31,0x139b,0x0da6,0x1a91,
  0x1d99,0x1493,0x160a,0x0077,0x1f45,0x1473,0x1b1e,0x028e,0x0fac,0x137c,0x2390,
  0x10a6,0x0129,0x0b67,0x1f53,0x0b97,0x21ac,0x0792,0x0758,0x1ab2,0x0c44,0x1482,
  0x1436,0x0036,0x1b3a,0x1cc9,0x1af4,0x152a,0x2355,0x0519,0x1747,0x1275,0x10b3,
  0x2086,0x14d1,0x20e9,0x12cd,0x0ea4,0x1f48,0x0dbd,0x0265,0x0a55,0x145f,0x2216,
  0x0d0f,0x103b,0x2381,0x0994,0x1337,0x0cf7,0x06e8,0x2253,0x0936,0x1ecc,0x2208,
  0x10c3,0x0de4,0x0a2d,0x09dd,0x1690,0x234d,0x031e,0x0824,0x04a2,0x0f46,0x17b9,
  0x1f81,0x02e2,0x04d5,0x13a2,0x0a10,0x01b3,0x1523,0x2013,0x0b06,0x1108,0x0244,
  0x06f6,0x041b,0x03a5,0x21ef,0x052f,0x08ff,0x0855,0x1fc4,0x1e1d,0x2385,0x0b77,
  0x1b86,0x2123,0x018c,0x2203,0x181a,0x01eb,0x07e1,0x1334,0x1d12,0x0a9d,0x01ed,
  0x1eda,0x1a2e,0x18aa,0x0598,0x1a83,0x162a,0x1a84,0x072b,0x2397,0x0166,0x00c0,
  0x091c,0x2350,0x010a,0x157e,0x142c,0x1f4f,0x1b93,0x1355,0x08f9,0x218e,0x1c57,
  0x0627,0x06ae,0x2186,0x230d,0x0c6f,0x1229,0x02c9,0x0972,0x0f68,0x217b,0x1130,
  0x0cdb,0x06b5,0x1045,0x1321,0x0aa0,0x0cce,0x121e,0x0c0a,0x07ef,0x02d8,0x061d,
  0x1003,0x0761,0x20fe,0x1519,0x027b,0x1105,0x174a,0x028b,0x0300,0x1efd,0x1711,
  0x03bc,0x1fcc,0x1dff,0x21fe,0x1ae0,0x12c0,0x2266,0x1dec,0x15e4,0x036b,0x0382,
  0x01b5,0x2067,0x20c6,0x0b2c,0x0f7f,0x1beb,0x0988,0x1491,0x0697,0x0f12,0x1096,
  0x0e78,0x103d,0x02a3,0x21bb,0x1563,0x11d2,0x150d,0x2308,0x21b3,0x0333,0x1213,
  0x009f,0x08a5,0x10ec,0x0e60,0x009e,0x1530,0x0fc6,0x110f,0x1ba3,0x027e,0x2223,
  0x009c,0x1b4d,0x1f62,0x1cf6,0x1e86,0x0fb1,0x0332,0x1baf,0x0c1a,0x0e2c,0x0360,
  0x197a,0x01d3,0x10f3,0x1b76,0x02eb,0x18ca,0x065b,0x1164,0x103e,0x0c39,0x0f8c,
  0x073e,0x07ce,0x183c,0x04ec,0x0e9a,0x0bde,0x0738,0x1093,0x0f0d,0x076a,0x0349,
  0x0da9,0x19f9,0x1154,0x1dd0,0x0ed0,0x1d22,0x22d3,0x015b,0x0052,0x0a5b,0x0ce2,
  0x1d89,0x1565,0x1752,0x0254,0x028c,0x18fd,0x12b9,0x1ca4,0x1f73,0x0567,0x1b01,
  0x0414,0x1510,0x1ed8,0x05fd,0x1acf,0x19ea,0x0163,0x0b73,0x1cbe,0x07b6,0x10d1,
  0x050f,0x1635,0x0413,0x17ed,0x1c40,0x1336,0x0eff,0x1199,0x1236,0x07bd,0x2312,
  0x04b1,0x2163,0x1ad1,0x0764,0x21d1,0x14dd,0x0ce8,0x1728,0x0348,0x236d,0x1ba6,
  0x2119,0x1405,0x0625,0x034c,0x0a1f,0x09e0,0x231c,0x0d4c,0x0839,0x04af,0x2153,
  0x12ab,0x0d8c,0x148f,0x03ce,0x2081,0x05a6,0x0f02,0x1d41,0x090f,0x0d8d,0x1ce5,
  0x0bf5,0x0358,0x0bbd,0x1981,0x1a5e,0x1312,0x103f,0x0347,0x23b0,0x0fad,0x08d1,
  0x00d8,0x08e0,0x212a,0x0dc4,0x1ebe,0x169f,0x07a6,0x1bf5,0x1fa3,0x0ee8,0x17b1,
  0x14a8,0x0ec8,0x2057,0x0586,0x19af,0x1c1a,0x1d10,0x15d7,0x06cd,0x0901,0x163c,
  0x1a20,0x1107,0x0879,0x1533,0x1edb,0x0e94,0x1fc9,0x20f5,0x00a9,0x20be,0x1011,
  0x1afe,0x21df,0x1d7e,0x0d25,0x13d1,0x099c,0x0a64,0x1729,0x113b,0x17c4,0x21de,
  0x0d8a,0x0b4b,0x00e2,0x0c10,0x2358,0x162e,0x1470,0x1dde,0x0050,0x1468,0x213b,
  0x106e,0x0490,0x09f2,0x0190,0x1f7a,0x03fb,0x215e,0x02ec,0x01cd,0x0f83,0x1503,
  0x00a0,0x17e8,0x0abe,0x019f,0x053a,0x2278,0x1a66,0x12a3,0x0b04,0x23d7,0x144f,
  0x131b,0x2099,0x0159,0x1d3e,0x1fe4,0x14d8,0x0100,0x130f,0x23f0,0x1623,0x1f40,
  0x0f13,0x1082,0x221f,0x12fe,0x0b9d,0x080b,0x1ee6,0x14b9,0x2351,0x05d7,0x065e,
  0x09bb,0x0209,0x0fda,0x03d5,0x1b82,0x204b,0x1073,0x131c,0x1358,0x230b,0x1bc0,
  0x1eb9,0x166a,0x11aa,0x1d85,0x08bb,0x1b7b,0x05f7,0x1b40,0x0e11,0x02db,0x13a3,
  0x0c15,0x14ea,0x0ab9,0x22e7,0x013a,0x07f4,0x0696,0x1228,0x0fcf,0x1561,0x09e7,
  0x2221,0x039f,0x028d,0x1171,0x098c,0x1b5b,0x0f93,0x1789,0x1269,0x0a3c,0x14a4,
  0x1864,0x16a9,0x0493,0x0b5e,0x0bd1,0x0646,0x1a52,0x11fc,0x0934,0x0ca1,0x16c5,
  0x045b,0x0eac,0x0ee1,0x1671,0x1918,0x0c4c,0x1d9a,0x2062,0x160d,0x1555,0x0677,
  0x0f58,0x1621,0x17ab,0x0db7,0x0f63,0x094b,0x1902,0x23be,0x0c35,0x0f51,0x149a,
  0x08fb,0x021f,0x1970,0x0995,0x19e2,0x1dbd,0x1e48,0x0b90,0x02cc,0x15db,0x2022,
  0x0cee,0x2161,0x0a57,0x11ae,0x0b6f,0x05ca,0x1450,0x19b8,0x0f4f,0x1f5a,0x1e2e,
  0x229a,0x15eb,0x074e,0x2317,0x0ecb,0x0b6c,0x0510,0x091f,0x0f85,0x101b,0x1bd3,
  0x0e7c,0x11ff,0x0f2c,0x1f9a,0x2382,0x232f,0x23dc,0x0df7,0x01cb,0x0dca,0x21d3,
  0x1857,0x0c6d,0x0fee,0x0509,0x0543,0x2331,0x1424,0x08fd,0x01e9,0x1ca9,0x23ef,
  0x100c,0x029a,0x1065,0x1078,0x0f9b,0x14da,0x0d09,0x0998,0x088c,0x019c,0x10c4,
  0x20ab,0x20e5,0x16a4,0x0682,0x0424,0x1c15,0x0c13,0x0a36,0x0856,0x07a5,0x1ad7,
  0x05d0,0x020c,0x16cc,0x1d8d,0x07da,0x2204,0x1d9f,0x1797,0x1c67,0x09c0,0x0237,
  0x1bb6,0x10a9,0x0417,0x0949,0x1e49,0x017e,0x0979,0x1753,0x0aa2,0x0362,0x0b8b,
  0x0536,0x1ea7,0x0ee5,0x04ca,0x2285,0x0deb,0x05a0,0x0853,0x12ba,0x0491,0x0423,
  0x11c0,0x0e36,0x1674,0x2010,0x1dc5,0x0709,0x125f,0x0c33,0x2349,0x0481,0x108a,
  0x0404,0x094f,0x09cb,0x0d3f,0x18c4,0x0ea3,0x060e,0x0654,0x1814,0x09ca,0x1ca3,
  0x0c34,0x1a17,0x1406,0x14ff,0x0f0e,0x0204,0x0c0f,0x11cb,0x1925,0x16b9,0x1488,
  0x1d01,0x0e96,0x0562,0x0c04,0x185e,0x0d2d,0x23d4,0x2328,0x030c,0x19a9,0x01ef,
  0x20ff,0x08f7,0x122e,0x1ac2,0x0c52,0x0296,0x1a59,0x0326,0x1089,0x1dd3,0x1c63,
  0x06bb,0x146f,0x1237,0x1950,0x203b,0x17a8,0x01a5,0x09d1,0x0591,0x1b15,0x0147,
  0x0f20,0x17b4,0x1a36,0x1fc5,0x1f5f,0x0c37,0x1bae,0x06bc,0x12c1,0x10d2,0x0a14,
  0x0875,0x120a,0x182d,0x0d6d,0x0f1b,0x0fa2,0x1cc2,0x1a64,0x11c4,0x1cf3,0x1fbd,
  0x0027,0x0c49,0x21cb,0x0462,0x107c,0x0cfd,0x1398,0x0633,0x06a5,0x00b0,0x0bfd,
  0x1665,0x102a,0x1915,0x150e,0x23a0,0x1344,0x0f69,0x097b,0x023f,0x18bf,0x1423,
  0x1290,0x22df,0x1060,0x0168,0x04fa,0x1b72,0x03c0,0x0b49,0x202d,0x227f,0x0d31,
  0x121c,0x0762,0x1980,0x05ee,0x20da,0x04bb,0x06fb,0x16e5,0x117b,0x079f,0x1bf1,
  0x02a6,0x0a5f,0x22ed,0x1517,0x034e,0x1628,0x1a72,0x02f2,0x1761,0x1e2d,0x161c,
  0x05c1,0x0757,0x138c,0x0438,0x1193,0x1a68,0x0340,0x111f,0x1440,0x1cdf,0x0634,
  0x23f9,0x064a,0x0c8a,0x1059,0x13a5,0x1b23,0x13d4,0x2210,0x12e4,0x0e03,0x0ca0,
  0x0355,0x0e0d,0x1d24,0x2155,0x0b93,0x0531,0x0b1c,0x1cfe,0x22bb,0x1b64,0x1d02,
  0x1f83,0x0c2a,0x01d4,0x000c,0x2213,0x2151,0x1f3c,0x200f,0x0469,0x0b79,0x086f,
  0x139e,0x1ada,0x00c4,0x07e0,0x1005,0x013c,0x1869,0x05b6,0x0944,0x0652,0x1ebb,
  0x047e,0x0d3a,0x05f0,0x2085,0x0342,0x0165,0x236a,0x03db,0x1e69,0x120b,0x0edb,
  0x156a,0x00cd,0x1f2f,0x0797,0x066c,0x0ae7,0x063a,0x1c7d,0x18a4,0x07b5,0x0e87,
  0x092f,0x213e,0x10d6,0x1f0a,0x1dd7,0x1b4f,0x0e68,0x1958,0x158d,0x14b6,0x0cb8,
  0x23e2,0x15d0,0x1249,0x1562,0x03d6,0x0513,0x1a3e,0x171e,0x1f09,0x0df9,0x0a07,
  0x12ae,0x0690,0x05c6,0x120d,0x20d1,0x17a0,0x2189,0x1d34,0x1799,0x1e5e,0x20c7,
  0x1b45,0x1359,0x174b,0x0ccc,0x0187,0x21d9,0x15a7,0x1e1f,0x13b1,0x05ff,0x10d5,
  0x1905,0x01a8,0x0277,0x1ff4,0x0eb5,0x1476,0x1e1c,0x1390,0x018e,0x0484,0x0fcb,
  0x146b,0x151b,0x1dc6,0x1a76,0x169b,0x0b64,0x0024,0x187a,0x1230,0x2132,0x0ece,
  0x149f,0x109a,0x1839,0x0568,0x1f84,0x0bf0,0x092d,0x0c77,0x13ef,0x14f9,0x138d,
  0x0832,0x0c68,0x0a37,0x0248,0x16ef,0x0125,0x087b,0x09a9,0x17c8,0x02df,0x06a0,
  0x0fc3,0x0d75,0x1a10,0x0eab,0x0d96,0x0cc2,0x1da2,0x13aa,0x1760,0x0146,0x1636,
  0x0082,0x1255,0x1206,0x19df,0x1d71,0x0d67,0x1db4,0x0f15,0x065c,0x20c0,0x12f9,
  0x1796,0x1997,0x13b5,0x087e,0x19fc,0x173b,0x163f,0x06cc,0x05f1,0x19b1,0x1d1e,
  0x16e1,0x1a3b,0x0c3d,0x07c1,0x1a7c,0x00a5,0x181c,0x1593,0x0259,0x167b,0x0120,
  0x0889,0x0a51,0x0da1,0x129d,0x1f76,0x045d,0x1471,0x03cc,0x07b2,0x07ee,0x16af,
  0x0549,0x1046,0x2217,0x0bbf,0x12c6,0x0aa5,0x1c51,0x1c94,0x0df4,0x22b8,0x0dba,
  0x1284,0x1d15,0x1433,0x1d17,0x15ae,0x0387,0x1052,0x0880,0x107b,0x09e9,0x2012,
  0x1151,0x0641,0x0ecc,0x156e,0x1771,0x1972,0x09f9,0x12c3,0x0c42,0x0b9e,0x02a4,
  0x12eb,0x16b7,0x054d,0x1742,0x0600,0x0bf1,0x11c5,0x223e,0x0b35,0x1843,0x1a5d,
  0x081b,0x1db2,0x0020,0x0bc7,0x155f,0x015e,0x1341,0x1fd0,0x136d,0x062a,0x1e6c,
  0x1da3,0x00c3,0x12ec,0x03c2,0x10d7,0x15f3,0x1489,0x19fd,0x067d,0x12d6,0x1847,
  0x0f9f,0x0ed7,0x1d9e,0x1adb,0x10a4,0x0710,0x1866,0x0f32,0x1ec0,0x2309,0x00e8,
  0x025f,0x135f,0x0c54,0x0fff,0x0bf9,0x0959,0x14f3,0x17a1,0x0ee9,0x20f3,0x10be,
  0x0df6,0x1d49,0x1111,0x0d2b,0x0226,0x1ab4,0x2337,0x021b,0x019a,0x22c0,0x1c06,
  0x08e5,0x2047,0x07f9,0x1612,0x0822,0x0e31,0x00f3,0x134c,0x1919,0x189d,0x23fb,
  0x0efe,0x07d8,0x10f5,0x1143,0x22d1,0x0476,0x10f9,0x16cb,0x0053,0x16d3,0x0366,
  0x1b6a,0x0074,0x1df6,0x165b,0x0308,0x116e,0x0837,0x1a0d,0x15f8,0x0d57,0x1875,
  0x1a8c,0x0ec0,0x239c,0x0bbe,0x0fb4,0x0009,0x1698,0x0afe,0x1992,0x23ba,0x0ee0,
  0x2096,0x00fe,0x1bf7,0x1239,0x23fd,0x1f8e,0x113c,0x084f,0x09b1,0x0931,0x1e2f,
  0x0976,0x07af,0x0b45,0x0abd,0x0f37,0x0c7e,0x06d3,0x238b,0x0759,0x17ac,0x0923,
  0x1d05,0x14fa,0x1755,0x187c,0x0e02,0x0b03,0x02ae,0x1735,0x0283,0x033b,0x1c77,
  0x23c1,0x185c,0x0010,0x1595,0x1c96,0x09e1,0x1055,0x19f7,0x1226,0x1790,0x01a9,
  0x1a8a,0x06b7,0x1a48,0x1a96,0x121d,0x14be,0x1681,0x131d,0x00bc,0x0d52,0x1401,
  0x0610,0x1a6f,0x1354,0x0dd6,0x0155,0x07d4,0x017f,0x2154,0x1c9d,0x176b,0x1c4b,
  0x1c68,0x1f33,0x082d,0x0616,0x23a4,0x0c86,0x1b00,0x0097,0x2357,0x10e4,0x149b,
  0x0b8f,0x0e71,0x0636,0x062e,0x14ac,0x07c7,0x20fd,0x12bc,0x0228,0x106d,0x0ab0,
  0x140f,0x2214,0x0c30,0x143b,0x1d77,0x1241,0x1fdb,0x1757,0x17e3,0x0cb4,0x1f93,
  0x1c75,0x02b3,0x237a,0x0928,0x0cde,0x12b4,0x11d4,0x1adc,0x2105,0x1b5c,0x1df5,
  0x22fc,0x085f,0x08bf,0x0e1a,0x1564,0x06bf,0x1d59,0x0b7a,0x22d7,0x0aed,0x10f8,
  0x0d48,0x1b33,0x20c2,0x205d,0x1801,0x228f,0x13bd,0x0f5c,0x062c,0x1f2b,0x1ab7,
  0x09be,0x0914,0x0c97,0x1941,0x151e,0x0676,0x01ba,0x0207,0x09f3,0x1f4e,0x1b7a,
  0x07c2,0x0059,0x1bb4,0x1ba4,0x1025,0x1102,0x0617,0x074a,0x0af9,0x0915,0x1d3c,
  0x0b1b,0x0e05,0x0d66,0x06c6,0x1c4d,0x0708,0x21c9,0x08e6,0x1dd9,0x235d,0x1d90,
  0x0095,0x0814,0x0e4d,0x21c5,0x1dc3,0x0430,0x1e0d,0x235a,0x15de,0x1b89,0x0729,
  0x066b,0x23a3,0x2028,0x0398,0x229e,0x1845,0x212f,0x0740,0x029e,0x1d0f,0x1d11,
  0x151d,0x023e,0x1b05,0x188f,0x0185,0x1584,0x044f,0x0033,0x0133,0x178d,0x0c9a,
  0x10bc,0x0815,0x2206,0x1ac3,0x0cba,0x115e,0x1772,0x0909,0x161a,0x015c,0x1e83,
  0x1e96,0x0a1a,0x1d75,0x179e,0x2175,0x143e,0x17c5,0x12e9,0x0f09,0x0885,0x0d71,
  0x18f8,0x0359,0x1615,0x0c6c,0x0809,0x1f10,0x1c18,0x199c,0x1553,0x0d1b,0x0c0b,
  0x1adf,0x0e4b,0x1b35,0x0b66,0x1264,0x22cb,0x0181,0x154f,0x0d74,0x134d,0x18c1,
  0x0e43,0x13ec,0x1e37,0x01be,0x0755,0x0579,0x154b,0x0893,0x19d6,0x2072,0x208e,
  0x22c2,0x0719,0x04e6,0x00d3,0x02c0,0x194a,0x0486,0x0dc1,0x06fd,0x1a86,0x0bec,
  0x1191,0x0840,0x196c,0x1959,0x12a5,0x08f8,0x17b0,0x16cf,0x0602,0x0d85,0x1f21,
  0x13a4,0x1946,0x06e1,0x14ba,0x20f9,0x182c,0x0e09,0x13d8,0x159c,0x0881,0x0542,
  0x1948,0x0829,0x1668,0x2060,0x1138,0x172d,0x17c3,0x0013,0x08e8,0x034f,0x1d80,
  0x018d,0x0e90,0x0551,0x1cae,0x0643,0x0ecd,0x005c,0x0223,0x0b29,0x10f1,0x0b5d,
  0x0c5b,0x132b,0x02d1,0x2316,0x147f,0x1335,0x0679,0x06c4,0x04a3,0x108d,0x02c3,
  0x075a,0x01ea,0x23ae,0x22b6,0x2138,0x232a,0x23ec,0x02ac,0x227c,0x0e39,0x168f,
  0x0f35,0x06da,0x0782,0x0556,0x042d,0x11ab,0x224c,0x0f1e,0x0561,0x17a4,0x1b42,
  0x0ac6,0x1b91,0x0483,0x118b,0x1eed,0x0741,0x177c,0x21e8,0x1afc,0x209d,0x0fe0,
  0x1ad0,0x13b2,0x0637,0x20a4,0x1c1d,0x0eaf,0x03e8,0x15f7,0x1686,0x21b2,0x2215,
  0x1091,0x01ce,0x135e,0x18c8,0x1e46,0x2322,0x0618,0x23ca,0x1795,0x1f03,0x1a3d,
  0x0c5d,0x2298,0x01ae,0x02e1,0x0d41,0x09d4,0x219d,0x2084,0x0f98,0x0375,0x13c9,
  0x0ac4,0x09fe,0x1d81,0x0ff0,0x11c7,0x1fa9,0x1301,0x0bef,0x1031,0x0b07,0x1fbf,
  0x1370,0x1aa1,0x1956,0x15c0,0x1858,0x13bb,0x0937,0x1804,0x109d,0x03d8,0x0635,
  0x1e41,0x0999,0x1079,0x15cc,0x15fc,0x09a2,0x1da7,0x142e,0x03ec,0x1954,0x1215,
  0x15e9,0x05c5,0x0831,0x13da,0x14ef,0x22fe,0x1a54,0x06fe,0x23f1,0x17a6,0x1cd2,
  0x068a,0x0e4c,0x03c8,0x007c,0x02e5,0x0c25,0x0c48,0x0a26,0x1a9f,0x09b2,0x20f6,
  0x14af,0x1b6f,0x233f,0x11f7,0x00b2,0x1076,0x1e70,0x0726,0x1f59,0x222d,0x175d,
  0x1986,0x0ad8,0x2095,0x0214,0x231f,0x10c6,0x1944,0x1816,0x093a,0x1ea5,0x0b4f,
  0x174e,0x1087,0x0c0e,0x1ddd,0x1cf2,0x15aa,0x2231,0x22e8,0x0b52,0x040c,0x1ce3,
  0x0b7d,0x197c,0x0234,0x05ef,0x1bdb,0x124e,0x1e95,0x03b4,0x226a,0x0149,0x137a,
  0x1af5,0x20d5,0x1d4f,0x0cda,0x145b,0x026a,0x0473,0x0ff1,0x168a,0x16a5,0x23e4,
  0x13c6,0x0eb7,0x0d7b,0x0d76,0x178e,0x23b7,0x05e2,0x16eb,0x0535,0x071b,0x2293,
  0x06e6,0x1903,0x1526,0x1c23,0x0ec7,0x0ccb,0x1f65,0x0d89,0x147c,0x23f5,0x1446,
  0x228b,0x0063,0x19dd,0x10fe,0x2023,0x0bac,0x096a,0x22a4,0x1770,0x176d,0x01c7,
  0x0e83,0x1e08,0x213f,0x2365,0x1ebd,0x1a16,0x0818,0x11fd,0x0e30,0x024e,0x2256,
  0x0314,0x02d7,0x129b,0x0303,0x1bc7,0x01cc,0x1586,0x0752,0x194c,0x168e,0x1099,
  0x10a5,0x1009,0x016a,0x0ba6,0x0dcc,0x0124,0x15a3,0x2152,0x1072,0x0ebc,0x2018,
  0x1eee,0x1139,0x0ccf,0x1fa1,0x035b,0x19d9,0x1029,0x1048,0x1397,0x18d0,0x075b,
  0x0c55,0x0188,0x19ca,0x2229,0x20d9,0x132d,0x0179,0x14a9,0x1a9d,0x1f6c,0x173f,
  0x18ff,0x12b0,0x00f8,0x14d9,0x0ce4,0x0732,0x0169,0x21aa,0x1f0b,0x1f0f,0x16ad,
  0x0869,0x1db7,0x0ba8,0x1a55,0x0f6d,0x01bd,0x1dda,0x1e1b,0x096b,0x09ff,0x2327,
  0x107d,0x0530,0x11e3,0x0558,0x16a1,0x0cb0,0x1c7e,0x160f,0x1840,0x187d,0x0eeb,
  0x14b1,0x079e,0x0c22,0x049e,0x0ae3,0x15bb,0x08e4,0x0f4a,0x1920,0x1ecf,0x12dd,
  0x1a01,0x0c2b,0x0507,0x0af7,0x04b9,0x0e35,0x209f,0x1805,0x1e66,0x1169,0x2041,
  0x1efc,0x1ddb,0x1e89,0x1ef2,0x1430,0x1dfc,0x1e98,0x0d9a,0x0d03,0x0bdf,0x09dc,
  0x15d5,0x08db,0x1250,0x0dc6,0x099b,0x07ed,0x1fee,0x0753,0x1c20,0x1eb8,0x17d2,
  0x23b2,0x1e34,0x22a3,0x0b5f,0x0ed1,0x0960,0x029b,0x1977,0x0a7d,0x12a1,0x00c9,
  0x04d3,0x1271,0x1a74,0x08b8,0x1035,0x231a,0x1300,0x047d,0x2202,0x0338,0x115c,
  0x01a3,0x2209,0x1cfb,0x193f,0x0be3,0x1e1a,0x1445,0x06a8,0x1f9b,0x1307,0x0916,
  0x0e34,0x1806,0x23cc,0x144c,0x214a,0x1ce9,0x22b4,0x198a,0x126e,0x0f82,0x0d80,
  0x0167,0x0ac9,0x04a1,0x184d,0x0e8e,0x190a,0x0268,0x1395,0x20ba,0x170f,0x16e6,
  0x0601,0x1e81,0x1662,0x19b2,0x165e,0x0e3a,0x0d0b,0x0edc,0x1235,0x23ee,0x0e28,
  0x0c88,0x0c8e,0x2196,0x10b5,0x0beb,0x230f,0x2367,0x0392,0x1404,0x0aea,0x1a9b,
  0x0439,0x03fa,0x1db9,0x1100,0x11c1,0x222b,0x0787,0x007e,0x0e76,0x0261,0x06d4,
  0x18b5,0x1b4a,0x0647,0x0ddb,0x1976,0x05ae,0x0f34,0x0186,0x0068,0x1075,0x151f,
  0x0c3a,0x002c,0x233b,0x0a56,0x0dfa,0x0857,0x137e,0x12b1,0x100b,0x0c21,0x0aa4,
  0x08b4,0x11ed,0x0eea,0x13eb,0x0614,0x1bd2,0x0356,0x16ba,0x1403,0x0aae,0x0f00,
  0x1ffd,0x054a,0x01bb,0x2181,0x21cd,0x013b,0x1f8d,0x2369,0x08c3,0x1669,0x195b,
  0x1884,0x02ea,0x1090,0x053c,0x11f2,0x0472,0x034a,0x042a,0x223c,0x10ae,0x19a2,
  0x147e,0x0d6f,0x13ae,0x1cd0,0x1fb5,0x093d,0x19d2,0x10c7,0x0258,0x0106,0x1d44,
  0x1abc,0x0b3d,0x1f86,0x1598,0x12e5,0x013d,0x1234,0x0f8a,0x0c6a,0x2318,0x0993,
  0x222e,0x1cc1,0x106f,0x1a61,0x05bf,0x19b4,0x0ea8,0x03b1,0x1c6c,0x2030,0x0725,
  0x0e62,0x064d,0x1469,0x2211,0x0004,0x1525,0x0b9f,0x0cb9,0x0efc,0x0d02,0x1a1b,
  0x17c0,0x1c50,0x14c4,0x0c0d,0x1cf1,0x02d0,0x1a92,0x0b26,0x0fdb,0x109e,0x0905,
  0x0e8d,0x1d60,0x1c91,0x23f2,0x111e,0x06f2,0x1a88,0x22f3,0x0ab5,0x1d83,0x0fea,
  0x05eb,0x1e55,0x056f,0x08b7,0x18e1,0x1cd3,0x0a94,0x0e3e,0x0e5f,0x1282,0x0cc7,
  0x0ab7,0x1dbf,0x0213,0x1bd1,0x044d,0x20ec,0x19e0,0x071a,0x0df1,0x07d5,0x1311,
  0x0007,0x0f92,0x00c5,0x0433,0x0465,0x073b,0x0851,0x1542,0x05e9,0x0d39,0x0a1b,
  0x17f6,0x114d,0x0a9f,0x00a4,0x1a98,0x0acd,0x1835,0x1d8a,0x0649,0x1002,0x1038,
  0x1e7b,0x0ff2,0x1cf4,0x21b8,0x1a58,0x0fe4,0x038e,0x1458,0x1538,0x1550,0x025a,
  0x0b82,0x16f0,0x0191,0x171d,0x081e,0x0bd4,0x15da,0x0849,0x21e2,0x0b7f,0x1a0f,
  0x18b6,0x1fd7,0x02b9,0x04c1,0x0289,0x1f55,0x13dd,0x0fe1,0x1b1d,0x191d,0x17bb,
  0x0e4e,0x0175,0x1ac6,0x0044,0x23ad,0x1d03,0x210f,0x17c7,0x05e8,0x0cc0,0x00d1,
  0x0a60,0x0b3a,0x2299,0x2311,0x13e8,0x0bc8,0x0ac8,0x1e07,0x0380,0x0d50,0x0b56,
  0x0555,0x2143,0x0479,0x1545,0x1285,0x13e6,0x1926,0x2042,0x2075,0x1d79,0x2362,
  0x206a,0x187f,0x14b7,0x138e,0x1aa0,0x1c2d,0x0899,0x22cd,0x115b,0x00d4,0x1014,
  0x1701,0x02cb,0x0028,0x1a2f,0x1ffa,0x21ee,0x16c3,0x1158,0x15ce,0x1831,0x1639,
  0x04b7,0x00ce,0x0431,0x011f,0x1d35,0x23ed,0x093f,0x0b91,0x0ed2,0x0eda,0x0369,
  0x1bc3,0x0b1a,0x21c3,0x040a,0x206c,0x17f9,0x1fb9,0x0cad,0x1938,0x1661,0x0e19,
  0x1c1f,0x0a68,0x079b,0x1580,0x0005,0x1d56,0x0cbd,0x0306,0x1f3e,0x0872,0x1d2c,
  0x0a3a,0x06e9,0x1b43,0x0c8d,0x0113,0x0023,0x1675,0x0218,0x026d,0x1622,0x22a1,
  0x03f0,0x177f,0x20f4,0x0ef3,0x1d96,0x2281,0x053e,0x0cd2,0x0c70,0x159e,0x1691,
  0x0713,0x1f5e,0x205b,0x15c6,0x1c09,0x16e0,0x04cf,0x1c1c,0x0c74,0x15e5,0x12f7,
  0x16d8,0x2245,0x07e2,0x0566,0x0345,0x1fe2,0x2093,0x114b,0x19d8,0x0313,0x2108,
  0x1e09,0x2110,0x1fa8,0x03f6,0x0d93,0x0bd8,0x067f,0x06de,0x2242,0x2282,0x120f,
  0x04e5,0x0e97,0x05de,0x1d9b,0x09c1,0x19c8,0x029d,0x19a4,0x18bb,0x12f5,0x13d5,
  0x1ab3,0x11cf,0x0d59,0x094a,0x1574,0x16f6,0x0c08,0x22c3,0x20bb,0x18e3,0x0a73,
  0x1842,0x093e,0x1114,0x1211,0x1733,0x09da,0x1abe,0x1bd0,0x202f,0x0e41,0x222f,
  0x1f94,0x0d21,0x0553,0x08f0,0x10da,0x0711,0x11fe,0x1b52,0x07bc,0x0bf3,0x076f,
  0x0ad1,0x0d1e,0x004f,0x170d,0x107a,0x1103,0x0681,0x02d2,0x0fa7,0x10dd,0x12d4,
  0x2083,0x0d9f,0x1deb,0x0422,0x1776,0x1767,0x029f,0x0c7a,0x10e1,0x1c11,0x08d6,
  0x069a,0x1f47,0x14aa,0x1810,0x0cf6,0x09a3,0x0235,0x180a,0x1708,0x0a72,0x1bec,
  0x1026,0x1754,0x0b0b,0x043a,0x2040,0x1119,0x0612,0x0628,0x1187,0x14b4,0x157f,
  0x1db3,0x0156,0x01f9,0x082c,0x13fb,0x1218,0x0003,0x19cc,0x1764,0x14dc,0x1f30,
  0x0011,0x0aa1,0x096f,0x14fe,0x23c3,0x0cae,0x04db,0x0f18,0x1f4a,0x039b,0x15e1,
  0x08cb,0x0adf,0x1fdf,0x1b50,0x08ed,0x1721,0x2296,0x040f,0x1a29,0x128e,0x0c84,
  0x218a,0x01ca,0x1d78,0x05d8,0x0d19,0x0b94,0x13c0,0x02e8,0x0426,0x2272,0x10ed,
  0x1179,0x1e4d,0x1781,0x0219,0x21a9,0x0088,0x2091,0x19e4,0x115a,0x1116,0x17d0,
  0x1a49,0x14b2,0x0dad,0x0608,0x1f6e,0x2001,0x1be0,0x17f0,0x0897,0x004c,0x11c3,
  0x22e3,0x05c8,0x06e5,0x1678,0x140d,0x1ba9,0x05fc,0x08e3,0x096d,0x03a9,0x092c,
  0x17f8,0x04bf,0x0902,0x16db,0x1ee2,0x15e7,0x12e2,0x05af,0x0c64,0x1345,0x03f2,
  0x128a,0x0811,0x0716,0x0582,0x031f,0x13df,0x1e47,0x1b1c,0x0e77,0x1ee3,0x22b2,
  0x1fba,0x0e2d,0x2082,0x1a8d,0x1596,0x11b4,0x129c,0x1f95,0x1710,0x1a57,0x1736,
  0x0d84,0x1b34,0x1d30,0x0d95,0x0b6e,0x1f2a,0x0e64,0x060b,0x0a91,0x0ce9,0x14a7,
  0x20b3,0x1442,0x1803,0x195c,0x06b2,0x11f9,0x10df,0x1784,0x0b53,0x10ba,0x1317,
  0x1420,0x114f,0x1871,0x17c2,0x0742,0x16a2,0x06ec,0x19b7,0x0367,0x0c2e,0x129e,
  0x06cf,0x0d01,0x0fe7,0x03a8,0x08c4,0x124d,0x139c,0x04ab,0x1cc5,0x0574,0x082b,
  0x1c79,0x126c,0x216f,0x023b,0x17d5,0x066a,0x0f01,0x0ae6,0x06f0,0x13b6,0x1227,
  0x0a78,0x230e,0x2348,0x222a,0x0ff4,0x1e9b,0x1fd8,0x136a,0x2335,0x10ac,0x134b,
  0x1939,0x0273,0x0bc4,0x01e3,0x1d37,0x1aa8,0x0123,0x0609,0x069e,0x03b5,0x1874,
  0x1896,0x22da,0x08b3,0x04b4,0x0304,0x1fcd,0x0f6f,0x04b6,0x0a77,0x02a2,0x2109,
  0x2393,0x23b5,0x21b5,0x2330,0x1cd7,0x15d6,0x0acb,0x0f94,0x20de,0x0836,0x1c7a,
  0x0ffe,0x1645,0x15ad,0x188b,0x184a,0x1b41,0x158e,0x046d,0x173e,0x0b40,0x0378,
  0x0281,0x0f3d,0x11ac,0x1d70,0x1bf9,0x101e,0x145c,0x0083,0x058e,0x160c,0x1fa6,
  0x1364,0x1ff1,0x0e48,0x0992,0x086c,0x16d6,0x08da,0x0c40,0x0253,0x03f9,0x2065,
  0x2032,0x03b0,0x1281,0x2118,0x1f23,0x1722,0x22fa,0x0328,0x01aa,0x146a,0x12c4,
  0x2329,0x03ef,0x0df3,0x0c53,0x09ea,0x01c4,0x1fca,0x1792,0x09d9,0x1540,0x1f6a,
  0x0279,0x0145,0x1aa7,0x013f,0x1e19,0x15b6,0x000d,0x0a53,0x186e,0x217f,0x0ce3,
  0x1853,0x1a11,0x1936,0x1828,0x08bd,0x08df,0x1ea8,0x12ee,0x1d0c,0x1664,0x20df,
  0x04de,0x083a,0x0d24,0x2361,0x0f2b,0x2354,0x126f,0x109b,0x1df8,0x174f,0x09a0,
  0x0d53,0x00c2,0x06ba,0x087c,0x0cc3,0x21b9,0x128c,0x01a1,0x0688,0x1162,0x0c7c,
  0x1c27,0x20d0,0x0a6b,0x1b44,0x002d,0x119b,0x1855,0x102f,0x19bb,0x20fb,0x11c8,
  0x05fb,0x058a,0x1c5f,0x1ce6,0x09c7,0x192f,0x0e1d,0x03cb,0x20ea,0x1cc3,0x01db,
  0x05c9,0x1b60,0x069b,0x001d,0x2295,0x1c4e,0x0a40,0x105f,0x0141,0x01ac,0x0640,
  0x032d,0x15b5,0x229f,0x1e17,0x19f0,0x194f,0x0102,0x0675,0x0b5b,0x203a,0x1010,
  0x1412,0x02e7,0x155c,0x176a,0x0866,0x21a1,0x18e9,0x0565,0x12ca,0x1f44,0x1274,
  0x1b32,0x0260,0x196f,0x1838,0x13c3,0x003f,0x19c6,0x01c6,0x1600,0x0edf,0x0fd1,
  0x0a69,0x0062,0x1ed0,0x0f56,0x0377,0x2333,0x0ea5,0x0350,0x1df1,0x19a6,0x224b,
  0x0ea0,0x112d,0x204d,0x04d2,0x1613,0x1793,0x0817,0x1d4e,0x1bf2,0x1913,0x0233,
  0x0b34,0x0a71,0x109c,0x1775,0x0cdd,0x02de,0x1eb4,0x1c28,0x021c,0x1d1c,0x1c93,
  0x1189,0x1999,0x16ac,0x1670,0x1738,0x1e2a,0x2078,0x14bd,0x00ea,0x0898,0x1015,
  0x0efa,0x19d7,0x113e,0x1630,0x1dbb,0x0ec9,0x1560,0x1fc8,0x16ec,0x10e3,0x0cf2,
  0x07c8,0x1174,0x0c5a,0x002e,0x1db1,0x01d6,0x07e7,0x18cd,0x19a8,0x0cc5,0x0d5c,
  0x1541,0x12cc,0x0be9,0x0a1c,0x21cf,0x0171,0x067b,0x1de3,0x1ee8,0x022b,0x17a9,
  0x19ab,0x0d20,0x1c03,0x1e45,0x0e80,0x0b19,0x107f,0x124f,0x18ae,0x1907,0x1614,
  0x18bd,0x0a9b,0x059b,0x0d70,0x12f3,0x10c5,0x2140,0x0bb4,0x2384,0x01f7,0x0748,
  0x0ffb,0x13b3,0x01ad,0x076d,0x1083,0x1125,0x0018,0x1c39,0x0925,0x19ef,0x0e4f,
  0x210c,0x159f,0x037e,0x0a62,0x219e,0x211c,0x1c54,0x0be0,0x1e02,0x09ba,0x1cbb,
  0x147b,0x1389,0x0b68,0x1023,0x23cb,0x0e75,0x1086,0x1145,0x0be4,0x1bfd,0x2059,
  0x2007,0x0022,0x05d5,0x1bf6,0x02f0,0x1d1d,0x129a,0x06e4,0x0f47,0x0673,0x0add,
  0x0871,0x1c52,0x1449,0x232c,0x1e67,0x085b,0x20ae,0x0b74,0x16a7,0x0b85,0x1717,
  0x0fc7,0x0dfb,0x097f,0x0624,0x1cd6,0x15af,0x0efb,0x0e42,0x03b9,0x1369,0x0927,
  0x047c,0x0d5a,0x0982,0x0e7f,0x217c,0x02d5,0x06dd,0x1e79,0x0d9d,0x1964,0x1153,
  0x1f70,0x04cd,0x1123,0x22f1,0x1f2d,0x1ea4,0x19b6,0x1c3b,0x1356,0x0e01,0x16c7,
  0x11c9,0x191a,0x09ac,0x1de6,0x1fdc,0x0581,0x1f04,0x1178,0x06ab,0x1d06,0x0a48,
  0x0f5b,0x1e4a,0x15d2,0x0ff8,0x01c3,0x1a14,0x0d17,0x086d,0x0cef,0x1d50,0x03cf,
  0x0b3e,0x003d,0x06ac,0x008b,0x1185,0x1732,0x11bd,0x12f8,0x03b8,0x1068,0x18a2,
  0x1ba0,0x10f0,0x0868,0x03e6,0x1dc8,0x1aa2,0x1b13,0x1c82,0x0055,0x099f,0x2222,
  0x034b,0x179d,0x1e6f,0x1261,0x0fc8,0x166d,0x1f42,0x127f,0x0c9b,0x00b9,0x1d26,
  0x181d,0x1320,0x09ae,0x01da,0x1a35,0x05e3,0x04d6,0x1141,0x1bb2,0x0669,0x1b70,
  0x1f22,0x1b9d,0x19be,0x0d2a,0x1057,0x0a3b,0x11d3,0x157b,0x1b49,0x14f7,0x095d,
  0x0a88,0x0126,0x031b,0x03de,0x1422,0x0bf8,0x1030,0x1f34,0x210b,0x1b12,0x0379,
  0x0806,0x1252,0x18a0,0x1778,0x1ee7,0x23c6,0x1611,0x22ec,0x0be8,0x0950,0x1008,
  0x0906,0x1d51,0x10a2,0x1dae,0x22d8,0x1499,0x152f,0x0d08,0x00db,0x0860,0x0162,
  0x0ad3,0x2233,0x18a6,0x0dd2,0x1477,0x11b3,0x1cbd,0x2043,0x183a,0x1077,0x15e6,
  0x1fea,0x0fe8,0x0396,0x0b0a,0x1296,0x0049,0x2303,0x1818,0x03a2,0x03f8,0x1225,
  0x05ed,0x15d4,0x030d,0x089d,0x107e,0x0a43,0x14a0,0x235c,0x1426,0x0733,0x0d1c,
  0x1b96,0x09ce,0x155d,0x0f6e,0x238c,0x0876,0x1de0,0x1223,0x0fef,0x078b,0x1ec2,
  0x09bf,0x1d52,0x1fa4,0x202b,0x14e1,0x0864,0x1f78,0x0fa9,0x1821,0x0e38,0x06a6,
  0x0211,0x1f9e,0x020a,0x1af2,0x0981,0x1cc0,0x0766,0x1047,0x1ea9,0x0c16,0x1be8,
  0x0464,0x22c8,0x183b,0x0b32,0x2106,0x0d79,0x14f5,0x0a33,0x18d4,0x0482,0x0158,
  0x13e2,0x1651,0x03c6,0x1750,0x1a5a,0x1c3c,0x1825,0x1dfb,0x1d76,0x2218,0x1f16,
  0x08ee,0x210a,0x0747,0x0df5,0x0cd3,0x10d3,0x1bba,0x1f5d,0x1a78,0x19c7,0x177e,
  0x13f0,0x2315,0x1f82,0x0922,0x22c6,0x17cc,0x1a50,0x1fe5,0x193d,0x122d,0x03e3,
  0x07c9,0x20b0,0x217a,0x23f4,0x0dfd,0x1268,0x080e,0x192d,0x0698,0x1eaf,0x170a,
  0x1e60,0x1947,0x1ce1,0x10bb,0x1505,0x016e,0x207b,0x11e7,0x1f85,0x0f72,0x191e,
  0x2015,0x04ad,0x0ac1,0x1d73,0x2003,0x02f9,0x1c26,0x1f64,0x0c7d,0x0b2d,0x004d,
  0x1e2b,0x1432,0x026c,0x1e04,0x218c,0x0ce1,0x000f,0x0a01,0x16d0,0x20c8,0x0e25,
  0x0c09,0x2199,0x091a,0x0e3b,0x0f5f,0x0d5e,0x223d,0x025d,0x0699,0x00dd,0x20eb,
  0x1352,0x1b92,0x21a4,0x1e10,0x05e5,0x1292,0x0750,0x0552,0x0061,0x0058,0x07cb,
  0x02b6,0x12f0,0x0f67,0x070d,0x1837,0x196b,0x09f7,0x153f,0x0bee,0x1769,0x0b00,
  0x1142,0x1ae9,0x1b98,0x1b8a,0x11a8,0x1dd2,0x16d2,0x1c7c,0x0f38,0x0f3b,0x1601,
  0x0151,0x0320,0x1085,0x0b61,0x0daf,0x1308,0x0e21,0x0371,0x1f7c,0x04dd,0x0f49,
  0x1146,0x169c,0x1e31,0x1258,0x1e50,0x1f8b,0x205f,0x145a,0x084d,0x23b8,0x0faf,
  0x2055,0x160e,0x13d7,0x0908,0x0a7c,0x1022,0x0ac5,0x02da,0x1962,0x1f9f,0x0467,
  0x1e9c,0x04e3,0x0f4e,0x1df9,0x23a5,0x10e7,0x11a9,0x215f,0x117e,0x223a,0x149e,
  0x01e6,0x18d6,0x03b7,0x104b,0x0fbb,0x1273,0x18c9,0x0a4a,0x215a,0x024c,0x1378,
  0x1ed2,0x212d,0x0f22,0x1f99,0x212e,0x2044,0x10d0,0x22d2,0x20f7,0x19b5,0x1416,
  0x1741,0x20b6,0x1159,0x23a6,0x186d,0x0515,0x04a8,0x2171,0x0e9e,0x2325,0x111b,
  0x1ec8,0x1620,0x1687,0x22bc,0x059f,0x06e7,0x11dd,0x1c88,0x2125,0x0faa,0x10db,
  0x1854,0x1410,0x141c,0x23af,0x21d6,0x0b8c,0x0ad9,0x0b6b,0x0597,0x0c06,0x0619,
  0x198f,0x0339,0x0802,0x0859,0x0107,0x0410,0x208a,0x2291,0x0e10,0x1da6,0x19aa,
  0x0324,0x10fb,0x049a,0x0cac,0x2252,0x0299,0x0fd0,0x1de7,0x086e,0x0ffa,0x09fa,
  0x23c8,0x18c7,0x0489,0x2195,0x1802,0x19f2,0x1967,0x0fbf,0x02ee,0x0ae4,0x0b63,
  0x1509,0x178f,0x0843,0x05e7,0x0613,0x1739,0x065a,0x0201,0x06d7,0x21da,0x11f4,
  0x0503,0x090d,0x0e32,0x09a8,0x1b5a,0x1efb,0x20bf,0x11f1,0x1d40,0x1df2,0x1e75,
  0x01b0,0x0bce,0x1346,0x1d5c,0x0546,0x1b0e,0x07b4,0x11e8,0x018a,0x19e6,0x0177,
  0x134e,0x18e2,0x1546,0x0861,0x054c,0x0119,0x1a77,0x1cef,0x1110,0x1953,0x1cd9,
  0x0b65,0x0cd0,0x1e5a,0x1e0f,0x07eb,0x13c2,0x1949,0x16e3,0x0409,0x007f,0x1cff,
  0x0485,0x14d0,0x0cd1,0x0e46,0x055e,0x1c48,0x016f,0x1c7b,0x1109,0x18b2,0x0ed5,
  0x13b0,0x0dff,0x2061,0x0795,0x2076,0x1a4a,0x029c,0x13bf,0x119a,0x1819,0x227a,
  0x0388,0x1c24,0x036e,0x1d82,0x0f4b,0x084e,0x23eb,0x13a1,0x0632,0x13dc,0x150a,
  0x0112,0x05a4,0x073c,0x161d,0x04ac,0x2283,0x0d0a,0x172e,0x2142,0x0319,0x1673,
  0x17d6,0x0f73,0x0e26,0x14e6,0x1f46,0x13e0,0x1841,0x130e,0x2363,0x10ce,0x0980,
  0x15a2,0x1fc7,0x04d9,0x11a2,0x0ca8,0x00ef,0x07bf,0x1c12,0x09de,0x0ae0,0x00df,
  0x0d49,0x06c0,0x206e,0x1ee1,0x0a38,0x22f8,0x1dc7,0x0a79,0x1800,0x179b,0x1386,
  0x1a22,0x01d2,0x094e,0x125c,0x2244,0x1746,0x0ede,0x002a,0x1ca7,0x099a,0x07e4,
  0x0264,0x1c6f,0x2389,0x0987,0x1f3d,0x1e88,0x02e0,0x0d44,0x0e6c,0x1e8f,0x0f55,
  0x2066,0x1cc4,0x0917,0x1db8,0x089f,0x0615,0x11a5,0x12c8,0x0a42,0x079c,0x0d13,
  0x0b6a,0x131f,0x136c,0x04ae,0x130d,0x16f8,0x01a0,0x13c7,0x0b4c,0x2279,0x0196,
  0x1464,0x0f60,0x0231,0x19a0,0x1e9a,0x0397,0x170b,0x133c,0x2265,0x017c,0x1c78,
  0x048c,0x08d0,0x06a4,0x071c,0x0bba,0x0de7,0x0b3f,0x0229,0x1ead,0x140a,0x037b,
  0x0ec6,0x0e16,0x0442,0x1894,0x156c,0x0f8f,0x23a1,0x0dce,0x13cd,0x1aa4,0x0e59,
  0x162b,0x1aa9,0x1bfb,0x09a7,0x1703,0x0a81,0x2056,0x21bc,0x078f,0x07ad,0x1a24,
  0x0f31,0x19f3,0x09e6,0x11cd,0x23b6,0x234f,0x0fd2,0x196d,0x06d6,0x035a,0x0afa,
  0x005e,0x035c,0x1ab9,0x15a4,0x1318,0x0132,0x08d9,0x0512,0x1693,0x0db0,0x16a6,
  0x07fc,0x0b02,0x1d0d,0x09f0,0x21f5,0x0799,0x13e3,0x0768,0x0ef9,0x1176,0x014a,
  0x15c1,0x0ba1,0x0e99,0x112b,0x1aae,0x1c0b,0x0178,0x1c69,0x1c0f,0x0130,0x1fc2,
  0x0e45,0x1694,0x1f0d,0x1a79,0x0911,0x0fe9,0x09af,0x18c2,0x1b67,0x1df3,0x0b01,
  0x14b5,0x1dfd,0x0dcd,0x161e,0x19a1,0x19e5,0x1500,0x14c9,0x0b2a,0x2366,0x1b46,
  0x14f4,0x0b5c,0x063e,0x03e1,0x0ca5,0x04f7,0x1409,0x0ec3,0x1d5d,0x012c,0x1277,
  0x1310,0x1214,0x112e,0x1f80,0x0ad6,0x1fd6,0x105b,0x226c,0x1f41,0x19cf,0x2033,
  0x0d29,0x03ca,0x1a47,0x0756,0x125a,0x06f4,0x1b53,0x0527,0x1d91,0x20ce,0x1975,
  0x0072,0x1431,0x1eef,0x0bd0,0x0be1,0x0c01,0x00e1,0x0a7a,0x23e6,0x0323,0x219f,
  0x1367,0x07a2,0x1cb6,0x2191,0x0cb2,0x234a,0x1288,0x17dd,0x030b,0x15f2,0x02a8,
  0x0d83,0x04bd,0x2347,0x0522,0x051b,0x225a,0x228a,0x1b9f,0x13f9,0x1b7c,0x1d7f,
  0x0a30,0x0220,0x1c3f,0x22ea,0x1680,0x0fc9,0x1190,0x1ef1,0x21cc,0x155e,0x20dd,
  0x0f27,0x13f6,0x07ff,0x0f71,0x1e6a,0x05b9,0x0f0a,0x2228,0x02e9,0x0ace,0x205c,
  0x01e5,0x200b,0x002f,0x1e27,0x0116,0x1b38,0x190c,0x2307,0x07ea,0x152c,0x04c8,
  0x01fe,0x199b,0x1001,0x1535,0x0930,0x1ec9,0x086a,0x0080,0x141e,0x1066,0x16df,
  0x0c79,0x1e42,0x0a4c,0x0667,0x1b7f,0x1679,0x1a3c,0x1a25,0x00e6,0x0611,0x0518,
  0x0b87,0x16f9,0x22b0,0x1c3a,0x14fd,0x04bc,0x080f,0x21bf,0x1943,0x0266,0x1124,
  0x002b,0x0670,0x01ab,0x1ec5,0x08b6,0x091d,0x0fa6,0x0541,0x20dc,0x0e65,0x0128,
  0x08c9,0x11e5,0x1647,0x0d3d,0x01b8,0x1c61,0x2319,0x200c,0x1053,0x1027,0x05f8,
  0x1a27,0x1133,0x210d,0x11e6,0x0935,0x054b,0x0754,0x02c6,0x0723,0x0852,0x106b,
  0x161f,0x10b1,0x0e81,0x2054,0x156b,0x1113,0x22c5,0x21b7,0x0ac0,0x042b,0x17db,
  0x01b9,0x0ca2,0x055b,0x1a87,0x0d62,0x0a47,0x077f,0x1d25,0x0fb5,0x1f3f,0x04e0,
  0x16c2,0x011d,0x158c,0x209c,0x0d6e,0x18fe,0x05dd,0x1c05,0x123e,0x1bc6,0x0892,
  0x232b,0x1e3f,0x11b6,0x10b6,0x144a,0x203f,0x02ad,0x2237,0x1bb3,0x03eb,0x0bbc,
  0x0311,0x1054,0x011e,0x1712,0x05c2,0x2129,0x0292,0x22d0,0x0e6f,0x1f17,0x2234,
  0x16b6,0x00b5,0x1502,0x0b0e,0x1299,0x2170,0x08c0,0x1bd4,0x1475,0x141b,0x0d00,
  0x2026,0x0318,0x1567,0x0a4e,0x03e9,0x1cdc,0x23a8,0x1d8e,0x0dd8,0x0470,0x0286,
  0x1c22,0x1315,0x1785,0x048f,0x1786,0x1ee0,0x0b37,0x0952,0x02be,0x0873,0x04df,
  0x2101,0x0fcd,0x04b0,0x059d,0x1fcf,0x05e0,0x1c7f,0x0cbe,0x0461,0x024a,0x027c,
  0x05f4,0x092a,0x0dc9,0x01e7,0x1147,0x03b2,0x1ab8,0x0238,0x174c,0x02b2,0x1c6e,
  0x04d8,0x0dbc,0x1ab1,0x17ff,0x1443,0x054f,0x1128,0x0370,0x14cc,0x1f35,0x1173,
  0x0a03,0x1d32,0x12d1,0x02ab,0x09db,0x153d,0x1425,0x122f,0x06bd,0x17b8,0x1579,
  0x0890,0x1b0f,0x1050,0x0ddf,0x23e3,0x1860,0x1203,0x11d5,0x0ebb,0x0a80,0x00b7,
  0x1951,0x15b7,0x1ff3,0x0d14,0x143d,0x164c,0x0e67,0x0c91,0x01f4,0x2243,0x1474,
  0x03a4,0x2147,0x0270,0x10c9,0x116f,0x127d,0x0b1e,0x10fc,0x1a0a,0x1846,0x1f63,
  0x1067,0x0bb3,0x191f,0x0ea6,0x0eef,0x1e29,0x18b9,0x2079,0x090c,0x16fd,0x0eb4,
  0x0bc9,0x2098,0x080a,0x0183,0x1bfe,0x1631,0x0769,0x1dd8,0x142f,0x0f66,0x1316,
  0x02a9,0x22ee,0x1c4f,0x0285,0x1013,0x065d,0x0c2d,0x0466,0x033e,0x00e7,0x1900,
  0x226f,0x1276,0x03ae,0x0ea1,0x23e7,0x174d,0x216c,0x1ca1,0x1a06,0x0665,0x1461,
  0x2260,0x1f7d,0x1156,0x14e8,0x1327,0x0257,0x089a,0x15df,0x16f4,0x0eb9,0x03b3,
  0x0ead,0x0fd9,0x085d,0x1259,0x1ba8,0x1e90,0x114c,0x2236,0x02c7,0x1e53,0x2115,
  0x1d33,0x1ff5,0x1afd,0x185d,0x06ee,0x0dc0,0x078c,0x0af4,0x15d1,0x0030,0x2131,
  0x1eb6,0x06e0,0x06b6,0x038c,0x05a8,0x080c,0x0e98,0x1682,0x1dc0,0x1340,0x13b7,
  0x1c1b,0x0434,0x1ab5,0x1cab,0x1a1c,0x07d0,0x1abb,0x22c1,0x0f08,0x027d,0x1238,
  0x1591,0x07f7,0x0d30,0x13f8,0x1909,0x212b,0x1826,0x0749,0x0d06,0x0d2e,0x104f,
  0x1f39,0x09eb,0x0ef6,0x22e6,0x16f1,0x0aee,0x116b,0x17de,0x0b12,0x0322,0x0bea,
  0x064c,0x03d9,0x2374,0x0ca4,0x1293,0x0e5c,0x04b3,0x03a0,0x13ad,0x0e33,0x0353,
  0x081a,0x0bb2,0x0da3,0x1e01,0x1322,0x0ebe,0x0d0e,0x0dbb,0x11a3,0x1b57,0x16ff,
  0x0298,0x1a8f,0x09ef,0x08ad,0x1877,0x22ac,0x147a,0x1b36,0x095a,0x1b08,0x0455,
  0x10ad,0x0343,0x1b16,0x0cf8,0x082e,0x144d,0x1a37,0x1b5d,0x0702,0x09c4,0x1e16,
  0x157a,0x1965,0x0a63,0x1c6d,0x0d9e,0x0ed8,0x1e57,0x05cc,0x1758,0x008d,0x0bfe,
  0x1168,0x04ed,0x1917,0x2251,0x1074,0x2356,0x1719,0x1d3b,0x1fbe,0x22aa,0x14c8,
  0x211f,0x16d1,0x124b,0x2241,0x1c08,0x0aac,0x0f06,0x12b5,0x01fb,0x1c72,0x0089,
  0x23b3,0x02ba,0x15a5,0x1a00,0x1483,0x13f2,0x2016,0x1aeb,0x2187,0x0bf7,0x07fa,
  0x2005,0x1516,0x13d6,0x0122,0x0420,0x039d,0x0193,0x193b,0x2360,0x0453,0x0a75,
  0x0bd9,0x1197,0x1923,0x1db5,0x2225,0x1194,0x2058,0x0e9f,0x1106,0x06a1,0x02f5,
  0x1b63,0x00ff,0x1f4c,0x2289,0x0ce0,0x1f1d,0x1247,0x19ae,0x1fc0,0x182e,0x05b3,
  0x0db2,0x229c,0x0e3d,0x232d,0x1961,0x1b95,0x0ca9,0x1a9e,0x183f,0x0203,0x1e76,
  0x16bb,0x00b1,0x0a3f,0x237e,0x08a8,0x1b6e,0x0b2b,0x215b,0x119e,0x0945,0x0f86,
  0x0a4b,0x12c7,0x1616,0x046b,0x20a3,0x0454,0x0405,0x0c19,0x1a08,0x1e33,0x10bd,
  0x1861,0x2135,0x0c23,0x0f36,0x0c5c,0x049b,0x032f,0x1a19,0x03dc,0x1e84,0x011c,
  0x1e61,0x096e,0x1f66,0x0798,0x104c,0x1c62,0x1e73,0x03e4,0x0638,0x190d,0x1af6,
  0x17ef,0x10fd,0x1b0d,0x1263,0x1512,0x09a5,0x1439,0x0ef7,0x041d,0x04ba,0x08d4,
  0x1714,0x1b62,0x164f,0x1787,0x114a,0x05b2,0x1812,0x0d33,0x176e,0x1480,0x12fa,
  0x0e61,0x084b,0x0801,0x079a,0x2034,0x154a,0x23bc,0x20a9,0x1985,0x2286,0x148c,
  0x0dc2,0x06d8,0x1d4c,0x183d,0x1a41,0x22dd,0x21f1,0x103c,0x14bc,0x0827,0x0850,
  0x157d,0x02bd,0x03bf,0x00de,0x0c9e,0x1cb7,0x1bf8,0x0805,0x20a8,0x1da1,0x1f50,
  0x1da0,0x0da0,0x068e,0x1979,0x0650,0x1f52,0x2239,0x0594,0x1534,0x1c38,0x0351,
  0x0de3,0x1672,0x21e3,0x10ab,0x11bc,0x1788,0x1547,0x2071,0x07de,0x012f,0x22af,
  0x2377,0x179a,0x12b3,0x0cf3,0x0b92,0x0bb7,0x070f,0x11ca,0x2039,0x0daa,0x1521,
  0x0278,0x0f4d,0x0c87,0x0956,0x0967,0x067e,0x08b0,0x11af,0x051f,0x099e,0x0c78,
  0x0e27,0x19bd,0x1dcc,0x15f1,0x01f5,0x1453,0x043e,0x1e8c,0x018f,0x1b54,0x2166,
  0x1bbc,0x1fe8,0x059a,0x0c6b,0x00c7,0x1e92,0x13de,0x0b3b,0x05e4,0x15ee,0x22a9,
  0x2090,0x2276,0x0631,0x105d,0x2038,0x195a,0x17e5,0x1aff,0x10a8,0x0384,0x0886,
  0x0456,0x1599,0x0b4e,0x1d47,0x1830,0x051e,0x1c3d,0x20e1,0x1895,0x2092,0x10e9,
  0x07c6,0x23bd,0x201a,0x209a,0x04c4,0x0315,0x019b,0x237c,0x047a,0x23fc,0x11a6,
  0x195f,0x2006,0x1328,0x1cce,0x1dea,0x0970,0x0067,0x058d,0x1934,0x2120,0x01c5,
  0x2263,0x04fd,0x1ae1,0x125e,0x1ca0,0x19bc,0x226e,0x0734,0x0bb8,0x0a54,0x19fe,
  0x0e85,0x1fc6,0x0224,0x171c,0x1ffb,0x1115,0x0524,0x133e,0x0edd,0x2280,0x1d2f,
  0x0200,0x0cb3,0x23fe,0x0f19,0x1569,0x1537,0x19c2,0x08dc,0x1f6d,0x068d,0x10f4,
  0x055a,0x1e30,0x21f0,0x1cf5,0x0d35,0x04a6,0x139d,0x23d3,0x0a8d,0x1d3d,0x0763,
  0x0575,0x1511,0x1676,0x1304,0x0e13,0x10cd,0x0e55,0x199e,0x236e,0x1257,0x2288,
  0x13e5,0x0037,0x1d04,0x04ef,0x100e,0x0fae,0x1e9e,0x067a,0x2320,0x0539,0x21d8,
  0x07c4,0x045f,0x1d0b,0x1196,0x020e,0x1b68,0x04b5,0x031c,0x00fd,0x1184,0x0f7c,
  0x166c,0x23d2,0x0c9f,0x2380,0x0b78,0x0f14,0x18f0,0x05ad,0x0252,0x138a,0x13fa,
  0x1a93,0x1f01,0x126a,0x1d6a,0x11d9,0x182f,0x1492,0x1822,0x0d54,0x16e2,0x05d1,
  0x1155,0x0c4a,0x1f58,0x00a3,0x17e0,0x0cd6,0x1d43,0x0250,0x16f3,0x0cfb,0x0c29,
  0x0b86,0x11a4,0x1ed7,0x14fc,0x10d8,0x0f59,0x2338,0x1c5a,0x0f42,0x142d,0x12fd,
  0x2373,0x11ce,0x0800,0x23e0,0x2025,0x0ffd,0x0a99,0x2264,0x1ff7,0x04a9,0x1a67,
  0x1ed4,0x0be2,0x21f3,0x1df4,0x1927,0x04a4,0x1c84,0x0b09,0x11b9,0x21a0,0x1d7b,
  0x1ef7,0x006f,0x18c6,0x1478,0x0985,0x1e23,0x0039,0x1ebc,0x13d2,0x0391,0x039c,
  0x0118,0x1061,0x21c8,0x1a40,0x1eaa,0x175b,0x036c,0x204f,0x19ba,0x1f91,0x193a,
  0x197b,0x0f24,0x176f,0x1592,0x0854,0x0804,0x0fd4,0x0a2b,0x16fe,0x0d64,0x0587,
  0x1f00,0x1539,0x203c,0x1e54,0x01b4,0x02e6,0x1b11,0x0a98,0x157c,0x1868,0x0786,
  0x15c8,0x083c,0x0f84,0x1209,0x0b47,0x0f1c,0x0d77,0x188c,0x06c7,0x0521,0x203e,
  0x1921,0x0996,0x2020,0x1e5d,0x12ce,0x0940,0x0309,0x1991,0x12a7,0x1e77,0x0830,
  0x1b94,0x1c73,0x02c4,0x1d86,0x0f0f,0x192b,0x0bfc,0x1451,0x1969,0x09f1,0x010c,
  0x1865,0x09c6,0x1ae8,0x17b7,0x21f8,0x14a1,0x21f6,0x07d7,0x0c36,0x1cb4,0x1883,
  0x1655,0x1ddf,0x0863,0x00f0,0x0961,0x0687,0x1070,0x0fe5,0x072f,0x0bc2,0x08c8,
  0x1aaa,0x0645,0x09cf,0x0fa8,0x2130,0x23cf,0x2246,0x1990,0x1744,0x0d4b,0x0090,
  0x143f,0x166f,0x1de5,0x0331,0x09cd,0x1447,0x1ceb,0x0d3b,0x0ccd,0x2159,0x0f78,
  0x0251,0x068f,0x07bb,0x0877,0x1a2a,0x0700,0x23c2,0x08a2,0x1c98,0x1427,0x0e79,
  0x15ac,0x0f8b,0x153a,0x0aec,0x0dec,0x03ee,0x1ae2,0x1f6b,0x13f4,0x1efa,0x172f,
  0x1c87,0x1b3f,0x192a,0x1c53,0x1bb1,0x0297,0x0772,0x1385,0x173d,0x0707,0x17bd,
  0x007d,0x1a07,0x08c6,0x1d6f,0x09d8,0x1850,0x1c8b,0x180d,0x1cb1,0x148a,0x0492,
  0x0847,0x0d78,0x0def,0x0e7e,0x1d3a,0x0e91,0x1888,0x1c59,0x1ae7,0x1fc1,0x154c,
  0x058c,0x0078,0x22ba,0x225b,0x0f5e,0x1a4c,0x0d3e,0x195d,0x06df,0x02a7,0x14e5,
  0x0cfc,0x16ee,0x0f7d,0x0321,0x178a,0x1097,0x0e0b,0x1479,0x079d,0x1c5b,0x1208,
  0x0b1f,0x0d7c,0x1963,0x0835,0x1c99,0x2226,0x1417,0x045e,0x18e0,0x0051,0x1243,
  0x181e,0x0659,0x172a,0x1373,0x1abd,0x1f0c,0x1749,0x113a,0x06ed,0x09a6,0x027f,
  0x015d,0x1084,0x022e,0x1a5b,0x1685,0x1d1b,0x0054,0x0fb3,0x20cc,0x23a9,0x220b,
  0x045a,0x1b24,0x2145,0x148b,0x18ec,0x16bc,0x0b9b,0x120c,0x18b0,0x02e3,0x1a1d,
  0x0be7,0x133d,0x0de1,0x21d4,0x0357,0x1715,0x20a2,0x0a18,0x239d,0x22d6,0x0cd5,
  0x1942,0x16e9,0x0e54,0x1007,0x069d,0x1cb8,0x12dc,0x0381,0x0c93,0x1eff,0x04e4,
  0x1c25,0x1fe7,0x20c1,0x0412,0x0215,0x1594,0x1bc5,0x217e,0x221c,0x173a,0x1f19,
  0x1183,0x0765,0x20f8,0x05f2,0x130a,0x036d,0x012e,0x06ea,0x0b3c,0x1c42,0x1f43,
  0x0a95,0x1b8c,0x1f36,0x0622,0x04da,0x2070,0x089e,0x04d4,0x184e,0x1520,0x1cc8,
  0x127b,0x1302,0x13d0,0x0626,0x0429,0x004a,0x18c0,0x2144,0x0a34,0x1aea,0x1212,
  0x12a2,0x06d2,0x0751,0x1d2b,0x104a,0x133a,0x1e80,0x12f6,0x1c9e,0x1460,0x13ba,
  0x16d9,0x1648,0x1e3a,0x1b29,0x0592,0x11ba,0x1d0e,0x0153,0x0adb,0x15c3,0x1507,
  0x17fc,0x122c,0x14d7,0x21ad,0x1a53,0x14f2,0x16dc,0x20f1,0x118e,0x1aab,0x04eb,
  0x0606,0x0d05,0x170e,0x05d9,0x0a83,0x10f7,0x070b,0x04f8,0x0b27,0x2224,0x0f97,
  0x075e,0x180e,0x2194,0x010e,0x0b57,0x1a80,0x1610,0x1b19,0x1bac,0x0b30,0x0376,
  0x1697,0x0668,0x00ec,0x1256,0x1f74,0x110d,0x0807,0x03d1,0x1326,0x0577,0x067c,
  0x1e5c,0x1d6d,0x06f1,0x075c,0x0394,0x0184,0x1e7e,0x12f1,0x0216,0x0990,0x208d,
  0x1332,0x1044,0x0ef8,0x0f70,0x075d,0x042c,0x030e,0x17cb,0x0aa3,0x04b2,0x1a63,
  0x04fe,0x097e,0x213d,0x11df,0x166b,0x0a2e,0x0664,0x0c75,0x21a3,0x102d,0x1f32,
  0x1d42,0x0a65,0x14bf,0x0b11,0x22b9,0x08ac,0x1394,0x11b7,0x1fae,0x1ccd,0x1a05,
  0x177d,0x0d81,0x1e85,0x0d88,0x0a5e,0x0330,0x0ec4,0x13d9,0x1583,0x1ca6,0x2126,
  0x0f99,0x158f,0x00f9,0x0176,0x1528,0x1c2b,0x1d69,0x049f,0x0418,0x18b4,0x1acb,
  0x236f,0x04c5,0x0705,0x0031,0x20b9,0x15b2,0x1fd4,0x18fc,0x1a6e,0x21b1,0x0dea,
  0x0432,0x1f1b,0x0cb7,0x2011,0x07cc,0x21fd,0x1216,0x1f51,0x21ab,0x0974,0x0833,
  0x06f8,0x1935,0x10b4,0x0164,0x1421,0x1a4d,0x1824,0x07db,0x1551,0x0e53,0x152d,
  0x23ce,0x0dfe,0x0d51,0x1a6a,0x1e3c,0x20b4,0x1baa,0x0c62,0x0973,0x01e4,0x0035,
  0x01d7,0x0496,0x1a73,0x1435,0x2290,0x22f4,0x1e71,0x0f7b,0x066d,0x0874,0x0db5,
  0x0f1a,0x0f2d,0x218f,0x17ae,0x0170,0x1bea,0x1908,0x204a,0x0728,0x0746,0x18b8,
  0x0242,0x0f17,0x1f8a,0x0b10,0x0966,0x1dd5,0x0174,0x07ae,0x1485,0x146c,0x0975,
  0x1556,0x1783,0x2021,0x21e7,0x06db,0x227d,0x19e7,0x22dc,0x2297,0x1fd1,0x1a26,
  0x07cd,0x233d,0x1b84,0x1e18,0x21ce,0x0ee4,0x2255,0x0862,0x1887,0x057a,0x20c9,
  0x17f4,0x1bdd,0x2284,0x1817,0x0929,0x0079,0x18f3,0x0e14,0x1131,0x16b8,0x144e,
  0x120e,0x16bf,0x058b,0x1c9b,0x05d4,0x0e7b,0x07d3,0x1d27,0x1051,0x1e12,0x2157,
  0x0a89,0x03e0,0x0dc8,0x219b,0x0495,0x04c0,0x090e,0x1914,0x1a13,0x05c4,0x1c0d,
  0x0564,0x178c,0x2069,0x0291,0x08b5,0x0138,0x1224,0x14c6,0x14c1,0x1ac7,0x0689,
  0x1e72,0x1751,0x1e0c,0x2270,0x080d,0x1c00,0x03ad,0x1ef8,0x15c9,0x0f28,0x0e40,
  0x0f9e,0x0344,0x1d58,0x11f5,0x1eac,0x17a7,0x188d,0x05ba,0x1472,0x154e,0x0017,
  0x05c7,0x1acd,0x2370,0x1140,0x2230,0x0f2e,0x1eb2,0x1ca5,0x1b5e,0x1633,0x09b5,
  0x08b1,0x1b3e,0x0cfe,0x02ed,0x1cec,0x020f,0x2103,0x13ed,0x0c99,0x07e3,0x00d9,
  0x1342,0x2179,0x03aa,0x13f5,0x124c,0x1eab,0x15ba,0x0f41,0x02f6,0x1652,0x057e,
  0x0157,0x0be6,0x09ab,0x148d,0x072a,0x1071,0x09b0,0x0500,0x1b65,0x0a6a,0x13a0,
  0x0f65,0x21be,0x01ff,0x19b3,0x1cba,0x109f,0x1ef0,0x0517,0x0307,0x18ac,0x0fd5,
  0x1fef,0x0f16,0x197e,0x1291,0x078a,0x1657,0x13c1,0x0e7a,0x1466,0x07be,0x164e,
  0x0419,0x2158,0x0fc4,0x0e7d,0x18d9,0x0942,0x0aef,0x163e,0x2200,0x226d,0x037a,
  0x1b66,0x0caf,0x07fb,0x0cec,0x0d4a,0x0cb6,0x000e,0x1ade,0x1bd5,0x1892,0x15a1,
  0x1dd1,0x1dbc,0x01ee,0x12e0,0x0671,0x0abb,0x1e0e,0x189f,0x1d9d,0x0df2,0x0008,
  0x13cb,0x11b8,0x0571,0x00ba,0x0ac3,0x1568,0x070a,0x21b0,0x16ea,0x1000,0x10bf,
  0x0c8c,0x0ae5,0x186b,0x1366,0x12df,0x2156,0x0c82,0x05cd,0x0b25,0x08ca,0x1695,
  0x0fce,0x055f,0x0d37,0x1748,0x13db,0x1e43,0x03e7,0x0d8e,0x095e,0x0af1,0x0103,
  0x02f4,0x02f8,0x01f6,0x07fd,0x095f,0x1376,0x1643,0x1350,0x1372,0x06e3,0x14d5,
  0x0870,0x15d9,0x20cd,0x128d,0x1878,0x0fc1,0x0907,0x127c,0x0a2c,0x0041,0x03f4,
  0x116c,0x02b1,0x1cea,0x1a18,0x00fb,0x08de,0x0660,0x06aa,0x23d1,0x0092,0x230c,
  0x0d91,0x14a3,0x0478,0x0ff7,0x1af1,0x001a,0x0e69,0x1f5c,0x162c,0x19f8,0x141a,
  0x1fe6,0x100f,0x047f,0x1daf,0x231e,0x236c,0x1725,0x108e,0x0290,0x1006,0x0e74,
  0x1c0a,0x1e35,0x1b90,0x05a7,0x1c21,0x0f1f,0x0514,0x1937,0x22a6,0x0b4a,0x1a3a,
  0x1217,0x0e50,0x078d,0x2198,0x1b3b,0x1a44,0x0bab,0x2268,0x16d5,0x03f3,0x06d0,
  0x0523,0x1d45,0x18db,0x0ba7,0x1dba,0x0776,0x1cfa,0x1e13,0x0271,0x200a,0x0d9b,
  0x0c4b,0x0588,0x0593,0x18e4,0x082a,0x0533,0x1988,0x0317,0x1848,0x0dab,0x2177,
  0x1945,0x126b,0x0842,0x07b9,0x1de1,0x06f3,0x224e,0x0af0,0x0026,0x0240,0x010f,
  0x18e7,0x0e51,0x0947,0x1c35,0x1f28,0x1688,0x07a9,0x1759,0x1608,0x1437,0x0b39,
  0x2009,0x0389,0x0858,0x15be,0x08a9,0x22d4,0x0eae,0x015f,0x0337,0x034d,0x23d9,
  0x081d,0x1d74,0x0c26,0x1bd9,0x0651,0x1f7b,0x2008,0x16b5,0x23a2,0x05e1,0x1325,
  0x1e20,0x225f,0x0ded,0x101a,0x1254,0x00a8,0x1f1c,0x1f26,0x1c8c,0x0563,0x12d2,
  0x0821,0x2160,0x115d,0x11ee,0x0232,0x192e,0x1bdf,0x05f3,0x0e57,0x11f3,0x044e,
  0x20b5,0x1bde,0x0f25,0x0dbe,0x1361,0x1971,0x17e7,0x0c46,0x16fc,0x1b2e,0x18cb,
  0x23c4,0x1912,0x214c,0x0ba4,0x2392,0x1037,0x1666,0x0bbb,0x180b,0x041f,0x20fa,
  0x1577,0x18d7,0x0115,0x0904,0x136e,0x1867,0x0f53,0x0e2b,0x1a02,0x1fb2,0x1a9a,
  0x1d6c,0x0eba,0x0bd5,0x09f8,0x083f,0x0227,0x0e89,0x1495,0x1033,0x0f07,0x0d4d,
  0x0b4d,0x0f6a,0x07fe,0x1afb,0x05b0,0x1205,0x06ce,0x02d6,0x09df,0x1a0c,0x0c3e,
  0x22c9,0x22e5,0x0feb,0x0a0e,0x21e6,0x088a,0x1c64,0x10b8,0x0383,0x14f8,0x0ed4,
  0x05b4,0x2188,0x226b,0x025c,0x020d,0x0d0c,0x0449,0x0c81,0x0965,0x1135,0x0cc1,
  0x08fc,0x16e4,0x1ed1,0x1bbd,0x1be3,0x06d9,0x00a2,0x04c3,0x0cbf,0x1324,0x2235,
  0x116a,0x0789,0x0198,0x05c3,0x1181,0x106c,0x1c8f,0x0984,0x1a71,0x05f9,0x1f61,
  0x1298,0x2310,0x0075,0x063b,0x0b71,0x10c8,0x1e6d,0x08a3,0x045c,0x1157,0x1dce,
  0x0a05,0x1aac,0x03f5,0x0dd1,0x2137,0x1200,0x0cc4,0x17da,0x1df7,0x06c5,0x1c07,
  0x1b59,0x1ad8,0x0c43,0x15a0,0x0ef0,0x0243,0x1bda,0x1338,0x0c2f,0x132e,0x1d63,
  0x0969,0x23f3,0x077e,0x0991,0x1dbe,0x23c7,0x05a3,0x1253,0x1fb8,0x1bce,0x053b,
  0x1b8f,0x00e3,0x20e2,0x1b61,0x22ce,0x04e8,0x17e1,0x06a3,0x04d1,0x02d3,0x23b1,
  0x031a,0x2045,0x1319,0x1e7f,0x20ca,0x21e9,0x0c50,0x1e8d,0x209b,0x2306,0x0a1d,
  0x044b,0x08a1,0x0437,0x102c,0x11f0,0x159b,0x0913,0x0a08,0x1e36,0x128f,0x06fa,
  0x0df0,0x160b,0x1f2e,0x094c,0x0788,0x1309,0x1cd4,0x0599,0x179f,0x0f54,0x1362,
  0x1763,0x1b6c,0x0302,0x0921,0x231d,0x13f1,0x09c3,0x1348,0x12e1,0x00fa,0x1689,
  0x16be,0x18ab,0x1604,0x19f1,0x21ba,0x0d6a,0x20fc,0x21d2,0x21ed,0x0663,0x0421,
  0x0d92,0x061a,0x165f,0x1d92,0x152e,0x070c,0x12a8,0x1c90,0x0951,0x0ce5,0x1d39,
  0x0b75,0x168b,0x0a61,0x23b4,0x1572,0x1e06,0x1af9,0x0f5a,0x00cc,0x2139,0x0114,
  0x18fa,0x1654,0x18a9,0x0b13,0x0af8,0x14e4,0x051c,0x098a,0x1c9c,0x0554,0x1bbe,
  0x0de5,0x198e,0x1bbb,0x0bcd,0x0511,0x0e22,0x1d95,0x0c11,0x14e2,0x0108,0x1a56,
  0x0401,0x11b0,0x00c6,0x2165,0x0f64,0x17bf,0x0154,0x0b95,0x14a5,0x0cc8,0x1b8e,
  0x1d7a,0x024f,0x1762,0x1f71,0x1501,0x1844,0x15c2,0x010d,0x1092,0x0060,0x00af,
  0x154d,0x0da5,0x0db8,0x196e,0x1ee5,0x035e,0x05d3,0x00fc,0x0bcb,0x0364,0x0cab,
  0x16a3,0x23a7,0x014b,0x1536,0x0550,0x0407,0x127a,0x0a9e,0x1d64,0x0fd8,0x14d2,
  0x0701,0x17dc,0x0bc0,0x1ba7,0x2141,0x0cff,0x1b31,0x0205,0x22a7,0x0c5e,0x1a09,
  0x11de,0x13ce,0x08f3,0x208f,0x0015,0x2037,0x0aaf,0x057d,0x0087,0x0afb,0x1a85,
  0x1a97,0x0fd7,0x12d9,0x1fed,0x1de2,0x197f,0x22b1,0x205a,0x0544,0x0ad0,0x01df,
  0x1e64,0x0aeb,0x12a6,0x0f30,0x07f1,0x1bf0,0x230a,0x0573,0x0f61,0x2386,0x1242,
  0x1c55,0x0da4,0x0f43,0x22ae,0x0cc6,0x1bb5,0x0cdc,0x16a0,0x02fe,0x053f,0x008c,
  0x18e8,0x02ce,0x0c17,0x1b71,0x1494,0x15f0,0x0d5b,0x089c,0x0f21,0x0a87,0x10cb,
  0x1eeb,0x1a2d,0x1f38,0x0508,0x1c13,0x09d6,0x1b83,0x03c7,0x177b,0x0ba0,0x0760,
  0x00a7,0x07b8,0x0f3f,0x0070,0x163b,0x0718,0x1609,0x2313,0x1058,0x10a1,0x0da2,
  0x1bd8,0x19d3,0x203d,0x09aa,0x0f0c,0x0a4d,0x22ad,0x0e9b,0x07a8,0x14f1,0x1056,
  0x1e74,0x0402,0x0d40,0x0d6c,0x021e,0x1756,0x0056,0x0eb1,0x0e1c,0x0206,0x0c94,
  0x2326,0x1f31,0x23cd,0x1bbf,0x0bb6,0x0607,0x0e0e,0x13b9,0x1724,0x03f1,0x1bcc,
  0x01f1,0x1624,0x129f,0x1a6d,0x22e0,0x1132,0x1ae5,0x1b69,0x00f1,0x225e,0x1e28,
  0x05ea,0x0f8e,0x024b,0x108f,0x0a3e,0x135d,0x0c73,0x18d3,0x1bdc,0x1e8b,0x0baa,
  0x1d09,0x0305,0x22e2,0x1d7d,0x012b,0x2164,0x156f,0x0069,0x1333,0x206d,0x04f2,
  0x1982,0x141d,0x023d,0x0144,0x1ea0,0x2378,0x1486,0x0ec5,0x1677,0x0770,0x06b4,
  0x04f6,0x09bc,0x1704,0x1def,0x1faf,0x22d5,0x1a34,0x21c0,0x099d,0x1bd7,0x1c47,
  0x1a4b,0x195e,0x0569,0x10e5,0x0bae,0x01a4,0x220c,0x0bb9,0x1700
};

/*----------------------------------------------------------------------------*/

typedef struct _meko_cell_t meko_cell_t;
struct _meko_cell_t {
  gint    n;
  gushort key;
};

static meko_cell_t *meko_table;
static gint         meko_width;
static gint         meko_height;

/*----------------------------------------------------------------------------*/

static int
meko_compare ( const void *x,
	       const void *y )
{
  return (int)((((meko_cell_t*)x)->key)-(((meko_cell_t*)y)->key));
}

/*----------------------------------------------------------------------------*/

static void
meko_init ( gint width,
	    gint height )
{
  gint i;

  meko_table = (meko_cell_t*)g_malloc( sizeof(meko_cell_t) * width * height );
  meko_width  = width;
  meko_height = height;
  for( i = 0; i < width * height; i++ ){
    meko_table[i].n   = i;
    meko_table[i].key = meko_key[i];
  }
  qsort( meko_table, width * height, sizeof(meko_cell_t), meko_compare );
}

/*----------------------------------------------------------------------------*/

static void
meko_free ( void )
{
  g_free( meko_table );
}

/*----------------------------------------------------------------------------*/

static void
meko_transform ( gint  x1,
		 gint  y1,
		 gint *x2,
		 gint *y2 )
{
  div_t d;

  d = div( meko_table[y1*meko_width+x1].n, meko_width );
  *x2 = d.rem;
  *y2 = d.quot;
}

/******************************************************************************/
