summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/post/goom/gfontlib.c226
-rwxr-xr-xsrc/post/goom/gfontlib.h9
-rwxr-xr-xsrc/post/goom/gfontrle.c2499
-rwxr-xr-xsrc/post/goom/mathtools.h26
-rwxr-xr-xsrc/post/goom/mmx.h534
-rwxr-xr-xsrc/post/goom/surf3d.c122
-rwxr-xr-xsrc/post/goom/surf3d.h36
-rwxr-xr-xsrc/post/goom/surface.c18
-rwxr-xr-xsrc/post/goom/surface.h16
-rwxr-xr-xsrc/post/goom/tentacle3d.c221
-rwxr-xr-xsrc/post/goom/tentacle3d.h9
-rwxr-xr-xsrc/post/goom/v3d.h59
-rwxr-xr-xsrc/post/goom/xmmx.h354
-rwxr-xr-xsrc/post/goom/zoom_filter_xmmx.c243
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
+}