/****************************************************************************** gimpmask.c -- "GIMP MASK", A Masking Plug-In for GIMP Copyright (c) 1998 Hirotsuna Mizuno 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 . 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 #include #include #include #include #include #include #define PROCEDURE_NAME "plug_in_gimpmask" #define PLUG_IN_MENU "/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 ", "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, ¶meters ); break; case GIMP_RUN_INTERACTIVE: gimp_get_data( PROCEDURE_NAME, ¶meters ); cp_code_get( image_ID ); if( dialog_show(gimp_drawable_bpp(drawable->drawable_id) < 3 ? 1 : 3) ){ gimp_set_data( PROCEDURE_NAME, ¶meters, 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; } /******************************************************************************/