diff options
-rwxr-xr-x | src/post/goom/gfontlib.c | 226 | ||||
-rwxr-xr-x | src/post/goom/gfontlib.h | 9 | ||||
-rwxr-xr-x | src/post/goom/gfontrle.c | 2499 | ||||
-rwxr-xr-x | src/post/goom/mathtools.h | 26 | ||||
-rwxr-xr-x | src/post/goom/mmx.h | 534 | ||||
-rwxr-xr-x | src/post/goom/surf3d.c | 122 | ||||
-rwxr-xr-x | src/post/goom/surf3d.h | 36 | ||||
-rwxr-xr-x | src/post/goom/surface.c | 18 | ||||
-rwxr-xr-x | src/post/goom/surface.h | 16 | ||||
-rwxr-xr-x | src/post/goom/tentacle3d.c | 221 | ||||
-rwxr-xr-x | src/post/goom/tentacle3d.h | 9 | ||||
-rwxr-xr-x | src/post/goom/v3d.h | 59 | ||||
-rwxr-xr-x | src/post/goom/xmmx.h | 354 | ||||
-rwxr-xr-x | src/post/goom/zoom_filter_xmmx.c | 243 |
14 files changed, 4372 insertions, 0 deletions
diff --git a/src/post/goom/gfontlib.c b/src/post/goom/gfontlib.c new file mode 100755 index 000000000..efae26fc5 --- /dev/null +++ b/src/post/goom/gfontlib.c @@ -0,0 +1,226 @@ +#include "goom_config.h" +#include "gfontrle.c" +#include <string.h> +#include <stdlib.h> + +static int ***font_chars; +static int *font_width; +static int *font_height; +static int ***small_font_chars; +static int *small_font_width; +static int *small_font_height; + +void gfont_load () { + unsigned char *gfont; + unsigned int i = 0, j = 0; + unsigned int nba = 0; + unsigned int current = 32; + int *font_pos; + // decompress le rle + + gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + while (i<the_font.rle_size) { + unsigned char c = the_font.rle_pixel [i++]; + if (c == 0) { + unsigned int nb = the_font.rle_pixel [i++]; + while (nb--) + gfont[j++] = 0; + } + else + gfont [j++] = c; + } + + // determiner les positions de chaque lettre. + + font_height = calloc (256,sizeof(int)); + small_font_height = calloc (256,sizeof(int)); + font_width = calloc (256,sizeof(int)); + small_font_width = calloc (256,sizeof(int)); + font_chars = calloc (256,sizeof(int**)); + small_font_chars = calloc (256,sizeof(int**)); + font_pos = calloc (256,sizeof(int)); + + for (i=0;i<the_font.width;i++) { + unsigned char a = gfont [i*4 + 3]; + if (a) + nba ++; + else + nba = 0; + if (nba == 2) { + font_width [current] = i - font_pos [current]; + small_font_width [current] = font_width [current]/2; + font_pos [++current] = i; + font_height [current] = the_font.height - 2; + small_font_height [current] = font_height [current]/2; + } + } + font_pos [current] = 0; + font_height [current] = 0; + small_font_height [current] = 0; + + // charger les lettres et convertir au format de la machine + + for (i=33;i<current;i++) { + int x; int y; + font_chars [i] = malloc (font_height[i]*sizeof(int *)); + small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2); + for (y = 0; y < font_height[i]; y++) { + font_chars [i][y] = malloc (font_width[i]*sizeof(int)); + for (x = 0; x < font_width[i]; x++) { + unsigned int r,g,b,a; + r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)]; + g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)]; + b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)]; + a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)]; + font_chars [i][y][x] = + (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8)); + } + } + for (y = 0; y < font_height[i]/2; y++) { + small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2); + for (x = 0; x < font_width[i]/2; x++) { + unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4; + r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)]; + g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; + b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; + a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; + r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; + g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; + b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; + a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; + r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)]; + g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; + b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; + a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; + r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; + g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; + b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; + a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; + small_font_chars [i][y][x] = + (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))| + (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| + (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| + (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); + } + } + } + + // definir les lettres restantes + + for (i=0;i<256;i++) { + if (font_chars[i]==0) { + font_chars[i]=font_chars[42]; + small_font_chars[i]=small_font_chars[42]; + font_width[i]=font_width[42]; + font_pos[i]=font_pos[42]; + font_height[i]=font_height[42]; + small_font_width[i]=small_font_width[42]; + small_font_height[i]=small_font_height[42]; + } + } + + font_width [32] = (the_font.height / 2) - 1; + small_font_width [32] = font_width [32]/2; + font_chars [32] = 0; + small_font_chars [32] = 0; +} + +void goom_draw_text (guint32 * buf,int resolx,int resoly, + int x, int y, + const char *str, float charspace, int center) { + float fx = (float) x; + int fin = 0; + + int ***cur_font_chars; + int *cur_font_width; + int *cur_font_height; + + if (resolx>320) + { + //printf("use big\n"); + cur_font_chars = font_chars; + cur_font_width = font_width; + cur_font_height = font_height; + } + else + { + //printf ("use small\n"); + cur_font_chars = small_font_chars; + cur_font_width = small_font_width; + cur_font_height = small_font_height; + } + + if (cur_font_chars == NULL) + return ; + + if (center) { + unsigned char *tmp = (unsigned char*)str; + float lg = -charspace; + + while (*tmp != '\0') + lg += cur_font_width[*(tmp++)] + charspace; + + fx -= lg / 2; + } + + while (!fin) { + unsigned char c = *str; + + x = (int) fx; + + if (c == '\0') + fin = 1; + else if (cur_font_chars[c]==0) { + fx += cur_font_width[c] + charspace; + } + else { + int xx, yy; + int xmin = x; + int xmax = x + cur_font_width[c]; + int ymin = y - cur_font_height[c]; + int ymax = y; + + yy = ymin; + + if (xmin < 0) + xmin = 0; + + if (xmin >= resolx - 1) + return; + + if (xmax >= (int) resolx) + xmax = resolx - 1; + + if (yy < 0) + yy = 0; + + if (yy <= (int) resoly - 1) { + if (ymax >= (int) resoly - 1) + ymax = resoly - 1; + + for (; yy < ymax; yy++) + for (xx = xmin; xx < xmax; xx++) + { + unsigned int color = cur_font_chars[c][yy - ymin][xx - x]; + unsigned int transparency = color & 0xff000000; + if (transparency) + { + if (transparency==0xff000000) buf[yy * resolx + xx] = color; + else + { + unsigned int back = buf[yy * resolx + xx]; + unsigned int a1 = (color & 0xff000000) >> 24; + unsigned int a2 = 255 - a1; + buf[yy * resolx + xx] = + (((((color & 0x00ff0000) * a1) + ((back & 0x00ff0000) * a2)) & 0xff000000) >> 8) | + (((((color & 0x0000ff00) * a1) + ((back & 0x0000ff00) * a2)) & 0x00ff0000) >> 8) | + ((((color & 0x000000ff) * a1) + ((back & 0x000000ff) * a2)) >> 8); + } + } + } + } + fx += cur_font_width[c] + charspace; + } + str++; + } +} diff --git a/src/post/goom/gfontlib.h b/src/post/goom/gfontlib.h new file mode 100755 index 000000000..bbae2ff36 --- /dev/null +++ b/src/post/goom/gfontlib.h @@ -0,0 +1,9 @@ +#ifndef _GFONTLIB_H +#define _GFONTLIB_H + +void gfont_load (); +void goom_draw_text (guint32 * buf,int resolx,int resoly, + int x, int y, + const char *str, float chspace, int center); + +#endif diff --git a/src/post/goom/gfontrle.c b/src/post/goom/gfontrle.c new file mode 100755 index 000000000..69c4afba5 --- /dev/null +++ b/src/post/goom/gfontrle.c @@ -0,0 +1,2499 @@ +/* RGBA C-Source image dump (with zRLE compression) */ +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font = { +1277, 21, 4, 49725, { +121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255}}; + /* Created by MiniCompress.. an iOS RLE compressor. + * Compress Rate : 46.36 % + */ diff --git a/src/post/goom/mathtools.h b/src/post/goom/mathtools.h new file mode 100755 index 000000000..7ed0f80ef --- /dev/null +++ b/src/post/goom/mathtools.h @@ -0,0 +1,26 @@ +#define _double2fixmagic (68719476736.0*1.5) +//2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor +#define _shiftamt 16 +//16.16 fixed point representation, + +#if BigEndian_ +#define iexp_ 0 +#define iman_ 1 +#else +#define iexp_ 1 +#define iman_ 0 +#endif //BigEndian_ + +#ifdef HAVE_MMX +#define F2I(dbl,i) \ +{double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt; } +#else +#define F2I(dbl,i) i=(int)dbl; +#endif + +#if 0 +#define SINCOS(f,s,c) \ + __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +#else +#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +#endif diff --git a/src/post/goom/mmx.h b/src/post/goom/mmx.h new file mode 100755 index 000000000..2a0ca62a4 --- /dev/null +++ b/src/post/goom/mmx.h @@ -0,0 +1,534 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include <stdio.h> + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms") + +#endif + +#endif + diff --git a/src/post/goom/surf3d.c b/src/post/goom/surf3d.c new file mode 100755 index 000000000..356fe3e31 --- /dev/null +++ b/src/post/goom/surf3d.c @@ -0,0 +1,122 @@ +#include "surf3d.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { + int x = defx; + int y = defz; + grid3d *g = malloc (sizeof(grid3d)); + surf3d *s = &(g->surf); + s->nbvertex = x*y; + s->vertex = malloc (x*y*sizeof(v3d)); + s->svertex = malloc (x*y*sizeof(v3d)); + s->center = center; + + g->defx=defx; + g->sizex=sizex; + g->defz=defz; + g->sizez=sizez; + g->mode=0; + + while (y) { + --y; + x = defx; + while (x) { + --x; + s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; + s->vertex[x+defx*y].y = 0; + s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; + } + } + return g; +} + +//#undef HAVE_MMX +#include "drawmethods.h" + +void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H) { + int i; + int *p1; + int *p2; + v2d v2; + + for (i=0;i<s->nbvertex;i++) { + V3D_TO_V2D(s->svertex[i],v2,W,H,dist); + p1 = buf + v2.x + (v2.y*W); + p2 = back + v2.x + (v2.y*W); + if ((v2.x>=0) && (v2.y>=0) && (v2.x<W) && (v2.y<H)) { + *p1 = color; + } + } +} + +void grid3d_draw (grid3d *g, int color, int colorlow, + int dist, int *buf, int *back, int W,int H) { + int x; +// int *p1; +// int *p2; + v2d v2,v2x; + + for (x=0;x<g->defx;x++) { + int z; + V3D_TO_V2D(g->surf.svertex[x],v2x,W,H,dist); + + for (z=1;z<g->defz;z++) { + V3D_TO_V2D(g->surf.svertex[z*g->defx + x],v2,W,H,dist); + if (((v2.x != -666) || (v2.y!=-666)) + && ((v2x.x != -666) || (v2x.y!=-666))) { + draw_line(buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); + draw_line(back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); + DRAWMETHOD_DONE(); + } + v2x = v2; + } + } +} + +void surf3d_rotate (surf3d *s, float angle) { + int i; + float cosa; + float sina; + SINCOS(angle,sina,cosa); + for (i=0;i<s->nbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + } +} + +void surf3d_translate (surf3d *s) { + int i; + for (i=0;i<s->nbvertex;i++) { + TRANSLATE_V3D(s->center,s->svertex[i]); + } +} + +void grid3d_update (grid3d *g, float angle, float *vals, float dist) { + int i; + float cosa; + float sina; + surf3d *s = &(g->surf); + v3d cam = s->center; + cam.z += dist; + + SINCOS((angle/4.3f),sina,cosa); + cam.y += sina*2.0f; + SINCOS(angle,sina,cosa); + + if (g->mode==0) { + if (vals) + for (i=0;i<g->defx;i++) + s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; + + for (i=g->defx;i<s->nbvertex;i++) { + s->vertex[i].y *= 0.255f; + s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); + } + } + + for (i=0;i<s->nbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + TRANSLATE_V3D(cam,s->svertex[i]); + } +} diff --git a/src/post/goom/surf3d.h b/src/post/goom/surf3d.h new file mode 100755 index 000000000..557b8b74f --- /dev/null +++ b/src/post/goom/surf3d.h @@ -0,0 +1,36 @@ +#ifndef _SURF3D_H +#define _SURF3D_H + +#include "v3d.h" + +typedef struct { + v3d *vertex; + v3d *svertex; + int nbvertex; + + v3d center; +} surf3d; + +typedef struct { + surf3d surf; + + int defx; + int sizex; + int defz; + int sizez; + int mode; +} grid3d; + +/* hi-level */ + +/* works on grid3d */ +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +void grid3d_update (grid3d *s, float angle, float *vals, float dist); + +/* low level */ +void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +void grid3d_draw (grid3d *g, int color, int colorlow, int dist, int *buf, int *back, int W,int H); +void surf3d_rotate (surf3d *s, float angle); +void surf3d_translate (surf3d *s); + +#endif diff --git a/src/post/goom/surface.c b/src/post/goom/surface.c new file mode 100755 index 000000000..2a452564b --- /dev/null +++ b/src/post/goom/surface.c @@ -0,0 +1,18 @@ +#include "surface.h" +#include <stdlib.h> + +Surface * surface_new (int w, int h) { + Surface * s = (Surface*)malloc(sizeof(Surface)); + s->realstart = (int*)malloc(w*h*4 + 128); + s->buf = (int*)((int)s->realstart + 128 - (((int)s->realstart) % 128)); + s->size = w*h; + s->width = w; + s->height = h; + return s; +} + +void surface_delete (Surface **s) { + free ((*s)->realstart); + free (*s); + *s = NULL; +} diff --git a/src/post/goom/surface.h b/src/post/goom/surface.h new file mode 100755 index 000000000..61c73d19a --- /dev/null +++ b/src/post/goom/surface.h @@ -0,0 +1,16 @@ +#ifndef _SURFACE_H +#define _SURFACE_H + +typedef struct { + int * buf; + int width; + int height; + int size; + + int * realstart; +} Surface; + +Surface * surface_new (int w, int h) ; +void surface_delete (Surface **s) ; + +#endif diff --git a/src/post/goom/tentacle3d.c b/src/post/goom/tentacle3d.c new file mode 100755 index 000000000..e90da7b58 --- /dev/null +++ b/src/post/goom/tentacle3d.c @@ -0,0 +1,221 @@ +#include <stdlib.h> + +#include "v3d.h" +#include "surf3d.h" +#include "goom_tools.h" +#include "goom_config.h" + +#define D 256.0f + +#define nbgrid 6 +#define definitionx 15 +#define definitionz 45 + +static float cycle = 0.0f; +static grid3d *grille[nbgrid]; +static float *vals; + +void tentacle_free () { + /* TODO : un vrai FREE GRID!! */ + free (vals); +// free (grille); +} + +void tentacle_new () { + int tmp; + + v3d center = {0,-17.0,0}; + vals = malloc ((definitionx+20)*sizeof(float)); + + for (tmp=0;tmp<nbgrid;tmp++) { + int x,z; + z = 45+rand()%30; + x = 85+rand()%5; + center.z = z; + grille[tmp] = grid3d_new (x,definitionx,z,definitionz+rand()%10,center); + center.y += 8; + } +} + +static inline unsigned char +lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; // (32.0f * log (t)); + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void +lightencolor (int *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + +// retourne x>>s , en testant le signe de x +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static +int evolutecolor (unsigned int src,unsigned int dest, + unsigned int mask, unsigned int incr) { + int color = src & (~mask); + src &= mask; + dest &= mask; + + if ((src!=mask) + &&(src<dest)) + src += incr; + + if (src>dest) + src -= incr; + return (src&mask)|color; +} + +static void pretty_move (float cycle, + float *dist,float *dist2, + float *rotangle) { + static float distt = 10.0f; + static float distt2 = 0.0f; + static float rot = 0.0f; // entre 0 et 2 * M_PI + static int happens = 0; + float tmp; + static int rotation = 0; + static int lock = 0; + + if (happens) + happens -= 1; + else if (lock == 0) { + happens = iRAND(200)?0:100+iRAND(60); + lock = happens * 3 / 2; + } + else lock --; +// happens = 1; + + tmp = happens?8.0f:0; + *dist2 = distt2 = (tmp + 15.0f*distt2)/16.0f; + + tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); + if (happens) + tmp *= 0.6f; + + *dist = distt = (tmp + 3.0f*distt)/4.0f; + + if (!happens){ + tmp = M_PI*sin(cycle)/32+3*M_PI/2; + } + else { + rotation = iRAND(500)?rotation:iRAND(2); + if (rotation) + cycle *= 2.0f*M_PI; + else + cycle *= -1.0f*M_PI; + tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); + } + + if (abs(tmp-rot) > abs(tmp-(rot+2.0*M_PI))) { + rot = (tmp + 15.0f*(rot+2*M_PI)) / 16.0f; + if (rot>2.0*M_PI) + rot -= 2.0*M_PI; + *rotangle = rot; + } + else if (abs(tmp-rot) > abs(tmp-(rot-2.0*M_PI))) { + rot = (tmp + 15.0f*(rot-2.0*M_PI)) / 16.0f; + if (rot<0.0f) + rot += 2.0*M_PI; + *rotangle = rot; + } + else + *rotangle = rot = (tmp + 15.0f*rot) / 16.0f; +} + +void tentacle_update(int *buf, int *back, int W, int H, + short data[2][512], float rapport, + int drawit) { + int tmp; + int tmp2; + + static int colors[] = { + (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)), + (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)), + (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8))}; + + static int col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); + static int dstcol = 0; + static float lig = 1.15f; + static float ligs = 0.1f; + + int color; + int colorlow; + + float dist,dist2,rotangle; + + if ((!drawit) && (ligs>0.0f)) + ligs = -ligs; + + lig += ligs; + + if (lig > 1.01f) { + if ((lig>10.0f) | (lig<1.1f)) ligs = -ligs; + + if ((lig<6.3f)&&(iRAND(30)==0)) + dstcol=iRAND(3); + + col = evolutecolor(col,colors[dstcol],0xff,0x01); + col = evolutecolor(col,colors[dstcol],0xff00,0x0100); + col = evolutecolor(col,colors[dstcol],0xff0000,0x010000); + col = evolutecolor(col,colors[dstcol],0xff000000,0x01000000); + + color = col; + colorlow = col; + + lightencolor(&color,lig * 2.0f + 2.0f); + lightencolor(&colorlow,(lig/3.0f)+0.67f); + + rapport = 1.0f + 2.0f * (rapport - 1.0f); + rapport *= 1.2f; + if (rapport > 1.12f) + rapport = 1.12f; + + pretty_move (cycle,&dist,&dist2,&rotangle); + + for (tmp=0;tmp<nbgrid;tmp++) { + for (tmp2=0;tmp2<definitionx;tmp2++) { + float val = (float)(ShiftRight(data[0][iRAND(511)],10)) * rapport; + vals[tmp2] = val; + } + + grid3d_update (grille[tmp],rotangle, vals, dist2); + } + cycle+=0.01f; + for (tmp=0;tmp<nbgrid;tmp++) + grid3d_draw (grille[tmp],color,colorlow,dist,buf,back,W,H); + } + else { + lig = 1.05f; + if (ligs < 0.0f) + ligs = -ligs; + pretty_move (cycle,&dist,&dist2,&rotangle); + cycle+=0.1f; + if (cycle > 1000) + cycle = 0; + } +} diff --git a/src/post/goom/tentacle3d.h b/src/post/goom/tentacle3d.h new file mode 100755 index 000000000..ab7e4c07d --- /dev/null +++ b/src/post/goom/tentacle3d.h @@ -0,0 +1,9 @@ +#ifndef _TENTACLE3D_H +#define _TENTACLE3D_H + +void tentacle_new (); +void tentacle_update(int *buf, int *back, int W, int H, + short[2][512], float, int drawit); +void tentacle_free (); + +#endif diff --git a/src/post/goom/v3d.h b/src/post/goom/v3d.h new file mode 100755 index 000000000..dcf74fd65 --- /dev/null +++ b/src/post/goom/v3d.h @@ -0,0 +1,59 @@ +#ifndef _V3D_H +#define _V3D_H + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> + +#include "mathtools.h" + +typedef struct { + float x,y,z; +} v3d; + +typedef struct { + int x,y; +} v2d; + +/* + * projete le vertex 3D sur le plan d'affichage + * retourne (0,0) si le point ne doit pas etre affiche. + * + * bonne valeur pour distance : 256 + */ +#define V3D_TO_V2D(v3,v2,width,height,distance) \ +{ \ + int Xp, Yp; \ + if (v3.z > 2) { \ + F2I((distance * v3.x / v3.z),Xp) ; \ + F2I((distance * v3.y / v3.z),Yp) ; \ + v2.x = Xp + (width>>1); \ + v2.y = -Yp + (height>>1); \ + } \ + else v2.x=v2.y=-666; \ +} + +/* + * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) + * centerz = centre de rotation en z + */ +#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +{\ + vf.x = vi.x * cosa - vi.z * sina;\ + vf.z = vi.x * sina + vi.z * cosa;\ + vf.y = vi.y;\ +} + +/* + * translation + */ +#define TRANSLATE_V3D(vsrc,vdest)\ +{\ + vdest.x += vsrc.x;\ + vdest.y += vsrc.y;\ + vdest.z += vsrc.z;\ +} + +#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} + +#endif diff --git a/src/post/goom/xmmx.h b/src/post/goom/xmmx.h new file mode 100755 index 000000000..0e8d5a714 --- /dev/null +++ b/src/post/goom/xmmx.h @@ -0,0 +1,354 @@ +/* xmmx.h + + eXtended MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for xmmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DXMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1999 by R. Fisher + Based on libmmx, 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _XMMX_H +#define _XMMX_H + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an (Extended) MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +#ifndef _MMX_H +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +#endif + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef XMMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include <stdio.h> + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_m2ir(op, mem, rs) \ + __asm__ __volatile__ (#op " %0, %%" #rs \ + : /* nothing */ \ + : "X" (mem) ) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_r2ir(op, rs1, rs2) \ + __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ + : /* nothing */ \ + : /* nothing */ ) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + + +/* 4x16 Parallel MAGnitude +*/ +#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) + + +/* 4x16 Parallel ADDs using Saturation arithmetic + and Implied destination +*/ +#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) + + +/* 4x16 Parallel SUBs using Saturation arithmetic + and Implied destination +*/ +#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15. +*/ +#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15, storing to Implied register +*/ +#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) + + +/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions + of results Rounded with 1/2 bit 15, accumulating with Implied register +*/ +#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) + + +/* 8x8u Parallel AVErage +*/ +#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) + + +/* 8x8u Parallel DISTance and accumulate with + unsigned saturation to Implied register +*/ +#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Zero +*/ +#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Not Zero +*/ +#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Less than Zero +*/ +#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Greater than or Equal to Zero +*/ +#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) + + +/* Fast Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-xmmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef XMMX_TRACE + +#define femms() \ + { \ + fprintf(stderr, "femms()\n"); \ + __asm__ __volatile__ ("femms"); \ + } + +#else + +#define femms() __asm__ __volatile__ ("femms") + +#endif + +#endif + diff --git a/src/post/goom/zoom_filter_xmmx.c b/src/post/goom/zoom_filter_xmmx.c new file mode 100755 index 000000000..e33a3033c --- /dev/null +++ b/src/post/goom/zoom_filter_xmmx.c @@ -0,0 +1,243 @@ +#include "goom_config.h" +#include "xineutils.h" + +/* a definir pour avoir exactement le meme resultat que la fonction C + * (un chouillat plus lent) + */ +#define STRICT_COMPAT +//#define HAVE_ATHLON + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + + +//#define MMX_TRACE + +int zoom_filter_xmmx_supported () { + return (xine_mm_accel() & MM_ACCEL_X86_MMXEXT); +} + +void zoom_filter_xmmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + expix1[0]=expix1[prevX-1]=expix1[prevX*prevY-1]=expix1[prevX*prevY-prevX]=0; + + prevXY.ud[0] = (prevX-1)<<PERTEDEC; + prevXY.ud[1] = (prevY-1)<<PERTEDEC; + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + pxor_r2r (mm7,mm7); /* mise a zero de mm7 */ + + loop=0; + + /* + * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle. + */ + while (loop < bufsize) + { + /* + * pre : mm6 = [buffratio<<16|buffratio<<16] + * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + __asm__ __volatile__ ( + "movq %0,%%mm0\n" + "movq %1,%%mm1\n" + : :"X"(brutS[loop]),"X"(brutD[loop]) + ); /* mm0 = S */ + + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ +#ifdef STRICT_COMPAT + movq_r2r (mm1,mm2); + punpckhdq_r2r (mm2,mm2); + punpckldq_r2r (mm1,mm1); + pand_r2r (mm2, mm0); +#endif + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + + /* + * pre : mm0 : clipped position on screen + * + * post : mm3 & mm4 : coefs for this position + * mm1 : X vector [0|X] + * + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movd %%mm0,%%ebx\n" + "movq %%mm0,%%mm1\n" + + "andl $15,%%ebx\n" + "psrlq $32,%%mm1\n" + + "shll $6,%%ebx\n" + "movd %%mm1,%%eax\n" + + "addl %0,%%ebx\n" + "andl $15,%%eax\n" + + "movd (%%ebx,%%eax,4),%%mm3\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * extraction des coefficients... + * + * pre : coef dans mm3 + * + * post : coef extraits dans mm3 (c1 & c2) + * et mm4 (c3 & c4) + * + * modif : mm5 + */ +// entrelace avec portion d'apres (cf les '^') +// movq_r2r (mm3, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +// punpcklbw_r2r (mm5, mm3); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm3, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm3, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + +// punpcklbw_r2r (mm5, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * + * post : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * + * modif : eax,ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" + /*^*/ "movq %%mm3,%%mm5\n" /*^*/ + + "mull %1\n" + "movd %%mm0,%%ebx\n" + /*^*/ "punpcklbw %%mm5, %%mm3\n" /*^*/ + + "addl %%ebx,%%eax\n" + /*^*/ "movq %%mm3,%%mm4\n" /*^*/ + /*^*/ "movq %%mm3,%%mm5\n" /*^*/ + + "movl %0,%%ebx\n" + /*^*/ "punpcklbw %%mm5,%%mm3\n" /*^*/ + + "movq (%%ebx,%%eax,4),%%mm0\n" + /*^*/ "punpckhbw %%mm5,%%mm4\n" /*^*/ + + "addl %1,%%eax\n" + "movq (%%ebx,%%eax,4),%%mm2\n" + + : : "X"(expix1), "X"(prevX):"eax","ebx" + ); + + /* + * pre : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * mm3 & mm4 : coefs + */ + + /* recopie des deux premiers pixels dans mm0 et mm1 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + /* extraction des coefficients... */ + + movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + /*^en parrallele^*/ /* depackage du 2ieme pixel */ + /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues à la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + ++loop; + } +#ifdef HAVE_ATHLON + __asm__ __volatile__ ("femms\n"); +#else + emms(); +#endif +} |