From abd20a73b4733a1a8b845f6ff0817ed77e545173 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Tue, 10 Mar 2020 10:48:58 +0100 Subject: Freed multiple leaks --- src/ft_exit.c | 4 ++++ src/ft_init_lists.c | 2 ++ src/ft_init_s_ray.c | 2 ++ src/ft_raycasting.c | 14 ++++++-------- src/ft_save_to_bmp.c | 7 ++++--- src/ft_warp_level.c | 9 ++++++--- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/ft_exit.c b/src/ft_exit.c index 97c9e02..fb6de09 100644 --- a/src/ft_exit.c +++ b/src/ft_exit.c @@ -57,6 +57,10 @@ static void mlx_destroy_image(clist->wlist.wlx, clist->tlist[4].img); if (clist->mlist.isnlvl && clist->tlist[5].img) mlx_destroy_image(clist->wlist.wlx, clist->tlist[5].img); + if (clist->mlist.isftex && clist->tlist[6].img) + mlx_destroy_image(clist->wlist.wlx, clist->tlist[6].img); + if (clist->mlist.isctex && clist->tlist[7].img) + mlx_destroy_image(clist->wlist.wlx, clist->tlist[7].img); } int diff --git a/src/ft_init_lists.c b/src/ft_init_lists.c index bd2ae74..82f5c0e 100644 --- a/src/ft_init_lists.c +++ b/src/ft_init_lists.c @@ -76,6 +76,8 @@ static int8_t cl->f_rgb = ft_init_rgb(); cl->c_rgb = ft_init_rgb(); cl->rlist = ft_init_s_ray(); + if (!(cl->rlist.wall_dist_tab = (float*)malloc(1 * sizeof(float)))) + return (-1); cl->currlvl = 0; cl->walltexgood = 0; ft_init_funptr(cl); diff --git a/src/ft_init_s_ray.c b/src/ft_init_s_ray.c index e890d68..0d4ba96 100644 --- a/src/ft_init_s_ray.c +++ b/src/ft_init_s_ray.c @@ -11,6 +11,8 @@ /* ************************************************************************** */ #include +#include +#include t_ray ft_init_s_ray(void) diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 3cbd368..baa71af 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -83,17 +83,16 @@ static void void ft_castray(t_cub *cl) { - uint16_t i; - t_win *wl; - float *dist_tab; + uint16_t i; + t_win *wl; + ft_memdel((void**)&cl->rlist.wall_dist_tab); wl = &cl->wlist; i = (wl->y_size / 2) + 1; while (++i < wl->y_size) ft_floor_cast(i, cl); - if (!(dist_tab = malloc(sizeof(float) * cl->wlist.x_size))) - return ; - if (!(cl->rlist.wall_dist_tab = malloc(sizeof(float) * cl->wlist.x_size))) + if (!(cl->rlist.wall_dist_tab = + (float*)malloc(sizeof(float) * cl->wlist.x_size))) return ; i = 0; while (i < wl->x_size) @@ -102,8 +101,7 @@ void ft_choose_tex(cl); ft_calc_tex(cl); ft_draw_verline(cl, i, cl->rlist.wall_t, cl->rlist.wall_b); - dist_tab[i] = cl->rlist.wall_dist; - cl->rlist.wall_dist_tab = dist_tab; + cl->rlist.wall_dist_tab[i] = cl->rlist.wall_dist; i++; } } diff --git a/src/ft_save_to_bmp.c b/src/ft_save_to_bmp.c index 90bbb1f..ae3a2b6 100644 --- a/src/ft_save_to_bmp.c +++ b/src/ft_save_to_bmp.c @@ -93,9 +93,10 @@ static int8_t bmp_info.size_image = size; if (!(fd = open(fname, O_RDWR | O_CREAT, 0644))) return (-1); - write(fd, &bmp_file, sizeof(t_bmp_file)); - write(fd, &bmp_info, sizeof(t_bmp_info)); - write(fd, bmp, size); + if (!write(fd, &bmp_file, sizeof(t_bmp_file)) || + !write(fd, &bmp_info, sizeof(t_bmp_info)) || + !write(fd, bmp, size)) + return (-1); close(fd); return (0); } diff --git a/src/ft_warp_level.c b/src/ft_warp_level.c index 4a02c2b..1f744c2 100644 --- a/src/ft_warp_level.c +++ b/src/ft_warp_level.c @@ -59,13 +59,16 @@ static void cl->f_rgb = ft_init_rgb(); cl->c_rgb = ft_init_rgb(); cl->rlist = ft_init_s_ray(); - i = 0; - while (i <= 5) + i = -1; + while (++i <= 5) { mlx_destroy_image(cl->wlist.wlx, cl->tlist[i].img); cl->tlist[i].img = NULL; - i++; } + if (cl->mlist.isftex && cl->tlist[6].img) + mlx_destroy_image(cl->wlist.wlx, cl->tlist[6].img); + if (cl->mlist.isctex && cl->tlist[7].img) + mlx_destroy_image(cl->wlist.wlx, cl->tlist[7].img); } static void -- cgit v1.2.3 From 25247ca1f3ffc9485b02686f616c41a52f8eb82a Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 00:00:07 +0100 Subject: Pas trop ecole opti memoire mais ok --- inc/cub3d.h | 2 +- inc/cub3d_structs.h | 1 + map/map_five.cub | 3 +-- src/ft_floor_cast.c | 46 +++++++++++++++++++++++++++------------------- src/ft_raycasting.c | 16 ++++++++++------ 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/inc/cub3d.h b/inc/cub3d.h index 7de1df7..2a9d66e 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -130,7 +130,7 @@ uint8_t ft_use_args(int argc, const char *argv[], void ft_castray(t_cub *cl); void ft_detect(t_cub *cl); -void ft_floor_cast(uint16_t y, t_cub *cl); +void ft_floor_cast(t_cub *cl); /* ** ====== OTHER ====== diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index f1dfdfc..144de6f 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -137,6 +137,7 @@ typedef struct s_ray float y_delta_dist; int16_t wall_t; int16_t wall_b; + int16_t *wall_bz; uint8_t side; size_t sqx; size_t sqy; diff --git a/map/map_five.cub b/map/map_five.cub index 3c6bc4a..d5c3361 100644 --- a/map/map_five.cub +++ b/map/map_five.cub @@ -8,11 +8,10 @@ S ./media/img/crapaud.xpm F ./media/img/terre.xpm C 225,30,0 -SB ./media/img/normal_sky.xpm LT ./media/img/linuz.xpm L ./map/map_two.cub -SH 5 +SH 4 1111111111111111111111111111111 1000000000110000000000000000001 diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index 384f699..d2c6046 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -78,8 +78,6 @@ static void { ft_set_tex_xy(7, rl, cl); } - rl->x_floor += cl->mlist.x_floor_step; - rl->y_floor += cl->mlist.y_floor_step; if (cl->mlist.isftex) ft_draw_extra_tex(6, y, x, cl); else @@ -91,28 +89,38 @@ static void } void - ft_floor_cast(uint16_t y, t_cub *cl) + ft_floor_cast(t_cub *cl) { t_ray *rl; uint16_t x; + uint16_t y; rl = &cl->rlist; - rl->x_f_ray_dir = cl->plist.dir_x - cl->plist.plane_x; - rl->y_f_ray_dir = cl->plist.dir_y - cl->plist.plane_y; - rl->x_f_ray_dir_bis = cl->plist.dir_x + cl->plist.plane_x; - rl->y_f_ray_dir_bis = cl->plist.dir_y + cl->plist.plane_y; - rl->p = y - cl->wlist.y_size / 2; - cl->plist.pos_z = 0.5 * cl->wlist.y_size; - rl->row_dist = cl->plist.pos_z / rl->p; - cl->mlist.x_floor_step = rl->row_dist * - (rl->x_f_ray_dir_bis - rl->x_f_ray_dir) / cl->wlist.x_size; - cl->mlist.y_floor_step = rl->row_dist * - (rl->y_f_ray_dir_bis - rl->y_f_ray_dir) / cl->wlist.x_size; - rl->x_floor = cl->plist.pos_y + rl->row_dist * rl->x_f_ray_dir; - rl->y_floor = cl->plist.pos_x + rl->row_dist * rl->y_f_ray_dir; - x = 0; - while (++x < cl->wlist.x_size) + y = (cl->wlist.y_size / 2) + 1; + while (++y < cl->wlist.y_size) { - ft_floor_cast_loop(y, x, rl, cl); + rl->x_f_ray_dir = cl->plist.dir_x - cl->plist.plane_x; + rl->y_f_ray_dir = cl->plist.dir_y - cl->plist.plane_y; + rl->x_f_ray_dir_bis = cl->plist.dir_x + cl->plist.plane_x; + rl->y_f_ray_dir_bis = cl->plist.dir_y + cl->plist.plane_y; + rl->p = y - cl->wlist.y_size / 2; + cl->plist.pos_z = 0.5 * cl->wlist.y_size; + rl->row_dist = cl->plist.pos_z / rl->p; + cl->mlist.x_floor_step = rl->row_dist * + (rl->x_f_ray_dir_bis - rl->x_f_ray_dir) / cl->wlist.x_size; + cl->mlist.y_floor_step = rl->row_dist * + (rl->y_f_ray_dir_bis - rl->y_f_ray_dir) / cl->wlist.x_size; + rl->x_floor = cl->plist.pos_y + rl->row_dist * rl->x_f_ray_dir; + rl->y_floor = cl->plist.pos_x + rl->row_dist * rl->y_f_ray_dir; + x = -1; + while (++x < cl->wlist.x_size) + { + if (cl->rlist.wall_bz[x] <= y) + { + ft_floor_cast_loop(y, x, rl, cl); + } + rl->x_floor += cl->mlist.x_floor_step; + rl->y_floor += cl->mlist.y_floor_step; + } } } diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index baa71af..5c57044 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -76,24 +76,25 @@ static void if (cl->rlist.wall_t < 0) cl->rlist.wall_t = 0; cl->rlist.wall_b = cl->rlist.line_h / 2 + wl->y_size / 2; - if (cl->rlist.wall_b >= (float)wl->y_size) + if (cl->rlist.wall_b >= (int16_t)wl->y_size) cl->rlist.wall_b = wl->y_size - 1; + cl->rlist.wall_bz[i] = cl->rlist.wall_b; } void ft_castray(t_cub *cl) { - uint16_t i; - t_win *wl; + uint16_t i; + t_win *wl; ft_memdel((void**)&cl->rlist.wall_dist_tab); wl = &cl->wlist; - i = (wl->y_size / 2) + 1; - while (++i < wl->y_size) - ft_floor_cast(i, cl); if (!(cl->rlist.wall_dist_tab = (float*)malloc(sizeof(float) * cl->wlist.x_size))) return ; + if (!(cl->rlist.wall_bz = + (int16_t*)malloc(cl->wlist.x_size * sizeof(int16_t)))) + return ; i = 0; while (i < wl->x_size) { @@ -104,4 +105,7 @@ void cl->rlist.wall_dist_tab[i] = cl->rlist.wall_dist; i++; } + ft_floor_cast(cl); + i = 0; + ft_memdel((void**)&cl->rlist.wall_bz); } -- cgit v1.2.3 From ac3c64f5438770e351ea6af693db76e51671e5b3 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 00:16:16 +0100 Subject: qwe --- src/ft_floor_cast.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index 384f699..a7e3de2 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -16,16 +16,8 @@ static void ft_draw_plain_horizontal(t_rgb rgb, t_cub *cl, int32_t y, int32_t x) { - if (cl->mlist.darklvl > 0) - { - *(int*)(cl->img.ptr + + *(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline))) = ft_darken(rgb, cl); - } - else - { - *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(rgb); - } } static void -- cgit v1.2.3 From 02433637a499cd48e501d89c54e6ddf488dca98f Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 00:27:19 +0100 Subject: qweqwe --- src/ft_floor_cast.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index d2c6046..1082fe5 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -16,16 +16,8 @@ static void ft_draw_plain_horizontal(t_rgb rgb, t_cub *cl, int32_t y, int32_t x) { - if (cl->mlist.darklvl > 0) - { - *(int*)(cl->img.ptr + + *(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline))) = ft_darken(rgb, cl); - } - else - { - *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(rgb); - } } static void -- cgit v1.2.3 From 7f39d8337453dc905ddb4d42731bcfbf1b6b1968 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 00:28:37 +0100 Subject: Resized map --- map/lvl_one.cub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map/lvl_one.cub b/map/lvl_one.cub index 8eec433..8e5deac 100644 --- a/map/lvl_one.cub +++ b/map/lvl_one.cub @@ -1,4 +1,4 @@ -R 1800 1100 +R 1500 900 NO ./media/img/BRIQUASSE_3.xpm SO ./media/img/BRIQUASSE_3.xpm -- cgit v1.2.3 From 1bfb92324f267291f556cb464ea42a07d3c8224a Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 00:36:54 +0100 Subject: Freed leaks --- map/lvl_one.cub | 2 +- src/ft_init_lists.c | 2 -- src/ft_raycasting.c | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/map/lvl_one.cub b/map/lvl_one.cub index 8e5deac..2c52287 100644 --- a/map/lvl_one.cub +++ b/map/lvl_one.cub @@ -1,4 +1,4 @@ -R 1500 900 +R 1440 1000 NO ./media/img/BRIQUASSE_3.xpm SO ./media/img/BRIQUASSE_3.xpm diff --git a/src/ft_init_lists.c b/src/ft_init_lists.c index 82f5c0e..bd2ae74 100644 --- a/src/ft_init_lists.c +++ b/src/ft_init_lists.c @@ -76,8 +76,6 @@ static int8_t cl->f_rgb = ft_init_rgb(); cl->c_rgb = ft_init_rgb(); cl->rlist = ft_init_s_ray(); - if (!(cl->rlist.wall_dist_tab = (float*)malloc(1 * sizeof(float)))) - return (-1); cl->currlvl = 0; cl->walltexgood = 0; ft_init_funptr(cl); diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 5c57044..221c43d 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -87,7 +87,6 @@ void uint16_t i; t_win *wl; - ft_memdel((void**)&cl->rlist.wall_dist_tab); wl = &cl->wlist; if (!(cl->rlist.wall_dist_tab = (float*)malloc(sizeof(float) * cl->wlist.x_size))) @@ -107,5 +106,6 @@ void } ft_floor_cast(cl); i = 0; + ft_memdel((void**)&cl->rlist.wall_dist_tab); ft_memdel((void**)&cl->rlist.wall_bz); } -- cgit v1.2.3 From 54a87749b47b094d54858f563fe7796a2209d83b Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 00:39:54 +0100 Subject: Stupid me --- src/ft_floor_cast.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index 1082fe5..36c759f 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -23,8 +23,8 @@ static void static void ft_draw_extra_tex(uint8_t tid, uint16_t y, uint16_t x, t_cub *cl) { - float dist; - float calc; + float dist; + float calc; if ((dist = cl->rlist.row_dist) <= 0) dist = 0.0001; -- cgit v1.2.3 From 154ccbc0546018554982f9170d32b7858a8c33aa Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 01:17:41 +0100 Subject: Norme --- Makefile | 1 + inc/cub3d.h | 1 + src/ft_floor_cast.c | 16 ++-------------- src/ft_floor_cast_inits.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 src/ft_floor_cast_inits.c diff --git a/Makefile b/Makefile index de7a863..348c37a 100644 --- a/Makefile +++ b/Makefile @@ -81,6 +81,7 @@ SRCS_NAME += ft_treat_args.c SRCS_NAME += ft_init_funptr.c SRCS_NAME += ft_init_bmp.c SRCS_NAME += ft_floor_cast.c +SRCS_NAME += ft_floor_cast_inits.c #--------------------------------------------------------------------------------------------------# SRCS = $(addprefix ${SRCS_DIR},${SRCS_NAME}) #--------------------------------------------------------------------------------------------------# diff --git a/inc/cub3d.h b/inc/cub3d.h index 2a9d66e..a7b649d 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -131,6 +131,7 @@ uint8_t ft_use_args(int argc, const char *argv[], void ft_castray(t_cub *cl); void ft_detect(t_cub *cl); void ft_floor_cast(t_cub *cl); +void ft_floor_cast_inits(uint16_t y, t_ray *rl, t_cub *cl); /* ** ====== OTHER ====== diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index 36c759f..b6c7e72 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -1,7 +1,7 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_raycasting.c :+: :+: :+: */ +/* ft_floor_cast.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ @@ -91,19 +91,7 @@ void y = (cl->wlist.y_size / 2) + 1; while (++y < cl->wlist.y_size) { - rl->x_f_ray_dir = cl->plist.dir_x - cl->plist.plane_x; - rl->y_f_ray_dir = cl->plist.dir_y - cl->plist.plane_y; - rl->x_f_ray_dir_bis = cl->plist.dir_x + cl->plist.plane_x; - rl->y_f_ray_dir_bis = cl->plist.dir_y + cl->plist.plane_y; - rl->p = y - cl->wlist.y_size / 2; - cl->plist.pos_z = 0.5 * cl->wlist.y_size; - rl->row_dist = cl->plist.pos_z / rl->p; - cl->mlist.x_floor_step = rl->row_dist * - (rl->x_f_ray_dir_bis - rl->x_f_ray_dir) / cl->wlist.x_size; - cl->mlist.y_floor_step = rl->row_dist * - (rl->y_f_ray_dir_bis - rl->y_f_ray_dir) / cl->wlist.x_size; - rl->x_floor = cl->plist.pos_y + rl->row_dist * rl->x_f_ray_dir; - rl->y_floor = cl->plist.pos_x + rl->row_dist * rl->y_f_ray_dir; + ft_floor_cast_inits(y, rl, cl); x = -1; while (++x < cl->wlist.x_size) { diff --git a/src/ft_floor_cast_inits.c b/src/ft_floor_cast_inits.c new file mode 100644 index 0000000..591eb24 --- /dev/null +++ b/src/ft_floor_cast_inits.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_floor_cast_inits.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:22:57 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:23:42 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +void + ft_floor_cast_inits(uint16_t y, t_ray *rl, t_cub *cl) +{ + rl->x_f_ray_dir = cl->plist.dir_x - cl->plist.plane_x; + rl->y_f_ray_dir = cl->plist.dir_y - cl->plist.plane_y; + rl->x_f_ray_dir_bis = cl->plist.dir_x + cl->plist.plane_x; + rl->y_f_ray_dir_bis = cl->plist.dir_y + cl->plist.plane_y; + rl->p = y - cl->wlist.y_size / 2; + cl->plist.pos_z = 0.5 * cl->wlist.y_size; + rl->row_dist = cl->plist.pos_z / rl->p; + cl->mlist.x_floor_step = rl->row_dist * + (rl->x_f_ray_dir_bis - rl->x_f_ray_dir) / cl->wlist.x_size; + cl->mlist.y_floor_step = rl->row_dist * + (rl->y_f_ray_dir_bis - rl->y_f_ray_dir) / cl->wlist.x_size; + rl->x_floor = cl->plist.pos_y + rl->row_dist * rl->x_f_ray_dir; + rl->y_floor = cl->plist.pos_x + rl->row_dist * rl->y_f_ray_dir; +} -- cgit v1.2.3 From a752af80e3778b8a17b53b49b11ed235494a623d Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 01:44:15 +0100 Subject: Sliding like a champ --- src/ft_key_loop.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index d40de34..d3e871b 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -53,12 +53,12 @@ static void pl = &cl->plist; x = ft_find_x(key, pl); y = ft_find_y(key, pl); - if (ft_ischarset(FT_CHRST_COLLISION, cl->mlist.map[y][x]) || - cl->mlist.map[y][x] == '\0') - { - pl->pos_y = old_y; + if (ft_ischarset(FT_CHRST_COLLISION, cl->mlist.map[(uint64_t)old_y][x]) || + cl->mlist.map[(uint64_t)old_y][x] == '\0') pl->pos_x = old_x; - } + if (ft_ischarset(FT_CHRST_COLLISION, cl->mlist.map[y][(uint64_t)old_x]) || + cl->mlist.map[y][(uint64_t)old_x] == '\0') + pl->pos_y = old_y; } int -- cgit v1.2.3 From 15e4ca8491c9b2872b30cb1522f72920514a62f1 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 02:03:18 +0100 Subject: ft_calc_sprite in a better location, still sliding like a champ --- map/map_one.cub | 4 ++-- src/ft_draw_scene.c | 2 -- src/ft_raycasting.c | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/map/map_one.cub b/map/map_one.cub index f4f9e91..1f7a92c 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -1,4 +1,4 @@ -R 1000 700 +R 1400 800 NO ./media/img/segfot_small.xpm SO ./media/img/segfot_small.xpm @@ -9,7 +9,7 @@ S ./media/img/pillar.xpm C 50,100,200 F 50,190,124 -SH 6 +SH 4 111111111111111111 120000000011000001 diff --git a/src/ft_draw_scene.c b/src/ft_draw_scene.c index 2cfa3f4..4d15df2 100644 --- a/src/ft_draw_scene.c +++ b/src/ft_draw_scene.c @@ -52,7 +52,6 @@ void } if (clist->mlist.isskybox) ft_draw_skybox(clist); - ft_calc_sprite(clist); mlx_put_image_to_window(clist->wlist.wlx, clist->wlist.winptr, clist->img.img, 0, 0); if (clist->ishud && clist->mlist.isnlvl) @@ -73,7 +72,6 @@ void clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, &clist->img.sizeline, &clist->img.endian); ft_castray(clist); - ft_calc_sprite(clist); if (ft_save_to_bmp(clist) < 0) ft_error(FT_RET_BMP_ERR, FT_ERR_WR_BMP, clist); mlx_destroy_image(clist->wlist.wlx, clist->img.img); diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 221c43d..2d6d197 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -105,7 +105,7 @@ void i++; } ft_floor_cast(cl); - i = 0; + ft_calc_sprite(cl); ft_memdel((void**)&cl->rlist.wall_dist_tab); ft_memdel((void**)&cl->rlist.wall_bz); } -- cgit v1.2.3 From 79af897f235b2172ce37e6d30b829fa0928aef3a Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 09:17:49 +0100 Subject: Good trap init --- inc/cub3d_structs.h | 7 ++++- src/ft_exit.c | 1 + src/ft_init_map.c | 2 ++ src/ft_tex_init.c | 89 +++++++++++++++++++++++++++++------------------------ src/ft_warp_level.c | 1 + 5 files changed, 59 insertions(+), 41 deletions(-) diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 144de6f..9f48975 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -169,6 +169,7 @@ typedef struct s_map char *ce_tex_path; char *nlevel_path; char *skybox_path; + char *traps_path; char *music_path; char *music_cmd; char *mapl; @@ -181,6 +182,8 @@ typedef struct s_map size_t mapl_len; int32_t sprite_nbr; int32_t sprite_order[12]; + int32_t traps_nbr; + int32_t traps_order[12]; size_t line_chk; size_t map_start; uint8_t isspawn; @@ -189,6 +192,7 @@ typedef struct s_map uint8_t isftex; uint8_t isctex; uint8_t isskybox; + uint8_t istrap; uint8_t darklvl; uint8_t scale; uint32_t nlx; @@ -219,8 +223,9 @@ typedef struct s_cub struct s_img img; struct s_rgb f_rgb; struct s_rgb c_rgb; - struct s_img tlist[8]; + struct s_img tlist[16]; struct s_sprite sprites[4096]; + struct s_sprite traps[4096]; } t_cub; # endif diff --git a/src/ft_exit.c b/src/ft_exit.c index fb6de09..3b00701 100644 --- a/src/ft_exit.c +++ b/src/ft_exit.c @@ -33,6 +33,7 @@ static void ft_memdel((void**)&clist->mlist.ce_tex_path); ft_memdel((void**)&clist->mlist.nlevel_path); ft_memdel((void**)&clist->mlist.skybox_path); + ft_memdel((void**)&clist->mlist.traps_path); ft_memdel((void**)&clist->mlist.music_path); ft_memdel((void**)&clist->mlist.music_cmd); ft_memdel((void**)&clist->mlist.mapl); diff --git a/src/ft_init_map.c b/src/ft_init_map.c index 27b4a39..f2b0726 100644 --- a/src/ft_init_map.c +++ b/src/ft_init_map.c @@ -29,6 +29,7 @@ static int8_t !(mlist->ce_tex_path = (char*)ft_calloc(1, sizeof(char))) || !(mlist->nlevel_path = (char*)ft_calloc(1, sizeof(char))) || !(mlist->skybox_path = (char*)ft_calloc(1, sizeof(char))) || + !(mlist->traps_path = (char*)ft_calloc(1, sizeof(char))) || !(mlist->music_path = (char*)ft_calloc(1, sizeof(char))) || !(mlist->music_cmd = (char*)ft_calloc(1, sizeof(char))) || !(mlist->mapl = (char*)ft_calloc(1, sizeof(char))) || @@ -60,6 +61,7 @@ int8_t mlist->isnlvl = 0; mlist->ismusic = 0; mlist->isskybox = 0; + mlist->istrap = 0; mlist->darklvl = 0; mlist->scale = 0; mlist->nlx = 0; diff --git a/src/ft_tex_init.c b/src/ft_tex_init.c index 4cbdf73..32bfb66 100644 --- a/src/ft_tex_init.c +++ b/src/ft_tex_init.c @@ -16,60 +16,69 @@ #include /* -** 0 : no -** 1 : so -** 2 : ea -** 3 : we -** 4 : sprite -** 5 : new level door -** 6 : floor -** 7 : ceil +** 0 : no +** 1 : so +** 2 : ea +** 3 : we +** 4 : sprite 1 +** 5 : new level door +** 6 : floor +** 7 : ceil / skybox +** 8 : sprite 2 +** 9 : sprite 3 +** 10 : sprite 4 +** 11 : sprite 5 +** 12 : sprite 6 +** 13 : sprite 7 +** 14 : sprite 8 +** 15 : trap */ static void - ft_get_nlvl_img(t_cub *cl) + ft_wall_tex_init_norme_bis(t_cub *cl) { - cl->tlist[5].img = mlx_xpm_file_to_image(cl->wlist.wlx, - cl->mlist.nl_tex_path, &cl->tlist[5].img_w, &cl->tlist[5].img_h); - cl->tlist[5].ptr = mlx_get_data_addr(cl->tlist[5].img, - &cl->tlist[5].bpp, &cl->tlist[5].sizeline, &cl->tlist[5].endian); -} - -static void - ft_get_floor_tex(t_cub *cl) -{ - cl->tlist[6].img = mlx_xpm_file_to_image(cl->wlist.wlx, - cl->mlist.fl_tex_path, &cl->tlist[6].img_w, &cl->tlist[6].img_h); - cl->tlist[6].ptr = mlx_get_data_addr(cl->tlist[6].img, - &cl->tlist[6].bpp, &cl->tlist[6].sizeline, &cl->tlist[6].endian); -} - -static void - ft_get_ceil_tex(t_cub *cl) -{ - cl->tlist[7].img = mlx_xpm_file_to_image(cl->wlist.wlx, + if (cl->mlist.isctex) + { + cl->tlist[7].img = mlx_xpm_file_to_image(cl->wlist.wlx, cl->mlist.ce_tex_path, &cl->tlist[7].img_w, &cl->tlist[7].img_h); - cl->tlist[7].ptr = mlx_get_data_addr(cl->tlist[7].img, - &cl->tlist[7].bpp, &cl->tlist[7].sizeline, &cl->tlist[7].endian); + cl->tlist[7].ptr = mlx_get_data_addr(cl->tlist[7].img, + &cl->tlist[7].bpp, &cl->tlist[7].sizeline, &cl->tlist[7].endian); + } + if (cl->mlist.isskybox) + { + cl->tlist[7].img = mlx_xpm_file_to_image(cl->wlist.wlx, + cl->mlist.skybox_path, &cl->tlist[7].img_w, &cl->tlist[7].img_h); + cl->tlist[7].ptr = mlx_get_data_addr(cl->tlist[7].img, + &cl->tlist[7].bpp, &cl->tlist[7].sizeline, &cl->tlist[7].endian); + } + cl->walltexgood = 1; } static void ft_wall_tex_init_norme(t_cub *cl) { if (cl->mlist.isnlvl) - ft_get_nlvl_img(cl); + { + cl->tlist[5].img = mlx_xpm_file_to_image(cl->wlist.wlx, + cl->mlist.nl_tex_path, &cl->tlist[5].img_w, &cl->tlist[5].img_h); + cl->tlist[5].ptr = mlx_get_data_addr(cl->tlist[5].img, + &cl->tlist[5].bpp, &cl->tlist[5].sizeline, &cl->tlist[5].endian); + } if (cl->mlist.isftex) - ft_get_floor_tex(cl); - if (cl->mlist.isctex) - ft_get_ceil_tex(cl); - if (cl->mlist.isskybox) { - cl->tlist[7].img = mlx_xpm_file_to_image(cl->wlist.wlx, - cl->mlist.skybox_path, &cl->tlist[7].img_w, &cl->tlist[7].img_h); - cl->tlist[7].ptr = mlx_get_data_addr(cl->tlist[7].img, - &cl->tlist[7].bpp, &cl->tlist[7].sizeline, &cl->tlist[7].endian); + cl->tlist[6].img = mlx_xpm_file_to_image(cl->wlist.wlx, + cl->mlist.fl_tex_path, &cl->tlist[6].img_w, &cl->tlist[6].img_h); + cl->tlist[6].ptr = mlx_get_data_addr(cl->tlist[6].img, + &cl->tlist[6].bpp, &cl->tlist[6].sizeline, &cl->tlist[6].endian); } - cl->walltexgood = 1; + if (cl->mlist.istrap) + { + cl->tlist[15].img = mlx_xpm_file_to_image(cl->wlist.wlx, + cl->mlist.traps_path, &cl->tlist[15].img_w, &cl->tlist[15].img_h); + cl->tlist[15].ptr = mlx_get_data_addr(cl->tlist[15].img, + &cl->tlist[15].bpp, &cl->tlist[15].sizeline, &cl->tlist[15].endian); + } + ft_wall_tex_init_norme_bis(cl); } void diff --git a/src/ft_warp_level.c b/src/ft_warp_level.c index 1f744c2..3c9110f 100644 --- a/src/ft_warp_level.c +++ b/src/ft_warp_level.c @@ -34,6 +34,7 @@ static void ft_memdel((void**)&ml->ce_tex_path); ft_memdel((void**)&ml->nlevel_path); ft_memdel((void**)&ml->skybox_path); + ft_memdel((void**)&ml->traps_path); ft_memdel((void**)&ml->music_path); ft_memdel((void**)&ml->music_cmd); ft_memdel((void**)&ml->mapl); -- cgit v1.2.3 From bfa1f4e6e61152ba3ff555d1508f43f0a5ab2754 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 09:50:36 +0100 Subject: Secured collision segv --- inc/cub3d.h | 1 + map/lvl_one.cub | 2 +- src/ft_exit.c | 2 ++ src/ft_init_lists.c | 2 +- src/ft_key_loop.c | 13 +++++++++---- src/ft_warp_level.c | 17 +++-------------- 6 files changed, 17 insertions(+), 20 deletions(-) diff --git a/inc/cub3d.h b/inc/cub3d.h index a7b649d..e351fa9 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -27,6 +27,7 @@ void ft_init_ref(t_cub *clist); int8_t ft_init_cub3d(t_cub *clist); int ft_init_winlx(t_cub *clist); int ft_init_winptr(t_cub *clist); +t_player ft_init_player(void); t_ray ft_init_s_ray(void); t_rgb ft_init_rgb(void); int8_t ft_init_map(t_map *mlist); diff --git a/map/lvl_one.cub b/map/lvl_one.cub index 2c52287..64c741b 100644 --- a/map/lvl_one.cub +++ b/map/lvl_one.cub @@ -1,4 +1,4 @@ -R 1440 1000 +R 800 600 NO ./media/img/BRIQUASSE_3.xpm SO ./media/img/BRIQUASSE_3.xpm diff --git a/src/ft_exit.c b/src/ft_exit.c index 3b00701..4125567 100644 --- a/src/ft_exit.c +++ b/src/ft_exit.c @@ -62,6 +62,8 @@ static void mlx_destroy_image(clist->wlist.wlx, clist->tlist[6].img); if (clist->mlist.isctex && clist->tlist[7].img) mlx_destroy_image(clist->wlist.wlx, clist->tlist[7].img); + if (clist->mlist.istrap && clist->tlist[15].img) + mlx_destroy_image(clist->wlist.wlx, clist->tlist[15].img); } int diff --git a/src/ft_init_lists.c b/src/ft_init_lists.c index bd2ae74..8ba9a13 100644 --- a/src/ft_init_lists.c +++ b/src/ft_init_lists.c @@ -28,7 +28,7 @@ t_rgb return (rgb); } -static t_player +t_player ft_init_player(void) { t_player plist; diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index d3e871b..c68b228 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -26,7 +26,7 @@ static uint64_t return (pl->pos_x - (pl->dir_y * FT_COLL_MULT)); else if (key == 3) return (pl->pos_x - (pl->dir_x * (FT_COLL_MULT / 2))); - return (1); + return ((uint64_t)pl->pos_x); } static uint64_t @@ -40,9 +40,10 @@ static uint64_t return (pl->pos_y - (pl->dir_x * FT_COLL_MULT)); else if (key == 3) return (pl->pos_y + (pl->dir_y * (FT_COLL_MULT / 2))); - return (1); + return ((uint64_t)pl->pos_y); } +#include static void ft_collision(float old_y, float old_x, int32_t key, t_cub *cl) { @@ -75,8 +76,12 @@ int ft_collision(old_y, old_x, cl->key_input[i], cl); if (cl->mlist.isnlvl) { - if (ft_warp_level(cl) < 0) - return (ft_exit(FT_RET_FAILED_STRUCTS, cl)); + if ((uint32_t)cl->plist.pos_x == cl->mlist.nlx && + (uint32_t)cl->plist.pos_y == cl->mlist.nly) + { + return ((ft_warp_level(cl) < 0) ? + (ft_exit(FT_RET_FAILED_STRUCTS, cl)) : (0)); + } } i++; } diff --git a/src/ft_warp_level.c b/src/ft_warp_level.c index 3c9110f..a4f705b 100644 --- a/src/ft_warp_level.c +++ b/src/ft_warp_level.c @@ -47,16 +47,7 @@ static void { uint8_t i; - cl->plist.pos_x = 0; - cl->plist.pos_y = 0; - cl->plist.pos_z = 0; - cl->plist.start_x = 0; - cl->plist.start_y = 0; - cl->plist.cam_x = 0; - cl->plist.dir_x = -1; - cl->plist.dir_y = 0; - cl->plist.plane_x = 0; - cl->plist.plane_y = 0.66; + cl->plist = ft_init_player(); cl->f_rgb = ft_init_rgb(); cl->c_rgb = ft_init_rgb(); cl->rlist = ft_init_s_ray(); @@ -70,6 +61,8 @@ static void mlx_destroy_image(cl->wlist.wlx, cl->tlist[6].img); if (cl->mlist.isctex && cl->tlist[7].img) mlx_destroy_image(cl->wlist.wlx, cl->tlist[7].img); + if (cl->mlist.istrap && cl->tlist[15].img) + mlx_destroy_image(cl->wlist.wlx, cl->tlist[15].img); } static void @@ -100,9 +93,6 @@ int8_t char *tmp_mup; uint8_t isoldmus; - if ((uint32_t)cl->plist.pos_x == cl->mlist.nlx && - (uint32_t)cl->plist.pos_y == cl->mlist.nly) - { if (!(next_path = (char *)malloc((ft_strlen( cl->mlist.nlevel_path) + 1) * sizeof(char)))) return (-1); @@ -119,6 +109,5 @@ int8_t ft_memdel((void**)&tmp_mup); ft_wall_tex_init(cl); ft_memdel((void**)&next_path); - } return (0); } -- cgit v1.2.3 From 1e34f00dd4b8080406ac2eae4e3a34d82ab05442 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 09:51:01 +0100 Subject: Reverted lvl_one size --- map/lvl_one.cub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map/lvl_one.cub b/map/lvl_one.cub index 64c741b..2c52287 100644 --- a/map/lvl_one.cub +++ b/map/lvl_one.cub @@ -1,4 +1,4 @@ -R 800 600 +R 1440 1000 NO ./media/img/BRIQUASSE_3.xpm SO ./media/img/BRIQUASSE_3.xpm -- cgit v1.2.3 From c1d1d76e0c88fbbbe4b1e0611a13a6a4df6cb424 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 09:59:17 +0100 Subject: Parsed traps --- Makefile | 1 + inc/cub3d.h | 1 + inc/cub3d_defines.h | 9 +++++---- inc/cub3d_structs.h | 6 +++--- src/ft_get_traps.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/ft_init_funptr.c | 4 +++- src/ft_select_get.c | 2 +- 7 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 src/ft_get_traps.c diff --git a/Makefile b/Makefile index 348c37a..6c0dfb2 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,7 @@ SRCS_NAME += ft_get_skybox.c SRCS_NAME += ft_get_player_spawn.c SRCS_NAME += ft_get_music.c SRCS_NAME += ft_get_darkness.c +SRCS_NAME += ft_get_traps.c SRCS_NAME += ft_set_minimap_scale.c SRCS_NAME += ft_check_missing.c SRCS_NAME += ft_check_not_found.c diff --git a/inc/cub3d.h b/inc/cub3d.h index e351fa9..bb30122 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -102,6 +102,7 @@ int8_t ft_get_c_tex(char **words, t_cub *clist); int8_t ft_get_darkness(char **words, t_cub *clist); int8_t ft_get_path_nl(char **words, t_cub *clist); int8_t ft_get_skybox(char **words, t_cub *clist); +int8_t ft_get_traps(char **words, t_cub *clist); int8_t ft_get_tex_nl(char **words, t_cub *clist); int8_t ft_get_music(char **words, t_cub *clist); size_t ft_get_map_h(char **map); diff --git a/inc/cub3d_defines.h b/inc/cub3d_defines.h index edc3dec..6453e73 100644 --- a/inc/cub3d_defines.h +++ b/inc/cub3d_defines.h @@ -114,11 +114,11 @@ enum ** ====== CHARSET ====== */ -# define FT_CHRST_VALID_PARSE "RNSEWFCLM" -# define FT_CHRST_MAP_ENTRY "012NSEWL " +# define FT_CHRST_VALID_PARSE "RNSEWFCLMT" +# define FT_CHRST_MAP_ENTRY "012NSEWLT " # define FT_CHRST_SPAWN "NSEW" -# define FT_CHRST_MAP_NON_WALL "02NESWL" -# define FT_CHRST_COLLISION "12 " +# define FT_CHRST_MAP_NON_WALL "02NESWLT" +# define FT_CHRST_COLLISION "12T " # define FT_CHRST_DETECT "1L" /* @@ -166,6 +166,7 @@ enum # define FT_ERR_RD_NL_TEX "could not find next level texture file" # define FT_ERR_RD_NL_MAP "could not find next level map file" # define FT_ERR_RD_MUSIC "could not find music file" +# define FT_ERR_RD_TRAP "could not find trap texture file" # define FT_ERR_WR_BMP "could not export to bmp" /* diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 9f48975..89e531a 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -214,8 +214,8 @@ typedef struct s_cub int32_t key_input[5]; pid_t mpid; int (*key_ptr[6])(struct s_cub*); - int8_t (*get_ptr[13])(char**, struct s_cub*); - char ref[14][3]; + int8_t (*get_ptr[14])(char**, struct s_cub*); + char ref[15][3]; struct s_win wlist; struct s_player plist; struct s_map mlist; @@ -225,7 +225,7 @@ typedef struct s_cub struct s_rgb c_rgb; struct s_img tlist[16]; struct s_sprite sprites[4096]; - struct s_sprite traps[4096]; + struct s_sprite traps[512]; } t_cub; # endif diff --git a/src/ft_get_traps.c b/src/ft_get_traps.c new file mode 100644 index 0000000..cdc05de --- /dev/null +++ b/src/ft_get_traps.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_get_tex_nl.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/28 18:24:52 by rbousset #+# #+# */ +/* Updated: 2020/02/28 18:24:56 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +int8_t + ft_get_traps(char **words, t_cub *clist) +{ + if (!(*words) || !(*(words + 1)) || (*(words + 2))) + { + ft_sprintf(clist->errmsg, "%s", FT_ERR_ARGS); + return (-1); + } + if (ft_check_ext(*(words + 1), ".xpm") < 0) + { + ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); + return (-1); + } + ft_memdel((void**)&clist->mlist.traps_path); + if (!(clist->mlist.traps_path = ft_strdup(*(words + 1)))) + { + ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); + return (-1); + } + if (ft_check_not_found(clist->mlist.traps_path) < 0) + { + ft_sprintf(clist->errmsg, FT_ERR_RD_TRAP); + return (-1); + } + return (0); +} diff --git a/src/ft_init_funptr.c b/src/ft_init_funptr.c index 6bfa3f7..c74b2c8 100644 --- a/src/ft_init_funptr.c +++ b/src/ft_init_funptr.c @@ -29,7 +29,8 @@ void ft_sprintf(clist->ref[10], "MU"); ft_sprintf(clist->ref[11], "SH"); ft_sprintf(clist->ref[12], "SB"); - ft_bzero(clist->ref[13], 3); + ft_sprintf(clist->ref[13], "T"); + ft_bzero(clist->ref[14], 3); } void @@ -54,4 +55,5 @@ void clist->get_ptr[10] = ft_get_music; clist->get_ptr[11] = ft_get_darkness; clist->get_ptr[12] = ft_get_skybox; + clist->get_ptr[14] = ft_get_traps; } diff --git a/src/ft_select_get.c b/src/ft_select_get.c index fe6bb3e..2a95309 100644 --- a/src/ft_select_get.c +++ b/src/ft_select_get.c @@ -66,7 +66,7 @@ static int8_t ret = 0; while (ft_strncmp(words[0], clist->ref[ret], 3) && clist->ref[ret][0]) ret++; - if (ret == 13) + if (ret == 14) ret = FT_PARSE_END_RET; ret = ft_check_exists(ret, clist); ret = ft_check_exists_two(ret, clist); -- cgit v1.2.3 From c581c7e3543058f015bddf96d76ac2d771ea40a0 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 10:16:48 +0100 Subject: Nice parse --- inc/cub3d.h | 3 ++- inc/cub3d_structs.h | 2 +- map/map_one.cub | 1 + src/ft_check_map_line.c | 2 ++ src/ft_exit.c | 2 +- src/ft_get_traps.c | 28 ++++++++++++++++++++++++++++ src/ft_init_funptr.c | 2 +- src/ft_init_map.c | 4 +++- src/ft_select_get.c | 4 ++++ src/ft_tex_init.c | 2 +- src/ft_warp_level.c | 2 +- 11 files changed, 45 insertions(+), 7 deletions(-) diff --git a/inc/cub3d.h b/inc/cub3d.h index bb30122..9487883 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -77,7 +77,6 @@ void ft_sprite_width(t_cub *cl, t_sprite *sprite); void ft_sprite_height(t_cub *cl, t_sprite *sprite); void ft_calc_sprite(t_cub *cl); void ft_draw_sprite(t_cub *cl, t_sprite *sprite); -void ft_get_sprite_spawn(t_cub *cl); void ft_draw_skybox(t_cub *cl); /* @@ -107,6 +106,8 @@ int8_t ft_get_tex_nl(char **words, t_cub *clist); int8_t ft_get_music(char **words, t_cub *clist); size_t ft_get_map_h(char **map); size_t ft_get_map_w(char **map); +void ft_get_sprite_spawn(t_cub *clist); +void ft_get_trap_spawn(t_cub *clist); int8_t ft_check_map_line(char *line, uint8_t l, t_cub *clist); int8_t ft_check_ext(const char *filep, const char *ext); int8_t ft_check_not_found(const char *path); diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 89e531a..5ba3b38 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -192,7 +192,7 @@ typedef struct s_map uint8_t isftex; uint8_t isctex; uint8_t isskybox; - uint8_t istrap; + uint8_t istraps; uint8_t darklvl; uint8_t scale; uint32_t nlx; diff --git a/map/map_one.cub b/map/map_one.cub index 1f7a92c..540e7c2 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -9,6 +9,7 @@ S ./media/img/pillar.xpm C 50,100,200 F 50,190,124 +T ./media/img/linus.xpm SH 4 111111111111111111 diff --git a/src/ft_check_map_line.c b/src/ft_check_map_line.c index 7fa68b7..c88e1f5 100644 --- a/src/ft_check_map_line.c +++ b/src/ft_check_map_line.c @@ -37,6 +37,8 @@ static int8_t ft_sprintf(clist->errmsg, FT_ERR_MULT_NLVL); return (-1); } + if (line[i] == 'T') + clist->mlist.istraps = 1; return (0); } diff --git a/src/ft_exit.c b/src/ft_exit.c index 4125567..4a131c8 100644 --- a/src/ft_exit.c +++ b/src/ft_exit.c @@ -62,7 +62,7 @@ static void mlx_destroy_image(clist->wlist.wlx, clist->tlist[6].img); if (clist->mlist.isctex && clist->tlist[7].img) mlx_destroy_image(clist->wlist.wlx, clist->tlist[7].img); - if (clist->mlist.istrap && clist->tlist[15].img) + if (clist->mlist.istraps && clist->tlist[15].img) mlx_destroy_image(clist->wlist.wlx, clist->tlist[15].img); } diff --git a/src/ft_get_traps.c b/src/ft_get_traps.c index cdc05de..0235bb5 100644 --- a/src/ft_get_traps.c +++ b/src/ft_get_traps.c @@ -14,6 +14,34 @@ #include #include +void + ft_get_trap_spawn(t_cub *clist) +{ + size_t x; + size_t y; + uint8_t i; + + x = 1; + y = 1; + i = 0; + while (clist->mlist.map[y]) + { + while (clist->mlist.map[y][x]) + { + if (clist->mlist.map[y][x] == 'T') + { + clist->mlist.traps_nbr++; + clist->traps[i].s_pos_x = x; + clist->traps[i].s_pos_y = y; + i++; + } + x++; + } + x = 1; + y++; + } +} + int8_t ft_get_traps(char **words, t_cub *clist) { diff --git a/src/ft_init_funptr.c b/src/ft_init_funptr.c index c74b2c8..c299336 100644 --- a/src/ft_init_funptr.c +++ b/src/ft_init_funptr.c @@ -55,5 +55,5 @@ void clist->get_ptr[10] = ft_get_music; clist->get_ptr[11] = ft_get_darkness; clist->get_ptr[12] = ft_get_skybox; - clist->get_ptr[14] = ft_get_traps; + clist->get_ptr[13] = ft_get_traps; } diff --git a/src/ft_init_map.c b/src/ft_init_map.c index f2b0726..867a5b0 100644 --- a/src/ft_init_map.c +++ b/src/ft_init_map.c @@ -61,7 +61,9 @@ int8_t mlist->isnlvl = 0; mlist->ismusic = 0; mlist->isskybox = 0; - mlist->istrap = 0; + mlist->istraps = 0; + mlist->sprite_nbr = 0; + mlist->traps_nbr = 0; mlist->darklvl = 0; mlist->scale = 0; mlist->nlx = 0; diff --git a/src/ft_select_get.c b/src/ft_select_get.c index 2a95309..f748721 100644 --- a/src/ft_select_get.c +++ b/src/ft_select_get.c @@ -53,6 +53,10 @@ static int8_t return (-1); if (ret == 10 && (clist->mlist.music_path[0])) return (-1); + if (ret == 12 && (clist->mlist.skybox_path[0])) + return (-1); + if (ret == 13 && (clist->mlist.traps_path[0])) + return (-1); return (ret); } diff --git a/src/ft_tex_init.c b/src/ft_tex_init.c index 32bfb66..30b738e 100644 --- a/src/ft_tex_init.c +++ b/src/ft_tex_init.c @@ -71,7 +71,7 @@ static void cl->tlist[6].ptr = mlx_get_data_addr(cl->tlist[6].img, &cl->tlist[6].bpp, &cl->tlist[6].sizeline, &cl->tlist[6].endian); } - if (cl->mlist.istrap) + if (cl->mlist.istraps) { cl->tlist[15].img = mlx_xpm_file_to_image(cl->wlist.wlx, cl->mlist.traps_path, &cl->tlist[15].img_w, &cl->tlist[15].img_h); diff --git a/src/ft_warp_level.c b/src/ft_warp_level.c index a4f705b..faaf322 100644 --- a/src/ft_warp_level.c +++ b/src/ft_warp_level.c @@ -61,7 +61,7 @@ static void mlx_destroy_image(cl->wlist.wlx, cl->tlist[6].img); if (cl->mlist.isctex && cl->tlist[7].img) mlx_destroy_image(cl->wlist.wlx, cl->tlist[7].img); - if (cl->mlist.istrap && cl->tlist[15].img) + if (cl->mlist.istraps && cl->tlist[15].img) mlx_destroy_image(cl->wlist.wlx, cl->tlist[15].img); } -- cgit v1.2.3 From 537ace5d3615855ad2e236ab6f94862241ac71c4 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 10:19:22 +0100 Subject: Ok --- map/map_one.cub | 8 ++++---- src/ft_draw_map.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/map/map_one.cub b/map/map_one.cub index 540e7c2..0b0cbd5 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -1,4 +1,4 @@ -R 1400 800 +R 1400 900 NO ./media/img/segfot_small.xpm SO ./media/img/segfot_small.xpm @@ -22,8 +22,8 @@ SH 4 1011001 100001 111101111111110111 110000001101010111 -100020000000000011 -100000000000000011 -110000001101010111 +100020T00000000011 +100000T00000000011 +110000T01101010111 111101111111010111 11111 1 1111 diff --git a/src/ft_draw_map.c b/src/ft_draw_map.c index 232891c..fc2613b 100644 --- a/src/ft_draw_map.c +++ b/src/ft_draw_map.c @@ -49,13 +49,13 @@ void { while (map[y][x]) { - if (ft_ischarset("1D", map[y][x])) + if (ft_ischarset("1", map[y][x])) ft_draw_square(scale + 9 + (x * (scale)), ft_y_offset(clist) - 9 + (y * (scale)), 0x00ca5422, clist); else if (map[y][x] == '2') ft_draw_square(scale + 9 + (x * (scale)), ft_y_offset(clist) - 9 + (y * (scale)), 0x0033ccff, clist); - else if (ft_ischarset("0LNSEW", map[y][x])) + else if (ft_ischarset("0LNSEWT", map[y][x])) ft_draw_square(scale + 9 + (x * (scale)), ft_y_offset(clist) - 9 + (y * (scale)), 0x006afa6a, clist); x++; -- cgit v1.2.3 From 8df5ba15b4b54511ade9c875bf84ac2696630aa7 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 10:28:33 +0100 Subject: Perfect collision on them traps --- inc/cub3d_defines.h | 2 +- src/ft_key_loop.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/inc/cub3d_defines.h b/inc/cub3d_defines.h index 6453e73..6ab05c2 100644 --- a/inc/cub3d_defines.h +++ b/inc/cub3d_defines.h @@ -118,7 +118,7 @@ enum # define FT_CHRST_MAP_ENTRY "012NSEWLT " # define FT_CHRST_SPAWN "NSEW" # define FT_CHRST_MAP_NON_WALL "02NESWLT" -# define FT_CHRST_COLLISION "12T " +# define FT_CHRST_COLLISION "12 " # define FT_CHRST_DETECT "1L" /* diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index c68b228..d19daaa 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -54,6 +54,13 @@ static void pl = &cl->plist; x = ft_find_x(key, pl); y = ft_find_y(key, pl); + if (cl->mlist.map[y][x] == 'T') + { + pl->pos_x = old_x + ((old_x - x) / 4); + pl->pos_y = old_y + ((old_y - y) / 4); + x = ft_find_x(key, pl); + y = ft_find_y(key, pl); + } if (ft_ischarset(FT_CHRST_COLLISION, cl->mlist.map[(uint64_t)old_y][x]) || cl->mlist.map[(uint64_t)old_y][x] == '\0') pl->pos_x = old_x; -- cgit v1.2.3 From b236416db21d03f7749e1c80d5b7abee70ea07d5 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 12:38:21 +0100 Subject: Pretty cool animation --- Makefile | 1 + inc/cub3d.h | 1 + inc/cub3d_structs.h | 1 + src/ft_draw_hud.c | 2 +- src/ft_floor_cast.c | 2 +- src/ft_init_lists.c | 1 + src/ft_key_loop.c | 1 + src/ft_suffer_animation.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/ft_suffer_animation.c diff --git a/Makefile b/Makefile index 6c0dfb2..7b374c8 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,7 @@ SRCS_NAME += ft_init_funptr.c SRCS_NAME += ft_init_bmp.c SRCS_NAME += ft_floor_cast.c SRCS_NAME += ft_floor_cast_inits.c +SRCS_NAME += ft_suffer_animation.c #--------------------------------------------------------------------------------------------------# SRCS = $(addprefix ${SRCS_DIR},${SRCS_NAME}) #--------------------------------------------------------------------------------------------------# diff --git a/inc/cub3d.h b/inc/cub3d.h index 9487883..4172c9d 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -78,6 +78,7 @@ void ft_sprite_height(t_cub *cl, t_sprite *sprite); void ft_calc_sprite(t_cub *cl); void ft_draw_sprite(t_cub *cl, t_sprite *sprite); void ft_draw_skybox(t_cub *cl); +void ft_suffer_animation(t_cub *cl); /* ** ====== PARSING ====== diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 5ba3b38..7665e96 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -120,6 +120,7 @@ typedef struct s_player float cam_x; float plane_x; float plane_y; + int8_t life; } t_player; typedef struct s_ray diff --git a/src/ft_draw_hud.c b/src/ft_draw_hud.c index 4ae497a..486112d 100644 --- a/src/ft_draw_hud.c +++ b/src/ft_draw_hud.c @@ -65,7 +65,7 @@ static void while (y < clist->wlist.y_size - (clist->mlist.map_h * scl) - 20) { *(int*)(clist->img.ptr + - ((uint8_t)x * 4 + (y * clist->img.sizeline))) = col; + ((uint16_t)x * 4 + (y * clist->img.sizeline))) = col; y++; } y = clist->wlist.y_size - (clist->mlist.map_h * scl) - 45; diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index b6c7e72..2eda9d8 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -17,7 +17,7 @@ static void ft_draw_plain_horizontal(t_rgb rgb, t_cub *cl, int32_t y, int32_t x) { *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = ft_darken(rgb, cl); + (x * 4 + (y * cl->img.sizeline))) = ft_darken(rgb, cl); } static void diff --git a/src/ft_init_lists.c b/src/ft_init_lists.c index 8ba9a13..79b0d14 100644 --- a/src/ft_init_lists.c +++ b/src/ft_init_lists.c @@ -43,6 +43,7 @@ t_player plist.dir_y = 0; plist.plane_x = 0; plist.plane_y = 0.66; + plist.life = 100; return (plist); } diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index d19daaa..29718df 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -58,6 +58,7 @@ static void { pl->pos_x = old_x + ((old_x - x) / 4); pl->pos_y = old_y + ((old_y - y) / 4); + ft_suffer_animation(cl); x = ft_find_x(key, pl); y = ft_find_y(key, pl); } diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c new file mode 100644 index 0000000..bb69b4b --- /dev/null +++ b/src/ft_suffer_animation.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_key_loop.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/17 20:06:26 by rbousset #+# #+# */ +/* Updated: 2020/02/17 20:06:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include + +void + ft_suffer_animation(t_cub *cl) +{ + uint16_t x; + uint16_t y; + + cl->img.img = mlx_new_image(cl->wlist.wlx, + cl->wlist.x_size, cl->wlist.y_size); + cl->img.ptr = mlx_get_data_addr(cl->img.img, &cl->img.bpp, + &cl->img.sizeline, &cl->img.endian); + x = 0; + y = 0; + while (y < cl->wlist.y_size) + { + while (x < cl->wlist.x_size) + { + *(int*)(cl->img.ptr + + (x * 4 + (y * cl->img.sizeline))) = 0x00ce1212; + x++; + } + x = 0; + y++; + } + mlx_put_image_to_window(cl->wlist.wlx, + cl->wlist.winptr, cl->img.img, 0, 0); + mlx_destroy_image(cl->wlist.wlx, cl->img.img); +} -- cgit v1.2.3 From 878b565e98728dcd0fba8dfeeba8b1ff46dbd5cd Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Wed, 11 Mar 2020 12:48:34 +0100 Subject: Tweaked suff animation --- src/ft_key_loop.c | 1 - src/ft_suffer_animation.c | 38 ++++++++++++++++++++++---------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index 29718df..e0c2c28 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -43,7 +43,6 @@ static uint64_t return ((uint64_t)pl->pos_y); } -#include static void ft_collision(float old_y, float old_x, int32_t key, t_cub *cl) { diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index bb69b4b..4e77ca7 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -20,25 +20,31 @@ void { uint16_t x; uint16_t y; + uint8_t i; - cl->img.img = mlx_new_image(cl->wlist.wlx, - cl->wlist.x_size, cl->wlist.y_size); - cl->img.ptr = mlx_get_data_addr(cl->img.img, &cl->img.bpp, - &cl->img.sizeline, &cl->img.endian); - x = 0; - y = 0; - while (y < cl->wlist.y_size) + i = 0; + while (i < 8) { - while (x < cl->wlist.x_size) + cl->img.img = mlx_new_image(cl->wlist.wlx, + cl->wlist.x_size, cl->wlist.y_size); + cl->img.ptr = mlx_get_data_addr(cl->img.img, &cl->img.bpp, + &cl->img.sizeline, &cl->img.endian); + x = 0; + y = 0; + while (y < cl->wlist.y_size) { - *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = 0x00ce1212; - x++; + while (x < cl->wlist.x_size) + { + *(int*)(cl->img.ptr + + (x * 4 + (y * cl->img.sizeline))) = 0x00ce1212; + x++; + } + x = 0; + y++; } - x = 0; - y++; + mlx_put_image_to_window(cl->wlist.wlx, + cl->wlist.winptr, cl->img.img, 0, 0); + mlx_destroy_image(cl->wlist.wlx, cl->img.img); + i++; } - mlx_put_image_to_window(cl->wlist.wlx, - cl->wlist.winptr, cl->img.img, 0, 0); - mlx_destroy_image(cl->wlist.wlx, cl->img.img); } -- cgit v1.2.3 From 17906f353bb6e87528f552891d7d4c91bb3ac789 Mon Sep 17 00:00:00 2001 From: Rudy Bousset Date: Wed, 11 Mar 2020 14:38:52 +0100 Subject: why macos --- inc/cub3d_structs.h | 1 + map/lvl_one.cub | 2 +- map/map_one.cub | 4 ++-- src/ft_suffer_animation.c | 43 ++++++++++++++++++++----------------------- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 7665e96..310ba90 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -222,6 +222,7 @@ typedef struct s_cub struct s_map mlist; struct s_ray rlist; struct s_img img; + struct s_img red_scr; struct s_rgb f_rgb; struct s_rgb c_rgb; struct s_img tlist[16]; diff --git a/map/lvl_one.cub b/map/lvl_one.cub index 2c52287..d0ce0a2 100644 --- a/map/lvl_one.cub +++ b/map/lvl_one.cub @@ -1,4 +1,4 @@ -R 1440 1000 +R 1600 1000 NO ./media/img/BRIQUASSE_3.xpm SO ./media/img/BRIQUASSE_3.xpm diff --git a/map/map_one.cub b/map/map_one.cub index 0b0cbd5..285fbf0 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -14,7 +14,7 @@ SH 4 111111111111111111 120000000011000001 -10010E000000000201 +100100000000000201 101100000111000001 111111111111110011 1000001 100001 @@ -23,7 +23,7 @@ SH 4 111101111111110111 110000001101010111 100020T00000000011 -100000T00000000011 +100000T00000W00011 110000T01101010111 111101111111010111 11111 1 1111 diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index 4e77ca7..a2ce3b1 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -18,33 +18,30 @@ void ft_suffer_animation(t_cub *cl) { - uint16_t x; - uint16_t y; - uint8_t i; + int32_t x; + int32_t y; + int8_t i; + int32_t col; - i = 0; - while (i < 8) + i = -1; + col = 0x00ce2524; + while (++i < 100) { - cl->img.img = mlx_new_image(cl->wlist.wlx, - cl->wlist.x_size, cl->wlist.y_size); - cl->img.ptr = mlx_get_data_addr(cl->img.img, &cl->img.bpp, - &cl->img.sizeline, &cl->img.endian); - x = 0; - y = 0; - while (y < cl->wlist.y_size) + cl->red_scr.img = mlx_new_image(cl->wlist.wlx, + cl->wlist.x_size, cl->wlist.y_size); + cl->red_scr.ptr = mlx_get_data_addr(cl->red_scr.img, &cl->red_scr.bpp, + &cl->red_scr.sizeline, &cl->red_scr.endian); + x = -1; + y = -1; + while (++y < (int32_t)cl->wlist.y_size) { - while (x < cl->wlist.x_size) - { - *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = 0x00ce1212; - x++; - } - x = 0; - y++; + while (++x < (int32_t)cl->wlist.x_size) + *(int*)(cl->red_scr.ptr + + (x * 4 + (y * cl->red_scr.sizeline))) = col; + x = -1; } mlx_put_image_to_window(cl->wlist.wlx, - cl->wlist.winptr, cl->img.img, 0, 0); - mlx_destroy_image(cl->wlist.wlx, cl->img.img); - i++; + cl->wlist.winptr, cl->red_scr.img, 0, 0); + mlx_destroy_image(cl->wlist.wlx, cl->red_scr.img); } } -- cgit v1.2.3 From 650e83573987d004171f250e236b21b243477355 Mon Sep 17 00:00:00 2001 From: Rudy Bousset Date: Wed, 11 Mar 2020 14:57:54 +0100 Subject: is not working --- Makefile | 17 +- minilibx_beta/Makefile | 34 + minilibx_beta/font.c | 3526 +++++++++++++++++++++++++++++++ minilibx_beta/interface.swift | 292 +++ minilibx_beta/man/man3/mlx.3 | 110 + minilibx_beta/man/man3/mlx_loop.3 | 144 ++ minilibx_beta/man/man3/mlx_new_image.3 | 206 ++ minilibx_beta/man/man3/mlx_new_window.3 | 79 + minilibx_beta/man/man3/mlx_pixel_put.3 | 85 + minilibx_beta/mlx.h | 157 ++ minilibx_beta/mlx_image.swift | 48 + minilibx_beta/mlx_image.swiftdoc | Bin 0 -> 532 bytes minilibx_beta/mlx_image.swiftmodule | Bin 0 -> 32172 bytes minilibx_beta/mlx_init.swift | 100 + minilibx_beta/mlx_init.swiftdoc | Bin 0 -> 376 bytes minilibx_beta/mlx_init.swiftmodule | Bin 0 -> 20128 bytes minilibx_beta/mlx_png.c | 431 ++++ minilibx_beta/mlx_rgb.c | 763 +++++++ minilibx_beta/mlx_string_put.c | 72 + minilibx_beta/mlx_window.swift | 541 +++++ minilibx_beta/mlx_window.swiftdoc | Bin 0 -> 508 bytes minilibx_beta/mlx_window.swiftmodule | Bin 0 -> 55576 bytes minilibx_beta/mlx_xpm.c | 384 ++++ src/ft_suffer_animation.c | 6 +- 24 files changed, 6990 insertions(+), 5 deletions(-) create mode 100644 minilibx_beta/Makefile create mode 100644 minilibx_beta/font.c create mode 100644 minilibx_beta/interface.swift create mode 100644 minilibx_beta/man/man3/mlx.3 create mode 100644 minilibx_beta/man/man3/mlx_loop.3 create mode 100644 minilibx_beta/man/man3/mlx_new_image.3 create mode 100644 minilibx_beta/man/man3/mlx_new_window.3 create mode 100644 minilibx_beta/man/man3/mlx_pixel_put.3 create mode 100644 minilibx_beta/mlx.h create mode 100644 minilibx_beta/mlx_image.swift create mode 100644 minilibx_beta/mlx_image.swiftdoc create mode 100644 minilibx_beta/mlx_image.swiftmodule create mode 100644 minilibx_beta/mlx_init.swift create mode 100644 minilibx_beta/mlx_init.swiftdoc create mode 100644 minilibx_beta/mlx_init.swiftmodule create mode 100644 minilibx_beta/mlx_png.c create mode 100644 minilibx_beta/mlx_rgb.c create mode 100644 minilibx_beta/mlx_string_put.c create mode 100644 minilibx_beta/mlx_window.swift create mode 100644 minilibx_beta/mlx_window.swiftdoc create mode 100644 minilibx_beta/mlx_window.swiftmodule create mode 100644 minilibx_beta/mlx_xpm.c diff --git a/Makefile b/Makefile index 7b374c8..9fbd0f2 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,11 @@ INCS_DIR = inc/ SRCS_DIR = src/ OBJS_DIR = obj/ LFT_DIR = libft/ -MLX_DIR = minilibx/ +ifdef BETA + MLX_DIR = minilibx_beta/ +else + MLX_DIR = minilibx/ +endif #==================================================================================================# #---------------------------------------------- Files ---------------------------------------------# #==================================================================================================# @@ -95,6 +99,7 @@ LFT_SRCS = $(shell find libft/src -name "*.c") #==================================================================================================# MKDIR = mkdir -p RM = rm -rf +MV = mv OS = $(shell uname) ifeq (${OS}, Darwin) SCR_SZE = $(shell osascript -e 'tell application "Finder" to get bounds of window of desktop' \ @@ -153,6 +158,9 @@ endif ${NAME}: ${OBJS} ${LFT_SRCS} ${LFT_DIR}${INCS_DIR}libft.h ifeq (${OS}, Darwin) @$(MAKE) --no-print-directory -C ${MLX_DIR} all +ifdef BETA + ${MV} ${MLX_DIR}libmlx.dylib ./ +endif endif ifdef ASAN @$(MAKE) --no-print-directory -C ${LFT_DIR} all ASAN=1 @@ -160,8 +168,12 @@ else @$(MAKE) --no-print-directory -C ${LFT_DIR} all endif ifeq (${OS}, Darwin) +ifdef BETA + ${CC} ${CFLAGS} -o $@ ${OBJS} -rpath ${MLX_DIR}libmlx.dylib -rpath /usr/lib/libSystem.B.dylib -L${LFT_DIR} -L./ -lft -lmlx -lm +else ${CC} ${CFLAGS} -o $@ ${OBJS} -L${LFT_DIR} -L${MLX_DIR} -lft -lmlx -lm \ -framework OpenGL -framework AppKit +endif else ${CC} ${CFLAGS} -o $@ ${OBJS} -L${LFT_DIR} -lft -lX11 -lXext -lmlx -lm -lbsd endif @@ -171,6 +183,9 @@ all: ${NAME} clean: ifeq (${OS}, Darwin) @$(MAKE) --no-print-directory -C ${MLX_DIR} clean +ifdef BETA + ${RM} libmlx.dylib +endif endif @$(MAKE) --no-print-directory -C ${LFT_DIR} clean ${RM} ${OBJS_DIR} diff --git a/minilibx_beta/Makefile b/minilibx_beta/Makefile new file mode 100644 index 0000000..39c36f4 --- /dev/null +++ b/minilibx_beta/Makefile @@ -0,0 +1,34 @@ + + + +MODULE_SRC= mlx_image.swift mlx_window.swift mlx_init.swift +MODULE_OBJ=$(MODULE_SRC:.swift=.swiftmodule) + +SRC= interface.swift $(MODULE_SRC) +OBJ=$(SRC:.swift=.o) + +C_SRC= mlx_xpm.c mlx_png.c mlx_string_put.c +C_OBJ=$(C_SRC:.c=.o) +CFLAGS=-O3 + +NAME=libmlx.dylib + +INC=-I. +#OPTI=-Ounchecked + +all: $(NAME) + +$(NAME): $(MODULE_OBJ) $(OBJ) $(C_OBJ) + swiftc $(OPTI) $(INC) -o $(NAME) -emit-library $(OBJ) $(C_OBJ) -lz + + + +%.o: %.swift + swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ + +%.swiftmodule: %.swift + swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ -emit-module -module-name $(patsubst %.swift,%,$<) -module-link-name $(patsubst %.swift,%,$<) + +clean: + rm -f $(NAME) $(OBJ) $(MODULE_OBJ) $(C_OBJ) *.swiftdoc *~ + diff --git a/minilibx_beta/font.c b/minilibx_beta/font.c new file mode 100644 index 0000000..d4c48cc --- /dev/null +++ b/minilibx_beta/font.c @@ -0,0 +1,3526 @@ +/* GIMP RGBA C-Source image dump (font.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ + unsigned char pixel_data[1140 * 20 * 4 + 1]; +} font_atlas = { + 1140, 20, 4, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\214\377\377\377\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + ")\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\216\377\377\377\263\377\377\377\013\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377b\377\377\377V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\270\377\377" + "\377u\377\377\377\013\377\377\377\252\377\377\377\255\377\377\377\013\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\374\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377e\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\234\377\377\377" + "\267\377\377\377B\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\343\377" + "\377\377\375\377\377\377M\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\367\377\377\377\070\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\373\377\377\377\243\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377b\377\377\377\237\377\377\377\233\377\377\377Z\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377b\377\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377)\377\377\377e\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377U\377\377" + "\377c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377b\377\377\377c\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377S\377\377\377c\377\377\377\065\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\213\377\377\377\363\377\377\377\364\377\377\377\364\377\377\377\372\377" + "\377\377\225\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "u\377\377\377\371\377\377\377\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377" + "\377\372\377\377\377\364\377\377\377\364\377\377\377\363\377\377\377\224" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377U\377\377\377e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\376\377\377\377" + "s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377\377\372" + "\377\377\377\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\367\377\377" + "\377\315\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377" + "\340\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\214\377\377\377\372\377\377\377\\\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377s\377\377\377\366\377\377\377\342\377\377\377" + "%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377" + "\372\377\377\377\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\306\377\377\377\374\377" + "\377\377\370\377\377\377\370\377\377\377\304\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377" + "\377\317\377\377\377\357\377\377\377\373\377\377\377\225\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\320" + "\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\215\377\377\377\372\377\377\377\363\377" + "\377\377\333\377\377\377m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\001\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\364\377\377\377\366\377\377\377%\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377" + "\377\361\377\377\377\377\377\377\377\254\377\377\377=\377\377\377\375\377" + "\377\377\372\377\377\377)\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\363\377\377\377%\377\377\377" + "\224\377\377\377\363\377\377\377%\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\062\377\377\377\336\377\377\377\375\377" + "\377\377x\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\262\377\377\377\372\377\377\377\370\377\377\377\246\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377=\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\377\377\377~\377\377\377\374\377\377\377\377\377\377" + "\377\376\377\377\377\224\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377V\377\377\377\375\377\377\377" + "\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\325\377\377\377\377" + "\377\377\377\271\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\355\377\377\377\033\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377v\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\315\377\377\377\367\377\377\377\373\377\377\377\334\377\377\377B\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377`\377\377\377\300\377\377\377\342\377\377\377Z\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\224\377\377" + "\377\347\377\377\377\373\377\377\377\364\377\377\377\312\377\377\377)\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\226\377\377\377\346\377\377\377\370\377\377\377\360\377\377\377\327\377" + "\377\377b\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377\377\377\343\377\377\377\273" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\315\377\377\377\337\377\377\377\333\377\377\377\333\377\377\377" + "\333\377\377\377\343\377\377\377\223\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\346\377\377\377" + "\370\377\377\377\364\377\377\377\320\377\377\377O\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\013\377\377\377\315\377\377\377\337\377\377\377" + "\333\377\377\377\333\377\377\377\333\377\377\377\333\377\377\377\333\377" + "\377\377\323\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\377\377\377\062\377\377\377\316\377\377\377\366\377\377\377\373\377\377" + "\377\344\377\377\377\200\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377u\377\377\377\342\377\377\377\370\377\377\377" + "\364\377\377\377\305\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377)\377\377\377\065\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\371\371\377.\377\377\377V\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\377\377\377\321\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\271\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377Q\377" + "\377\377\273\377\377\377\332\377\377\377\322\377\377\377\206\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\070\377\377\377\367\377\377\377\376\377\377\377s\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\360\377\377" + "\377\253\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\304\377\377\377\375\377\377\377\377\377\377\377" + "\377\377\377\377\373\377\377\377\247\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\374\377\377\377\324\377\377\377B\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\346\377\377\377\013\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\013\377\377\377\352\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\333\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\361\377\377\377\202\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\307\377\377\377" + "\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\352\377\377" + "\377\364\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377" + "\377\377\377\377\377\377\377\377\377\377\303\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\225" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\225\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\356\377" + "\377\377\376\377\377\377v\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\013\377\377\377\352\377\377\377\364\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\307\377\377\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377u\377\377" + "\377\375\377\377\377\321\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\307\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\330\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\366\377\377\377\377\377" + "\377\377\377\377\377\377\373\377\377\377\246\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\324\377" + "\377\377B\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\206\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\373" + "\377\377\377\240\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\364\377\377\377\312\377\377\377\033\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\365\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\342\377\377\377" + "V\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\252\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\307\377\377\377\376\377\377\377i\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\352\377\377\377\364\377\377\377%" + "\377\377\377\377\377\377\377\377\377\377\377}\377\377\377\376\377\377\377" + "\332\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\262\377\377\377\377\377" + "\377\377\216\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377" + "\372\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\355\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\345\377\377\377\376\377\377\377~\000\000\000\000\000\000\000\000\377\377\377\070" + "\377\377\377\367\377\377\377\360\377\377\377\033\377\377\377\377\377\377\377" + "\377\377\377\377\206\377\377\377\377\377\377\377\332\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\234\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\361\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\312\377\377\377\255" + "\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377;\377\377\377\373\377\377\377\347\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377`\377\377\377\266\377\377\377\263\377\377\377\256\377\377\377\373\377" + "\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\371\377\377\377\376\377\377" + "\377_\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377" + "\377\374\377\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\334\377\377\377\377\377\377\377\346\377\377\377\272\377" + "\377\377\342\377\377\377\276\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\215\377\377" + "\377\377\377\377\377\377\377\377\377l\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377" + "\377\377\377\377\377\377\377\377l\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\254\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\247\377\377\377\343\377\377\377\340\377\377\377\377\377" + "\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\262\377\377\377=\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\377\377" + "\377\377\325\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377`\377\377\377\263\377\377\377\307\377\377\377\376\377\377" + "\377\363\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\001\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\351\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\356\377" + "\377\377\377\377\377\377\243\377\377\377;\377\377\377\374\377\377\377\364" + "\377\377\377%\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\355\000\000\000\000\377\377\377\320\377\377\377" + "\346\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\247\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\352\377\377\377S\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377}\377\377\377\377\377\377\377\326\377\377\377\334\377\377\377" + "\376\377\377\377l\000\000\000\000\377\377\377}\377\377\377\377\377\377\377\323\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\354\377\377" + "\377\364\377\377\377\226\377\377\377\373\377\377\377\337\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\362\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\232\377\377\377\377\377\377\377\336\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\302\377" + "\377\377\377\377\377\377\277\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377|\377\377" + "\377\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377_\377\377\377\232\377\377\377" + "\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377!\377\377\377\371\377\377\377\352\377\377\377\013\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\345\377\377" + "\377\377\377\377\377\365\377\377\377\353\377\377\377\377\377\377\377\367" + "\377\377\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" + "l\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\314\377\377\377\377\377\377\377\376\377\377\377\335\377\377\377\371" + "\377\377\377\377\377\377\377\352\377\377\377\033\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\302\377\377\377\377\377\377\377\377\377" + "\377\377\342\377\377\377\362\377\377\377\377\377\377\377\375\377\377\377" + "\\\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377U\377\377\377\374\377\377\377\377\377\377\377\333\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377" + "\361\377\377\377\377\377\377\377\373\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\251\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\247\377\377\377\377\377\377\377\377\377\377\377" + "\360\377\377\377\373\377\377\377\377\377\377\377\360\377\377\377\033\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\332\377\377\377\377\377\377" + "\377\376\377\377\377\374\377\377\377\374\377\377\377\376\377\377\377\377" + "\377\377\377\367\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\025\377\377\377\356\377\377\377\377\377\377\377\351\377\377\377\350" + "\377\377\377\376\377\377\377\376\377\377\377s\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377|\377\377\377\376\377\377\377\377\377\377" + "\377\345\377\377\377\356\377\377\377\377\377\377\377\355\377\377\377%\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\374\377\377\377\254\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377V\377\377\377\375\377\377\377\241\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\070\377\377\377\372\377\377\377\343\377\377\377u\377\377\377\217" + "\377\377\377\374\377\377\377\375\377\377\377M\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\233\377\377\377\376\377\377\377" + "\377\377\377\377\354\377\377\377\375\377\377\377\377\377\377\377\257\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\232\377\377\377\377\377\377\377\377\377\377\377\277\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\342\377\377\377\304\377\377\377\332\377\377\377\376\377" + "\377\377\377\377\377\377\227\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\331\377\377\377\377\377\377\377\373\377\377\377" + "\306\377\377\377\307\377\377\377\375\377\377\377\376\377\377\377Q\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\377\377\377" + "\377\330\377\377\377\310\377\377\377\370\377\377\377\377\377\377\377\375" + "\377\377\377f\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\377\377\377\374\377\377\377\376\377\377\377\323\377\377\377\327\377\377" + "\377\327\377\377\377\327\377\377\377\316\377\377\377\033\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377\376\377\377" + "\377\324\377\377\377\327\377\377\377\327\377\377\377\327\377\377\377\312" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\033\377" + "\377\377\362\377\377\377\377\377\377\377\365\377\377\377\277\377\377\377" + "\321\377\377\377\377\377\377\377\366\377\377\377\033\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\356\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377}\377\377\377\332\377\377\377" + "\323\377\377\377\371\377\377\377\377\377\377\377\331\377\377\377\327\377" + "\377\377\266\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\013\377\377\377\302\377\377\377\323\377\377\377\322\377\377\377\322\377\377" + "\377\342\377\377\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\000\000\000\000\377\377\377\335\377\377\377\377\377\377\377\315\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\377\377\377\377\336" + "\000\000\000\000\000\000\000\000\377\377\377\275\377\377\377\377\377\377\377\330\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377" + "\377\377\377\364\377\377\377%\000\000\000\000\377\377\377\013\377\377\377\361\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "j\377\377\377\375\377\377\377\377\377\377\377\325\377\377\377\313\377\377" + "\377\376\377\377\377\377\377\377\377\225\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\342\377\377" + "\377\310\377\377\377\322\377\377\377\366\377\377\377\377\377\377\377\355" + "\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377j\377" + "\377\377\375\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377" + "\376\377\377\377\377\377\377\377\216\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377" + "\310\377\377\377\322\377\377\377\371\377\377\377\377\377\377\377\336\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\377\377\377\377\330\377\377\377\271\377\377\377\351\377\377" + "\377\377\377\377\377\334\000\000\000\000\377\377\377\377\377\377\377\377\377\377" + "\377}\377\377\377\332\377\377\377\327\377\377\377\323\377\377\377\371\377" + "\377\377\377\377\377\377\331\377\377\377\326\377\377\377\332\377\377\377" + "p\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377" + "\366\377\377\377%\377\377\377\377\377\377\377\377\377\377\377\033\377\377" + "\377\365\377\377\377\375\377\377\377\070\000\000\000\000\000\000\000\000\377\377\377\013\377" + "\377\377\345\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377" + "\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\361\377\377\377\347\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\214\377\377\377\377\377\377\377\343\000\000\000\000" + "\000\000\000\000\377\377\377\261\377\377\377\377\377\377\377\272\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377\013\377\377\377\351\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\366\377\377\377\372" + "\377\377\377\070\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377v\377" + "\377\377\327\377\377\377\322\377\377\377\322\377\377\377\316\377\377\377" + "\351\377\377\377\377\377\377\377\360\377\377\377\033\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377" + "\377U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\320\377\377\377\376\377\377\377_\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377\377\377\377\377\272\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\233\377\377\377" + "\371\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\377\377\377" + "\373\377\377\377\356\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377S\377\377\377\314\377\377\377\271\377\377\377\013\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377S\377\377\377\314\377\377\377\271\377\377\377\013\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\375" + "\377\377\377\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\360" + "\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\247\377\377\377\377\377\377\377l\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377" + "\377\337\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\372\377\377\377)\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377" + "\000\377\377\377\003\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\331\377\377\377\376\377\377\377i\377\377\377K\377\377\377" + "\374\377\377\377\366\377\377\377)\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\316\377\377\377\333\000\000\000\000\377\377" + "\377\316\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\070\377\377\377\372\377\377\377\377\377\377\377\307\377" + "\377\377\237\377\377\377\364\377\377\377\377\377\377\377\244\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\232\377\377\377\375\377\377\377" + "\062\377\377\377=\377\377\377\375\377\377\377\254\377\377\377!\377\377\377" + "\371\377\377\377\367\377\377\377\070\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377;\377\377\377\372\377\377\377\346\377\377\377\013\377\377\377" + "\371\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\375" + "\377\377\377\\\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\372\377\377\377\375\377\377\377" + "\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\327\377\377\377\343\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\320\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\204\377\377\377\377\377\377\377\353\377\377\377\013\000\000\000" + "\000\377\377\377\320\377\377\377\377\377\377\377\260\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\205\377\377\377\322\377\377" + "\377\353\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\325\377\377\377\375\377\377\377" + "M\000\000\000\000\377\377\377\033\377\377\377\356\377\377\377\376\377\377\377l\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377" + "\375\377\377\377Z\000\000\000\000\000\000\000\000\377\377\377\325\377\377\377\377\377\377" + "\377\257\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\025\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377" + "\326\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\377\377\377\374\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377!\377\377\377" + "\371\377\377\377\377\377\377\377\216\000\000\000\000\000\000\000\000\377\377\377\302\377" + "\377\377\224\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\302\377\377\377\377\377\377\377" + "\252\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377V\377\377" + "\377\375\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\260\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\330\377\377\377\377\377\377\377\251\000\000\000\000\377\377\377\013\377\377\377" + "\336\377\377\377\377\377\377\377\227\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\250\377\377\377\276\377" + "\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\250\377\377\377\276\377\377\377\033" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\276\377\377\377\377\377\377\377\377" + "\377\377\377\225\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377I\377\377\377\373\377\377\377" + "\377\377\377\377\325\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377)\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\306\377\377\377\376\377\377\377l\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\375\377" + "\377\377q\000\000\000\000\377\377\377\033\377\377\377\362\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\334\377\377\377\377\377\377\377\376\377\377\377\360\377\377\377\033\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377\223\377\377\377\377" + "\377\377\377\327\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377s\377\377\377\376\377\377\377\375\377\377\377_\000\000\000\000\000\000\000\000\377\377" + "\377z\377\377\377\257\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377U\000\000\000\000\377\377\377\033\377\377" + "\377\353\377\377\377\377\377\377\377\333\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\326\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377\033\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377\247\377\377\377\377\377\377\377\364\377\377\377)\000\000\000\000\000" + "\000\000\000\377\377\377\246\377\377\377\213\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377" + "\377\377\363\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\213" + "\377\377\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000\377\377" + "\377\270\377\377\377\377\377\377\377\355\377\377\377\033\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\375\377" + "\377\377\070\377\377\377\013\377\377\377\352\377\377\377\377\377\377\377\327" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\307\377\377" + "\377\377\377\377\377\377\377\377\377\251\000\000\000\000\377\377\377\013\377\377\377" + "\361\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\313\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\377\377\377" + "\253\377\377\377\377\377\377\377\346\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\243\000\000\000\000\000\000" + "\000\000\377\377\377\025\377\377\377\356\377\377\377\376\377\377\377l\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\377\377\377" + "\377\310\000\000\000\000\000\000\000\000\377\377\377\253\377\377\377\377\377\377\377\342" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\371\377" + "\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\302\377\377\377z\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377\377\377\363\377\377\377\013\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\312\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\347\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\247\377\377\377\377\377\377\377\206\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\333\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\376\377\377" + "\377v\377\377\377\033\377\377\377\366\377\377\377\367\377\377\377)\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377\377\377" + "\377\377\377\316\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377\377" + "\377\264\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\356\377\377\377\376\377\377\377" + "v\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\377" + "\377\377\377\277\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\370\377\377\377" + "\353\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377)\377\377\377" + "V\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377b\000\000\000\000\377\377\377" + "S\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377S\377\377\377I\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377S\377\377\377\065\377\377\377;\377\377\377\374\377\377" + "\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377)\377\377\377V\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377" + "\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377" + "\377E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\376\377\377\377b\000\000\000\000\377\377\377E\377" + "\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\252\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377)\377\377\377X\000\000\000\000\000\000\000\000\377\377\377V\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377E\377\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377K\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377S\377\377\377\065\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377S\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377)\377\377\377U\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377U\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\377\377\377\006\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\376\377\377\377l\377\377\377\033\377\377\377\364\377\377\377\352\377" + "\377\377\013\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\062" + "\377\377\377\274\377\377\377\361\377\377\377\375\377\377\377\265\377\377" + "\377\367\377\377\377\372\377\377\377\221\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377V\377\377\377\374\377\377\377\336\000\000\000\000\000\000" + "\000\000\377\377\377\065\377\377\377\261\377\377\377\013\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\232\377\377\377\371\377\377\377\033\377\377\377" + ";\377\377\377\374\377\377\377\217\377\377\377\335\377\377\377\375\377\377" + "\377\\\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\033\377" + "\377\377\371\377\377\377\333\377\377\377e\377\377\377\374\377\377\377\326" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\364\377\377\377%\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377b\377\377\377\375\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\266\377\377\377\377\377\377\377\227\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\316\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\375\377\377\377=\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\306\377\377" + "\377\377\377\377\377\225\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\375\377" + "\377\377\346\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\213\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\062\377\377\377" + "f\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\253\377\377\377\376\377\377\377i\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\231\377\377\377\377\377\377\377\257\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377" + "\377\377\377\377\377\377\356\377\377\377\374\377\377\377\332\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377" + "\377\377\375\377\377\377\347\377\377\377\013\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377U\377\377\377\375\377\377\377\266\000\000\000\000\000\000" + "\000\000\377\377\377;\377\377\377\374\377\377\377\236\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\025\377\377\377\361\377\377\377\367\377\377\377" + ")\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\376\377\377\377\322\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377" + "\377\377\377\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377" + "\377\377\377\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377G\377\377" + "\377\350\377\377\377\377\377\377\377\367\377\377\377y\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\207\377\377\377\307\377" + "\377\377\304\377\377\377\304\377\377\377\304\377\377\377\304\377\377\377" + "\304\377\377\377\243\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377S\377\377\377\351\377\377\377\377\377\377\377\365\377\377" + "\377n\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\345\377\377\377\376" + "\377\377\377_\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\273\377\377\377\377\377\377\377\234\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\232\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\344\377\377\377\317\377" + "\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000" + "\377\377\377X\377\377\377\375\377\377\377\327\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\300\377\377\377\377\377\377\377\277\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377Q\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\332\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377)" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\342\377\377\377\377\377\377\377\225\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\313\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\224\377\377\377\377\377\377\377\237\377\377\377\203\377\377" + "\377\377\377\377\377\375\377\377\377Q\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377" + "\217\377\377\377X\377\377\377\375\377\377\377\373\377\377\377\332\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\373" + "\377\377\377\371\377\377\377\366\377\377\377%\377\377\377\013\377\377\377" + "\361\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377" + "\033\377\377\377\362\377\377\377\375\377\377\377\\\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\366\377\377\377\375\377\377\377Q\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\306\377\377\377\375\377\377\377\\\377\377" + "\377\377\377\377\377\377\377\377\377\033\377\377\377\362\377\377\377\375\377" + "\377\377Q\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\371\377\377\377\375\377" + "\377\377M\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\370\377" + "\377\377\364\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377)\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\204\377\377\377\377\377\377\377\311\000\000\000\000\000\000\000\000\377\377\377" + "\224\377\377\377\377\377\377\377\260\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\222\377\377\377\377\377\377\377\252\000\000\000\000\377\377\377" + "\307\377\377\377\355\377\377\377%\377\377\377K\377\377\377\374\377\377\377" + "\260\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377l\377\377" + "\377\376\377\377\377\333\377\377\377\243\377\377\377\377\377\377\377\244" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\345\377\377\377\375\377\377\377M\377\377\377\013\377\377\377\351" + "\377\377\377\372\377\377\377)\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\377\377" + "\377\377\277\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\025\377\377\377\362\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377U\377\377\377" + "\374\377\377\377\316\377\377\377\247\377\377\377\377\377\377\377\206\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\216\377\377\377\345\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377\275\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\376\377\377\377\271\377\377\377\364\377" + "\377\377\377\377\377\377\377\377\377\377\313\377\377\377\013\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\272\377" + "\377\377\371\377\377\377\377\377\377\377\377\377\377\377\355\377\377\377" + "\200\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "}\377\377\377\361\377\377\377\377\377\377\377\377\377\377\377\325\377\377" + "\377\377\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377\065\377\377\377\327\377\377\377\377\377\377\377\377\377" + "\377\377\376\377\377\377\267\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\205\377\377\377\361\377\377\377\363\377\377\377" + "\377\377\377\377\374\377\377\377\364\377\377\377\367\377\377\377\354\377" + "\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377b\377" + "\377\377\350\377\377\377\377\377\377\377\377\377\377\377\360\377\377\377" + "\360\377\377\377\375\377\377\377\243\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\376\377\377\377\215\377\377\377\350\377" + "\377\377\377\377\377\377\377\377\377\377\346\377\377\377\062\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\301\377\377\377\370\377\377" + "\377\364\377\377\377\364\377\377\377\360\377\377\377\350\377\377\377%\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\301\377" + "\377\377\370\377\377\377\364\377\377\377\364\377\377\377\360\377\377\377" + "\350\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377K\377\377\377\375\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377" + "S\377\377\377\354\377\377\377\363\377\377\377I\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377" + "\377\013\377\377\377\342\377\377\377\332\377\377\377\374\377\377\377\377\377" + "\377\377\276\377\377\377\353\377\377\377\377\377\377\377\352\377\377\377" + ")\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377\377\371" + "\377\377\377\212\377\377\377\350\377\377\377\377\377\377\377\377\377\377" + "\377\346\377\377\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\377\377\377u\377\377\377\351\377\377\377\377\377\377\377\377\377\377" + "\377\364\377\377\377\222\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\213\377\377\377\371\377\377\377\262\377\377\377\365" + "\377\377\377\377\377\377\377\377\377\377\377\313\377\377\377\013\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\361" + "\377\377\377\377\377\377\377\377\377\377\377\310\377\377\377\347\377\377" + "\377\315\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\301\377\377\377\351\377\377\377)\377\377\377\326\377\377\377\377\377" + "\377\377\377\377\377\377\372\377\377\377M\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\365\377\377\377\377\377\377" + "\377\377\377\377\377\373\377\377\377\300\377\377\377=\000\000\000\000\377\377\377" + "\377\377\377\377\377\377\377\377\013\377\377\377\332\377\377\377\360\377\377" + "\377\373\377\377\377\377\377\377\377\376\377\377\377\364\377\377\377\367" + "\377\377\377\354\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\301\377\377\377\354\377\377\377\062\000\000\000\000\000\000\000\000\377\377\377I" + "\377\377\377\364\377\377\377\275\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377I\377\377\377\364\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\267\377\377\377\367\377\377\377\\\377\377\377\377\377\377" + "\377\377\377\377\377\335\377\377\377\360\377\377\377\070\000\000\000\000\377\377\377" + "~\377\377\377\224\000\000\000\000\377\377\377\013\377\377\377\332\377\377\377\342" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\275\377\377\377\373" + "\377\377\377\255\000\000\000\000\000\000\000\000\377\377\377r\377\377\377\370\377\377\377" + "\315\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377I\377\377\377\364" + "\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\254\377\377" + "\377\367\377\377\377\\\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\377\377\377\365\377\377\377\364\377\377\377\364\377\377\377\364\377\377" + "\377\360\377\377\377\360\377\377\377\354\377\377\377%\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377" + "\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377" + "\000\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\372\377\377" + "\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\306\377\377\377\375\377\377\377\070\377\377\377\013\377\377" + "\377\364\377\377\377\334\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377K\377\377\377\364\377\377\377\376\377\377\377\370\377" + "\377\377\364\377\377\377\376\377\377\377\374\377\377\377\320\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\377\377\377\372\377\377" + "\377\376\377\377\377\307\377\377\377O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\223\377\377\377\377\377\377\377" + "\234\377\377\377\243\377\377\377\376\377\377\377\217\377\377\377\373\377" + "\377\377v\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\377\377\377\331\377\377\377\377\377\377\377\377\377\377\377\367\377\377" + "\377\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\323\377\377\377\374\377\377\377)\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\245\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377V\377\377\377\375\377\377\377\322\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\260\377\377\377\354\377" + "\377\377\236\377\377\377\326\377\377\377\361\377\377\377\224\377\377\377" + "\341\377\377\377\314\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\325\377\377\377\374\377\377\377\062\377\377" + "\377\215\377\377\377\241\377\377\377\013\377\377\377\361\377\377\377\367\377" + "\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\307\377\377\377\376\377\377\377l\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\200" + "\377\377\377\363\377\377\377\376\377\377\377s\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\240\377\377\377\377\377\377\377" + "\363\377\377\377V\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377" + "\333\377\377\377\274\377\377\377\310\377\377\377\251\377\377\377=\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\314\377\377" + "\377\376\377\377\377l\377\377\377j\377\377\377\237\377\377\377\223\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\376\377\377\377i\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\377\377\377" + "\372\377\377\377\376\377\377\377\237\000\000\000\000\377\377\377\254\377\377\377" + "\377\377\377\377\243\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377" + "\025\377\377\377\361\377\377\377\366\377\377\377\033\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\366\377\377\377\355\377\377\377\033\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377" + "\377\377\377\377\377\377\323\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377" + "\377\377\377\377\377\377\323\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\374\377\377\377" + "\377\377\377\377\314\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\274\377\377\377\377\377\377\377\370" + "\377\377\377\370\377\377\377\370\377\377\377\370\377\377\377\373\377\377" + "\377\321\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\264\377\377\377\377\377\377\377\377\377\377\377\262" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\337\377\377\377\377\377\377\377\271\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\025\377\377\377" + "\361\377\377\377\352\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377U\377\377\377\237" + "\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\232\377\377\377\377\377\377\377\266\377\377\377\213\377" + "\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\265\377\377\377" + "E\377\377\377y\377\377\377\337\377\377\377\377\377\377\377\227\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\352\377\377\377\375" + "\377\377\377Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\324\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377" + "\377\337\377\377\377Z\377\377\377p\377\377\377p\377\377\377f\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\065\377\377\377\371\377\377\377\367" + "\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377" + "\224\377\377\377m\377\377\377v\377\377\377h\377\377\377\362\377\377\377\366" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\300\377\377\377\372\377\377\377\377\377\377\377\236\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377" + "\377\370\377\377\377\366\377\377\377\317\377\377\377\243\377\377\377\376" + "\377\377\377\372\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\367\377\377\377\304\377\377\377\377" + "\377\377\377\251\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\343" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\314\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\243\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377" + "\376\377\377\377l\377\377\377\377\377\377\377\377\377\377\377U\377\377\377" + "\374\377\377\377\336\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377" + "\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\224\377\377\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377`\377" + "\377\377\373\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377`\377\377\377\374\377\377\377\377\377\377\377\336\377" + "\377\377\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\033\377\377\377\371\377\377\377\360\377\377" + "\377\033\000\000\000\000\377\377\377\320\377\377\377\376\377\377\377_\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377U\377\377\377\375\377\377\377\277" + "\377\377\377\033\377\377\377\366\377\377\377\376\377\377\377m\377\377\377" + "\213\377\377\377\377\377\377\377\243\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\324\377\377\377\377\377\377\377\377\377" + "\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\377\377\377\377\304\377\377" + "\377\204\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377\377" + "\377\377\377\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\206" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\266\377\377\377\377\377\377\377\207\377\377\377K\377\377\377\374" + "\377\377\377\327\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377}\377\377\377\377\377\377\377\373\377\377\377\313\377" + "\377\377\303\377\377\377\374\377\377\377\377\377\377\377\252\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\377\377\377\377\351\377\377\377\300\377\377\377\365\377\377\377" + "\377\377\377\377\316\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\013\377\377\377\346\377\377\377\377\377\377\377\365\377\377\377\305" + "\377\377\377\315\377\377\377\376\377\377\377\366\377\377\377\033\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377" + "\377\377\377\325\377\377\377\321\377\377\377\376\377\377\377\377\377\377" + "\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\377" + "\377\377\371\377\377\377\377\377\377\377\335\377\377\377\263\377\377\377" + "\351\377\377\377\377\377\377\377\304\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377S\377\377\377\330\377\377\377\343\377\377\377\377" + "\377\377\377\364\377\377\377\327\377\377\377\333\377\377\377\322\377\377" + "\377\033\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\377\377\377" + "\372\377\377\377\376\377\377\377\275\377\377\377\307\377\377\377\376\377" + "\377\377\377\377\377\377\324\377\377\377y\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\370" + "\377\377\377\306\377\377\377\356\377\377\377\377\377\377\377\322\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\336" + "\377\377\377\333\377\377\377\327\377\377\377\377\377\377\377\366\377\377" + "\377)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\336\377\377\377\333\377\377\377\327\377\377\377\377\377" + "\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\252\000\000\000\000\377\377\377" + "`\377\377\377\373\377\377\377\377\377\377\377\242\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377" + "\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\013\377\377\377\355\377\377\377\377\377\377\377\346\377\377" + "\377\362\377\377\377\377\377\377\377\362\377\377\377\347\377\377\377\377" + "\377\377\377\215\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\306\377\377" + "\377\356\377\377\377\377\377\377\377\322\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377u\377\377\377\376\377\377\377\377\377\377\377" + "\321\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\243\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\377\377\377\377\352\377\377\377\300\377\377\377\365\377" + "\377\377\377\377\377\377\316\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377}\377\377\377\376\377\377\377\377\377\377\377\325\377\377" + "\377\321\377\377\377\376\377\377\377\377\377\377\377\332\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377\366\377\377\377\377\377\377\377\335\377\377\377\322\377\377" + "\377\343\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "u\377\377\377\377\377\377\377\370\377\377\377\277\377\377\377\262\377\377" + "\377\346\377\377\377\377\377\377\377\231\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\013\377\377\377\315\377\377\377\330\377\377\377\370\377" + "\377\377\377\377\377\377\335\377\377\377\327\377\377\377\333\377\377\377" + "\322\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\341\377\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377!\377\377" + "\377\371\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\377" + "\377\377\313\377\377\377\377\377\377\377\205\377\377\377\013\377\377\377\364" + "\377\377\377\376\377\377\377Q\377\377\377!\377\377\377\371\377\377\377\352" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377I\377\377\377\372\377" + "\377\377\376\377\377\377v\377\377\377\033\377\377\377\362\377\377\377\376" + "\377\377\377}\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\335\377\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377\033\377\377" + "\377\364\377\377\377\372\377\377\377\062\377\377\377\377\377\377\377\377\000" + "\000\000\000\377\377\377\065\377\377\377\323\377\377\377\333\377\377\377\333\377" + "\377\377\327\377\377\377\377\377\377\377\377\377\377\377\326\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\320\377\377\377\355\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377" + "\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\377\377\377}\377\377\377\313\377\377\377\257\377\377\377\013\000" + "\000\000\000\377\377\377\223\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\316\377\377\377\352\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377z\377" + "\377\377\325\377\377\377\033\377\377\377\013\377\377\377\314\377\377\377\267" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377!\377\377\377\373\377\377\377\211\377\377\377!\377\377\377\374\377\377" + "\377\200\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\377\377\377\205\377\377\377\370\377\377\377\377\377\377\377\377\377\377" + "\377\345\377\377\377\200\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377\013\377\377\377\333\377\377\377\377\377\377\377\377\377\377\377" + "\321\000\000\000\000\377\377\377r\377\377\377z\377\377\377%\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\025\377\377\377\337\377\377\377\377\377" + "\377\377\375\377\377\377\070\000\000\000\000\377\377\377U\377\377\377\365\377\377" + "\377\256\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\255\377\377\377\275\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\314\377\377" + "\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\371" + "\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377~\377\377\377\347\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\361\377\377\377\227\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\261\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\377\377\377\025\377\377\377\361\377\377\377\363\377\377" + "\377E\377\377\377\375\377\377\377\377\377\377\377V\377\377\377\324\377\377" + "\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377j\377\377\377\375\377\377\377\361\377\377\377%\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\215\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377b\377\377\377" + "\374\377\377\377\375\377\377\377Q\377\377\377K\377\377\377\374\377\377\377" + "\332\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\377\377\377\375\377\377\377\377\377\377\377\374\377\377\377\376\377\377" + "\377\377\377\377\377\375\377\377\377s\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377\360\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\213\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377}\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\333\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\321\377\377" + "\377\377\377\377\377\315\377\377\377q\377\377\377\221\377\377\377\363\377" + "\377\377\377\377\377\377\364\377\377\377)\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377G\377\377\377\330\377\377\377\343\377" + "\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377G\377\377\377\330\377\377\377\343\377\377\377" + "c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377V\377\377\377\375\377\377\377\376\377\377\377\214\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "U\377\377\377\374\377\377\377\377\377\377\377m\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\330\377\377\377" + "\377\377\377\377\271\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377U\377\377\377\375\377\377\377\252\000\000\000\000\377\377\377\233" + "\377\377\377\366\377\377\377\377\377\377\377\377\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\334\377" + "\377\377\376\377\377\377U\377\377\377!\377\377\377\371\377\377\377\363\377" + "\377\377%\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\371\377\377\377)\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377)\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377l\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377K\377" + "\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\247\377\377\377" + "\327\377\377\377\322\377\377\377\300\377\377\377\013\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\364" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\332\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377" + "\377\363\377\377\377\301\377\377\377\373\377\377\377\356\377\377\377\333" + "\377\377\377\352\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377w\377\377\377\371\377" + "\377\377\366\377\377\377!\377\377\377\360\377\377\377\333\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377K\377\377\377\374\377\377\377\327\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377" + "\251\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\326\377\377\377\247\377\377\377\262\377\377\377\351\377" + "\377\377\377\377\377\377\355\377\377\377\033\377\377\377\377\377\377\377\377" + "\377\377\377K\377\377\377\374\377\377\377\343\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\356\377\377" + "\377\340\377\377\377\343\377\377\377\376\377\377\377\377\377\377\377\304" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377}\377" + "\377\377\365\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377" + "\247\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377\321\377\377\377\376\377\377\377i\377\377\377\033\377" + "\377\377\365\377\377\377\355\377\377\377\013\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\070\377\377\377\372\377\377\377\327\377\377\377c\377" + "\377\377\377\377\377\377\377\377\377\377\271\377\377\377\205\377\377\377" + "\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377l\377\377\377\377\377\377\377\377\377\377\377\226\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\344\377\377\377\376\377\377\377\372\377\377\377\367\377\377\377" + ")\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377!\377\377\377\371\377\377\377\376\377\377\377i\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377V\377\377" + "\377\375\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\033\377\377\377\364\377\377\377\363\377\377\377%" + "\000\000\000\000\377\377\377\335\377\377\377\375\377\377\377M\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\177\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\205\377\377\377\376\377\377\377\333\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\257\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\372" + "\377\377\377\070\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\247\377" + "\377\377\377\377\377\377\345\377\377\377\033\000\000\000\000\000\000\000\000\377\377\377O" + "\377\377\377X\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\351\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377" + "b\377\377\377\375\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\306\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\344\377\377\377\372\377\377\377)\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377%\377\377\377\374\377\377" + "\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\264\000\000\000\000\000\000\000\000" + "\377\377\377\335\377\377\377\376\377\377\377Q\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\325\377" + "\377\377\013\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\363\377\377" + "\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\354\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\354\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\237\377\377" + "\377j\377\377\377\374\377\377\377\376\377\377\377\214\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\361\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\013\377\377\377\361\377\377\377\352\000\000\000\000\377" + "\377\377\306\377\377\377\375\377\377\377=\377\377\377\211\377\377\377\377" + "\377\377\377\252\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\325\377\377\377\013\000\000\000\000\377\377\377;\377" + "\377\377\373\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377" + "\377\377\377\013\377\377\377\351\377\377\377\377\377\377\377\243\000\000\000\000\000" + "\000\000\000\377\377\377r\377\377\377\375\377\377\377\363\377\377\377%\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\257\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\372\377" + "\377\377\070\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\351" + "\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377b\377\377\377" + "\375\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\312\377\377\377\377\377\377\377\372\377\377\377f\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\224\377\377\377\377\377\377\377\333\377\377\377\013\000\000\000\000\000\000\000\000\377" + "\377\377S\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\306\377\377\377\376\377\377\377U\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\204\377\377\377\377\377\377\377\322\000\000\000\000\000\000\000\000\377\377\377\241\377" + "\377\377\377\377\377\377\264\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377\224\377\377\377\377\377\377\377\266\377\377\377;\377\377\377\374" + "\377\377\377\377\377\377\377\226\377\377\377l\377\377\377\377\377\377\377" + "\300\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377u\377\377" + "\377\376\377\377\377\361\377\377\377\325\377\377\377\377\377\377\377\252" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377s\377" + "\377\377\377\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377" + "\377\377\377\377\277\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\314\377\377\377\377\377\377\377" + "\333\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377E\377\377\377\217\377\377\377\373\377\377\377\343\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377\247\377\377\377I\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377\245\377\377" + "\377\372\377\377\377\355\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\324\377\377\377\343\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\205\377\377\377\271\377\377\377\376\377\377\377\303\377" + "\377\377\262\377\377\377\377\377\377\377\315\377\377\377l\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\220" + "\377\377\377\341\377\377\377\377\377\377\377\377\377\377\377\233\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\257\377\377\377)\377\377\377\313\377\377\377\377\377\377\377\377\377\377" + "\377\375\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\342\377\377\377\377\377\377\377\373\377\377\377\377\377\377\377" + "\265\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\215\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\360\377\377\377\333\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\261\377\377\377\377\377\377\377\377\377\377\377\332\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377`\377\377\377\262" + "\377\377\377\251\377\377\377\354\377\377\377\373\377\377\377\261\377\377" + "\377\262\377\377\377\224\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377v\377\377\377\263\377" + "\377\377\255\377\377\377\255\377\377\377\255\377\377\377\255\377\377\377" + "\263\377\377\377\224\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\356\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\377\377\377\013\377\377\377\356\377\377\377\363\371\371" + "\377.\377\377\377\362\377\377\377\375\377\377\377B\377\377\377\335\377\377" + "\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377U\377\377\377\373\377\377\377\376\377\377\377s\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\205" + "\377\377\377\271\377\377\377\332\377\377\377\377\377\377\377\373\377\377" + "\377r\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\033\377\377\377" + "\362\377\377\377\377\377\377\377\242\377\377\377E\377\377\377x\377\377\377" + "\374\377\377\377\336\377\377\377K\377\377\377\013\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377\216\377\377\377]\000\000\000\000\000\000\000\000\377" + "\377\377\251\377\377\377\377\377\377\377\333\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377\356\377" + "\377\377v\000\000\000\000\377\377\377\220\377\377\377\374\377\377\377\363\377\377" + "\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\324\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377j\377\377\377\374\377\377\377" + "\367\377\377\377\260\377\377\377\342\377\377\377\377\377\377\377\376\377" + "\377\377\224\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\065\377\377\377\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\343\377\377\377\374\377\377\377\360\377\377\377%\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\025\377\377\377\337\377\377\377\377" + "\377\377\377\361\377\377\377\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377b\377\377\377\232\377\377\377" + "\232\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377\232\377" + "\377\377}\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377_\377\377\377\345\377\377\377\377\377\377\377\361\377" + "\377\377\070\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377V\377\377\377\376\377\377\377\344\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377\377" + "\377\245\377\377\377l\377\377\377\377\377\377\377\344\377\377\377v\377\377" + "\377;\377\377\377\375\377\377\377l\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377;\377\377\377\373\377\377\377\376\377\377\377\301\377\377\377" + "\271\377\377\377\374\377\377\377\376\377\377\377v\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\304" + "\377\377\377e\377\377\377x\377\377\377\300\377\377\377\376\377\377\377\367" + "\377\377\377)\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\361\377\377\377\367\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377" + "\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377" + "\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\343\377\377\377|\377\377\377\202\377\377\377\211" + "\377\377\377\202\377\377\377\013\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\377\377\377\013\377\377\377\355\377\377\377\373\377\377\377\300\377" + "\377\377\276\377\377\377\276\377\377\377\302\377\377\377G\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\352\377" + "\377\377\013\000\000\000\000\377\377\377\307\377\377\377\374\377\377\377\377\377\377" + "\377\372\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\313\377\377\377\376\377\377\377\240\377\377\377\200\377\377\377\210\377" + "\377\377\202\377\377\377\371\377\377\377\366\377\377\377%\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377" + "\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\311" + "\377\377\377\343\377\377\377\377\377\377\377\225\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\366\377\377\377]\377" + "\377\377\375\377\377\377\377\377\377\377\211\377\377\377\354\377\377\377" + "\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377V\377\377\377\252\377\377\377\377\377\377\377\244" + "\377\377\377\354\377\377\377\334\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377U\377\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\307\377\377\377\376\377\377\377\177\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\374\377\377\377\324\377\377\377" + ")\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377U\377\377\377\374\377" + "\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377" + "\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\365\377\377\377\357\377\377\377\377\377\377" + "\377\377\377\377\377\224\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\210\377\377\377\335\377\377" + "\377\377\377\377\377\377\377\377\377\315\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377)\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\377\377\377" + "\377\254\377\377\377c\377\377\377\377\377\377\377\273\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361\377\377\377\340" + "\377\377\377\277\377\377\377\367\377\377\377\351\377\377\377\352\377\377" + "\377\300\377\377\377\375\377\377\377I\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\377\377" + "\377\377\335\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377\377\377" + "\377\252\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\325\377\377\377\377\377\377\377\264\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\342\377\377\377\375\377\377\377\070\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377I\377\377\377\340\377\377\377\240" + "\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\341\377\377\377Z\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377Q\377\377\377" + "\306\377\377\377\366\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\320" + "\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\317\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\356\377\377\377\372\377\377\377)\000\000\000\000\000\000\000\000\377\377\377K\377\377\377" + "\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377" + "\013\377\377\377\351\377\377\377\377\377\377\377\361\377\377\377\354\377\377" + "\377\354\377\377\377\354\377\377\377\376\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377" + "\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377\377\377\377\377\311" + "\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\376\377\377\377i\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377_\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\377\377\377\374\377\377\377\377\377\377\377\311\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361\377" + "\377\377\333\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\377\377" + "\377\224\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377_\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377)\377\377\377\377" + "\377\377\377\377\377\377\377\013\377\377\377\356\377\377\377\372\377\377\377" + ")\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\345\377\377\377\376\377\377\377i\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\321\377\377\377\376\377\377" + "\377l\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\356\377" + "\377\377\372\377\377\377)\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\377\377\377\377\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377" + "\377\333\377\377\377\377\377\377\377\377\377\377\377\354\377\377\377\300" + "\377\377\377\\\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\375\377\377\377M\377\377\377\013\377\377" + "\377\355\377\377\377\375\377\377\377=\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377U\377\377\377\374\377\377\377\333\377\377\377\217\377\377" + "\377\373\377\377\377\361\377\377\377\312\377\377\377\241\377\377\377\377" + "\377\377\377\215\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\253\377\377\377\377\377\377\377\377\377\377\377\315\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\335\377\377\377\376\377\377\377i\000\000\000\000\377\377\377\342\377\377\377" + "\375\377\377\377Q\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\315\377\377\377\377\377\377\377\342\377\377" + "\377\013\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "V\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\252\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377c\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377l\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\360\377\377\377\033\377\377\377\205\377\377\377\365\377\377\377\377" + "\377\377\377\364\377\377\377\\\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377|\377\377\377\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\370\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\244\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\205\377\377\377\376\377\377\377\336\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\302\377\377\377\377\377" + "\377\377\242\377\377\377\374\377\377\377\264\377\377\377\033\377\377\377\371" + "\377\377\377\316\377\377\377\377\377\377\377\377\377\377\377b\377\377\377" + "\376\377\377\377\326\377\377\377\025\377\377\377\362\377\377\377\377\377\377" + "\377\304\377\377\377\372\377\377\377\360\377\377\377\033\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\317\377\377\377\376\377\377\377_\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\361\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\374" + "\377\377\377\343\377\377\377\313\377\377\377\377\377\377\377\215\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\306\377\377\377\371\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377s\377\377\377\377\377\377\377\304" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\320\377\377\377\375\377\377\377=\000\000\000\000\000\000\000\000\377\377\377" + "\025\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376" + "\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377l\377\377\377\373\377\377\377\376\377\377" + "\377\214\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\377" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\224" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377m\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\033\377\377\377\366\377\377\377\367\377\377\377)\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\317\377\377\377\376\377\377" + "\377e\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\330\377\377\377\371\377\377\377" + ")\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\033" + "\377\377\377\365\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\351\377\377\377\375" + "\377\377\377=\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\374\377\377\377\366" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377U\377\377\377p\377\377\377M\377\377\377!\377\377\377\373\377\377" + "\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\234\377\377\377\374\377\377\377\377\377\377\377\320" + "\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\320\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\337\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\271\377\377\377" + "\377\377\377\377\377\377\377\377\267\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\251" + "\377\377\377V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377K\377\377\377\374\377\377\377\245\377\377\377|\377\377\377" + "\377\377\377\377y\000\000\000\000\377\377\377\247\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\240\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377" + "\377\377\377\377\304\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\334\377\377\377\377\377\377\377\205\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\327\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377\033\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377" + "\377\025\377\377\377\362\377\377\377\375\377\377\377=\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\371\377\377\377%\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377b\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\224\377\377\377\377\377\377\377\257\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\331\000\000\000\000" + "\377\377\377j\377\377\377\376\377\377\377\366\377\377\377)\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377\033\377" + "\377\377\351\377\377\377\371\377\377\377!\377\377\377\360\377\377\377\333" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377" + "\377\376\377\377\377i\377\377\377\033\377\377\377\365\377\377\377\365\377" + "\377\377\361\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377K\377\377\377\374\377\377\377\364\377\377\377%\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\340\377\377\377\376\377\377\377l\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\257\000\000\000\000" + "\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377I\377\377\377\373\377\377\377\363\377\377\377%\000\000\000\000\000" + "\000\000\000\377\377\377\013\377\377\377\345\377\377\377\376\377\377\377i\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\243\000\000\000\000\377\377\377\330\377\377\377\377\377\377\377\257\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377l\377\377\377\373\377\377\377\375\377\377\377" + "M\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013" + "\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377" + "\377\377b\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\355" + "\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "!\377\377\377\372\377\377\377\337\377\377\377\257\377\377\377\376\377\377" + "\377l\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\324\377\377\377\370\377\377\377\360\377\377\377\323\377\377\377\255\377" + "\377\377\375\377\377\377\333\377\377\377\371\377\377\377%\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377l\377\377\377\376\377\377\377" + "\337\377\377\377\326\377\377\377\377\377\377\377\234\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\356\377\377\377\372\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377" + "\377\377\346\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377\377" + "\377\244\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377\376\377" + "\377\377\376\377\377\377\313\377\377\377\224\377\377\377\202\377\377\377" + "\374\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\324\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\314\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\355\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377\013\377\377\377\352\377\377\377\377\377\377\377\321\377\377\377\321" + "\377\377\377\316\377\377\377\322\377\377\377\316\377\377\377\315\377\377" + "\377G\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "K\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377" + "\377\377\377\377\362\377\377\377\366\377\377\377\377\377\377\377\326\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\377\377\377\377\370\377\377\377\366\377\377\377" + "\376\377\377\377\214\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013" + "\377\377\377\361\377\377\377\333\000\000\000\000\377\377\377\313\377\377\377\371" + "\377\377\377%\377\377\377\223\377\377\377\377\377\377\377\252\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\355\377" + "\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377" + "\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\324" + "\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\377\377\377" + "\013\377\377\377\355\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377u\377\377\377\302\377\377\377\357\377\377\377" + "\377\377\377\377\377\377\377\377\276\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377" + ";\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\240\377\377\377\377\377\377\377\266\377\377" + "\377s\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\377\377\377\025\377\377\377\361\377\377\377\361\377\377\377\320" + "\377\377\377\344\377\377\377\303\377\377\377\356\377\377\377\316\377\377" + "\377\375\377\377\377M\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\275\377\377\377\377\377\377\377\377\377\377\377\314\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377v\377\377\377\377\377\377\377\321\377\377\377M\377\377\377\375\377" + "\377\377\327\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\346\377\377\377" + "\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\377\377\377b\377\377\377\237\377\377\377\374\377\377\377\336\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\313\377\377\377\376\377\377\377\263\377\377\377f\377\377\377" + "\013\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\371\371\377." + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377B\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\304\377\377" + "\377\322\377\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\214\377\377\377\374\377\377\377\033\377\377\377\222\377\377\377\374\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\247\377\377\377\377\377\377\377\302\377\377\377\\\377\377\377\062\377\377" + "\377\264\377\377\377\377\377\377\377\326\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\315\377\377\377\377\377\377\377\257\377\377" + "\377;\377\377\377\375\377\377\377b\377\377\377\013\377\377\377\360\377\377" + "\377\337\377\377\377\377\377\377\377\377\377\377\377\204\377\377\377\377" + "\377\377\377\322\000\000\000\000\377\377\377\033\377\377\377\356\377\377\377\377\377" + "\377\377\377\377\377\377\217\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\247\377\377\377\377\377\377\377\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "V\377\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\374\377\377" + "\377\070\377\377\377\013\377\377\377\351\377\377\377\366\377\377\377\033\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\324\377\377\377\374\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377" + "\347\377\377\377\367\377\377\377\232\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377_\377\377\377\355\377\377\377\367\377\377\377}\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\261\377\377" + "\377\377\377\377\377\257\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\377" + "\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\213\377\377\377\376\377\377\377U\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\224\377\377\377\375\377\377\377\373\377\377\377s\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377" + "\377}\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\376\377\377\377\333" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377~\377\377\377" + "\202\377\377\377\202\377\377\377\201\377\377\377\231\377\377\377\377\377" + "\377\377\343\377\377\377z\377\377\377\033\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\205\377\377\377j\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "}\377\377\377\376\377\377\377\343\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\255\377\377\377\377\377\377\377\264\000\000\000\000\000\000\000\000" + "\377\377\377\025\377\377\377\356\377\377\377\372\377\377\377)\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\013\377\377\377\356\377\377\377\375\377\377\377)\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377\377\377\367\377\377\377)\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\065\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\377\377\377\377\257\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377_\377\377\377\355" + "\377\377\377\367\377\377\377}\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\347\377\377" + "\377\367\377\377\377\232\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\062\377\377\377\327\377" + "\377\377\377\377\377\377\375\377\377\377z\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\065\377" + "\377\377\362\377\377\377\377\377\377\377\346\377\377\377V\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377S\377\377\377\320\377\377\377\305\377\377\377%\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377" + "\377\377\252\377\377\377K\377\377\377\374\377\377\377\376\377\377\377\363" + "\377\377\377\377\377\377\377\377\377\377\377l\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\335\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000" + "\377\377\377;\377\377\377\373\377\377\377\363\377\377\377%\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\243" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\343\377\377\377\376\377\377\377" + "l\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\232\377\377\377\377" + "\377\377\377\356\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377" + "\260\377\377\377\013\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377U\000\000\000\000\000\000\000\000\377\377\377\276\377\377\377" + "\377\377\377\377\346\377\377\377\013\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377K\377\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312" + "\377\377\377\377\377\377\377\321\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313" + "\377\377\377\371\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013" + "\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377\377\377\366\377" + "\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377j\377\377\377\330\377\377\377%\000\000\000\000\000\000\000\000\377\377\377" + "\312\377\377\377\377\377\377\377\206\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\244\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\377\377\377\377\277\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\377\377" + "\377]\377\377\377f\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377i\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\377\377" + "\377\377\327\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\334\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377}\377\377" + "\377\376\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\332\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\377\377\377" + "\214\377\377\377\377\377\377\377\355\377\377\377\013\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377Q\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\205\377\377\377\304\377\377" + "\377\013\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\362\377\377\377\375\377" + "\377\377Q\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377" + "\377\377\377\377\264\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377" + "\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\330\377\377\377\376\377\377\377\372\377\377\377\360\377\377" + "\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\305\377\377\377\377\377\377\377\377\377\377\377\237\377\377\377l\377\377" + "\377\376\377\377\377\377\377\377\377\336\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\376\377\377\377" + "l\377\377\377K\377\377\377\374\377\377\377\372\377\377\377\062\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\372" + "\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\372\377\377\377" + "\347\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377" + "\377b\000\000\000\000\000\000\000\000\377\377\377b\377\377\377\375\377\377\377\332\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377~\000\000\000\000\000\000\000\000\377\377\377U\377\377\377\374\377\377\377\366" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\266\377" + "\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377e\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\355\377\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377s\377\377\377" + "\376\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\317\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377K\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377j\377\377\377" + "\375\377\377\377\326\377\377\377\302\377\377\377\304\377\377\377\206\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\377\377\377\374\377\377\377\361\377\377\377=\377\377\377V\377\377\377\374" + "\377\377\377\375\377\377\377M\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\355\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013" + "\377\377\377\361\377\377\377\333\000\000\000\000\377\377\377\313\377\377\377\371" + "\377\377\377%\377\377\377\223\377\377\377\377\377\377\377\252\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\355\377" + "\377\377\376\377\377\377\215\000\000\000\000\000\000\000\000\377\377\377V\377\377\377\374" + "\377\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377~\000\000\000\000\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377" + "\377\377\377\013\377\377\377\355\377\377\377\376\377\377\377v\000\000\000\000\000\000" + "\000\000\377\377\377s\377\377\377\375\377\377\377\332\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377" + "\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\062\377\377\377n\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377`\377\377\377\373\377\377\377\366\377\377\377)\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\376\377\377" + "\377v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\314\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\377\377" + "\377\254\377\377\377\377\377\377\377\332\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\366\377\377\377\361\377" + "\377\377\331\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\320\377\377\377\377\377\377\377\377" + "\377\377\377\273\377\377\377\205\377\377\377\377\377\377\377\376\377\377" + "\377\355\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377\336\377\377\377\330\377\377\377" + "\377\377\377\377\256\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\375\377\377\377\326\377" + "\377\377\376\377\377\377~\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\275\377\377\377\377\377\377\377\345\377\377" + "\377\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\323\377\377\377\360\377\377\377" + "\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\371\377\377\377\033\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\001\377\377\377\000\377\377\377\000\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\377\377\377\377\377\377\377" + "\377\260\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\360\377\377\377\013\377\377\377\316\377\377\377\352\377\377\377\013\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\205\377" + "\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\356\377\377\377\070\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377\224\377\377\377\377\377\377\377\311\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\316\377\377\377y\377\377\377\374\377\377\377\273" + "\377\377\377\377\377\377\377\377\377\377\377!\377\377\377\371\377\377\377" + "\377\377\377\377\315\377\377\377\242\377\377\377\360\377\377\377\377\377" + "\377\377\377\377\377\377\370\377\377\377\237\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377`\377\377\377\375\377\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\266\377\377\377\377\377\377\377\217\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\371\371\377.\377\377\377M\000\000\000" + "\000\000\000\000\000\371\371\377.\377\377\377M\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377|\377\377\377s\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377" + "\343\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377" + "\377\377\377\377\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\371" + "\377\377\377\352\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\070\377\377\377\372\377\377\377\377" + "\377\377\377\275\377\377\377\253\377\377\377\374\377\377\377\376\377\377" + "\377s\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377r\377\377" + "\377\314\377\377\377\304\377\377\377\332\377\377\377\377\377\377\377\321" + "\377\377\377\307\377\377\377\271\377\377\377\013\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\263\377\377\377\377\377\377\377\377\377\377\377" + "\350\377\377\377\307\377\377\377\322\377\377\377\321\377\377\377\310\377" + "\377\377\033\377\377\377\377\377\377\377\377\377\377\377\070\377\377\377\373" + "\377\377\377\377\377\377\377\325\377\377\377\242\377\377\377\275\377\377" + "\377\371\377\377\377\377\377\377\377\272\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377" + "\374\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377\070\377\377\377\373\377\377\377\377\377\377\377\321\377\377\377\250" + "\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\234\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\033\377\377\377\362\377" + "\377\377\377\377\377\377\313\377\377\377\214\377\377\377\345\377\377\377" + "\377\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\326\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\302" + "\377\377\377\377\377\377\377\346\377\377\377\226\377\377\377\201\377\377" + "\377\320\377\377\377\377\377\377\377\347\377\377\377\013\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\307\377" + "\377\377\250\377\377\377\335\377\377\377\377\377\377\377\356\377\377\377" + "\033\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\377\377\377\377\343\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\207\377\377\377\374\377\377\377\266\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377V\377\377\377\375\377\377\377\247\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\306\377\377\377\377\377\377\377\376\377\377\377" + "l\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013" + "\377\377\377\355\377\377\377\352\000\000\000\000\377\377\377s\377\377\377\314\377" + "\377\377\315\377\377\377v\377\377\377\245\377\377\377%\377\377\377\377\377" + "\377\377\377\377\377\377K\377\377\377\373\377\377\377\360\377\377\377\033" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\376\377\377\377~\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\335\377\377\377\275\377\377\377\310\377\377\377\366\377\377\377" + "\377\377\377\377\346\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377\013\377\377\377\342\377\377\377\377\377\377\377\370\377\377" + "\377\300\377\377\377\276\377\377\377\371\377\377\377\377\377\377\377\227" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377" + "\377\377\377\325\377\377\377\303\377\377\377\361\377\377\377\377\377\377" + "\377\375\377\377\377f\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377K\377\377\377\374\377\377\377\362\377\377\377\316\377\377\377\316" + "\377\377\377\316\377\377\377\322\377\377\377\273\377\377\377\013\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\070\377\377\377\371\377\377\377\377\377\377" + "\377\352\377\377\377\271\377\377\377\321\377\377\377\375\377\377\377\372" + "\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377u\377\377\377\325\377\377\377\316\377\377\377\371\377\377\377\373" + "\377\377\377\320\377\377\377\322\377\377\377\207\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\302\377\377\377\377\377\377\377\365" + "\377\377\377\266\377\377\377\324\377\377\377\377\377\377\377\375\377\377" + "\377=\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377" + "\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\070\377\377\377\372" + "\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\013\377\377\377\356\377\377\377\376\377\377\377\320\377\377\377\316" + "\377\377\377\316\377\377\377\316\377\377\377\322\377\377\377V\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377" + "%\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377l\000\000\000\000\377\377\377\013\377\377\377\352\377\377\377\377\377" + "\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "j\377\377\377\375\377\377\377\377\377\377\377\321\377\377\377\302\377\377" + "\377\375\377\377\377\377\377\377\377\234\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377j\377\377\377\375\377\377\377\377\377\377\377\320\377" + "\377\377\307\377\377\377\375\377\377\377\377\377\377\377\216\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\252\000\000\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377" + "\336\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\351" + "\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\264\377\377" + "\377\351\377\377\377\377\377\377\377\343\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377b\377\377\377\375\377\377\377\377\377\377\377\325\377" + "\377\377\307\377\377\377\374\377\377\377\377\377\377\377\227\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377" + "\377\377\377\377\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\375\377\377\377_\377\377\377\033\377\377\377\365\377\377\377\377" + "\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\253\377\377\377\377\377\377\377\322\000\000\000\000\000\000\000\000\377\377\377\275" + "\377\377\377\377\377\377\377\315\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377\366\377" + "\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\334\377\377\377\377\377\377\377\372\377\377\377\310\377\377" + "\377\316\377\377\377\316\377\377\377\321\377\377\377\310\377\377\377%\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377" + "\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\307\377\377" + "\377\377\377\377\377\336\377\377\377\233\377\377\377\305\377\377\377\376" + "\377\377\377\377\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\376\377\377\377\307" + "\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377\272\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377!\377\377\377\366\377" + "\377\377\377\377\377\377\346\377\377\377\271\377\377\377\270\377\377\377" + "\365\377\377\377\375\377\377\377M\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377\257\377\377" + "\377\302\377\377\377\376\377\377\377\377\377\377\377\332\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377`\377\377\377\374\377\377\377" + "\377\377\377\377\332\377\377\377\233\377\377\377\260\377\377\377\367\377" + "\377\377\316\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377U\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377" + "\377\377\377\377\377\342\377\377\377\242\377\377\377\237\377\377\377\246" + "\377\377\377\247\377\377\377X\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356" + "\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377" + "\377\366\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377K\377\377\377\375\377\377\377\245\000\000\000\000\000\000\000\000\377\377" + "\377\233\377\377\377\377\377\377\377\356\377\377\377%\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377" + "\377\376\377\377\377\302\377\377\377\262\377\377\377\322\377\377\377\033\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361\377\377\377\333" + "\000\000\000\000\377\377\377\320\377\377\377\371\377\377\377%\377\377\377\223\377" + "\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013" + "\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\214\377\377\377\377\377\377\377\376\377\377\377" + "\274\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377\265\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\376\377\377\377\307\377\377\377\255\377\377\377\370\377" + "\377\377\377\377\377\377\272\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377\257\377" + "\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377" + "\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\341\377\377\377\377\377\377\377\335" + "\377\377\377\233\377\377\377\213\377\377\377\306\377\377\377\377\377\377" + "\377\352\377\377\377\013\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\241\377\377\377\377\377\377\377\365\377\377\377\245\377" + "\377\377\255\377\377\377\325\377\377\377\062\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\275\377\377\377\377\377\377\377\361\377\377\377\252" + "\377\377\377\331\377\377\377\377\377\377\377\377\377\377\377\332\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\266" + "\377\377\377\377\377\377\377\377\377\377\377\336\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\240\377\377\377\377" + "\377\377\377\377\377\377\377\207\377\377\377K\377\377\377\374\377\377\377" + "\377\377\377\377\315\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377U\377\377\377\374\377\377\377\372\377\377\377\070\377\377\377!\377" + "\377\377\366\377\377\377\376\377\377\377\177\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\377\377\377" + "\377\377\377\377\377\352\377\377\377\013\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\267\377\377\377\377\377\377\377\377\377" + "\377\377\311\377\377\377\302\377\377\377\304\377\377\377\304\377\377\377" + "\271\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\013\377\377\377\361\377\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377b\377\377\377\374\377\377\377\377\377\377\377\225\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\316\377\377\377\333\000\000\000\000\377" + "\377\377\316\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377w\377\377\377\343\377\377" + "\377\375\377\377\377\201\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\013\377\377\377\244\377\377\377\013\000\000\000\000\000\000\000\000\377" + "\377\377\302\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377" + "Z\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377~\377\377\377\370\377" + "\377\377\377\377\377\377\377\377\377\377\376\377\377\377\275\377\377\377" + "\266\377\377\377\376\377\377\377\323\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\335\377\377\377\376\377\377\377~\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377" + "\373\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\377\377\377" + "\357\377\377\377\377\377\377\377\364\377\377\377)\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377\377\377\377" + "\244\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\232\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377l\377\377\377\367\377\377\377\377\377\377\377\377\377\377\377\376" + "\377\377\377\223\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377)\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\355\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\360\377\377\377\033\377\377\377\377\377\377\377\377\000" + "\000\000\000\377\377\377j\377\377\377\350\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\376\377\377\377\302\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377" + "\377\377\372\377\377\377\316\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377u\377\377\377\351\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\373\377\377\377\254\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377S\377\377\377\354\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\325\377\377\377" + "\033\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\214\377\377\377\377\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\315\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\342\377\377\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\177\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\342\377\377\377\062\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377" + "\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\377\377\377\357\377\377\377\377\377" + "\377\377\364\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377" + "\377\377M\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\375\377\377\377\\\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\255\377\377\377\377\377\377\377\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377" + "\377\377\377\377\276\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\240\377" + "\377\377\377\377\377\377\266\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\215\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\370\377\377\377\312\377\377\377%\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\316\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\255\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\305\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\330\377" + "\377\377V\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\372\377\377\377)\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\366\377" + "\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377I\377\377\377\345\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\370\377\377\377\241\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\375\377" + "\377\377\\\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\355" + "\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\336\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\013\377\377\377\316\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\373\377\377\377\213\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\252\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\247\377\377\377\377\377\377" + "\377\326\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377" + "\351\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\376\377\377\377_\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\344\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\307\377\377\377\375\377\377\377Q\000\000\000\000\000\000\000\000" + "\377\377\377\204\377\377\377\377\377\377\377\327\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\371\377\377" + "\377\377\377\377\377\377\377\377\377\376\377\377\377\240\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377\377" + "\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\370" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\241\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377" + "\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\356\377" + "\377\377\376\377\377\377v\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\025\377\377\377\316\377\377\377\376\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\335\377\377\377)\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377" + "\364\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\233\377\377\377\375\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\276\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\372\377" + "\377\377\376\377\377\377|\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377u\377\377\377\375\377\377\377\355\377\377\377" + "\033\000\000\000\000\377\377\377\320\377\377\377\377\377\377\377\244\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377\033\377\377\377\366\377\377\377\372\377" + "\377\377=\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\362\377\377\377\376" + "\377\377\377_\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\351\377\377\377\364\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\356\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\376\377\377\377l\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377" + "\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\377\377\377" + "\377\277\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\065\377\377\377\347\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\303\377\377\377\362\377\377" + "\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\345\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\307\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377I\377\377\377\345\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\373\377\377\377\260\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\310\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\326\377\377\377\367\377\377\377" + "\315\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "l\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\370\377\377\377\231\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\322\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "I\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\216\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\355\377\377\377\033" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\351\377\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377" + "\252\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377" + "\304\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\223\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377" + "\372\377\377\377M\377\377\377\377\377\377\377\377\377\377\377\013\377\377" + "\377\361\377\377\377\333\000\000\000\000\377\377\377\275\377\377\377\371\377\377" + "\377%\377\377\377\223\377\377\377\377\377\377\377\252\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\355\377\377\377\033\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\240\377\377\377" + "\374\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\275\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377" + "\377\377\377\377\377\377\352\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\307\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\310\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\337\377\377\377\377\377\377\377\332\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377\375\377" + "\377\377_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377c\377\377\377\330\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\354\377\377\377Z\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377" + "\377\377\333\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\375\377\377\377_\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\033" + "\377\377\377\350\377\377\377\377\377\377\377\377\377\377\377\376\377\377" + "\377\255\377\377\377\362\377\377\377\323\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\372\377\377\377" + "\376\377\377\377\206\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377b\377\377\377\374\377\377\377\372\377\377\377I\377" + "\377\377\013\377\377\377\355\377\377\377\377\377\377\377\243\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377\013\377\377\377\345\377\377\377\376\377" + "\377\377\214\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\374\377\377\377\363" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\335\377\377\377\377\377\377\377\236\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\355\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\372\377\377\377)\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\360\377\377\377\333" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377Q\377\377\377n\377\377\377\013\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377\377e\377\377" + "\377\033\000\000\000\000\000\000\000\000\371\371\377.\377\377\377\065\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377V\377\377\377\374\377\377\377\364\377\377\377\062\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\343\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\033\377\377\377\371\377\377\377\334\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377X\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\341\377\377\377\375\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377e\377\377\377l\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377" + "\377\377X\377\377\377S\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377@\377\377\377e\377\377\377c\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377S\377\377\377K\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377)\377\377\377e\377\377\377n\377\377\377\070\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377_\377\377\377p\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377E\377\377\377X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\371" + "\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377`\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\033\377\377\377\362\377\377\377" + "\376\377\377\377\255\377\377\377\065\377\377\377V\377\377\377\322\377\377" + "\377\255\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377)\377\377\377X\377\377\377V\377\377\377\013\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377" + "\377m\377\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\371\371\377.\377\377\377m\377\377\377c\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377\377c\377\377\377" + "\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\320" + "\377\377\377\377\377\377\377\333\377\377\377\033\377\377\377E\377\377\377" + "\013\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377e\377\377\377e\377\377" + "\377\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "e\377\377\377n\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377U\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\361\377\377\377\366\377" + "\377\377%\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\216\377\377\377\233\377\377\377\232\377\377\377" + "\232\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377\237\377" + "\377\377=\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377U\377\377\377n\377\377\377\065" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377n\377\377\377\070\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377@\377\377\377m\377\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377@\377\377" + "\377p\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377Q\377\377\377p\377\377" + "\377X\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\324\377\377\377\376\377" + "\377\377|\377\377\377S\377\377\377V\377\377\377K\377\377\377\263\377\377" + "\377\377\377\377\377\252\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\362\377\377\377\360\377" + "\377\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377)\377\377\377p\377\377\377c\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377\377f\377" + "\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377\224\377\377\377\376\377\377\377U\377\377\377@\377\377\377" + "e\377\377\377\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377@\377\377\377p\377\377\377I\377\377\377" + ";\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377e\377\377\377e\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377O\377\377\377X\377\377\377U\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377j\377\377\377n\377\377\377\033" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\362\377\377\377\367\377\377\377)\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\356" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377" + "%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\372\377\377\377)\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\267\377\377\377\345\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\237\377\377\377\377\377\377" + "\377\361\377\377\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\377\377\377\331\377\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\062\377\377\377\337\377\377\377\377\377\377\377\236" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377b\377\377\377\376\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\062\377\377\377\337\377\377\377\377\377\377\377\236" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\344\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\270\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\362" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\210\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377" + "\377\377\377\377\377\370\377\377\377\364\377\377\377\372\377\377\377\243" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\225\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\205\377\377\377\371" + "\377\377\377\364\377\377\377\364\377\377\377\377\377\377\377\260\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\013\377\377\377\370\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377m\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\345\377\377\377\375\377\377\377f\000\000\000\000\000\000\000\000\377\377\377\062\377\377" + "\377\326\377\377\377\377\377\377\377\245\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\234\377\377\377\205\377\377\377I\377\377\377" + "\272\377\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377i\377\377" + "\377\203\377\377\377\337\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\275\377\377" + "\377\377\377\377\377\377\377\377\377\373\377\377\377\243\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313" + "\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\177\377\377\377\372\377\377\377\376\377" + "\377\377\377\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\253\377\377\377\340\377\377\377%\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377\310\377\377\377\307\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\377\377\377\377" + "\276\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377u\377\377\377\325\377\377\377w\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\377\377\377\377\276" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\213\377" + "\377\377\203\377\377\377\070\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\251\377\377\377" + "\322\377\377\377\316\377\377\377m\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\263\377\377\377\263\377\377\377" + "\263\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377G\377\377\377" + "\317\377\377\377w\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377i\377\377\377\266\377\377\377\263\377\377\377\263\377\377\377\262\377" + "\377\377_\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377`\377\377\377y\377\377" + "\377y\377\377\377y\377\377\377y\377\377\377y\377\377\377y\377\377\377x\377" + "\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\237\377\377\377\377" + "\377\377\377\377\377\377\377\370\377\377\377\370\377\377\377\377\377\377" + "\377\377\377\377\377\325\377\377\377\033\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377;\377\377\377\374\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\376\377\377\377z\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\233\377\377\377\377\377\377\377l\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377V\377\377\377\376\377" + "\377\377\327\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361" + "\377\377\377\377\377\377\377\377\377\377\377\325\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377v\377" + "\377\377\246\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\372" + "\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377i\377\377\377\266\377\377\377\255\377\377\377\214\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377s\377\377\377|\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377s\377\377\377|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377_\377\377\377\266\377\377\377\321\377" + "\377\377\316\377\377\377\271\377\377\377q\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377`\377\377\377\245\377\377\377" + "\267\377\377\377\247\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377E\377\377\377\212\377\377\377%\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\211" + "\377\377\377=\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377v\377\377" + "\377\232\377\377\377q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\363\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377", +}; + diff --git a/minilibx_beta/interface.swift b/minilibx_beta/interface.swift new file mode 100644 index 0000000..97d6b81 --- /dev/null +++ b/minilibx_beta/interface.swift @@ -0,0 +1,292 @@ + +import Cocoa + +import mlx_window +import mlx_image +import mlx_init + + + +func _mlx_bridge(obj : T) -> UnsafeRawPointer { + return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque()) +} + +func _mlx_bridge_retained(obj : T) -> UnsafeRawPointer { + return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque()) +} + +func _mlx_bridge(ptr : UnsafeRawPointer) -> T { + return Unmanaged.fromOpaque(ptr).takeUnretainedValue() +} + +func _mlx_bridge_transfer(ptr : UnsafeRawPointer) -> T { + return Unmanaged.fromOpaque(ptr).takeRetainedValue() +} + + +let MLX_SYNC_IMAGE_WRITABLE = Int32(1) +let MLX_SYNC_WIN_FLUSH_CMD = Int32(2) +let MLX_SYNC_WIN_CMD_COMPLETED = Int32(3) + + + +/// C decl + + +@_cdecl("mlx_init") +public func mlx_init_swift() -> UnsafeRawPointer +{ + let mm = MlxMain() + return (_mlx_bridge_retained(obj:mm)) +} + + +@_cdecl("mlx_loop") +public func mlx_loop_swift(_ mlxptr:UnsafeRawPointer) +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.inLoop = true + NSApp.run() +} + + +@_cdecl("mlx_new_window") +public func mlx_new_window_swift(_ mlxptr:UnsafeRawPointer, Width w:UInt32, Height h:UInt32, Title t:UnsafePointer) -> UnsafeRawPointer +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + let mw = MlxWin(device: mlx.device, width: Int(w), height: Int(h), title: String(cString: t)) + mw.setNotifs() + mw.initMetal() + mlx.addWinToList(mw) + return (_mlx_bridge_retained(obj:mw)) +} + + + +@_cdecl("mlx_key_hook") +public func mlx_key_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: 3, fct: fctptr, param: paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_mouse_hook") +public func mlx_mouse_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: 4, fct: fctptr, param: paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_hook") +public func mlx_hook_swift(_ winptr:UnsafeRawPointer, _ xevent:Int32, _ xmask:Int32, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: Int(xevent), fct: fctptr, param: paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_expose_hook") +public func mlx_expose_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: 12, fct: fctptr, param: paramptr) + return (Int32(0)); +} + +@_cdecl("mlx_loop_hook") +public func mlx_loop_hook_swift(_ mlxptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.addLoopHook(fctptr, paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_do_key_autorepeatoff") +public func mlx_do_key_autorepeatoff_swift(_ mlxptr:UnsafeRawPointer) +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.winList.forEach{ $0.setKeyRepeat(0) } +} + + +@_cdecl("mlx_do_key_autorepeaton") +public func mlx_do_key_autorepeatoon_swift(_ mlxptr:UnsafeRawPointer) +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.winList.forEach{ $0.setKeyRepeat(1) } +} + + +@_cdecl("mlx_clear_window") +public func mlx_clear_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.clearWin() +} + + +@_cdecl("mlx_pixel_put") +public func mlx_pixel_put_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32, _ color:UInt32) +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.pixelPut(x, y, color) +} + + +@_cdecl("mlx_get_color_value") +public func mlx_get_color_value(_ mlxptr:UnsafeRawPointer, _ color:UInt32) -> UInt32 +{ + return color +} + + +@_cdecl("mlx_new_image") +public func mlx_new_image(_ mlxptr:UnsafeRawPointer, _ width:Int32, _ height:Int32) -> UnsafeRawPointer +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + let img = MlxImg(d:mlx.device, w:Int(width), h:Int(height)) + mlx.addImgToList(img) +/// print(CFGetRetainCount(img)) + return (_mlx_bridge_retained(obj:img)) + +} + +@_cdecl("mlx_get_data_addr") +public func mlx_get_data_addr_swift(_ imgptr:UnsafeRawPointer, _ bpp:UnsafeMutablePointer, _ sizeline:UnsafeMutablePointer, _ endian:UnsafeMutablePointer) -> UnsafeMutablePointer +{ + let img:MlxImg = _mlx_bridge(ptr:imgptr) + bpp.pointee = 32 + sizeline.pointee = Int32(img.texture_sizeline) + endian.pointee = Int32(0) + return img.texture_data +} + +@_cdecl("mlx_put_image_to_window") +public func mlx_put_image_to_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let img:MlxImg = _mlx_bridge(ptr:imgptr) + win.putImage(image:img, x:x, y:y) + return Int32(0) +} + +@_cdecl("mlx_put_image_to_window_scale") +public func mlx_put_image_to_window_scale_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ sx:Int32, _ sy:Int32, _ sw:Int32, _ sh:Int32, _ dx:Int32, _ dy:Int32, _ dw:Int32, _ dh:Int32, _ color:UInt32) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let img:MlxImg = _mlx_bridge(ptr:imgptr) + win.putImageScale(image:img, sx:sx, sy:sy, sw:sw, sh:sh, dx:dx, dy:dy, dw:dw, dh:dh, c:color) + return Int32(0) +} + +@_cdecl("mlx_do_sync") +public func mlx_do_sync_swift(_ mlxptr:UnsafeRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.winList.forEach { $0.flushImages() } + mlx.winList.forEach { $0.waitForGPU() } + return Int32(0) +} + +@_cdecl("mlx_sync") +public func mlx_sync_swift(_ what:Int32, _ param:UnsafeRawPointer) -> Int32 +{ + switch what + { + case MLX_SYNC_IMAGE_WRITABLE: + let img:MlxImg = _mlx_bridge(ptr:param); while img.onGPU > 0 {} + case MLX_SYNC_WIN_FLUSH_CMD: + let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages() + case MLX_SYNC_WIN_CMD_COMPLETED: + let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages(); win.waitForGPU() + default: + break + } + return Int32(0) +} + +@_cdecl("mlx_destroy_window") +public func mlx_destroy_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + /// bridge_transfer to get the retain, at end of this func should release the MlxWin object, because no ref anymore. + let win:MlxWin = _mlx_bridge_transfer(ptr:winptr) + win.delNotifs() + win.flushImages() + win.waitForGPU() + win.destroyWinE() + mlx.winList.removeAll(where: { $0 === win} ) + return Int32(0) +} + +@_cdecl("mlx_destroy_image") +public func mlx_destroy_image_swift(_ mlxptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + /// bridge_transfer to get the retain, at end of this func should release the MlxImg object, because no ref anymore. + let img:MlxImg = _mlx_bridge_transfer(ptr:imgptr) + mlx.winList.forEach { $0.flushImages() } + while img.onGPU > 0 {} + mlx.imgList.removeAll(where: { $0 === img} ) + return Int32(0) +} + + +@_cdecl("mlx_get_screen_size") +public func mlx_get_screen_size_swift(_ mlxptr:UnsafeRawPointer, _ sizex:UnsafeMutablePointer, _ sizey:UnsafeMutablePointer) -> Int32 +{ + /// let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + sizex.pointee = Int32(NSScreen.main!.frame.size.width) + sizey.pointee = Int32(NSScreen.main!.frame.size.height) + return Int32(0) +} + + +@_cdecl("mlx_mouse_hide") +public func mlx_mouse_hide_swift() -> Int32 +{ + NSCursor.hide() + return Int32(0) +} + +@_cdecl("mlx_mouse_show") +public func mlx_mouse_show_swift() -> Int32 +{ + NSCursor.unhide() + return Int32(0) +} + + +@_cdecl("mlx_mouse_move") +public func mlx_mouse_move_swift(_ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let frame = win.getWinEFrame() +/// let sframe = win.getScreenFrame() + var pt = CGPoint() + pt.x = frame.origin.x + CGFloat(x) +/// pt.y = sframe.size.y - frame.size.y - frame.origin.y + 1 + y + pt.y = frame.origin.y + frame.size.height - 1.0 - CGFloat(y) + CGWarpMouseCursorPosition(pt) + CGAssociateMouseAndMouseCursorPosition(UInt32(1)) + return Int32(0); +} + + + +@_cdecl("mlx_mouse_get_pos") +public func mlx_mouse_get_pos_swift(_ winptr:UnsafeRawPointer, _ x:UnsafeMutablePointer, _ y:UnsafeMutablePointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let frame = win.getWinEFrame() + let point = win.getMouseLoc() + x.pointee = Int32(point.x) + y.pointee = Int32(frame.size.height - 1.0 - point.y) + return Int32(0) +} diff --git a/minilibx_beta/man/man3/mlx.3 b/minilibx_beta/man/man3/mlx.3 new file mode 100644 index 0000000..4c7e29b --- /dev/null +++ b/minilibx_beta/man/man3/mlx.3 @@ -0,0 +1,110 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Simple Window Interface Library for students +.SH SYNOPSYS +#include + +.nf +.I void * +.fi +.B mlx_init +(); + +.SH DESCRIPTION +MiniLibX is an easy way to create graphical software, +without any X-Window/X11 programming knowledge under Unix/Linux, nor +any AppKit programming knowledge under MacOS. It provides +simple window creation, a drawing tool, image and basic events +management. + +.SH Unix/Linux: X-WINDOW CONCEPT + +X-Window is a network-oriented graphical system for Unix. +It is based on two main parts: +.br +On one side, your software wants to draw something on the screen and/or +get keyboard & mouse entries. +.br +On the other side, the X-Server manages the screen, keyboard and mouse +(It is often refered to as a "display"). +.br +A network connection must be established between these two entities to send +drawing orders (from the software to the X-Server), and keyboard/mouse +events (from the X-Server to the software). +.br +Nowadays, most of the time, both run on the same computer. + +.SH MacOS: WINDOW SERVER AND GPU + +Your software interacts directly with the Window server who handles the +cohabitation on the screen with other software and the event system, +and interacts with the GPU to handle all drawing stuff. + +.SH INCLUDE FILE +.B mlx.h +should be included for a correct use of the MiniLibX API. +It only contains function prototypes, no structure is needed. + +.SH LIBRARY FUNCTIONS +.P +First of all, you need to initialize the connection +between your software and the display. +Once this connection is established, you'll be able to +use other MiniLibX functions to send and receive the messages from +the display, like "I want to draw a yellow pixel in this window" or +"did the user hit a key?". +.P +The +.B mlx_init +function will create this connection. No parameters are needed, ant it will +return a +.I "void *" +identifier, used for further calls to the library routines. +.P +All other MiniLibX functions are described in the following man pages: + +.TP 20 +.B mlx_new_window +: manage windows +.TP 20 +.B mlx_pixel_put +: draw inside window +.TP 20 +.B mlx_new_image +: manipulate images +.TP 20 +.B mlx_loop +: handle keyboard or mouse events + +.SH LINKING MiniLibX +To use MiniLibX functions, you may need to link +your software with several libraries, including the MiniLibX library itself. +On Unix/Linux, simply add the following arguments at linking time: + +.B -lmlx -lXext -lX11 + +On MacOS, the dynamic Metal library will find on its own the missing components: + +.B -lmlx + +and still on MacOS, the static OpenGL version will need: + +.B -lmlx -framework OpenGL -framework AppKit -lz + +You may also need to specify the path to these libraries, using +the +.B -L +flag. + + +.SH RETURN VALUES +If +.B mlx_init() +fails to set up the connection to the display, it will return NULL, otherwise +a non-null pointer is returned as a connection identifier. + +.SH SEE ALSO +mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2019 - Olivier Crouzet diff --git a/minilibx_beta/man/man3/mlx_loop.3 b/minilibx_beta/man/man3/mlx_loop.3 new file mode 100644 index 0000000..ab3798c --- /dev/null +++ b/minilibx_beta/man/man3/mlx_loop.3 @@ -0,0 +1,144 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Handle events +.SH SYNOPSYS + +.nf +.I int +.fi +.B mlx_loop +( +.I void *mlx_ptr +); + +.nf +.I int +.fi +.B mlx_key_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_mouse_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_expose_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_loop_hook +( +.I void *mlx_ptr, int (*funct_ptr)(), void *param +); + +.SH EVENTS + +The graphical system is bi-directionnal. On one hand, the program sends orders to +the screen to display pixels, images, and so on. On the other hand, +it can get information from the keyboard and mouse associated to +the screen. To do so, the program receives "events" from the keyboard or the +mouse. + +.SH DESCRIPTION + +To receive events, you must use +.B mlx_loop +(). This function never returns. It is an infinite loop that waits for +an event, and then calls a user-defined function associated with this event. +A single parameter is needed, the connection identifier +.I mlx_ptr +(see the +.B mlx manual). + +You can assign different functions to the three following events: +.br +- A key is pressed +.br +- The mouse button is pressed +.br +- A part of the window should be re-drawn +(this is called an "expose" event, and it is your program's job to handle it in the +Unix/Linux X11 environment, but at the opposite it never happens on MacOS). +.br + +Each window can define a different function for the same event. + +The three functions +.B mlx_key_hook +(), +.B mlx_mouse_hook +() and +.B mlx_expose_hook +() work exactly the same way. +.I funct_ptr +is a pointer to the function you want to be called +when an event occurs. This assignment is specific to the window defined by the +.I win_ptr +identifier. The +.I param +adress will be passed to the function everytime it is called, and should be +used to store the parameters it might need. + +The syntax for the +.B mlx_loop_hook +() function is identical to the previous ones, but the given function will be +called when no event occurs. + +When it catches an event, the MiniLibX calls the corresponding function +with fixed parameters: +.nf + + expose_hook(void *param); + key_hook(int keycode, void *param); + mouse_hook(int button, int x, int y, void *param); + loop_hook(void *param); + +.fi +These function names are arbitrary. They here are used to distinguish +parameters according to the event. These functions are NOT part of the +MiniLibX. + +.I param +is the address specified in the mlx_*_hook calls. This address is never +used nor modified by the MiniLibX. On key and mouse events, additional +information is passed: +.I keycode +tells you which key is pressed (with X11, look for the include file "keysymdef.h", +with MacOS, just try :) ), +( +.I x +, +.I y +) are the coordinates of the mouse click in the window, and +.I button +tells you which mouse button was pressed. + +.SH GOING FURTHER WITH EVENTS +The MiniLibX provides a much generic access to other available events. The +.I mlx.h +include define +.B mlx_hook() +in the same manner mlx_*_hook functions work. The event and mask values +will be taken from the X11 include file "X.h". Some MacOS events are mapped +to these values, when it makes sense, and the mask is not used in MacOS. + +See source code of the MiniLibX to find out how it will +call your own function for a specific event. + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3) + +.SH AUTHOR +Copyright ol@ - 2002-2019 - Olivier Crouzet diff --git a/minilibx_beta/man/man3/mlx_new_image.3 b/minilibx_beta/man/man3/mlx_new_image.3 new file mode 100644 index 0000000..ecea0ee --- /dev/null +++ b/minilibx_beta/man/man3/mlx_new_image.3 @@ -0,0 +1,206 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Manipulating images +.SH SYNOPSYS + +.nf +.I void * +.fi +.B mlx_new_image +( +.I void *mlx_ptr, int width, int height +); + +.nf +.I char * +.fi +.B mlx_get_data_addr +( +.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian +); + +.nf +.I int +.fi +.B mlx_put_image_to_window +( +.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y +); + +.nf +.I unsigned int +.fi +.B mlx_get_color_value +( +.I void *mlx_ptr, int color +); + +.nf +.I void * +.fi +.B mlx_xpm_to_image +( +.I void *mlx_ptr, char **xpm_data, int *width, int *height +); + +.nf +.I void * +.fi +.B mlx_xpm_file_to_image +( +.I void *mlx_ptr, char *filename, int *width, int *height +); + +.nf +.I void * +.fi +.B mlx_png_file_to_image +( +.I void *mlx_ptr, char *filename, int *width, int *height +); + +.nf +.I int +.fi +.B mlx_destroy_image +( +.I void *mlx_ptr, void *img_ptr +); + + +.SH DESCRIPTION + +.B mlx_new_image +() creates a new image in memory. It returns a +.I void * +identifier needed to manipulate this image later. It only needs +the size of the image to be created, using the +.I width +and +.I height +parameters, and the +.I mlx_ptr +connection identifier (see the +.B mlx +manual). + +The user can draw inside the image (see below), and +can dump the image inside a specified window at any time to +display it on the screen. This is done using +.B mlx_put_image_to_window +(). Three identifiers are needed here, for the connection to the +display, the window to use, and the image (respectively +.I mlx_ptr +, +.I win_ptr +and +.I img_ptr +). The ( +.I x +, +.I y +) coordinates define where the image should be placed in the window. + +.B mlx_get_data_addr +() returns information about the created image, allowing a user +to modify it later. The +.I img_ptr +parameter specifies the image to use. The three next parameters should +be the addresses of three different valid integers. +.I bits_per_pixel +will be filled with the number of bits needed to represent a pixel color +(also called the depth of the image). +.I size_line +is the number of bytes used to store one line of the image in memory. +This information is needed to move from one line to another in the image. +.I endian +tells you wether the pixel color in the image needs to be stored in +little endian ( +.I endian +== 0), or big endian ( +.I endian +== 1). + +.B mlx_get_data_addr +returns a +.I char * +address that represents the begining of the memory area where the image +is stored. From this adress, the first +.I bits_per_pixel +bits represent the color of the first pixel in the first line of +the image. The second group of +.I bits_per_pixel +bits represent the second pixel of the first line, and so on. +Add +.I size_line +to the adress to get the begining of the second line. You can reach any +pixels of the image that way. + +.B mlx_destroy_image +destroys the given image ( +.I img_ptr +). + +.SH STORING COLOR INSIDE IMAGES + +Depending on the display, the number of bits used to store a pixel color +can change. The user usually represents a color in RGB mode, using +one byte for each component (see +.B mlx_pixel_put +manual). This must be translated to fit the +.I bits_per_pixel +requirement of the image, and make the color understandable to the display. +That is the purpose of the +.B mlx_get_color_value +() function. It takes a standard RGB +.I color +parameter, and returns an +.I unsigned int +value. +The +.I bits_per_pixel +least significant bits of this value can be stored in the image. You can +avoid using this function if there is no conversion needed (eg. in case of +24 bits depth, or 32 bits depth). + +Keep in mind that the least significant bits position depends on the local +computer's endian. If the endian of the image differs from the local endian +(which shoud only occurs in a X11 network environment), then the value should +be transformed before being used. + +.SH XPM AND PNG IMAGES + +The +.B mlx_xpm_to_image +() , +.B mlx_xpm_file_to_image +() and +.B mlx_png_file_to_image +() functions will create a new image the same way. +They will fill it using the specified +.I xpm_data +or +.I filename +, depending on which function is used. +Note that MiniLibX does not use the standard +Xpm and png libraries to deal with xpm and png images. You may not be able to +read all types of xpm and png images. It however handles transparency. + +.SH RETURN VALUES +The four functions that create images, +.B mlx_new_image() +, +.B mlx_xpm_to_image() +, +.B mlx_xpm_file_to_image() +and +.B mlx_png_file_to_image() +, will return NULL if an error occurs. Otherwise they return a non-null pointer +as an image identifier. + + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2019 - Olivier Crouzet diff --git a/minilibx_beta/man/man3/mlx_new_window.3 b/minilibx_beta/man/man3/mlx_new_window.3 new file mode 100644 index 0000000..cdfc098 --- /dev/null +++ b/minilibx_beta/man/man3/mlx_new_window.3 @@ -0,0 +1,79 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Managing windows +.SH SYNOPSYS + +.nf +.I void * +.fi +.B mlx_new_window +( +.I void *mlx_ptr, int size_x, int size_y, char *title +); + +.nf +.I int +.fi +.B mlx_clear_window +( +.I void *mlx_ptr, void *win_ptr +); + +.nf +.I int +.fi +.B mlx_destroy_window +( +.I void *mlx_ptr, void *win_ptr +); + + +.SH DESCRIPTION +The +.B mlx_new_window +() function creates a new window on the screen, using the +.I size_x +and +.I size_y +parameters to determine its size, and +.I title +as the text that should be displayed in the window's title bar. +The +.I mlx_ptr +parameter is the connection identifier returned by +.B mlx_init +() (see the +.B mlx +man page). +.B mlx_new_window +() returns a +.I void * +window identifier that can be used by other MiniLibX calls. +Note that the MiniLibX +can handle an arbitrary number of separate windows. + +.B mlx_clear_window +() and +.B mlx_destroy_window +() respectively clear (in black) and destroy the given window. They both have +the same parameters: +.I mlx_ptr +is the screen connection identifier, and +.I win_ptr +is a window identifier. + +.SH RETURN VALUES +If +.B mlx_new_window() +fails to create a new window (for wathever reason), it will return NULL, +otherwise a non-null pointer is returned as a window identifier. +.B mlx_clear_window +and +.B mlx_destroy_window +right now return nothing. + +.SH SEE ALSO +mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2019 - Olivier Crouzet diff --git a/minilibx_beta/man/man3/mlx_pixel_put.3 b/minilibx_beta/man/man3/mlx_pixel_put.3 new file mode 100644 index 0000000..52670a6 --- /dev/null +++ b/minilibx_beta/man/man3/mlx_pixel_put.3 @@ -0,0 +1,85 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Drawing inside windows +.SH SYNOPSYS + +.nf +.I int +.fi +.B mlx_pixel_put +( +.I void *mlx_ptr, void *win_ptr, int x, int y, int color +); + +.nf +.I int +.fi +.B mlx_string_put +( +.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string +); + + +.SH DESCRIPTION +The +.B mlx_pixel_put +() function draws a defined pixel in the window +.I win_ptr +using the ( +.I x +, +.I y +) coordinates, and the specified +.I color +\&. The origin (0,0) is the upper left corner of the window, the x and y axis +respectively pointing right and down. The connection +identifier, +.I mlx_ptr +, is needed (see the +.B mlx +man page). + +Parameters for +.B mlx_string_put +() have the same meaning. Instead of a simple pixel, the specified +.I string +will be displayed at ( +.I x +, +.I y +). + +Both functions will discard any display outside the window. This makes +.B mlx_pixel_put +slow. Consider using images instead. + +.SH COLOR MANAGEMENT +The +.I color +parameter has an integer type. The displayed color needs to be encoded +in this integer, following a defined scheme. All displayable colors +can be split in 3 basic colors: red, green and blue. Three associated +values, in the 0-255 range, represent how much of each color is mixed up +to create the original color. Theses three values must be set inside the +integer to display the right color. The three least significant bytes of +this integer are filled as shown in the picture below: + +.nf + | 0 | R | G | B | color integer + +---+---+---+---+ +.fi + + +While filling the integer, make sure you avoid endian problems. Remember +that the "blue" byte should always be the least significant one. + +Depending on hardware capabilities, the most significant bit can handle +transparency. Beware, at the opposite of the OpenGL classics, it does +not represent opacity. + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3) + + +.SH AUTHOR +Copyright ol@ - 2002-2019 - Olivier Crouzet diff --git a/minilibx_beta/mlx.h b/minilibx_beta/mlx.h new file mode 100644 index 0000000..f24a7f7 --- /dev/null +++ b/minilibx_beta/mlx.h @@ -0,0 +1,157 @@ +/* +** mlx.h for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:37:50 2000 Charlie Root +** Last update Tue Oct 14 16:23:28 2019 Olivier Crouzet +*/ + +/* +** MinilibX - Please report bugs +*/ + + +/* +** +** This library is a simple framework to help 42 students +** create simple graphical apps. +** It only provides the minimum functions, it's students' job +** to create the missing pieces for their own project :) +** +** The MinilibX can load XPM and PNG images. +** Please note that both image loaders are incomplete, some +** image may not load. +** +** For historical reasons, the alpha byte represent transparency +** instead of opacity. +** Also, for compatibility reasons, prototypes may show inconsistant +** types. +** +** Only the dynamic library is available. It must be placed in an appropriate path. +** ./ is one of them. You can also use DYLD_LIBRARY_PATH +** +*/ + + +#ifndef MLX_H + +#define MLX_H + + +void *mlx_init(); +/* +** needed before everything else. +** return (void *)0 if failed +*/ + + +/* +** Basic actions +*/ + +void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title); +/* +** return void *0 if failed +*/ +int mlx_clear_window(void *mlx_ptr, void *win_ptr); +int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); +/* +** origin for x & y is top left corner of the window +** y down is positive +** color is 0xAARRGGBB format +** x and y must fit into the size of the window, no control is done on the values +*/ + + +/* +** Image stuff +*/ + +void *mlx_new_image(void *mlx_ptr,int width,int height); +/* +** return void *0 if failed +*/ +char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, + int *size_line, int *endian); +/* +** endian : 0 = graphical sever is little endian, 1 = big endian +** usefull in a network environment where graphical app show on a remote monitor that can have a different endian +*/ +int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, + int x, int y); +unsigned int mlx_get_color_value(void *mlx_ptr, int color); + + +/* +** dealing with Events +*/ + +int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param); + +int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param); +int mlx_loop (void *mlx_ptr); + + +/* +** hook funct are called as follow : +** +** expose_hook(void *param); +** key_hook(int keycode, void *param); +** mouse_hook(int button, int x,int y, void *param); +** loop_hook(void *param); +** +*/ + + +/* +** Usually asked... +** mlx_string_put display may vary in size between OS and between mlx implementations +*/ + +int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, + char *string); +void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, + int *width, int *height); +void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, + int *width, int *height); +void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height); + +int mlx_destroy_window(void *mlx_ptr, void *win_ptr); + +int mlx_destroy_image(void *mlx_ptr, void *img_ptr); + +/* +** generic hook system for all events, and minilibX functions that +** can be hooked. Some macro and defines from X11/X.h are needed here. +*/ + +int mlx_hook(void *win_ptr, int x_event, int x_mask, + int (*funct)(), void *param); + +int mlx_mouse_hide(); +int mlx_mouse_show(); +int mlx_mouse_move(void *win_ptr, int x, int y); +int mlx_mouse_get_pos(void *win_ptr, int *x, int *y); + +int mlx_do_key_autorepeatoff(void *mlx_ptr); +int mlx_do_key_autorepeaton(void *mlx_ptr); +int mlx_do_sync(void *mlx_ptr); + +#define MLX_SYNC_IMAGE_WRITABLE 1 +#define MLX_SYNC_WIN_FLUSH_CMD 2 +#define MLX_SYNC_WIN_CMD_COMPLETED 3 +int mlx_sync(int cmd, void *param); +/* +** image_writable can loop forever if no flush occurred. Flush is always done by mlx_loop. +** cmd_completed first flush then wait for completion. +** mlx_do_sync equals cmd_completed for all windows. +** cmd is one of the define, param will be img_ptr or win_ptr accordingly +*/ + +int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey); + +#endif /* MLX_H */ diff --git a/minilibx_beta/mlx_image.swift b/minilibx_beta/mlx_image.swift new file mode 100644 index 0000000..7c1fa9b --- /dev/null +++ b/minilibx_beta/mlx_image.swift @@ -0,0 +1,48 @@ + + +import Metal + + +public class MlxImg +{ + public var texture: MTLTexture +/// var texture_buff: MTLBuffer + + public var texture_sizeline: Int + public var texture_data: UnsafeMutablePointer + public var texture_width: Int + public var texture_height: Int + + public var onGPU = 0 + + convenience public init(d device:MTLDevice, w width:Int, h height:Int) + { + self.init(d:device, w:width, h:height, t:0) + } + + public init(d device:MTLDevice, w width:Int, h height:Int, t target:Int) + { + texture_width = width + texture_height = height + texture_sizeline = width * 4 + texture_sizeline = 256 * (texture_sizeline / 256 + (texture_sizeline%256 >= 1 ? 1 : 0) ) + + let textureDesc = MTLTextureDescriptor() + textureDesc.width = texture_width + textureDesc.height = texture_height + textureDesc.usage = .shaderRead + if (target == 1) + { + textureDesc.usage = .renderTarget + textureDesc.storageMode = .private + } + textureDesc.pixelFormat = MTLPixelFormat.bgra8Unorm + let texture_buff = device.makeBuffer(length: texture_sizeline * height)! + texture = texture_buff.makeTexture(descriptor:textureDesc, offset:0, bytesPerRow:texture_sizeline)! + + let tmpptr = texture_buff.contents() + texture_data = tmpptr.assumingMemoryBound(to:UInt32.self) + } + + +} \ No newline at end of file diff --git a/minilibx_beta/mlx_image.swiftdoc b/minilibx_beta/mlx_image.swiftdoc new file mode 100644 index 0000000..f13ee3f Binary files /dev/null and b/minilibx_beta/mlx_image.swiftdoc differ diff --git a/minilibx_beta/mlx_image.swiftmodule b/minilibx_beta/mlx_image.swiftmodule new file mode 100644 index 0000000..4d4ce55 Binary files /dev/null and b/minilibx_beta/mlx_image.swiftmodule differ diff --git a/minilibx_beta/mlx_init.swift b/minilibx_beta/mlx_init.swift new file mode 100644 index 0000000..de6edf2 --- /dev/null +++ b/minilibx_beta/mlx_init.swift @@ -0,0 +1,100 @@ + +import Cocoa +import Metal +import mlx_window +import mlx_image + + +func _mlx_bridge(obj : T) -> UnsafeMutableRawPointer? { + return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque()) +} + +func _mlx_bridge(ptr : UnsafeRawPointer) -> T { + return Unmanaged.fromOpaque(ptr).takeUnretainedValue() +} + + + +public class MlxMain { + + public var winList = [MlxWin]() + public var imgList = [MlxImg]() + var myMlxApp:NSApplication? + public var device:MTLDevice! + var loopHook:UnsafeMutableRawPointer? + var loopParam:UnsafeMutableRawPointer + var loopHookTimer:CFRunLoopTimer? + public var inLoop = false + + public init(_ flag:Int = 0) + { + /// make app with top menubar + myMlxApp = NSApplication.shared + if (flag == 1) + { + NSApp.setActivationPolicy(NSApplication.ActivationPolicy.prohibited) /// for non clickable win, no top menu + } + else + { + NSApp.setActivationPolicy(NSApplication.ActivationPolicy.regular) + } + + device = MTLCreateSystemDefaultDevice()! + loopParam = UnsafeMutableRawPointer(&inLoop) /// dummy addr init + + /// Add observer anyway to flush pixels every loop. If loop_hook exists, call it. + var ocontext = CFRunLoopObserverContext(version:0, info:_mlx_bridge(obj:self), retain:nil, release:nil, copyDescription:nil) + let observer = CFRunLoopObserverCreate(kCFAllocatorDefault, CFRunLoopActivity.beforeWaiting.rawValue, true, 0, createOCallback(), &ocontext) + CFRunLoopAddObserver(CFRunLoopGetMain(), observer, CFRunLoopMode.commonModes) + + } + + public func addWinToList(_ win:MlxWin) + { winList.append(win) } + public func addImgToList(_ img:MlxImg) + { imgList.append(img) } + + + func doCallLoopHook() + { +/// if (loopHook != nil) +/// { + _ = (unsafeBitCast(loopHook!,to:(@convention(c)(UnsafeRawPointer)->Void).self))(loopParam) +/// } + } + + func createOCallback() -> CFRunLoopObserverCallBack + { + return { (cfRunloopObserver, cfrunloopactivity, info) -> Void in + let mlx:MlxMain = _mlx_bridge(ptr:info!) + mlx.winList.forEach { $0.flushImages() } +/// mlx.doCallLoopHook() + } + } + + func createTCallback() -> CFRunLoopTimerCallBack + { + return { (cfRunloopTimer, info) -> Void in + let mlx:MlxMain = _mlx_bridge(ptr:info!) + mlx.doCallLoopHook() + } + } + + public func addLoopHook(_ f:UnsafeMutableRawPointer?, _ p:UnsafeMutableRawPointer) + { + var tcontext = CFRunLoopTimerContext(version:0, info:_mlx_bridge(obj:self), retain:nil, release:nil, copyDescription:nil) + if (loopHook != nil) + { + CFRunLoopTimerInvalidate(loopHookTimer) + } + + loopHook = f + loopParam = p + if (loopHook != nil) + { + loopHookTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, createTCallback(), &tcontext) + CFRunLoopAddTimer(CFRunLoopGetMain(), loopHookTimer, CFRunLoopMode.commonModes) + } + } + +} diff --git a/minilibx_beta/mlx_init.swiftdoc b/minilibx_beta/mlx_init.swiftdoc new file mode 100644 index 0000000..922e521 Binary files /dev/null and b/minilibx_beta/mlx_init.swiftdoc differ diff --git a/minilibx_beta/mlx_init.swiftmodule b/minilibx_beta/mlx_init.swiftmodule new file mode 100644 index 0000000..9565cfc Binary files /dev/null and b/minilibx_beta/mlx_init.swiftmodule differ diff --git a/minilibx_beta/mlx_png.c b/minilibx_beta/mlx_png.c new file mode 100644 index 0000000..48e82de --- /dev/null +++ b/minilibx_beta/mlx_png.c @@ -0,0 +1,431 @@ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zlib.h" + +#include "mlx.h" + +#define UNIQ_BPP 4 + +#define PNG_MAGIC_SIZE 8 +unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10}; +#define PNG_HDR_SIZE 13 + +#define Z_CHUNK 32768 + +#define ERR_MAGIC_SIZE 1 +#define ERR_MAGIC_WRONG 2 +#define ERR_STRUCT_INCOMPLETE 3 +#define ERR_STRUCT_HDR 4 +#define ERR_STRUCT_END 5 +#define ERR_STRUCT_CRC 6 +#define ERR_STRUCT_INCIMPL 7 +#define ERR_STRUCT_DAT 8 +#define ERR_STRUCT_MISSCHK 9 +#define ERR_ZLIB 10 +#define ERR_DATA_MISMATCH 11 +#define ERR_DATA_FILTER 12 +#define ERR_MALLOC 13 +char *(mipng_err[]) = +{ + "No error", + "Not enough size for magic", + "Wrong magic", + "Incomplete chunk structure", + "Duplicate or incorrect header", + "Duplicate or incorrect end", + "Invalid CRC in chunk", + "Incorrect header or configuration not implemented", + "Non consecutive dat chunks", + "Missing header/dat/end chunk(s)", + "Zlib inflate error", + "Inflated data size mismatch", + "Unknown scanline filter", + "Can't malloc" +}; + +typedef struct png_info_s +{ + unsigned int width; + unsigned int height; + int depth; + int color; + int interlace; + int bpp; +} png_info_t; + + +int mipng_is_type(unsigned char *ptr, char *type) +{ + if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3]) + return (1); + return (0); +} + + +unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]); } +unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)a); } +unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)b); } +unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); } +unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c) +{ + int p; + int result; + + p = a + b - c; + if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c)) + result = a; + else + if (abs(a - c) <= abs(a + b - c - c)) + result = b; + else + result = c; + return (buff[pos]+result); +} + + + +unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) = +{ + mipng_defilter_none, + mipng_defilter_sub, + mipng_defilter_up, + mipng_defilter_average, + mipng_defilter_paeth +}; + +// only work for mlx mac or img 32bpp +int mipng_fill_img(void *img, unsigned char *buf, png_info_t *pi) +{ + unsigned int current_filter; + int ipos; + int bpos; + int ilen; + int iline; + int blen; + int bpp; + int endian; + unsigned char tmp; + unsigned char *ibuf; + + ibuf = (unsigned char *)mlx_get_data_addr(img, &bpp, &iline, &endian); + // iline = img->width * UNIQ_BPP; + // ilen = img->width * img->height * UNIQ_BPP; + ilen = iline*pi->height; + ipos = 0; + blen = pi->width * pi->height * pi->bpp + pi->height; // ??? why + pi->height ?? + bpos = 0; + while (ipos < ilen && bpos < blen) + { + if (ipos % iline == 0) + { + // printf("ipos %d iline %d pi->width %d bpos %d\n", ipos, iline, pi->width, bpos); + if ((current_filter = buf[bpos++]) > 4) + { + return (ERR_DATA_FILTER); + } + } + ibuf[ipos] = mipng_defilter[current_filter](buf, bpos, + ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0, + (ipos>=iline)?ibuf[ipos-iline]:0, + (ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0); + ipos ++; + bpos ++; + if (pi->depth == 16) + bpos ++; + if (ipos % 4 == 3 && pi->color == 2) // no alpha + ibuf[ipos++] = 0xFF; + if (ipos % iline == pi->width * 4) + ipos += iline-pi->width*4; + } + if (ipos != ilen || bpos != blen) + { + // printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen); + return (ERR_DATA_MISMATCH); + } + ipos = 0; + while (ipos < ilen) + { + tmp = ibuf[ipos]; + ibuf[ipos] = ibuf[ipos+2]; + ibuf[ipos+2] = tmp; + ibuf[ipos+3] = 0xFF - ibuf[ipos+3]; + ipos += UNIQ_BPP; + } + return (0); +} + + +int mipng_data(void *img, unsigned char *dat, png_info_t *pi) +{ + unsigned int len; + int b_pos; + unsigned char *buffer; + int ret; + int z_ret; + unsigned z_have; + z_stream z_strm; + unsigned char z_out[Z_CHUNK]; + + b_pos = 0; + if (!(buffer = malloc((long long)pi->width*(long long)pi->height*(long long)pi->bpp + pi->height))) + return (ERR_MALLOC); + z_strm.zalloc = Z_NULL; + z_strm.zfree = Z_NULL; + z_strm.opaque = Z_NULL; + z_strm.avail_in = 0; + z_strm.next_in = Z_NULL; + z_ret = inflateInit(&z_strm); + if (z_ret != Z_OK) + { + free(buffer); + return (ERR_ZLIB); + } + + while (mipng_is_type(dat, "IDAT")) + { + len = *((unsigned int *)dat); + len = ntohl(len); + z_strm.avail_in = len; + z_strm.next_in = dat + 8; + z_strm.avail_out = 0; + while (z_strm.avail_out == 0) + { + z_strm.avail_out = Z_CHUNK; + z_strm.next_out = z_out; + z_ret = inflate(&z_strm, Z_NO_FLUSH); + // printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out); + if (z_ret != Z_OK && z_ret != Z_STREAM_END) + { + inflateEnd(&z_strm); + free(buffer); + return (ERR_ZLIB); + } + if (b_pos + Z_CHUNK - z_strm.avail_out > pi->width*pi->height*pi->bpp+pi->height) + { + inflateEnd(&z_strm); + free(buffer); + return (ERR_DATA_MISMATCH); + } + bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out); + b_pos += Z_CHUNK - z_strm.avail_out; + } + dat += len + 4 + 4 + 4; + } + inflateEnd(&z_strm); + if (b_pos != pi->width*pi->height*pi->bpp+pi->height) + { + // printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height); + free(buffer); + return (ERR_DATA_MISMATCH); + } + ret = mipng_fill_img(img, buffer, pi); + free(buffer); + return (ret); +} + + + +int mipng_magic(unsigned char *ptr, int size) +{ + int i; + + if (size < PNG_MAGIC_SIZE) + return (ERR_MAGIC_SIZE); + i = 0; + while (i < PNG_MAGIC_SIZE) + if (*(ptr++) != magic[i++]) + return (ERR_MAGIC_WRONG); + return (0); +} + + +unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; + +// From http://www.w3.org/TR/PNG/#D-CRCAppendix +int mipng_crc(unsigned char *ptr, int len) +{ + unsigned int file_crc; + unsigned long crc; + int i; + + file_crc = *((unsigned int *)(ptr+4+4+len)); + file_crc = ntohl(file_crc); + + crc = 0xffffffffL; + i = 0; + while (i < len+4) + crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8); + crc ^= 0xffffffffL; + + if (file_crc != crc) + return (1); + return (0); +} + + +int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat) +{ + unsigned int len; + int dat_state; + int end; + + dat_state = 0; + *hdr = NULL; + *dat = NULL; + end = 0; + while (size) + { + if (size >= 4) // length present + { + len = *((unsigned int *)ptr); + len = ntohl(len); + if (size < 4 + 4 + 4 + len) + return (ERR_STRUCT_INCOMPLETE); + if (mipng_crc(ptr, len)) + return (ERR_STRUCT_CRC); + // printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7)); + if (mipng_is_type(ptr, "IHDR")) + { + if (*hdr || len != PNG_HDR_SIZE) + return (ERR_STRUCT_HDR); + *hdr = ptr; + } + if (mipng_is_type(ptr, "IEND")) + { + if (len != 0 || size != 4+4+4) + return (ERR_STRUCT_END); + end = 1; + } + if (mipng_is_type(ptr, "IDAT")) + { + if (dat_state == 0) + { + dat_state = 1; + *dat = ptr; + } + if (dat_state == 2) + return (ERR_STRUCT_DAT); + } + else + if (dat_state == 1) + dat_state = 2; + size -= 4+4+4+len; + ptr += 4+4+4+len; + } + else + return (ERR_STRUCT_INCOMPLETE); + } + if (*hdr == 0 || *dat == 0 || end == 0) + return (ERR_STRUCT_MISSCHK); + return (0); +} + + +int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi) +{ + unsigned int compress; + unsigned int filter; + + hdr += 8; + pi->width = ntohl(*((unsigned long *)hdr)); + pi->height = ntohl(*((unsigned long *)(hdr+4))); + pi->depth = *(hdr+8); + pi->color = *(hdr+9); + compress = *(hdr+10); + filter = *(hdr+11); + pi->interlace = *(hdr+12); + if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16) + || (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0) + return (ERR_STRUCT_INCIMPL); + pi->bpp = pi->depth / 8; + if (pi->color == 2) + pi->bpp *= 3; + if (pi->color == 6) + pi->bpp *= 4; + // printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n", + // pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp); + return (0); +} + + +void *mlx_int_parse_png(void *xvar, unsigned char *fptr, int size, int *width, int *height) +{ + int err; + unsigned char *hdr; + unsigned char *dat; + png_info_t pi; + void *img; + + if ((err = mipng_magic(fptr, size))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + fptr += PNG_MAGIC_SIZE; + size -= PNG_MAGIC_SIZE; + if ((err = mipng_structure(fptr, size, &hdr, &dat))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + if ((err = mipng_verif_hdr(hdr, &pi))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + if (!(img = mlx_new_image(xvar, pi.width, pi.height))) + { + warnx("mlx PNG error : Can't create mlx image"); + return ((void *)0); + } + *width = pi.width; + *height = pi.height; + if ((err = mipng_data(img, dat, &pi))) + { + mlx_destroy_image(xvar, img); + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + return (img); +} + + + + +void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height) +{ + int fd; + int size; + unsigned char *ptr; + void *img; + + if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 || + (ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED) + { + if (fd >= 0) + close(fd); + warnx("Can't map png file '%s'", file); + return ((void *)0); + } + if (!(img = mlx_int_parse_png(xvar, ptr, size, width, height))) + { + *width = 0; + *height = 0; + } + munmap(ptr,size); + close(fd); + return (img); +} diff --git a/minilibx_beta/mlx_rgb.c b/minilibx_beta/mlx_rgb.c new file mode 100644 index 0000000..3f98717 --- /dev/null +++ b/minilibx_beta/mlx_rgb.c @@ -0,0 +1,763 @@ +/* +** This is a generated file with rgb2c.pl and rgb.txt from +** the XFree86 distribution. +*/ + + +struct s_col_name mlx_col_name[] = +{ + { "snow" , 0xfffafa }, + { "ghost white" , 0xf8f8ff }, + { "ghostwhite" , 0xf8f8ff }, + { "white smoke" , 0xf5f5f5 }, + { "whitesmoke" , 0xf5f5f5 }, + { "gainsboro" , 0xdcdcdc }, + { "floral white" , 0xfffaf0 }, + { "floralwhite" , 0xfffaf0 }, + { "old lace" , 0xfdf5e6 }, + { "oldlace" , 0xfdf5e6 }, + { "linen" , 0xfaf0e6 }, + { "antique white" , 0xfaebd7 }, + { "antiquewhite" , 0xfaebd7 }, + { "papaya whip" , 0xffefd5 }, + { "papayawhip" , 0xffefd5 }, + { "blanched almond" , 0xffebcd }, + { "blanchedalmond" , 0xffebcd }, + { "bisque" , 0xffe4c4 }, + { "peach puff" , 0xffdab9 }, + { "peachpuff" , 0xffdab9 }, + { "navajo white" , 0xffdead }, + { "navajowhite" , 0xffdead }, + { "moccasin" , 0xffe4b5 }, + { "cornsilk" , 0xfff8dc }, + { "ivory" , 0xfffff0 }, + { "lemon chiffon" , 0xfffacd }, + { "lemonchiffon" , 0xfffacd }, + { "seashell" , 0xfff5ee }, + { "honeydew" , 0xf0fff0 }, + { "mint cream" , 0xf5fffa }, + { "mintcream" , 0xf5fffa }, + { "azure" , 0xf0ffff }, + { "alice blue" , 0xf0f8ff }, + { "aliceblue" , 0xf0f8ff }, + { "lavender" , 0xe6e6fa }, + { "lavender blush" , 0xfff0f5 }, + { "lavenderblush" , 0xfff0f5 }, + { "misty rose" , 0xffe4e1 }, + { "mistyrose" , 0xffe4e1 }, + { "white" , 0xffffff }, + { "black" , 0x0 }, + { "dark slate" , 0x2f4f4f }, + { "darkslategray" , 0x2f4f4f }, + { "dark slate" , 0x2f4f4f }, + { "darkslategrey" , 0x2f4f4f }, + { "dim gray" , 0x696969 }, + { "dimgray" , 0x696969 }, + { "dim grey" , 0x696969 }, + { "dimgrey" , 0x696969 }, + { "slate gray" , 0x708090 }, + { "slategray" , 0x708090 }, + { "slate grey" , 0x708090 }, + { "slategrey" , 0x708090 }, + { "light slate" , 0x778899 }, + { "lightslategray" , 0x778899 }, + { "light slate" , 0x778899 }, + { "lightslategrey" , 0x778899 }, + { "gray" , 0xbebebe }, + { "grey" , 0xbebebe }, + { "light grey" , 0xd3d3d3 }, + { "lightgrey" , 0xd3d3d3 }, + { "light gray" , 0xd3d3d3 }, + { "lightgray" , 0xd3d3d3 }, + { "midnight blue" , 0x191970 }, + { "midnightblue" , 0x191970 }, + { "navy" , 0x80 }, + { "navy blue" , 0x80 }, + { "navyblue" , 0x80 }, + { "cornflower blue" , 0x6495ed }, + { "cornflowerblue" , 0x6495ed }, + { "dark slate" , 0x483d8b }, + { "darkslateblue" , 0x483d8b }, + { "slate blue" , 0x6a5acd }, + { "slateblue" , 0x6a5acd }, + { "medium slate" , 0x7b68ee }, + { "mediumslateblue" , 0x7b68ee }, + { "light slate" , 0x8470ff }, + { "lightslateblue" , 0x8470ff }, + { "medium blue" , 0xcd }, + { "mediumblue" , 0xcd }, + { "royal blue" , 0x4169e1 }, + { "royalblue" , 0x4169e1 }, + { "blue" , 0xff }, + { "dodger blue" , 0x1e90ff }, + { "dodgerblue" , 0x1e90ff }, + { "deep sky" , 0xbfff }, + { "deepskyblue" , 0xbfff }, + { "sky blue" , 0x87ceeb }, + { "skyblue" , 0x87ceeb }, + { "light sky" , 0x87cefa }, + { "lightskyblue" , 0x87cefa }, + { "steel blue" , 0x4682b4 }, + { "steelblue" , 0x4682b4 }, + { "light steel" , 0xb0c4de }, + { "lightsteelblue" , 0xb0c4de }, + { "light blue" , 0xadd8e6 }, + { "lightblue" , 0xadd8e6 }, + { "powder blue" , 0xb0e0e6 }, + { "powderblue" , 0xb0e0e6 }, + { "pale turquoise" , 0xafeeee }, + { "paleturquoise" , 0xafeeee }, + { "dark turquoise" , 0xced1 }, + { "darkturquoise" , 0xced1 }, + { "medium turquoise" , 0x48d1cc }, + { "mediumturquoise" , 0x48d1cc }, + { "turquoise" , 0x40e0d0 }, + { "cyan" , 0xffff }, + { "light cyan" , 0xe0ffff }, + { "lightcyan" , 0xe0ffff }, + { "cadet blue" , 0x5f9ea0 }, + { "cadetblue" , 0x5f9ea0 }, + { "medium aquamarine" , 0x66cdaa }, + { "mediumaquamarine" , 0x66cdaa }, + { "aquamarine" , 0x7fffd4 }, + { "dark green" , 0x6400 }, + { "darkgreen" , 0x6400 }, + { "dark olive" , 0x556b2f }, + { "darkolivegreen" , 0x556b2f }, + { "dark sea" , 0x8fbc8f }, + { "darkseagreen" , 0x8fbc8f }, + { "sea green" , 0x2e8b57 }, + { "seagreen" , 0x2e8b57 }, + { "medium sea" , 0x3cb371 }, + { "mediumseagreen" , 0x3cb371 }, + { "light sea" , 0x20b2aa }, + { "lightseagreen" , 0x20b2aa }, + { "pale green" , 0x98fb98 }, + { "palegreen" , 0x98fb98 }, + { "spring green" , 0xff7f }, + { "springgreen" , 0xff7f }, + { "lawn green" , 0x7cfc00 }, + { "lawngreen" , 0x7cfc00 }, + { "green" , 0xff00 }, + { "chartreuse" , 0x7fff00 }, + { "medium spring" , 0xfa9a }, + { "mediumspringgreen" , 0xfa9a }, + { "green yellow" , 0xadff2f }, + { "greenyellow" , 0xadff2f }, + { "lime green" , 0x32cd32 }, + { "limegreen" , 0x32cd32 }, + { "yellow green" , 0x9acd32 }, + { "yellowgreen" , 0x9acd32 }, + { "forest green" , 0x228b22 }, + { "forestgreen" , 0x228b22 }, + { "olive drab" , 0x6b8e23 }, + { "olivedrab" , 0x6b8e23 }, + { "dark khaki" , 0xbdb76b }, + { "darkkhaki" , 0xbdb76b }, + { "khaki" , 0xf0e68c }, + { "pale goldenrod" , 0xeee8aa }, + { "palegoldenrod" , 0xeee8aa }, + { "light goldenrod" , 0xfafad2 }, + { "lightgoldenrodyellow" , 0xfafad2 }, + { "light yellow" , 0xffffe0 }, + { "lightyellow" , 0xffffe0 }, + { "yellow" , 0xffff00 }, + { "gold" , 0xffd700 }, + { "light goldenrod" , 0xeedd82 }, + { "lightgoldenrod" , 0xeedd82 }, + { "goldenrod" , 0xdaa520 }, + { "dark goldenrod" , 0xb8860b }, + { "darkgoldenrod" , 0xb8860b }, + { "rosy brown" , 0xbc8f8f }, + { "rosybrown" , 0xbc8f8f }, + { "indian red" , 0xcd5c5c }, + { "indianred" , 0xcd5c5c }, + { "saddle brown" , 0x8b4513 }, + { "saddlebrown" , 0x8b4513 }, + { "sienna" , 0xa0522d }, + { "peru" , 0xcd853f }, + { "burlywood" , 0xdeb887 }, + { "beige" , 0xf5f5dc }, + { "wheat" , 0xf5deb3 }, + { "sandy brown" , 0xf4a460 }, + { "sandybrown" , 0xf4a460 }, + { "tan" , 0xd2b48c }, + { "chocolate" , 0xd2691e }, + { "firebrick" , 0xb22222 }, + { "brown" , 0xa52a2a }, + { "dark salmon" , 0xe9967a }, + { "darksalmon" , 0xe9967a }, + { "salmon" , 0xfa8072 }, + { "light salmon" , 0xffa07a }, + { "lightsalmon" , 0xffa07a }, + { "orange" , 0xffa500 }, + { "dark orange" , 0xff8c00 }, + { "darkorange" , 0xff8c00 }, + { "coral" , 0xff7f50 }, + { "light coral" , 0xf08080 }, + { "lightcoral" , 0xf08080 }, + { "tomato" , 0xff6347 }, + { "orange red" , 0xff4500 }, + { "orangered" , 0xff4500 }, + { "red" , 0xff0000 }, + { "hot pink" , 0xff69b4 }, + { "hotpink" , 0xff69b4 }, + { "deep pink" , 0xff1493 }, + { "deeppink" , 0xff1493 }, + { "pink" , 0xffc0cb }, + { "light pink" , 0xffb6c1 }, + { "lightpink" , 0xffb6c1 }, + { "pale violet" , 0xdb7093 }, + { "palevioletred" , 0xdb7093 }, + { "maroon" , 0xb03060 }, + { "medium violet" , 0xc71585 }, + { "mediumvioletred" , 0xc71585 }, + { "violet red" , 0xd02090 }, + { "violetred" , 0xd02090 }, + { "magenta" , 0xff00ff }, + { "violet" , 0xee82ee }, + { "plum" , 0xdda0dd }, + { "orchid" , 0xda70d6 }, + { "medium orchid" , 0xba55d3 }, + { "mediumorchid" , 0xba55d3 }, + { "dark orchid" , 0x9932cc }, + { "darkorchid" , 0x9932cc }, + { "dark violet" , 0x9400d3 }, + { "darkviolet" , 0x9400d3 }, + { "blue violet" , 0x8a2be2 }, + { "blueviolet" , 0x8a2be2 }, + { "purple" , 0xa020f0 }, + { "medium purple" , 0x9370db }, + { "mediumpurple" , 0x9370db }, + { "thistle" , 0xd8bfd8 }, + { "snow1" , 0xfffafa }, + { "snow2" , 0xeee9e9 }, + { "snow3" , 0xcdc9c9 }, + { "snow4" , 0x8b8989 }, + { "seashell1" , 0xfff5ee }, + { "seashell2" , 0xeee5de }, + { "seashell3" , 0xcdc5bf }, + { "seashell4" , 0x8b8682 }, + { "antiquewhite1" , 0xffefdb }, + { "antiquewhite2" , 0xeedfcc }, + { "antiquewhite3" , 0xcdc0b0 }, + { "antiquewhite4" , 0x8b8378 }, + { "bisque1" , 0xffe4c4 }, + { "bisque2" , 0xeed5b7 }, + { "bisque3" , 0xcdb79e }, + { "bisque4" , 0x8b7d6b }, + { "peachpuff1" , 0xffdab9 }, + { "peachpuff2" , 0xeecbad }, + { "peachpuff3" , 0xcdaf95 }, + { "peachpuff4" , 0x8b7765 }, + { "navajowhite1" , 0xffdead }, + { "navajowhite2" , 0xeecfa1 }, + { "navajowhite3" , 0xcdb38b }, + { "navajowhite4" , 0x8b795e }, + { "lemonchiffon1" , 0xfffacd }, + { "lemonchiffon2" , 0xeee9bf }, + { "lemonchiffon3" , 0xcdc9a5 }, + { "lemonchiffon4" , 0x8b8970 }, + { "cornsilk1" , 0xfff8dc }, + { "cornsilk2" , 0xeee8cd }, + { "cornsilk3" , 0xcdc8b1 }, + { "cornsilk4" , 0x8b8878 }, + { "ivory1" , 0xfffff0 }, + { "ivory2" , 0xeeeee0 }, + { "ivory3" , 0xcdcdc1 }, + { "ivory4" , 0x8b8b83 }, + { "honeydew1" , 0xf0fff0 }, + { "honeydew2" , 0xe0eee0 }, + { "honeydew3" , 0xc1cdc1 }, + { "honeydew4" , 0x838b83 }, + { "lavenderblush1" , 0xfff0f5 }, + { "lavenderblush2" , 0xeee0e5 }, + { "lavenderblush3" , 0xcdc1c5 }, + { "lavenderblush4" , 0x8b8386 }, + { "mistyrose1" , 0xffe4e1 }, + { "mistyrose2" , 0xeed5d2 }, + { "mistyrose3" , 0xcdb7b5 }, + { "mistyrose4" , 0x8b7d7b }, + { "azure1" , 0xf0ffff }, + { "azure2" , 0xe0eeee }, + { "azure3" , 0xc1cdcd }, + { "azure4" , 0x838b8b }, + { "slateblue1" , 0x836fff }, + { "slateblue2" , 0x7a67ee }, + { "slateblue3" , 0x6959cd }, + { "slateblue4" , 0x473c8b }, + { "royalblue1" , 0x4876ff }, + { "royalblue2" , 0x436eee }, + { "royalblue3" , 0x3a5fcd }, + { "royalblue4" , 0x27408b }, + { "blue1" , 0xff }, + { "blue2" , 0xee }, + { "blue3" , 0xcd }, + { "blue4" , 0x8b }, + { "dodgerblue1" , 0x1e90ff }, + { "dodgerblue2" , 0x1c86ee }, + { "dodgerblue3" , 0x1874cd }, + { "dodgerblue4" , 0x104e8b }, + { "steelblue1" , 0x63b8ff }, + { "steelblue2" , 0x5cacee }, + { "steelblue3" , 0x4f94cd }, + { "steelblue4" , 0x36648b }, + { "deepskyblue1" , 0xbfff }, + { "deepskyblue2" , 0xb2ee }, + { "deepskyblue3" , 0x9acd }, + { "deepskyblue4" , 0x688b }, + { "skyblue1" , 0x87ceff }, + { "skyblue2" , 0x7ec0ee }, + { "skyblue3" , 0x6ca6cd }, + { "skyblue4" , 0x4a708b }, + { "lightskyblue1" , 0xb0e2ff }, + { "lightskyblue2" , 0xa4d3ee }, + { "lightskyblue3" , 0x8db6cd }, + { "lightskyblue4" , 0x607b8b }, + { "slategray1" , 0xc6e2ff }, + { "slategray2" , 0xb9d3ee }, + { "slategray3" , 0x9fb6cd }, + { "slategray4" , 0x6c7b8b }, + { "lightsteelblue1" , 0xcae1ff }, + { "lightsteelblue2" , 0xbcd2ee }, + { "lightsteelblue3" , 0xa2b5cd }, + { "lightsteelblue4" , 0x6e7b8b }, + { "lightblue1" , 0xbfefff }, + { "lightblue2" , 0xb2dfee }, + { "lightblue3" , 0x9ac0cd }, + { "lightblue4" , 0x68838b }, + { "lightcyan1" , 0xe0ffff }, + { "lightcyan2" , 0xd1eeee }, + { "lightcyan3" , 0xb4cdcd }, + { "lightcyan4" , 0x7a8b8b }, + { "paleturquoise1" , 0xbbffff }, + { "paleturquoise2" , 0xaeeeee }, + { "paleturquoise3" , 0x96cdcd }, + { "paleturquoise4" , 0x668b8b }, + { "cadetblue1" , 0x98f5ff }, + { "cadetblue2" , 0x8ee5ee }, + { "cadetblue3" , 0x7ac5cd }, + { "cadetblue4" , 0x53868b }, + { "turquoise1" , 0xf5ff }, + { "turquoise2" , 0xe5ee }, + { "turquoise3" , 0xc5cd }, + { "turquoise4" , 0x868b }, + { "cyan1" , 0xffff }, + { "cyan2" , 0xeeee }, + { "cyan3" , 0xcdcd }, + { "cyan4" , 0x8b8b }, + { "darkslategray1" , 0x97ffff }, + { "darkslategray2" , 0x8deeee }, + { "darkslategray3" , 0x79cdcd }, + { "darkslategray4" , 0x528b8b }, + { "aquamarine1" , 0x7fffd4 }, + { "aquamarine2" , 0x76eec6 }, + { "aquamarine3" , 0x66cdaa }, + { "aquamarine4" , 0x458b74 }, + { "darkseagreen1" , 0xc1ffc1 }, + { "darkseagreen2" , 0xb4eeb4 }, + { "darkseagreen3" , 0x9bcd9b }, + { "darkseagreen4" , 0x698b69 }, + { "seagreen1" , 0x54ff9f }, + { "seagreen2" , 0x4eee94 }, + { "seagreen3" , 0x43cd80 }, + { "seagreen4" , 0x2e8b57 }, + { "palegreen1" , 0x9aff9a }, + { "palegreen2" , 0x90ee90 }, + { "palegreen3" , 0x7ccd7c }, + { "palegreen4" , 0x548b54 }, + { "springgreen1" , 0xff7f }, + { "springgreen2" , 0xee76 }, + { "springgreen3" , 0xcd66 }, + { "springgreen4" , 0x8b45 }, + { "green1" , 0xff00 }, + { "green2" , 0xee00 }, + { "green3" , 0xcd00 }, + { "green4" , 0x8b00 }, + { "chartreuse1" , 0x7fff00 }, + { "chartreuse2" , 0x76ee00 }, + { "chartreuse3" , 0x66cd00 }, + { "chartreuse4" , 0x458b00 }, + { "olivedrab1" , 0xc0ff3e }, + { "olivedrab2" , 0xb3ee3a }, + { "olivedrab3" , 0x9acd32 }, + { "olivedrab4" , 0x698b22 }, + { "darkolivegreen1" , 0xcaff70 }, + { "darkolivegreen2" , 0xbcee68 }, + { "darkolivegreen3" , 0xa2cd5a }, + { "darkolivegreen4" , 0x6e8b3d }, + { "khaki1" , 0xfff68f }, + { "khaki2" , 0xeee685 }, + { "khaki3" , 0xcdc673 }, + { "khaki4" , 0x8b864e }, + { "lightgoldenrod1" , 0xffec8b }, + { "lightgoldenrod2" , 0xeedc82 }, + { "lightgoldenrod3" , 0xcdbe70 }, + { "lightgoldenrod4" , 0x8b814c }, + { "lightyellow1" , 0xffffe0 }, + { "lightyellow2" , 0xeeeed1 }, + { "lightyellow3" , 0xcdcdb4 }, + { "lightyellow4" , 0x8b8b7a }, + { "yellow1" , 0xffff00 }, + { "yellow2" , 0xeeee00 }, + { "yellow3" , 0xcdcd00 }, + { "yellow4" , 0x8b8b00 }, + { "gold1" , 0xffd700 }, + { "gold2" , 0xeec900 }, + { "gold3" , 0xcdad00 }, + { "gold4" , 0x8b7500 }, + { "goldenrod1" , 0xffc125 }, + { "goldenrod2" , 0xeeb422 }, + { "goldenrod3" , 0xcd9b1d }, + { "goldenrod4" , 0x8b6914 }, + { "darkgoldenrod1" , 0xffb90f }, + { "darkgoldenrod2" , 0xeead0e }, + { "darkgoldenrod3" , 0xcd950c }, + { "darkgoldenrod4" , 0x8b6508 }, + { "rosybrown1" , 0xffc1c1 }, + { "rosybrown2" , 0xeeb4b4 }, + { "rosybrown3" , 0xcd9b9b }, + { "rosybrown4" , 0x8b6969 }, + { "indianred1" , 0xff6a6a }, + { "indianred2" , 0xee6363 }, + { "indianred3" , 0xcd5555 }, + { "indianred4" , 0x8b3a3a }, + { "sienna1" , 0xff8247 }, + { "sienna2" , 0xee7942 }, + { "sienna3" , 0xcd6839 }, + { "sienna4" , 0x8b4726 }, + { "burlywood1" , 0xffd39b }, + { "burlywood2" , 0xeec591 }, + { "burlywood3" , 0xcdaa7d }, + { "burlywood4" , 0x8b7355 }, + { "wheat1" , 0xffe7ba }, + { "wheat2" , 0xeed8ae }, + { "wheat3" , 0xcdba96 }, + { "wheat4" , 0x8b7e66 }, + { "tan1" , 0xffa54f }, + { "tan2" , 0xee9a49 }, + { "tan3" , 0xcd853f }, + { "tan4" , 0x8b5a2b }, + { "chocolate1" , 0xff7f24 }, + { "chocolate2" , 0xee7621 }, + { "chocolate3" , 0xcd661d }, + { "chocolate4" , 0x8b4513 }, + { "firebrick1" , 0xff3030 }, + { "firebrick2" , 0xee2c2c }, + { "firebrick3" , 0xcd2626 }, + { "firebrick4" , 0x8b1a1a }, + { "brown1" , 0xff4040 }, + { "brown2" , 0xee3b3b }, + { "brown3" , 0xcd3333 }, + { "brown4" , 0x8b2323 }, + { "salmon1" , 0xff8c69 }, + { "salmon2" , 0xee8262 }, + { "salmon3" , 0xcd7054 }, + { "salmon4" , 0x8b4c39 }, + { "lightsalmon1" , 0xffa07a }, + { "lightsalmon2" , 0xee9572 }, + { "lightsalmon3" , 0xcd8162 }, + { "lightsalmon4" , 0x8b5742 }, + { "orange1" , 0xffa500 }, + { "orange2" , 0xee9a00 }, + { "orange3" , 0xcd8500 }, + { "orange4" , 0x8b5a00 }, + { "darkorange1" , 0xff7f00 }, + { "darkorange2" , 0xee7600 }, + { "darkorange3" , 0xcd6600 }, + { "darkorange4" , 0x8b4500 }, + { "coral1" , 0xff7256 }, + { "coral2" , 0xee6a50 }, + { "coral3" , 0xcd5b45 }, + { "coral4" , 0x8b3e2f }, + { "tomato1" , 0xff6347 }, + { "tomato2" , 0xee5c42 }, + { "tomato3" , 0xcd4f39 }, + { "tomato4" , 0x8b3626 }, + { "orangered1" , 0xff4500 }, + { "orangered2" , 0xee4000 }, + { "orangered3" , 0xcd3700 }, + { "orangered4" , 0x8b2500 }, + { "red1" , 0xff0000 }, + { "red2" , 0xee0000 }, + { "red3" , 0xcd0000 }, + { "red4" , 0x8b0000 }, + { "deeppink1" , 0xff1493 }, + { "deeppink2" , 0xee1289 }, + { "deeppink3" , 0xcd1076 }, + { "deeppink4" , 0x8b0a50 }, + { "hotpink1" , 0xff6eb4 }, + { "hotpink2" , 0xee6aa7 }, + { "hotpink3" , 0xcd6090 }, + { "hotpink4" , 0x8b3a62 }, + { "pink1" , 0xffb5c5 }, + { "pink2" , 0xeea9b8 }, + { "pink3" , 0xcd919e }, + { "pink4" , 0x8b636c }, + { "lightpink1" , 0xffaeb9 }, + { "lightpink2" , 0xeea2ad }, + { "lightpink3" , 0xcd8c95 }, + { "lightpink4" , 0x8b5f65 }, + { "palevioletred1" , 0xff82ab }, + { "palevioletred2" , 0xee799f }, + { "palevioletred3" , 0xcd6889 }, + { "palevioletred4" , 0x8b475d }, + { "maroon1" , 0xff34b3 }, + { "maroon2" , 0xee30a7 }, + { "maroon3" , 0xcd2990 }, + { "maroon4" , 0x8b1c62 }, + { "violetred1" , 0xff3e96 }, + { "violetred2" , 0xee3a8c }, + { "violetred3" , 0xcd3278 }, + { "violetred4" , 0x8b2252 }, + { "magenta1" , 0xff00ff }, + { "magenta2" , 0xee00ee }, + { "magenta3" , 0xcd00cd }, + { "magenta4" , 0x8b008b }, + { "orchid1" , 0xff83fa }, + { "orchid2" , 0xee7ae9 }, + { "orchid3" , 0xcd69c9 }, + { "orchid4" , 0x8b4789 }, + { "plum1" , 0xffbbff }, + { "plum2" , 0xeeaeee }, + { "plum3" , 0xcd96cd }, + { "plum4" , 0x8b668b }, + { "mediumorchid1" , 0xe066ff }, + { "mediumorchid2" , 0xd15fee }, + { "mediumorchid3" , 0xb452cd }, + { "mediumorchid4" , 0x7a378b }, + { "darkorchid1" , 0xbf3eff }, + { "darkorchid2" , 0xb23aee }, + { "darkorchid3" , 0x9a32cd }, + { "darkorchid4" , 0x68228b }, + { "purple1" , 0x9b30ff }, + { "purple2" , 0x912cee }, + { "purple3" , 0x7d26cd }, + { "purple4" , 0x551a8b }, + { "mediumpurple1" , 0xab82ff }, + { "mediumpurple2" , 0x9f79ee }, + { "mediumpurple3" , 0x8968cd }, + { "mediumpurple4" , 0x5d478b }, + { "thistle1" , 0xffe1ff }, + { "thistle2" , 0xeed2ee }, + { "thistle3" , 0xcdb5cd }, + { "thistle4" , 0x8b7b8b }, + { "gray0" , 0x0 }, + { "grey0" , 0x0 }, + { "gray1" , 0x30303 }, + { "grey1" , 0x30303 }, + { "gray2" , 0x50505 }, + { "grey2" , 0x50505 }, + { "gray3" , 0x80808 }, + { "grey3" , 0x80808 }, + { "gray4" , 0xa0a0a }, + { "grey4" , 0xa0a0a }, + { "gray5" , 0xd0d0d }, + { "grey5" , 0xd0d0d }, + { "gray6" , 0xf0f0f }, + { "grey6" , 0xf0f0f }, + { "gray7" , 0x121212 }, + { "grey7" , 0x121212 }, + { "gray8" , 0x141414 }, + { "grey8" , 0x141414 }, + { "gray9" , 0x171717 }, + { "grey9" , 0x171717 }, + { "gray10" , 0x1a1a1a }, + { "grey10" , 0x1a1a1a }, + { "gray11" , 0x1c1c1c }, + { "grey11" , 0x1c1c1c }, + { "gray12" , 0x1f1f1f }, + { "grey12" , 0x1f1f1f }, + { "gray13" , 0x212121 }, + { "grey13" , 0x212121 }, + { "gray14" , 0x242424 }, + { "grey14" , 0x242424 }, + { "gray15" , 0x262626 }, + { "grey15" , 0x262626 }, + { "gray16" , 0x292929 }, + { "grey16" , 0x292929 }, + { "gray17" , 0x2b2b2b }, + { "grey17" , 0x2b2b2b }, + { "gray18" , 0x2e2e2e }, + { "grey18" , 0x2e2e2e }, + { "gray19" , 0x303030 }, + { "grey19" , 0x303030 }, + { "gray20" , 0x333333 }, + { "grey20" , 0x333333 }, + { "gray21" , 0x363636 }, + { "grey21" , 0x363636 }, + { "gray22" , 0x383838 }, + { "grey22" , 0x383838 }, + { "gray23" , 0x3b3b3b }, + { "grey23" , 0x3b3b3b }, + { "gray24" , 0x3d3d3d }, + { "grey24" , 0x3d3d3d }, + { "gray25" , 0x404040 }, + { "grey25" , 0x404040 }, + { "gray26" , 0x424242 }, + { "grey26" , 0x424242 }, + { "gray27" , 0x454545 }, + { "grey27" , 0x454545 }, + { "gray28" , 0x474747 }, + { "grey28" , 0x474747 }, + { "gray29" , 0x4a4a4a }, + { "grey29" , 0x4a4a4a }, + { "gray30" , 0x4d4d4d }, + { "grey30" , 0x4d4d4d }, + { "gray31" , 0x4f4f4f }, + { "grey31" , 0x4f4f4f }, + { "gray32" , 0x525252 }, + { "grey32" , 0x525252 }, + { "gray33" , 0x545454 }, + { "grey33" , 0x545454 }, + { "gray34" , 0x575757 }, + { "grey34" , 0x575757 }, + { "gray35" , 0x595959 }, + { "grey35" , 0x595959 }, + { "gray36" , 0x5c5c5c }, + { "grey36" , 0x5c5c5c }, + { "gray37" , 0x5e5e5e }, + { "grey37" , 0x5e5e5e }, + { "gray38" , 0x616161 }, + { "grey38" , 0x616161 }, + { "gray39" , 0x636363 }, + { "grey39" , 0x636363 }, + { "gray40" , 0x666666 }, + { "grey40" , 0x666666 }, + { "gray41" , 0x696969 }, + { "grey41" , 0x696969 }, + { "gray42" , 0x6b6b6b }, + { "grey42" , 0x6b6b6b }, + { "gray43" , 0x6e6e6e }, + { "grey43" , 0x6e6e6e }, + { "gray44" , 0x707070 }, + { "grey44" , 0x707070 }, + { "gray45" , 0x737373 }, + { "grey45" , 0x737373 }, + { "gray46" , 0x757575 }, + { "grey46" , 0x757575 }, + { "gray47" , 0x787878 }, + { "grey47" , 0x787878 }, + { "gray48" , 0x7a7a7a }, + { "grey48" , 0x7a7a7a }, + { "gray49" , 0x7d7d7d }, + { "grey49" , 0x7d7d7d }, + { "gray50" , 0x7f7f7f }, + { "grey50" , 0x7f7f7f }, + { "gray51" , 0x828282 }, + { "grey51" , 0x828282 }, + { "gray52" , 0x858585 }, + { "grey52" , 0x858585 }, + { "gray53" , 0x878787 }, + { "grey53" , 0x878787 }, + { "gray54" , 0x8a8a8a }, + { "grey54" , 0x8a8a8a }, + { "gray55" , 0x8c8c8c }, + { "grey55" , 0x8c8c8c }, + { "gray56" , 0x8f8f8f }, + { "grey56" , 0x8f8f8f }, + { "gray57" , 0x919191 }, + { "grey57" , 0x919191 }, + { "gray58" , 0x949494 }, + { "grey58" , 0x949494 }, + { "gray59" , 0x969696 }, + { "grey59" , 0x969696 }, + { "gray60" , 0x999999 }, + { "grey60" , 0x999999 }, + { "gray61" , 0x9c9c9c }, + { "grey61" , 0x9c9c9c }, + { "gray62" , 0x9e9e9e }, + { "grey62" , 0x9e9e9e }, + { "gray63" , 0xa1a1a1 }, + { "grey63" , 0xa1a1a1 }, + { "gray64" , 0xa3a3a3 }, + { "grey64" , 0xa3a3a3 }, + { "gray65" , 0xa6a6a6 }, + { "grey65" , 0xa6a6a6 }, + { "gray66" , 0xa8a8a8 }, + { "grey66" , 0xa8a8a8 }, + { "gray67" , 0xababab }, + { "grey67" , 0xababab }, + { "gray68" , 0xadadad }, + { "grey68" , 0xadadad }, + { "gray69" , 0xb0b0b0 }, + { "grey69" , 0xb0b0b0 }, + { "gray70" , 0xb3b3b3 }, + { "grey70" , 0xb3b3b3 }, + { "gray71" , 0xb5b5b5 }, + { "grey71" , 0xb5b5b5 }, + { "gray72" , 0xb8b8b8 }, + { "grey72" , 0xb8b8b8 }, + { "gray73" , 0xbababa }, + { "grey73" , 0xbababa }, + { "gray74" , 0xbdbdbd }, + { "grey74" , 0xbdbdbd }, + { "gray75" , 0xbfbfbf }, + { "grey75" , 0xbfbfbf }, + { "gray76" , 0xc2c2c2 }, + { "grey76" , 0xc2c2c2 }, + { "gray77" , 0xc4c4c4 }, + { "grey77" , 0xc4c4c4 }, + { "gray78" , 0xc7c7c7 }, + { "grey78" , 0xc7c7c7 }, + { "gray79" , 0xc9c9c9 }, + { "grey79" , 0xc9c9c9 }, + { "gray80" , 0xcccccc }, + { "grey80" , 0xcccccc }, + { "gray81" , 0xcfcfcf }, + { "grey81" , 0xcfcfcf }, + { "gray82" , 0xd1d1d1 }, + { "grey82" , 0xd1d1d1 }, + { "gray83" , 0xd4d4d4 }, + { "grey83" , 0xd4d4d4 }, + { "gray84" , 0xd6d6d6 }, + { "grey84" , 0xd6d6d6 }, + { "gray85" , 0xd9d9d9 }, + { "grey85" , 0xd9d9d9 }, + { "gray86" , 0xdbdbdb }, + { "grey86" , 0xdbdbdb }, + { "gray87" , 0xdedede }, + { "grey87" , 0xdedede }, + { "gray88" , 0xe0e0e0 }, + { "grey88" , 0xe0e0e0 }, + { "gray89" , 0xe3e3e3 }, + { "grey89" , 0xe3e3e3 }, + { "gray90" , 0xe5e5e5 }, + { "grey90" , 0xe5e5e5 }, + { "gray91" , 0xe8e8e8 }, + { "grey91" , 0xe8e8e8 }, + { "gray92" , 0xebebeb }, + { "grey92" , 0xebebeb }, + { "gray93" , 0xededed }, + { "grey93" , 0xededed }, + { "gray94" , 0xf0f0f0 }, + { "grey94" , 0xf0f0f0 }, + { "gray95" , 0xf2f2f2 }, + { "grey95" , 0xf2f2f2 }, + { "gray96" , 0xf5f5f5 }, + { "grey96" , 0xf5f5f5 }, + { "gray97" , 0xf7f7f7 }, + { "grey97" , 0xf7f7f7 }, + { "gray98" , 0xfafafa }, + { "grey98" , 0xfafafa }, + { "gray99" , 0xfcfcfc }, + { "grey99" , 0xfcfcfc }, + { "gray100" , 0xffffff }, + { "grey100" , 0xffffff }, + { "dark grey" , 0xa9a9a9 }, + { "darkgrey" , 0xa9a9a9 }, + { "dark gray" , 0xa9a9a9 }, + { "darkgray" , 0xa9a9a9 }, + { "dark blue" , 0x8b }, + { "darkblue" , 0x8b }, + { "dark cyan" , 0x8b8b }, + { "darkcyan" , 0x8b8b }, + { "dark magenta" , 0x8b008b }, + { "darkmagenta" , 0x8b008b }, + { "dark red" , 0x8b0000 }, + { "darkred" , 0x8b0000 }, + { "light green" , 0x90ee90 }, + { "lightgreen" , 0x90ee90 }, + { "none", -1 }, + { 0, 0 } +}; diff --git a/minilibx_beta/mlx_string_put.c b/minilibx_beta/mlx_string_put.c new file mode 100644 index 0000000..435493c --- /dev/null +++ b/minilibx_beta/mlx_string_put.c @@ -0,0 +1,72 @@ + +#include "mlx.h" + +#include "font.c" + +#define ATLAS_NB_CHAR 95 + +#define FONT_WIDTH ((font_atlas.width/(ATLAS_NB_CHAR))-2) + + +int mlx_put_image_to_window_scale(void *mlx_ptr, void *win_ptr, void *img_ptr, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, unsigned int color); + +void mlx_int_fill(unsigned char *data, int sl) +{ + int i, j; + j = 0; + while (j < font_atlas.height) + { + i = 0; + while (i < font_atlas.width) + { + data[j*sl+i*4] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+2]; + data[j*sl+i*4+1] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+1]; + data[j*sl+i*4+2] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4]; + data[j*sl+i*4+3] = 0xFF - font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+3]; + i ++; + } + j ++; + } + +} + +int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string) +{ + static void *font = (void *)0; + static unsigned char *data = (void *)0; + static int size_line = 0; + int bpp; + int endian; + int pos; + int val; + int dest_w; + int dest_h; + + if (font == (void *)0) + { + font = mlx_new_image(mlx_ptr, font_atlas.width, font_atlas.height); + data = (unsigned char *)mlx_get_data_addr(font, &bpp, &size_line, &endian); + mlx_int_fill(data, size_line); + } + + color = (color&0xFFFFFF)|0xFF000000; + + // dest_w = (FONT_WIDTH*5)/7; /// ratio with X11 standard mlx_string_put + // dest_h = (font_atlas.height*5)/7; + dest_w = FONT_WIDTH; + dest_h = font_atlas.height; + y = y - (dest_h*3)/4; + + pos = 0; + while (*string) + { + if (*string >= 32 && *string <= 127) + val = *string - 32; + else + val = 31; + mlx_put_image_to_window_scale(mlx_ptr, win_ptr, font, val*(FONT_WIDTH+2), 0, FONT_WIDTH, font_atlas.height, x+pos*dest_w, y, dest_w, dest_h, color); + pos ++; + string ++; + } + return (0); +} diff --git a/minilibx_beta/mlx_window.swift b/minilibx_beta/mlx_window.swift new file mode 100644 index 0000000..0b578d8 --- /dev/null +++ b/minilibx_beta/mlx_window.swift @@ -0,0 +1,541 @@ + +import Cocoa +import Metal +import MetalKit +import Darwin + +import mlx_image + + +class WinEvent: NSWindow +{ + var eventFuncts = [UnsafeMutableRawPointer?]() + var eventParams = [UnsafeMutableRawPointer]() + + var keyrepeat = 1 + var keyflag:UInt32 = 0 + + var size_y:Int + + init(frame rect:CGRect) + { + for _ in 0...31 + { + eventFuncts.append(Optional.none) + eventParams.append(UnsafeMutableRawPointer(&keyrepeat)) /// dummy address here, null not needed + } + + let wsm = NSWindow.StyleMask(rawValue: NSWindow.StyleMask.titled.rawValue|NSWindow.StyleMask.closable.rawValue|NSWindow.StyleMask.miniaturizable.rawValue) + let bck = NSWindow.BackingStoreType.buffered + size_y = Int(rect.size.height) + super.init(contentRect: rect, styleMask: wsm, backing: bck, defer: false) + } + + func setNotifs() + { + NotificationCenter.default.addObserver(self, selector: #selector(exposeNotification(_:)), name: NSWindow.didBecomeKeyNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(deminiaturizeNotification(_:)), name: NSWindow.didDeminiaturizeNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(closeNotification(_:)), name: NSWindow.willCloseNotification, object: nil) + +/*** + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidBecomeKeyNotification" object:win]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(deminiaturizeNotification:) name:@"NSWindowDidDeminiaturizeNotification" object:win]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(closeNotification:) name:@"NSWindowWillCloseNotification" object:win]; +***/ + + } + + func delNotifs() + { + NotificationCenter.default.removeObserver(self, name: NSWindow.willCloseNotification, object: nil) + } + + public func setKeyRepeat(_ mode:Int) + { + keyrepeat = mode; + } + + + func addHook(index idx:Int, fct fptr:UnsafeMutableRawPointer?, param pptr:UnsafeMutableRawPointer) + { + eventFuncts[idx] = fptr; + eventParams[idx] = pptr; + if (idx == 6 || idx == 32) + { + if (fptr != nil) /// == nullptr) + { self.acceptsMouseMovedEvents = true } + else { self.acceptsMouseMovedEvents = false } + } + } + + + override func keyDown(with event: NSEvent) + { + /// print("got keydown with code: \(event.keyCode) ") + if (event.isARepeat && keyrepeat == 0) + { return } + if (eventFuncts[2] != nil) + { + _ = unsafeBitCast(eventFuncts[2],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(Int32(event.keyCode), eventParams[2]) + } + } + + + override func keyUp(with event: NSEvent) + { + /// print("got keyup with code: \(event.keyCode) and calling key hook") + if (event.isARepeat && keyrepeat == 0) + { return } + if (eventFuncts[3] != nil) + { + _ = unsafeBitCast(eventFuncts[3],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(Int32(event.keyCode), eventParams[3]) + } + } + + + func get_mouse_button(with ev:NSEvent) -> Int + { + switch (ev.type) { + case NSEvent.EventType.leftMouseDown, + NSEvent.EventType.leftMouseUp, + NSEvent.EventType.leftMouseDragged: + return 1; + case NSEvent.EventType.rightMouseDown, + NSEvent.EventType.rightMouseUp, + NSEvent.EventType.rightMouseDragged: + return 2; + case NSEvent.EventType.otherMouseDown, + NSEvent.EventType.otherMouseUp, + NSEvent.EventType.otherMouseDragged: + return 3; + default: + return 0; + } + } + + + + func mouse(with event: NSEvent, index idx:Int, type t:Int) + { + var thepoint:NSPoint + var button:Int + + thepoint = event.locationInWindow + button = get_mouse_button(with:event) + /// button = event.buttonNumber + /// print(" mouse down button \(event.buttonNumber) at location \(thepoint.x) x \(thepoint.y)") + if (eventFuncts[idx] != nil) + { + if (t == 0) + { _ = unsafeBitCast(eventFuncts[idx],to:(@convention(c)(Int32, Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(button), Int32(thepoint.x), Int32(size_y-1-Int(thepoint.y)), eventParams[idx]) } + if (t == 1) + { _ = unsafeBitCast(eventFuncts[idx],to:(@convention(c)(Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(thepoint.x), Int32(size_y-1-Int(thepoint.y)), eventParams[idx]) } + } + } + + override func mouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) } + override func rightMouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) } + override func otherMouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) } + + override func mouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) } + override func rightMouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) } + override func otherMouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) } + + override func mouseMoved(with event: NSEvent) { mouse(with:event, index:6, type:1) } + override func mouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) } + override func rightMouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) } + override func otherMouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) } + + + override func scrollWheel(with event: NSEvent) + { + var thepoint:NSPoint + var button = 0; + + thepoint = event.locationInWindow + if (event.deltaY > 0.2) { button = 4; } + if (event.deltaY < -0.2) { button = 5; } + if (event.deltaX > 0.2) { button = 6; } + if (event.deltaX < -0.2) { button = 7; } + if (button != 0 && eventFuncts[4] != nil) + { + _ = unsafeBitCast(eventFuncts[4],to:(@convention(c)(Int32, Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(button), Int32(thepoint.x), Int32(thepoint.y), eventParams[4]) + } + } + + + override func flagsChanged(with event: NSEvent) + { + var flag:UInt32 + var the_key:Int32 + var val:UInt32 + + flag = UInt32(event.modifierFlags.rawValue) + val = (keyflag|flag)&(~(keyflag&flag)) + if (val == 0) + { return } /// no change - can happen when loosing focus on special key pressed, then re-pressed later + the_key = 1 + while (((val >> (the_key-1)) & 0x01)==0) + { the_key += 1 } + if (flag > keyflag && eventFuncts[2] != nil) + { _ = unsafeBitCast(eventFuncts[2],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(0xFF+the_key, eventParams[2]) } + if (flag < keyflag && eventFuncts[3] != nil) + { _ = unsafeBitCast(eventFuncts[3],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(0xFF+the_key, eventParams[3]) } + keyflag = flag + } + + + @objc func exposeNotification(_ notification:Notification) + { + if (eventFuncts[12] != nil) + { + _ = unsafeBitCast(eventFuncts[12],to:(@convention(c)(UnsafeRawPointer)->Int32).self)(eventParams[12]) + } + } + + @objc func closeNotification(_ notification:Notification) + { + if (eventFuncts[17] != nil) + { + _ = unsafeBitCast(eventFuncts[17],to:(@convention(c)(UnsafeRawPointer)->Int32).self)(eventParams[17]) + } + } + + @objc func deminiaturizeNotification(_ notification:Notification) + { + exposeNotification(notification) + } + +} + + + + + +struct textureList +{ + var uniformBuffer: MTLBuffer! + var uniform_data:UnsafeMutablePointer + unowned var image:MlxImg +} + + +public class MlxWin +{ + let vrect: CGRect + var winE: WinEvent + var mlayer: CAMetalLayer + + unowned var device: MTLDevice + var commandQueue: MTLCommandQueue! + var pipelineState: MTLRenderPipelineState! + var vertexBuffer: MTLBuffer! + + var texture_list: Array = Array() + var texture_list_count = 0 + + var pixel_image:MlxImg + var pixel_count:Int + + var drawable_image: MlxImg + var uniq_renderPassDescriptor: MTLRenderPassDescriptor + var mtl_origin_null : MTLOrigin + var mtl_size_all : MTLSize + var doClear = false + var GPUbatch = 0 + + + public init(device d:MTLDevice, width w:Int, height h:Int, title t:String) + { + vrect = CGRect(x: 100, y: 100, width: w, height: h) + winE = WinEvent(frame: vrect) + + device = d + mlayer = CAMetalLayer() + mlayer.device = device + mlayer.pixelFormat = .bgra8Unorm + mlayer.framebufferOnly = true + mlayer.contentsScale = 1.0 /// winE.screen!.backingScaleFactor + mlayer.frame = vrect + winE.contentView! = NSView(frame: vrect) + winE.contentView!.wantsLayer = true + winE.contentView!.layer = mlayer + winE.title = t + winE.isReleasedWhenClosed = false + winE.makeKeyAndOrderFront(nil) + + + /// drawable_image = MlxImg(d: device, w:Int(CGFloat(vrect.size.width)*winE.screen!.backingScaleFactor), h:Int(CGFloat(vrect.size.height)*winE.screen!.backingScaleFactor), t:1) + drawable_image = MlxImg(d: device, w:Int(vrect.size.width), h:Int(vrect.size.height), t:1) + pixel_image = MlxImg(d: device, w:Int(vrect.size.width), h:Int(vrect.size.height)) + for i in 0...(pixel_image.texture_height*pixel_image.texture_sizeline/4-1) + { pixel_image.texture_data[i] = UInt32(0xFF000000) } + pixel_count = 0 + + mtl_origin_null = MTLOriginMake(0,0,0) + mtl_size_all = MTLSizeMake(drawable_image.texture.width, drawable_image.texture.height, 1) + + uniq_renderPassDescriptor = MTLRenderPassDescriptor() + uniq_renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha:0.0) + uniq_renderPassDescriptor.colorAttachments[0].texture = drawable_image.texture + uniq_renderPassDescriptor.colorAttachments[0].storeAction = .store + uniq_renderPassDescriptor.colorAttachments[0].loadAction = .load + } + + +/// winEvent calls + public func getWinEFrame() -> NSRect { return winE.frame } + public func getScreenFrame() -> NSRect { return winE.screen!.frame } + public func getMouseLoc() -> NSPoint { return winE.mouseLocationOutsideOfEventStream } + public func addHook(index idx:Int, fct fptr:UnsafeMutableRawPointer, param pptr:UnsafeMutableRawPointer) + { winE.addHook(index: idx, fct: fptr, param: pptr) } + public func setKeyRepeat(_ mode:Int) { winE.setKeyRepeat(mode) } + public func destroyWinE() { winE.close() } + public func setNotifs() { winE.setNotifs() } + public func delNotifs() { winE.delNotifs() } + + + public func initMetal() + { + commandQueue = device.makeCommandQueue()! + + /// vertex buffer & shaders stay the always the same. + let lib = try! device.makeLibrary(source: shaders, options: nil) + let vertexFunction = lib.makeFunction(name: "basic_vertex_function") + let fragmentFunction = lib.makeFunction(name: "basic_fragment_function") + let pipelineDesc = MTLRenderPipelineDescriptor() + pipelineDesc.colorAttachments[0].pixelFormat = .bgra8Unorm + pipelineDesc.colorAttachments[0].isBlendingEnabled = true + pipelineDesc.colorAttachments[0].rgbBlendOperation = .add + pipelineDesc.colorAttachments[0].alphaBlendOperation = .add + pipelineDesc.colorAttachments[0].sourceRGBBlendFactor = .oneMinusSourceAlpha + pipelineDesc.colorAttachments[0].sourceAlphaBlendFactor = .oneMinusSourceAlpha + pipelineDesc.colorAttachments[0].destinationRGBBlendFactor = .sourceAlpha + pipelineDesc.colorAttachments[0].destinationAlphaBlendFactor = .sourceAlpha + pipelineDesc.vertexFunction = vertexFunction + pipelineDesc.fragmentFunction = fragmentFunction + pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineDesc) + + let vertexData: [Float] = [ + -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, + -1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, + 1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, + 1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, + -1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, + 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0 ] + var dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0]) + vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: []) + + let uniformData: [Float] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Float(vrect.size.width), Float(vrect.size.height), 0.0, 0.0, 0.0, 0.0, + 1.0, 1.0, 1.0, 1.0 ] + dataSize = uniformData.count * MemoryLayout.size(ofValue: uniformData[0]) + for _ in 0...255 + { + let uniformBuffer = device.makeBuffer(bytes: uniformData, length: dataSize, options: [])! + let uniform_data = (uniformBuffer.contents()).assumingMemoryBound(to:Float.self) + texture_list.append(textureList(uniformBuffer:uniformBuffer, uniform_data:uniform_data, image:pixel_image)) + } + + self.clearWin(); + } + + + public func clearWin() + { + /// discard previous put_images, doClear become first operation in next render pass. + var i = 0 + while i < texture_list_count + { + texture_list[i].image.onGPU -= 1 + i += 1 + } + texture_list_count = 0 + doClear = true + /// next flush images should call draw(), even if there is no image to put + } + + func flushPixels() + { + if (pixel_count > 0) + { + pixel_count = 0 + self.putImage(image:pixel_image, x:0, y:0) + } + } + + public func flushImages() + { + flushPixels() + if (texture_list_count > 0 || doClear) + { + self.draw() + } + } + + public func waitForGPU() + { + while (GPUbatch > 0) { } + } + + + public func pixelPut(_ x:Int32, _ y:Int32, _ color:UInt32) + { + if (pixel_count == 0) + { + while (pixel_image.onGPU > 0) + { + if (GPUbatch > 0) { waitForGPU() } + else { flushImages() } + } + for i in 0...pixel_image.texture_height*pixel_image.texture_sizeline/4-1 + { pixel_image.texture_data[i] = UInt32(0xFF000000) } + } + let t = (x&(Int32(vrect.size.width-1)-x))&(y&(Int32(vrect.size.height-1)-y)) + if t >= 0 + { + pixel_image.texture_data[Int(y)*pixel_image.texture_sizeline/4+Int(x)] = color + pixel_count += 1 + } + } + + public func putImage(image img:MlxImg, x posx:Int32, y posy:Int32) + { + flushPixels() + putImageScale(image:img, sx:0, sy:0, sw:Int32(img.texture_width), sh:Int32(img.texture_height), + dx:posx, dy:posy, dw:Int32(img.texture_width), dh:Int32(img.texture_height), + c:UInt32(0xFFFFFFFF)) + } + + public func putImageScale(image img:MlxImg, sx src_x:Int32, sy src_y:Int32, sw src_w:Int32, sh src_h:Int32, dx dest_x:Int32, dy dest_y:Int32, dw dest_w:Int32, dh dest_h:Int32, c color:UInt32) + { + flushPixels() + if (texture_list_count == 0) /// means I just draw + { + waitForGPU() /// to be able to write again in uniforms + } + texture_list[texture_list_count].uniform_data[0] = Float(img.texture_width) + texture_list[texture_list_count].uniform_data[1] = Float(img.texture_height) + texture_list[texture_list_count].uniform_data[2] = Float(src_x) + texture_list[texture_list_count].uniform_data[3] = Float(src_y) + texture_list[texture_list_count].uniform_data[4] = Float(src_w) + texture_list[texture_list_count].uniform_data[5] = Float(src_h) + + texture_list[texture_list_count].uniform_data[8] = Float(dest_x) + texture_list[texture_list_count].uniform_data[9] = Float(dest_y) + texture_list[texture_list_count].uniform_data[10] = Float(dest_w) + texture_list[texture_list_count].uniform_data[11] = Float(dest_h) + + texture_list[texture_list_count].uniform_data[12] = Float((color>>16)&0xFF)/255.0; + texture_list[texture_list_count].uniform_data[13] = Float((color>>8)&0xFF)/255.0; + texture_list[texture_list_count].uniform_data[14] = Float((color>>0)&0xFF)/255.0; + texture_list[texture_list_count].uniform_data[15] = Float((color>>24)&0xFF)/255.0; + + texture_list[texture_list_count].image = img + img.onGPU += 1 + + texture_list_count += 1 + if (texture_list_count == 255) /// keep 1 slot for put_pixels image + { + flushImages() + } + } + + + func draw() + { + var commandBuffer = commandQueue.makeCommandBuffer()! + +/// clear if asked + if (doClear) + { + uniq_renderPassDescriptor.colorAttachments[0].loadAction = .clear + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: uniq_renderPassDescriptor)! + commandEncoder.endEncoding() + uniq_renderPassDescriptor.colorAttachments[0].loadAction = .load + doClear = false + } + +/// then draw the images if any. + var i = 0 + while i < texture_list_count + { + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: uniq_renderPassDescriptor)! + commandEncoder.setRenderPipelineState(pipelineState) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder.setVertexBuffer(texture_list[i].uniformBuffer, offset: 0, index: 1) + commandEncoder.setFragmentTexture(texture_list[i].image.texture, index: 0) + commandEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 6, instanceCount:2) + commandEncoder.endEncoding() + ({ j in + commandBuffer.addCompletedHandler { cb in self.texture_list[j].image.onGPU -= 1 } + })(i) + i += 1 + } + texture_list_count = 0 + commandBuffer.addCompletedHandler { cb in self.GPUbatch -= 1 } + commandBuffer.commit() + GPUbatch += 1 + +/// finally copy to MTLdrawable to present, using a new commandqueue + commandBuffer = commandQueue.makeCommandBuffer()! + let curdraw = mlayer.nextDrawable()! + + let commandBEncoder = commandBuffer.makeBlitCommandEncoder()! + commandBEncoder.copy(from:drawable_image.texture, sourceSlice:0, sourceLevel:0, sourceOrigin: mtl_origin_null, sourceSize: mtl_size_all, to:curdraw.texture, destinationSlice:0, destinationLevel:0, destinationOrigin: mtl_origin_null) + commandBEncoder.endEncoding() + + commandBuffer.addCompletedHandler { cb in self.GPUbatch -= 1 } + commandBuffer.present(curdraw) + commandBuffer.commit() + GPUbatch += 1 + } + + +} + + + + +let shaders = """ +#include +using namespace metal; + +struct VertexIn { + float4 position; + float4 UV; +}; +struct VertexOut { + float4 position [[ position ]]; + float4 color; + float2 UV; +}; +struct uniforms { + packed_float2 origin_size; + packed_float2 origin_pos; + packed_float2 origin_sub; + packed_float2 dest_size; + packed_float2 dest_pos; + packed_float2 dest_sub; + packed_float4 color; +}; +vertex VertexOut basic_vertex_function(const device VertexIn *vertices [[ buffer(0) ]], constant uniforms& uni [[ buffer(1) ]], +uint vertexID [[ vertex_id ]]) +{ + VertexOut vOut; + float4 start = float4((2.0*uni.dest_pos.x)/(uni.dest_size.x-1.0) - 1.0, 1.0 - (2.0*uni.dest_pos.y)/(uni.dest_size.y-1.0) - (uni.dest_sub.y*2.0)/uni.dest_size.y, 0.0, 0.0); + /* vOut.position = (start + (vertices[vertexID].position + 1.0) * float4(uni.dest_sub, 0.0, 0.0))/float4(uni.dest_size, 1.0, 1.0); */ + + vOut.position = float4(start.x+((vertices[vertexID].position.x + 1.0)*uni.dest_sub.x)/(uni.dest_size.x), + start.y+((vertices[vertexID].position.y + 1.0)*uni.dest_sub.y)/(uni.dest_size.y), 0.0, 1.0); + + vOut.UV = (uni.origin_pos + float2(vertices[vertexID].UV.x, vertices[vertexID].UV.y)*(uni.origin_sub-1.0))/(uni.origin_size-1.0); + vOut.color = uni.color; + return vOut; +} +fragment float4 basic_fragment_function(VertexOut vIn [[ stage_in ]], texture2d texture [[ texture(0) ]]) +{ + constexpr sampler textureSampler(address::clamp_to_edge); + return vIn.color*texture.sample(textureSampler, vIn.UV); +} +""" + diff --git a/minilibx_beta/mlx_window.swiftdoc b/minilibx_beta/mlx_window.swiftdoc new file mode 100644 index 0000000..71bb8c8 Binary files /dev/null and b/minilibx_beta/mlx_window.swiftdoc differ diff --git a/minilibx_beta/mlx_window.swiftmodule b/minilibx_beta/mlx_window.swiftmodule new file mode 100644 index 0000000..8f3f8a3 Binary files /dev/null and b/minilibx_beta/mlx_window.swiftmodule differ diff --git a/minilibx_beta/mlx_xpm.c b/minilibx_beta/mlx_xpm.c new file mode 100644 index 0000000..25fdafe --- /dev/null +++ b/minilibx_beta/mlx_xpm.c @@ -0,0 +1,384 @@ +// mlx xpm +// by ol + +#include +#include +#include +#include +#include +#include + +#include "mlx.h" + +typedef struct s_xpm_col +{ + int name; + int col; +} t_xpm_col; + + +struct s_col_name +{ + char *name; + int color; +}; + +//extern struct s_col_name mlx_col_name[]; +#include "mlx_rgb.c" + + +#define RETURN { if (colors) free(colors); if (tab) free(tab); \ + if (colors_direct) free(colors_direct); \ + if (img) mlx_destroy_image(xvar, img); \ + return ((void *)0); } + + + + +// +// str 2 wordtab & co + +int mlx_int_str_str(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + + len_f = strlen(find); + if (len_f>len) + return (-1); + pos = 0; + while (*(str+len_f-1)) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + str ++; + pos ++; + } + return (-1); +} + + + +int mlx_int_str_str_cote(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + int cote; + + len_f = strlen(find); + if (len_f>len) + return (-1); + cote = 0; + pos = 0; + while (*(str+len_f-1)) + { + if (*str=='"') + cote = 1-cote; + if (!cote) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + } + str ++; + pos ++; + } + return (-1); +} + + +char **mlx_int_str_to_wordtab(char *str) +{ + char **tab; + int pos; + int nb_word; + int len; + + len = strlen(str); + nb_word = 0; + pos = 0; + while (poslen) + { + if (copy) + free(copy); + if (!(copy = malloc(len2+1))) + return ((char *)0); + len = len2; + } + /* strcpy(copy,str); */ + strlcpy(copy, str, len2+1); + return (copy); +} + + +int mlx_int_get_col_name(char *str,int size) +{ + int result; + + result = 0; + while (size--) + result = (result<<8)+*(str++); + return (result); +} + +int mlx_int_get_text_rgb(char *name, char *end) +{ + int i; + char buff[64]; + + if (*name == '#') + return (strtol(name+1,0,16)); + if (end) + { + snprintf(buff, 64, "%s %s", name, end); + name = buff; + } + i = 0; + while (mlx_col_name[i].name) + { + if (!strcasecmp(mlx_col_name[i].name, name)) + return (mlx_col_name[i].color); + i ++; + } + return (0); +} + + +void mlx_int_xpm_set_pixel(char *data, int opp, int col, int x) +{ + *((unsigned int *)(data+4*x)) = col; +} + + +void *mlx_int_parse_xpm(void *xvar,void *info,int info_size,char *(*f)(), int *width, int *height) +{ + int pos; + char *line; + char **tab; + char *data; + char *clip_data; + int nc; + int opp; + int sl; + int endian; + int cpp; + int col; + int rgb_col; + int col_name; + int method; + int x; + int i; + int j; + void *img; + t_xpm_col *colors; + int *colors_direct; + + colors = 0; + colors_direct = 0; + img = 0; + tab = 0; + pos = 0; + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line)) || !(*width = atoi(tab[0])) || + !(*height = atoi(tab[1])) || !(nc = atoi(tab[2])) || + !(cpp = atoi(tab[3])) ) + RETURN; + free(tab); + tab = 0; + + method = 0; + if (cpp<=2) + { + method = 1; + if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int)))) + RETURN; + } + else + if (!(colors = malloc(nc*sizeof(*colors)))) + RETURN; + + clip_data = 0; + + i = nc; + while (i--) + { + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line+cpp)) ) + RETURN; + j = 0; + while (tab[j] && strcmp(tab[j++],"c")); + + if (!tab[j]) + RETURN; + + rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]); + if (method) + colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; + else + { + colors[i].name = mlx_int_get_col_name(line,cpp); + colors[i].col = rgb_col; + } + free(tab); + tab = 0; + } + + if (!(img = mlx_new_image(xvar,*width,*height))) + RETURN; + data = mlx_get_data_addr(img, &opp, &sl, &endian); + opp = 4; + + i = *height; + while (i--) + { + if (!(line = f(info,&pos,info_size))) + RETURN; + x = 0; + while (x<*width) + { + col = 0; + col_name = mlx_int_get_col_name(line+cpp*x,cpp); + if (method) + col = colors_direct[col_name]; + else + { + j = nc; + while (j--) + if (colors[j].name==col_name) + { + col = colors[j].col; + j = 0; + } + } + if (col==-1) + col = 0xFF000000; + mlx_int_xpm_set_pixel(data, opp, col, x); + x ++; + } + data += sl; //img->width*4; + } + if (colors) + free(colors); + if (colors_direct) + free(colors_direct); + return (img); +} + + +void mlx_int_file_get_rid_comment(char *ptr, int size) +{ + int com_begin; + int com_end; + + while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+4); + } + while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+3); + } +} + + +void *mlx_xpm_file_to_image(void *xvar,char *file,int *width,int *height) +{ + int fd; + int size; + char *ptr; + void *img; + + if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || + (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== + (void *)MAP_FAILED) + { + if (fd>=0) + close(fd); + return ((void *)0); + } + mlx_int_file_get_rid_comment(ptr, size); + img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line, width, height); + munmap(ptr,size); + close(fd); + return (img); +} + +void *mlx_xpm_to_image(void *xvar,char **xpm_data,int *width,int *height) +{ + return (mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line, width, height)); +} diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index a2ce3b1..3d3595a 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -21,11 +21,9 @@ void int32_t x; int32_t y; int8_t i; - int32_t col; i = -1; - col = 0x00ce2524; - while (++i < 100) + while (++i < 15) { cl->red_scr.img = mlx_new_image(cl->wlist.wlx, cl->wlist.x_size, cl->wlist.y_size); @@ -37,7 +35,7 @@ void { while (++x < (int32_t)cl->wlist.x_size) *(int*)(cl->red_scr.ptr + - (x * 4 + (y * cl->red_scr.sizeline))) = col; + (x * 4 + (y * cl->red_scr.sizeline))) = 0x00ce2524; x = -1; } mlx_put_image_to_window(cl->wlist.wlx, -- cgit v1.2.3 From 114df1314a69161e5802ce6192aa8f1599867f3e Mon Sep 17 00:00:00 2001 From: Rudy Bousset Date: Wed, 11 Mar 2020 15:30:51 +0100 Subject: qweqwe --- src/ft_draw_scene.c | 12 ++++++------ src/ft_exit.c | 1 + src/ft_suffer_animation.c | 33 ++++++++++++++++----------------- src/ft_treat_args.c | 9 +++++---- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/ft_draw_scene.c b/src/ft_draw_scene.c index 4d15df2..9664363 100644 --- a/src/ft_draw_scene.c +++ b/src/ft_draw_scene.c @@ -41,10 +41,10 @@ static int8_t void ft_draw_scene(t_cub *clist) { - clist->img.img = mlx_new_image(clist->wlist.wlx, - clist->wlist.x_size, clist->wlist.y_size); - clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, - &clist->img.sizeline, &clist->img.endian); + /* clist->img.img = mlx_new_image(clist->wlist.wlx, */ + /* clist->wlist.x_size, clist->wlist.y_size); */ + /* clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, */ + /* &clist->img.sizeline, &clist->img.endian); */ ft_castray(clist); if (clist->ishud) { @@ -53,7 +53,7 @@ void if (clist->mlist.isskybox) ft_draw_skybox(clist); mlx_put_image_to_window(clist->wlist.wlx, - clist->wlist.winptr, clist->img.img, 0, 0); + clist->wlist.winptr, clist->img.img, 0, 0); if (clist->ishud && clist->mlist.isnlvl) { if (ft_put_stage(clist) < 0) @@ -61,7 +61,7 @@ void ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, clist); } } - mlx_destroy_image(clist->wlist.wlx, clist->img.img); + /* mlx_destroy_image(clist->wlist.wlx, clist->img.img); */ } void diff --git a/src/ft_exit.c b/src/ft_exit.c index 4a131c8..e0093da 100644 --- a/src/ft_exit.c +++ b/src/ft_exit.c @@ -73,6 +73,7 @@ int ft_del_tex(clist); if (clist->wlist.inited) { + mlx_destroy_image(clist->wlist.wlx, clist->img.img); mlx_destroy_window(clist->wlist.wlx, clist->wlist.winptr); clist->wlist.winptr = NULL; } diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index 3d3595a..2a1beb4 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -14,6 +14,7 @@ #include #include #include +#include void ft_suffer_animation(t_cub *cl) @@ -22,24 +23,22 @@ void int32_t y; int8_t i; - i = -1; - while (++i < 15) + /* cl->red_scr.img = mlx_new_image(cl->wlist.wlx, */ + /* cl->wlist.x_size, cl->wlist.y_size); */ + /* cl->red_scr.ptr = mlx_get_data_addr(cl->red_scr.img, &cl->red_scr.bpp, */ + /* &cl->red_scr.sizeline, &cl->red_scr.endian); */ + y = -1; + while (++y < (int32_t)cl->wlist.y_size) { - cl->red_scr.img = mlx_new_image(cl->wlist.wlx, - cl->wlist.x_size, cl->wlist.y_size); - cl->red_scr.ptr = mlx_get_data_addr(cl->red_scr.img, &cl->red_scr.bpp, - &cl->red_scr.sizeline, &cl->red_scr.endian); x = -1; - y = -1; - while (++y < (int32_t)cl->wlist.y_size) - { - while (++x < (int32_t)cl->wlist.x_size) - *(int*)(cl->red_scr.ptr + - (x * 4 + (y * cl->red_scr.sizeline))) = 0x00ce2524; - x = -1; - } - mlx_put_image_to_window(cl->wlist.wlx, - cl->wlist.winptr, cl->red_scr.img, 0, 0); - mlx_destroy_image(cl->wlist.wlx, cl->red_scr.img); + while (++x < (int32_t)cl->wlist.x_size) + *(int*)(cl->img.ptr + + (x * 4 + (y * cl->img.sizeline))) = 0x00ffffff; } + i = -1; + mlx_put_image_to_window(cl->wlist.wlx, + cl->wlist.winptr, cl->img.img, 0, 0); + sleep(5); + /* while (++i < 120) */ + /* mlx_destroy_image(cl->wlist.wlx, cl->red_scr.img); */ } diff --git a/src/ft_treat_args.c b/src/ft_treat_args.c index a47f9f7..fe794d8 100644 --- a/src/ft_treat_args.c +++ b/src/ft_treat_args.c @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -35,14 +36,14 @@ uint8_t if (argc < 3) { if (ft_init_winptr(clist) < 0) - { return (ft_exit(FT_RET_FAILED_MLX, clist)); - } + clist->img.img = mlx_new_image(clist->wlist.wlx, + clist->wlist.x_size, clist->wlist.y_size); + clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, + &clist->img.sizeline, &clist->img.endian); ft_draw_scene(clist); if (clist->mlist.ismusic) - { ft_enable_music(clist); - } ft_hooks_and_loops(&clist->wlist, clist); } else if (argc == 3 && !ft_strncmp("--save", argv[2], 7)) -- cgit v1.2.3 From 7f77c9bc922fb608f689385d642304956afe0492 Mon Sep 17 00:00:00 2001 From: Rudy Bousset Date: Wed, 11 Mar 2020 16:07:29 +0100 Subject: Performance --- Makefile | 2 -- inc/cub3d.h | 1 + inc/cub3d_structs.h | 1 + src/ft_draw_scene.c | 11 ++++------- src/ft_hex_to_rgb.c | 11 +++++++++++ src/ft_init_lists.c | 1 + src/ft_key_loop.c | 7 +++---- src/ft_suffer_animation.c | 26 ++++++++++++++------------ 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 9fbd0f2..c3c4e0e 100644 --- a/Makefile +++ b/Makefile @@ -183,9 +183,7 @@ all: ${NAME} clean: ifeq (${OS}, Darwin) @$(MAKE) --no-print-directory -C ${MLX_DIR} clean -ifdef BETA ${RM} libmlx.dylib -endif endif @$(MAKE) --no-print-directory -C ${LFT_DIR} clean ${RM} ${OBJS_DIR} diff --git a/inc/cub3d.h b/inc/cub3d.h index 4172c9d..ae353ae 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -33,6 +33,7 @@ t_rgb ft_init_rgb(void); int8_t ft_init_map(t_map *mlist); t_bmp_file ft_init_bmp(void); t_bmp_info ft_init_bmp_info(void); +t_rgb ft_hex_to_og_rgb(uint32_t color); /* ** ====== HOOKS ====== diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 310ba90..957d154 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -208,6 +208,7 @@ typedef struct s_cub uint8_t ishud; uint8_t walltexgood; uint8_t isoldmus; + uint8_t doicast; uint16_t currlvl; uint16_t i; char *const *envp; diff --git a/src/ft_draw_scene.c b/src/ft_draw_scene.c index 9664363..39cdadc 100644 --- a/src/ft_draw_scene.c +++ b/src/ft_draw_scene.c @@ -45,22 +45,19 @@ void /* clist->wlist.x_size, clist->wlist.y_size); */ /* clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, */ /* &clist->img.sizeline, &clist->img.endian); */ - ft_castray(clist); + if (clist->doicast) + ft_castray(clist); + else + clist->doicast = 1; if (clist->ishud) - { ft_draw_hud(clist); - } if (clist->mlist.isskybox) ft_draw_skybox(clist); mlx_put_image_to_window(clist->wlist.wlx, clist->wlist.winptr, clist->img.img, 0, 0); if (clist->ishud && clist->mlist.isnlvl) - { if (ft_put_stage(clist) < 0) - { ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, clist); - } - } /* mlx_destroy_image(clist->wlist.wlx, clist->img.img); */ } diff --git a/src/ft_hex_to_rgb.c b/src/ft_hex_to_rgb.c index 30332cc..1732473 100644 --- a/src/ft_hex_to_rgb.c +++ b/src/ft_hex_to_rgb.c @@ -13,6 +13,17 @@ #include #include +t_rgb + ft_hex_to_og_rgb(uint32_t color) +{ + t_rgb rgb; + + rgb.r = (color >> 16) & 255; + rgb.g = (color >> 8) & 255; + rgb.b = color & 255; + return (rgb); +} + t_bmp_rgb ft_hex_to_rgb(uint32_t color) { diff --git a/src/ft_init_lists.c b/src/ft_init_lists.c index 79b0d14..d480912 100644 --- a/src/ft_init_lists.c +++ b/src/ft_init_lists.c @@ -74,6 +74,7 @@ static int8_t cl->key_input[i] = -1; cl->ishud = 0; cl->isoldmus = 0; + cl->doicast = 1; cl->f_rgb = ft_init_rgb(); cl->c_rgb = ft_init_rgb(); cl->rlist = ft_init_s_ray(); diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index e0c2c28..45ed379 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -55,8 +56,8 @@ static void y = ft_find_y(key, pl); if (cl->mlist.map[y][x] == 'T') { - pl->pos_x = old_x + ((old_x - x) / 4); - pl->pos_y = old_y + ((old_y - y) / 4); + pl->pos_x = old_x + ((old_x - x) / 3); + pl->pos_y = old_y + ((old_y - y) / 3); ft_suffer_animation(cl); x = ft_find_x(key, pl); y = ft_find_y(key, pl); @@ -93,8 +94,6 @@ int i++; } if (cl->key_input[0] != -1) - { ft_draw_scene(cl); - } return (0); } diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index 2a1beb4..1a9b51a 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -21,24 +21,26 @@ void { int32_t x; int32_t y; - int8_t i; + int32_t col; + t_rgb rgb; - /* cl->red_scr.img = mlx_new_image(cl->wlist.wlx, */ - /* cl->wlist.x_size, cl->wlist.y_size); */ - /* cl->red_scr.ptr = mlx_get_data_addr(cl->red_scr.img, &cl->red_scr.bpp, */ - /* &cl->red_scr.sizeline, &cl->red_scr.endian); */ y = -1; + col = 0x00880000; while (++y < (int32_t)cl->wlist.y_size) { x = -1; while (++x < (int32_t)cl->wlist.x_size) + { + rgb = ft_hex_to_og_rgb(*(int*)(cl->img.ptr + + (x * 4 + (y * cl->img.sizeline)))); + rgb.r += 120; *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = 0x00ffffff; + (x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(rgb); + } + /* if (y < (int32_t)cl->wlist.y_size / 2) */ + /* col += 0x00000000; */ + /* else */ + /* col -= 0x00000000; */ } - i = -1; - mlx_put_image_to_window(cl->wlist.wlx, - cl->wlist.winptr, cl->img.img, 0, 0); - sleep(5); - /* while (++i < 120) */ - /* mlx_destroy_image(cl->wlist.wlx, cl->red_scr.img); */ + cl->doicast = 0; } -- cgit v1.2.3 From 7b61072321c71c1612a7b33d2e8d722a49c5bc99 Mon Sep 17 00:00:00 2001 From: Rudy Bousset Date: Wed, 11 Mar 2020 18:06:17 +0100 Subject: ca tue --- Makefile | 2 + inc/cub3d.h | 2 + inc/cub3d_structs.h | 4 +- map/lvl_five.cub | 13 +- map/map_one.cub | 2 +- media/img/spikes.xpm | 451 ++++++++++++++++++++++++++++++++++++++++++++++ src/ft_draw_scene.c | 5 - src/ft_draw_traps.c | 110 +++++++++++ src/ft_draw_traps_extra.c | 44 +++++ src/ft_get_player_spawn.c | 1 + src/ft_raycasting.c | 1 + src/ft_suffer_animation.c | 14 +- 12 files changed, 628 insertions(+), 21 deletions(-) create mode 100644 media/img/spikes.xpm create mode 100644 src/ft_draw_traps.c create mode 100644 src/ft_draw_traps_extra.c diff --git a/Makefile b/Makefile index c3c4e0e..d00464f 100644 --- a/Makefile +++ b/Makefile @@ -88,6 +88,8 @@ SRCS_NAME += ft_init_bmp.c SRCS_NAME += ft_floor_cast.c SRCS_NAME += ft_floor_cast_inits.c SRCS_NAME += ft_suffer_animation.c +SRCS_NAME += ft_draw_traps.c +SRCS_NAME += ft_draw_traps_extra.c #--------------------------------------------------------------------------------------------------# SRCS = $(addprefix ${SRCS_DIR},${SRCS_NAME}) #--------------------------------------------------------------------------------------------------# diff --git a/inc/cub3d.h b/inc/cub3d.h index ae353ae..016677a 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -78,6 +78,8 @@ void ft_sprite_width(t_cub *cl, t_sprite *sprite); void ft_sprite_height(t_cub *cl, t_sprite *sprite); void ft_calc_sprite(t_cub *cl); void ft_draw_sprite(t_cub *cl, t_sprite *sprite); +void ft_calc_trap(t_cub *cl); +void ft_draw_traps(t_cub *cl, t_sprite *sprite); void ft_draw_skybox(t_cub *cl); void ft_suffer_animation(t_cub *cl); diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 957d154..7a30d09 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -182,9 +182,9 @@ typedef struct s_map size_t map_h; size_t mapl_len; int32_t sprite_nbr; - int32_t sprite_order[12]; + int32_t sprite_order[4096]; int32_t traps_nbr; - int32_t traps_order[12]; + int32_t traps_order[512]; size_t line_chk; size_t map_start; uint8_t isspawn; diff --git a/map/lvl_five.cub b/map/lvl_five.cub index 02df893..bd8acab 100644 --- a/map/lvl_five.cub +++ b/map/lvl_five.cub @@ -12,24 +12,25 @@ F ./media/img/plate_small.xpm LT ./media/img/larry_world.xpm L ./map/map_four.cub +T ./media/img/spikes.xpm SH 16 MU ./media/sound/TAPE-DU-PIED-ET-FRAPPE-TA-TANTE.wav 111111111111111111111111111111 -100000000000000000000000000001 +1T0000000000000000000000000001 11111101111110110111111110111111 - 1111101 101001 10000001 + 1111101 101T01 10000001 1000001 11101101 1111110111111 - 1101101 10000001 1000000000001 + 11T1101 10000001 1T00000000001 101101 111111101 1111111111101 111101 101 101 1000001 101 1011101 101 1011101 101 - 11110000011111N1 1010001 101 + 11110000011111N1 101T001 101 1011011111101111 10111111101 101101 1L0011 10000000001 100001 110111111111111111101 101101 11110000000000000000001 - 101101 10111111111110011111101 + 101101 1011111111111T011111101 111011111101111111111110111111011 -100000000000000000000000000000001 +1T00000000000000000000000000000T1 111111111111111111111111111111111 diff --git a/map/map_one.cub b/map/map_one.cub index 285fbf0..a774b0a 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -9,7 +9,7 @@ S ./media/img/pillar.xpm C 50,100,200 F 50,190,124 -T ./media/img/linus.xpm +T ./media/img/spikes.xpm SH 4 111111111111111111 diff --git a/media/img/spikes.xpm b/media/img/spikes.xpm new file mode 100644 index 0000000..2aef2ea --- /dev/null +++ b/media/img/spikes.xpm @@ -0,0 +1,451 @@ +/* XPM */ +static char *spikes[] = { +/* columns rows colors chars-per-pixel */ +"316 316 129 2 ", +" c #000000", +". c #080705", +"X c #0A0906", +"o c #0C0C0B", +"O c #100D06", +"+ c #100F0C", +"@ c #12110E", +"# c #18160E", +"$ c #151412", +"% c #181713", +"& c #1B1A15", +"* c #1D1C1A", +"= c #211E16", +"- c #201F1A", +"; c #252116", +": c #24221C", +"> c #29261E", +", c #2D291F", +"< c #312D1E", +"1 c #252422", +"2 c #292721", +"3 c #2C2A23", +"4 c #2D2D2A", +"5 c #312D24", +"6 c #312F29", +"7 c #353126", +"8 c #3A3526", +"9 c #3D3927", +"0 c #34322B", +"q c #3A362B", +"w c #3D392C", +"e c #353432", +"r c #383732", +"t c #3C3A33", +"y c #3D3C3A", +"u c #413B27", +"i c #423C2C", +"p c #483F2F", +"a c #423E33", +"s c #413F39", +"d c #46412D", +"f c #4A442E", +"g c #454135", +"h c #4E4935", +"j c #434138", +"k c #44423B", +"l c #474539", +"z c #46443E", +"x c #494738", +"c c #484639", +"v c #4E4B3A", +"b c #504735", +"n c #534B35", +"m c #534C3C", +"M c #504E3C", +"N c #504C3F", +"B c #594F3C", +"V c #575035", +"C c #595136", +"Z c #57523D", +"A c #55523E", +"S c #59543F", +"D c #5F593C", +"F c #62573F", +"G c #635B3D", +"H c #695E3F", +"J c #444443", +"K c #474642", +"L c #484540", +"P c #4C4940", +"I c #4D4C42", +"U c #494844", +"Y c #4E4C45", +"T c #4D4C4B", +"R c #514E40", +"E c #514F4A", +"W c #504F4D", +"Q c #555144", +"! c #595540", +"~ c #585443", +"^ c #5D5640", +"/ c #5D5741", +"( c #5B5444", +") c #51504A", +"_ c #54534F", +"` c #585648", +"' c #5A5649", +"] c #5D5A4B", +"[ c #525252", +"{ c #595755", +"} c #5E5B52", +"| c #605642", +" . c #635B44", +".. c #605B46", +"X. c #6A5E45", +"o. c #635C4B", +"O. c #695E4A", +"+. c #625E52", +"@. c #635F53", +"#. c #676046", +"$. c #6C6345", +"%. c #6B634C", +"&. c #716746", +"*. c #72664B", +"=. c #756A4B", +"-. c #796D4C", +";. c #77704C", +":. c #7C724E", +">. c #656253", +",. c #6B6553", +"<. c #6E6955", +"1. c #666358", +"2. c #6A6759", +"3. c #6D695A", +"4. c #706751", +"5. c #736B54", +"6. c #7A6D53", +"7. c #736D5B", +"8. c #796F59", +"9. c #7D7353", +"0. c #76705D", +"q. c #7B735C", +"w. c #6F6C61", +"e. c #736E60", +"r. c #757061", +"t. c #7B7561", +"y. c #7E7862", +"u. c #817551", +"i. c #827B63", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . o ", +" o * o + * o * . o o ", +" o 1 4 * * e % * e % o 1 : o ", +" $ e e 1 o o 1 e * 1 y * $ e 4 o ", +" $ 0 e e * & t r * . + e e * $ e 4 & ", +" : e t e $ * y t 4 + 1 J t : * 0 r 3 o ", +" & t y t 0 $ o 4 j j y % 4 [ j 4 o $ 0 t t & ", +" 1 W c t 3 o % y I j y & 3 [ j 0 $ @ 7 t t & ", +" : I c g 3 o % y x j 0 $ + e I x 0 - @ 0 x t = ", +" : c v g > o & t v v q $ * J I v g 0 o & w x x 0 & ", +" X 2 v M h 3 & : R v v g & * I N N h 0 o * w v v I 6 o ", +" : w Z Z N 7 * $ o 6 ' ~ ~ h = 1 I ~ S N t @ $ : g Z Z ~ x * ", +" * r Z Q Z n t 1 1 $ X 6 ~ ~ S v : 3 } ' S ~ v : o 1 3 h Z Z ~ j * ", +" * I ~ ~ S S i 1 1 o @ w S G ~ Z 7 X 6 >.] / ~ ~ > + 2 7 n S S S g & ", +" 0 >. . . .D t : * . : N .~ .~ w @ 4 o.$./ .G 5 * e 0 S . .~ Z ; ", +" * I <.$.$. .#.x : * o ; ~ $.$.$. .n & o q o.#.#.#.X.0 o $ 0 0 S . .$.D 7 ", +" 4 3.7.$.$.$.#.x > 0 * . > .$.$.$.$.N ; @ w .$.$.$.$.v & o : 8 .$.$.$. .w @ ", +" 0 3.=.=.$.=.$.n 3 0 * . X 8 $.*.=.*.$.S > @ w $.&.&.&.$. .> o * 7 .&.=.=.$.V ; ", +" 5 o.&.-.-.=.*.~ 3 1 @ & x $.=.-.=.&.$.< & j $.=.;.5.=.$.5 . % * w $.=.=.=.=.X.9 + ", +" X 8 $.=.-.:.=.=. .5 * $ ; n $.-.:.-.=.=.8 3 #.=.=.:.:.=.5.8 o 4 : g 6.-.-.:.-.=.o.2 ", +" : S 9.:.u.u.9.9.$.0 - 4 $ ; S &.u.u.u.:.9.i X w q.u.:.u.u.:.:.w @ 3 ; x u.:.u.u.9.:.u.w ", +" . 0 5.9.:.:.u.:.u.H < 2 s 4 + 5 $.:.:.:.:.:.:.u X w 9.9.:.u.u.:.;.d O $ 4 > n 9.:.u.u.u.9.u.w ", +" . a 9.-.:.:.:.:.:.G < > y J * o 8 &.$.:.:.:.:.&.f O 8 *.=.:.:.:.:.:.f # * 2 > f -.:.u.:.9.=.;.g @ ", +" q 3.F D G &.=.-.G 8 : e J & + q S G G G G G G 9 X o 3 n G #.$.&.;.;.f # $ 4 - & u &.:.=.&.$.G .a % ", +" 4 [ x f C G $.$.V 8 > 2 4 + o 0 v d d d b V f < X $ 0 i d V D G $.&.h = $ e 1 % 8 G $.G S n x a 5 @ ", +" o 5 L x n G .G C d < = * + + 2 q i 9 u u 9 w 0 $ % e t d h C D D G D : o 2 2 & < C F n n i 8 5 - % ", +" + 4 s R ~ S $. .| N q > & $ . $ > 5 5 5 7 < 3 5 0 $ @ 6 q 9 i d d f V v > $ 4 2 & 5 i f u u 8 8 3 3 4 $ ", +" . 2 E R +.4.#.o.$.X.S 8 : # $ o . $ 4 6 5 5 5 5 5 < > 3 $ + 4 3 < 7 0 0 w w t 0 @ $ 4 & % 5 i i u q 8 q 0 4 y * ", +" + y [ o.7.7.<.$.5.<.H i > % $ % $ . + 6 q q q u u q 7 5 > 3 o . + * 2 < 7 7 0 w w g t * * * + & 0 i p d p i i q 0 e % ", +" $ e I O.7.7.4.8.6.u.X.p > & % * 1 o . + 5 p a p x p a 8 5 > 2 + . + 1 > 5 5 8 q q a i x s : . . 1 % % * r a N N B b p i 5 3 1 o ", +" o 1 x O.<.O.7.u.8.8.%.p > & * 1 y * $ 8 N Q Q Q x a q 5 2 > % . $ e 8 6 8 q t a a v x p 4 o . * e * % 2 t p Q F F N p i 7 6 e & ", +" o 3 j %.7.O.7.u.i.q.*.x 2 = % 1 y * & a Q ' | R x p w 6 2 > 4 . 1 E y 5 i i a g s p x a 0 o * e - & 6 t s ~ $.o.R p i 7 6 y 1 o ", +" * t ' O.O.3.4.i.u.6.4.N 3 - & * 4 1 + X * x ' O. .R N g a q 5 3 e * X 1 [ s a a g x j x b s a 6 $ o * % & 0 t x ' 4.o.Q N p 7 6 e * ", +" $ e j / o.O.e.4.7.7.u.8.N 5 - % $ 4 J * 5 { 4.+.' ~ v x t q 5 6 y * - J a p s x L L N N s a e $ . % $ - t t v S <.o.B N s i 6 2 $ ", +" . 1 y Z +. .+.7.w.7.7.e.i.' 6 - % $ e T 4 X e +.8.O.] ~ I g a q 0 6 e % $ e r x I R R R R L s a t : . . + % $ : q a I ~ o.o.R B s a 6 5 $ ", +" $ e y ~ ] / >.7.7.7.u.i.i.' e 1 * $ 4 J 1 + a +.4.@.] ] ~ j a t 0 3 4 + X % 6 s L N E R R N N B a y 3 + . . 1 $ @ : t g N ~ o.' Q N B p r 6 - . ", +" % y J R ] ~ >.w.4.e.w.w.y.[ e * % $ 4 T 4 X $ e I o.+.] ' R I s a q 4 1 + & 8 x R Q ' ' R Q N s a y y % . o 1 $ $ : a g h v o.>.Q Q a s r 6 2 % ", +" * J j R ~ [ ' 7.7.e.e.e.i.} 0 - * $ 4 T 1 o & e s N ~ ' ] Q I j t 0 6 1 o $ 0 L ~ [ ~ ~ T v x x s y j * + 1 $ $ 3 x I x ' @.@.' R x s r 6 2 4 $ ", +" o 4 j j I R ~ ' +.+.1.1.1.e.} 0 * * @ 1 e * X - 6 r a R ~ ' I j j t r 4 : o $ 0 x [ ~ ~ R I I j j j t j * % 1 $ $ 6 R R R R @.@.E L x s r 5 e e $ ", +" 1 T y j I I R E o.+.+.e.e.w.' e - * @ @ * % . $ 1 0 0 t y x I ~ j j a e 6 1 $ . $ q I [ ] ] ~ I v j j j t t & . * * $ + 2 j R R ' +.' E R x s r 6 5 2 * ", +" 1 E J j x I I ~ o.+.+.w.e.e.} a - % @ @ * 4 + + 4 4 0 0 0 t t x I I j j t 4 1 & X & r R S o.~ [ ~ I I L j y r & o * * + @ : a x R .+.[ ' E I s r 6 6 2 4 $ ", +" 4 J j j j x x R ' +.@.e.w.e.} a * % + $ * e * . @ e 0 0 0 0 0 r t v I L j y e 2 % o 2 t [ o.+.+.' I I R L t t 0 : . o + @ $ : t g L O.O.+.[ R R x a e 5 2 r * ", +" $ e j s t s a x R ' +.@.1.4.e.} s - * $ o 1 y * % e 0 6 6 3 6 7 7 t v j j t 0 4 - o + 3 t ' +.>.>.+.I I R x s 0 0 3 o . o o @ @ - t g I .+.+.' [ I L s e 6 5 4 * ", +" $ t y a a a s x N | ' o.O.7.u.+.s - % $ + * e % * t 6 4 3 3 4 6 7 w t g g t t 4 1 o o 2 a o.+.#.} ] [ R I x x t w 0 $ . . o @ $ : q j N O.O. .N N x L s 7 e 2 1 * . ", +" & e t a t g p b B Q ' ' O.4.4.4.s - % $ + % 4 % + 4 3 3 3 3 3 6 7 7 w a a i q 6 1 o o 3 a | o.] ] ] ' E R N x g t r : o . o + @ @ - i x ~ O.+.~ R N N x a e 5 2 1 1 o ", +" 1 e q w a g x b n B F X.X.*.<.5.j 3 % $ + $ * o + 1 1 2 5 2 5 < 7 5 8 q i i 7 5 * O . $ 3 i | O.o.] ] _ M I c h g a w 2 o + + @ $ * 0 x | X.| F B N b p i i 5 2 1 * o ", +" . : 0 q q i a f b C B | X.*.*.$.5.~ 3 * $ @ + o $ - - = = > 5 5 < 7 7 q i i i 5 > + . @ 3 i ~ o.o.o.} ~ Q g R s g i q : X o + @ $ = 7 x F | | B B B b p i 8 5 5 2 * . ", +" o 1 0 0 0 w i p h h B | X.O.X.o.<.~ q * $ $ o o . % * - - 2 2 , > , 7 8 q i q i 4 4 % . & 3 w B .S _ ] ~ W I c c a a w 5 + . @ @ @ @ & 0 x N B B B V N b a i 5 5 5 2 : @ ", +" * 4 4 5 0 w w i i j b N B ' S S o. .g 1 $ @ $ % o . * * * - - = = > > > < 5 7 7 7 6 2 % & 3 t N R ~ ~ ~ _ I Z c c a a t q % @ * $ @ @ : q j x p x p p x a a 5 8 6 5 1 1 $ . ", +" @ 4 4 4 7 7 0 q q q i i p h S .~ o.S h 5 & @ & 1 + @ & & - = = > > > > > 5 8 i q 0 3 % X * 0 g N v N n v v g v j v x p a w % * 1 $ o @ : w x p f i i u i i i q 7 7 3 1 1 1 o ", +" $ 4 1 1 > < 7 7 8 8 i u i p R | S S N g < ; & * 1 + X * ; > , , 5 < < 8 8 8 8 i i i q > % . X : w h n n c h h h h v n n n n n i & o % * $ o @ & 0 n n C b b f d d d i 9 9 7 7 7 0 $ ", +" o & & : < 7 8 9 9 u u f i f b n n n d 8 > ; * $ % + o * t q 9 u u p u u d d d d x d d u > + $ : 8 x h n n S G G D .$.$.$.H F u & @ @ + + @ = 8 G $.$.H H G C C V f d u u 8 w e $ ", +" . % : & > 7 7 8 8 9 9 i u u i i p d i 8 3 > : * % % $ + + e j a p d x b d x h h n n B N n i 3 % $ . $ 4 3 w d x n S G $.*.$. .$.$.&.X.F i 6 @ o + + + + & 8 n *.-.6.=.&.G C n f d d 9 8 < 3 1 o ", +" . * 4 & * : > > > > > 3 > 7 7 7 7 6 6 6 2 2 ; * & $ & & o . * e e 0 0 w a a g j v R N | +.<.' a 7 * $ . & y q w g g I ~ ] >.<.<.~ ~ o.| R x t y * o * $ + @ + - x .5.5.;.<. .h w w 7 7 6 > > > - & @ ", +" . * * * * - - : - : : : 1 3 3 6 6 6 6 < 4 1 : & & $ & 1 $ . + e e e 0 0 t a a g I R ~ ' o.4.7.$.g 0 : o . * y t t j v ' >.<.<.<.<.+.o.3.O.R x t r 1 o + * $ + @ @ = a .5.>.<.<. .g 3 0 3 3 > > > : - - % + ", +" + * * % * - - - 1 : : 3 3 3 6 6 6 6 6 4 4 1 : * & $ * 1 1 o * e e 0 0 r t g g j v R ~ ] >.7.7.] t w 1 $ * y t a v ~ ] <.0.q.<.7.<.>.3.3.' v t 0 4 o . + % + + @ $ * t ] o.%.3.<.] g 0 0 6 6 4 2 > 1 - - * % ", +" + 4 * * * * * * - - : 3 1 2 3 3 4 6 6 6 2 > 1 ; * & $ $ 1 e % * T t 0 r r t j j j N ~ _ ] +.7.3._ t 0 2 $ & e t j j I ] 3.r.7.7.1.+.#.3.7.[ I t 0 1 o . $ $ o $ + $ & t ] .>.3.<.>.j w 0 3 4 2 2 2 1 - - * & + ", +" . * e 1 & * & * - : : 1 4 2 2 2 6 6 4 4 6 4 > : : * * $ $ 1 J * . * y q r r r a j x j I R [ o.+.1.7.I w r > @ . . % e e j x T ' >.3.3.3.<. .>.<.<.{ I a 0 : X o + + @ $ @ & t >.0.0.3.3.3.Z t 6 6 6 4 > 2 1 - - * * 1 + ", +" + e e 1 * * * * - - : 1 2 2 2 3 4 6 2 6 6 2 4 1 * # $ & $ * e % . * e t t t a j j J v R [ [ } 1.1.<.x w r 6 & $ 4 t j x ~ } >.3.3.3.>.>.3.7.<.+._ a 0 1 o . $ + + + @ $ & w #.t.t.q.3.1.W a 6 6 3 2 2 2 1 1 1 * 4 e % ", +" % e 4 - * * * - * - 1 1 1 2 2 4 4 6 4 3 3 3 2 1 ; * * & o * 1 * % e y a t y s x j j x ~ ' ] +.1.7.+.t 7 r 7 & . * e t j v _ >.>.3.1.1.>.>.3.e.3.>.~ j r 4 % . . % @ + @ @ @ & w $.q.t.r.3.+.I t 0 6 6 2 4 2 1 1 1 * 1 e * . ", +" % 0 1 * * * - * - - - 1 1 2 2 3 6 4 6 6 6 6 > 1 : * & & $ * e J e [ j a a s x L x v I R o.+.>.1.w.<.t r t 0 = o o 2 r t j x ~ ] 1.3.>.>.' ] 3.3.3.1.' x e e e % . + + + @ @ % & g $.q.;.3.3.} W t 7 6 6 4 2 4 1 1 1 1 * 1 * X ", +" $ e * * * : : * : ; : > 2 5 > < 6 5 2 3 3 4 4 2 1 ; * $ $ # e { y { L s j x v N N N N ] .o.4.7.0.>.g q q 0 ; o $ 4 q a x I ' o.+.O.O.O. .+.3.3.>.>.' N a r J * . o + + + @ % : v >.%.o.<.7.1.S c w r 7 7 0 > = 2 > > - 2 0 $ ", +" $ 1 * * & : : : : : : > > > 5 2 2 4 4 3 6 4 2 2 ; ; * # # $ : y 4 I J j x I R R Q ~ | O.O.O.6.&.5.O.g 0 q 0 : + $ 0 i p N B ' ] ' O.>.O.O.O.O.+.>.o.| B p a r % X $ + + + $ @ @ : N >.>.+.5.7.4./ x g w 7 7 7 5 5 , 2 = - 2 e * ", +" * * * : : : : > : > > , , < > 3 3 3 < 6 6 4 > 2 ; ; * * # $ $ - 2 s j I I I R F | | X.O.%.*.*.*.*.X.x q 8 7 2 + o $ q a x N S .} .o.X.O.O.O.>.+.o. .| F b a e $ o * $ + + @ $ # 3 ~ 7.r.<.7.8.<. .M c t i 9 7 7 , , , = , - 2 $ ", +" . % 4 1 1 : : : : : > > > > , 5 5 3 3 2 6 2 6 6 6 2 1 : * # # $ $ % 6 s x I I ~ R ~ | X.X.O.*.6.6.u.*.X.x 7 6 6 2 % : o + 5 p b B ~ o.[ .O.X.%.o./ ] +.o.] .| n a q % $ + + + $ $ $ 3 F u.7.1.q.7.$.>.! c d i w 7 7 5 5 5 > , - 2 2 + ", +" $ e 4 1 * : : : : > > > > > > 5 5 < 6 3 3 3 6 6 > > : : = = # & $ - r p R R ~ N ~ | o.O.o.O.*.*.5.8.6.O.s 5 7 6 2 - e % + 5 p b N N F ~ .] O.~ ~ ~ o. .' | | | N p q 2 o . o + @ @ @ % 5 o.0.5.5.q.:.<.O.N N p d w 7 w 5 5 5 5 > : 2 6 $ ", +" . 1 T e : * * : : : > : > > > > 3 5 < 7 3 3 6 7 6 > 2 > = : = * & : 2 x L R R R _ o. .O.O.O.O.O.O.X.u.8.4.p 5 7 7 5 * e % # q h b N B ' ' .o. .Q | Q ' Q ' ' .B N p a t - . + @ @ # # 5 ] $.<.5.6.8.7.O.F N N h t q q 5 5 > > 2 2 2 2 $ ", +" + e T e * - : : : : > > > > > > < 7 7 < 3 7 3 3 6 2 2 > : = * * & : 0 x N N [ ~ ' o.o.<.<.X.O.*.O.*.u.u.4.N 7 6 7 6 1 e % . = i h N Q Q R | F | | B Q Q Q R R Q | B N x x L 1 + @ # @ % 3 ~ ] >.7.5.8.8.$.' R R R d q q 7 7 5 > 5 > > - * o ", +" % e y 1 - : : : : > > > > > > < > 5 < 3 6 < 6 3 6 6 2 > : : * $ $ * j S N ~ ' ] o.O. .X.<.O.&.*.*.*.6.6.%.| p 7 6 6 * * o = i b B S R R ~ ~ F B F B B Q R B Q B n B N x j - X @ @ # % 5 Q ] >.t.q.7.%.<.| B v n c i i i i 5 < 5 > > 2 e $ ", +" * e 0 : : : : > > > > > > , < > 2 5 < 7 < 7 5 5 5 2 2 2 > - + X . 2 ./ Q ' / o.%.<.%.O.O.O.*.*.*.*.*.-.*.X.b 0 5 7 : o = p b B B B ~ ~ | N F B b B N N N b n n n b a a = . $ @ $ & t <.+.<.0.r.<.<.4.O.| Q R b p p p i q 5 5 2 > 5 r & ", +" 4 T 6 : : : : > > 3 2 2 , > 5 5 5 5 7 > < 7 7 5 6 5 2 2 2 & X . . 2 o. .| o./ >.%.5.6.*.4.7.6.6.6.6.6.-.-.*.S w 3 3 : o . = p B B R ~ N B F B N F B N B n B N N n N B N p - . o o $ - g 7.<.7.t.7.0.q.8.5.O./ Q R p N p p i 5 5 5 < > 2 * . ", +" . 1 s 6 > : : : > > 2 3 2 5 5 5 5 3 5 5 5 5 8 7 8 6 6 6 6 6 + 4 +.O.O.+.%.+.O.O.4.7.<.7.6.6.8.q.8.6.5.5.X.i 3 3 * X > x Q B Q N L Q N N n n B ~ p x N n h N N B p a : $ 1 g <.<.q.q.q.u.i.r.6.O. .| Q N h h i p a e 8 5 = 3 4 $ ", +" + 4 e 2 > 1 : : : > 2 2 2 2 2 2 5 0 5 5 5 7 5 5 0 q r e r 1 X 2 o.X.<.<.+.+.] +.O.O.1.o.<.6.8.q.8.6.6.q.*.x 3 1 @ X 5 x R N B x N R N B N B N L p s j b h N p a s p 2 o o 1 j o.<.5.q.t.i.i.t.7.O.o.' Q N N h y s p a 5 5 5 4 t & ", +" * y 6 : > 1 : : : 2 > 2 2 > 3 3 5 3 3 6 6 6 8 5 6 r J e : o 2 S $.7.7.1.+.>.O.O.7.<.o.<.4.5.7.7.4.u.r.5.~ t 1 o X 5 s x x x N x x b N N x s s p s x x x x x a a a 0 @ 1 g Z S .0.t.t.0.<.$.O.o.~ _ I v x x a a a 5 5 5 5 4 $ ", +" * y 4 - * * - - : : : - : - : > > 3 : > 2 > 3 3 2 r T 4 o > N ~ _ S ' ' ' ~ | R _ ~ ~ o. .o. .| o.<.o.~ t * o > i a i r a a a a a i q q q a p t q q q q 0 0 q 5 + o : 3 > t <.7.<.~ N S S I N v j t a i q q 5 5 > 2 > : o ", +" o 1 $ o @ o o @ @ @ @ o @ + @ @ @ @ $ @ @ # % # $ - 6 $ + 3 5 5 5 6 6 0 8 6 2 5 6 3 8 5 q 7 7 q q q 7 2 o + - - = - - - = = - - = - - - % - = - = = & & = $ X X X X & t g r 6 , 5 5 3 : 3 > : = - = % % % % $ @ @ . ", +" . . + . . X . X + o X O . o . o . X + O O + + o X . . . . . . . . . . X . . o @ X X X X X o X . . . . . ", +" ", +" ", +" ", +" " +}; diff --git a/src/ft_draw_scene.c b/src/ft_draw_scene.c index 39cdadc..80cd1bc 100644 --- a/src/ft_draw_scene.c +++ b/src/ft_draw_scene.c @@ -41,10 +41,6 @@ static int8_t void ft_draw_scene(t_cub *clist) { - /* clist->img.img = mlx_new_image(clist->wlist.wlx, */ - /* clist->wlist.x_size, clist->wlist.y_size); */ - /* clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, */ - /* &clist->img.sizeline, &clist->img.endian); */ if (clist->doicast) ft_castray(clist); else @@ -58,7 +54,6 @@ void if (clist->ishud && clist->mlist.isnlvl) if (ft_put_stage(clist) < 0) ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, clist); - /* mlx_destroy_image(clist->wlist.wlx, clist->img.img); */ } void diff --git a/src/ft_draw_traps.c b/src/ft_draw_traps.c new file mode 100644 index 0000000..42f837b --- /dev/null +++ b/src/ft_draw_traps.c @@ -0,0 +1,110 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_draw_traps.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 20:22:45 by rbousset #+# #+# */ +/* Updated: 2020/03/09 18:56:01 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include +#include + +static void + ft_sort_traps_norme(float *dist_tab, int32_t it, t_cub *cl) +{ + uint32_t tmp; + + tmp = 0; + if (dist_tab[it] > dist_tab[it + 1]) + { + tmp = dist_tab[it]; + dist_tab[it] = dist_tab[it + 1]; + dist_tab[it + 1] = tmp; + tmp = cl->mlist.traps_order[it]; + cl->mlist.traps_order[it] = cl->mlist.traps_order[it + 1]; + cl->mlist.traps_order[it + 1] = tmp; + it = 0; + } +} + +void + ft_sort_traps(t_cub *cl) +{ + float dist_tab[4096]; + int32_t it; + + it = 0; + while (it < cl->mlist.sprite_nbr) + { + dist_tab[it] = ((cl->plist.pos_x - cl->traps[it].s_pos_x) * + (cl->plist.pos_x - cl->traps[it].s_pos_x) + + (cl->plist.pos_y - cl->traps[it].s_pos_y) * + (cl->plist.pos_y - cl->traps[it].s_pos_y)); + cl->mlist.traps_order[it] = it; + it++; + } + it = 0; + while (it < cl->mlist.traps_nbr) + { + ft_sort_traps_norme(dist_tab, it, cl); + } +} + +static void + ft_put_trap(t_sprite *sprite, t_cub *cl) +{ + float dist; + float calc; + + if ((dist = cl->rlist.wall_dist_tab[sprite->x]) <= 0) + dist = 0.0001; + calc = (dist * 0.1 * cl->mlist.darklvl); + calc = (calc >= 255) ? (255) : (calc); + calc = (calc < 1) ? (1) : (calc); + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline)] = + (uint8_t)cl->tlist[15].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[15].img_h * sprite->tex_y] / calc; + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 1] = + (uint8_t)cl->tlist[15].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[15].img_h * sprite->tex_y + 1] / calc; + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 2] = + (uint8_t)cl->tlist[15].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[15].img_h * sprite->tex_y + 2] / calc; + cl->img.ptr[sprite->x * 4 + cl->wlist.x_size * sprite->y + 3] = (char)0; +} + +void + ft_draw_traps(t_cub *cl, t_sprite *sprite) +{ + int32_t d; + + sprite->x = sprite->drawstartx; + while (sprite->x < sprite->drawendx) + { + sprite->tex_x = (int32_t)((sprite->x - (-sprite->spritewidth / 2 + + sprite->spritescreenx)) * cl->tlist[15].img_w / sprite->spritewidth); + sprite->y = sprite->drawstarty; + while (sprite->y < sprite->drawendy) + { + d = sprite->y * 256 - cl->wlist.y_size * 128 + + sprite->spriteheight * 128; + sprite->tex_y = ((d * cl->tlist[15].img_h / 2) / + sprite->spriteheight) / 128; + if (sprite->transformy > 0 && cl->tlist[15].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[15].img_h * sprite->tex_y] + && cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) + { + ft_put_trap(sprite, cl); + } + sprite->y++; + } + sprite->x++; + } +} diff --git a/src/ft_draw_traps_extra.c b/src/ft_draw_traps_extra.c new file mode 100644 index 0000000..a2fd0ab --- /dev/null +++ b/src/ft_draw_traps_extra.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_draw_traps_extra.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 20:22:45 by rbousset #+# #+# */ +/* Updated: 2020/03/09 18:56:01 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include +#include + +void + ft_calc_trap(t_cub *cl) +{ + t_sprite sprite; + int32_t i; + + i = 0; + while (i < cl->mlist.traps_nbr) + { + sprite = cl->traps[i]; + sprite.spritey = sprite.s_pos_x - (cl->plist.pos_x - 0.5); + sprite.spritex = sprite.s_pos_y - (cl->plist.pos_y - 0.5); + sprite.invdet = 1.0 / (cl->plist.plane_x * cl->plist.dir_y + - cl->plist.dir_x * cl->plist.plane_y); + sprite.transformx = sprite.invdet * (cl->plist.dir_y * sprite.spritex + - cl->plist.dir_x * sprite.spritey); + sprite.transformy = sprite.invdet * (-cl->plist.plane_y * sprite.spritex + + cl->plist.plane_x * sprite.spritey); + sprite.spritescreenx = (int)(cl->wlist.x_size / 2) * + (1 + sprite.transformx / sprite.transformy); + ft_sprite_height(cl, &sprite); + ft_sprite_width(cl, &sprite); + ft_draw_traps(cl, &sprite); + i++; + } +} diff --git a/src/ft_get_player_spawn.c b/src/ft_get_player_spawn.c index 6853313..ef2edd9 100644 --- a/src/ft_get_player_spawn.c +++ b/src/ft_get_player_spawn.c @@ -83,6 +83,7 @@ void plist->start_y = plist->pos_y; ft_get_start_side(clist->mlist.map[y][x], plist); ft_get_sprite_spawn(clist); + ft_get_trap_spawn(clist); return ; } x++; diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 2d6d197..a0720ea 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -106,6 +106,7 @@ void } ft_floor_cast(cl); ft_calc_sprite(cl); + ft_calc_trap(cl); ft_memdel((void**)&cl->rlist.wall_dist_tab); ft_memdel((void**)&cl->rlist.wall_bz); } diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index 1a9b51a..b800a39 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -21,11 +21,9 @@ void { int32_t x; int32_t y; - int32_t col; t_rgb rgb; y = -1; - col = 0x00880000; while (++y < (int32_t)cl->wlist.y_size) { x = -1; @@ -33,14 +31,16 @@ void { rgb = ft_hex_to_og_rgb(*(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline)))); - rgb.r += 120; + rgb.r += 150; + rgb.g += 20; + rgb.b += 20; *(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(rgb); } - /* if (y < (int32_t)cl->wlist.y_size / 2) */ - /* col += 0x00000000; */ - /* else */ - /* col -= 0x00000000; */ } + cl->plist.life -= 20; + if (cl->plist.life <= 0) + ft_exit(0, cl); + /* TODO death screen here */ cl->doicast = 0; } -- cgit v1.2.3