Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1626 → Rev 1652

/advdemos/tags/rel_1_5_beta1/gpsmesa/initfile.c
0,0 → 1,200
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "intdrive/intdrive/intdrive.h"
#include "edf/edf/edf.h"
#include "hardcbs/hardcbs/hardcbs.h"
#include "rr/rr/rr.h"
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
 
#include <drivers/shark_linuxc26.h>
#include <drivers/shark_pci26.h>
#include <drivers/shark_input26.h>
#include <drivers/shark_keyb26.h>
#include <drivers/shark_fb26.h>
 
#define FRAME_BUFFER_DEVICE 0
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
/*+ Interrupt Server +*/
#define INTDRIVE_Q 1000
#define INTDRIVE_T 10000
#define INTDRIVE_FLAG 0
 
void call_shutdown_task(void *arg);
int device_drivers_init();
int device_drivers_close();
void set_shutdown_task();
TASK shutdown_task_body(void *arg);
 
PID shutdown_task_PID = -1;
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG);
EDF_register_level(EDF_ENABLE_ALL);
HCBS_register_level(HCBS_ENABLE_ALL, 1);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
/* Create the shutdown task. It will be activated at RUNLEVEL
SHUTDOWN */
set_shutdown_task();
 
/* Init the drivers */
device_drivers_init();
 
/* Set the shutdown task activation */
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN);
 
__call_main__(mb);
 
return (void *)0;
}
 
void set_shutdown_task() {
 
/* WARNING: the shutdown task is a background thread. It cannot execute
if the system is overloaded */
NRT_TASK_MODEL nrt;
 
nrt_task_default_model(nrt);
nrt_task_def_system(nrt);
 
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL);
if (shutdown_task_PID == NIL) {
sys_shutdown_message("Error: Cannot create shutdown task\n");
exit(1);
}
 
}
 
int device_drivers_init() {
 
int res;
KEYB_PARMS kparms = BASE_KEYB;
LINUXC26_register_module();
 
PCI26_init();
 
INPUT26_init();
 
keyb_def_ctrlC(kparms, NULL);
 
KEYB26_init(&kparms);
 
FB26_init();
res = FB26_open(FRAME_BUFFER_DEVICE);
if (res) {
cprintf("Error: Cannot open graphical mode\n");
KEYB26_close();
INPUT26_close();
exit(1);
}
FB26_use_grx(FRAME_BUFFER_DEVICE);
FB26_setmode(FRAME_BUFFER_DEVICE,"800x600-16");
return 0;
 
}
 
int device_drivers_close() {
FB26_close(FRAME_BUFFER_DEVICE);
KEYB26_close();
INPUT26_close();
return 0;
}
 
#define SHUTDOWN_TIMEOUT_SEC 3
 
void call_shutdown_task(void *arg)
{
struct timespec t;
 
sys_gettime(&t);
t.tv_sec += SHUTDOWN_TIMEOUT_SEC;
 
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0);
 
task_activate(shutdown_task_PID);
}
 
TASK shutdown_task_body(void *arg) {
 
device_drivers_close();
 
sys_shutdown_message("-- S.Ha.R.K. Closed --\n");
 
return NULL;
 
}
 
 
/advdemos/tags/rel_1_5_beta1/gpsmesa/gpsmesa.c
0,0 → 1,716
/*
* Project: S.Ha.R.K.
* G P S D E M O : this program receives and displays data from a gps
* transmitter connected to USB port. This is also a graphic demo that
* uses a software emulation of MESA libraries to display actual latitude
* and longitude on the earth globe. You can also use the program without
* having a gps transmitter because it can run in a demo mode (to do that
* press d key when the program starts).
*
* In the main function graphics and com1 port are initialized, respectively
* with a call to the functions gl_init and open_com. Then all the tasks
* used in the program are created and activated, these are :
*
* TASK refresh : copies the gl buffer to video memory
* TASK draw : draws all the graphics
* TASK gps : receives data from gps transmitter
*
*/
 
#include <kernel/log.h>
#include <kernel/kern.h>
#include <math.h>
#include <stdlib.h>
 
#include <drivers/shark_fb26.h>
#include <drivers/shark_keyb26.h>
#include <GL/osmesa.h> //MESA header
#include <GL/glut.h> //MESA header
#include "texture.h" //contains three arrayes that define the R, G, B data of the first texture (phisical earth)
#include "texture2.h" //contains three arrayes that define the R, G, B data of the second texture (political earth)
#ifndef M_PI
#define M_PI 3.14159265
#endif
 
//Graphic variables and constants
 
#define WIDTH 800 //Width of the screen in pixel
#define HEIGHT 600 //Height of the screen in pixel
#define BYTES_PP 2 //BytesPerPixel
 
OSMesaContext ctx;
 
extern void *video_memory;
 
unsigned char *rgb_565_buf = NULL; //RGB 16 bpp Buffer
unsigned char *video_buf = NULL; //Video Buffer
unsigned long int VMEMLONG = WIDTH*HEIGHT*BYTES_PP / 4; //Used by copy_videomem_16to16
unsigned long int RGB565MEM = WIDTH*HEIGHT*BYTES_PP; //Total video mem
 
//Graphic Objects variables and constants
 
GLdouble radius, twist; //radius and twist of the sphere
float zoom = 0; //zoom factor
int sel_texture = 1; //index of the actually selected texture
GLubyte tex[256][256][3]; //stores the R, G, B data of the first texture
GLubyte tex2[256][256][3]; //stores the R, G, B data of the second texture
GLint sphere; //index of the shpere list (see mesa functions for details)
 
//Tasks variables and constants
 
unsigned long int PERIOD_DRAW = 100000; //period of the draw task
unsigned long int PERIOD_GPS = 1000; //period of the gps task
unsigned long int WCET_DRAW, WCET_GPS; //deadlines of the tasks
PID draw_PID, gps_PID; //indexes of the tasks
 
//Gps receiver task variables and constants
 
char word[30]; //contains every word received from the gps transmitter
int ind = 0; //contains the index of the next character to be written in the variable word
int ind_gpgga = 0; //index of the next gpgga word to be read from gps
int ind_gpgsv = 0; //index of the next gpgsv word to be read from gps
int ind_gprmc = 0; //index of the next gprmc word to be read from gps
int nlist; //used to index satellites in gps_sat_data structure
 
//Demo mode variables and functions
 
int demo_mode = 1; //indicates if demo mode is active(=1) or not (=0)
int ndemo = 0; //a counter used while running in demo mode
int lat, lon; //auxiliary variables used for integer division
int kmov; //used to change the moving direction
float demolat = 0; //stores latitude
float demolon = 0; //stores longitude
 
//Gps data structures
 
typedef struct {
float id, elevation, azimuth, signal_level;
} gps_sat_data;
 
struct {
float latitude, longitude, altitude, nsat, speed, dir_mov, date, var_mov;
char dirlat, dirlon, time[12], dir_var_mov;
gps_sat_data sat_data[4]; //data of the satellites in view (4 maximum)
} gps_data;
 
TASK refesh(void);
TASK draw(void);
TASK gps(void);
 
//converts a string to a floating point
float strtof(char *s)
{
int d, n;
float f = 0, pot;
 
//if the string is null ends returning 0
if(s[0] == '\0')
return 0;
 
//finds the dot character until the end of the string
for(d = 0; (s[d] != '.') && (s[d] != '\0') ; d++);
 
//converts non decimal numbers
pot = 1;
for(n = d - 1; n >= 0; n--) {
f = f + pot * (s[n] - 48);
pot = pot * 10;
}
 
//ends if there are not decimal numbers
if( s[d] == '\0')
return f;
 
//converts decimal numbers
pot = 0.1;
for(n = d + 1; s[n] != '\0'; n++) {
f = f + pot * (s[n] - 48);
pot = pot / 10;
if(n >= 30)
break;
 
}
return f;
}
 
//compares two strings returning 1 if they are equal otherwise 0
int streq(char *s1, char *s2)
{
int n = 0;
while(1)
if( s1[n] == s2[n] )
if( s1[n] == '\0' ) {
return 1;
}
else {
n++;
//ends if the string is larger than the word variable
if(n >= 30)
return 0;
}
else
return 0;
}
 
//copies s2 string in s1 string
void strcp(char *s1, char *s2)
{
int n = 0;
while( s2[n] != '\0' ) {
s1[n] = s2[n];
n++;
//ends if the string is larger than the word variable
if(n >= 30)
break;
}
s1[n] = '\0';
}
 
/*rotates the axes of the mesa graphic objects and also of the sphere
using the latitude and longitude data contained in the gps_data structure */
void polarView()
{
float signlat, signlon; //contains directions of rotation
 
//translates the axes far or near from the observer point to make zoom effect
glTranslated(0.0, 0.0, radius + zoom);
glRotated(-twist, 0.0, 0.0, 1.0);
 
//direction of rotation in latitude may be Nord 'N' or Suoth 'S'
if(gps_data.dirlat == 'N')
signlat = -1;
else
signlat = 1;
 
//direction of rotation in longitude may be East 'E' or West 'W'
if(gps_data.dirlon == 'E')
signlon = -1;
else
signlon = 1;
 
/*there are some graphic errors in the two textures that result in a
wrong placing of latitude and longitude on the image displayed.
To compensate these errors some correction factors that depend
on what texture you are using are added to latitude and longitude.*/
switch(sel_texture) {
case 1 : glRotated(signlat*gps_data.latitude + 3 , 1.0, 0.0, 0.0);
glRotated(signlon*gps_data.longitude, 0.0, 1.0, 0.0);
break;
case 2 : glRotated(signlat*gps_data.latitude + 7 , 1.0, 0.0, 0.0);
glRotated(signlon*gps_data.longitude + 15, 0.0, 1.0, 0.0);
}
}
 
//initializes the mesa memory and prepares the textures
void gl_init()
{
GLfloat h = (GLfloat) HEIGHT / (GLfloat) WIDTH;
int r, c;
//Create the OSMesa Context
ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL);
 
//Set the memory pointed by rgb_565_buf to be the mesa buffer
OSMesaMakeCurrent(ctx, rgb_565_buf, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
glEnable(GL_DEPTH_TEST);
glDisable( GL_DITHER );
 
//Set up texturing
glEnable( GL_TEXTURE_2D );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
 
/*puts all data contained in the headers in the tex and tex2 structures
using the right order*/
for(r = 0; r < 256; r++)
for(c = 0; c < 256; c++)
{
tex[r][c][0] = textureR[256*(256-r)+c];
tex[r][c][1] = textureG[256*(256-r)+c];
tex[r][c][2] = textureB[256*(256-r)+c];
tex2[r][c][0] = texture2R[256*(256-r)+c];
tex2[r][c][1] = texture2G[256*(256-r)+c];
tex2[r][c][2] = texture2B[256*(256-r)+c];
 
}
 
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 
//creates the list that define the sphere object
sphere = 1;
glNewList(sphere, GL_COMPILE);
glEnable(GL_TEXTURE_2D);
GLUquadricObj *quadObj = gluNewQuadric ();
gluQuadricTexture(quadObj, GL_TRUE);
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluQuadricNormals(quadObj, GLU_SMOOTH);
glRotated(-90, 1.0, 0.0, 0.0);
gluSphere (quadObj, 3, 30, 30);
glEndList();
glEnable(GL_NORMALIZE);
 
//sets mesa(gl) viewport
glViewport(0, 0, (GLint) WIDTH, (GLint) HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//sets the 3d visual volume and the observer point
glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//places the origin of the axes of the 3d view
glTranslated(0, -1, -40);
 
radius = 0;
twist = 0;
 
}
 
/*generates gps-like values to simulate the gps transmitter when it is not connected,
this function is called every time before drawing the image on mesa buffer
if demo mode is on*/
void demo_val()
{
int ns;
int signal_max[4] = {25, 30, 10, 70};
int azimuth_max[4] = {170, 10, 60, 100};
int elevation_max[4] = {10, 60, 30, 79};
ndemo += 1;
 
//generates speed
gps_data.speed = 25;
 
//generates next direction increasing or decreasing the last one using kmov
if(gps_data.dir_mov == 135)
kmov = -1;
if(gps_data.dir_mov == 45)
kmov = 1;
 
gps_data.dir_mov += kmov;
 
//generates next latitude and longitude data using direction and speed
demolat += cos(gps_data.dir_mov / (360/(2*M_PI)) ) * (gps_data.speed / 20);
demolon += sin(gps_data.dir_mov / (360/(2*M_PI)) ) * (gps_data.speed / 20);
 
lat = (int) demolat;
lon = (int) demolon;
 
/*demolat and demonlon count latitude and longitude from -infinite to
+infinite, but latitude is actually displayed from -90 to +90
(respectively nord or south) and longitude from -180 to +180 (respectively
east or west) and so you have to convert demolat and demolon data into real
latitude and longitude data before putting them in gps_data structure*/
 
if(lon < 0)
lon = 360 - (-lon) % 360;
 
if(lon % 360 > 180) {
gps_data.longitude = 180 - (lon % 360 - 180);
gps_data.dirlon = 'W';
}
else {
gps_data.longitude = lon % 360;
gps_data.dirlon = 'E';
}
 
if(lat < 0)
lat = 360 - (-lat) % 360;
 
if(lat % 360 >= 180) {
gps_data.dirlat = 'S';
if(lat % 360 > 270)
gps_data.latitude = 90 - (lat % 360 - 270);
else {
gps_data.latitude = lat % 360 - 180;
 
gps_data.longitude = 180 - gps_data.longitude;
if(gps_data.dirlon == 'E')
gps_data.dirlon = 'W';
else
gps_data.dirlon = 'E';
}
}
 
if(lat % 360 < 180) {
gps_data.dirlat = 'N';
if(lat % 360 > 90) {
gps_data.latitude = 90 - (lat % 360 - 90);
 
gps_data.longitude = 180 - gps_data.longitude;
if(gps_data.dirlon == 'E')
gps_data.dirlon = 'W';
else
gps_data.dirlon = 'E';
}
else
gps_data.latitude = lat % 360;
}
 
//generates altitude and time
gps_data.altitude = 79;
strcp(gps_data.time, "113024.00");
 
//generates the data of the satellites
gps_data.nsat = 4;
 
for(ns = 0; ns < 4; ns++) {
gps_data.sat_data[ns].id = ns + 20;
gps_data.sat_data[ns].azimuth = ndemo % azimuth_max[ns];
gps_data.sat_data[ns].elevation = ndemo % elevation_max[ns];
gps_data.sat_data[ns].signal_level = ndemo % signal_max[ns];
}
 
}
 
//this task draws the whole graphic on video memory and on mesa buffer
TASK draw(void)
{
char text[100];
TIME draw_TIME, gps_TIME;
 
while(1) {
 
task_testcancel();
 
//if demo mode is on it calls demo_val function to generate gps-like values
if(demo_mode == 1)
demo_val();
 
//gets time of execution of all the tasks
jet_gettable(draw_PID, &draw_TIME, 1);
jet_gettable(gps_PID, &gps_TIME, 1);
 
//displays text informations and graphics using standard functions (grx functions)
 
//displays the data of the execution times of the tasks
sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DRAW,(int)draw_TIME);
 
//if there is a risk of system crash warns displaying the text in red color
if(draw_TIME > PERIOD_DRAW * 0.65)
grx_text(text,10,65,rgb16(255,0,0),0);
else
grx_text(text,10,65,rgb16(100,100,100),0);
 
sprintf(text,"Hard Task Gps PER:%6d us EX:%6d us",(int)PERIOD_GPS,(int)gps_TIME);
grx_text(text,10,75,rgb16(100,100,100),0);
 
//displays data contained in gps_data structure
grx_rect(0, 0, 799, 89, rgb16(0, 0, 250));
grx_rect(1, 52, 380, 88, rgb16(100, 100, 100));
 
grx_text("Current position :",390,5,rgb16(0,255,255),0);
sprintf(text,"Latitude %f dir %c ", gps_data.latitude, gps_data.dirlat);
grx_text(text,390,25,rgb16(0,255,255),0);
sprintf(text,"Longitude %f dir %c ", gps_data.longitude, gps_data.dirlon);
grx_text(text,390,35,rgb16(0,255,255),0);
sprintf(text,"Altitude %f ", gps_data.altitude);
grx_text(text,390,45,rgb16(0,255,255),0);
sprintf(text,"Time %c%c:%c%c:%c%c ", gps_data.time[0], gps_data.time[1], gps_data.time[2], gps_data.time[3], gps_data.time[4], gps_data.time[5]);
grx_text(text,390,55,rgb16(0,255,255),0);
sprintf(text,"Speed %f ", gps_data.speed);
grx_text(text,390,65,rgb16(0,0,255),0);
sprintf(text,"Direction %f ", gps_data.dir_mov);
grx_text(text,390,75,rgb16(0,0,255),0);
 
//displays satellites data contained in the gps_data structure
grx_text("Satellites in view : ",600,5,rgb16(255,0,0),0);
sprintf(text,"Number of satellites %f ", gps_data.nsat);
grx_text(text,600, 25,rgb16(255,0,0),0);
grx_text("Signal level ", 600, 35,rgb16(255,0,0),0);
 
for(nlist = 0; nlist < 4; nlist++)
if( gps_data.sat_data[nlist].signal_level > 99)
gps_data.sat_data[nlist].signal_level = 99;
 
grx_box(600, 45, 700, 80, rgb16(0, 0, 0));
grx_box(600, 45, 600+gps_data.sat_data[0].signal_level, 50, rgb16(100, 0, 0));
grx_box(600, 55, 600+gps_data.sat_data[1].signal_level, 60, rgb16(150, 0, 0));
grx_box(600, 65, 600+gps_data.sat_data[2].signal_level, 70, rgb16(200, 0, 0));
grx_box(600, 75, 600+gps_data.sat_data[3].signal_level, 80, rgb16(250, 0, 0));
 
//displays program title and other informations
grx_text("G P S D E M O", 10, 5, rgb16(0, 255, 0), 0);
grx_text("Esc : end program...",170,5,rgb16(0,255,0),0);
grx_text("t : change texture" ,170,15,rgb16(0,255,0),0);
grx_text("d : demo/gps mode " ,170,25,rgb16(0,255,0),0);
grx_text("a z : zoom near/far " ,170,35,rgb16(0,255,0),0);
if(demo_mode == 1)
grx_text("Demo mode " ,10,25,rgb16(255,255,0),0);
else
grx_text("Gps mode " ,10,25,rgb16(0,255,0),0);
 
 
//displays mesa graphic
int nmax;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
//selects and activates the correct texture
if(sel_texture == 1)
glTexImage2D( GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, tex );
else
glTexImage2D( GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, tex2 );
 
//draws the sphere calling the appropriate list defined in gl_init function
glPushMatrix();
polarView();
glCallList(sphere);
glPopMatrix();
 
//draws the arrow and the cross on the sphere
glPushMatrix();
glTranslated (0, 0, zoom);
glDisable(GL_TEXTURE_2D);
glColor3f (0, 1, 1);
glTranslated (0, 0, 6);
glRotated(180 + gps_data.dir_mov, 0.0, 0.0, 1.0);
glLineWidth (2.0);
glBegin(GL_LINES);
glVertex2f(-0.2, 0.2);
glVertex2f(0.2, -0.2);
glVertex2f(0.2, 0.2);
glVertex2f(-0.2, -0.2);
glColor3f (0, 0, 1);
glVertex2f(0, 0);
glVertex2f(0, gps_data.speed/30);
glVertex2f(0, gps_data.speed/30);
glVertex2f(0.2, gps_data.speed/30-0.2);
glVertex2f(0, gps_data.speed/30);
glVertex2f(-0.2, gps_data.speed/30-0.2);
glEnd();
glColor3f (0, 0, 0.3);
glTranslated (0.05, 0.05, 0);
glBegin(GL_LINES);
glVertex2f(-0.2, 0.2);
glVertex2f(0.2, -0.2);
glVertex2f(0.2, 0.2);
glVertex2f(-0.2, -0.2);
glVertex2f(0, 0);
glVertex2f(0, gps_data.speed/30);
glVertex2f(0, gps_data.speed/30);
glVertex2f(0.2, gps_data.speed/30-0.2);
glVertex2f(0, gps_data.speed/30);
glVertex2f(-0.2, gps_data.speed/30-0.2);
glEnd();
glPopMatrix();
 
//draws sattellites in view using azimuth and elevation data
if(gps_data.nsat < 4) //this function can draw four satellites at maximum
nmax = gps_data.nsat;
else
nmax = 4;
 
for(nlist = 0; nlist < nmax; nlist++) {
glPushMatrix();
glDisable(GL_TEXTURE_2D);
glColor3f (0.4+0.2*nlist, 0, 0);
glLineWidth (2.0);
glRotated(gps_data.sat_data[nlist].azimuth, 0.0, 0.0, 1.0);
glTranslated (0, 0, 3 + zoom);
glRotated(90 - gps_data.sat_data[nlist].elevation, 1.0, 0.0, 0.0);
glTranslated (0, 0, 4);
glBegin(GL_LINES);
glVertex2f(-0.1, -0.1);
glVertex2f(0.1, 0.1);
glVertex2f(-0.1, 0.1);
glVertex2f(0.1, -0.1);
glEnd();
glPopMatrix();
}
 
glFinish();
memcpy((video_buf+90*WIDTH*2), rgb_565_buf, RGB565MEM-90*WIDTH*2);
task_endcycle();
 
}
 
exit(1);
}
 
/*This task reads the data from the gps transmitter using the polling system.
Gps sends data with a rate of 4800 bit/s this means 1 byte every 1.6 ms.
If you want to be sure to get all the bytes transmitted by the gps you have
to choose a period <1.6 ms for this gps task, in this program the period is
1000ns or 1ms.*/
 
TASK gps(void)
{
 
while(1) {
task_testcancel();
task_endcycle();
}
 
exit(1);
 
}
 
//is called just before program ends
void program_key_end(KEY_EVT *k)
{
exit(1);
}
 
//is called when t key is pressed and changes the texture to be displayed on the sphere
void program_key_texture(KEY_EVT *k2)
{
if(sel_texture == 1)
sel_texture = 2;
else
sel_texture = 1;
}
 
//is called when d key is pressed and changes from demo to gps mode and vice versa
void program_key_demo(KEY_EVT *k3)
{
if(demo_mode == 0)
demo_mode = 1;
else
demo_mode = 0;
ndemo = 0;
kmov = -1;
lat = 0;
lon = 0;
demolat = 0;
demolon = 0;
gps_data.dirlat = 'N';
gps_data.dirlon = 'E';
gps_data.latitude = 0;
gps_data.longitude = 0;
gps_data.dir_mov = 90;
}
 
//is called when a key is pressed and increases the zoom factor
void program_key_near(KEY_EVT *k4)
{
zoom += 0.7;
}
 
//is called when a key is pressed and decreases the zoom factor
void program_key_far(KEY_EVT *k5)
{
zoom -= 0.7;
}
 
int main (int argc, char *argv[])
{
HARD_TASK_MODEL ht_draw, ht_gps;
 
WCET_DRAW =(int)((float) PERIOD_DRAW * (0.90));
WCET_GPS =(int)((float) PERIOD_GPS * (0.05));
 
//prepares draw task for activation
hard_task_default_model(ht_draw);
hard_task_def_mit(ht_draw,PERIOD_DRAW);
hard_task_def_wcet(ht_draw,WCET_DRAW);
hard_task_def_group(ht_draw,1);
hard_task_def_ctrl_jet(ht_draw);
hard_task_def_usemath(ht_draw);
hard_task_def_stack(ht_draw,35000); //VERY IMPORTANT FOR glCallList !!
 
draw_PID = task_create("draw", draw, &ht_draw, NULL);
if (draw_PID == -1) {
exit(1);
return 0;
}
 
//prepares gps task for activation
hard_task_default_model(ht_gps);
hard_task_def_wcet(ht_gps,WCET_GPS);
hard_task_def_mit(ht_gps,PERIOD_GPS);
hard_task_def_usemath(ht_gps);
hard_task_def_group(ht_gps,1);
hard_task_def_ctrl_jet(ht_gps);
 
gps_PID = task_create("gps", gps, &ht_gps, NULL);
if (gps_PID == -1) {
exit(1);
return 0;
}
 
//defines and activates all the keyboard events used in the program
{
KEY_EVT k;
k.scan = KEY_ESC;
k.ascii = 27;
k.status = KEY_PRESSED;
keyb_hook(k,program_key_end,FALSE);
}
 
{
KEY_EVT k2;
k2.scan = KEY_T;
k2.ascii = 't';
k2.status = KEY_PRESSED;
keyb_hook(k2,program_key_texture,FALSE);
}
 
{
KEY_EVT k3;
k3.scan = KEY_D;
k3.ascii = 'd';
k3.status = KEY_PRESSED;
keyb_hook(k3,program_key_demo,FALSE);
}
 
{
KEY_EVT k4;
k4.scan = KEY_A;
k4.ascii = 'a';
k4.status = KEY_PRESSED;
keyb_hook(k4,program_key_near,FALSE);
}
 
{
KEY_EVT k5;
k5.scan = KEY_Z;
k5.ascii = 'z';
k5.status = KEY_PRESSED;
keyb_hook(k5,program_key_far,FALSE);
}
 
//allocates memory for mesa functions (mesa buffer)
rgb_565_buf = malloc(RGB565MEM);
 
//puts in a pointer the address of video memory
video_buf = (unsigned char *)video_memory;
 
//initializes mesa functions and prepares textures
gl_init();
 
//clears mesa buffer
memset(rgb_565_buf, 0, RGB565MEM);
 
//clears screen (video memory)
grx_box(0, 0, 1023, 89, rgb16(0, 0, 0));
 
ndemo = 0;
kmov = -1;
lat = 0;
lon = 0;
demolat = 0;
demolon = 0;
gps_data.dirlat = 'N';
gps_data.dirlon = 'E';
gps_data.latitude = 0;
gps_data.longitude = 0;
gps_data.dir_mov = 90;
 
//resets the word variable
word[0] = '\0';
 
//activates the tasks previously created and prepared (draw, refresh, gps)
group_activate(1);
 
return 0;
}
/advdemos/tags/rel_1_5_beta1/gpsmesa/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS = gpsmesa
 
include $(BASE)/config/example.mk
 
gpsmesa:
make -f $(SUBMAKE) APP=gpsmesa INIT= OTHEROBJS="initfile.o" SHARKOPT="__OSMESA__ __LINUXC26__ __NET__ __PCI__ __INPUT__ __FB__"
 
/advdemos/tags/rel_1_5_beta1/gpsmesa/texture.h
0,0 → 1,771
GLubyte textureR[65536] = {173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,181,181,181,181,181,181,181,181,181,173,173,173,173,173,173,181,181,181,181,181,181,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
173,173,173,173,173,173,173,173,181,181,173,181,181,181,173,173,173,181,173,181,181,189,189,165,173,181,181,173,173,173,173,173,173,173,181,181,181,181,181,181,181,173,173,173,173,181,181,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
173,173,173,173,173,173,173,173,173,173,173,165,165,189,173,165,173,198,189,181,181,181,189,173,181,173,181,181,173,173,181,173,181,181,173,173,173,173,165,165,173,173,173,173,173,173,181,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,189,189,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
181,181,189,181,173,173,173,181,189,206,181,165,140,140,115,123,148,148,115,107,132,123,99,123,132,132,132,140,140,148,148,165,165,173,173,181,206,189,198,198,189,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,173,173,173,173,173,173,173,173,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,181,189,189,181,181,181,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,181,173,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,173,173,173,173,165,165,165,165,165,173,173,173,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,165,165,173,173,173,173,165,173,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,173,181,165,165,173,173,173,173,
173,181,148,165,156,156,165,148,132,148,140,132,132,132,132,107,107,99,107,107,90,74,57,66,57,57,57,57,57,57,66,82,99,123,140,156,173,189,189,189,189,189,189,189,189,181,173,173,181,181,181,173,173,173,173,181,173,173,181,173,181,181,181,181,173,173,181,181,181,181,181,189,189,189,189,189,181,181,173,173,173,181,173,173,181,181,181,189,189,189,181,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,181,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,173,165,165,173,173,165,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,165,165,165,173,165,165,173,173,173,173,165,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,165,156,181,165,173,173,181,
132,132,140,132,132,132,132,132,140,132,132,132,132,99,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,74,90,107,132,140,156,156,173,181,189,189,189,181,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,181,181,181,165,148,140,107,82,66,74,82,99,115,165,181,181,181,189,189,189,189,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,173,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,165,165,165,173,173,165,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,173,173,173,189,181,181,165,189,107,165,173,156,156,140,132,
140,140,140,132,140,140,140,140,132,140,140,140,140,132,107,66,66,66,66,66,66,66,66,57,66,57,57,66,66,66,66,57,57,57,66,82,99,99,123,148,165,173,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,189,189,189,189,173,156,140,140,132,115,107,82,57,66,74,99,99,90,132,181,181,181,189,189,173,173,173,173,173,181,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,173,173,173,173,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,173,181,181,181,173,181,173,156,181,181,165,132,123,140,107,132,132,132,132,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,115,99,66,57,57,57,57,57,57,57,66,66,66,66,74,74,74,82,99,115,123,123,148,156,165,181,189,189,189,189,189,181,181,181,181,181,173,181,181,181,181,181,181,181,181,181,181,181,181,181,189,181,189,189,181,156,123,99,82,66,57,57,57,66,66,74,123,132,140,132,115,99,107,140,165,173,140,74,99,82,74,107,181,181,181,189,189,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,165,173,165,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,173,181,189,173,165,132,90,123,140,123,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,132,66,57,57,66,66,57,66,57,57,66,57,66,82,82,90,99,115,132,140,148,165,173,173,173,181,181,181,189,181,181,181,181,173,181,181,181,181,181,173,181,181,181,181,181,181,181,181,189,189,189,181,156,123,90,66,57,57,66,57,57,57,57,107,132,132,140,140,140,140,140,123,115,107,99,90,107,132,132,90,90,140,165,181,181,181,181,181,181,181,181,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,165,165,173,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,173,181,181,181,181,181,173,173,173,165,123,107,132,140,132,140,132,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,115,90,82,82,90,82,74,66,66,57,57,57,57,57,66,74,99,107,123,140,156,173,181,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,173,181,181,181,181,181,181,181,181,189,189,181,156,107,66,57,66,66,74,74,74,82,107,123,140,140,140,140,132,140,140,132,132,132,140,140,132,140,140,132,99,82,82,99,107,107,107,107,123,156,181,189,189,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,173,181,181,181,189,189,181,181,181,115,107,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,132,140,140,140,140,140,140,140,140,99,57,57,57,57,57,66,66,66,74,90,115,140,165,181,189,189,189,189,189,189,189,181,181,181,181,181,181,181,181,181,181,173,173,173,181,181,181,181,181,173,173,173,181,181,181,189,181,181,173,132,82,66,123,132,140,132,132,140,140,140,140,140,140,140,140,140,132,107,66,66,74,90,99,99,115,132,140,140,132,132,123,115,90,82,99,156,165,173,173,181,181,181,189,181,181,181,181,181,181,181,173,173,173,173,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,165,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,181,173,173,181,181,181,181,181,173,181,181,181,181,181,156,123,132,115,115,140,132,140,140,132,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,115,99,99,123,140,140,140,140,132,115,57,57,57,57,57,57,57,66,74,99,132,165,181,181,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,148,99,74,57,82,140,140,140,115,132,140,140,140,140,140,140,140,140,140,140,140,132,99,66,74,82,99,74,115,140,140,140,140,132,140,140,132,107,66,74,66,82,90,107,148,181,189,189,189,181,181,181,181,173,173,181,181,181,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,165,165,165,165,173,173,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,173,181,173,173,181,189,165,115,123,132,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,115,74,90,107,132,140,132,107,99,66,66,74,90,99,99,90,82,74,74,99,132,165,181,189,181,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,165,173,123,74,107,90,107,115,140,140,140,90,82,123,132,140,140,140,140,140,140,140,140,140,140,140,74,74,90,90,66,123,140,140,132,140,123,99,82,66,57,66,82,115,148,165,156,165,181,181,181,181,181,181,181,181,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,165,165,165,173,173,165,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,173,181,181,140,107,123,140,132,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,132,140,140,140,123,107,74,66,99,115,140,140,140,148,156,148,148,165,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,156,74,90,82,74,90,132,132,132,140,140,123,107,132,140,140,140,140,140,140,140,140,132,132,140,99,66,66,66,90,140,140,140,140,140,82,66,107,123,107,90,90,82,123,173,189,181,181,181,181,181,181,181,181,181,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,148,132,115,107,115,132,140,140,140,140,140,140,140,140,
132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,107,74,107,107,115,107,107,90,99,107,132,181,189,181,181,181,181,181,181,173,173,173,181,181,181,181,181,181,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,181,181,181,181,181,115,66,57,82,99,90,74,74,82,132,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,123,99,107,132,132,123,123,123,123,123,82,99,156,181,181,181,173,181,181,181,181,181,181,181,181,181,181,173,173,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,156,140,107,132,115,123,132,123,123,123,132,123,123,132,
132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,115,123,123,123,115,115,90,115,82,115,173,181,181,181,181,181,173,181,173,181,173,173,181,173,173,173,181,181,173,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,189,148,123,107,132,165,123,107,132,123,132,132,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,132,132,115,99,107,156,181,189,181,181,181,181,181,181,181,181,181,181,173,173,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,165,165,173,173,173,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,181,173,173,173,165,107,123,132,123,132,123,132,132,123,132,132,123,123,
132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,132,132,123,132,140,132,107,107,99,148,181,181,181,181,181,181,173,181,181,181,181,173,173,173,173,181,181,181,181,181,189,189,181,189,181,181,181,189,189,181,181,173,173,173,181,189,189,189,189,181,189,181,181,156,132,99,99,99,74,74,107,99,132,123,123,140,140,140,132,132,132,132,132,132,132,132,132,132,140,140,132,132,132,132,123,123,123,123,132,132,123,107,107,132,156,173,173,181,181,189,189,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,181,181,181,173,173,173,173,173,173,173,165,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,173,173,173,173,173,173,173,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,173,181,165,99,132,132,123,123,123,123,123,123,132,132,132,132,
132,132,132,132,132,132,123,123,132,132,123,115,107,99,99,90,90,99,99,115,123,132,140,132,132,115,123,115,140,165,181,189,189,189,189,181,189,189,181,189,189,189,181,181,189,173,165,156,148,140,99,90,99,107,107,99,90,90,99,115,132,148,165,181,189,189,189,189,181,148,115,82,57,57,66,107,148,173,189,173,132,99,107,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,115,107,115,115,173,189,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,181,181,181,181,181,181,181,181,181,181,173,173,173,173,173,173,165,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,148,90,123,132,132,132,132,123,132,132,132,132,132,132,
132,132,123,123,115,115,107,115,107,99,99,90,90,90,90,90,90,90,90,90,90,90,99,115,140,140,132,132,132,115,115,107,107,148,148,140,132,132,148,148,148,140,148,140,148,148,82,82,90,115,123,123,132,115,107,123,123,66,107,140,148,148,156,173,189,181,189,181,189,181,165,148,107,107,148,181,173,173,173,173,165,165,107,99,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,74,107,173,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,165,173,173,173,173,173,173,173,173,173,165,173,165,173,173,173,165,173,173,173,173,173,181,181,181,181,189,181,181,181,181,181,181,173,173,173,173,173,173,165,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,165,165,165,173,173,173,173,165,165,173,165,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,181,173,181,181,156,115,115,115,132,132,132,132,132,132,132,132,132,132,
132,132,123,115,107,107,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,107,123,123,140,140,140,140,140,132,123,140,132,123,123,107,115,82,99,115,107,115,90,123,115,115,140,140,140,140,140,115,74,82,140,173,181,181,181,189,189,189,181,181,156,148,165,173,156,148,165,165,181,189,189,181,181,181,165,123,90,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,140,140,123,107,90,115,181,189,189,181,181,181,173,173,173,173,173,173,173,165,173,173,165,165,165,173,173,173,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,165,173,173,173,173,173,173,173,181,189,189,181,189,181,181,181,173,173,173,173,173,173,173,165,165,165,173,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,165,165,173,173,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,173,148,123,115,123,123,132,132,132,132,132,132,132,132,
132,132,115,107,99,107,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,90,90,90,90,90,90,90,99,107,115,115,99,123,132,132,132,132,107,123,132,115,123,132,132,132,132,132,132,132,132,132,132,132,107,82,90,66,74,90,132,156,132,123,115,115,107,107,107,123,107,107,99,107,82,107,123,140,148,165,181,181,181,165,99,123,132,132,132,132,132,132,132,132,123,132,132,132,123,123,115,107,107,107,107,107,107,107,115,123,123,140,140,132,132,140,99,99,82,123,173,189,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,189,156,123,165,189,181,181,181,181,173,173,173,173,173,173,173,173,173,165,165,165,165,165,173,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,173,173,165,173,173,173,173,173,173,173,173,173,173,173,181,173,173,173,181,181,173,173,181,173,173,173,181,165,123,115,132,132,132,132,132,132,132,132,132,
132,132,123,107,99,90,90,90,90,82,82,90,90,82,82,82,82,82,82,90,90,82,82,82,82,90,90,90,90,90,90,99,99,99,107,115,123,132,132,140,132,132,132,123,123,123,123,132,132,123,132,123,132,132,107,123,107,99,107,123,123,132,123,107,99,115,132,140,140,140,140,115,90,132,107,123,115,107,115,115,115,189,173,165,107,123,132,132,132,132,132,132,132,140,140,132,123,123,115,107,99,99,99,99,99,99,90,90,90,99,90,107,107,132,140,140,132,123,99,74,115,181,181,181,181,181,189,189,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,140,57,99,173,189,189,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,165,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,173,173,173,173,173,181,181,181,173,165,140,123,123,123,132,132,132,132,123,132,
123,132,132,123,99,90,90,90,82,82,82,82,82,82,82,82,82,82,82,90,90,90,82,82,82,82,82,82,82,90,90,90,90,99,99,99,107,107,107,107,107,115,115,123,123,123,123,123,123,123,132,132,123,132,132,115,107,99,99,99,132,132,123,132,132,132,132,132,132,132,132,123,123,140,123,99,107,82,66,107,115,181,181,156,107,140,132,132,123,123,123,123,140,132,132,123,115,107,107,90,82,90,90,90,99,99,90,90,90,90,90,82,90,99,99,123,140,132,132,123,74,115,140,173,189,173,165,132,181,189,181,181,181,181,181,173,173,181,181,181,181,181,189,189,189,189,181,189,181,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,66,74,90,132,189,181,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,181,181,173,173,181,181,173,181,181,140,140,123,140,132,132,123,107,107,
115,123,123,115,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,99,99,99,82,99,90,90,107,115,123,132,132,132,123,123,123,107,123,115,123,123,123,123,123,132,132,123,132,132,132,132,123,132,132,132,123,132,132,123,115,99,82,99,123,115,123,181,173,156,107,132,132,123,123,123,123,115,115,107,107,107,99,90,90,90,90,82,90,90,82,82,90,82,82,82,82,82,82,82,90,107,115,132,140,123,90,82,90,90,140,115,123,107,107,132,173,181,173,165,181,189,181,173,181,173,181,156,140,132,123,123,123,132,165,189,189,189,189,181,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,132,66,140,107,140,181,181,173,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,181,181,181,181,181,181,148,115,165,173,173,165,156,140,123,107,107,115,115,99,
123,115,99,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,82,99,99,107,99,107,99,99,99,107,99,99,99,107,115,115,123,107,123,132,140,132,132,140,132,132,132,132,132,123,123,123,132,132,123,132,132,140,132,107,115,107,148,181,181,156,115,132,132,123,123,115,107,107,99,99,99,99,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,99,107,115,115,140,132,123,107,140,132,132,132,132,123,107,99,90,82,90,123,115,74,82,82,107,90,115,82,99,99,132,107,90,115,156,173,181,181,181,181,189,181,181,173,173,181,181,173,181,173,173,173,173,173,173,173,181,173,181,156,66,123,132,90,173,189,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,173,173,181,173,173,173,173,181,181,181,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,189,181,181,181,181,173,107,132,99,140,132,132,132,115,99,107,107,107,99,115,
99,99,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,99,90,90,90,99,90,90,99,99,99,90,90,90,99,90,90,90,90,82,90,90,82,90,99,115,107,99,99,115,123,132,132,132,132,132,132,123,123,107,132,123,99,123,99,173,173,173,123,132,132,123,123,115,107,99,99,99,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,74,74,74,90,107,115,123,123,132,123,132,140,140,140,140,148,140,148,140,140,140,132,123,123,107,132,132,148,140,140,140,140,140,132,123,123,99,156,165,148,123,156,189,181,173,173,181,181,181,181,173,173,173,173,173,173,173,181,181,181,148,57,132,132,123,115,156,173,181,181,181,181,173,173,181,181,181,173,173,173,173,173,173,173,181,173,181,173,173,173,173,181,181,181,181,181,173,181,181,181,173,173,181,173,173,181,173,173,173,173,173,173,173,173,181,181,181,181,181,189,189,189,189,189,189,181,132,123,132,132,140,132,123,107,99,107,107,99,99,90,90,
90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,99,90,99,90,99,107,99,99,90,82,90,90,90,90,82,82,82,82,82,82,82,82,82,82,90,82,74,90,99,107,115,107,123,132,132,132,132,123,123,115,148,132,123,132,173,165,115,132,132,123,123,115,107,99,90,90,90,90,82,90,90,90,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,82,82,90,99,99,99,107,99,99,107,123,107,107,107,115,123,115,123,140,140,140,140,140,123,123,115,99,99,107,123,140,140,140,82,99,132,132,132,123,181,181,181,181,181,189,181,173,181,181,181,173,173,173,181,181,181,181,181,90,123,140,140,132,132,123,156,189,181,181,181,181,181,181,181,181,173,181,181,181,173,181,181,181,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,173,173,181,173,181,181,181,189,189,189,189,156,156,140,132,140,132,123,132,123,115,115,107,107,99,107,107,99,90,90,90,90,
90,99,90,99,82,82,82,82,82,82,82,82,82,82,90,82,82,82,82,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,82,90,82,82,90,90,82,90,82,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,107,90,90,99,99,90,99,99,107,115,132,132,132,132,140,132,132,132,148,115,123,132,132,132,132,115,107,99,99,90,90,90,82,82,82,82,82,82,82,82,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,99,107,107,90,99,90,90,82,90,99,107,99,99,107,115,107,115,107,99,99,90,90,90,90,90,90,99,132,132,107,123,132,123,140,123,148,173,181,181,189,173,189,181,181,181,189,181,181,189,181,181,181,181,181,140,99,132,132,123,123,123,107,148,181,181,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,181,181,181,181,181,181,181,181,181,181,181,173,181,181,181,181,189,181,148,99,132,123,99,115,74,115,132,132,123,115,107,99,99,99,99,99,90,90,82,90,90,90,90,
107,90,90,82,74,82,90,90,82,82,90,82,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,82,82,82,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,82,90,82,90,90,82,82,82,90,115,132,132,123,123,115,132,132,132,132,132,123,132,132,115,107,99,99,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,74,82,90,82,90,90,99,107,99,90,82,82,82,82,82,82,90,82,82,90,90,123,132,132,115,115,115,123,140,132,132,132,140,107,165,181,181,181,181,181,181,156,156,156,140,132,107,115,107,132,123,123,123,132,132,123,132,132,148,173,181,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,181,173,173,173,173,165,181,189,189,181,181,181,181,181,181,181,181,181,181,181,181,181,148,99,115,123,132,132,132,132,132,123,123,123,107,107,99,99,90,99,99,99,90,99,99,90,90,90,99,
99,90,82,90,90,90,90,90,90,90,90,90,90,82,90,82,90,82,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,82,82,82,74,82,74,82,82,82,82,82,82,82,82,82,82,90,90,99,115,132,132,132,99,115,123,132,140,132,132,123,132,115,99,99,90,90,90,82,90,82,82,82,82,82,82,74,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,74,82,90,82,82,82,82,99,107,90,90,82,82,82,82,74,82,82,82,82,82,90,107,123,107,90,99,90,99,99,115,132,132,115,107,115,123,181,181,132,123,115,123,123,132,132,132,132,140,132,132,123,132,132,132,132,132,123,132,115,107,115,123,148,165,173,173,181,181,181,165,181,181,181,181,181,173,148,115,123,123,82,107,99,99,115,132,140,148,173,132,132,148,189,189,181,189,189,181,173,156,132,99,132,132,132,123,123,123,123,123,132,99,107,99,99,107,115,107,107,99,99,90,99,90,90,90,90,
90,90,99,99,90,99,99,90,90,90,82,82,90,90,90,90,82,90,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,82,82,74,82,82,82,82,82,82,74,74,74,74,74,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,82,82,90,90,99,90,107,132,132,115,123,140,132,115,123,132,123,123,115,107,99,99,90,90,90,82,82,82,82,82,74,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,74,74,74,90,82,82,82,90,99,90,90,82,74,82,74,82,74,74,74,82,82,82,82,82,115,90,82,82,74,74,90,99,107,107,132,132,115,115,165,173,132,107,132,132,132,132,123,123,123,107,123,123,132,123,115,115,132,132,132,132,132,132,132,132,123,123,115,115,115,107,123,107,107,165,173,173,148,115,132,99,140,165,90,132,132,132,132,132,123,115,107,123,132,115,140,148,123,132,140,132,123,132,123,123,132,132,123,123,123,123,123,123,107,99,99,99,107,107,107,99,99,99,90,90,99,90,90,82,90,
99,107,99,99,99,99,99,99,90,90,90,90,90,90,82,90,82,82,82,82,82,82,82,82,90,82,82,82,82,82,82,82,74,74,74,74,74,74,74,82,74,74,74,74,74,74,74,74,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,74,82,82,82,82,90,90,82,90,90,115,140,132,132,123,140,115,123,132,132,132,132,115,99,99,90,82,82,82,82,82,82,74,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,90,90,82,82,82,82,82,90,99,107,90,90,74,74,74,74,74,74,74,74,74,82,82,115,99,82,74,82,82,82,90,99,99,99,107,123,123,123,123,132,132,107,99,99,99,90,99,99,99,107,107,107,99,99,99,99,107,123,132,132,132,140,140,132,123,123,123,132,132,132,132,115,123,123,123,123,123,123,132,132,123,123,132,123,123,132,140,132,132,123,123,132,132,123,140,132,132,123,123,140,132,132,132,123,132,123,123,123,107,99,99,99,99,99,90,107,107,99,99,90,90,99,90,90,82,90,90,82,
107,107,107,99,99,99,99,99,99,99,90,90,90,90,90,82,82,82,90,82,90,82,82,90,90,82,90,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,99,74,74,74,82,82,82,82,82,82,82,82,90,90,90,107,132,132,132,107,123,115,132,123,132,132,123,107,99,90,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,99,99,90,82,74,74,74,74,90,90,99,82,74,74,74,74,74,74,74,74,74,74,82,90,107,82,74,74,74,74,82,82,90,99,99,107,107,115,123,99,99,90,90,82,82,99,99,90,99,99,99,99,90,99,90,90,90,99,99,99,99,99,99,115,123,132,132,132,140,132,132,123,132,132,140,132,132,132,123,123,132,123,123,123,123,107,107,107,123,132,123,132,132,132,123,132,140,123,115,115,115,107,99,99,99,99,99,99,99,99,99,99,90,90,107,99,99,99,90,90,90,90,90,90,90,90,90,99,
107,99,99,99,99,107,99,107,99,99,99,99,99,90,82,82,90,82,90,82,82,82,82,90,82,82,82,82,82,82,82,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,74,74,74,82,82,82,82,82,82,82,82,90,82,90,99,107,132,123,123,115,140,115,107,115,132,115,99,90,90,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,66,74,74,74,74,90,107,107,99,90,74,74,74,74,82,74,74,74,74,74,74,74,74,74,66,74,74,74,82,82,74,74,74,74,82,82,82,90,90,90,99,107,99,90,90,90,82,82,82,90,90,90,90,90,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,107,107,115,132,132,132,140,123,123,115,107,99,99,99,107,115,115,107,107,99,99,99,99,99,99,107,107,115,115,123,115,107,99,99,90,90,90,90,90,90,90,90,90,90,90,90,99,90,99,90,90,90,90,90,90,90,82,99,90,99,99,107,107,
99,99,99,99,99,99,99,107,107,99,99,90,99,99,90,99,99,90,90,90,90,90,82,82,90,90,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,90,90,99,107,132,123,123,132,140,107,107,115,123,115,107,90,90,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,66,66,74,66,74,74,66,74,74,66,74,74,74,99,99,90,82,74,74,66,66,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,74,82,82,82,74,74,74,82,82,82,82,90,82,82,90,90,90,90,90,90,82,90,90,90,82,82,90,90,90,90,90,90,90,107,99,115,115,115,107,99,90,99,90,90,90,99,99,107,107,99,90,90,90,90,82,82,82,90,90,99,90,90,90,90,90,90,90,90,82,82,82,90,90,90,90,90,90,90,99,99,99,99,99,99,99,90,99,99,107,107,99,99,90,107,
90,90,99,90,90,90,99,99,107,107,107,107,99,99,99,99,99,99,99,99,99,90,90,90,82,90,82,82,82,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,82,82,82,90,90,90,90,99,123,132,115,123,132,123,115,132,132,115,107,90,99,90,82,82,82,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,66,66,74,74,66,74,74,66,74,74,74,66,74,74,74,74,74,74,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,90,90,90,82,82,90,99,99,90,90,82,82,90,90,90,99,99,99,115,123,107,99,90,82,90,90,82,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,90,82,82,82,90,82,90,90,99,99,99,99,99,99,99,90,99,99,115,107,107,90,90,82,90,
90,90,90,90,90,90,90,99,99,99,107,107,107,107,99,99,99,107,99,99,90,90,90,90,90,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,82,123,132,123,107,123,132,123,99,99,90,90,90,90,99,99,82,99,82,66,66,82,74,82,74,74,74,74,74,74,74,66,66,74,74,66,74,66,66,66,66,74,74,74,66,66,66,66,66,66,74,74,66,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,74,82,82,82,82,82,82,82,82,82,90,107,107,99,90,90,90,82,82,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,90,82,82,82,82,82,82,82,90,82,90,90,90,107,107,99,99,90,99,99,99,107,115,99,90,82,82,90,82,82,
82,82,90,82,90,90,90,99,107,99,99,99,90,99,90,99,99,99,107,99,99,90,90,90,90,90,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,82,99,132,140,132,107,123,115,90,90,90,115,132,123,123,107,90,107,82,99,90,82,82,90,90,74,74,66,82,74,66,82,74,74,74,66,74,74,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,90,99,107,107,99,82,90,90,82,82,82,82,82,82,82,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,99,99,99,99,99,107,107,99,99,107,99,107,82,82,74,82,74,82,82,82,
82,82,82,82,90,82,82,90,90,90,82,90,90,90,99,90,90,99,99,99,99,90,90,90,90,90,90,90,82,90,82,74,82,74,74,74,82,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,90,99,90,90,82,74,90,107,132,123,115,123,107,99,107,123,132,140,99,90,90,115,90,90,99,90,90,82,90,90,82,82,82,82,74,74,74,74,82,74,74,74,74,66,66,74,66,66,66,66,66,66,66,66,74,66,74,66,66,74,74,74,74,66,66,74,66,74,66,66,74,74,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,74,82,82,82,82,82,90,90,99,107,107,107,99,90,82,82,82,82,82,82,82,82,82,82,74,82,74,82,82,82,82,82,82,82,82,82,82,82,82,74,74,74,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,90,90,90,99,99,90,99,99,99,99,99,107,90,90,82,82,82,74,74,74,82,82,82,
82,82,82,82,82,82,90,82,82,82,82,82,82,82,90,90,90,90,99,99,99,99,90,90,90,90,90,90,90,90,82,90,82,74,82,90,82,82,74,74,74,74,74,74,74,74,66,74,74,74,74,74,66,74,74,66,66,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,99,99,90,90,90,82,82,90,90,99,115,99,115,107,123,99,90,82,107,115,99,107,115,107,99,107,107,99,115,74,74,82,82,90,90,90,82,82,82,74,74,74,66,74,66,74,66,66,66,66,66,66,66,66,66,66,74,66,66,74,74,74,66,74,66,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,74,82,90,99,90,90,99,115,115,115,99,82,74,82,82,82,82,82,82,82,74,74,74,74,74,82,82,82,82,82,82,74,74,82,74,82,82,82,74,82,74,74,74,82,82,74,82,82,82,82,82,74,82,82,82,90,90,99,99,99,99,99,99,99,99,90,82,82,82,74,74,74,74,74,74,74,74,82,
82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,82,90,90,99,99,99,99,99,90,90,90,90,90,90,82,90,82,82,82,82,82,74,82,82,74,74,74,74,74,74,74,74,74,74,74,66,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,90,90,90,90,90,82,82,90,90,90,90,90,90,99,82,82,82,90,82,82,90,115,107,99,115,107,107,107,99,107,123,99,74,90,82,90,90,90,90,82,74,74,74,74,66,66,66,66,66,66,66,66,66,66,66,74,66,74,74,66,66,74,74,74,74,66,74,66,66,66,66,74,66,66,66,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,107,115,115,107,107,107,115,115,99,82,74,74,82,74,74,82,74,74,74,74,74,74,82,82,82,82,82,82,74,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,99,99,99,90,90,99,99,90,90,82,82,74,74,74,74,66,74,74,74,74,74,74,
74,74,82,74,74,82,82,74,74,82,82,82,74,82,90,90,90,90,99,99,99,99,99,90,99,90,90,90,90,90,82,90,90,82,82,82,90,82,82,82,74,74,74,74,74,74,74,66,66,74,74,74,74,82,74,74,74,74,74,74,82,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,82,90,82,90,90,90,82,90,82,90,90,90,82,90,99,90,82,99,107,115,82,82,99,99,99,107,99,99,107,99,99,107,107,90,90,74,82,90,90,90,90,82,82,82,74,74,74,66,74,74,74,74,74,66,66,66,66,74,66,66,66,66,74,74,74,74,66,66,74,74,66,66,66,66,66,74,66,66,66,66,66,66,66,66,74,66,74,74,66,66,74,74,74,74,74,74,74,74,74,82,74,74,82,115,115,115,115,115,107,115,115,82,74,74,74,82,74,74,74,82,82,82,82,82,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,99,99,90,99,90,99,82,82,82,74,82,74,74,74,66,66,66,66,66,74,74,74,
74,74,74,74,74,74,82,82,82,82,74,82,82,82,82,90,90,90,99,99,99,99,99,99,99,90,90,90,82,90,82,82,90,90,90,90,82,90,82,82,82,82,82,82,82,74,74,74,82,74,74,74,74,74,74,82,74,74,74,82,90,82,74,74,74,74,74,66,66,74,66,74,74,74,74,74,82,82,82,90,90,90,90,90,90,90,90,82,82,82,82,90,90,82,90,99,99,99,90,99,90,99,107,99,99,99,90,90,99,115,99,74,82,82,74,82,90,74,82,82,74,74,74,74,82,66,74,74,82,82,74,66,66,74,82,66,66,66,66,66,74,66,66,74,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,66,66,66,66,74,74,66,66,74,66,74,74,74,74,74,74,82,74,74,74,74,99,115,123,115,115,115,107,99,82,74,74,74,74,74,74,82,82,82,82,82,82,74,74,82,74,74,74,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,90,90,90,99,90,90,90,90,90,90,82,90,90,74,74,66,66,66,66,66,66,66,66,66,66,74,
74,74,74,74,74,74,74,74,82,74,82,74,82,82,82,82,90,90,90,90,99,99,107,99,99,99,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,74,82,74,74,74,74,74,82,82,74,74,74,74,82,74,74,74,74,66,74,66,74,74,66,74,74,82,74,74,74,74,74,74,82,82,82,90,82,90,82,82,90,90,90,90,90,82,82,82,82,82,90,90,99,99,99,90,90,99,90,99,90,90,90,90,90,99,107,99,66,74,82,74,74,74,82,82,99,90,90,99,90,90,90,90,82,82,82,74,74,66,74,66,66,66,66,66,66,74,74,74,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,66,90,90,90,90,99,107,107,115,115,99,74,74,74,74,74,74,82,82,82,82,74,74,82,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,82,90,90,99,90,90,90,82,90,82,90,82,82,82,74,66,66,66,66,66,66,66,66,66,66,66,
74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,90,90,90,90,99,99,99,99,99,99,90,90,99,99,99,99,90,90,90,90,82,82,82,90,82,74,74,74,82,82,82,90,82,82,82,82,82,74,82,82,82,74,74,74,74,66,74,74,74,74,66,66,74,74,74,74,74,74,74,82,82,82,74,107,99,82,90,82,82,90,82,90,90,82,82,82,82,82,90,90,90,90,90,99,99,90,90,90,90,90,99,99,107,107,90,74,74,74,74,74,74,74,82,82,82,82,99,99,99,90,82,82,90,82,74,74,74,66,66,66,66,66,66,66,66,74,82,74,74,74,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,107,123,115,123,107,99,99,107,107,115,90,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,74,82,82,82,90,90,99,99,90,90,90,90,90,82,82,99,82,82,74,74,66,66,66,66,66,66,66,66,74,74,66,
74,74,74,74,74,74,74,74,82,82,74,82,82,82,82,82,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,74,82,82,82,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,74,74,74,74,66,66,66,66,74,66,66,74,74,74,74,82,82,82,82,74,90,123,132,115,82,82,82,82,82,82,90,82,90,82,82,90,90,90,82,90,90,90,99,99,90,82,90,99,90,90,99,132,123,74,82,82,82,74,74,74,74,74,82,82,82,90,90,99,99,90,82,82,82,82,90,74,74,74,74,66,66,66,66,74,82,74,82,99,74,66,66,66,66,66,66,66,66,74,74,66,74,74,74,74,74,66,66,66,66,74,74,82,74,74,74,74,74,90,107,99,90,90,107,99,90,99,99,99,82,82,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,74,74,74,82,82,82,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,90,90,99,99,90,90,90,90,90,82,90,90,82,82,74,66,74,66,66,66,66,66,66,66,74,74,66,
74,74,74,74,74,74,74,82,74,74,82,82,74,82,82,82,82,82,90,90,90,90,99,99,99,90,90,99,99,99,99,99,99,90,90,90,90,90,82,82,99,99,99,99,90,90,90,90,82,82,82,82,82,82,82,82,74,82,74,82,74,66,74,74,74,66,74,74,74,74,74,74,82,82,82,74,99,107,90,90,107,90,74,74,74,74,74,74,90,99,82,82,82,90,90,90,90,99,90,99,90,82,107,107,99,107,107,132,123,82,74,82,82,74,74,74,82,82,82,82,82,82,90,90,99,99,99,90,82,90,90,90,99,82,74,74,74,74,74,66,74,74,82,90,90,74,66,66,66,66,66,66,66,66,74,82,82,74,82,74,74,74,66,66,66,66,66,82,82,82,74,74,74,82,107,99,82,82,82,90,99,99,107,107,99,82,74,82,82,82,82,82,82,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,74,74,74,82,82,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,99,99,99,82,82,82,90,90,82,82,90,82,74,74,66,90,107,90,66,66,66,66,66,66,66,66,
66,66,74,66,74,74,74,74,74,74,74,74,82,82,82,82,90,82,90,99,90,90,90,90,90,90,90,90,90,99,107,99,90,90,99,99,90,90,99,99,90,99,99,99,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,74,74,66,74,74,74,74,74,74,74,74,82,74,82,82,74,99,115,90,99,66,82,123,123,107,115,123,123,132,107,74,74,74,82,82,82,90,82,82,90,99,115,115,123,123,66,66,57,66,66,66,82,90,82,82,82,82,82,82,82,82,82,90,90,99,99,99,99,107,107,99,107,99,99,99,90,82,74,74,74,74,74,82,82,82,82,82,74,74,66,66,66,66,74,74,82,90,90,82,82,82,82,82,74,82,90,74,66,74,74,74,82,74,74,82,82,74,82,82,82,90,107,107,107,107,90,82,74,74,74,74,74,74,82,82,82,82,82,90,99,90,82,82,82,82,82,90,90,82,82,74,82,82,82,82,82,74,74,74,74,82,82,82,82,82,82,82,90,90,99,90,99,99,90,82,90,90,82,82,82,82,99,74,74,74,90,107,115,115,115,74,57,66,74,74,66,66,
66,66,66,66,66,66,74,74,74,74,74,74,74,82,82,82,82,82,90,90,82,82,90,82,90,90,90,99,107,107,99,99,107,90,90,82,82,90,90,90,99,99,99,99,99,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,107,82,90,74,74,123,140,132,132,140,140,132,123,115,115,123,107,74,74,82,82,90,90,107,123,132,140,132,99,90,74,74,66,66,66,74,90,82,82,82,74,82,82,82,90,90,90,90,99,99,107,107,99,99,99,115,107,99,90,90,90,90,74,82,82,90,90,90,90,90,90,90,74,74,66,66,66,66,74,74,90,99,90,90,82,74,74,82,74,115,90,74,74,74,74,74,74,74,74,74,74,82,82,90,107,107,115,115,107,90,82,99,74,82,74,82,74,82,82,82,82,90,82,90,90,82,82,82,82,82,90,90,82,82,82,82,82,82,82,82,82,74,74,74,74,82,82,82,82,82,82,90,90,99,99,99,99,90,82,82,82,82,82,82,82,90,82,74,74,82,115,115,123,115,115,82,66,66,66,74,66,
66,66,66,66,66,66,66,74,74,74,74,74,82,82,82,82,82,82,90,82,82,82,82,82,90,90,99,99,107,99,99,90,74,82,82,90,82,90,90,90,90,99,99,99,99,90,90,90,90,90,82,82,82,82,82,82,82,82,74,82,74,74,74,74,74,74,74,74,74,74,82,82,82,82,107,99,82,90,66,99,132,140,132,132,123,115,115,99,99,99,115,115,123,90,107,107,115,123,123,99,99,115,99,90,99,90,90,82,74,74,74,82,82,82,82,82,82,82,90,90,90,90,99,99,107,107,99,107,99,99,99,99,107,99,90,90,90,90,82,82,90,99,90,99,99,90,90,74,74,66,66,66,66,74,82,90,99,99,99,115,107,99,107,82,90,90,74,74,82,74,74,74,74,82,82,74,82,82,99,115,115,115,115,107,99,107,90,82,74,74,82,82,82,82,82,82,82,82,90,90,82,82,82,82,82,90,90,82,82,82,82,82,82,74,74,74,74,74,82,82,82,82,82,82,90,82,90,90,90,99,99,99,82,82,82,82,82,82,82,82,74,82,90,82,82,107,115,123,123,123,132,99,74,74,74,66,
74,66,66,66,66,66,66,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,90,90,99,99,90,90,82,74,82,82,90,82,82,90,90,90,99,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,74,82,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,115,82,74,66,82,115,132,132,132,132,123,123,123,123,115,107,90,90,90,90,90,90,90,99,90,90,90,107,90,90,99,90,90,90,74,74,99,90,74,82,82,82,82,82,90,90,90,99,99,99,107,107,107,99,99,107,99,90,99,90,90,99,90,90,90,90,99,90,99,99,99,99,82,82,74,66,66,66,74,74,82,90,99,115,107,123,99,90,90,82,90,82,82,74,74,74,74,74,74,82,74,82,82,82,99,132,132,123,123,123,99,90,90,82,82,82,74,82,82,82,82,82,82,82,82,82,90,90,82,82,82,90,90,90,82,82,82,82,74,74,74,82,82,74,82,82,82,90,90,90,90,90,90,99,90,90,90,90,82,82,82,82,82,82,82,82,82,90,82,90,82,115,115,123,132,132,132,115,74,66,66,66,
74,66,66,66,66,66,74,74,74,74,74,74,74,74,82,82,74,82,82,82,74,82,82,82,82,90,82,90,99,74,82,82,82,82,82,82,82,90,90,90,90,99,99,99,99,90,90,90,90,82,90,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,90,90,123,99,66,57,57,132,140,132,132,132,123,90,90,132,115,115,107,107,107,107,99,99,99,90,90,90,90,90,82,82,115,99,99,90,74,99,82,74,74,74,82,82,82,82,90,90,90,99,99,107,107,99,99,99,99,99,99,82,82,82,90,90,99,99,107,99,99,90,90,90,90,82,82,82,74,74,66,74,74,74,74,82,90,107,107,99,90,90,82,74,74,82,82,82,74,74,74,74,82,74,82,82,90,90,107,123,132,132,115,99,90,90,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,82,90,90,90,90,90,90,90,90,82,82,82,82,74,74,74,82,82,82,90,90,90,90,90,99,99,90,90,90,90,82,82,74,82,82,74,74,82,82,90,90,82,82,99,115,123,132,132,132,123,90,74,74,74,
74,74,66,66,66,66,74,74,74,74,74,74,74,74,82,74,82,82,82,74,82,82,82,82,90,82,90,90,74,82,82,82,82,82,82,82,82,82,90,90,90,90,90,99,99,90,90,90,90,90,90,90,82,82,82,74,82,82,74,74,74,74,74,74,74,74,74,82,82,82,82,90,82,90,107,99,74,57,66,132,132,132,132,132,132,132,132,132,123,115,107,107,107,107,99,99,99,115,99,82,82,82,74,90,99,90,82,74,82,99,90,74,82,82,82,82,82,90,82,90,82,99,99,107,107,99,99,99,115,99,90,82,82,82,82,90,99,99,90,90,90,90,82,90,82,82,82,90,82,74,74,66,74,74,74,82,90,90,99,90,82,82,74,74,74,74,90,90,82,74,74,82,82,82,90,99,107,107,123,132,132,123,99,90,90,90,82,82,82,82,82,82,82,82,82,82,82,90,90,90,82,90,90,82,90,90,90,82,90,90,90,90,90,82,82,82,82,82,82,90,90,90,90,90,90,90,99,90,82,90,90,82,82,82,82,82,82,82,82,74,82,82,90,90,82,107,123,123,123,123,132,123,115,66,74,74,
74,82,82,74,66,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,82,82,82,82,82,82,74,82,82,82,74,82,74,82,82,82,82,90,90,90,90,90,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,74,74,74,74,74,74,82,82,82,82,82,82,82,99,107,99,99,66,57,115,140,132,132,132,132,132,132,132,123,115,107,107,107,99,107,115,123,123,107,90,74,74,82,82,82,82,74,66,82,99,82,82,74,82,82,82,82,90,90,90,90,90,99,107,99,99,99,99,99,90,107,99,82,82,82,82,90,99,90,90,82,90,82,82,82,74,82,74,82,82,74,74,66,74,82,82,90,90,82,82,82,74,74,74,74,74,82,82,74,74,74,74,74,82,99,107,107,123,123,132,132,115,99,90,90,82,82,82,82,82,82,82,82,90,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,90,90,90,99,90,99,99,99,99,90,90,90,82,82,82,82,90,82,82,82,74,82,82,82,82,99,99,99,132,123,123,123,123,123,107,90,66,74,
82,99,123,74,66,66,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,82,82,74,82,82,82,74,82,82,82,82,74,74,82,82,82,90,82,82,90,90,90,99,99,107,99,99,99,90,90,90,82,82,82,82,82,82,82,74,74,74,74,74,74,74,82,82,82,82,82,90,82,99,90,115,107,74,57,74,132,132,132,132,132,132,132,132,123,115,115,107,107,99,99,99,107,107,115,99,82,66,74,74,74,74,74,74,82,74,74,74,82,82,82,82,82,82,82,90,90,99,99,99,99,99,99,90,90,90,90,99,99,82,82,90,82,82,82,82,82,82,82,82,82,74,74,74,82,74,74,74,74,74,74,82,82,82,82,82,82,74,82,82,82,82,82,82,82,74,74,82,82,115,123,107,123,99,123,132,115,99,99,90,90,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,90,82,90,90,90,90,90,90,90,90,99,90,82,82,82,82,74,82,82,82,74,74,74,82,74,74,82,82,107,90,132,132,123,123,123,123,123,115,107,99,
99,82,82,74,66,66,74,74,66,74,66,74,74,74,74,74,74,74,74,74,82,82,82,82,74,82,74,74,82,74,82,74,74,74,74,82,82,90,82,90,90,99,99,99,99,90,99,99,99,99,90,90,90,82,82,82,82,82,82,74,74,74,74,82,74,82,74,82,82,82,82,82,82,107,82,115,132,90,74,57,115,132,132,132,132,132,132,132,123,123,82,74,66,66,66,66,74,66,66,74,66,74,74,74,74,74,66,82,82,74,74,82,90,82,82,82,82,82,90,90,99,99,90,99,90,90,90,90,82,90,90,90,82,99,82,90,82,82,82,74,82,82,82,74,82,74,74,74,82,82,90,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,90,107,107,107,115,132,115,132,115,99,99,99,90,90,90,82,82,82,82,82,82,82,82,90,90,90,90,90,90,99,90,99,99,90,90,90,90,90,90,90,90,90,82,82,90,90,82,82,82,90,90,90,90,90,90,90,82,90,82,82,82,74,74,99,99,82,82,74,74,74,74,82,82,90,90,123,123,123,123,132,132,123,115,115,115,
115,74,74,74,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,74,82,74,74,74,74,74,74,74,82,82,82,82,90,90,90,90,90,90,99,99,90,99,99,90,90,90,82,82,82,82,82,82,82,82,74,74,74,74,74,74,82,82,82,82,82,82,90,99,99,107,140,123,132,57,66,132,132,132,132,132,123,123,107,74,74,74,66,66,66,66,66,66,66,66,66,66,66,74,74,74,82,82,74,74,82,82,82,82,82,82,82,90,90,99,99,99,90,90,90,82,82,82,90,82,82,90,99,107,90,82,82,82,74,82,74,74,82,74,74,74,66,74,74,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,107,99,115,123,132,132,123,107,99,99,99,90,90,90,90,82,82,82,82,82,82,82,90,90,90,99,99,90,90,99,90,90,99,90,90,90,90,90,90,82,90,82,82,82,82,82,90,82,82,82,82,90,90,90,90,82,82,74,82,82,90,99,115,90,74,74,74,74,74,74,74,90,74,99,123,123,123,123,123,123,123,115,115,123,
132,82,74,74,74,74,74,74,66,66,74,74,74,74,74,74,74,74,74,74,74,82,82,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,82,90,90,90,90,90,90,99,99,99,99,90,90,82,82,82,82,82,82,82,74,74,82,74,82,82,82,82,82,82,82,82,90,90,99,123,107,140,115,132,66,57,123,132,132,132,123,107,82,74,66,66,66,66,66,57,57,66,66,57,66,66,66,66,66,66,74,74,74,74,82,82,82,82,82,82,90,90,90,99,99,115,99,90,90,82,82,82,90,90,82,82,82,82,90,90,90,82,74,74,74,82,74,74,74,74,74,74,66,74,82,90,99,82,82,82,82,82,82,82,90,82,90,90,82,82,82,82,82,82,82,74,82,90,99,115,132,132,132,132,115,107,99,99,90,90,90,90,82,82,82,82,82,90,90,90,90,90,99,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,82,90,107,115,107,82,74,74,74,74,74,74,74,74,82,90,123,123,123,123,115,115,115,123,132,140,
107,82,74,74,74,74,74,66,66,74,74,74,74,74,74,74,74,74,82,82,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,82,82,82,82,82,82,82,90,90,90,90,99,99,99,99,90,90,90,90,82,82,82,82,82,82,74,74,82,82,82,82,82,82,90,90,90,82,90,90,107,123,132,115,90,66,107,132,132,132,132,123,99,82,66,66,66,66,57,66,66,66,74,66,66,66,66,57,57,66,66,66,74,74,74,74,82,82,82,82,90,90,90,99,99,99,99,107,90,90,90,90,82,82,82,82,82,82,82,107,90,82,74,74,74,74,66,66,74,74,74,74,66,66,66,74,82,90,90,82,99,90,82,82,82,90,90,99,82,82,99,90,82,82,82,82,82,82,82,90,115,132,132,132,123,115,90,90,99,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,74,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,82,90,115,123,90,74,74,74,74,74,74,74,74,74,74,107,115,115,107,115,115,115,115,107,115,115,
90,82,74,74,74,74,74,66,66,66,74,74,74,74,74,74,74,82,82,74,74,74,74,74,74,74,74,74,74,74,66,74,74,74,82,74,82,82,82,82,82,82,90,90,90,99,99,99,99,99,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,82,90,99,107,82,132,107,66,66,132,132,132,132,132,123,99,82,66,57,57,57,66,66,66,66,74,66,66,66,66,66,66,66,66,66,74,74,74,74,82,82,82,90,82,90,90,99,99,99,99,90,90,90,90,82,82,82,82,82,74,74,90,99,74,74,74,82,82,74,74,66,74,74,74,66,66,66,66,74,82,90,99,99,99,107,107,99,115,99,107,99,99,123,123,99,90,82,82,82,74,74,82,82,99,123,115,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,90,99,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,82,82,82,82,82,74,74,74,82,99,107,99,82,82,74,74,74,74,66,74,74,82,82,99,115,66,66,115,115,107,107,107,99,90,
90,74,82,82,66,74,66,66,66,66,66,66,66,74,74,82,82,74,74,74,74,66,74,74,74,66,66,74,74,74,74,74,74,74,74,74,74,74,82,82,90,82,90,90,90,90,99,99,99,99,99,90,90,90,90,82,90,82,82,82,82,90,82,82,82,82,82,82,90,90,90,90,99,99,123,90,115,115,82,66,99,132,132,132,132,123,99,74,66,57,57,57,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,82,82,82,82,82,99,90,99,90,99,99,90,90,90,82,82,82,90,90,74,74,82,82,82,74,74,74,74,74,74,82,82,74,74,66,66,66,66,66,66,74,82,99,99,99,99,107,115,115,107,115,107,99,132,123,99,90,82,82,82,74,74,82,74,82,99,107,90,90,90,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,74,82,74,74,74,74,82,74,74,74,82,82,82,82,74,74,74,74,107,99,82,74,66,74,74,74,74,74,74,74,74,74,82,115,107,99,99,115,115,115,107,99,99,
107,107,107,90,90,74,74,74,66,66,66,66,74,74,74,82,74,82,74,74,74,74,74,74,74,74,66,66,74,74,66,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,90,82,90,90,90,90,90,99,99,123,99,123,148,107,74,57,99,132,132,132,123,99,74,66,66,66,66,66,66,66,74,74,74,74,74,74,66,66,66,66,74,74,74,74,82,74,82,82,82,90,90,90,99,90,90,90,90,90,82,90,99,90,82,74,82,90,90,82,74,74,74,74,74,74,74,74,82,82,74,74,66,66,66,66,74,74,74,90,107,107,107,107,115,115,115,115,107,99,99,99,90,90,82,82,82,74,74,74,74,74,82,90,82,90,90,90,82,90,90,90,90,90,90,90,90,90,90,99,90,90,99,99,90,90,90,90,90,90,82,82,90,82,82,82,82,82,82,82,82,82,74,82,74,82,74,74,74,74,74,74,74,82,74,74,74,82,90,90,82,82,82,74,74,74,74,66,74,74,74,74,74,107,140,123,90,123,115,115,115,107,99,
123,132,132,123,99,90,74,66,66,66,66,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,66,66,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,99,99,99,99,99,90,90,90,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,90,90,90,90,115,115,123,165,123,66,57,90,132,132,132,123,107,74,66,66,66,66,66,74,74,74,74,74,74,74,74,66,66,66,66,74,74,74,74,82,74,82,82,90,90,90,99,90,90,90,90,90,82,90,82,90,90,74,82,82,90,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,66,66,66,66,66,82,82,99,115,99,107,99,99,107,107,99,99,99,90,90,90,82,82,74,74,74,74,74,74,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,74,74,82,99,107,82,99,90,74,74,74,74,74,66,66,74,74,74,90,123,132,107,99,123,123,123,115,123,
132,132,132,123,115,107,90,82,74,66,66,74,66,90,74,74,74,74,74,74,74,74,66,66,74,74,66,66,66,66,74,74,74,74,74,74,74,74,82,82,82,82,90,90,82,90,90,99,99,90,90,90,90,90,90,82,82,82,90,82,82,82,82,82,82,90,90,90,90,99,90,90,90,90,115,99,132,156,148,82,66,74,132,140,132,123,99,82,66,66,66,66,66,66,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,82,82,90,90,90,99,90,90,82,90,90,82,82,82,82,90,90,82,74,82,74,82,90,82,74,74,74,74,74,74,74,74,74,74,66,66,66,66,66,66,74,82,82,99,107,107,107,99,99,99,107,107,107,99,90,82,82,74,74,74,66,74,74,74,74,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,99,90,99,99,99,90,90,90,82,82,82,82,82,82,82,82,82,82,74,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,90,90,99,99,90,74,74,74,74,74,74,74,74,74,82,82,115,123,140,90,132,132,132,132,132,
132,132,123,115,115,115,115,99,90,74,74,74,74,74,74,74,74,74,74,66,66,74,74,66,66,66,66,66,66,66,66,74,74,74,74,74,74,82,74,82,82,90,90,82,82,90,90,99,99,99,90,90,90,90,90,82,82,82,82,74,82,82,82,82,82,90,90,90,99,99,90,90,90,90,115,90,123,148,165,173,74,66,99,140,132,132,115,90,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,66,74,82,82,74,74,82,82,82,90,90,99,99,90,90,90,90,82,90,82,82,82,90,82,82,90,74,74,74,74,90,90,74,74,66,74,74,74,74,74,82,74,66,66,66,66,66,74,74,82,90,99,107,99,90,99,90,99,99,99,90,90,82,82,74,74,74,74,74,74,74,82,82,82,82,82,90,90,99,90,90,90,99,90,99,99,99,99,99,99,99,90,90,90,82,82,90,90,82,82,82,82,82,82,82,74,82,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,90,82,66,99,90,82,74,74,74,74,74,74,74,74,90,82,90,115,123,115,132,99,123,132,123,123,
107,107,99,107,107,107,99,90,82,74,74,74,82,74,74,74,74,74,74,74,74,74,66,66,66,66,66,74,66,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,99,99,99,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,90,90,90,99,99,90,90,90,90,107,99,115,156,181,181,115,74,132,140,132,132,132,107,74,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,90,90,90,99,99,99,99,90,90,90,82,82,82,82,90,115,123,99,82,74,74,74,82,90,90,74,74,66,74,66,74,74,90,90,82,82,74,66,66,74,74,74,82,99,99,107,90,90,90,99,99,99,90,82,82,74,74,74,74,74,74,74,74,74,82,82,82,90,82,90,90,99,99,99,99,99,90,99,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,74,82,82,74,74,74,74,74,74,74,74,74,74,66,74,74,74,74,74,74,74,99,99,107,99,82,74,74,74,82,74,74,74,74,74,74,74,90,107,115,123,107,123,90,90,107,99,
99,99,99,99,99,90,82,82,82,74,66,90,74,66,74,74,74,74,74,74,74,74,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,90,99,99,90,90,90,90,90,82,82,82,82,82,82,90,90,90,99,82,90,90,90,90,90,90,82,90,99,90,99,173,173,165,132,82,107,115,140,132,132,123,82,74,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,90,90,90,99,99,99,90,90,82,90,90,82,82,82,90,99,99,82,74,74,74,74,74,74,82,90,74,66,74,74,74,74,82,99,99,90,74,74,74,66,74,74,82,90,99,107,99,90,99,90,90,90,90,90,82,74,74,74,74,74,66,74,74,82,82,82,82,82,90,90,90,99,99,99,99,99,90,99,99,99,99,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,66,66,74,74,74,74,74,74,74,82,107,82,82,99,82,74,82,74,74,74,74,74,74,74,74,82,99,115,123,123,107,107,82,90,99,99,
99,99,90,90,90,82,82,82,82,74,99,74,66,66,74,74,74,74,74,74,74,74,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,99,99,99,90,90,90,90,82,82,82,74,82,82,90,90,99,90,90,90,90,90,82,90,90,90,90,90,90,99,99,165,165,148,66,57,57,74,140,132,132,132,107,74,66,66,66,66,74,74,74,74,74,74,74,66,74,74,74,74,74,82,82,82,82,82,82,90,90,99,99,99,90,90,99,90,90,90,82,82,82,82,82,74,74,74,74,74,74,74,74,82,99,74,74,74,74,74,74,90,99,99,82,74,74,74,74,82,82,82,90,99,99,99,99,99,90,90,90,82,82,74,74,74,66,66,66,74,74,82,82,82,82,82,82,90,99,99,99,99,99,90,90,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,82,74,82,74,74,74,74,74,74,74,74,74,74,74,66,66,66,66,66,66,66,66,74,74,74,90,132,132,132,123,82,74,74,74,82,74,74,74,74,74,74,82,99,123,123,132,132,132,99,82,99,99,
90,90,90,82,82,82,82,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,66,66,66,66,66,74,66,74,66,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,99,99,99,90,90,90,90,82,82,82,82,82,90,90,90,99,90,90,82,82,82,82,82,82,82,82,82,90,115,90,173,123,107,57,57,57,74,140,132,132,132,115,82,66,66,66,66,74,74,74,74,74,74,74,74,74,74,66,74,74,82,82,82,82,82,82,90,90,99,99,90,99,90,90,90,90,99,90,82,74,74,74,74,74,74,74,74,74,74,74,74,82,74,74,74,74,66,74,90,107,99,82,74,82,82,74,74,74,82,90,99,107,99,99,99,90,90,82,82,82,74,74,74,66,66,66,74,74,82,82,82,82,82,82,90,99,99,90,90,90,90,90,90,90,99,90,90,90,90,82,82,82,82,82,82,82,74,82,82,74,74,74,74,74,74,74,74,74,66,66,74,66,66,66,66,66,66,66,66,74,66,74,107,123,132,132,123,82,74,74,82,74,74,74,74,74,74,82,90,107,123,123,123,132,123,74,90,107,90,
90,90,82,74,74,74,82,82,82,90,74,74,74,74,82,82,74,74,74,74,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,74,74,82,82,82,74,82,82,90,90,90,99,99,90,90,90,82,82,82,82,82,82,90,90,90,90,90,90,90,90,82,82,90,82,82,82,82,82,115,74,173,132,74,57,57,57,66,99,123,140,132,123,99,74,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,99,99,99,90,90,90,99,99,107,82,82,74,74,74,74,74,66,66,66,74,74,74,82,74,74,74,74,74,66,74,90,107,99,82,82,82,82,74,66,74,74,82,90,99,99,99,99,90,99,82,82,82,74,74,66,66,66,74,74,74,82,82,82,82,82,82,90,90,107,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,74,74,74,82,74,74,74,74,74,74,74,74,74,74,66,66,66,66,66,66,66,66,66,66,66,66,74,90,115,132,132,132,132,82,74,74,82,74,74,74,74,74,74,99,99,99,123,123,123,132,115,74,99,99,90,
90,90,82,74,74,74,74,74,99,74,74,74,74,74,74,74,74,74,74,74,74,66,66,66,74,66,66,66,66,74,74,74,74,74,74,74,74,82,82,82,74,82,82,82,82,90,90,99,99,99,90,90,90,82,82,82,82,82,82,90,90,99,99,90,90,90,90,82,82,82,82,82,82,82,82,107,74,173,115,57,57,57,57,57,57,57,82,132,132,107,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,90,82,82,82,90,90,99,99,99,99,99,99,90,90,90,82,74,74,74,74,74,74,66,66,66,66,74,74,82,82,74,74,74,66,74,74,82,99,90,82,82,82,82,74,66,74,74,82,82,99,99,90,107,107,90,90,82,82,74,74,66,66,66,66,74,74,82,82,82,82,82,82,90,99,115,99,90,90,90,90,90,90,90,82,90,90,90,82,82,82,82,74,82,74,74,74,74,74,74,74,74,74,66,74,74,74,74,66,74,66,66,66,66,66,66,66,66,66,82,99,74,90,74,82,115,82,74,74,74,74,74,74,74,74,74,90,107,107,123,123,123,123,132,74,74,90,90,
90,90,74,74,74,74,74,82,90,74,66,74,66,74,82,74,66,66,66,74,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,82,82,82,90,82,82,82,82,90,90,99,99,99,99,90,90,82,82,82,90,82,82,90,99,99,99,99,90,90,82,82,90,82,82,82,82,82,82,99,74,173,156,82,57,57,57,66,57,57,57,115,132,115,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,90,82,82,82,82,82,90,90,99,99,90,90,90,90,99,90,90,90,74,74,74,66,66,74,74,74,74,74,66,66,74,74,74,74,74,74,66,66,82,99,90,82,82,82,82,82,66,66,74,74,82,90,99,90,99,107,107,99,82,82,74,74,66,66,66,74,74,74,82,82,82,82,82,82,90,99,115,99,90,90,90,90,90,90,90,82,90,90,82,82,82,82,82,82,74,74,74,74,82,82,82,82,74,74,66,66,74,74,66,66,66,66,66,66,66,66,66,66,66,82,99,57,57,66,74,90,74,99,74,74,74,82,74,74,74,66,74,99,107,107,123,123,115,115,115,74,107,123,107,
90,82,74,66,74,66,74,82,74,82,66,66,74,74,74,74,66,66,66,66,66,66,66,66,66,66,74,66,74,74,74,74,74,74,74,82,82,82,82,82,90,82,82,82,82,90,99,107,99,99,90,90,90,82,82,90,90,90,99,90,99,99,90,90,90,82,82,82,82,82,82,82,82,82,82,107,57,165,165,123,57,57,57,57,57,57,57,90,140,123,90,82,74,74,74,74,74,74,74,74,74,74,74,74,74,82,90,82,82,82,82,82,82,90,90,99,99,90,90,99,90,90,99,90,90,90,82,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,99,82,66,82,99,90,82,74,82,82,82,66,66,74,74,74,90,99,90,90,90,107,99,90,82,82,74,66,74,74,74,74,74,82,82,82,74,82,82,90,90,107,107,82,90,90,82,82,90,90,82,90,82,82,82,82,74,74,74,74,74,74,74,74,66,66,74,66,74,74,74,66,66,66,66,66,66,66,66,66,66,66,57,74,123,90,57,57,57,66,132,123,99,74,74,82,74,74,66,74,74,90,107,115,115,123,115,107,107,123,90,123,115,107,
82,82,66,66,66,66,74,74,74,82,74,74,66,74,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,82,82,82,90,82,90,82,82,82,90,90,107,99,99,99,90,90,90,90,90,90,90,90,90,99,99,90,90,82,90,82,82,82,90,90,82,82,82,82,82,107,74,156,173,148,57,57,57,57,57,57,57,99,140,132,99,82,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,99,99,99,90,90,82,90,90,90,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,123,123,90,74,90,82,74,74,82,82,90,66,66,66,74,74,82,99,90,90,90,90,99,90,82,82,82,74,74,74,74,74,82,82,82,82,82,82,82,90,90,99,99,99,82,82,82,82,82,90,82,82,82,82,82,82,82,74,74,74,82,74,74,74,74,66,66,66,74,74,74,66,66,66,66,66,66,66,66,57,57,66,90,115,132,74,57,57,57,57,74,148,115,74,74,74,74,82,74,66,82,99,107,115,115,107,107,107,107,99,115,123,107,99,
82,90,66,66,66,74,74,82,74,74,74,66,66,66,74,74,66,66,66,66,66,74,74,74,74,74,66,74,74,74,74,74,74,82,82,82,82,82,90,82,90,82,82,90,90,99,99,99,99,99,99,90,90,90,90,99,99,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,99,90,123,181,132,57,57,57,57,57,57,66,115,140,132,123,90,82,74,74,74,74,74,74,74,74,74,74,74,82,82,74,74,82,82,82,90,90,82,90,99,90,90,82,82,82,90,82,90,90,82,74,74,74,74,66,66,74,74,74,66,74,74,74,82,82,107,132,132,107,82,74,74,74,74,82,82,90,74,66,66,66,74,82,90,90,82,82,90,90,99,90,82,74,74,74,74,74,82,82,82,82,74,82,82,82,90,90,99,99,99,82,82,82,82,82,82,82,82,82,82,74,74,74,82,74,82,74,74,66,66,66,66,66,57,66,82,66,66,66,66,66,66,66,66,66,66,90,90,123,115,99,57,57,57,57,57,57,132,107,74,74,74,74,74,74,74,99,99,115,123,107,99,99,107,115,82,132,115,99,99,
82,99,66,66,66,66,82,74,74,74,74,74,66,66,74,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,74,74,82,90,82,90,90,90,99,82,82,82,90,90,82,90,99,90,90,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,90,90,82,82,82,82,82,107,107,165,115,66,57,57,57,57,57,74,115,90,115,132,99,82,74,74,74,74,74,74,74,74,74,74,82,82,82,90,90,82,82,90,90,90,90,90,90,99,90,90,90,82,82,90,90,99,82,82,74,74,74,74,74,66,74,74,74,74,74,74,82,90,123,115,132,123,107,74,74,82,82,82,90,90,74,66,66,66,74,82,99,99,90,82,82,74,82,99,90,82,74,74,74,74,74,82,82,82,82,82,82,82,82,90,99,99,99,82,82,82,82,82,82,82,82,82,74,74,74,74,82,82,74,74,66,66,66,74,82,74,107,99,74,99,74,74,74,74,74,66,74,82,107,115,132,115,107,82,57,57,57,57,57,57,74,99,82,74,74,74,74,74,74,90,107,115,123,99,99,123,107,115,115,123,107,99,107,
82,107,66,66,66,66,66,66,74,74,66,66,66,74,74,74,74,66,66,66,66,74,66,74,74,66,74,74,74,74,74,74,82,82,90,90,90,90,90,82,90,90,90,90,90,90,90,90,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,90,90,82,82,82,82,82,74,115,90,165,115,66,66,66,57,57,57,74,66,57,74,132,115,90,82,74,74,74,74,74,74,74,74,74,82,82,90,90,74,82,82,82,82,82,90,90,90,99,99,90,82,82,82,82,82,90,99,82,82,82,74,74,66,66,74,74,74,74,74,82,82,115,90,74,82,115,99,107,82,82,82,82,107,99,82,66,66,74,74,90,107,107,90,82,82,82,82,90,99,82,82,74,74,74,82,74,74,74,82,74,82,82,90,90,99,99,99,99,90,82,90,82,82,82,82,74,74,82,74,82,82,66,74,66,66,66,66,107,107,99,115,57,57,66,107,115,115,115,82,74,82,107,115,132,132,74,115,66,57,57,57,57,57,57,66,123,90,74,74,74,74,74,82,107,115,123,107,99,115,107,115,132,123,115,99,99,107,
99,107,66,66,66,66,74,66,66,66,74,66,66,66,74,74,66,66,74,74,66,66,74,66,74,74,74,74,74,74,82,74,74,82,90,90,90,90,82,99,82,90,90,90,90,90,90,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,82,90,90,82,82,90,99,99,107,90,82,82,107,99,165,107,74,107,57,57,57,57,66,66,57,57,107,123,107,90,90,82,82,82,82,74,82,74,82,82,82,90,107,82,74,82,82,82,90,90,90,90,90,90,90,90,82,82,82,82,82,99,99,90,74,74,74,74,74,66,74,74,74,74,82,90,123,82,123,99,140,82,74,90,82,82,82,107,107,99,66,66,74,74,90,115,115,90,82,82,82,82,90,99,90,82,74,74,74,74,74,74,74,82,82,82,82,90,90,99,99,90,99,90,90,99,90,82,82,74,82,74,74,82,74,82,82,66,66,66,74,74,107,107,99,123,66,57,57,57,57,57,115,123,115,107,115,123,140,115,57,82,57,57,57,57,57,57,57,66,140,74,82,74,74,74,82,99,107,123,115,99,107,107,107,115,123,107,107,99,99,99,
107,99,82,66,66,66,74,66,66,66,66,66,66,74,66,66,66,66,74,74,74,74,66,74,66,66,74,74,74,74,74,74,82,82,90,90,82,90,90,90,90,90,99,90,90,99,99,99,99,90,99,90,90,90,90,90,90,90,90,90,90,90,82,82,90,90,90,90,90,82,82,82,82,82,82,90,99,115,165,90,82,156,66,57,57,57,57,57,57,57,82,132,123,99,90,82,82,82,74,74,74,74,82,82,82,82,90,99,82,82,82,82,82,90,90,90,90,99,90,90,82,82,90,82,90,90,99,99,82,107,74,74,66,74,74,74,74,82,90,99,123,99,140,123,148,107,123,90,90,82,90,90,107,107,74,74,74,74,99,123,115,90,82,82,82,74,82,90,82,82,74,74,74,74,74,74,74,82,82,82,82,90,99,99,90,90,90,90,90,99,90,90,82,82,82,74,82,74,74,74,82,74,66,66,66,66,99,82,99,132,74,57,57,57,57,57,74,123,132,132,132,140,140,82,57,57,66,57,57,57,57,57,57,66,99,57,99,74,82,90,99,99,115,123,107,90,107,115,107,99,107,107,90,90,99,99,
107,90,90,66,66,66,66,66,66,74,66,66,66,66,66,66,66,74,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,90,90,90,90,90,90,90,99,90,90,90,99,99,99,99,107,99,90,90,90,90,82,90,82,90,90,90,90,90,90,90,90,90,82,82,90,82,82,82,82,82,82,82,132,173,90,74,107,74,57,57,57,57,57,57,57,57,132,123,99,90,82,82,82,82,82,82,82,90,82,82,82,90,90,82,82,82,82,82,82,82,90,90,99,99,90,90,82,82,82,82,90,82,90,82,90,74,74,74,74,74,74,82,90,90,123,132,82,156,165,173,165,181,156,90,90,90,90,107,107,74,74,74,82,99,115,107,90,90,90,82,74,82,82,90,90,82,74,74,74,74,74,74,74,82,82,90,90,99,99,90,90,90,99,90,99,107,90,82,74,74,82,99,115,99,107,90,66,66,74,66,66,74,74,74,115,74,57,57,57,57,57,57,74,74,115,132,123,90,57,57,57,57,57,57,57,57,57,57,57,66,82,90,74,74,82,82,99,115,123,107,99,123,115,90,90,107,99,82,82,90,99,
107,74,99,66,66,74,66,66,66,74,66,66,74,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,90,90,90,82,90,90,90,90,90,90,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,99,90,82,90,82,90,82,82,82,82,82,82,82,82,140,173,132,82,107,82,57,57,57,57,57,57,57,57,107,123,99,90,90,90,90,90,82,82,90,107,107,107,90,82,90,74,74,82,82,82,82,82,90,90,90,99,90,90,90,82,82,82,90,82,90,82,99,74,74,66,74,74,74,82,90,107,132,107,82,181,189,189,189,173,173,140,82,90,90,99,99,74,74,74,74,99,107,107,90,82,74,74,74,82,82,82,90,82,74,74,74,74,74,74,82,82,82,90,90,99,90,90,82,82,90,90,99,107,90,82,74,82,107,107,107,107,99,90,66,66,66,66,66,74,66,74,107,66,57,57,57,57,57,57,57,57,66,74,66,57,57,57,57,57,57,57,57,57,57,57,66,66,115,90,74,74,82,90,115,115,115,107,99,115,107,82,90,107,90,90,82,90,99,
107,90,99,66,66,66,66,66,66,66,74,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,90,82,82,82,82,90,90,90,82,82,82,90,90,90,90,90,90,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,123,165,148,115,66,90,57,57,57,57,57,57,57,57,82,123,107,90,90,90,90,90,82,90,107,123,115,115,90,90,90,74,74,82,74,74,82,82,82,90,99,99,90,90,82,82,82,82,74,74,90,82,90,82,74,74,74,74,74,82,99,107,132,90,132,173,181,181,181,181,181,173,107,90,90,99,107,74,74,74,74,99,107,107,99,74,74,74,74,82,82,82,90,90,82,74,74,74,74,74,82,82,82,82,99,99,90,90,82,82,82,90,99,115,99,90,99,115,115,99,107,99,90,82,74,74,66,74,66,66,74,74,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,140,107,74,74,90,82,107,115,115,115,90,99,99,90,90,115,99,82,82,82,107,
107,99,99,66,74,66,66,66,66,66,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,90,90,82,82,82,82,82,82,82,82,82,132,165,173,90,57,74,57,57,57,57,57,57,57,57,57,107,132,107,90,90,90,90,90,82,107,123,115,90,90,90,82,74,74,74,74,74,82,82,82,90,90,99,90,90,82,82,82,74,74,82,82,107,90,99,74,66,66,74,74,82,99,123,132,99,173,173,173,181,189,181,173,165,132,107,107,99,107,82,74,74,74,90,99,107,99,82,74,74,74,82,82,74,82,90,82,74,74,74,82,82,82,82,82,90,99,90,90,90,82,82,82,82,90,107,115,107,107,107,107,99,99,99,82,82,74,74,66,66,66,66,74,66,107,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,132,99,90,74,82,99,107,115,115,107,99,99,99,99,107,107,99,82,82,82,99,
107,107,99,74,66,66,66,66,66,66,74,74,66,66,66,74,74,74,74,74,74,82,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,99,99,99,99,99,99,90,99,90,90,90,90,90,90,90,90,90,90,90,82,82,90,82,82,82,82,82,82,82,82,82,140,165,165,123,66,57,57,57,57,57,57,57,57,66,82,115,132,107,99,90,82,82,82,82,90,99,107,90,82,90,90,74,74,66,74,74,82,82,82,90,90,99,90,82,82,82,82,82,74,74,82,82,99,82,74,66,66,74,74,90,99,123,132,99,148,156,173,181,189,181,181,173,156,99,107,99,107,74,74,74,74,90,99,107,99,90,82,74,74,74,74,74,74,82,82,74,74,74,74,82,82,82,82,90,90,90,82,82,82,82,82,82,90,115,99,99,90,99,99,99,90,99,82,74,74,74,66,66,66,66,66,90,107,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,99,82,99,74,74,107,107,115,115,99,90,90,115,99,99,99,90,82,82,90,99,
107,115,90,82,74,66,74,66,66,66,66,66,74,66,74,74,74,74,74,74,74,74,74,82,82,74,82,82,90,82,82,82,82,82,82,90,82,82,90,90,90,90,90,90,90,90,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,99,90,90,90,90,82,82,82,82,90,82,82,82,74,132,165,156,156,99,57,57,57,57,57,57,57,57,74,123,140,115,123,99,90,82,82,82,82,82,82,82,99,107,107,82,74,74,74,74,74,74,82,82,82,90,90,90,90,82,82,82,82,74,74,82,82,90,82,66,74,74,74,74,82,99,132,90,82,123,132,173,181,181,181,181,181,173,82,107,107,107,82,74,74,74,82,99,99,99,99,74,74,74,74,74,66,74,82,82,90,82,82,74,82,82,82,90,90,90,90,90,82,82,82,82,90,90,90,90,82,82,99,107,90,99,107,82,74,74,74,74,66,66,66,66,115,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,99,82,74,90,99,115,115,107,90,99,115,90,99,99,99,82,82,82,90,
115,115,82,90,82,74,74,66,66,66,66,74,74,74,74,74,66,74,74,74,74,82,74,82,82,90,99,90,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,82,90,82,82,82,82,82,82,82,82,74,99,173,165,156,90,57,57,57,57,57,57,57,57,74,123,156,107,132,99,90,90,90,90,82,82,74,82,90,82,82,74,74,74,74,74,74,74,82,82,82,90,99,90,90,82,82,82,82,74,74,74,74,82,90,66,74,66,74,74,82,99,123,90,123,165,140,181,181,181,181,181,181,181,90,107,107,107,82,74,74,74,74,99,107,99,107,74,66,66,66,74,74,66,74,82,82,90,82,82,82,82,90,90,90,90,82,82,82,82,82,74,82,82,90,82,74,82,82,90,82,99,99,74,74,82,74,66,66,66,66,74,132,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,115,82,74,99,90,115,115,107,90,90,99,99,99,99,90,82,82,90,99,
107,107,90,90,74,74,74,66,66,66,66,66,66,74,74,74,74,74,66,74,82,82,82,82,99,107,99,90,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,99,99,99,99,99,107,99,99,99,90,99,99,90,90,90,90,90,90,90,90,99,90,82,90,82,82,82,90,90,82,82,82,99,173,156,165,90,57,57,57,57,57,57,57,57,74,148,115,107,123,107,99,99,90,90,82,74,82,82,74,74,74,66,74,74,74,74,74,82,82,82,90,90,99,90,90,82,82,82,82,74,74,74,74,74,99,74,74,74,74,74,82,107,115,132,156,173,148,173,189,181,181,181,181,181,90,99,115,115,90,74,74,74,82,99,115,115,90,74,66,66,66,74,66,66,66,74,82,90,90,82,82,82,90,99,99,90,90,82,82,82,82,74,82,90,99,74,74,74,82,82,82,82,82,74,74,74,74,74,66,66,57,99,123,57,57,57,57,66,66,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,107,82,82,99,90,107,115,107,90,99,99,90,99,99,90,82,82,82,90,
107,107,99,82,74,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,82,74,82,99,99,90,90,82,82,82,82,82,82,82,90,90,90,82,90,82,90,90,90,90,90,99,107,99,99,99,99,99,107,99,99,90,90,90,90,90,90,90,90,90,90,90,90,82,82,90,82,90,90,90,82,82,82,99,173,165,165,148,57,57,57,57,57,57,57,66,115,173,140,107,132,115,99,99,99,90,82,82,74,82,82,74,74,74,74,74,74,74,74,74,82,82,82,90,99,90,82,82,82,82,82,74,74,74,74,74,99,107,74,74,74,74,82,115,107,148,173,181,165,173,189,181,181,173,181,181,90,107,123,115,90,74,82,82,82,99,107,107,74,66,66,66,66,66,66,66,66,74,82,82,82,90,90,90,90,99,90,90,82,90,82,82,82,74,82,90,99,74,74,74,74,74,74,74,82,66,74,74,74,66,66,66,82,115,115,66,57,57,66,74,66,57,57,57,57,74,90,90,66,57,57,57,57,57,57,57,57,57,57,57,57,57,74,99,74,82,90,107,115,115,107,90,99,107,90,82,90,82,74,74,82,90,
115,107,107,82,74,66,66,74,66,66,66,66,66,74,74,74,74,74,74,74,82,82,74,107,82,82,82,82,82,82,82,82,82,82,90,90,82,90,90,90,90,90,99,99,99,107,99,99,99,99,90,90,90,90,99,99,107,90,90,99,99,90,90,82,90,90,99,99,99,82,82,82,90,90,82,82,82,99,165,165,165,165,57,66,57,57,57,57,57,57,90,156,156,115,132,123,107,107,99,90,82,82,82,82,74,74,74,74,74,74,74,74,82,82,82,82,90,90,90,90,82,82,82,74,74,74,74,74,74,66,82,99,99,74,74,74,82,115,107,165,181,189,181,181,189,189,181,189,181,181,82,99,123,115,99,82,82,82,82,107,115,99,74,74,66,66,66,66,66,66,66,74,74,74,74,82,90,90,90,99,90,82,82,82,82,82,82,82,74,90,107,74,74,74,74,74,74,66,82,99,74,66,74,74,66,66,90,123,123,66,57,57,66,74,66,57,57,57,57,90,107,82,66,57,57,57,57,57,57,57,57,57,57,66,49,49,74,107,74,74,90,99,115,115,107,90,99,107,99,90,82,74,74,82,82,99,
115,115,115,90,74,66,66,66,66,66,66,66,66,74,74,74,74,74,82,74,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,99,107,99,99,90,90,99,107,90,99,90,90,82,99,82,82,82,82,90,82,90,99,173,165,165,165,74,57,57,57,57,57,57,66,99,140,148,90,132,132,115,107,99,90,82,82,82,82,74,74,66,66,66,74,74,74,74,74,82,82,82,90,99,90,82,82,74,74,74,74,74,74,66,74,74,90,115,82,74,82,90,115,107,173,181,181,189,189,189,181,181,181,181,173,66,66,99,115,99,90,82,82,82,66,57,90,82,74,74,74,74,74,74,66,66,74,74,74,82,82,82,90,90,90,90,82,82,82,82,82,82,74,74,82,107,74,74,74,74,74,66,66,66,90,74,66,74,74,74,90,90,123,115,57,57,57,74,82,66,57,57,57,57,90,74,57,57,57,57,57,57,57,57,57,57,57,74,82,57,57,99,107,82,82,99,115,115,115,107,90,99,115,107,90,82,74,74,74,82,99,
115,115,115,107,66,66,66,66,66,66,66,74,74,74,74,74,74,82,74,74,74,74,82,90,90,74,82,82,82,82,82,82,82,82,90,90,90,90,99,107,99,90,90,90,99,99,90,90,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,99,90,82,82,82,82,74,82,90,82,107,181,173,165,148,90,57,57,57,57,57,57,57,74,99,148,107,90,132,132,107,99,99,90,82,82,82,74,74,66,66,66,66,74,74,74,82,82,82,82,90,99,90,82,82,74,74,74,66,74,74,66,66,74,90,115,82,74,82,90,123,90,165,181,181,189,189,189,189,173,173,173,132,57,57,57,107,90,90,90,90,90,66,66,107,82,74,74,74,74,74,74,74,74,74,74,74,82,82,90,99,90,90,82,82,82,82,82,82,82,82,74,82,99,74,74,74,74,66,66,66,66,74,74,66,66,74,90,90,99,123,107,57,57,57,74,82,57,57,57,57,57,57,66,90,82,57,57,57,57,57,57,57,57,57,57,57,57,66,132,82,74,99,99,107,115,115,99,90,107,115,107,90,82,82,74,74,82,99,
115,107,115,107,74,66,66,66,66,66,66,74,74,74,82,74,74,74,82,74,74,82,74,99,82,74,74,74,82,82,82,82,82,90,90,90,99,90,90,99,90,90,99,90,99,99,99,90,99,90,82,90,90,90,90,90,82,90,82,82,90,90,90,82,82,82,90,90,90,82,82,82,74,82,82,82,82,99,165,173,165,156,66,57,57,57,57,57,57,57,57,82,90,99,115,115,132,132,123,99,90,82,82,82,74,74,66,66,66,66,66,66,66,74,82,82,82,90,99,90,82,74,74,74,74,74,66,66,66,66,74,99,107,74,74,82,99,123,90,173,181,181,189,189,189,189,181,156,181,115,57,66,66,107,99,99,90,90,90,57,115,107,90,82,74,74,74,74,74,74,74,74,82,74,82,82,90,90,90,90,82,82,82,82,82,82,82,82,74,90,90,74,66,74,66,66,66,66,66,66,74,66,66,66,99,99,82,115,115,57,57,57,82,74,66,57,57,57,57,57,74,115,115,90,57,57,57,57,57,57,57,57,57,57,57,99,132,107,90,107,99,107,115,115,99,90,99,115,107,90,90,82,74,74,82,99,
115,107,115,90,90,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,82,82,74,74,74,74,74,82,82,90,82,90,90,99,99,90,90,90,90,90,90,90,90,90,99,90,90,90,90,90,90,82,82,82,90,82,82,82,82,90,90,82,82,82,82,82,90,82,99,82,74,74,82,74,90,82,99,173,156,165,165,74,57,57,57,57,57,66,57,57,57,66,90,115,148,107,90,123,99,90,82,82,82,74,74,66,66,66,66,66,74,74,74,74,82,82,82,99,90,82,74,82,74,74,66,74,74,66,74,74,99,107,82,82,82,107,132,90,173,181,181,189,189,189,189,181,156,140,115,57,57,57,107,99,99,90,90,90,74,140,90,99,82,74,74,82,82,74,74,74,74,82,82,82,82,90,99,90,82,82,82,82,74,82,82,82,82,74,82,90,74,74,74,66,66,66,66,66,74,74,74,66,66,82,90,74,99,123,57,57,82,107,57,57,57,57,57,57,57,66,74,90,90,57,57,57,57,57,57,57,57,57,57,57,123,132,123,107,107,107,107,115,107,107,90,107,115,107,74,66,74,82,82,82,90,
115,107,115,99,99,66,66,66,66,66,66,74,74,74,74,74,74,74,82,82,90,74,74,74,82,82,82,82,82,90,82,82,99,90,90,90,90,82,90,90,90,90,90,90,90,90,99,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,99,99,90,74,74,74,74,82,90,99,173,165,165,165,115,66,57,57,57,57,66,57,57,57,66,82,115,173,132,107,99,123,99,90,82,74,74,74,66,66,66,66,74,74,66,74,74,74,82,90,90,90,82,82,74,74,74,74,66,66,66,66,74,90,107,90,82,90,107,132,99,181,173,181,181,189,189,181,189,165,99,66,57,57,57,107,99,90,99,99,99,74,132,115,99,74,74,74,82,82,74,74,74,82,82,82,82,90,90,99,90,82,82,82,82,74,74,74,74,74,74,82,90,74,74,74,66,66,66,66,66,66,74,74,99,74,99,82,74,74,115,82,57,82,74,57,57,57,57,57,57,57,57,90,82,66,57,57,57,57,57,57,57,57,57,57,90,132,132,123,99,107,99,107,115,107,99,82,107,107,90,90,107,90,74,82,82,90,
107,107,107,115,107,66,66,66,66,66,66,74,74,82,74,82,74,82,82,74,82,74,74,74,82,82,82,82,90,99,90,115,90,90,90,90,82,82,90,82,90,90,90,90,90,90,99,90,90,90,90,82,90,82,82,82,82,82,90,82,82,82,82,82,82,82,82,82,90,107,90,74,74,74,74,82,82,90,165,165,165,165,148,57,57,57,57,57,57,57,57,57,57,74,123,156,173,90,66,123,99,82,82,74,74,74,74,66,66,66,66,66,74,74,74,82,82,82,90,99,90,82,74,74,74,66,66,66,66,66,74,74,90,90,82,90,115,115,115,181,181,181,181,181,181,173,181,173,132,82,57,57,57,123,99,99,99,99,107,57,90,140,82,74,74,74,82,82,82,82,82,82,82,82,90,90,99,99,90,82,82,82,82,74,74,74,74,74,74,82,90,74,74,74,74,66,74,66,66,66,66,90,99,74,82,74,74,66,115,123,66,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,123,132,132,123,99,123,107,115,107,115,82,82,115,123,82,107,90,99,107,82,82,90,
115,115,107,123,107,66,66,66,66,66,74,74,74,74,82,74,82,82,74,82,82,74,74,74,82,82,82,74,82,90,99,90,82,90,90,90,82,82,82,82,90,90,90,90,90,90,99,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,99,99,82,74,74,74,74,82,90,156,165,165,165,165,66,57,57,66,66,57,57,57,57,57,74,140,156,173,115,90,115,99,90,82,99,82,82,66,74,66,66,66,66,66,66,74,82,82,82,82,90,90,82,82,74,74,66,66,66,66,66,74,90,82,99,90,99,115,99,132,181,189,181,189,181,181,165,165,181,173,132,74,66,66,123,99,99,99,99,115,74,99,165,82,82,74,74,82,123,74,74,82,82,82,90,90,99,99,90,90,82,74,82,74,74,74,74,66,74,74,82,99,74,74,74,74,66,66,66,66,66,66,74,74,66,74,74,66,99,115,132,115,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,140,132,132,115,99,107,123,115,123,107,82,115,107,99,90,107,99,99,90,99,90,90,
107,107,107,123,90,82,66,66,74,74,74,74,74,74,74,82,82,74,74,82,82,82,82,82,82,82,82,82,90,90,90,82,82,82,90,90,82,82,90,82,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,99,82,74,74,74,74,82,90,156,165,156,165,173,74,57,57,57,57,57,66,57,57,57,74,148,148,156,115,115,99,107,107,107,90,82,82,74,82,66,66,66,74,74,74,74,82,82,82,90,99,90,82,82,74,74,74,66,66,66,66,66,74,82,90,115,115,123,107,165,181,181,189,189,181,173,173,165,189,181,173,140,99,74,123,107,99,99,99,107,99,99,173,90,82,74,74,74,82,90,82,82,82,82,90,99,99,99,99,90,82,82,82,74,74,74,74,74,74,74,82,99,74,82,74,66,66,66,66,57,66,66,66,66,66,66,66,82,115,123,123,132,132,107,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,99,66,57,107,132,132,123,99,90,107,123,107,123,90,107,107,115,74,107,90,90,99,90,99,90,90,
107,107,107,115,90,90,66,66,74,74,74,74,74,74,74,90,74,74,74,74,82,82,90,82,82,82,82,82,99,90,82,82,90,99,90,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,99,90,74,74,74,74,90,90,165,165,165,165,173,66,57,57,57,57,57,74,74,57,66,115,165,132,132,107,74,82,132,99,82,82,82,82,74,74,66,66,66,74,66,66,74,74,82,82,90,99,90,82,74,74,74,74,74,66,66,66,66,66,66,74,99,123,123,115,181,189,181,189,189,181,173,173,181,181,189,181,165,115,57,115,115,107,99,99,107,90,99,181,107,82,74,74,82,82,90,99,74,90,115,115,99,99,99,90,90,82,82,74,74,74,74,74,74,74,74,82,107,74,74,74,74,74,66,66,66,66,57,66,66,66,66,74,90,115,123,115,132,132,140,132,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,107,66,90,132,132,132,123,99,90,99,123,115,99,82,123,107,90,74,115,99,99,99,90,90,90,99,
115,115,107,107,99,90,74,90,74,74,66,66,74,74,82,82,74,74,74,82,90,82,82,82,82,82,74,90,82,90,90,107,99,90,82,82,82,82,90,90,90,90,90,90,90,90,99,99,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,74,74,74,74,99,156,165,165,173,156,66,57,57,57,57,66,57,99,74,74,107,156,123,115,123,57,74,140,90,82,82,82,82,74,74,66,66,66,66,66,74,74,82,90,90,90,99,90,82,82,82,74,74,74,74,66,66,66,66,66,66,74,99,107,140,189,189,189,189,189,189,181,181,173,181,181,181,173,115,66,74,123,107,99,107,107,82,132,189,123,90,74,74,74,82,99,115,99,82,90,99,99,99,90,90,82,82,74,74,74,74,74,74,66,74,74,82,99,74,66,74,74,66,66,66,57,66,66,66,66,66,66,74,82,99,115,115,123,132,132,132,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,74,132,132,123,123,115,99,99,107,107,107,90,99,107,99,82,90,107,99,90,99,99,99,107,90,
115,115,107,107,115,82,74,82,74,66,74,90,82,74,74,82,82,74,90,90,82,90,90,82,82,82,90,99,90,90,107,90,90,82,82,82,82,82,90,90,90,90,90,90,90,90,90,99,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,90,82,82,82,90,74,107,148,165,165,165,156,57,57,66,66,57,57,57,115,107,74,107,123,107,123,140,74,57,132,115,90,82,82,82,74,74,66,66,66,66,74,74,82,82,90,90,90,99,90,90,82,74,74,74,74,66,66,66,66,66,66,74,74,90,107,173,181,189,189,189,189,189,173,173,156,132,156,181,189,132,57,57,99,99,99,107,115,74,107,165,140,90,74,74,74,74,82,99,90,82,90,90,99,99,99,82,82,82,82,74,74,74,74,66,66,66,66,74,107,74,66,66,74,66,66,66,66,66,66,57,66,66,66,66,74,74,107,115,123,123,132,132,123,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,99,132,115,115,107,107,99,107,99,90,82,99,107,99,82,74,90,115,99,90,99,99,99,74,107,
123,107,107,107,123,90,74,74,66,74,66,66,74,74,74,74,74,74,74,82,82,107,90,82,90,82,107,99,90,107,99,90,82,82,82,82,82,82,90,90,90,90,90,90,90,99,99,99,90,90,90,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,74,74,82,82,90,90,82,82,74,99,140,156,156,173,148,82,57,57,57,57,57,57,82,107,123,90,132,123,90,123,123,90,57,123,99,90,82,82,74,74,74,66,66,66,66,74,74,82,90,90,90,99,90,90,90,82,82,74,74,74,66,66,66,66,66,66,74,82,99,99,173,181,189,189,189,189,189,181,173,181,115,132,181,173,107,57,57,66,90,99,107,115,82,66,99,140,99,74,74,74,74,82,99,115,90,90,90,90,90,90,82,74,82,74,74,74,74,74,66,74,66,74,82,107,74,66,66,74,66,66,66,66,66,57,57,66,57,66,66,66,74,99,99,107,107,132,132,123,74,57,57,66,57,57,57,57,57,57,57,66,132,66,57,57,99,123,123,132,132,115,107,107,99,90,82,82,90,90,82,74,107,107,99,99,99,99,107,115,107,
132,107,107,107,115,90,74,74,74,66,66,66,74,74,74,74,74,82,90,90,107,90,82,82,107,123,115,99,99,107,90,82,82,82,82,82,82,90,82,90,90,90,90,90,90,90,90,99,90,90,90,90,90,82,82,90,82,82,82,82,82,82,82,82,82,82,82,74,74,74,74,82,99,90,74,74,132,156,173,165,181,74,57,57,66,57,57,57,57,66,82,82,115,156,140,82,115,123,74,66,99,99,82,82,82,74,74,74,66,66,66,74,74,74,82,90,90,99,90,90,90,82,82,82,74,74,74,74,66,66,66,66,66,74,82,99,90,165,181,189,181,181,189,189,181,181,189,156,107,156,123,66,57,66,49,57,99,107,115,99,57,66,156,107,82,74,74,74,82,90,132,90,90,90,90,90,90,82,82,74,74,74,74,74,74,66,66,66,66,74,107,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,99,115,99,90,123,132,132,107,66,57,57,57,57,57,57,57,57,57,115,132,90,57,57,115,115,123,123,123,115,99,99,99,99,82,74,82,82,66,74,107,99,90,99,99,99,107,132,107,
123,107,107,107,123,90,74,74,74,66,66,66,74,74,74,74,74,82,82,82,90,82,82,115,123,115,115,115,115,90,82,82,82,82,82,90,82,90,90,90,90,90,90,90,90,90,99,99,90,90,90,90,90,82,82,90,90,90,82,90,82,82,82,82,82,82,82,74,74,74,74,74,90,99,66,123,148,165,156,181,156,66,57,57,57,66,57,66,66,74,57,66,107,165,148,82,90,123,123,66,115,90,82,82,74,74,74,74,66,66,74,74,74,82,82,82,90,90,90,90,82,82,82,90,82,74,74,74,66,66,66,66,66,74,82,90,90,123,181,181,181,181,189,189,181,181,189,181,123,74,66,57,82,107,82,49,82,107,99,132,99,57,115,99,82,74,82,74,82,90,132,107,90,90,90,90,90,82,74,74,74,74,74,74,74,74,66,66,66,66,99,74,66,74,66,66,66,66,66,66,66,66,66,57,66,66,66,74,99,66,66,66,99,123,132,132,90,57,57,57,57,57,57,57,66,107,140,140,99,57,57,107,115,123,123,123,107,90,82,99,90,90,74,74,74,82,82,115,99,90,90,99,99,99,107,123,
99,107,107,115,115,90,74,66,66,66,66,66,66,74,74,74,74,82,90,74,82,82,99,132,115,99,90,115,107,82,82,82,82,82,82,82,82,90,90,82,82,90,90,90,90,90,99,99,90,90,90,90,82,82,82,90,90,90,90,90,90,82,82,82,82,82,74,74,74,74,74,74,90,90,99,156,165,165,156,156,107,57,57,57,57,57,57,57,74,90,66,57,82,140,132,115,90,115,132,66,107,82,82,82,74,74,74,66,66,66,66,74,74,74,82,82,90,90,99,99,90,90,82,82,74,74,74,66,66,66,66,66,66,74,82,99,99,132,181,181,181,181,181,189,189,189,181,181,165,99,140,90,140,107,123,66,66,107,99,99,115,99,107,107,90,74,74,82,82,82,107,123,90,90,90,99,90,90,82,74,74,74,74,74,74,74,74,74,74,99,107,74,66,66,66,66,66,66,66,57,57,57,66,57,57,66,66,74,66,66,57,66,90,115,132,140,123,66,57,74,57,57,57,57,90,140,132,132,107,57,57,107,115,123,123,115,82,74,90,90,90,90,74,74,90,82,99,99,90,90,90,90,90,99,99,107,
107,115,115,107,74,66,90,82,74,66,66,66,74,74,74,74,74,74,74,74,82,82,115,115,115,99,90,99,99,90,82,82,82,82,82,82,82,90,82,90,90,90,90,90,90,90,90,99,99,90,90,90,90,82,82,82,90,90,90,90,90,90,82,82,82,82,74,74,74,74,74,82,82,90,115,165,173,156,181,148,57,57,57,57,66,66,90,57,57,74,74,57,66,99,107,123,74,90,82,74,99,82,82,74,82,74,74,66,66,66,66,66,74,74,74,82,82,90,99,99,99,90,82,82,82,74,74,66,66,66,66,66,66,74,82,90,99,140,181,181,181,181,181,189,189,189,181,181,173,107,165,156,140,115,82,66,66,107,90,90,99,123,123,107,90,74,82,82,82,82,107,115,82,90,99,99,90,82,82,74,74,74,74,74,74,74,74,74,82,115,107,74,74,66,66,74,74,74,66,57,66,66,57,66,66,74,66,74,90,74,66,66,74,107,132,132,132,82,66,123,57,57,57,57,99,132,132,132,107,57,90,123,115,123,99,82,74,74,90,82,99,90,90,74,82,82,107,99,90,90,90,99,99,99,99,107,
107,115,107,74,74,115,99,90,74,66,66,66,82,74,74,74,74,74,74,74,82,107,82,82,82,90,82,90,90,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,99,99,99,90,90,90,90,82,82,82,90,90,90,90,90,82,82,90,82,82,82,74,74,74,74,74,74,99,148,165,165,173,156,99,57,57,57,57,57,66,74,57,57,66,57,57,57,66,99,123,82,99,90,66,90,82,82,74,74,74,74,74,74,74,74,74,74,74,82,82,90,90,99,90,90,90,90,82,82,74,74,66,66,66,66,66,66,74,82,90,107,123,181,181,181,181,181,181,181,189,181,181,181,148,132,189,107,123,107,57,66,107,90,90,90,107,107,99,90,74,82,82,82,82,99,115,90,90,90,90,90,82,82,74,74,66,66,74,74,74,74,74,74,90,99,82,66,66,66,66,74,74,66,66,74,66,57,66,57,82,57,66,74,66,66,66,74,99,115,132,132,132,123,132,74,57,57,57,82,132,132,132,99,57,123,99,115,90,74,74,74,74,90,90,90,99,90,90,99,115,90,107,90,99,99,90,90,99,107,115,
107,90,99,90,90,99,74,74,74,66,66,74,99,90,74,74,74,74,74,74,74,82,82,74,74,82,82,82,82,82,82,82,82,82,90,90,90,82,82,90,90,90,90,90,90,99,99,99,99,99,90,90,90,82,82,82,82,82,82,90,90,90,90,82,82,82,82,74,74,74,74,74,74,115,165,173,181,156,74,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,74,123,99,90,132,82,74,90,82,82,74,74,66,66,66,66,66,66,66,74,82,82,90,99,90,90,90,90,90,90,82,74,66,66,66,66,66,66,66,74,82,90,99,107,181,173,181,181,181,189,181,181,181,181,181,181,115,181,115,148,74,57,66,107,90,90,90,99,107,90,82,82,74,82,82,82,90,107,90,90,99,90,90,90,82,74,74,74,66,66,74,74,74,82,74,74,90,74,74,66,66,66,90,74,66,66,82,74,66,66,82,90,57,66,66,66,66,66,66,107,115,132,132,132,132,132,107,57,57,57,66,132,132,140,107,57,107,99,99,74,74,74,74,82,107,107,82,99,90,82,99,115,107,99,90,90,90,107,99,99,99,90,
107,115,99,90,90,74,74,74,66,74,66,82,107,90,74,74,74,74,74,74,82,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,99,90,90,99,99,90,90,90,90,82,82,82,82,82,90,90,90,82,82,82,82,82,82,74,74,74,74,90,132,173,156,156,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,115,99,90,123,57,57,90,82,82,82,82,66,66,66,66,74,74,74,74,74,82,90,99,90,82,82,82,82,90,90,74,74,66,66,66,66,66,66,74,82,90,107,115,181,181,181,181,181,189,181,181,181,181,181,189,140,173,99,132,66,57,66,107,90,107,107,107,132,107,82,74,74,82,82,82,90,107,82,90,90,99,90,82,82,74,74,74,66,66,74,74,74,74,74,74,82,82,66,66,66,82,82,74,66,66,90,74,66,66,74,82,82,90,82,66,66,66,66,99,107,123,132,132,132,132,123,90,66,66,82,123,132,132,115,74,107,90,90,82,74,74,74,82,107,107,99,90,99,82,82,82,99,99,90,90,107,90,99,99,90,99,
107,107,82,82,82,74,74,74,66,66,74,90,99,99,74,74,74,74,66,74,74,74,74,74,74,74,74,82,82,90,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,99,99,90,90,90,82,82,82,82,82,82,90,90,90,82,82,82,82,82,82,74,74,74,66,115,140,173,123,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,123,74,99,132,74,57,90,82,82,82,74,66,66,66,66,66,74,74,74,82,82,82,90,90,90,82,82,82,82,82,74,74,66,66,66,66,66,66,74,82,90,99,115,173,181,181,181,181,189,189,181,181,189,181,181,181,181,107,99,66,57,82,107,107,99,90,90,107,99,82,74,74,82,82,82,90,123,99,82,90,90,90,90,90,74,74,66,66,66,66,74,74,74,66,74,82,82,74,66,66,74,90,74,66,74,82,74,74,66,74,74,90,90,82,82,74,74,82,82,99,132,132,132,132,132,107,107,99,132,132,132,132,132,132,82,115,99,90,90,82,74,82,107,90,107,99,90,107,99,90,74,107,99,90,99,99,107,99,107,107,99,
107,90,99,82,74,74,74,74,66,66,90,90,107,90,74,74,66,66,66,74,82,74,74,74,74,74,74,82,82,82,90,90,82,82,82,82,82,90,90,90,90,90,90,82,90,90,90,90,99,99,90,90,90,82,82,82,82,82,82,82,90,90,82,82,82,82,82,82,82,74,82,74,115,156,148,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,107,66,66,99,74,57,74,90,74,74,74,66,66,66,66,66,66,74,74,74,82,90,90,99,90,82,82,82,82,74,74,74,82,66,66,66,66,74,74,74,82,99,107,165,181,189,181,181,189,181,181,181,181,181,181,181,181,132,148,99,57,74,115,99,90,90,82,90,99,74,74,74,82,74,82,99,132,115,90,90,90,90,90,90,82,74,66,66,66,66,74,74,74,66,74,82,90,66,74,66,66,74,74,82,82,66,74,90,66,74,74,82,82,74,66,66,66,66,99,107,107,123,132,132,132,132,132,132,140,132,132,132,132,132,115,123,115,107,107,99,115,132,115,107,107,90,99,66,82,82,74,115,90,99,99,90,99,107,82,99,99,
99,82,90,90,82,82,74,74,82,82,74,90,99,99,74,66,66,66,74,82,74,82,74,74,74,74,74,82,82,99,90,82,82,82,82,82,82,90,82,90,90,82,82,82,82,90,90,90,90,99,90,90,90,82,82,82,82,82,82,90,90,90,82,82,82,82,82,82,74,74,82,90,115,165,123,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,90,66,57,90,74,57,57,90,82,74,66,66,66,66,66,66,66,66,74,74,82,82,90,99,99,90,82,82,74,82,74,74,66,57,66,66,66,74,74,74,82,107,99,132,189,181,181,181,189,181,181,181,173,181,181,181,181,115,148,115,57,90,107,99,90,90,82,82,99,90,74,74,82,99,90,107,132,115,90,82,99,90,90,90,82,74,66,66,66,66,66,74,74,74,74,74,74,74,66,66,74,74,74,74,66,66,66,82,82,90,66,66,66,99,107,82,82,82,90,123,115,90,123,132,132,132,132,132,132,132,132,132,132,140,132,123,115,107,74,99,123,107,99,90,99,107,82,82,99,99,107,107,90,82,74,90,74,74,74,74,99,
82,82,82,82,90,82,90,74,82,90,90,90,99,82,74,66,66,66,66,82,74,82,74,74,74,74,74,82,90,107,82,82,82,82,82,82,82,82,90,90,90,82,82,82,82,82,90,90,90,99,90,90,90,90,82,82,82,82,82,82,90,90,82,82,82,82,82,82,74,74,74,115,132,173,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,66,66,66,57,57,74,90,74,66,66,74,66,66,66,66,66,74,74,82,82,99,107,99,90,90,82,82,74,82,74,74,74,66,66,66,74,74,74,90,107,82,90,173,156,181,181,181,181,173,148,173,181,181,181,173,140,107,82,57,107,99,90,90,90,99,82,90,107,82,82,90,82,90,115,132,107,82,90,90,90,82,99,90,74,66,66,66,66,74,74,66,74,74,74,74,66,66,66,66,66,66,66,66,66,66,82,82,66,90,107,99,99,74,74,82,107,107,99,99,99,99,123,140,132,132,132,132,140,132,132,132,123,123,132,107,99,107,107,107,99,90,90,82,74,90,107,82,99,99,115,90,82,82,74,66,66,74,74,82,
74,74,66,74,82,90,90,74,82,90,90,90,99,82,74,90,66,66,74,74,82,74,74,74,74,74,82,82,115,82,82,82,82,74,74,74,74,82,82,82,82,82,82,82,82,82,82,90,90,99,99,90,90,82,82,82,82,82,82,90,90,82,82,82,82,82,82,82,82,82,74,132,140,156,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,66,57,57,82,74,99,74,74,66,66,66,66,66,66,74,82,82,82,90,90,107,99,90,82,82,82,82,74,74,66,66,66,66,66,74,74,74,90,107,82,107,165,123,181,173,173,181,181,115,173,181,173,181,181,181,115,74,57,107,99,90,82,82,90,82,90,107,82,82,90,90,99,123,107,99,82,82,90,90,99,107,90,74,74,66,66,66,74,74,74,74,74,74,82,74,66,74,74,66,74,66,66,66,66,74,66,107,90,90,99,99,82,90,90,90,107,99,82,99,107,99,107,115,132,132,132,132,132,132,132,66,66,132,123,99,115,123,123,132,107,90,82,107,107,107,90,82,82,82,82,82,74,66,66,66,66,74,74,
74,74,66,74,74,90,74,82,82,82,90,90,90,90,74,66,66,74,74,74,82,74,74,66,74,74,82,90,90,82,82,74,82,74,74,74,82,74,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,82,82,82,82,82,90,82,82,82,82,82,82,82,82,82,82,90,123,156,140,74,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,74,66,99,74,107,74,66,66,66,66,74,66,66,66,74,82,90,90,99,99,99,90,90,82,82,74,74,82,74,74,66,66,66,74,74,82,90,107,82,123,148,107,181,156,148,173,181,123,148,173,156,173,173,189,148,57,57,115,99,90,82,82,90,74,82,82,82,82,90,90,99,123,99,90,82,82,90,90,90,107,99,74,74,66,66,66,74,74,74,74,66,74,82,66,66,66,74,66,74,66,66,66,66,66,99,82,99,90,82,99,107,123,115,123,123,115,115,115,99,99,115,123,107,132,132,132,132,74,82,57,57,115,99,123,115,140,123,82,99,90,90,107,115,99,99,99,82,74,90,82,66,66,66,66,66,82,82,
74,66,66,66,74,74,74,74,82,82,90,82,90,82,74,66,66,74,74,74,74,74,66,74,74,82,82,90,99,82,82,82,74,74,74,74,74,74,82,74,82,82,82,82,82,82,90,90,90,90,90,90,90,90,82,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,99,115,173,107,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,99,82,90,57,99,82,74,66,66,66,66,66,66,74,74,82,82,82,90,99,90,90,90,82,82,74,82,82,82,74,66,66,66,74,82,82,90,123,74,123,132,107,181,123,132,148,156,148,107,165,156,173,189,181,165,99,57,123,99,90,82,82,99,74,82,82,82,82,90,99,107,107,90,90,82,82,90,99,82,107,99,74,66,66,66,66,66,74,74,74,66,74,82,66,74,74,74,74,74,66,66,66,57,82,90,99,74,82,66,107,123,115,123,90,74,107,99,82,99,107,90,115,107,132,140,132,132,90,57,57,57,66,99,140,90,82,82,74,90,82,107,123,107,107,107,90,90,90,82,74,66,66,66,66,74,82,82,
66,66,66,66,74,74,74,66,74,74,90,82,82,82,66,66,66,74,74,82,74,66,66,74,74,82,82,82,82,82,82,82,74,74,74,82,82,82,74,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,82,90,82,82,82,82,82,82,82,82,82,82,82,107,107,181,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,82,66,66,66,107,82,74,66,66,66,66,66,66,66,74,74,82,90,90,90,90,90,90,82,74,74,82,82,90,66,66,66,74,74,82,82,99,123,66,115,123,140,148,99,107,123,123,123,90,165,156,181,189,173,165,99,74,123,99,90,82,82,82,90,90,82,90,82,90,99,115,90,82,82,82,82,90,99,90,115,115,74,66,66,66,74,74,74,74,74,66,74,90,74,74,74,74,66,74,74,74,66,99,107,82,99,107,107,107,123,132,132,123,123,107,115,90,82,82,82,99,90,132,132,107,132,140,99,57,57,82,123,140,99,74,41,82,82,90,90,115,107,90,107,99,90,90,90,82,74,66,66,66,66,66,66,66,
82,66,66,66,66,66,66,66,66,82,90,74,82,74,74,66,74,66,74,82,74,74,74,74,74,82,82,82,82,82,82,82,74,74,74,74,74,82,82,74,74,82,82,82,82,82,82,82,90,90,90,99,99,90,90,82,82,82,90,90,82,82,82,82,82,82,82,82,82,74,82,123,173,107,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,66,107,74,74,66,66,66,66,66,74,74,74,82,82,82,82,90,99,99,82,74,74,74,74,82,82,90,66,66,74,74,82,90,107,115,57,99,107,132,107,82,90,90,107,90,99,156,165,189,181,181,173,140,74,115,99,82,82,82,74,74,82,74,99,82,99,107,115,82,82,82,82,82,82,90,82,107,123,82,66,74,74,74,74,66,74,74,74,74,90,74,66,74,74,74,74,74,66,66,115,107,99,107,140,132,132,132,132,132,123,123,115,107,90,99,82,74,74,90,107,99,107,132,132,74,57,57,123,165,148,156,90,74,66,90,82,115,90,90,107,107,90,90,82,90,90,90,82,66,66,66,82,74,66,
66,66,66,66,74,66,74,74,66,82,99,74,82,74,74,74,74,82,74,74,66,74,74,74,74,74,74,82,82,82,82,82,74,74,74,74,82,74,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,90,90,82,90,90,90,90,90,82,82,82,82,82,82,82,90,82,82,140,140,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,66,90,99,74,74,74,66,66,66,74,74,74,74,82,82,82,90,90,99,99,90,82,74,66,66,82,90,82,82,74,74,74,82,90,107,107,57,74,90,99,82,74,74,82,90,90,115,148,173,189,181,181,181,165,82,115,99,90,82,82,74,74,74,74,99,90,99,123,90,82,82,82,82,82,82,90,90,99,115,82,66,66,74,74,74,66,66,74,74,74,90,74,74,74,74,74,74,66,66,115,99,82,115,132,132,132,132,132,132,132,132,123,99,99,99,115,90,99,82,99,90,123,115,140,123,66,66,123,173,148,99,115,123,115,115,82,107,107,107,107,115,107,99,90,99,99,99,90,90,74,66,66,74,66,66,
66,66,74,74,74,74,66,74,66,74,99,90,82,74,66,74,74,74,74,74,74,74,74,74,82,74,74,82,82,82,82,82,74,74,74,74,82,74,82,82,82,82,82,82,82,82,82,82,82,90,90,90,99,90,90,90,90,90,90,90,90,82,82,82,82,82,90,90,82,82,82,156,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,66,57,115,132,99,74,74,74,66,66,66,66,66,66,74,74,82,90,90,99,99,90,90,82,82,74,74,74,82,82,74,74,74,74,82,90,107,82,66,57,74,66,66,57,66,74,82,82,123,148,181,189,181,181,181,165,82,115,99,82,82,82,74,74,74,74,82,115,132,123,82,82,90,82,82,82,90,99,90,90,115,82,74,74,74,66,74,74,74,74,74,74,82,74,74,74,74,74,74,74,74,115,99,66,115,132,132,140,132,140,140,132,123,123,90,82,90,82,99,99,74,82,90,107,107,99,74,90,140,115,90,66,107,115,115,115,107,90,90,107,115,115,115,115,99,107,107,99,99,90,90,82,74,66,74,66,66,
57,66,66,74,74,74,66,74,66,66,90,82,74,74,74,74,66,74,74,74,74,82,74,82,74,82,82,82,82,74,74,82,82,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,99,156,115,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,82,123,115,90,99,82,74,74,66,74,66,74,74,74,74,74,82,90,90,90,90,82,82,82,82,74,82,74,74,74,74,74,74,82,90,107,57,57,66,74,57,57,57,57,74,82,82,148,156,173,181,181,189,181,173,90,107,99,90,82,74,74,74,74,74,82,115,140,99,82,90,90,82,82,82,90,99,90,82,99,90,74,74,74,74,74,82,74,74,74,74,99,74,74,74,74,74,74,74,99,107,90,57,115,132,140,140,132,140,99,115,115,107,82,90,99,74,74,74,82,74,115,107,82,140,156,173,123,66,57,90,115,107,115,107,115,115,107,107,115,107,107,107,99,107,99,99,90,90,90,82,74,74,74,74,66,
66,66,57,66,74,66,82,66,66,74,82,74,74,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,74,74,74,82,74,74,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,90,123,140,115,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,66,74,132,107,99,90,82,82,74,74,66,66,74,74,74,74,74,82,82,90,90,99,90,82,82,82,74,74,74,82,82,74,74,74,82,82,107,90,57,74,82,66,57,57,57,66,74,82,90,148,173,173,181,181,181,173,173,90,90,99,90,82,74,74,74,74,74,82,99,99,82,82,90,82,82,82,82,90,99,90,82,82,82,74,74,74,74,74,82,74,74,74,74,90,82,74,74,74,74,82,66,107,99,57,57,99,115,140,123,90,82,66,82,132,107,123,99,123,74,107,115,90,99,107,74,90,107,123,90,57,74,123,115,107,107,115,99,99,115,107,107,115,107,107,107,99,90,90,90,90,90,82,82,74,66,66,66,66,
66,66,66,66,66,74,74,66,66,66,74,66,74,74,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,74,82,82,74,74,82,82,82,82,82,82,82,82,82,82,90,82,90,90,90,90,90,90,90,90,90,90,90,99,99,90,90,90,90,90,99,115,132,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,90,107,132,140,115,90,90,82,82,82,74,74,74,66,66,66,66,66,74,74,82,82,90,99,90,82,82,74,74,74,74,74,82,82,74,82,82,90,115,66,90,82,82,66,57,57,57,66,66,74,90,156,173,181,181,189,181,165,181,74,74,99,90,82,82,74,74,74,74,82,82,90,82,82,82,74,82,82,90,90,99,82,82,90,90,74,74,74,74,74,82,82,74,74,74,90,82,74,74,74,74,74,74,107,99,57,74,99,123,140,82,57,57,57,82,140,123,123,99,82,57,74,90,123,115,123,90,99,115,82,74,90,115,99,107,115,115,99,107,115,115,90,107,115,107,107,99,90,82,82,82,90,90,82,82,74,74,82,66,66,
66,66,66,82,66,74,66,74,66,66,66,74,66,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,74,82,82,82,74,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,107,99,90,82,140,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,66,66,57,66,115,140,123,115,99,90,90,82,82,74,74,66,66,74,74,82,74,82,74,82,82,90,90,90,82,82,82,74,74,74,74,74,82,82,82,82,90,99,90,57,107,74,74,57,66,57,57,57,57,66,82,156,173,173,189,189,181,165,181,74,57,82,99,82,82,74,74,74,74,74,82,82,82,82,82,74,82,82,82,90,90,82,82,90,90,74,74,74,74,74,74,74,74,74,74,82,74,74,74,82,74,66,107,115,82,57,107,107,132,132,74,57,57,57,74,123,107,148,99,115,115,115,99,107,123,107,66,107,115,99,107,107,90,99,115,123,132,123,115,123,90,99,107,115,107,99,99,90,82,74,82,90,82,82,82,74,82,66,74,66,
74,74,74,74,66,66,66,66,74,66,66,66,66,74,74,74,74,82,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,74,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,90,90,90,90,90,90,90,99,123,115,107,107,115,115,99,99,140,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,66,107,132,115,90,90,99,82,82,82,82,82,82,82,82,74,74,74,74,82,82,90,90,82,90,90,82,82,74,74,74,74,74,74,74,82,82,90,90,107,82,57,74,57,66,57,57,66,57,57,57,66,82,140,181,181,189,189,181,165,181,82,57,74,99,90,82,74,74,74,74,74,74,74,82,74,74,74,74,82,82,90,99,90,82,90,99,74,74,74,74,74,74,74,74,74,74,99,74,74,82,74,82,74,107,115,57,66,132,132,132,123,66,66,57,57,66,107,107,132,123,107,115,99,99,123,123,74,115,140,115,140,107,90,90,90,123,107,115,115,115,74,74,90,107,115,107,107,90,82,82,82,82,82,82,82,82,74,90,90,66,66,
66,66,66,66,66,66,74,66,74,74,66,66,74,74,74,74,82,82,82,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,74,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,123,123,115,107,107,107,115,115,90,165,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,99,132,140,140,99,90,82,82,82,82,82,74,82,82,82,82,90,99,82,90,74,74,90,90,90,82,82,82,82,82,74,74,74,74,74,74,82,82,90,90,107,99,57,57,66,66,57,57,57,57,57,57,57,74,140,173,173,189,189,181,173,173,74,57,57,90,90,82,74,74,74,74,74,74,74,74,74,74,74,74,82,82,99,99,90,82,99,107,74,74,74,74,74,74,74,82,74,74,99,82,74,74,74,82,90,115,90,57,82,123,132,140,99,57,57,66,57,57,90,107,115,132,132,99,99,99,115,115,123,140,115,132,90,82,90,90,90,82,99,99,90,74,66,74,90,107,107,107,99,90,82,82,82,82,82,82,82,74,90,74,74,66,66,
66,66,74,66,66,66,66,66,66,74,74,74,74,74,74,74,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,82,82,74,74,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,99,90,90,90,90,90,99,99,115,107,99,99,90,99,107,115,74,165,74,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,107,132,132,140,115,90,90,90,82,82,74,74,74,82,82,82,90,90,99,90,82,82,90,99,90,82,82,82,74,74,74,74,74,74,74,74,74,82,82,90,107,99,107,57,57,66,57,57,57,57,57,57,57,57,66,107,173,165,181,181,181,181,181,74,57,57,74,99,82,82,74,74,74,74,74,90,74,74,74,82,82,82,82,99,90,82,82,90,107,82,74,74,74,82,82,82,82,74,74,82,74,74,74,82,74,107,107,74,57,90,132,132,140,99,57,57,90,82,57,82,99,107,99,90,74,99,115,107,132,90,82,90,66,74,90,90,90,99,90,90,82,82,74,74,82,99,107,107,107,99,90,82,82,82,82,82,82,74,74,90,74,74,66,66,
74,74,74,66,66,66,66,66,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,90,90,90,90,90,90,99,90,90,90,90,90,99,99,115,107,107,99,99,90,90,99,99,156,115,49,66,66,57,57,57,66,82,57,57,57,57,57,57,57,57,57,57,107,140,132,123,90,82,82,82,74,82,82,82,82,90,90,90,90,90,82,82,90,82,74,74,90,90,82,82,82,74,74,66,74,74,74,74,74,82,82,82,99,99,115,66,66,57,57,57,57,57,57,57,57,57,66,90,140,156,181,189,173,173,156,66,57,57,57,90,90,82,74,74,74,74,74,82,82,74,74,82,82,82,90,90,90,90,82,99,115,82,74,74,74,82,82,82,82,82,82,90,82,82,82,82,74,115,99,57,66,99,123,132,132,82,57,49,74,115,90,57,99,115,132,123,107,107,99,107,115,99,82,90,74,82,82,90,90,99,82,82,74,74,74,74,82,90,107,107,107,99,90,82,82,82,82,82,82,82,82,82,74,66,66,66,
66,74,66,66,66,66,66,66,74,66,66,66,74,74,82,90,99,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,74,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,99,90,90,99,90,99,99,107,107,107,99,99,99,90,90,90,123,90,165,90,57,66,57,57,57,57,74,66,66,66,66,66,57,57,57,57,57,107,132,132,99,82,82,82,82,90,82,82,82,90,90,99,90,90,90,99,82,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,90,90,115,115,66,66,66,57,57,57,57,57,57,57,57,57,82,148,156,165,189,189,148,132,57,57,57,57,66,90,82,74,74,74,74,74,74,74,82,74,82,82,82,90,99,90,82,82,90,107,99,82,74,82,82,82,82,82,82,82,90,90,82,82,74,82,123,99,57,99,74,123,132,140,115,99,57,57,99,115,66,123,107,123,99,107,107,107,107,90,90,82,82,82,82,82,82,99,90,82,74,74,74,82,74,82,90,99,107,107,99,90,82,82,82,82,82,82,82,90,82,74,74,66,66,
66,66,66,74,66,66,66,66,66,66,74,74,74,74,82,90,82,74,74,82,82,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,74,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,107,107,107,107,99,99,99,90,99,99,115,82,173,140,66,57,57,57,57,57,57,115,66,57,57,57,57,57,57,57,66,132,132,115,90,82,82,82,82,82,82,82,82,90,99,99,90,90,90,90,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,90,99,115,57,74,82,66,57,57,57,57,57,57,57,74,99,156,181,148,181,181,99,99,66,57,57,57,57,74,90,82,74,74,74,74,74,74,74,74,74,82,90,90,99,82,82,82,99,115,99,82,82,82,82,82,82,82,82,82,99,90,82,82,74,107,107,123,107,90,74,132,132,132,132,132,66,66,107,99,66,99,66,74,66,82,115,115,107,82,82,90,90,82,82,82,82,99,90,74,74,74,74,74,74,82,90,99,99,99,99,90,82,82,82,82,82,82,82,82,90,74,74,66,66,
66,74,66,74,66,66,66,66,74,66,74,74,74,74,82,99,82,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,74,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,107,115,115,99,99,99,99,99,99,115,148,148,99,57,57,57,57,57,74,115,57,57,57,57,57,57,57,57,74,132,132,115,90,82,82,74,82,82,82,82,82,90,99,99,90,90,82,82,74,74,82,74,74,74,74,74,74,74,74,74,74,74,74,66,74,74,82,82,90,107,107,107,74,90,90,74,66,57,57,57,66,66,66,90,115,140,173,140,181,165,66,74,90,90,57,57,66,57,90,90,82,74,74,74,74,74,74,82,82,90,90,99,99,90,82,82,99,115,99,82,90,82,82,82,82,82,82,82,90,99,82,74,123,115,107,99,123,66,90,132,132,132,132,140,123,82,99,99,82,90,74,66,74,82,115,99,90,90,90,82,82,82,82,74,82,99,90,74,74,82,82,74,74,82,90,99,99,99,90,90,82,82,82,82,82,82,82,90,74,74,66,66,66,
66,74,74,74,74,66,66,66,66,66,66,66,74,74,107,90,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,107,107,107,107,99,99,107,107,90,115,123,132,115,57,57,57,57,90,140,115,99,66,57,57,57,57,57,57,90,140,132,107,90,82,82,90,82,82,82,82,90,90,90,90,90,82,82,82,82,82,82,74,74,74,74,74,82,82,74,74,74,82,82,74,74,74,82,82,107,123,123,107,66,90,107,82,74,66,57,66,66,66,74,82,99,115,148,140,173,132,74,115,165,148,66,57,66,57,74,90,82,74,74,74,74,74,82,74,82,90,99,99,99,90,82,82,107,115,99,90,90,82,82,82,82,82,82,82,90,99,82,90,115,99,123,123,107,66,99,140,132,132,132,132,132,107,74,107,82,99,74,74,74,74,107,107,99,82,82,90,74,74,74,74,82,99,90,82,82,74,82,74,82,82,90,99,99,99,90,90,82,82,82,82,74,82,82,82,74,74,74,66,66,
66,66,74,74,66,74,66,66,66,66,66,74,82,82,99,82,82,82,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,82,82,90,90,90,90,90,90,90,90,90,90,90,99,99,107,107,115,99,90,90,115,99,107,99,140,148,66,57,57,66,156,173,156,148,132,107,57,57,57,57,57,123,132,123,99,90,90,90,82,82,82,82,90,90,99,99,90,82,82,82,82,82,90,82,74,74,74,74,74,82,90,107,82,82,82,90,115,90,82,82,99,123,82,90,82,66,82,107,99,82,74,66,66,66,66,82,90,99,107,123,107,132,82,82,148,181,173,82,57,66,57,57,107,90,74,74,74,74,82,74,82,82,99,90,90,90,82,82,82,107,115,99,90,90,82,82,82,82,82,82,82,90,99,82,107,107,115,107,132,99,82,99,140,132,132,132,132,132,132,82,99,74,99,74,74,74,74,115,123,82,74,90,90,82,74,74,74,82,99,90,82,82,82,90,82,82,74,90,90,90,99,82,90,82,82,82,74,82,82,74,99,74,74,66,57,66,
66,66,66,74,66,66,66,66,66,66,74,82,82,90,90,82,82,74,74,74,74,74,74,74,74,74,74,82,82,82,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,90,90,90,90,90,90,90,90,99,107,115,99,90,99,90,90,99,90,148,165,90,57,57,66,173,165,115,156,165,140,57,57,57,57,99,140,115,99,99,90,90,82,74,74,74,82,90,90,99,90,90,82,82,82,82,82,99,90,74,74,74,74,74,82,90,82,57,66,74,82,66,90,82,90,107,115,57,57,123,148,99,107,132,107,90,57,66,74,74,82,82,90,90,82,66,74,90,99,165,181,173,90,66,57,57,57,90,90,74,74,74,74,74,82,82,99,99,90,82,90,82,82,82,107,107,107,99,90,82,74,82,82,82,90,82,90,90,82,115,107,132,115,132,90,82,107,140,132,132,132,132,132,132,132,99,66,90,107,74,74,57,99,115,74,74,82,90,82,82,82,82,82,90,99,90,74,82,82,82,74,82,90,90,90,99,82,82,90,74,74,74,74,74,82,74,74,66,74,57,66,
66,74,66,66,66,66,66,66,66,74,82,82,90,107,90,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,99,90,90,90,90,90,90,90,90,99,107,115,99,99,107,99,90,99,90,148,148,140,57,57,57,156,173,82,123,123,74,57,90,99,115,132,132,90,90,90,90,90,74,74,74,74,82,82,90,99,90,90,82,82,82,82,74,90,99,74,74,74,74,74,82,99,57,57,57,57,57,57,57,74,90,99,90,57,57,90,165,140,140,156,132,82,66,66,74,82,82,90,82,66,57,57,57,123,123,173,173,173,107,66,57,57,57,74,82,74,74,74,74,82,82,90,99,90,82,82,82,82,82,82,107,115,107,107,90,82,82,82,82,90,90,82,90,90,82,115,123,123,132,140,82,82,140,140,140,132,132,132,123,107,132,115,82,132,132,90,74,66,90,99,66,66,66,90,82,74,82,74,82,82,99,74,90,82,90,90,74,90,99,82,99,90,82,82,74,74,74,74,82,99,74,90,74,66,74,66,66,
66,82,74,66,66,66,66,66,66,74,74,82,99,107,82,90,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,99,90,90,90,90,90,90,90,90,90,99,107,115,107,107,90,90,90,107,156,90,156,57,57,57,107,123,74,66,57,57,74,132,140,140,140,99,90,82,82,82,82,74,74,74,74,82,82,90,90,82,82,82,82,82,82,90,90,90,82,74,74,74,74,90,66,57,57,57,57,57,57,57,57,66,74,57,57,57,66,140,173,165,173,132,66,66,66,82,90,90,90,74,57,57,66,57,90,156,181,173,165,140,82,82,57,57,66,107,74,74,74,74,82,82,90,99,90,82,74,82,82,82,82,115,107,107,107,99,90,82,82,82,90,90,90,90,99,82,115,115,115,132,123,74,115,140,140,140,132,132,115,115,107,107,123,107,123,107,123,74,82,99,99,66,66,66,90,82,74,82,82,82,82,107,90,82,82,90,90,74,82,82,82,90,82,82,82,74,74,74,74,74,82,74,82,74,74,66,66,66,
66,74,90,66,66,66,66,66,74,74,74,74,90,99,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,82,90,90,99,99,90,90,90,90,90,90,90,90,90,90,99,107,115,99,90,90,74,82,115,82,148,57,57,57,66,66,74,66,57,57,107,140,132,140,123,82,82,82,82,82,82,74,74,74,82,82,82,90,90,90,82,82,82,82,82,90,90,82,82,74,74,74,107,74,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,82,140,165,148,99,57,57,66,90,107,123,99,66,57,57,57,57,82,173,173,173,181,156,140,148,82,66,57,99,74,74,74,82,82,90,99,90,82,82,82,74,74,82,82,115,107,107,115,107,99,82,90,90,90,90,90,90,99,82,123,107,115,132,107,99,140,132,140,140,132,132,107,107,115,99,132,123,107,82,99,90,90,90,90,66,66,74,82,99,90,82,90,90,99,90,107,99,99,90,90,99,99,74,90,82,99,74,74,74,74,74,74,82,82,90,90,66,66,66,66,66,
66,74,90,66,66,66,66,66,74,74,74,82,82,82,82,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,90,82,90,90,90,90,90,99,99,90,90,90,90,90,90,90,90,90,90,99,107,107,99,66,140,90,74,66,99,132,99,57,57,57,57,57,66,57,74,132,123,115,123,115,82,82,82,82,82,74,74,74,74,82,90,90,82,82,74,82,74,82,74,74,82,90,90,82,74,74,90,115,57,57,82,74,57,57,57,57,57,57,57,57,66,57,57,57,57,90,90,90,66,57,57,66,107,132,140,90,66,57,57,57,57,90,181,181,181,181,173,165,173,115,107,82,82,82,74,74,74,82,90,99,90,82,82,74,74,74,82,82,107,99,107,115,115,99,66,99,82,90,90,90,90,90,99,115,107,123,123,74,115,140,140,132,140,132,132,123,115,115,115,107,123,115,82,99,90,115,82,99,74,66,74,74,90,82,99,99,99,90,99,99,107,115,123,90,82,74,82,90,74,74,74,74,66,66,66,74,90,90,82,74,66,74,74,66,66,
66,66,74,66,66,66,66,66,74,74,66,82,82,74,82,74,74,66,74,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,82,82,82,82,82,90,90,90,99,99,99,90,90,90,90,90,90,90,90,90,90,99,99,99,115,99,99,82,107,57,82,74,140,57,57,57,57,57,57,74,123,132,107,99,123,90,74,82,74,82,74,74,74,82,90,90,82,82,74,74,74,74,74,74,74,74,74,74,90,74,74,74,107,99,57,74,107,66,57,57,57,57,57,57,57,57,57,57,57,66,49,82,66,57,57,57,57,66,82,140,140,82,57,57,57,57,57,132,181,173,165,181,173,181,181,148,99,82,74,82,74,74,82,82,99,90,82,82,74,82,74,74,74,82,107,107,107,99,90,115,82,90,90,90,90,90,90,90,107,115,99,123,123,66,132,132,140,115,132,132,132,123,115,115,115,107,123,107,90,82,107,123,90,99,66,57,66,74,90,90,107,99,82,99,107,99,99,99,123,115,99,99,66,74,74,74,74,82,90,74,66,74,82,82,99,74,66,74,66,57,57,
57,66,66,66,66,66,74,74,74,82,82,90,82,74,90,90,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,82,90,90,90,90,90,99,99,90,90,90,82,90,90,90,90,90,90,90,90,90,132,123,132,107,115,123,66,74,74,115,115,57,57,57,57,57,90,132,107,99,90,99,74,74,74,74,74,74,74,82,90,99,90,90,74,74,74,74,74,74,74,74,74,74,82,90,82,99,123,140,82,57,66,82,57,57,57,57,57,57,57,57,57,57,57,90,132,57,57,57,57,57,66,57,57,57,99,90,82,66,57,57,57,57,156,181,173,173,156,173,181,181,165,132,148,82,99,74,74,82,90,90,90,82,82,82,82,82,74,74,82,107,107,115,99,57,115,99,90,90,90,90,90,90,90,115,107,107,123,123,90,132,140,140,99,99,140,123,107,115,107,107,115,123,107,123,74,90,99,107,90,66,66,66,74,82,82,90,90,90,107,99,74,99,82,99,90,74,74,66,66,66,66,74,66,66,66,82,99,90,90,82,74,66,66,74,74,66,
66,66,66,66,66,66,82,74,66,82,99,82,82,74,66,74,74,74,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,74,74,82,82,82,82,82,82,82,90,90,90,99,90,99,99,99,90,90,82,82,90,90,90,90,90,90,90,90,82,115,115,107,115,115,115,82,82,99,90,115,99,99,107,99,90,107,132,107,90,90,82,74,74,74,74,74,74,74,82,90,90,90,82,82,74,74,74,74,66,66,66,66,74,74,74,82,115,140,123,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,99,132,57,66,82,57,57,57,57,66,57,74,66,66,57,57,57,57,57,132,165,173,181,140,115,165,115,107,156,173,82,107,82,74,90,90,90,82,82,82,82,82,82,82,74,90,107,107,115,99,74,99,115,90,90,90,90,90,90,90,115,99,107,123,132,99,140,132,132,90,66,132,132,99,99,107,115,115,107,115,107,99,99,99,123,82,66,66,57,66,82,74,82,90,123,99,74,82,90,74,82,66,66,66,66,66,74,66,74,99,107,74,82,74,82,107,74,66,66,66,66,66,66,
66,66,66,74,66,66,82,99,82,74,82,82,74,74,82,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,90,90,90,90,90,99,99,90,90,82,82,82,82,90,90,90,90,99,107,74,90,107,90,90,99,99,107,123,82,90,82,99,140,123,115,123,123,123,99,90,82,74,74,74,74,74,74,74,74,82,90,82,74,66,74,74,74,74,66,66,66,66,66,66,74,74,82,115,132,82,66,123,66,57,57,57,57,57,57,57,57,57,57,57,66,90,90,57,57,74,57,57,57,66,57,57,66,57,57,57,57,74,57,66,107,165,173,173,148,82,82,115,123,132,132,107,99,82,82,82,82,90,82,82,82,82,82,82,82,82,90,115,107,115,66,57,82,107,90,90,90,90,90,90,90,115,99,99,115,132,90,140,140,99,57,57,74,123,115,82,90,107,115,123,123,123,115,90,99,123,74,66,66,66,66,74,82,74,82,82,107,123,82,82,66,66,66,66,66,66,66,66,66,66,99,82,74,74,82,74,82,82,74,66,66,66,66,66,
66,66,66,74,66,74,74,74,74,74,82,74,74,66,74,66,66,74,66,74,66,66,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,90,90,90,90,90,99,99,99,90,90,82,82,82,82,90,90,99,82,107,49,90,99,90,90,90,99,123,132,82,115,99,115,115,123,140,140,132,115,107,82,82,74,74,74,74,74,74,82,90,90,82,82,74,74,66,66,66,74,66,66,66,66,66,74,74,74,82,107,115,57,66,115,66,57,57,57,57,57,57,57,57,57,57,57,74,74,66,57,66,57,57,57,66,66,57,66,99,82,57,57,74,99,82,57,74,140,181,173,148,66,99,132,107,115,123,132,115,107,82,90,90,82,82,82,82,82,82,82,82,82,99,123,107,107,123,66,74,99,90,90,90,99,99,99,90,115,115,99,115,132,74,132,140,74,57,57,90,107,115,90,82,115,115,123,123,123,123,115,99,107,66,66,66,57,57,74,74,74,82,90,74,90,132,90,66,66,66,57,57,57,57,82,66,74,82,99,74,90,115,90,90,74,74,66,66,66,66,66,
66,82,82,74,66,74,66,66,66,74,74,66,66,66,66,74,66,74,74,74,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,90,90,90,90,90,99,99,99,90,90,82,82,82,82,90,90,66,115,74,57,90,115,99,99,90,90,90,107,123,123,123,123,115,99,115,107,115,107,107,82,74,74,74,74,74,74,82,90,90,82,82,74,74,74,74,66,66,66,66,66,66,74,74,74,74,74,82,115,82,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,66,82,132,132,74,57,74,82,74,57,57,107,173,181,132,74,90,115,115,107,107,107,132,132,107,90,82,82,82,82,82,82,82,82,82,82,99,107,115,107,123,82,66,99,90,90,90,99,99,90,99,115,115,107,115,123,66,132,107,74,57,57,99,115,107,82,82,82,90,99,115,123,107,115,90,99,66,66,66,57,66,74,74,74,74,90,90,90,74,123,82,66,57,57,57,57,57,66,66,74,74,66,74,90,99,82,82,74,66,66,57,66,57,66,
66,74,74,66,74,66,74,66,74,74,74,66,66,66,74,74,66,66,66,74,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,90,90,90,99,99,90,90,90,90,82,82,82,82,74,115,107,90,66,90,132,107,90,90,90,90,90,115,132,123,99,82,74,107,99,115,107,107,82,82,74,74,74,74,74,82,82,90,82,74,74,66,66,66,66,66,66,66,66,66,74,74,74,74,74,82,123,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,107,156,156,90,74,82,74,57,57,57,90,181,181,123,66,90,90,99,107,107,107,115,107,115,90,82,82,82,82,82,82,82,82,82,82,107,115,123,107,140,132,57,99,90,90,90,99,99,99,99,115,107,107,115,132,74,107,57,57,57,57,57,90,115,90,74,74,82,82,107,115,107,99,115,82,66,66,66,66,66,82,74,74,82,82,99,90,90,82,99,82,57,57,57,57,57,82,66,66,66,74,66,74,74,74,74,74,66,66,66,66,57,57,
74,74,74,66,66,66,66,66,66,74,74,66,66,66,66,66,66,66,66,66,66,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,90,82,82,82,82,82,90,82,90,82,90,90,99,99,90,90,90,90,90,82,82,115,90,90,123,74,82,132,115,99,82,82,82,82,90,99,90,74,74,82,107,107,107,115,99,74,74,66,74,74,74,82,82,90,90,82,74,74,66,66,66,66,66,66,66,66,74,74,74,74,74,82,82,115,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,140,165,173,123,90,82,74,57,57,57,82,156,173,115,82,115,148,132,82,99,107,107,99,99,90,90,90,82,82,82,82,82,82,82,82,107,115,132,99,123,107,66,99,90,90,99,99,99,99,99,115,115,107,123,123,74,66,57,57,57,57,66,90,107,107,90,82,82,82,90,99,90,90,115,74,74,66,66,66,66,82,74,74,74,74,82,90,99,90,107,57,57,57,57,57,57,57,66,66,74,66,82,74,74,74,66,66,66,57,74,66,57,74,
66,66,66,66,66,66,74,90,74,74,74,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,82,82,82,82,82,90,90,90,90,99,99,90,90,90,90,90,82,82,99,115,140,148,132,66,74,132,123,107,107,82,82,82,90,90,74,74,74,82,99,107,107,107,90,74,74,66,74,74,74,74,82,99,90,82,74,74,74,74,74,74,74,57,66,66,74,74,74,74,82,82,90,115,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,66,156,156,181,156,107,74,66,57,57,57,66,156,181,107,107,115,173,173,148,99,99,99,107,99,99,99,82,82,82,90,82,90,82,82,82,107,115,123,82,82,57,66,99,90,90,90,99,99,99,99,107,123,132,132,107,66,57,66,57,57,66,90,107,115,107,90,82,82,82,90,99,90,115,115,66,74,66,66,66,66,74,74,74,74,74,74,90,90,90,90,74,57,57,57,66,74,82,66,66,74,74,82,74,82,74,74,66,66,66,82,74,66,66,
66,74,74,66,74,66,74,66,74,82,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,74,82,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,90,82,90,90,82,90,90,99,99,90,90,90,90,82,82,123,123,173,115,115,132,82,82,132,123,107,107,82,82,90,90,82,82,74,74,82,99,107,107,90,90,66,66,66,74,74,90,99,90,90,90,74,74,74,74,66,66,66,66,66,66,66,74,74,107,99,82,82,90,115,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,132,156,173,165,115,66,66,57,57,57,57,132,173,107,140,99,173,181,165,173,123,107,107,107,107,99,90,82,82,82,90,90,90,82,90,99,115,107,74,74,57,66,107,90,99,99,99,99,99,99,99,132,132,132,99,82,57,57,57,57,90,123,107,123,107,90,74,82,82,82,82,107,140,82,66,66,66,66,66,74,82,74,74,82,74,74,90,90,107,74,74,57,57,57,66,57,57,66,74,82,74,74,74,66,66,74,66,66,66,74,82,74,66,
66,74,66,66,66,74,74,90,82,74,66,66,66,66,66,66,66,66,66,66,66,66,74,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,82,90,90,90,90,82,82,90,99,90,90,99,90,66,90,115,107,156,107,66,107,115,99,132,132,123,115,107,99,82,82,99,82,90,82,74,82,107,107,107,82,74,66,66,66,66,82,82,82,90,90,82,82,74,74,66,74,74,66,66,66,66,74,74,82,82,107,90,90,90,115,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,99,148,132,148,107,66,66,57,57,57,57,99,140,123,132,107,181,181,148,165,123,107,107,99,99,90,82,90,82,82,90,90,82,82,90,99,115,99,90,66,57,57,99,99,90,99,99,99,99,107,99,115,99,132,90,90,57,57,57,57,74,107,123,123,115,107,99,82,82,90,74,90,74,82,74,74,66,66,66,66,90,74,66,74,74,74,90,82,107,66,82,74,66,74,66,90,57,66,74,74,74,74,74,66,66,66,66,74,66,74,90,74,66,
74,74,74,74,66,74,74,74,74,74,66,66,74,66,66,66,74,74,66,66,66,74,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,82,82,82,90,90,82,82,82,90,90,99,90,99,90,99,99,90,90,74,74,115,165,82,123,148,66,66,107,115,132,132,140,132,123,107,107,107,82,99,82,90,82,82,82,99,115,107,74,66,74,66,66,74,74,82,90,99,90,82,82,74,74,74,74,74,66,74,66,74,74,74,74,90,107,90,90,90,107,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,90,156,107,107,90,57,66,66,57,57,57,82,132,140,123,107,173,181,165,173,140,90,107,90,90,82,90,99,82,90,90,90,90,90,90,99,123,82,82,57,66,57,66,90,99,99,99,99,107,107,107,115,66,90,74,82,66,74,57,57,66,107,132,115,123,107,107,82,82,90,123,90,74,90,82,74,66,74,66,66,82,74,74,74,74,74,90,90,99,90,90,57,57,57,66,66,57,66,66,66,74,74,74,74,66,66,66,66,66,82,82,82,74,
66,74,74,74,66,66,74,82,82,66,66,66,66,66,66,74,74,74,74,74,66,66,66,74,66,66,66,66,66,66,74,74,66,74,74,74,74,82,82,82,82,82,82,82,90,90,90,90,90,90,90,82,99,99,90,74,99,132,165,165,74,99,123,57,57,107,82,90,123,132,132,123,123,107,107,90,82,82,66,66,66,66,99,123,99,82,66,66,66,66,74,74,82,82,90,90,90,82,74,66,66,66,66,74,66,74,74,74,74,90,115,99,90,90,90,107,90,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,57,74,99,57,57,57,57,57,57,57,57,107,173,99,82,66,57,57,66,57,57,66,82,123,132,132,107,181,165,140,123,123,140,123,107,90,82,90,90,82,90,90,90,90,90,90,99,132,90,74,57,74,57,57,82,99,99,99,107,107,107,107,107,66,57,74,74,74,66,57,57,74,132,132,115,123,107,107,82,82,90,115,90,90,99,82,74,66,74,57,66,74,74,74,74,74,74,90,82,107,82,90,90,74,82,90,66,57,57,66,66,74,66,74,74,66,66,66,66,66,74,82,74,74,
74,82,99,99,74,74,74,74,74,66,66,66,66,66,66,74,74,74,74,74,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,82,82,82,82,90,90,82,90,82,90,90,90,90,90,90,90,74,90,148,173,181,107,57,66,57,66,57,99,90,74,66,82,107,115,107,99,115,74,74,82,82,90,74,90,115,132,99,74,66,66,66,74,74,74,82,82,90,90,90,82,74,74,66,66,74,74,74,74,82,74,82,90,90,90,90,99,99,107,99,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,82,148,66,66,66,57,66,66,57,57,74,123,99,74,66,57,57,57,57,57,74,90,115,123,115,140,181,148,99,74,66,74,66,57,82,115,99,90,90,90,90,90,90,90,90,123,132,99,66,74,66,57,57,99,90,99,99,107,107,107,107,107,74,57,99,74,74,57,57,82,99,132,123,123,107,107,90,90,82,90,107,82,82,90,82,66,74,66,66,66,74,74,74,74,74,74,90,82,99,82,82,74,107,82,66,66,57,66,66,66,66,74,57,74,74,74,82,90,82,82,74,82,82,
99,90,90,107,99,74,74,82,74,66,66,66,66,66,74,82,82,66,74,74,66,66,66,66,66,66,66,66,66,66,74,66,74,74,66,74,74,74,82,82,82,82,82,90,90,90,99,90,99,90,90,90,107,90,107,107,115,165,165,82,115,123,99,66,57,90,82,99,99,74,90,90,107,107,123,107,107,99,66,115,123,140,123,115,82,66,66,66,66,74,74,74,82,82,99,90,82,74,74,74,66,66,66,74,74,74,74,74,74,82,90,90,99,99,99,107,99,57,57,57,66,57,57,57,57,57,57,57,57,66,57,57,66,82,165,74,74,57,57,57,57,57,57,82,123,90,74,74,57,57,57,57,57,90,115,132,123,99,173,181,148,90,57,57,57,57,57,57,99,99,90,90,90,90,90,90,90,99,132,123,90,82,82,57,57,66,107,74,107,107,107,107,107,107,107,66,74,115,90,82,74,99,99,115,132,90,107,115,107,82,82,90,82,107,115,82,66,74,74,66,66,66,57,57,82,74,74,74,74,90,82,99,90,74,74,74,66,66,66,66,57,66,74,66,66,82,74,74,66,107,99,90,90,82,90,74,
82,74,74,82,99,90,99,99,74,66,66,66,66,74,74,82,82,99,66,74,66,66,66,66,66,66,66,66,66,74,74,74,74,66,74,74,74,74,82,82,82,82,82,82,82,90,90,90,99,99,90,99,90,82,140,140,156,173,173,115,132,132,132,90,57,74,82,82,99,90,90,66,57,82,99,107,82,107,99,123,140,132,115,99,66,66,66,66,74,74,74,74,82,82,90,90,90,82,74,74,74,66,66,66,74,74,74,74,82,82,82,90,90,90,99,107,90,57,57,57,66,57,57,57,57,57,57,57,66,82,66,57,57,82,140,74,66,57,57,66,90,82,57,82,107,99,74,74,57,57,57,57,57,107,115,123,132,99,181,181,132,82,57,57,57,57,57,57,57,107,90,90,90,90,99,90,99,115,132,115,99,74,57,57,57,66,90,82,90,107,107,115,107,107,99,66,90,123,115,90,123,165,90,115,132,90,82,132,123,107,99,82,82,90,123,82,66,66,66,66,66,66,57,57,66,74,74,74,74,99,82,99,90,66,66,57,74,66,66,57,74,66,66,74,66,82,82,74,66,90,82,82,90,82,74,74,
82,74,74,74,82,99,99,74,82,66,74,66,74,74,82,82,74,140,74,74,66,66,66,66,66,66,66,66,66,74,66,74,66,74,74,74,74,74,74,82,82,82,82,82,90,90,90,90,90,99,99,99,90,123,173,181,181,173,148,115,107,123,132,107,57,66,90,74,90,99,107,123,107,66,57,107,132,115,90,82,74,90,74,66,66,74,74,66,66,74,74,74,82,82,90,99,82,82,74,74,66,74,66,66,66,74,74,74,74,82,82,82,90,90,99,115,90,57,57,66,57,57,57,57,57,57,57,57,66,99,90,66,66,90,115,74,66,57,57,90,156,132,66,66,107,99,82,74,57,57,57,57,57,90,107,123,99,140,181,156,99,66,57,57,57,57,57,57,57,107,90,90,90,99,99,99,99,123,132,115,74,74,66,57,57,66,74,74,57,99,115,115,115,123,82,57,107,140,123,99,123,165,107,90,132,123,99,132,132,123,107,99,90,90,107,74,66,66,66,66,66,66,57,66,74,74,82,74,74,90,82,107,82,90,90,82,66,74,57,82,74,82,66,82,66,74,74,66,66,66,90,90,82,90,74,82,
74,74,74,66,74,90,90,82,74,74,74,74,74,74,74,74,107,107,66,74,74,66,74,66,66,66,66,66,66,74,74,74,66,74,74,74,74,74,82,82,82,82,82,82,90,90,90,90,90,99,99,99,99,148,181,173,173,173,82,123,99,115,123,115,57,57,99,74,82,82,99,99,99,57,107,99,82,99,107,74,66,66,66,74,66,66,74,74,74,74,74,74,82,82,90,99,90,82,74,66,66,66,66,66,74,74,82,74,74,74,74,82,82,90,99,132,74,66,57,66,57,57,57,57,57,57,57,57,57,82,99,74,74,82,115,66,66,66,57,132,173,156,74,66,90,99,82,66,57,57,57,57,66,74,115,123,90,181,173,132,99,66,57,57,57,57,57,57,66,82,99,90,90,90,99,99,90,132,99,107,74,57,57,57,57,66,66,57,57,74,132,132,140,107,90,66,115,165,140,132,132,148,99,66,123,132,99,132,132,132,123,115,99,90,107,74,66,66,66,66,66,66,57,57,74,74,74,74,74,99,90,107,90,90,90,66,57,57,66,82,66,57,90,74,82,74,66,66,66,66,74,82,82,90,74,82,
82,74,66,66,66,74,74,82,82,74,74,74,74,82,74,99,123,74,74,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,82,82,90,90,90,90,99,99,99,115,132,173,173,181,132,82,115,99,99,123,132,107,82,115,82,74,82,90,99,66,107,107,107,107,115,82,66,66,66,66,66,66,66,66,74,66,74,74,74,82,82,82,99,82,82,74,74,66,66,66,74,74,82,82,74,74,74,74,74,82,82,99,123,66,57,66,66,66,57,57,57,57,57,66,57,57,66,82,99,99,99,132,74,82,90,74,156,181,173,90,66,74,90,90,57,57,57,57,66,74,74,107,107,115,189,165,156,115,66,57,57,57,57,57,57,57,57,99,99,90,90,99,107,115,99,57,82,57,66,66,74,57,57,57,57,57,74,115,123,132,82,115,57,99,165,156,148,148,140,82,57,82,107,74,115,132,132,132,123,99,99,107,74,66,66,74,74,66,57,66,57,66,82,74,74,82,90,99,99,82,74,66,57,74,74,74,82,82,82,74,82,74,66,74,66,66,66,66,99,90,107,99,99,
74,66,66,66,66,74,74,74,82,82,82,74,74,82,123,99,74,74,74,74,74,66,66,74,66,66,66,66,66,74,74,66,74,74,74,74,74,82,82,82,82,82,82,82,90,90,90,90,90,90,99,99,115,115,173,173,181,99,99,107,99,90,132,140,140,132,132,115,90,115,74,66,99,107,115,107,107,90,66,66,66,66,66,66,66,66,66,74,74,66,66,74,74,82,90,99,90,82,74,74,66,66,66,74,74,74,74,66,66,74,74,74,82,82,90,123,66,57,57,57,57,57,57,57,57,57,57,57,57,57,74,132,148,148,132,90,115,107,90,148,148,165,90,66,66,99,99,57,57,57,57,57,66,90,123,107,140,181,165,181,115,66,57,66,57,57,57,57,57,57,82,99,99,99,99,107,132,74,57,66,57,57,57,90,82,82,66,49,57,66,66,66,99,74,132,57,99,148,165,173,165,132,74,66,57,57,57,66,90,132,140,132,107,99,99,74,66,66,66,66,66,66,66,66,66,74,74,74,90,90,99,107,74,66,66,66,66,57,66,74,66,82,74,74,66,66,66,66,66,66,66,82,107,90,99,82,
66,66,66,66,74,74,74,74,82,82,74,74,82,90,90,82,74,82,74,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,90,90,90,90,99,99,99,156,173,173,173,99,99,107,90,90,99,132,140,140,132,115,115,90,82,115,132,132,107,123,82,74,66,66,66,66,66,66,66,57,66,66,74,74,74,74,82,82,82,99,90,82,74,66,66,66,74,74,66,74,66,66,66,74,74,74,82,82,90,115,90,57,57,57,57,57,57,57,57,57,57,57,57,57,74,156,173,181,140,123,148,123,115,107,90,140,82,66,57,99,115,66,57,57,57,57,66,99,123,99,148,173,173,156,115,90,57,57,57,57,57,57,82,90,123,99,90,115,107,115,132,82,57,57,57,66,57,57,66,99,74,99,74,57,57,57,66,66,132,57,99,140,165,181,165,156,140,107,57,57,57,57,57,74,90,132,140,107,90,74,74,74,66,74,66,66,57,82,66,82,74,82,90,99,90,82,66,66,66,66,66,74,74,66,66,66,74,66,66,66,66,66,66,66,66,74,82,74,66,66,
66,66,66,74,74,74,74,74,74,74,90,115,107,82,74,82,82,82,82,74,66,66,74,66,66,66,66,66,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,90,90,99,107,99,107,107,173,181,173,173,115,99,107,90,90,90,99,140,132,115,115,99,115,123,132,123,132,123,82,74,66,66,66,66,66,66,66,57,66,66,66,66,66,74,66,74,82,82,90,90,74,74,74,74,66,66,66,66,66,66,66,66,66,74,74,82,82,90,115,115,57,57,57,66,57,57,57,57,57,57,57,57,66,82,173,173,189,156,156,148,99,82,82,66,99,82,66,57,82,148,66,57,57,57,57,57,107,123,90,165,181,181,165,123,90,57,57,57,66,57,66,99,115,99,99,99,99,115,132,99,57,57,57,57,57,57,57,57,66,74,99,74,57,57,57,66,66,140,57,57,156,165,173,173,173,173,123,57,57,57,57,57,57,66,107,132,107,99,66,66,66,82,66,74,57,74,82,74,74,74,82,107,99,90,66,57,66,57,66,90,74,74,74,74,66,66,82,66,66,66,57,57,57,57,66,66,66,66,66,
66,66,74,74,74,82,74,74,82,115,107,82,74,82,74,82,82,82,74,74,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,90,90,90,90,107,99,115,99,132,173,181,173,173,90,90,107,90,90,90,90,99,132,115,90,107,123,123,132,115,123,107,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,90,90,90,82,74,74,74,66,74,66,66,66,66,66,66,66,74,74,82,90,99,115,132,66,57,57,57,57,57,57,57,66,57,57,57,66,90,173,189,181,173,165,148,99,74,74,57,66,66,57,57,66,107,74,57,57,57,49,66,115,107,99,140,165,181,165,123,82,57,57,82,115,90,66,115,107,90,90,90,90,115,123,57,57,57,57,66,57,57,57,57,57,57,57,66,57,57,57,57,57,132,66,66,148,173,173,173,173,181,115,82,57,74,66,66,66,57,74,132,115,115,107,99,99,82,74,82,90,90,74,74,74,74,82,107,90,74,66,57,66,82,74,66,74,66,66,66,74,74,66,57,57,66,66,57,57,66,66,66,66,66,66,
66,74,74,74,74,82,66,82,107,99,74,74,74,74,74,82,82,82,74,66,66,66,66,66,74,74,74,82,74,74,74,82,74,74,74,74,82,82,82,82,82,82,82,82,90,90,90,99,82,115,107,74,156,181,181,181,165,74,90,115,90,90,90,90,90,107,99,90,123,132,123,132,115,132,90,66,66,66,66,66,66,66,66,57,57,66,66,66,66,66,66,74,74,82,90,90,90,82,74,74,74,74,66,66,66,66,66,66,66,66,74,74,82,82,90,107,132,90,57,57,57,57,57,57,57,57,57,57,57,66,99,165,181,181,181,140,140,90,74,66,57,57,57,57,57,57,66,66,57,57,66,49,82,132,107,115,165,173,156,140,115,82,57,66,90,140,132,74,115,107,99,99,99,107,107,99,57,57,57,57,74,57,57,57,57,57,57,57,57,57,57,57,57,74,123,90,66,123,173,173,173,173,165,132,107,66,74,90,82,66,66,90,99,132,115,115,123,115,82,74,82,99,66,74,74,66,74,82,107,90,66,66,66,74,66,66,74,66,66,66,66,66,66,74,57,66,57,66,57,66,57,57,66,57,66,66,
66,74,74,74,74,107,123,107,123,82,74,74,74,74,82,74,74,74,74,66,66,74,74,66,74,74,74,74,74,74,74,74,74,82,74,74,82,82,82,82,82,82,82,90,90,90,90,115,82,115,82,107,165,181,189,181,148,57,74,132,90,90,90,90,90,90,99,99,132,132,82,132,132,99,74,74,66,66,66,66,66,66,66,57,57,66,66,66,74,74,66,74,74,82,90,99,90,90,82,74,74,74,66,66,66,57,66,66,66,74,74,74,74,82,99,99,132,107,57,66,57,57,57,57,57,57,57,57,57,57,82,140,173,181,156,99,132,74,66,66,57,57,57,57,57,57,66,57,57,57,57,57,99,123,82,99,181,165,123,107,107,74,57,74,99,132,140,115,115,82,66,57,57,66,66,66,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,82,132,99,132,82,115,173,173,173,173,181,165,148,90,90,66,90,66,66,99,82,132,123,115,107,132,99,66,82,82,107,82,90,66,74,90,107,90,90,66,74,82,66,66,66,66,66,57,57,57,66,66,66,57,66,57,66,57,57,66,66,57,66,66,
66,74,66,74,115,82,90,82,82,74,82,74,74,74,82,74,74,74,66,66,66,66,66,74,74,74,74,74,74,74,74,82,82,74,74,74,74,82,82,82,82,90,82,82,82,90,90,115,90,123,82,148,181,181,181,173,115,57,74,132,107,99,107,90,99,99,99,107,132,115,57,123,115,82,74,74,66,66,66,66,74,66,66,66,66,66,66,74,66,66,66,74,74,74,82,90,90,90,82,74,74,74,74,66,66,66,66,66,66,74,74,74,74,82,90,90,107,132,66,57,57,57,57,66,66,66,57,57,57,57,66,107,123,115,107,82,90,66,57,66,66,57,57,66,57,57,57,57,57,57,57,66,107,107,107,156,181,173,148,90,82,66,57,82,132,132,123,123,107,107,107,123,107,123,90,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,140,82,123,165,173,181,173,173,181,165,115,107,66,74,74,66,82,90,123,132,132,123,107,123,82,74,107,82,66,82,66,74,90,99,107,115,90,74,66,66,66,66,66,57,66,57,57,57,66,57,66,57,66,66,57,57,66,57,57,66,66,
74,74,90,74,74,74,74,82,90,82,82,74,74,82,82,74,74,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,74,74,74,74,82,82,82,82,90,82,82,82,82,90,82,74,115,99,82,156,181,181,181,148,74,57,74,132,115,115,107,107,99,99,99,107,132,90,66,123,132,99,74,82,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,82,90,90,82,82,74,74,74,74,66,66,66,66,74,74,74,74,74,74,82,90,90,90,107,90,57,57,57,57,57,66,66,57,57,57,57,57,66,66,66,74,66,66,57,57,74,99,57,57,57,57,57,57,57,57,57,57,74,123,90,148,181,181,181,132,82,66,57,57,115,140,115,90,74,82,115,90,165,173,173,173,140,57,57,57,57,57,57,57,57,57,57,57,57,66,115,123,123,123,115,90,82,132,148,165,165,173,173,173,181,165,90,82,66,57,57,66,74,99,99,132,132,132,115,123,107,74,74,74,82,82,74,74,90,99,115,82,74,66,66,66,66,57,57,57,66,66,57,57,66,66,57,57,66,66,66,57,57,66,66,66,66,
66,74,74,82,74,74,82,82,82,82,74,74,74,82,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,90,90,90,82,107,74,107,66,115,173,181,181,181,156,57,57,66,132,123,123,123,115,115,99,90,123,140,74,74,132,123,99,74,82,74,66,66,74,74,66,66,66,66,66,66,66,66,66,66,74,74,74,82,90,99,90,82,82,74,74,74,74,66,66,66,74,74,74,74,74,74,82,82,90,90,99,107,74,57,57,57,57,66,57,57,57,57,66,66,66,57,57,74,66,57,66,66,74,90,57,57,57,57,57,57,57,66,57,66,82,99,115,181,165,173,156,115,74,57,57,82,140,123,99,148,123,107,66,123,181,132,99,165,165,57,57,57,57,57,57,57,57,57,57,74,107,132,156,156,156,156,156,148,82,115,148,165,156,165,173,173,173,148,99,74,57,57,57,57,82,99,82,132,132,132,123,115,123,82,74,74,74,74,74,74,99,90,123,90,74,66,66,66,66,66,66,57,57,66,57,57,66,66,66,66,66,66,57,57,57,66,66,66,66,
66,99,99,74,74,74,82,82,74,74,74,74,74,74,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,82,82,82,82,74,82,82,82,82,82,82,82,90,99,123,99,99,57,140,173,173,181,181,148,57,57,57,99,132,132,140,132,123,107,115,132,140,74,82,132,123,99,74,82,74,66,66,66,74,66,66,66,66,66,66,66,66,66,66,66,74,74,82,90,99,99,82,82,82,74,74,82,74,74,74,74,74,66,74,74,74,82,82,115,123,115,123,123,66,66,66,66,57,57,57,57,57,74,74,66,57,57,74,82,74,74,74,66,57,57,57,57,57,57,57,57,57,57,74,99,115,148,173,156,156,123,99,66,57,57,107,140,90,132,173,165,156,148,140,173,99,107,148,148,57,57,57,57,57,57,57,57,57,66,140,148,165,173,165,173,173,173,156,148,156,165,165,165,165,165,90,132,156,107,66,57,57,66,57,57,90,82,107,132,132,132,123,123,107,99,99,82,74,82,82,99,90,132,74,66,66,57,57,57,66,66,57,57,66,57,66,66,57,66,66,66,66,57,57,57,66,66,66,66,
99,82,74,66,82,74,74,74,74,74,74,66,74,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,82,82,82,82,82,99,90,107,99,115,66,82,148,173,181,181,156,140,57,57,57,57,107,132,132,99,115,115,132,132,132,66,107,132,123,90,74,74,74,66,66,74,66,74,74,66,66,66,66,66,66,66,66,66,74,74,82,90,99,90,90,90,82,74,74,74,74,74,74,74,74,74,66,74,74,74,82,99,90,90,123,132,107,115,66,90,74,66,57,57,57,66,66,57,57,57,66,90,90,82,66,66,57,57,57,57,57,57,57,66,57,57,74,99,132,156,165,123,132,107,74,57,57,57,123,140,99,173,173,173,165,140,115,165,148,165,165,156,74,99,57,57,57,57,57,57,90,148,165,173,173,173,173,165,165,165,165,156,165,165,165,165,173,140,57,66,140,115,82,57,57,74,57,57,66,66,90,132,132,132,123,123,115,82,82,90,74,74,90,99,90,115,66,66,66,57,57,66,66,57,57,57,66,66,66,66,57,66,66,66,66,66,66,57,66,74,74,66,
74,66,66,74,74,74,74,74,74,74,66,74,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,82,82,82,82,82,74,82,82,82,82,82,82,90,90,99,99,99,132,90,132,156,181,181,181,173,99,74,74,57,57,66,82,74,66,107,132,132,90,90,57,115,123,123,107,74,82,74,66,66,66,74,74,74,74,66,66,66,66,66,74,74,74,74,74,82,90,90,99,90,90,82,82,74,74,82,82,74,99,74,66,66,74,74,74,82,82,90,90,107,115,123,132,132,90,90,82,66,66,57,57,57,57,57,57,57,66,90,82,57,57,57,66,57,57,57,57,57,66,57,57,66,66,82,156,156,90,107,74,66,57,66,57,99,99,132,173,181,181,173,90,140,107,99,181,173,165,132,156,57,57,57,57,57,90,156,156,156,165,173,181,173,173,173,173,173,165,165,165,165,165,165,107,66,57,99,148,132,57,57,57,57,66,66,66,90,140,132,132,132,123,123,74,82,82,74,82,90,107,82,107,66,57,66,57,57,57,66,74,66,66,66,57,57,57,57,66,66,66,66,66,57,74,74,74,66,74,
66,66,74,74,66,74,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,66,74,74,74,74,74,82,82,82,82,74,82,82,82,82,82,82,82,90,90,90,90,99,99,115,115,82,173,181,189,181,181,181,132,107,66,57,57,57,57,57,66,66,74,74,57,57,57,123,123,123,99,82,82,66,66,66,74,74,74,74,74,74,66,66,66,66,66,66,66,74,74,82,82,90,99,99,90,90,82,82,82,74,74,74,90,74,74,66,74,74,74,74,82,90,99,107,107,115,107,165,173,123,115,82,82,74,66,57,57,57,57,57,57,82,74,57,57,66,115,66,57,57,66,57,66,66,57,57,66,66,148,123,99,123,66,57,57,57,57,66,74,156,173,181,181,165,57,173,82,90,140,181,181,173,165,66,57,57,57,66,140,156,173,173,181,181,173,173,173,173,173,165,173,165,165,165,165,165,107,57,57,74,140,148,57,57,57,66,57,66,66,107,140,132,132,132,123,123,107,82,74,82,82,99,107,90,107,66,57,66,66,57,57,57,57,57,74,66,66,57,57,57,57,57,66,66,66,66,74,66,66,74,74,
74,74,66,66,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,66,66,66,74,74,82,74,82,74,74,74,74,74,82,82,82,82,82,82,90,99,107,115,107,82,123,181,181,189,181,181,156,140,107,66,57,57,57,57,57,57,57,57,57,57,57,57,123,132,123,99,90,74,66,66,66,74,74,74,74,74,74,66,66,66,66,66,66,66,74,82,82,82,90,90,99,90,99,90,82,82,82,74,82,99,74,66,66,74,74,74,74,82,82,90,99,107,123,115,156,165,156,148,107,99,82,74,66,57,57,57,57,57,82,66,57,99,123,132,74,57,57,66,74,107,123,99,90,115,82,132,90,123,123,66,57,57,57,57,57,115,173,173,173,181,140,90,173,82,82,132,181,181,173,165,57,57,57,66,115,156,173,173,181,173,165,173,173,173,173,173,173,165,165,165,165,165,165,148,74,57,82,123,148,82,57,57,82,57,57,57,99,140,132,132,132,123,107,107,74,82,82,82,99,115,99,99,57,57,57,57,57,66,57,57,66,74,66,74,66,66,66,66,57,57,66,66,66,66,74,74,66,66,
74,74,66,66,74,66,66,66,66,66,66,66,90,66,66,66,66,66,66,74,74,66,66,66,66,66,66,74,74,82,74,74,74,74,74,82,82,82,82,82,82,82,82,115,107,115,66,66,123,181,181,181,181,181,173,148,99,66,57,57,57,57,57,57,57,57,57,57,57,57,99,132,123,107,90,74,66,66,66,74,74,74,74,74,74,74,74,66,66,66,66,66,66,74,74,82,90,90,99,99,90,90,90,82,82,82,82,99,90,66,66,66,74,74,74,74,74,82,99,99,123,82,74,165,173,181,156,140,107,82,74,57,57,57,66,66,74,74,66,132,123,123,82,57,74,107,123,107,115,132,140,132,107,90,107,140,123,66,66,57,57,57,49,140,173,181,181,181,156,140,173,107,107,156,173,173,173,165,57,66,66,57,132,173,165,173,173,173,173,173,165,165,173,173,165,173,165,165,165,156,165,165,132,107,140,173,156,74,57,57,57,57,57,66,99,140,140,132,132,123,99,99,99,66,82,82,99,115,99,99,66,57,57,74,57,66,57,66,74,90,90,74,66,66,66,66,57,57,66,66,66,74,66,66,74,66,
66,74,66,82,66,66,66,66,66,66,66,74,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,82,82,82,82,82,90,82,82,82,82,99,123,99,107,57,57,82,173,181,173,181,181,189,156,90,66,57,57,57,57,57,57,57,57,57,57,57,57,66,115,132,115,90,74,66,66,66,74,74,90,90,74,82,74,66,66,66,66,66,74,82,74,74,82,82,90,90,107,99,90,90,90,82,90,90,90,99,74,66,66,74,74,82,90,90,82,82,90,99,107,57,115,173,181,181,173,148,115,90,57,57,57,57,57,74,90,123,123,115,115,123,107,123,123,99,99,107,115,123,123,115,90,132,132,115,66,57,57,57,82,115,165,181,173,181,173,165,173,173,132,156,165,181,165,173,165,66,74,57,99,165,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,165,156,140,115,90,57,57,57,57,57,57,66,132,140,140,132,132,123,99,99,99,99,66,82,99,115,99,90,66,66,66,66,66,57,66,74,82,82,99,82,66,57,57,57,57,57,66,66,90,66,66,66,66,66,
74,66,74,82,66,66,66,66,66,57,66,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,115,115,90,99,66,66,82,173,165,173,181,181,189,173,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,132,123,82,74,66,66,66,74,74,74,74,74,74,74,74,66,66,66,66,66,66,74,74,82,82,90,90,107,99,90,90,90,90,90,99,99,82,74,66,66,74,74,90,90,99,82,82,90,82,132,82,115,173,165,189,189,173,156,107,57,57,57,57,74,123,132,132,115,107,107,107,107,115,107,107,99,99,107,115,115,115,123,107,115,90,57,57,57,74,165,173,173,173,189,173,148,156,181,173,148,173,173,165,173,165,173,115,57,107,165,165,173,173,165,173,173,173,173,173,173,173,173,173,173,165,165,165,156,165,165,173,165,148,165,132,90,57,57,57,57,57,74,140,132,140,132,132,132,90,99,90,107,82,82,99,123,115,82,66,66,66,66,57,57,66,66,66,74,99,82,66,57,57,57,57,57,66,66,74,66,82,82,82,74,
74,82,82,66,66,66,66,66,66,82,66,66,66,66,66,57,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,107,90,115,115,66,115,148,173,181,173,173,181,181,189,99,57,57,57,57,57,57,57,57,57,57,57,57,49,57,66,90,132,90,82,74,66,66,74,74,74,74,82,74,74,82,66,66,66,66,74,74,74,66,74,82,90,90,90,99,99,99,90,90,90,99,99,82,74,66,66,66,74,74,82,82,82,82,82,82,99,132,74,90,123,173,181,189,181,132,57,57,57,66,115,140,132,132,115,107,90,99,107,115,99,99,99,99,99,107,107,115,156,140,82,66,57,57,57,99,181,181,173,173,156,132,123,156,181,165,148,181,173,173,156,165,181,140,90,165,156,165,173,173,173,173,173,173,173,173,173,173,165,165,173,165,165,165,165,165,165,173,181,156,132,165,123,57,57,57,57,57,99,140,132,132,132,123,132,123,82,99,107,90,99,99,123,115,82,74,66,57,57,57,57,57,57,57,66,90,90,74,66,57,57,57,66,66,74,74,82,99,90,99,99,
90,90,99,66,57,66,66,66,57,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,66,74,74,74,74,74,74,74,74,74,74,82,82,82,107,99,132,148,107,99,156,181,189,173,173,181,181,181,181,107,66,57,57,66,57,57,57,57,57,57,57,90,66,57,57,57,99,99,90,82,74,66,74,66,74,74,74,74,74,66,74,66,66,66,74,90,74,74,74,82,82,82,90,99,107,107,99,90,99,99,90,90,74,74,74,66,74,74,82,90,90,82,82,82,82,107,99,99,107,107,140,173,165,165,82,82,123,74,74,132,132,132,123,99,90,99,107,99,90,90,107,107,107,107,90,107,99,107,82,57,57,57,57,115,173,181,181,148,140,132,107,140,165,165,156,173,181,173,165,173,165,148,148,165,156,173,173,181,181,181,181,181,173,173,173,173,173,165,165,173,165,165,165,165,173,181,173,165,107,82,82,66,57,57,57,66,132,140,132,132,123,74,107,140,115,74,66,57,74,90,99,74,82,66,57,57,57,57,57,57,57,66,66,74,82,74,66,57,57,57,57,66,66,82,90,82,82,90,99,
82,90,99,74,66,66,57,66,66,57,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,66,66,74,74,74,74,74,74,74,74,74,82,82,90,99,74,115,156,132,148,181,181,181,173,173,173,173,181,181,140,74,57,57,57,57,57,57,57,57,57,66,115,99,57,57,57,74,123,90,82,82,74,74,74,74,74,74,74,74,74,74,66,66,66,74,74,82,74,82,74,82,90,90,90,99,99,107,99,99,99,90,90,82,74,74,74,66,74,82,107,90,90,90,82,90,115,115,123,123,132,82,82,140,115,90,165,165,99,74,140,132,123,115,90,90,99,90,99,123,123,107,99,107,107,115,123,99,66,57,57,57,57,66,148,173,173,181,165,156,165,140,165,173,181,140,99,156,181,181,181,173,156,165,165,165,173,181,173,181,181,173,173,173,173,173,173,173,165,173,165,173,165,165,173,173,173,173,181,173,115,132,107,57,57,57,57,132,132,132,132,123,66,66,132,140,107,107,82,99,123,82,99,74,66,66,57,57,57,57,57,66,66,74,74,82,82,66,57,57,66,66,66,99,99,82,74,82,90,82,
74,82,82,82,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,82,82,90,90,74,107,148,148,115,173,173,173,181,173,173,173,181,181,140,82,57,57,57,66,57,57,57,57,57,66,57,115,82,57,57,66,123,99,82,82,82,74,74,74,74,74,74,74,74,66,66,66,74,82,74,74,74,74,74,82,82,82,90,90,99,115,107,99,90,90,90,82,82,82,74,66,66,74,90,90,74,74,66,82,115,107,99,115,107,115,107,107,123,148,140,115,74,90,132,123,132,99,82,90,99,82,115,115,123,107,74,90,90,115,115,99,57,57,57,57,57,99,173,173,173,173,173,140,173,181,173,181,173,82,74,115,123,165,165,173,173,165,165,173,181,173,181,181,189,181,173,173,173,173,173,173,181,181,181,173,173,165,165,173,173,173,181,181,173,148,165,57,57,66,57,82,132,132,132,132,66,49,115,123,132,132,123,140,132,57,115,90,74,66,66,66,57,57,66,57,66,74,90,74,74,74,66,66,66,66,66,74,82,66,74,74,82,74,
74,74,74,74,66,66,66,66,66,66,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,66,74,74,74,74,74,74,82,82,82,90,82,66,148,156,173,148,173,181,181,181,173,173,173,181,181,132,74,57,57,57,57,57,57,57,57,57,57,66,99,115,57,57,74,132,99,90,82,82,74,74,74,74,74,74,74,74,74,66,66,66,66,66,74,66,74,74,74,82,82,90,90,99,107,107,99,90,90,90,90,90,82,82,74,66,66,82,107,90,90,99,99,99,82,82,123,99,99,107,123,115,123,115,107,82,99,123,115,90,99,90,90,90,82,115,123,123,107,115,140,123,165,123,82,99,66,66,74,99,148,181,181,165,132,82,66,90,156,173,181,132,57,66,74,57,66,74,140,173,165,173,173,181,189,181,189,189,189,189,173,173,173,173,165,173,173,165,165,165,165,165,165,181,181,181,181,173,165,165,57,57,57,66,57,82,132,140,123,57,66,123,107,123,123,123,115,123,90,107,74,90,66,66,66,57,66,57,57,66,66,90,74,74,74,74,66,66,74,74,82,66,66,82,82,82,74,
74,74,74,74,74,74,74,66,66,66,74,66,66,74,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,66,66,74,74,74,74,74,82,82,82,90,107,66,90,173,173,181,173,173,165,173,173,165,165,173,189,181,148,90,66,57,57,57,57,57,57,57,57,57,57,66,107,74,57,74,123,107,99,82,82,74,74,74,74,66,66,74,74,66,66,66,66,66,66,66,74,74,74,82,82,82,90,90,99,99,123,115,107,107,99,107,115,82,90,82,74,82,82,99,82,74,82,107,57,57,57,132,123,82,99,99,107,107,107,115,132,132,132,82,90,90,99,90,90,107,107,123,123,90,132,165,173,189,173,132,140,107,132,140,156,165,189,173,148,66,57,66,57,90,173,148,66,57,57,57,57,90,82,132,165,165,173,165,181,189,189,189,181,189,189,181,165,165,173,173,173,165,156,156,156,165,173,181,181,181,181,181,173,165,173,74,57,57,90,99,115,132,132,107,57,115,115,107,123,107,115,123,99,82,115,99,74,66,66,66,57,57,57,66,66,66,74,82,74,82,74,74,74,74,66,66,66,66,74,90,74,66,
66,74,74,74,66,74,74,74,66,66,66,74,66,66,74,74,66,66,66,74,74,66,66,74,74,66,66,66,66,66,74,74,74,74,74,74,74,82,82,82,90,57,132,181,173,181,173,181,173,181,173,173,165,173,181,181,148,90,57,57,57,57,57,57,57,57,57,57,57,57,99,115,57,82,90,123,99,90,82,82,74,74,74,82,82,74,74,74,66,66,66,66,66,66,66,66,66,74,74,82,82,90,90,90,107,115,107,115,107,115,99,90,74,66,74,66,74,74,82,66,66,99,57,74,74,107,140,90,115,99,99,99,99,99,107,140,132,123,140,107,107,90,107,107,82,115,115,74,107,181,189,181,189,181,181,173,156,148,181,173,181,181,140,66,66,66,57,57,140,66,57,57,57,57,66,148,132,156,173,165,165,173,181,189,181,181,181,181,181,189,181,165,165,165,165,173,165,165,173,181,181,189,181,181,181,189,181,173,156,57,57,74,123,132,132,132,115,57,57,115,115,123,107,115,99,123,123,90,99,115,82,66,66,66,57,57,66,66,66,66,66,66,74,90,74,66,66,66,74,99,57,66,82,82,74,66,
66,82,66,66,66,66,74,74,66,66,66,74,66,74,66,66,66,66,66,74,66,66,74,74,74,66,66,74,74,74,74,74,74,74,82,82,82,82,90,90,82,57,165,181,181,173,173,181,173,173,181,173,165,173,181,189,148,82,57,57,57,57,57,57,66,57,57,57,57,57,57,107,57,74,82,140,107,99,90,82,74,74,74,74,74,74,66,74,66,74,66,66,66,66,66,74,74,74,74,74,82,74,82,90,107,115,115,115,123,107,90,82,82,74,74,66,66,74,90,74,107,82,57,57,74,115,140,99,132,123,99,99,107,107,90,107,115,107,107,107,107,107,99,115,107,123,115,74,140,181,173,173,181,181,181,165,165,173,173,173,173,140,90,66,66,66,57,66,57,57,57,57,57,57,57,132,165,165,165,173,173,181,189,189,181,189,189,189,189,181,165,181,181,181,165,165,165,165,181,181,181,181,181,181,181,181,181,181,173,99,57,74,115,132,107,132,132,66,90,123,107,99,107,107,90,107,123,99,82,115,82,66,66,66,66,66,66,66,57,66,66,66,66,82,74,66,66,66,57,82,57,66,74,74,66,66,
74,74,66,66,66,66,66,66,66,66,66,66,66,66,66,74,66,74,74,66,66,66,66,74,74,74,66,57,66,66,66,74,66,74,82,82,82,82,82,99,107,99,181,181,181,181,173,181,181,173,181,173,165,181,181,181,140,82,57,57,57,57,57,57,57,57,57,57,57,57,57,82,57,66,57,115,132,99,99,90,82,82,74,74,74,74,74,66,66,74,74,66,66,66,74,82,74,74,74,74,74,82,82,90,107,115,115,107,115,99,90,90,82,74,74,74,66,66,82,82,90,99,66,57,90,107,156,107,123,123,107,107,99,115,82,107,90,90,99,107,107,115,115,99,115,132,107,74,115,165,156,165,173,181,181,173,173,173,181,173,165,99,57,57,66,66,66,57,57,57,57,57,57,57,66,115,165,181,173,173,173,156,173,181,189,189,189,181,181,165,140,132,165,181,189,189,181,189,189,181,181,173,181,189,181,181,181,181,181,165,74,57,66,123,90,82,99,57,99,107,107,99,107,115,123,99,115,99,90,115,82,66,74,66,66,66,66,66,66,66,66,66,66,74,74,74,66,66,57,74,57,74,74,66,66,66,
66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,82,82,74,82,82,82,82,82,82,90,82,82,82,82,82,99,99,132,132,181,173,181,181,181,181,181,165,173,173,173,181,189,181,140,99,66,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,90,132,132,132,123,99,82,74,74,74,74,74,66,74,74,66,74,74,82,82,82,74,74,74,74,74,74,82,82,99,107,115,107,107,99,90,82,82,74,74,74,74,74,74,74,82,115,90,115,140,115,173,165,115,115,123,107,107,107,82,107,90,90,99,90,82,115,132,115,90,115,107,90,99,99,156,181,148,148,165,165,173,173,173,173,173,74,74,66,66,66,57,57,57,57,57,57,57,57,74,115,57,99,99,148,173,165,165,165,181,189,181,173,165,156,148,140,132,165,173,189,181,181,181,189,189,181,181,181,189,181,181,189,181,165,115,66,66,74,115,66,57,82,148,107,99,90,99,123,115,107,107,99,90,123,90,66,66,66,66,66,66,66,66,66,66,66,66,66,74,66,66,66,74,66,66,82,74,66,66,66,
66,66,66,66,66,66,66,66,66,74,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,82,90,90,99,99,99,99,107,148,165,181,181,181,173,173,181,181,181,173,173,181,173,181,181,156,107,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,99,123,132,140,123,90,82,74,74,74,74,74,74,74,74,74,90,90,90,82,74,74,74,74,74,74,82,90,90,107,107,107,107,99,90,90,90,82,74,66,74,74,74,74,82,107,90,107,148,165,165,115,74,90,99,107,107,107,107,115,107,99,82,82,115,115,132,115,74,99,66,74,99,107,115,165,148,123,123,140,140,165,173,165,90,90,132,66,66,66,66,57,57,57,57,57,57,57,57,66,57,123,132,123,165,173,165,165,173,181,173,165,156,156,165,181,165,173,181,173,173,181,181,189,181,181,173,181,181,181,173,173,181,173,165,115,99,66,66,57,74,82,165,156,99,90,90,90,90,90,90,107,115,115,74,82,74,66,66,66,66,66,66,66,66,66,66,66,74,66,66,66,74,90,74,74,66,66,66,74,
74,66,66,66,57,66,66,66,66,66,66,74,66,66,74,74,66,74,74,74,74,74,74,74,74,74,74,74,82,82,82,90,82,90,90,99,99,99,99,115,156,181,181,181,181,181,181,173,181,173,173,173,173,181,189,189,165,115,66,57,57,57,57,57,57,57,57,57,57,57,57,66,74,66,66,57,49,74,132,132,140,107,90,82,74,74,74,74,74,74,74,82,90,90,82,74,74,74,74,74,74,82,82,82,90,99,107,107,99,99,90,82,90,90,74,66,66,66,66,82,99,99,107,132,123,165,148,57,82,90,107,99,107,107,115,123,90,107,107,115,132,115,132,99,140,140,49,66,132,123,123,148,140,132,123,115,115,115,156,156,107,156,82,66,66,66,57,57,57,57,57,57,57,57,57,57,57,123,165,165,173,173,181,173,156,148,173,165,156,181,189,165,181,173,165,181,173,181,181,173,173,181,173,181,181,181,189,181,181,181,181,173,132,74,49,57,66,82,140,173,90,99,90,90,90,90,99,99,123,107,99,66,82,74,66,66,66,66,66,66,66,66,66,66,74,74,66,66,66,74,66,74,66,66,66,74,
74,66,66,82,66,66,66,66,66,66,66,66,66,66,74,74,66,66,74,74,74,74,74,74,74,74,74,82,82,82,82,90,90,90,90,99,99,99,99,107,123,181,181,181,189,181,189,189,173,173,173,181,181,181,189,189,156,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,66,66,57,82,132,132,132,132,107,99,82,74,74,74,82,74,82,90,90,90,82,74,74,74,74,74,82,82,82,82,90,99,107,107,99,90,90,90,82,82,82,74,74,74,74,90,107,99,90,156,156,148,90,132,156,140,107,99,99,99,123,115,66,123,132,132,107,123,123,123,132,99,66,74,123,107,107,115,123,115,115,115,107,90,123,165,173,148,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,99,181,181,165,173,165,173,181,189,165,165,173,156,148,99,107,82,115,173,189,189,181,173,181,181,181,173,181,189,189,189,189,181,181,181,123,66,57,57,57,66,99,132,74,99,82,82,90,90,90,107,90,82,107,82,66,107,74,74,66,66,66,66,66,66,66,66,74,74,66,66,74,82,66,74,66,66,66,66,
66,66,82,82,66,74,66,66,66,66,66,66,66,66,66,66,66,66,74,66,74,74,74,74,82,82,82,82,82,82,90,90,90,90,90,90,99,99,99,107,107,181,181,181,173,165,165,181,173,165,173,181,181,189,181,165,123,82,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,66,66,66,132,140,132,132,140,132,115,90,82,82,82,74,82,115,132,99,82,74,74,74,74,74,82,82,90,90,90,99,99,107,99,90,90,90,90,82,82,82,74,66,66,107,99,115,74,123,132,115,99,90,90,74,99,99,74,99,123,90,66,99,132,115,107,173,148,90,107,74,66,66,107,107,107,115,115,107,115,107,115,148,181,107,90,74,66,66,57,57,57,57,57,57,57,57,57,57,57,57,66,99,74,90,90,156,156,173,173,173,173,173,156,173,156,123,123,132,165,156,173,173,173,173,173,173,181,181,173,173,181,181,181,189,189,181,115,57,57,57,57,57,74,90,74,74,74,82,82,90,90,107,82,99,57,107,82,90,107,74,74,66,66,66,66,66,66,66,66,66,74,74,74,74,66,66,66,66,66,66,
66,66,66,74,74,74,66,66,66,66,66,66,66,66,66,66,74,66,66,66,74,74,74,74,74,82,82,82,82,82,82,90,90,90,90,90,99,99,99,115,74,181,181,173,156,165,173,173,181,173,181,181,181,181,165,132,82,66,57,66,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,74,66,66,82,123,132,74,123,132,132,132,99,82,82,82,115,132,132,99,82,82,82,74,74,66,82,90,90,90,90,90,99,107,99,99,90,99,90,82,74,90,82,82,82,74,82,132,140,140,140,123,132,57,49,66,90,66,123,99,107,90,82,123,132,99,140,132,82,74,57,57,57,57,107,123,115,107,99,107,115,90,140,165,123,57,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,90,66,57,66,90,132,82,123,107,123,156,165,173,148,132,156,181,181,156,115,173,173,165,181,181,181,181,181,181,156,173,181,181,181,181,181,140,57,57,57,57,57,74,90,90,57,66,90,82,90,90,115,107,82,90,115,123,82,107,107,74,66,66,66,66,66,66,66,66,66,74,66,66,74,66,74,74,66,66,66,
66,66,66,66,74,66,66,74,66,66,66,66,66,66,74,66,66,66,74,74,66,66,74,74,74,74,82,82,82,82,82,90,90,90,90,99,99,99,99,115,66,165,165,181,173,173,173,173,173,173,181,181,189,189,165,115,74,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,66,82,57,74,115,82,82,107,132,132,132,123,90,107,132,132,132,107,82,82,74,74,74,82,90,82,90,90,90,90,99,107,99,99,99,99,90,82,74,74,82,66,74,74,74,90,82,82,82,90,123,66,57,74,156,99,173,99,90,82,74,132,115,107,90,66,57,74,57,57,57,57,82,132,123,107,82,107,99,66,66,66,57,57,66,57,66,66,57,57,66,57,66,57,66,57,57,57,57,66,57,57,57,57,66,57,66,140,165,165,115,90,66,66,74,90,148,165,132,165,181,173,173,173,173,181,181,181,189,173,165,181,181,181,173,189,173,90,57,57,57,57,57,90,66,66,57,74,99,99,107,123,115,90,132,123,123,115,66,99,115,66,66,66,66,66,66,66,66,66,66,66,82,82,66,74,66,57,66,66,
66,66,66,66,66,74,66,66,66,74,66,66,74,74,74,66,74,66,74,66,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,99,99,99,99,123,57,123,107,148,173,173,181,173,181,181,181,189,181,181,165,123,82,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,74,66,57,66,90,74,66,99,132,132,132,132,132,132,132,132,115,90,82,74,74,82,90,82,82,82,82,90,90,99,107,107,99,99,90,90,82,82,82,82,82,90,82,82,74,74,74,74,90,140,74,57,99,140,82,148,99,57,66,66,107,99,57,57,57,57,74,123,115,107,57,57,123,140,99,66,107,99,57,57,57,57,57,57,66,66,66,66,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,74,132,173,132,140,74,57,90,165,173,181,173,173,165,181,181,189,181,181,181,181,181,181,173,181,181,181,165,165,173,123,57,57,57,57,57,74,66,57,57,66,99,90,107,123,115,123,132,99,115,123,115,66,107,99,74,74,74,66,66,66,57,57,66,66,66,74,57,74,66,66,66,66,
66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,99,107,99,99,107,123,66,123,82,66,148,165,181,181,181,181,181,173,165,165,156,115,82,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,90,107,90,115,132,132,132,132,132,132,140,132,107,90,74,74,74,82,82,82,82,82,82,90,99,99,99,99,99,90,82,74,82,82,82,74,74,74,74,74,74,74,74,123,140,66,57,82,74,66,132,165,123,148,123,90,82,57,57,57,57,66,90,74,123,49,57,90,123,82,66,132,132,66,57,57,57,57,57,57,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,99,99,148,107,74,99,165,181,165,173,189,173,173,173,165,173,181,181,181,181,181,181,181,181,181,165,173,173,140,66,57,57,57,57,57,57,57,57,57,107,115,107,123,123,123,115,90,99,107,123,115,82,99,82,74,74,66,66,66,66,57,66,66,90,66,66,66,66,66,66,57,
66,66,66,66,66,66,66,66,66,74,66,74,74,74,74,74,74,66,66,74,66,74,74,74,74,74,82,82,82,82,82,82,90,90,99,107,99,99,107,115,57,148,99,57,107,165,181,181,181,181,181,165,148,140,140,107,74,74,57,57,57,57,57,57,66,57,66,57,57,57,57,57,57,57,57,57,49,66,57,57,57,66,123,132,115,132,132,132,115,115,115,132,132,132,123,132,107,82,82,82,82,82,82,82,82,90,90,99,107,99,99,82,82,74,82,82,82,74,82,82,74,74,74,74,107,140,107,57,57,57,57,57,115,148,173,173,173,156,123,57,57,57,57,57,99,82,132,57,57,57,74,57,57,74,107,82,66,57,57,57,57,57,57,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,66,74,57,57,57,66,57,57,90,140,165,148,90,156,156,173,181,173,173,173,173,165,181,181,181,181,181,181,181,181,181,165,123,132,165,165,82,57,57,57,57,66,57,57,57,57,66,132,99,115,123,82,107,90,90,90,99,115,99,74,90,74,74,66,66,66,66,57,57,82,82,74,66,57,66,66,66,66,
66,66,66,66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,99,99,99,107,107,107,82,115,123,82,115,173,181,173,189,181,173,140,132,123,115,90,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,115,74,57,57,82,132,140,132,132,107,99,90,90,107,132,132,132,123,132,132,99,82,74,82,82,82,82,82,90,90,90,99,99,90,90,82,82,82,82,74,74,74,74,74,82,74,99,132,115,66,57,57,57,57,57,74,90,99,156,156,156,156,82,57,57,57,57,66,132,107,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,74,115,90,74,74,90,66,132,156,140,132,123,99,165,173,181,189,181,173,165,173,173,181,189,189,181,173,173,181,181,181,148,99,99,132,181,107,57,57,57,57,66,66,57,57,66,57,140,90,123,123,99,107,90,90,90,90,99,123,90,82,82,74,74,66,66,66,57,57,74,99,66,66,66,57,66,66,66,
66,66,66,66,66,66,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,74,82,82,82,82,82,82,82,82,90,99,99,99,107,99,115,99,107,123,148,123,132,165,181,181,181,165,165,123,123,99,99,99,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,66,57,82,74,74,57,82,123,132,132,123,74,57,57,66,123,132,132,140,132,132,132,90,74,74,74,82,82,82,82,90,99,99,107,99,90,82,82,82,82,82,74,74,82,82,82,99,123,132,123,66,66,57,57,57,57,57,74,82,99,82,66,74,90,74,57,57,57,57,74,132,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,115,123,132,115,115,132,132,99,66,90,107,156,173,173,189,189,181,173,181,181,173,173,181,181,181,173,181,181,181,165,123,99,82,115,165,140,57,57,57,57,57,57,49,57,57,57,107,132,107,123,107,132,115,99,90,90,90,107,115,66,99,66,66,66,66,66,66,57,74,82,57,66,66,74,66,66,66,
66,66,66,66,66,66,66,74,66,74,74,74,74,74,74,74,74,74,74,74,74,74,82,74,82,82,82,82,82,90,82,82,90,99,99,99,107,99,115,90,90,132,165,165,156,165,173,181,181,165,156,140,140,115,90,74,66,66,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,66,57,66,66,99,90,74,115,115,132,140,90,57,57,66,132,132,132,115,107,123,115,90,82,82,74,82,82,82,82,90,90,99,99,90,90,82,82,82,82,82,74,74,82,107,115,132,132,132,123,107,107,57,57,57,57,57,57,57,66,57,57,90,82,57,57,99,107,57,107,74,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,82,140,165,156,140,99,99,107,99,173,181,165,173,181,173,189,181,181,173,173,181,181,181,173,173,181,181,181,181,165,132,115,82,99,123,148,74,57,57,57,66,57,66,57,57,66,90,140,90,123,90,123,123,115,115,115,99,90,123,107,66,90,66,66,66,57,66,57,82,74,66,74,66,74,66,66,66,
82,82,74,74,74,74,74,66,66,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,82,90,90,90,90,99,99,107,107,107,107,99,132,140,173,165,165,165,173,181,156,165,173,148,123,107,82,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,115,132,107,99,132,132,123,66,90,115,132,132,123,107,99,99,99,82,82,82,82,82,82,82,82,90,99,99,99,90,90,82,82,82,82,74,74,74,99,123,132,132,132,132,140,140,123,115,74,57,57,57,57,57,57,57,66,66,66,66,66,90,99,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,66,57,57,66,99,115,132,82,57,57,99,115,156,165,173,173,173,181,173,189,173,173,173,181,181,173,165,148,173,181,173,173,165,115,99,115,90,115,148,82,57,57,57,57,57,74,82,74,57,57,107,82,123,66,107,132,115,123,123,115,107,115,123,82,82,74,66,66,66,66,66,82,66,66,74,74,74,74,74,74,
90,90,90,99,90,82,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,82,90,90,90,90,90,90,90,99,107,107,90,99,123,156,156,173,148,173,173,181,173,132,123,123,123,99,82,90,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,66,66,90,90,82,82,99,132,74,123,132,132,132,123,107,99,99,82,82,82,82,82,82,90,82,90,90,99,99,99,90,90,82,82,82,82,74,74,74,99,115,132,132,132,132,107,115,132,132,132,66,57,57,66,57,57,66,74,74,57,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,82,74,57,57,57,66,156,181,181,181,165,173,156,148,181,173,173,165,173,181,173,173,123,148,173,181,181,165,123,107,132,90,115,156,99,57,57,57,57,57,66,90,132,90,57,90,82,123,66,115,132,123,123,123,123,115,115,123,123,74,82,66,66,66,66,74,90,74,82,74,74,74,90,90,90,
66,66,74,66,74,74,90,99,82,74,74,74,74,74,74,74,74,74,74,74,74,74,82,82,82,82,90,90,90,90,90,90,90,99,99,107,132,99,123,156,181,173,156,148,173,173,181,165,123,115,99,99,82,74,82,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,74,82,74,74,82,66,57,57,57,107,99,115,132,132,132,123,107,107,90,82,82,82,82,82,82,82,82,90,90,90,99,90,82,90,90,90,90,82,74,82,99,107,107,132,132,132,132,123,74,66,74,90,107,66,57,57,66,57,57,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,74,156,181,173,181,173,189,173,165,173,189,181,181,173,165,181,173,132,132,165,181,181,165,132,123,165,115,132,165,140,74,57,57,57,57,99,90,148,90,57,82,74,123,74,123,123,123,115,115,115,123,123,123,115,115,74,82,66,66,66,74,90,74,74,74,99,82,74,66,66,
132,123,107,82,74,74,74,66,82,90,82,74,82,74,74,74,74,74,82,74,74,74,74,82,82,90,90,90,90,90,90,90,90,99,99,123,123,115,165,181,181,173,173,173,173,181,181,156,140,123,107,82,74,74,74,66,74,57,57,57,57,57,57,57,57,57,57,57,57,66,90,115,57,57,57,57,74,82,66,82,90,90,82,66,57,57,57,74,115,132,132,132,123,99,90,82,82,82,82,90,90,90,90,90,90,90,107,99,90,90,90,90,99,82,82,74,74,115,123,115,115,82,115,140,115,66,57,57,74,132,115,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,90,123,132,156,189,165,165,156,156,173,181,173,173,173,156,99,123,132,148,156,173,148,132,107,140,140,115,148,156,99,66,57,57,57,99,99,148,66,57,66,49,99,66,132,123,115,115,123,123,123,123,123,90,107,90,82,66,66,74,90,99,82,90,90,57,82,82,107,115,
107,99,115,132,132,132,107,90,74,66,82,90,82,82,74,74,82,82,74,82,82,82,90,82,82,90,90,90,90,90,90,90,99,99,107,132,99,115,173,181,173,156,173,165,173,181,181,148,123,107,99,82,66,74,74,74,66,57,57,57,57,66,57,57,57,57,57,57,57,66,132,132,66,57,57,57,74,90,82,90,74,82,74,66,57,57,57,57,107,132,132,132,99,90,90,82,82,82,90,99,90,90,90,90,82,99,90,90,90,90,90,90,90,82,82,82,90,123,123,132,123,66,66,99,123,66,57,57,57,123,140,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,107,156,156,173,173,173,189,181,181,173,165,90,90,90,123,148,165,181,165,165,115,107,115,99,132,123,74,57,57,57,57,66,156,173,74,66,66,57,82,74,132,115,115,123,123,123,123,132,132,66,99,90,66,74,74,74,90,90,90,74,74,107,123,132,132,132,
107,90,90,90,107,123,132,140,107,82,66,66,74,90,82,82,82,82,82,74,82,82,82,82,82,82,90,90,90,90,90,90,99,90,115,115,99,156,173,181,148,181,173,173,189,181,148,123,107,99,82,90,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,66,57,82,115,123,57,57,57,66,66,74,82,90,82,74,66,57,57,66,57,66,107,132,132,115,99,90,82,82,82,90,82,82,82,90,90,99,99,99,90,90,90,90,90,90,82,99,99,82,90,123,132,132,132,74,57,82,123,82,57,66,107,132,140,123,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,132,90,99,132,173,173,173,181,173,90,66,115,140,74,140,181,181,181,181,148,140,107,90,82,74,57,57,57,57,57,74,115,173,90,57,57,57,99,74,132,115,115,123,115,123,123,132,132,66,90,99,90,90,82,90,82,82,66,115,123,107,90,82,90,107,
115,90,90,90,90,99,107,115,123,123,123,99,82,66,57,66,82,82,82,74,74,74,82,82,82,99,82,90,90,90,90,99,99,99,115,99,115,173,165,165,148,156,173,181,181,165,115,99,99,90,82,74,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,140,123,57,57,57,57,57,66,74,82,82,66,57,66,57,74,66,99,132,132,132,107,90,90,90,90,90,90,90,90,99,99,107,107,99,99,99,90,90,90,90,90,90,107,99,107,99,115,140,140,123,66,57,82,132,123,57,66,140,132,140,140,132,115,74,66,66,66,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,156,90,57,82,165,181,181,173,107,66,74,148,123,132,90,148,181,173,165,165,181,148,107,82,57,66,66,74,66,90,90,74,148,74,90,99,82,132,107,123,115,115,115,123,123,132,132,115,99,107,90,90,74,99,90,82,66,107,99,90,82,82,82,90,99,
99,90,90,90,90,90,107,115,123,115,132,107,132,132,115,90,57,66,82,74,82,107,99,82,82,90,90,90,90,90,99,99,107,123,132,107,132,156,156,148,140,165,181,165,156,156,115,99,90,82,74,57,74,66,57,57,57,57,57,57,57,66,57,57,57,57,57,57,66,99,140,107,57,57,57,57,57,66,74,82,82,66,66,57,57,66,74,123,132,132,115,99,90,90,90,90,90,90,90,90,99,99,107,107,99,99,99,99,99,99,99,90,90,107,115,99,107,99,99,115,132,115,66,66,123,90,57,99,140,140,140,140,140,140,82,107,115,115,140,115,74,107,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,107,66,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,66,57,90,123,74,74,123,165,173,165,115,66,74,90,115,140,148,90,140,173,181,156,156,165,156,140,140,115,115,107,66,57,66,115,99,66,90,115,123,123,132,123,123,115,115,123,123,132,132,132,107,90,107,99,90,90,66,82,82,107,99,90,90,90,90,82,90,123,
90,90,90,90,90,90,99,99,107,132,132,123,107,107,132,132,123,90,66,90,90,82,82,82,82,90,90,90,99,99,99,99,123,90,99,107,140,140,156,165,165,181,156,107,99,123,115,90,99,99,82,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,90,99,123,132,132,107,66,57,57,57,66,66,66,74,66,66,66,57,99,132,140,140,132,115,99,90,90,90,90,90,90,90,99,99,107,107,107,99,99,99,99,99,90,99,99,90,107,115,123,99,99,99,99,123,140,99,107,90,57,66,132,132,140,140,140,132,132,74,99,99,115,123,140,132,140,132,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,82,57,66,90,82,74,99,66,57,66,82,123,132,107,115,165,173,181,173,156,156,165,115,107,123,107,90,82,90,132,173,148,107,107,115,132,132,132,132,123,123,123,123,132,132,132,132,99,82,115,74,115,99,57,74,132,99,90,90,90,90,90,115,123,99,
90,90,90,90,90,90,90,107,132,132,140,132,123,107,90,115,140,132,115,66,74,82,82,82,82,90,90,90,90,99,99,107,123,82,99,140,123,156,173,165,165,132,115,99,82,107,99,82,90,74,66,57,57,57,57,57,57,57,57,57,57,66,57,57,57,74,115,132,140,140,132,115,132,82,57,57,57,57,66,57,57,66,66,66,90,132,132,123,107,99,99,90,90,90,99,99,90,90,99,99,99,99,107,107,107,99,99,99,99,90,99,107,115,115,115,123,132,107,99,99,107,132,140,123,66,66,107,132,140,132,132,140,132,123,57,107,99,66,107,132,140,132,132,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,66,107,132,90,148,140,132,173,165,148,173,173,156,123,132,156,156,156,165,173,173,181,156,123,107,132,132,132,132,123,132,132,132,132,132,132,132,107,66,148,82,107,82,82,107,90,82,82,90,90,90,90,90,90,90,
90,90,90,90,90,115,132,132,132,132,140,140,140,132,107,82,115,132,123,123,74,66,82,90,90,90,99,90,90,99,107,115,99,90,132,165,173,173,173,165,181,132,115,123,82,99,82,74,66,66,57,57,66,57,57,57,57,57,66,57,57,57,66,57,74,115,140,140,132,132,132,123,132,99,57,57,57,57,57,57,57,57,66,66,107,132,132,115,99,99,90,90,90,90,90,90,90,90,90,99,99,107,107,107,107,107,99,99,99,99,99,107,115,115,115,123,132,132,107,99,107,123,132,115,66,66,115,132,132,132,132,140,140,123,57,99,132,57,57,82,132,132,132,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,66,82,99,66,156,181,156,173,156,140,173,181,156,132,173,165,165,165,165,148,156,148,115,90,132,115,132,132,132,132,132,132,132,132,132,132,123,123,57,82,123,66,74,99,90,90,82,90,99,82,90,90,90,90,90,
90,90,90,90,123,132,132,132,132,140,140,140,140,132,140,99,74,123,90,115,123,90,74,82,90,90,90,90,90,99,99,99,99,132,156,173,173,181,173,173,173,140,132,132,74,82,74,99,66,66,66,66,66,57,57,57,57,57,57,57,66,57,107,107,132,140,140,132,132,132,140,132,140,90,57,57,57,57,57,57,57,57,82,66,123,132,115,107,99,99,90,90,90,90,90,90,90,90,99,99,99,107,107,115,107,107,107,99,99,99,99,99,107,115,115,115,123,132,123,107,115,123,123,107,66,74,90,132,132,140,132,132,140,132,115,107,99,57,57,74,132,115,132,90,107,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,66,74,57,99,165,132,156,156,148,173,173,165,148,165,140,156,173,156,132,140,132,99,82,115,107,115,132,132,132,132,132,132,132,132,132,123,132,99,66,82,74,74,99,90,82,90,107,115,90,90,90,90,90,90,
90,90,90,99,132,132,132,132,140,140,140,140,132,132,132,132,66,90,115,99,140,123,107,74,90,90,90,90,90,99,115,90,99,156,156,173,181,173,181,173,132,82,82,82,57,74,57,82,74,66,66,66,57,57,66,57,66,57,57,57,57,66,132,140,140,140,132,132,132,132,140,132,123,66,57,57,57,57,57,66,57,57,90,90,132,132,107,99,99,90,90,90,90,90,99,99,90,90,90,99,99,99,99,107,115,107,107,107,99,99,99,99,99,115,123,123,123,132,132,115,107,132,132,115,82,99,132,132,132,132,132,132,107,90,132,132,74,66,57,66,132,132,132,123,132,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,66,66,66,57,74,107,123,132,156,156,132,123,123,123,123,181,156,148,140,123,90,82,66,90,132,99,123,132,132,132,132,132,132,132,132,132,132,123,90,66,90,107,107,90,90,90,99,123,99,90,90,90,90,90,
90,99,115,123,132,132,132,132,140,140,140,132,132,99,99,90,66,74,99,132,132,132,123,90,82,90,90,82,115,123,123,99,148,156,173,181,189,173,173,156,82,66,66,66,57,90,90,57,57,57,66,66,57,57,57,57,57,57,57,57,66,107,140,140,132,132,132,140,132,132,132,140,82,57,57,57,57,57,66,107,115,66,107,123,132,123,107,99,99,90,90,90,90,90,99,107,115,99,99,99,99,99,99,107,115,115,115,107,107,99,99,99,99,99,123,123,123,123,115,115,107,123,140,132,123,107,132,132,132,132,132,132,99,90,74,123,57,57,57,66,99,132,132,123,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,74,66,57,57,57,66,132,165,140,99,74,66,66,99,74,107,90,74,66,66,74,66,74,107,107,90,82,132,132,132,132,132,132,123,123,123,132,132,132,82,99,90,99,82,74,82,99,123,90,90,90,90,90,90,
90,132,132,132,132,140,140,140,132,132,140,132,132,66,66,57,57,57,82,132,99,123,132,123,107,90,99,123,115,107,156,140,165,165,173,181,156,132,165,99,57,74,66,74,66,99,107,57,57,57,57,57,57,57,57,57,57,57,57,57,90,140,140,132,132,132,132,132,132,132,132,132,115,57,57,57,57,66,90,132,132,90,99,132,132,115,99,99,99,90,90,90,90,90,99,99,107,107,99,99,99,99,99,107,107,115,115,107,107,107,107,99,99,99,107,123,123,123,123,115,115,115,123,132,140,132,132,132,132,132,132,115,115,140,74,74,57,57,57,57,57,115,132,132,132,99,90,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,66,57,57,57,57,57,66,66,57,57,57,57,82,132,140,90,66,57,49,74,66,57,66,57,57,57,57,66,57,107,99,107,66,74,82,90,82,90,115,90,57,82,132,132,132,132,90,74,115,123,107,90,107,123,99,90,90,90,90,90,
107,132,140,140,132,132,140,140,132,99,115,74,74,66,90,57,57,66,107,115,90,123,107,123,115,99,115,115,123,148,165,173,148,173,181,165,132,148,156,115,66,66,66,74,82,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,82,140,132,132,132,132,132,132,132,132,132,132,123,57,57,57,57,57,107,123,132,115,115,132,132,115,99,99,99,99,99,90,99,90,107,123,90,115,107,107,99,99,99,99,107,107,115,115,115,107,107,107,99,99,99,99,107,115,123,123,115,115,123,123,132,140,132,132,140,132,132,115,123,173,115,57,57,57,57,57,57,115,123,115,82,90,107,132,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,57,57,57,57,66,66,66,66,57,49,57,57,57,57,99,132,123,99,74,99,66,66,57,82,90,99,82,115,132,132,132,123,74,82,82,90,99,90,82,90,90,90,90,90,90,
123,132,132,140,140,140,140,140,140,132,99,74,57,57,74,66,66,66,115,132,90,107,107,107,123,132,148,173,173,173,165,165,165,181,181,165,165,173,173,156,66,74,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,132,132,132,132,132,132,140,132,132,132,132,99,57,57,57,57,74,107,132,132,123,132,132,123,107,107,99,99,99,99,90,99,115,99,90,132,99,123,107,99,99,99,99,99,107,115,123,115,107,107,107,99,107,107,107,107,115,115,132,132,132,123,132,123,132,140,132,132,132,132,107,123,173,140,82,66,57,57,57,107,132,140,82,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,132,156,156,148,123,140,107,140,140,148,165,148,140,99,123,132,123,99,123,66,66,57,66,66,74,90,115,99,90,90,115,
132,132,140,140,140,140,140,140,140,132,66,57,57,57,57,66,57,57,148,156,66,82,132,156,148,140,156,173,181,181,189,156,165,173,173,189,173,173,165,148,74,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,66,57,57,107,140,140,132,132,132,132,132,140,132,123,107,57,57,57,74,132,132,132,123,115,132,132,123,107,107,99,99,99,99,99,115,107,173,148,173,123,123,107,99,99,99,99,99,107,115,115,123,115,115,115,107,107,107,107,107,107,115,115,123,132,123,132,123,115,132,132,132,132,132,107,123,165,173,123,107,82,66,49,115,140,140,74,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,132,173,173,173,165,181,173,165,148,140,140,123,123,132,90,107,107,74,90,99,49,66,74,90,99,90,90,123,115,115,132,
132,132,132,140,140,140,140,140,140,132,90,57,57,57,57,57,66,66,132,148,66,99,173,156,99,165,181,156,132,173,173,140,165,173,173,181,181,173,173,148,57,57,82,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,123,132,140,132,132,132,115,115,132,115,107,82,99,90,123,132,123,99,90,115,123,132,132,115,107,99,99,99,99,99,107,148,173,173,173,140,132,115,107,99,99,99,99,107,107,115,115,123,115,115,115,115,107,107,107,107,115,123,123,132,132,123,132,123,115,132,132,132,132,123,107,156,165,148,140,107,66,57,90,132,140,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,57,57,57,57,57,57,99,156,173,173,181,181,181,148,140,123,99,99,82,132,115,107,66,57,66,107,66,57,66,132,148,74,66,74,90,115,115,
132,140,140,132,140,140,132,115,140,140,123,82,74,57,57,57,66,57,57,99,156,123,156,165,148,156,123,107,132,132,132,140,165,173,173,181,181,181,173,107,57,57,57,57,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,74,115,140,132,132,123,123,107,132,132,115,123,132,132,132,82,66,82,99,90,132,132,123,123,115,107,99,107,99,123,99,181,173,173,173,148,115,115,107,107,99,99,99,99,107,107,115,115,123,115,115,115,107,107,107,115,123,123,132,132,132,132,132,123,123,123,123,132,132,140,132,107,115,99,132,107,57,57,57,115,132,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,74,57,66,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,173,173,181,173,173,173,156,156,99,99,66,66,107,123,156,115,82,74,66,57,57,57,74,90,66,57,66,74,57,99,
132,132,140,140,140,132,107,123,140,140,140,140,123,99,57,57,57,57,66,57,82,156,156,165,148,123,115,140,123,123,132,140,140,165,173,189,181,181,132,66,74,57,57,66,57,57,57,57,66,66,57,57,57,57,66,57,57,57,57,57,66,66,66,82,132,132,107,66,107,99,90,132,123,123,132,132,115,66,66,82,90,82,115,132,132,123,123,107,115,115,123,107,140,181,173,173,173,165,99,132,123,115,107,99,99,99,107,115,115,123,132,123,115,99,90,99,123,115,123,132,132,132,123,123,107,107,107,115,115,123,123,123,132,132,107,74,82,82,57,57,57,66,99,132,74,57,57,57,57,57,57,57,57,57,82,57,66,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,99,107,132,181,189,165,156,181,181,181,181,115,90,66,66,82,99,148,140,99,115,82,82,66,57,57,66,57,57,57,57,57,123,
132,140,132,132,99,123,140,132,140,132,107,115,115,99,66,57,57,57,57,66,57,57,74,66,74,156,165,140,123,156,173,173,173,173,173,173,181,165,90,66,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,90,107,57,57,74,132,132,115,82,107,99,66,57,57,66,90,107,140,132,132,132,123,123,123,123,132,90,107,189,173,173,173,181,148,123,132,123,123,107,107,99,107,115,123,132,132,132,82,74,90,148,140,115,132,132,132,132,115,99,90,99,99,107,107,115,107,115,132,132,132,107,66,90,82,57,57,57,57,123,123,74,57,57,57,57,57,57,66,115,107,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,82,49,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,74,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,115,132,148,165,181,148,165,173,173,156,148,165,165,181,132,82,66,66,49,57,74,115,132,90,123,107,74,82,74,57,57,57,57,66,66,99,132,
123,132,132,74,57,99,132,132,140,99,57,57,66,66,66,57,57,57,74,57,57,66,57,66,115,148,107,107,173,181,165,165,156,173,165,165,148,99,57,57,57,66,57,57,57,57,66,57,57,57,66,57,57,57,57,66,57,57,57,57,57,57,57,57,66,74,107,66,90,123,132,132,115,66,74,57,57,57,57,57,99,123,90,132,132,132,132,123,123,132,115,74,132,181,181,173,181,181,165,115,123,132,132,123,107,99,107,115,123,132,132,107,66,82,115,140,107,90,123,132,132,115,107,99,99,99,99,99,107,99,115,123,132,140,132,132,90,90,123,74,57,57,57,115,132,115,57,57,57,57,57,57,82,123,99,132,90,57,57,57,57,57,57,57,57,57,57,57,57,66,115,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,74,90,74,57,57,74,74,66,57,66,66,57,57,57,57,57,57,57,57,57,57,57,90,173,173,156,156,165,140,173,173,173,173,156,173,181,132,140,74,57,57,57,57,57,74,74,66,140,132,132,99,57,66,49,49,57,57,66,57,74,
99,74,74,57,66,66,82,132,132,74,66,66,74,66,57,57,57,57,57,66,90,66,66,99,99,57,74,82,156,123,99,90,74,99,90,66,57,57,57,57,57,57,66,57,57,57,57,66,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,82,57,90,99,123,132,132,132,140,132,132,90,57,57,57,66,115,99,99,99,132,132,132,132,132,132,107,107,165,181,181,173,173,173,181,156,132,99,123,132,132,123,123,123,132,132,132,90,82,99,115,90,74,90,132,132,123,123,115,107,90,99,99,99,99,99,115,123,132,132,132,140,123,90,123,99,66,57,57,66,90,82,57,57,57,57,57,57,82,132,132,123,107,66,57,66,57,57,57,57,57,57,57,57,57,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,66,74,82,82,90,74,66,74,74,66,66,66,90,82,74,57,57,57,57,57,57,57,57,57,66,123,173,173,107,107,123,140,140,173,181,173,132,107,132,148,115,57,57,66,66,66,57,66,66,99,107,123,148,107,82,66,66,57,57,57,57,57,57,
82,66,57,66,82,66,90,132,140,132,107,107,123,82,57,57,66,57,57,57,66,82,57,57,57,57,66,74,123,82,82,107,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,90,82,115,132,132,140,132,140,107,66,57,57,57,74,132,140,107,115,132,132,132,132,123,115,123,123,181,181,181,173,173,173,173,156,148,140,123,132,132,132,132,132,132,140,123,123,132,132,132,107,132,132,132,123,123,115,99,90,90,90,99,99,107,115,123,132,132,132,132,132,107,123,140,82,66,57,57,57,57,57,57,57,57,57,74,99,82,66,57,82,115,107,90,66,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,82,107,66,57,57,57,57,57,57,57,57,57,57,57,57,74,82,107,99,107,90,82,74,57,66,74,74,82,66,66,57,57,57,57,57,57,57,57,57,74,148,173,140,74,74,99,107,107,165,173,123,82,140,148,90,57,57,57,57,66,57,57,57,57,66,66,74,82,99,115,74,74,57,57,66,57,66,66,
66,66,57,82,115,115,140,140,140,140,140,107,74,57,57,66,74,115,99,99,82,107,99,74,66,57,57,74,82,74,66,90,57,57,57,57,57,57,57,57,57,57,57,57,66,57,66,57,57,57,66,82,57,57,57,57,57,57,66,66,66,57,57,57,57,66,74,57,57,66,123,132,132,107,123,140,99,57,57,66,132,173,107,115,132,123,123,132,132,123,82,74,90,189,181,181,173,173,173,173,173,173,165,165,123,132,132,132,132,123,132,132,140,132,132,132,140,140,132,115,115,115,115,99,90,90,90,90,99,115,115,123,123,123,132,132,132,132,99,123,140,82,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,115,132,90,107,123,66,57,57,57,57,57,57,57,57,57,57,57,74,66,57,57,66,115,107,57,57,66,57,57,57,57,57,57,66,57,57,82,107,115,99,132,99,66,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,156,173,107,66,57,66,66,66,148,132,66,74,115,66,57,57,57,57,57,57,57,57,57,57,66,57,57,66,115,90,107,107,66,57,66,90,99,74,
74,66,90,123,140,140,132,132,140,132,107,66,57,74,74,74,115,165,156,156,148,165,156,148,107,107,90,82,66,57,107,82,57,57,57,57,57,57,57,57,57,66,74,57,57,57,90,115,115,99,115,90,66,66,90,107,107,107,74,90,90,57,57,57,57,107,99,57,57,82,132,132,140,74,82,107,82,57,57,90,123,123,123,132,123,115,132,132,132,132,74,74,99,181,181,181,173,173,173,173,173,173,173,173,132,132,123,132,123,132,115,132,132,132,132,123,123,123,115,115,115,115,115,99,90,90,90,90,99,115,123,123,123,115,123,132,132,123,107,99,140,140,66,57,57,57,57,57,57,57,66,66,66,57,57,66,90,132,140,82,82,132,115,82,57,66,66,57,57,57,66,57,57,57,66,66,66,57,57,66,132,66,66,74,57,57,57,57,57,57,49,74,82,82,132,140,115,132,107,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,148,173,123,66,57,57,66,90,148,99,66,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,82,107,99,66,57,74,90,123,148,99,
82,115,132,140,140,132,140,140,140,123,74,66,74,99,90,82,82,99,107,99,107,132,140,173,165,156,148,115,82,74,82,74,57,57,57,57,57,57,57,57,57,82,90,66,66,66,90,107,90,90,107,90,82,107,123,123,132,123,74,90,123,74,57,82,66,99,132,74,57,74,132,132,132,123,107,82,57,57,66,82,132,132,132,115,115,123,132,132,132,132,107,90,107,181,181,181,173,173,173,173,173,173,173,173,165,148,132,132,115,123,123,115,115,123,123,123,115,115,115,115,107,107,115,99,90,90,90,99,99,99,115,115,107,107,107,123,140,140,107,90,107,123,99,74,57,57,57,57,57,57,57,57,57,57,82,123,132,132,132,107,115,132,115,132,107,90,107,107,99,74,99,66,57,57,57,74,107,66,57,66,123,74,82,82,57,57,57,57,57,57,57,57,74,115,140,156,156,148,140,66,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,115,181,123,74,49,57,66,74,107,99,74,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,99,74,82,66,57,82,90,107,115,90,
132,132,132,132,132,132,140,140,140,132,132,115,66,66,66,66,57,57,57,57,57,57,66,115,156,156,148,140,107,99,123,99,82,74,66,66,57,66,82,66,74,90,99,107,123,90,82,66,57,57,66,74,90,66,66,99,123,115,66,82,115,74,66,90,115,132,140,90,66,82,132,123,123,107,66,49,66,74,132,99,123,132,123,115,115,115,132,132,132,115,115,123,99,181,181,173,173,173,173,173,173,173,173,173,165,173,173,173,165,165,99,123,123,115,115,115,115,115,115,115,107,115,115,99,90,90,99,107,99,99,90,90,99,99,99,99,99,123,132,123,99,90,123,99,66,57,57,57,57,66,66,82,107,107,123,132,132,132,132,132,140,140,99,107,140,132,132,140,132,132,123,66,66,74,107,123,90,57,57,90,107,74,74,57,57,57,57,57,57,57,57,57,90,156,165,156,165,148,90,66,57,57,66,74,66,66,57,57,66,57,57,57,57,57,57,57,57,57,107,156,107,57,57,49,66,66,74,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,74,74,90,74,74,123,82,57,57,57,74,90,107,
132,140,132,132,132,132,140,140,140,140,140,140,99,66,57,57,66,57,57,57,66,57,66,74,99,99,99,123,132,132,140,140,132,132,115,99,107,74,132,115,132,123,132,132,123,82,74,74,66,57,57,57,57,57,57,82,123,140,123,99,57,57,90,132,140,132,115,74,74,74,90,82,99,66,57,123,90,99,115,82,123,132,115,115,115,123,132,140,132,123,123,99,123,181,181,173,173,173,173,173,173,173,165,173,173,173,181,156,148,165,156,115,132,132,123,115,123,115,115,115,107,107,115,99,99,90,99,99,99,99,99,99,99,99,99,99,99,99,107,123,132,107,115,107,82,66,74,49,57,82,115,123,140,140,140,132,132,132,132,132,132,132,132,132,132,140,140,132,132,115,99,115,123,132,140,115,57,57,57,90,90,57,57,57,57,57,66,66,57,57,57,66,90,140,132,99,90,90,74,66,57,57,57,74,82,99,57,57,57,57,57,57,57,57,57,57,57,57,66,99,99,57,57,66,57,66,74,74,57,57,57,57,57,57,57,57,57,57,57,57,57,82,132,132,123,123,132,115,132,107,99,107,115,123,132,140,
107,132,140,140,140,140,140,140,140,132,132,132,132,132,107,90,66,66,82,90,123,115,132,140,140,140,140,140,132,132,132,140,140,140,140,132,132,132,140,132,123,140,132,123,90,74,74,82,66,57,57,57,57,66,107,132,132,140,140,99,57,66,115,140,115,82,66,66,57,57,57,57,66,57,74,90,123,115,99,123,140,123,115,115,123,132,132,132,132,123,123,115,156,181,173,173,173,173,173,173,173,173,165,173,173,173,173,132,123,132,132,66,99,132,123,115,123,123,115,115,115,123,123,107,99,99,99,99,99,99,99,99,99,99,99,107,107,107,107,115,132,132,132,123,115,90,90,90,90,115,132,132,132,132,132,132,132,132,140,140,140,132,132,140,132,132,99,82,115,132,132,140,140,140,140,115,57,57,57,82,107,66,57,66,57,57,74,74,57,57,57,57,57,57,66,66,66,57,57,57,66,57,57,66,74,74,66,57,57,57,57,57,57,57,57,57,57,57,49,66,74,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,74,66,66,74,107,132,140,140,132,140,132,140,140,140,140,132,132,132,107,
90,107,132,140,140,140,140,140,140,140,140,140,140,140,132,140,123,132,132,140,148,140,132,123,115,115,107,107,107,115,115,123,132,132,140,140,132,132,132,123,74,82,123,123,82,57,57,57,57,57,57,66,57,74,132,140,132,99,115,123,66,82,132,140,82,66,66,90,57,57,57,66,74,82,99,107,123,132,140,132,115,107,107,107,115,132,132,132,115,99,132,123,173,173,173,173,173,173,173,173,173,173,165,173,173,173,181,173,148,140,90,66,115,132,123,115,115,123,132,123,123,132,123,115,115,107,107,99,99,99,99,99,99,99,107,107,107,107,107,115,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,123,82,57,82,123,132,140,132,132,132,132,123,82,57,57,107,74,82,90,66,57,66,82,74,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,66,123,123,74,99,82,90,90,66,57,57,57,57,57,57,74,107,132,132,132,132,132,140,132,132,132,132,132,132,140,132,132,132,132,140,132,115,
132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,123,115,107,99,99,99,99,99,99,107,107,107,115,115,123,123,132,132,132,115,66,57,57,82,107,66,57,57,57,66,66,66,90,57,107,140,123,99,66,57,107,82,115,132,140,66,57,82,82,57,66,74,90,90,140,123,123,132,132,115,107,107,107,107,107,115,132,132,132,115,82,165,165,181,173,173,173,173,173,173,173,173,173,165,173,173,173,173,165,165,165,132,90,123,132,132,115,115,123,115,107,107,107,107,107,107,107,115,107,107,99,99,99,99,107,107,107,115,115,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,132,123,82,57,99,132,132,140,140,132,132,140,140,123,57,57,90,123,107,107,82,74,107,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,49,57,57,57,74,132,132,132,132,132,132,132,82,57,57,57,66,74,82,115,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,132,115,107,99,90,90,90,90,99,99,99,99,99,107,107,107,107,115,115,123,132,140,140,74,57,57,57,82,74,66,74,90,99,107,115,82,66,115,132,99,90,49,74,115,66,74,90,132,90,57,90,90,66,74,82,99,115,115,132,132,123,123,115,107,107,107,107,115,123,132,140,140,99,115,181,181,181,173,173,173,173,173,173,173,173,173,165,173,173,173,173,181,173,148,123,107,123,132,132,132,115,115,115,115,107,107,107,107,99,99,107,107,107,107,107,107,107,107,107,107,115,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,107,66,82,132,132,132,140,140,140,140,140,140,90,82,115,132,123,132,123,123,82,57,49,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,74,66,57,57,57,57,57,57,57,66,74,82,82,49,57,57,66,132,140,140,140,140,140,140,132,107,107,115,123,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,140,132,123,115,99,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,107,107,107,115,132,132,140,115,57,57,57,57,57,82,123,140,140,140,140,123,90,99,132,132,90,74,82,132,66,57,66,99,123,90,82,107,123,99,107,140,140,115,123,123,123,123,115,107,107,115,123,132,132,132,132,123,90,173,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,156,107,132,90,107,132,132,123,107,107,99,99,107,99,99,107,107,99,99,99,99,107,107,107,99,107,115,115,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,99,74,90,132,132,132,140,132,140,140,132,132,115,140,140,132,140,140,132,99,90,90,74,66,57,57,57,57,57,49,57,57,57,57,57,57,57,66,99,107,74,74,90,90,82,90,123,132,132,123,82,99,107,123,140,140,132,132,132,132,140,132,90,82,132,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,132,132,140,140,140,140,140,132,132,132,107,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,107,115,132,132,140,115,82,74,99,99,99,123,132,115,115,132,132,132,132,123,132,132,132,123,115,132,115,107,115,115,132,115,107,115,123,115,115,123,123,123,123,123,123,123,115,115,107,115,132,132,132,132,140,115,99,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,173,156,148,115,99,123,132,132,115,99,99,99,99,99,90,90,99,99,99,99,99,90,99,99,115,107,107,107,115,115,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,90,82,90,132,132,140,132,140,140,132,132,140,140,140,140,140,140,140,140,140,132,115,90,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,74,107,107,115,140,132,140,140,140,140,140,132,140,140,140,140,140,132,140,132,140,140,132,123,132,140,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,132,140,140,140,140,132,132,132,132,132,132,123,115,107,107,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,90,99,107,123,132,132,132,132,132,123,132,132,123,107,107,82,66,82,99,90,107,123,123,132,123,107,123,115,74,99,107,66,66,66,66,90,99,140,99,115,132,132,123,123,123,123,115,115,107,115,132,132,123,132,123,90,148,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,148,82,115,123,132,132,115,99,99,99,99,90,90,90,90,99,90,90,99,90,99,107,99,107,107,107,115,132,132,140,140,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,123,90,90,82,115,132,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,132,107,82,57,57,49,57,57,57,57,66,57,57,49,49,57,57,57,66,74,107,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,123,74,82,99,90,107,140,115,90,90,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,
132,132,132,132,132,132,132,140,140,132,132,115,115,107,123,132,115,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,107,123,132,132,132,132,132,123,123,115,107,74,66,57,82,107,74,66,74,123,115,99,82,57,90,115,99,123,90,66,90,107,115,107,148,165,132,123,132,132,132,132,132,132,132,123,123,132,132,132,123,115,115,156,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,173,181,181,189,173,123,99,123,132,132,132,132,123,107,90,90,90,90,90,90,90,99,107,99,99,99,107,107,107,107,115,132,132,132,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,107,107,99,99,99,115,132,132,140,140,132,140,140,140,140,140,140,132,140,140,140,132,115,99,90,74,57,66,66,57,57,57,57,57,66,74,82,82,57,82,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,123,107,57,74,66,74,90,132,123,123,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,140,140,140,
123,123,115,115,115,115,115,123,132,132,132,115,115,115,115,115,123,99,82,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,115,123,132,132,140,132,90,66,90,99,107,90,115,132,132,74,132,132,123,99,115,90,74,99,123,82,99,74,82,107,107,99,82,99,107,107,107,115,132,132,132,132,132,123,99,99,115,115,123,123,132,173,181,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,181,181,181,181,181,181,181,90,99,107,115,132,132,132,132,132,132,123,107,99,99,90,90,99,107,99,99,99,107,107,115,107,107,115,132,123,132,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,132,132,115,115,107,82,82,99,140,132,140,140,132,140,140,140,140,132,140,140,140,140,140,140,140,132,107,115,123,107,82,57,57,57,57,74,66,66,74,123,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,123,132,123,132,140,140,140,132,132,140,132,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,
123,115,115,107,107,107,107,107,115,115,123,123,123,115,107,115,123,123,107,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,107,123,132,132,132,140,115,66,66,90,123,123,123,132,123,132,132,115,132,132,132,132,132,107,99,123,132,115,115,90,90,115,90,66,107,90,115,132,132,132,132,99,107,123,123,148,181,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,181,173,181,181,181,181,181,181,181,181,181,173,74,74,82,82,132,132,132,132,132,132,132,132,123,107,107,99,99,99,99,99,107,107,107,107,107,123,123,115,82,115,132,132,140,123,140,140,140,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,132,132,140,140,140,132,123,115,132,132,132,140,140,132,140,140,140,140,140,140,140,140,132,140,140,140,132,132,132,140,132,74,57,66,90,123,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,140,132,132,132,140,140,132,132,132,132,123,123,123,
115,123,123,115,115,115,115,115,132,132,132,132,123,115,115,123,123,123,123,115,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,107,115,123,132,132,140,132,132,132,132,115,107,66,90,132,132,132,115,132,123,107,123,132,99,99,115,132,115,132,107,82,90,66,66,148,123,82,115,123,132,123,115,123,132,132,140,173,181,181,181,181,181,181,181,181,173,181,181,181,173,173,173,173,181,173,181,181,181,181,181,181,189,189,189,181,99,66,99,115,132,132,132,132,132,132,140,132,132,123,107,99,99,99,99,99,99,107,107,107,123,132,132,74,90,74,132,140,74,82,132,132,132,132,132,140,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,132,132,132,132,132,132,132,132,132,140,140,140,132,132,132,132,140,132,140,140,140,140,132,123,132,115,115,132,132,132,132,140,140,140,132,132,132,132,132,123,115,123,123,123,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,123,123,123,123,123,
115,123,123,115,115,115,107,123,140,132,132,132,132,132,115,107,107,123,115,123,107,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,107,115,123,132,140,140,132,132,140,132,132,107,99,123,132,132,115,82,74,74,115,90,82,115,115,82,99,99,99,74,82,82,74,165,173,148,123,123,132,107,132,132,148,165,181,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,189,189,148,74,123,123,132,132,132,132,132,132,140,140,132,132,107,99,99,107,107,107,107,115,99,123,123,107,74,90,90,82,82,99,99,132,132,132,132,132,132,132,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,132,140,132,140,140,140,140,140,140,132,132,123,74,74,82,90,132,132,140,140,132,132,132,123,123,107,107,107,107,107,107,107,107,115,123,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,140,140,132,132,123,123,123,115,115,123,123,
115,115,115,115,115,107,107,99,107,115,123,123,123,115,123,123,115,107,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,107,107,107,115,132,132,132,132,132,132,132,132,132,132,90,82,115,132,132,132,132,107,90,90,115,140,82,74,99,74,74,107,140,115,115,107,123,132,132,132,107,115,115,140,173,189,189,181,189,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,189,165,99,66,90,123,132,132,132,132,132,132,132,132,132,132,115,107,107,107,107,99,107,107,115,132,123,90,107,107,99,140,90,107,115,107,115,123,132,140,132,132,132,132,132,140,140,140,132,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,140,140,132,132,132,132,132,99,90,66,82,123,82,107,132,140,140,140,132,115,115,107,107,107,107,99,99,107,107,107,107,99,99,107,107,115,107,115,123,132,140,140,140,140,140,140,140,140,140,132,140,140,140,132,123,115,115,115,115,115,115,115,115,115,107,115,115,115,
123,115,115,115,107,107,99,99,99,99,107,107,107,99,99,99,90,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,107,107,107,107,107,115,123,132,132,132,132,132,132,132,132,132,132,132,123,107,132,107,74,107,156,148,99,74,107,82,66,90,107,148,165,156,123,123,107,107,132,140,123,99,66,82,140,156,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,181,181,189,165,115,66,82,90,99,107,132,140,140,140,132,132,132,132,132,115,115,107,99,99,99,107,123,132,132,132,115,123,123,115,107,90,82,82,74,82,82,132,132,132,132,123,132,132,132,132,132,132,132,140,132,132,123,123,132,132,132,132,123,132,132,140,140,132,132,132,132,132,132,132,132,132,140,132,132,140,140,140,132,132,132,132,132,99,90,74,66,107,99,132,132,140,140,140,132,123,115,107,107,99,99,99,99,99,99,99,99,99,99,99,99,90,90,99,99,99,107,115,123,132,132,132,140,140,140,140,140,140,123,123,123,115,107,107,107,107,107,107,107,107,107,107,115,115,123,123,
123,115,115,107,107,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,107,107,99,99,107,115,115,115,123,123,132,132,132,132,132,132,132,132,132,140,132,132,123,74,90,107,90,99,90,107,99,107,90,99,99,123,156,173,181,156,148,132,115,107,90,74,66,66,74,132,181,189,181,189,189,189,189,181,181,181,181,181,181,181,181,181,181,181,181,189,189,165,82,66,82,115,107,123,90,90,115,132,140,132,132,132,132,132,107,99,99,99,107,123,132,132,132,132,132,132,140,140,140,140,123,115,132,123,123,132,132,140,132,132,132,132,140,140,132,132,132,132,132,123,115,107,99,123,132,115,107,90,107,99,90,123,123,123,132,132,132,132,132,132,132,132,140,140,140,140,132,132,132,132,132,132,123,74,90,74,123,140,140,140,123,123,115,107,107,107,99,99,99,99,99,90,99,90,90,90,90,90,90,99,99,90,99,99,99,107,107,115,115,115,115,123,123,123,115,115,115,115,107,107,107,107,107,107,107,107,107,107,107,107,107,115,115,123,123,
115,107,107,107,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,107,107,107,99,99,107,107,115,115,123,123,132,132,132,132,132,132,132,132,132,140,123,107,99,123,82,66,74,99,140,148,148,132,115,115,115,123,123,99,115,115,99,115,132,123,107,99,123,140,123,123,148,132,115,132,132,148,156,189,181,181,181,181,189,173,156,165,148,123,107,99,90,74,99,90,82,99,74,74,74,107,140,140,140,132,107,90,90,107,115,123,132,132,132,123,123,115,107,107,107,115,123,140,148,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,140,132,140,140,132,132,132,132,123,90,107,123,123,123,115,123,132,132,132,132,132,132,132,140,140,140,140,140,140,132,132,132,140,123,132,132,115,115,132,132,123,115,115,107,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,107,115,115,115,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,99,99,107,107,107,107,115,115,115,
115,115,107,99,99,99,90,90,99,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,99,99,99,99,90,90,90,90,99,99,99,107,107,107,107,115,115,123,123,132,132,132,132,132,140,132,140,115,99,99,90,99,132,132,140,132,165,165,156,156,132,115,99,74,74,82,82,99,107,99,99,90,90,82,107,107,74,74,74,90,107,148,156,165,165,156,140,107,99,99,107,115,107,74,99,99,82,132,123,132,123,115,132,140,140,140,123,99,90,90,99,99,99,107,115,123,132,140,132,123,123,107,107,107,107,107,107,115,123,123,115,115,115,115,123,123,123,123,132,132,132,140,140,140,140,140,140,140,140,140,140,140,132,123,132,132,132,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,140,140,140,132,115,107,107,107,107,99,99,99,99,99,99,99,90,99,90,90,99,99,99,90,90,90,90,90,90,90,90,99,99,107,115,115,115,107,107,107,107,107,107,107,107,107,107,99,99,99,99,99,99,99,107,107,107,99,107,107,107,107,115,
107,115,107,107,107,99,99,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,99,90,90,90,90,90,90,90,90,99,99,107,107,107,107,107,107,107,115,123,132,132,132,132,140,140,140,140,140,140,132,123,132,123,90,107,123,115,90,115,115,132,107,99,123,115,90,107,123,140,132,123,123,123,132,132,115,115,115,99,123,115,90,123,140,148,123,123,123,123,132,132,99,82,74,90,123,140,140,140,140,140,132,123,115,99,90,90,90,99,99,99,99,99,99,99,99,107,107,115,123,115,115,107,99,99,99,99,90,90,90,90,99,99,99,99,99,99,99,99,107,107,115,115,123,115,115,115,123,132,132,140,140,140,140,140,140,132,123,123,123,123,123,123,123,123,115,115,115,115,115,115,115,115,115,115,115,115,115,107,99,99,99,99,99,99,99,99,99,99,99,90,90,99,90,90,99,99,90,90,90,90,90,90,90,90,90,90,90,99,107,107,115,123,115,115,107,107,107,107,107,99,99,99,99,99,107,107,99,99,99,99,107,107,107,107,107,107,107,115,
107,107,107,107,107,107,99,90,90,90,90,90,99,99,99,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,107,107,107,107,107,107,107,107,107,115,115,115,115,115,123,123,123,123,123,132,132,140,132,140,140,140,132,115,115,115,132,132,132,132,132,132,140,140,132,132,140,140,132,132,132,132,132,132,132,123,123,115,123,115,123,123,132,140,107,115,123,123,115,132,140,140,140,123,123,115,99,99,99,99,99,99,99,90,99,99,99,90,82,90,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,90,99,99,99,99,99,99,107,107,107,107,115,115,115,107,107,107,107,107,107,107,107,107,107,99,99,99,99,99,90,99,90,90,90,90,99,99,99,99,90,90,99,99,90,90,99,99,90,90,99,99,107,99,90,90,90,90,90,90,90,90,90,90,90,99,99,107,115,123,123,115,107,107,107,107,99,107,107,107,107,107,99,99,99,99,99,99,99,107,107,107,107,107,107,107,
107,107,107,115,115,115,115,115,115,107,107,107,115,107,107,115,115,115,107,99,99,107,107,107,107,107,107,99,99,99,99,99,90,90,90,90,90,90,90,90,90,99,99,99,99,107,107,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,123,115,115,123,115,123,123,123,123,123,123,123,123,132,140,140,140,132,140,140,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,132,132,140,132,132,140,132,132,140,140,140,132,132,115,99,90,90,82,90,90,90,90,90,99,99,99,99,99,90,90,99,99,90,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,90,99,99,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,90,90,90,99,99,107,107,107,99,90,90,90,90,90,82,90,90,90,90,90,90,99,107,115,115,115,115,115,115,115,115,115,115,107,107,107,107,99,99,99,99,99,99,99,99,99,99,99,99,107,107,
107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,107,107,115,115,115,107,107,107,107,107,99,99,99,99,99,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,123,132,132,132,123,123,115,99,90,82,82,82,82,90,90,90,90,99,99,99,99,99,99,99,90,90,90,90,90,99,90,90,90,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,90,99,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,82,90,90,90,90,90,90,99,99,99,107,115,115,115,115,115,115,115,115,107,107,107,99,99,99,99,99,99,99,99,99,99,99,107,107,107,107,
115,115,115,115,115,123,123,115,115,115,115,115,115,115,115,115,115,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,115,115,123,123,115,123,123,123,123,123,115,123,123,123,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,132,132,132,123,123,123,123,123,123,123,123,115,115,107,107,107,99,99,99,99,107,107,107,107,107,107,115,115,115,115,115,115,115,123,123,123,132,132,132,123,115,107,99,99,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,90,99,99,99,107,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,90,99,90,90,90,90,99,99,99,90,90,90,90,90,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,82,82,82,90,90,90,90,82,90,90,90,90,90,82,90,99,107,115,115,107,107,107,99,99,99,99,99,99,99,99,90,90,90,90,90,99,99,99,107,107,107,107,107,115,115,
99,107,107,107,107,107,107,107,107,107,107,107,107,99,99,107,107,107,99,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,107,107,107,107,107,107,107,115,115,115,115,115,115,115,123,123,123,123,123,132,132,132,132,132,132,123,115,107,107,107,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,99,99,99,99,99,90,90,90,90,99,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,82,90,99,115,115,115,107,107,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,
90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,107,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,107,107,107,107,107,107,115,115,115,107,107,107,107,107,107,107,107,107,99,107,107,107,107,107,107,107,107,107,107,107,115,115,115,123,123,123,123,132,123,123,115,115,115,107,107,107,107,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,82,82,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,90,90,99,90,90,90,90,90,90,90,90,90,90,99,99,107,107,107,107,107,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,99,115,115,123,115,107,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,99,99,99,99,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,107,107,107,107,107,107,107,107,115,115,115,115,123,123,123,123,123,123,115,115,115,115,107,107,107,107,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,90,82,90,90,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,82,90,90,107,115,115,123,123,123,115,115,107,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,
90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,90,90,90,90,90,99,99,90,99,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,107,107,107,107,115,115,115,115,115,123,123,123,123,123,123,123,115,115,115,107,107,107,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,99,107,115,115,123,123,123,123,123,115,115,107,107,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,90,90,
107,107,107,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,123,123,115,115,123,115,123,115,115,115,123,115,115,115,115,115,115,115,115,107,107,107,107,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,99,99,107,107,115,115,115,115,115,115,115,115,115,115,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,90,90,90,90,90,90,90,82,90,82,90,90,90,82,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90
};
GLubyte textureG[65536] = {142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,138,142,142,142,142,142,142,142,142,142,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,142,142,142,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
146,146,146,146,142,146,146,146,146,146,146,146,146,146,146,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,138,138,138,142,142,142,142,138,142,142,142,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,138,138,142,138,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,142,142,142,142,142,138,142,142,142,142,142,142,142,142,142,142,142,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,142,146,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,138,138,138,138,138,142,138,138,138,138,138,142,138,138,142,142,142,142,138,138,138,138,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,142,142,142,142,142,142,142,138,138,138,138,138,142,142,142,142,142,142,142,146,142,142,146,142,146,146,142,142,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,150,146,146,146,146,146,146,146,146,146,150,
146,146,146,146,146,146,146,146,146,146,146,142,142,142,142,142,142,146,146,146,142,146,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,134,134,138,134,134,138,138,138,138,138,138,134,134,138,138,134,138,138,138,138,138,138,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,150,150,150,150,150,150,150,150,150,150,150,150,146,150,146,146,146,150,146,146,150,150,150,150,150,150,150,150,146,146,146,146,146,146,146,146,142,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
146,146,146,142,142,142,138,138,138,138,138,138,138,142,138,138,138,138,138,130,138,142,146,121,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,138,138,138,138,138,138,138,138,138,138,138,138,134,134,134,134,134,134,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,130,130,134,130,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,146,146,146,146,146,146,146,146,146,146,146,146,146,146,142,142,142,142,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
142,142,142,142,138,138,134,134,130,134,130,121,130,154,150,138,142,162,162,170,162,154,158,134,142,134,138,138,134,138,146,134,146,138,134,130,125,134,121,117,125,134,134,134,138,138,138,138,138,138,138,138,138,138,138,134,130,130,130,130,130,134,134,134,134,138,142,142,142,146,142,146,146,150,154,158,158,154,150,146,146,142,138,134,134,134,134,134,134,134,134,134,134,134,134,134,134,130,134,130,130,130,130,130,130,130,130,130,130,130,130,130,134,134,134,134,134,134,134,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,138,138,142,142,142,142,142,142,142,142,146,146,146,146,146,146,146,150,150,150,150,150,150,146,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,146,150,150,150,146,146,146,146,146,150,150,150,150,150,150,150,146,146,146,146,146,146,146,146,142,142,146,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,146,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,146,146,142,
134,142,146,142,146,146,138,158,166,174,170,182,166,162,154,158,166,170,150,158,170,158,150,174,182,170,174,178,182,182,170,178,182,178,174,178,182,170,166,162,150,146,142,138,134,134,134,134,134,134,134,134,134,138,138,134,130,125,125,125,125,130,130,125,134,146,154,162,158,162,162,166,170,170,170,170,170,166,166,162,158,154,154,154,154,154,150,150,146,146,146,146,142,142,142,142,142,142,138,138,134,130,130,130,130,130,130,130,130,130,130,134,134,134,134,134,134,134,138,134,138,134,134,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,138,138,142,138,142,142,142,142,142,142,146,146,146,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,146,146,146,146,146,146,150,150,150,150,150,150,146,146,146,146,146,146,146,146,146,142,146,146,142,142,142,142,142,142,138,142,142,142,142,142,142,142,142,142,142,138,138,138,138,138,138,134,134,134,142,130,134,130,121,130,134,134,134,134,
162,170,170,162,158,162,162,162,158,154,142,142,142,138,134,130,125,125,125,130,125,121,130,134,138,138,142,150,158,166,170,174,174,178,178,182,186,186,182,182,174,170,162,158,154,142,134,130,138,134,130,130,130,130,134,130,130,130,130,125,130,130,130,134,130,138,150,158,162,162,170,174,178,178,178,182,182,182,178,178,178,178,174,178,178,178,174,170,166,162,162,158,158,158,158,154,154,150,146,142,142,142,138,134,130,130,130,130,130,125,130,130,130,134,134,134,134,134,134,134,134,134,134,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,146,146,146,146,150,150,150,150,150,150,150,150,150,150,150,150,150,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,150,150,150,150,150,150,150,150,150,150,150,146,150,150,150,146,150,146,146,150,146,146,146,142,146,146,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,138,138,138,138,138,134,134,130,125,125,138,146,154,158,146,134,146,142,150,166,170,
142,142,142,138,142,142,142,138,138,138,138,138,138,121,117,113,117,121,125,125,134,134,134,138,138,146,154,162,162,166,166,166,170,170,174,178,178,182,186,186,186,186,182,178,174,166,158,154,150,146,142,138,134,134,134,130,130,130,130,130,130,130,130,134,138,142,150,154,158,162,166,170,174,174,182,186,186,182,178,174,170,170,158,162,162,166,178,186,170,166,166,166,170,174,174,174,170,162,158,154,150,150,146,146,142,138,138,138,134,134,134,130,130,130,130,134,134,134,134,134,134,134,134,134,134,138,138,138,134,134,134,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,142,146,146,146,146,150,150,150,150,150,150,150,154,150,150,150,154,154,154,154,154,154,154,154,154,154,158,158,158,158,158,154,154,154,154,154,154,154,154,154,154,154,150,150,150,150,150,150,150,150,150,150,146,150,146,146,150,146,146,146,146,146,146,142,142,142,142,142,142,142,142,138,138,138,138,138,138,138,138,138,138,138,138,134,134,134,134,134,134,134,125,125,125,142,146,146,130,178,170,178,162,158,170,158,142,
138,134,134,138,134,134,134,134,138,138,138,138,138,138,125,113,113,113,121,130,134,138,150,154,154,158,158,158,158,162,162,166,170,170,170,166,170,174,174,178,182,186,186,178,170,166,166,162,154,150,142,138,134,130,130,125,125,130,130,130,134,134,138,142,146,150,158,162,166,170,174,178,182,182,182,178,178,178,178,174,170,170,158,130,130,142,158,174,182,170,166,166,170,182,182,186,186,182,174,162,158,154,154,154,150,150,150,146,146,146,142,142,138,138,134,134,130,130,130,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,138,138,138,138,138,138,138,138,138,138,138,142,142,142,142,146,146,146,146,146,150,150,150,150,150,150,154,154,154,154,154,154,154,154,154,154,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,154,154,154,154,154,154,154,150,154,150,150,150,150,150,146,150,150,146,146,146,146,146,142,142,142,142,142,142,142,142,142,142,142,138,138,138,138,138,138,138,138,138,138,138,134,134,134,134,130,130,125,138,134,121,146,158,138,125,154,146,146,142,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,130,121,125,134,138,142,146,150,158,166,166,170,170,170,170,170,170,174,174,178,178,178,182,186,186,182,178,170,166,162,154,150,146,138,130,125,130,125,125,125,130,130,130,134,138,146,146,150,158,166,170,178,182,186,182,178,170,170,174,170,166,158,150,134,125,138,138,134,138,146,158,166,170,178,178,178,162,162,150,162,174,182,170,166,162,158,158,158,154,154,154,150,150,150,146,142,142,138,134,130,130,125,125,130,130,130,130,130,134,134,134,134,134,134,134,134,138,134,138,138,138,138,138,138,138,138,138,138,138,142,142,142,146,146,146,146,150,150,150,150,150,154,154,154,154,154,154,154,154,154,158,158,158,158,158,158,162,162,162,162,162,162,162,162,158,158,158,158,158,158,158,154,154,154,154,154,154,154,154,154,154,150,150,150,150,150,150,150,146,146,146,146,146,142,146,142,142,142,142,142,142,138,138,138,138,138,138,138,134,134,134,134,134,134,134,134,134,134,130,125,121,146,158,166,158,142,150,158,150,142,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,134,125,146,154,158,158,154,154,154,158,166,170,170,170,170,170,174,174,178,178,178,182,182,182,182,178,174,166,162,158,150,142,138,130,125,130,130,130,130,130,130,130,130,130,134,142,146,154,162,166,174,186,182,178,170,166,158,158,158,162,154,142,125,130,142,138,138,138,138,134,138,138,146,142,142,142,134,134,138,130,158,182,182,178,178,178,178,174,166,162,162,162,162,162,154,150,146,142,142,134,134,130,130,125,125,130,130,125,130,130,130,130,134,134,134,134,134,134,134,138,138,138,138,138,138,138,138,138,142,142,142,146,146,146,146,150,150,150,150,150,150,154,154,154,154,158,158,158,158,158,158,158,158,162,158,162,162,162,162,162,162,162,162,162,162,162,158,158,158,158,158,158,158,158,158,158,154,154,154,154,154,150,154,150,150,150,150,150,146,146,146,146,146,146,146,142,142,142,142,142,142,138,138,138,138,138,138,134,134,134,134,134,134,134,130,130,130,134,134,134,125,125,138,158,166,142,142,138,138,134,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,130,134,138,154,158,150,154,150,150,154,154,158,162,166,170,170,174,174,174,178,182,182,182,182,178,174,170,166,162,158,154,150,146,138,134,130,130,130,130,130,130,130,130,130,130,130,130,134,138,146,158,166,174,182,178,174,166,154,134,130,138,146,142,138,130,134,138,138,138,138,138,134,134,138,138,138,138,138,138,134,134,138,138,142,146,162,166,170,170,174,174,178,182,182,178,174,170,162,158,150,146,142,142,138,134,130,130,130,130,125,130,130,130,130,134,134,134,134,138,138,138,138,138,138,138,138,142,142,142,142,142,146,146,146,146,150,150,150,150,150,154,154,154,154,158,158,158,158,158,158,158,158,158,158,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,158,158,158,158,158,158,158,158,154,154,154,154,154,154,150,150,150,150,150,150,150,146,146,146,146,146,142,142,142,142,138,138,138,138,138,138,134,134,134,134,130,130,130,130,130,125,130,142,154,162,166,142,146,170,142,142,134,138,138,138,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,138,138,138,138,134,125,117,130,138,146,150,158,162,166,170,174,178,178,182,182,182,178,174,170,166,162,162,158,154,154,150,146,142,138,138,134,130,130,130,130,134,134,134,134,130,130,130,130,138,146,158,166,166,174,182,182,166,142,134,142,138,138,138,138,138,138,138,138,138,138,138,138,138,125,130,134,138,146,146,138,138,138,138,138,138,138,138,134,138,150,158,182,174,178,174,174,174,170,162,150,150,146,142,142,134,130,125,130,130,130,130,130,130,134,134,134,138,138,138,138,138,138,142,142,142,142,146,146,146,146,146,146,146,150,150,150,150,150,154,154,154,154,154,158,158,158,158,158,158,158,158,158,158,158,158,158,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,158,158,158,158,158,158,158,158,154,154,154,154,154,150,150,154,150,150,150,150,150,150,146,146,146,146,142,142,142,142,142,142,138,138,138,138,134,134,134,134,130,134,134,130,130,125,130,138,154,166,158,150,146,162,134,134,138,138,138,138,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,134,138,134,130,130,134,138,134,134,138,134,117,130,138,146,154,158,166,170,170,170,174,182,186,178,170,170,166,166,162,158,158,154,150,146,146,142,138,134,134,130,130,125,130,130,130,130,130,130,130,130,130,125,134,146,150,154,170,174,166,154,154,138,138,138,138,134,138,134,138,138,138,138,138,138,138,138,138,134,142,134,154,170,170,170,154,134,138,138,138,138,138,134,134,138,142,142,158,162,166,170,170,178,182,170,162,158,150,142,134,125,130,130,130,130,130,134,134,134,138,138,138,138,138,142,142,142,142,142,146,146,146,146,146,146,150,150,150,150,150,150,154,154,154,154,154,154,154,154,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,162,162,162,162,162,162,162,162,162,162,162,162,162,162,158,158,158,158,158,158,158,154,154,154,154,150,154,154,154,150,150,150,150,150,146,146,146,146,146,142,142,142,142,142,142,138,138,138,138,134,134,134,134,134,134,130,130,125,125,130,134,134,138,162,166,150,134,138,138,134,134,138,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,130,138,142,138,138,134,138,134,138,138,158,170,170,174,170,170,170,170,166,170,174,182,178,174,170,162,162,158,158,158,154,154,150,146,142,142,142,142,142,138,138,138,134,134,134,134,130,130,134,134,134,130,130,130,130,134,158,162,146,138,146,146,138,138,138,138,130,134,138,138,138,138,138,138,138,138,138,138,138,134,134,146,170,174,170,154,134,134,138,138,138,138,138,134,134,138,162,174,178,182,174,178,174,170,166,162,158,150,138,134,130,130,130,130,134,130,134,134,134,138,138,138,138,142,142,142,142,146,146,146,146,150,150,146,150,150,150,150,150,154,154,154,154,154,154,158,154,154,154,158,158,158,158,158,154,154,154,154,154,154,154,154,158,158,158,158,158,158,158,158,158,158,158,158,158,162,162,162,162,158,158,158,158,158,158,158,154,154,154,154,150,154,150,154,150,150,150,150,150,146,146,146,146,146,142,142,142,142,142,142,138,138,138,138,134,134,134,134,134,134,134,134,130,130,125,125,130,130,146,154,158,130,134,134,138,138,138,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,138,138,134,142,166,174,178,178,182,178,178,178,178,178,174,174,170,166,162,158,154,150,150,150,150,150,150,150,146,146,146,146,154,154,154,154,154,150,146,150,146,146,142,142,142,142,142,142,142,138,130,130,150,138,142,154,146,130,142,138,138,134,138,138,130,138,134,138,138,138,138,138,138,138,138,138,138,138,150,150,138,130,138,138,138,138,138,134,166,174,170,162,162,162,162,174,182,170,158,154,154,150,146,142,138,130,125,130,130,130,134,134,134,138,138,138,138,138,142,142,142,146,146,146,146,150,150,150,150,150,150,154,154,154,154,154,154,154,154,158,158,158,158,154,154,154,154,154,154,154,154,154,150,150,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,158,158,158,158,158,154,158,158,158,158,158,158,154,158,158,154,154,154,154,154,150,150,150,150,150,150,146,146,146,146,142,142,142,142,142,138,138,138,138,138,138,138,134,134,134,134,134,134,134,134,130,125,125,134,138,150,150,134,146,142,138,138,134,138,138,138,138,138,138,138,
130,130,130,130,130,130,130,130,130,134,130,130,130,130,130,130,154,170,174,170,162,150,154,166,166,178,186,178,166,162,158,150,146,142,138,130,134,138,138,138,134,138,142,146,146,150,154,162,162,166,166,166,162,162,162,162,158,158,154,154,154,154,154,154,154,150,146,166,158,158,142,142,150,146,142,130,134,134,138,138,138,138,138,134,134,134,134,134,134,134,134,134,138,134,130,134,134,130,125,121,121,125,138,142,170,182,178,174,170,174,170,166,166,158,146,142,142,138,130,130,130,130,130,130,134,134,134,138,138,138,138,142,142,142,142,142,146,146,146,150,150,150,150,150,150,150,154,154,154,154,154,154,154,154,158,158,158,154,154,154,154,154,154,154,154,154,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,154,154,154,154,154,158,158,158,158,158,158,158,154,154,154,154,154,154,154,154,150,150,150,150,150,150,150,146,146,146,146,146,146,142,142,142,142,142,138,138,138,138,138,134,134,134,134,134,134,134,130,134,130,125,130,121,138,154,142,134,125,134,130,125,125,125,130,125,125,130,
130,130,130,130,130,130,130,130,134,130,130,130,130,130,130,130,146,146,146,134,130,138,134,142,142,174,170,166,154,150,142,130,125,125,125,130,130,125,130,125,125,125,130,142,138,154,162,166,170,174,174,178,178,174,174,174,170,170,166,166,166,166,166,162,166,170,178,178,178,174,174,182,174,142,142,142,138,138,138,138,138,138,138,138,130,134,134,134,134,134,134,134,134,138,134,134,134,134,130,130,125,121,125,134,138,150,166,178,178,166,162,154,150,146,146,142,138,134,125,130,130,130,130,134,134,134,134,138,138,142,142,142,142,146,146,146,150,150,150,150,150,150,150,150,154,154,154,154,154,154,154,158,158,158,158,158,158,154,154,154,154,154,154,154,150,150,150,150,146,146,146,146,146,142,142,142,142,142,142,142,142,142,146,146,150,150,150,150,150,154,154,154,158,158,158,158,158,158,154,154,154,154,154,150,150,154,150,150,150,150,150,150,150,146,146,146,146,146,146,146,142,142,142,138,138,138,138,138,138,138,134,134,138,138,134,134,134,134,134,130,134,134,158,158,134,125,130,134,125,130,130,125,130,130,125,125,
130,130,130,130,130,130,134,134,130,130,134,134,138,138,138,134,130,130,125,125,134,138,130,134,154,182,182,178,170,150,142,138,134,130,134,134,130,130,130,130,130,134,138,142,150,154,166,170,166,182,186,186,186,182,186,182,186,186,186,182,182,182,178,178,174,174,178,186,186,182,178,166,142,130,142,146,154,142,142,134,138,138,134,134,130,130,130,134,134,134,134,134,134,134,134,134,134,134,134,130,125,121,125,125,125,130,138,142,154,166,178,178,174,170,166,162,154,142,130,130,130,134,134,134,134,138,138,138,138,142,142,146,146,146,146,146,150,150,150,150,150,150,150,154,154,154,158,154,154,154,158,158,158,158,158,158,158,154,154,154,154,154,154,150,150,150,146,146,142,142,142,142,138,138,138,138,138,138,138,138,138,142,142,142,146,146,146,150,150,150,154,154,154,158,158,158,158,158,154,154,154,154,154,154,150,150,150,150,150,150,150,150,146,146,146,146,146,146,146,146,146,142,142,142,142,138,138,138,138,138,138,138,138,138,134,134,134,134,130,130,130,142,166,142,130,125,125,121,125,125,125,125,130,130,130,130,
130,130,130,134,130,130,125,125,130,130,121,117,105,101,97,97,93,97,97,117,121,134,142,138,142,146,162,150,170,178,178,186,178,166,162,158,150,146,150,154,154,154,154,162,166,162,182,182,174,178,166,158,162,170,174,162,158,162,174,174,178,182,182,182,182,174,174,182,186,182,178,170,158,150,158,170,178,182,174,166,154,146,134,138,134,130,130,130,130,130,130,134,134,130,134,134,134,134,134,134,134,130,130,130,130,130,130,134,134,134,142,146,146,150,162,170,182,170,142,125,130,134,134,134,138,138,138,142,142,142,146,146,146,150,150,150,150,150,154,154,154,154,154,154,154,154,154,154,154,154,154,158,158,158,158,158,158,154,154,154,154,154,154,150,150,146,146,142,142,138,138,134,134,134,134,134,134,130,130,134,134,138,138,138,142,146,146,150,150,150,150,154,154,154,154,154,158,154,154,154,154,154,150,150,146,150,146,146,150,150,146,150,150,150,150,150,150,150,146,146,146,146,146,142,142,142,138,138,138,138,138,138,138,134,134,134,130,130,130,138,146,166,170,134,125,125,130,130,125,125,130,130,130,130,130,130,
130,130,125,121,117,113,109,113,105,101,97,93,93,93,93,93,93,93,93,93,89,89,97,113,138,142,134,134,138,142,146,166,154,170,174,166,166,174,174,174,174,174,174,178,178,174,162,150,138,142,146,142,142,142,142,138,142,146,174,178,178,178,182,182,174,170,170,170,178,182,182,178,170,170,174,170,158,158,150,138,142,166,134,134,134,130,130,130,130,130,130,130,130,130,130,134,134,134,134,134,134,134,134,130,130,130,130,134,130,130,130,130,134,134,134,154,174,186,170,150,138,134,134,138,138,142,142,142,142,142,146,146,146,150,150,150,150,154,154,154,154,154,154,154,154,158,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,150,150,150,146,142,142,138,138,134,130,130,138,142,146,142,138,130,130,130,134,138,138,142,146,150,150,150,150,154,154,154,154,158,158,154,154,154,154,150,150,150,150,150,146,150,150,146,146,150,146,150,150,150,150,150,150,146,146,146,146,146,142,142,142,138,138,138,138,138,138,138,134,134,134,130,130,130,134,142,158,162,146,125,121,130,134,130,134,130,130,130,134,130,130,
134,130,121,113,105,105,101,101,101,97,93,93,93,93,93,89,89,89,89,89,89,89,89,93,93,105,125,125,138,138,134,146,138,130,138,138,138,134,138,130,138,142,138,138,138,142,150,134,142,142,134,134,134,134,134,134,138,166,182,186,178,178,178,174,170,174,178,182,186,178,182,186,182,174,182,182,174,166,158,142,125,142,166,166,125,130,130,134,130,130,130,130,130,130,130,130,130,134,134,134,134,134,130,134,134,134,130,125,134,130,130,130,134,134,134,138,142,150,178,182,170,154,138,138,138,142,142,142,142,142,142,142,146,150,150,150,150,154,154,154,154,154,154,154,154,154,150,150,150,150,150,150,150,150,154,154,154,154,154,150,150,150,150,150,146,146,142,138,138,134,130,130,134,158,174,174,166,150,134,125,130,134,134,138,142,146,146,146,150,150,150,154,154,154,154,154,154,154,150,150,150,150,150,146,146,142,146,146,146,146,146,146,146,146,146,150,150,150,146,146,146,146,146,142,142,142,138,138,138,138,134,134,134,134,134,130,130,130,130,125,130,130,134,138,154,138,125,125,130,125,134,130,130,130,130,134,
130,130,113,105,101,105,93,93,89,89,89,89,93,89,89,89,89,89,89,85,85,89,89,89,89,89,93,93,97,105,113,109,105,121,134,134,134,142,142,146,134,146,138,134,134,134,134,130,130,130,130,130,134,138,134,130,138,150,158,158,166,170,170,166,174,166,162,158,146,142,146,158,146,142,138,138,162,174,174,178,158,150,150,170,134,125,130,130,130,130,130,130,130,130,125,130,130,130,125,121,117,109,105,109,109,109,105,109,117,125,121,138,138,138,138,138,138,158,166,178,182,162,146,130,130,138,138,138,134,138,142,142,146,146,150,150,150,150,150,150,150,150,150,150,150,150,150,146,146,142,142,146,146,146,146,150,150,150,150,150,150,150,150,146,146,146,142,138,138,134,130,130,142,170,182,174,174,154,142,134,130,134,134,138,138,142,142,146,150,150,150,150,154,154,154,154,154,150,150,154,154,150,146,146,146,146,146,142,142,142,146,146,146,146,150,150,146,150,150,146,146,146,146,142,142,142,138,138,138,138,134,134,134,134,134,134,130,130,130,130,125,125,130,142,142,125,130,134,134,125,130,134,130,130,130,134,
130,130,121,105,101,93,89,89,89,85,85,89,89,85,85,85,85,85,85,89,89,85,85,85,85,89,89,89,89,89,93,97,97,101,105,117,121,130,138,130,130,130,130,130,125,130,130,125,130,130,125,125,130,134,134,138,134,138,142,142,138,138,138,130,134,142,138,138,138,134,138,138,130,138,142,138,134,138,142,142,170,162,134,158,146,134,130,130,130,130,130,134,134,138,138,134,125,121,113,105,101,101,97,101,101,97,93,93,93,97,93,105,109,130,138,138,138,138,134,146,174,178,162,142,138,138,158,150,134,138,138,142,146,146,146,146,146,146,142,146,146,142,142,142,142,146,146,146,138,134,134,138,142,142,146,146,146,146,146,146,146,146,150,146,146,146,142,142,138,134,130,125,138,162,170,150,158,178,170,158,142,130,134,138,138,138,146,146,150,150,150,150,154,154,154,154,154,150,154,150,150,150,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,142,142,142,142,138,138,138,138,134,134,134,134,134,134,130,130,134,134,130,125,138,146,125,130,134,142,138,130,125,130,130,130,125,130,
121,130,130,121,97,89,89,89,85,85,85,85,85,85,85,85,85,85,85,89,89,89,85,85,85,85,85,85,85,89,89,89,93,97,97,97,105,109,109,109,109,113,113,121,125,121,121,121,125,125,130,130,125,130,130,138,146,142,142,134,134,130,125,134,130,130,130,130,130,130,130,134,138,142,138,134,138,138,142,138,154,170,146,166,142,134,130,130,125,121,121,125,138,134,130,121,113,109,105,93,85,89,93,93,97,97,89,89,93,93,89,85,89,97,101,125,138,134,134,138,154,174,174,178,162,174,182,170,170,158,146,146,146,150,146,142,142,138,138,138,138,146,158,158,154,158,162,158,146,142,138,134,134,134,138,138,138,138,138,142,142,142,146,146,146,146,146,142,138,138,134,130,130,150,178,154,125,154,174,170,150,130,130,134,138,142,142,146,146,146,150,150,150,150,150,150,150,150,150,150,146,146,146,142,142,142,142,142,142,142,142,142,146,146,146,146,146,146,146,146,146,142,142,142,138,138,138,138,134,130,134,130,130,130,130,134,134,130,130,130,130,130,142,174,142,138,142,134,138,130,134,130,130,121,109,109,
113,121,121,113,89,89,85,85,85,81,81,81,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,81,85,85,85,85,89,89,89,97,97,97,85,97,93,89,105,113,121,130,134,134,125,125,125,109,121,117,121,134,138,134,130,134,130,125,130,130,130,130,125,130,130,130,130,130,125,125,134,138,142,162,174,150,162,158,134,158,142,134,130,125,125,125,121,113,113,109,109,105,101,93,93,93,89,85,89,89,85,85,89,85,85,85,85,85,85,81,89,105,113,134,134,130,142,150,134,158,162,150,154,138,150,174,178,178,182,178,178,166,170,166,174,174,178,178,178,182,178,174,170,178,178,178,166,154,146,138,134,134,134,134,134,134,138,138,142,142,142,146,146,146,142,138,134,130,125,138,158,170,130,134,142,178,154,134,130,130,138,138,142,142,142,146,146,146,146,150,150,150,150,146,146,146,146,142,142,142,142,142,138,138,142,142,142,142,142,142,142,142,146,146,146,146,146,146,142,142,138,138,134,134,130,130,130,130,125,130,130,130,134,134,130,130,130,134,174,158,162,170,154,154,150,142,117,109,105,117,117,101,
121,113,97,89,85,85,85,85,85,85,85,85,85,85,81,85,85,81,81,85,85,85,85,85,85,81,81,81,85,85,81,85,85,85,85,93,93,93,85,97,97,109,101,105,101,101,101,105,101,101,101,109,113,117,121,109,121,125,134,130,130,138,134,134,130,130,130,125,125,125,130,130,125,130,134,134,138,138,166,142,166,138,134,170,134,134,130,125,121,113,105,105,101,101,97,97,89,89,85,85,85,85,85,85,85,81,81,81,85,85,81,81,81,81,77,81,97,105,113,121,138,130,130,125,134,138,138,138,138,138,150,146,146,150,150,158,154,150,150,162,158,146,150,146,142,138,142,142,154,174,182,186,166,154,154,166,166,142,130,130,134,134,138,138,138,142,142,142,142,138,138,130,125,130,146,170,142,134,134,150,170,150,142,134,134,134,138,138,142,142,142,142,142,146,146,146,146,146,146,142,142,142,138,138,138,138,142,138,138,138,138,138,138,138,138,138,142,142,142,142,142,142,142,138,138,138,138,134,130,130,130,130,134,138,142,146,146,146,142,142,134,146,158,154,142,158,146,138,134,113,101,105,105,105,101,117,
97,97,89,85,85,85,85,85,85,85,85,81,81,81,85,85,85,81,81,81,81,85,81,81,85,85,85,81,81,81,85,81,81,85,93,89,97,89,93,89,101,93,93,101,101,97,93,93,93,97,93,89,93,89,85,93,89,85,85,101,117,105,97,101,113,121,130,130,134,130,125,130,125,125,125,138,134,134,146,146,174,138,138,154,134,130,125,125,117,105,97,101,97,93,93,89,89,89,85,85,85,85,81,81,85,81,81,81,81,81,81,81,81,81,77,77,77,77,93,109,113,121,125,130,130,125,134,142,142,142,138,138,142,138,142,134,134,134,134,134,142,138,142,142,138,138,142,138,138,142,146,154,182,174,170,150,182,154,134,125,130,130,134,134,134,138,138,142,138,138,138,134,130,125,150,170,125,138,134,134,158,166,174,158,142,130,134,134,138,138,138,138,142,142,142,142,142,142,138,138,138,138,138,138,138,138,138,138,134,134,134,134,134,134,134,138,138,142,142,138,138,138,142,138,138,138,138,134,130,130,130,142,150,158,158,166,170,166,162,158,162,166,138,134,134,138,138,117,109,101,105,105,97,97,93,93,
93,85,85,81,85,85,85,85,81,85,81,85,85,85,85,85,85,81,85,81,81,81,81,81,85,81,81,81,81,81,81,81,85,81,89,93,89,97,93,97,93,97,109,97,97,89,81,89,93,89,89,85,85,85,85,85,81,85,81,85,85,89,81,77,89,101,109,113,109,125,134,134,134,130,138,130,134,178,142,142,166,150,162,142,130,130,125,125,117,105,97,93,93,89,89,85,89,89,89,85,81,85,81,81,81,81,81,77,77,77,77,77,77,77,77,77,77,73,81,81,93,101,101,101,105,97,101,109,125,109,109,109,113,121,117,125,138,138,142,146,138,121,121,113,97,101,109,125,138,138,138,150,146,138,142,134,158,174,150,134,130,134,138,134,130,134,134,138,138,138,134,130,130,134,150,174,142,134,138,138,138,134,154,170,166,142,134,134,134,134,134,134,134,138,138,138,138,138,134,134,134,134,138,134,134,134,134,134,130,130,130,130,134,130,130,134,134,134,134,134,134,134,134,134,134,134,134,130,130,138,154,158,174,174,178,182,178,178,170,166,158,142,130,125,117,113,109,105,97,105,105,97,93,89,89,89,
93,97,89,97,85,81,85,85,85,85,85,85,85,85,89,85,85,81,81,81,81,77,81,81,81,81,81,81,81,85,81,81,81,81,85,85,89,89,89,85,93,85,85,89,89,85,89,85,89,89,85,85,85,85,81,85,81,81,81,81,81,85,81,105,89,89,97,97,93,97,97,105,113,125,134,130,130,146,130,130,158,154,142,138,134,130,130,130,117,109,101,97,93,93,89,85,85,85,85,81,81,85,81,77,81,77,77,77,77,77,77,77,77,73,77,73,77,77,73,77,81,85,97,109,105,89,97,89,89,85,93,101,109,97,97,105,113,109,109,105,97,97,93,93,89,93,93,93,101,130,134,142,138,138,125,134,142,166,174,166,162,162,170,150,130,130,130,134,134,130,142,142,146,162,170,178,182,142,134,130,121,125,125,142,178,170,158,150,142,138,142,138,130,130,130,134,134,130,130,130,130,134,134,130,130,130,134,138,146,154,154,154,154,142,134,130,130,130,130,134,134,130,130,134,134,134,130,130,146,166,178,174,162,166,166,150,150,142,134,134,125,121,117,105,101,97,101,97,101,93,93,85,89,89,89,89,
105,93,93,85,77,85,89,93,85,85,89,81,89,93,85,85,81,85,85,81,81,81,81,85,81,85,85,81,81,85,85,81,81,85,85,85,89,85,85,85,85,85,85,89,85,81,81,85,85,85,81,85,81,81,81,81,81,81,81,81,81,77,81,85,85,85,93,85,89,89,85,85,85,89,113,130,130,125,125,130,158,150,134,134,130,125,130,130,117,109,97,97,93,89,93,89,85,81,81,81,81,81,81,81,81,81,81,77,77,77,73,77,77,77,73,73,77,73,73,73,73,81,85,81,85,85,81,81,81,77,85,89,85,89,93,101,109,101,89,85,85,85,85,85,85,89,85,85,89,93,125,125,125,117,113,109,130,146,146,154,170,174,154,178,154,146,150,170,162,170,178,174,170,170,170,162,154,142,125,125,125,130,125,125,142,154,166,178,178,174,170,162,150,142,142,142,138,134,146,146,138,134,130,134,142,150,162,174,178,178,178,182,182,178,166,158,150,146,158,166,158,150,134,134,134,138,138,146,166,174,158,166,138,130,130,130,125,130,130,125,121,105,101,101,101,89,101,101,97,93,97,101,89,93,89,97,
101,89,85,89,93,93,89,89,93,89,89,89,89,85,89,85,89,85,89,85,85,81,81,85,81,85,85,85,81,81,81,81,81,81,81,85,81,85,85,81,81,81,81,85,81,81,81,81,81,81,85,81,77,81,81,81,81,81,81,77,81,77,81,81,85,81,85,85,81,85,85,85,89,93,97,117,134,130,130,142,150,138,138,134,134,130,125,130,117,101,97,89,89,89,85,89,85,85,81,81,81,81,77,81,81,81,77,77,77,77,77,77,77,77,77,73,73,77,73,77,77,73,73,77,77,77,81,77,77,81,89,81,81,85,85,101,105,89,89,81,81,85,85,77,81,81,81,85,85,93,105,121,109,93,97,89,101,101,117,134,134,130,134,150,166,170,150,162,162,150,138,134,138,142,134,134,138,130,130,125,130,130,134,130,130,134,138,138,154,154,170,174,178,178,174,178,170,170,174,170,154,146,146,158,178,174,174,170,166,150,150,150,146,150,158,174,174,182,170,162,174,170,158,166,166,166,170,178,178,170,146,138,134,130,125,121,125,125,125,130,101,105,101,97,105,117,109,109,101,101,93,97,89,89,89,93,
93,93,101,97,89,97,101,93,93,89,85,85,93,93,89,89,85,89,85,85,81,81,85,81,81,85,85,81,81,81,81,77,81,81,81,81,81,77,81,81,81,81,81,81,77,77,77,77,77,81,81,81,77,77,77,77,77,77,77,77,77,77,77,77,81,77,81,81,81,81,85,85,89,89,101,89,105,134,130,134,138,150,146,134,134,130,125,125,117,105,97,97,89,89,89,81,85,81,81,81,77,81,81,81,81,81,77,77,77,77,77,77,77,77,73,73,73,73,73,73,73,73,73,73,73,81,77,77,73,77,89,81,81,81,93,97,93,93,81,77,81,77,81,77,77,77,81,81,85,85,85,113,89,81,81,77,77,89,97,109,109,134,142,130,162,178,170,162,134,130,125,130,134,121,121,121,109,125,125,130,121,117,117,134,130,134,134,138,134,138,138,138,142,146,146,146,146,150,146,158,174,174,170,166,146,138,134,178,178,142,134,134,130,130,138,138,146,146,138,134,150,170,178,158,162,166,158,138,134,130,130,130,130,125,121,121,125,121,125,105,97,97,97,109,105,109,101,97,97,89,93,97,93,89,85,89,
101,105,97,101,101,101,97,97,93,89,93,89,89,89,85,89,85,85,85,81,81,85,85,85,89,85,85,85,85,81,81,81,77,77,77,77,77,77,77,81,77,77,77,77,77,77,77,77,77,77,81,77,77,73,77,77,77,77,77,77,77,77,77,77,81,81,85,77,81,81,85,85,89,89,81,89,93,113,138,130,130,138,158,146,134,134,130,130,130,117,101,97,93,85,81,81,81,81,81,77,81,81,77,77,77,77,77,77,77,77,77,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,81,93,93,85,85,81,85,81,89,97,105,93,89,77,77,77,77,77,77,77,77,77,81,81,117,101,81,77,81,81,85,93,101,97,101,109,121,138,154,150,142,130,109,105,101,97,93,97,97,101,105,105,105,101,97,101,97,109,125,134,134,134,134,142,130,130,130,125,130,138,138,138,134,146,146,138,125,121,125,134,150,150,130,125,125,125,130,138,130,130,130,121,125,134,138,138,134,138,130,125,138,138,134,125,125,130,125,125,121,105,101,101,97,101,97,93,105,105,97,97,93,93,97,93,93,85,89,93,85,
105,109,105,101,101,101,97,97,97,97,89,93,89,89,93,81,85,85,89,85,89,85,85,89,89,85,89,85,81,81,85,81,81,77,77,77,77,77,77,77,77,77,77,77,77,77,73,77,73,77,77,77,77,77,77,77,77,77,77,77,77,81,77,97,77,77,77,81,81,81,81,85,85,85,85,89,89,89,109,134,130,130,142,154,134,138,125,130,130,121,105,97,93,85,85,85,81,81,81,77,77,77,77,77,77,77,77,77,77,77,73,73,73,73,73,73,73,73,73,73,73,73,77,73,73,73,73,81,97,101,93,85,73,77,77,77,89,89,97,81,77,77,73,73,77,73,73,73,77,77,81,93,105,81,77,77,73,77,85,85,93,101,105,105,105,109,121,97,101,89,89,85,85,97,97,93,97,97,97,97,93,97,93,93,93,101,101,101,101,101,105,109,117,130,130,134,138,130,130,134,130,134,134,125,134,130,121,121,125,125,130,121,125,113,109,109,121,130,130,130,130,125,125,130,134,125,121,109,109,105,101,97,97,97,101,101,97,97,97,97,93,93,105,97,97,97,93,93,93,93,89,89,93,89,93,97,
105,101,97,101,101,105,101,105,101,97,101,97,101,93,85,85,89,85,89,85,85,85,85,89,85,85,85,81,81,81,81,77,77,81,77,77,77,77,73,77,77,73,73,77,77,77,77,73,73,73,73,73,73,73,73,73,73,73,77,77,77,81,77,85,77,77,77,81,81,81,81,85,85,85,85,89,85,93,97,109,130,125,142,138,154,138,134,134,130,117,97,93,93,85,81,81,81,77,77,77,73,77,77,77,73,73,77,73,73,73,73,73,73,73,73,73,69,73,73,73,73,73,73,69,73,73,73,73,93,105,109,101,93,73,73,77,77,81,77,77,73,73,73,73,73,73,73,69,73,73,77,85,81,77,73,73,77,81,81,85,93,93,93,97,105,97,89,89,89,85,81,85,89,93,89,93,93,97,93,89,93,93,93,93,93,89,89,89,93,89,93,93,97,105,109,117,134,134,134,138,125,121,113,105,101,97,101,105,113,109,109,105,101,97,97,101,101,101,105,109,113,117,121,113,105,105,97,93,93,89,93,89,89,89,93,93,93,89,93,97,93,97,93,93,93,93,89,89,89,85,101,93,97,97,105,105,
97,97,97,97,101,101,101,105,105,101,101,93,97,97,93,101,97,93,89,89,89,89,85,81,89,89,81,81,81,81,77,77,77,77,73,77,73,73,73,73,73,73,73,73,73,73,73,69,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,77,77,77,77,81,81,81,85,85,93,89,89,89,93,101,105,130,130,134,134,146,146,138,130,125,113,105,93,89,85,81,81,73,73,77,73,77,77,73,77,73,73,77,73,69,73,73,73,73,73,73,69,69,73,69,73,73,69,73,73,69,73,73,77,97,97,93,81,77,77,69,69,73,77,73,73,69,73,73,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,81,81,81,77,81,81,81,77,77,77,81,81,85,85,89,85,85,93,89,93,89,89,89,85,89,89,89,85,85,89,89,89,89,89,89,93,105,101,113,117,117,109,101,93,101,93,93,93,97,97,105,105,97,93,89,89,93,85,85,85,89,93,97,93,93,89,93,89,89,89,89,85,85,85,89,89,89,89,89,93,93,97,97,97,97,97,97,97,93,97,101,105,105,101,101,93,105,
89,93,97,93,93,93,97,101,105,105,105,105,101,101,97,97,101,97,101,97,97,89,93,89,85,89,85,81,81,77,81,77,77,77,77,77,77,73,73,73,73,77,73,73,73,73,73,73,73,73,73,69,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,77,81,77,81,81,85,81,85,85,85,89,89,89,89,101,125,130,117,125,138,138,130,130,134,117,109,93,97,89,85,81,85,77,77,81,77,77,77,77,77,77,77,77,73,73,73,77,73,73,73,69,69,73,73,69,73,73,69,73,73,73,69,73,73,73,73,73,73,69,69,69,73,73,73,77,73,73,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,81,81,77,77,73,77,73,73,73,77,81,81,81,85,81,85,85,85,85,85,89,89,89,85,85,89,97,101,89,89,85,85,89,89,93,97,101,101,113,121,105,101,89,85,93,89,85,89,89,93,93,93,89,89,89,89,85,85,85,85,81,81,81,81,81,85,85,89,85,85,85,89,85,85,85,89,85,93,93,97,101,101,97,97,97,97,93,101,101,113,105,105,89,89,85,89,
89,89,89,89,93,93,93,97,101,101,105,105,105,105,101,97,101,105,97,97,93,93,89,89,89,85,85,85,77,77,77,77,77,77,77,73,77,77,73,73,73,73,73,73,73,73,69,73,73,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,77,77,77,77,77,77,77,81,85,85,85,85,89,93,89,89,121,138,134,113,121,138,125,101,97,89,93,89,89,101,97,85,97,85,69,69,81,77,81,77,77,77,77,77,77,77,69,69,73,73,69,73,69,69,69,69,73,73,73,69,69,69,69,69,69,73,73,69,73,73,69,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,77,73,73,77,77,77,73,73,73,73,73,73,77,77,77,77,81,81,77,81,81,85,85,85,85,85,85,85,93,105,109,101,93,89,89,85,85,89,89,89,89,93,89,89,89,81,81,81,85,85,85,85,85,85,85,85,85,85,81,81,81,85,81,81,81,81,77,81,81,85,89,85,85,85,85,85,85,85,89,85,93,93,93,109,105,101,101,93,101,101,101,105,113,97,89,81,85,89,85,85,
81,85,89,85,89,93,93,97,105,97,97,97,93,97,93,97,101,101,105,101,97,93,89,93,89,89,85,81,81,81,77,77,77,77,77,77,77,77,73,73,73,69,73,73,73,73,73,73,73,69,69,73,73,73,73,77,73,73,73,73,73,73,77,77,77,77,73,77,77,77,77,77,77,77,77,81,81,85,85,85,85,89,89,85,97,134,150,134,113,125,113,93,93,93,113,130,125,125,105,89,105,85,101,93,81,85,89,93,77,73,69,81,77,69,81,73,77,73,65,73,73,69,69,69,69,69,69,69,69,69,69,69,69,69,73,73,69,69,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,81,81,81,81,85,85,81,81,81,85,93,101,109,105,97,85,89,89,85,81,81,81,85,81,81,81,81,77,81,81,81,81,81,81,81,81,85,81,81,85,81,81,81,81,81,81,81,81,81,81,81,81,85,85,81,81,81,81,85,81,81,81,89,97,97,101,101,101,105,105,101,97,105,101,105,85,81,77,81,77,81,81,85,
81,85,85,85,89,85,85,93,93,93,85,89,93,93,97,93,93,97,101,97,97,93,93,89,93,89,89,89,85,89,85,77,81,77,77,77,85,77,69,65,73,77,77,73,73,73,73,73,73,73,73,73,77,73,73,73,73,73,69,73,73,73,73,77,77,77,77,77,77,77,77,73,77,77,81,77,81,81,85,85,89,97,89,89,81,73,89,105,130,125,117,121,105,101,109,125,134,138,101,93,89,113,93,93,101,89,93,81,89,85,81,81,81,81,73,73,73,77,81,77,77,73,73,69,69,73,69,69,69,69,69,69,69,69,73,69,77,69,69,73,73,73,73,69,69,73,69,73,69,69,73,73,69,69,69,73,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,81,81,77,81,81,85,85,85,89,89,97,105,109,105,97,89,85,81,85,81,81,81,81,81,81,81,77,81,77,81,81,81,81,81,81,81,81,81,81,81,81,77,77,77,81,81,81,81,81,81,81,81,81,81,81,77,81,81,81,89,89,89,97,101,93,101,101,101,97,101,109,93,89,81,81,81,77,77,77,81,81,81,
85,85,81,85,85,85,89,81,85,81,85,85,85,85,93,89,93,93,101,101,101,97,93,93,93,89,89,89,89,89,85,89,81,77,81,89,81,81,73,77,77,77,77,73,73,73,69,73,73,73,73,73,69,73,73,69,69,73,77,73,73,73,73,73,69,73,73,73,77,73,73,73,77,77,81,85,85,81,81,89,97,97,89,89,89,85,81,89,89,101,113,97,117,105,125,105,89,85,109,113,97,109,113,105,97,109,105,101,113,69,69,85,85,93,93,93,85,85,81,77,77,77,69,73,69,73,69,69,69,69,69,69,69,69,69,69,73,69,69,73,73,73,69,73,69,73,69,69,69,69,69,69,69,69,69,69,69,69,69,69,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,81,81,81,77,85,89,101,93,93,101,113,113,113,97,81,77,81,81,81,81,81,81,81,77,77,77,77,77,85,81,81,81,81,81,77,77,81,77,81,81,81,77,81,77,77,77,81,81,77,81,81,81,81,81,77,81,81,85,89,89,97,97,97,97,97,101,97,97,89,81,85,81,77,77,73,77,77,77,77,77,81,
81,81,81,81,85,81,81,81,81,85,85,85,85,89,89,85,89,93,97,101,101,101,97,93,93,93,93,89,89,85,89,81,81,81,81,81,77,81,81,77,77,77,77,77,73,73,73,73,73,73,69,77,77,69,73,77,73,73,73,77,77,77,73,73,77,77,73,73,73,73,73,73,73,77,77,77,77,81,89,93,93,93,89,85,81,89,93,93,89,89,93,97,85,81,77,93,81,81,93,113,105,101,113,109,105,109,97,109,121,101,73,81,81,89,93,93,89,81,77,77,73,73,69,69,69,65,69,65,69,69,69,69,69,73,69,73,73,69,69,73,73,73,73,69,73,69,69,69,69,73,69,69,69,73,69,69,69,69,69,69,69,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,77,81,77,85,109,113,117,109,105,109,117,117,97,81,77,77,81,77,77,81,77,77,77,77,77,77,81,81,81,81,81,81,77,77,77,81,77,77,77,77,77,77,77,77,77,77,77,77,77,77,81,81,81,81,85,85,89,89,97,97,101,93,93,97,101,93,89,81,81,77,77,73,73,69,73,73,73,73,73,77,
77,77,81,73,73,81,81,77,77,81,81,81,77,85,89,89,93,93,97,97,101,101,101,93,97,93,93,89,89,89,85,93,89,81,81,85,89,81,81,81,77,73,77,77,73,77,73,69,65,73,73,77,73,81,77,77,77,73,77,77,81,77,73,73,73,73,73,73,73,69,73,73,73,73,73,77,77,85,89,85,89,89,89,85,89,85,89,89,89,85,89,97,89,85,97,105,113,85,85,101,97,101,109,97,101,105,101,97,109,109,85,73,77,85,93,93,89,89,85,85,85,77,77,73,69,77,73,77,73,73,69,69,69,69,73,69,69,69,69,73,73,73,73,69,65,77,73,69,69,69,69,69,73,69,69,69,69,69,69,69,69,73,69,73,73,69,69,73,73,73,73,77,73,77,77,73,81,77,73,85,113,117,117,117,113,109,117,113,85,73,77,77,81,77,77,77,81,81,81,85,81,77,77,81,77,77,77,77,77,77,77,73,77,77,77,77,77,77,73,77,77,77,77,77,77,77,81,85,81,81,85,85,93,93,97,97,93,97,93,101,81,85,81,77,81,77,73,73,69,69,69,69,69,73,73,73,
77,77,77,73,77,77,81,81,81,81,77,81,81,81,85,89,89,93,97,97,97,101,101,97,97,93,93,89,85,89,85,85,89,93,93,89,85,89,85,85,85,81,81,77,77,77,73,73,81,77,77,77,77,77,77,81,73,73,77,85,93,81,77,77,73,73,73,69,69,73,69,73,73,77,77,77,85,85,85,89,89,93,89,89,93,89,89,85,85,85,85,89,93,85,93,97,101,97,93,97,89,97,109,101,97,97,93,93,97,113,89,65,85,81,77,85,89,77,81,81,77,73,77,73,81,65,73,77,81,81,73,65,69,77,81,69,69,65,69,69,73,69,69,73,69,69,69,69,69,69,69,69,69,69,69,69,73,73,69,69,69,69,69,73,73,69,69,73,69,73,73,73,77,77,77,81,77,73,73,73,101,113,121,113,113,113,109,97,81,77,73,77,77,77,77,81,81,81,81,81,81,77,77,81,77,77,77,77,77,81,73,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,81,85,85,89,89,89,97,93,93,93,93,93,89,85,89,89,77,73,69,69,69,69,69,69,69,69,69,69,73,
77,77,77,77,77,77,77,73,85,77,81,77,81,85,81,85,89,89,93,93,97,97,105,101,97,97,93,93,89,89,93,93,93,93,89,89,89,85,85,81,81,81,77,77,77,77,73,77,77,81,81,77,77,77,77,81,77,73,77,77,69,73,69,73,73,69,73,73,81,77,77,77,77,77,77,81,85,85,89,81,89,85,81,89,89,89,89,93,85,85,85,81,85,89,93,97,97,97,93,89,101,93,97,93,93,89,93,93,97,105,81,65,73,81,73,73,77,81,85,93,89,93,97,89,93,93,93,85,81,85,77,77,69,77,65,69,65,65,65,65,73,77,73,77,65,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,73,73,77,77,77,77,77,73,69,93,89,89,93,101,109,109,113,113,101,73,77,77,73,77,77,81,81,85,85,77,77,81,81,81,81,81,81,81,81,81,77,77,77,77,73,77,77,73,73,77,73,73,73,77,73,77,81,77,81,85,85,85,85,93,93,101,93,93,89,85,93,81,93,85,85,81,77,69,69,69,65,65,69,65,69,69,69,69,
73,77,73,73,77,77,73,81,81,81,81,81,81,85,85,85,89,89,93,93,97,97,101,101,101,97,93,89,97,97,97,97,93,93,89,93,85,85,81,89,85,73,77,77,85,85,85,89,81,81,81,81,81,77,81,81,85,77,73,73,73,69,73,73,73,73,69,69,77,73,77,77,77,77,77,85,85,89,73,109,93,81,89,85,85,89,85,93,93,81,85,81,81,81,93,89,93,89,89,97,97,93,93,93,89,89,93,93,105,105,65,77,77,73,77,77,77,77,81,81,85,85,97,101,97,89,81,81,89,81,77,77,73,69,69,65,65,69,69,69,69,73,81,73,77,73,69,69,69,69,69,69,69,69,69,69,69,69,73,73,69,69,69,69,69,69,73,73,77,73,73,77,77,77,85,109,121,113,121,105,97,101,105,109,117,93,77,77,73,77,77,81,85,81,81,81,81,85,85,81,81,81,81,81,81,81,77,77,77,77,77,77,77,77,73,73,73,73,73,73,77,77,81,81,81,77,81,81,85,89,93,97,97,93,93,89,89,89,85,81,97,85,85,77,73,69,65,65,69,65,65,69,69,73,73,69,
73,73,73,73,73,73,77,77,81,81,77,81,85,85,81,81,89,89,93,93,93,97,97,101,101,101,97,97,97,101,101,97,93,93,93,89,89,89,77,81,81,81,93,93,89,89,89,85,85,85,85,85,81,81,81,81,81,77,77,77,73,69,69,69,65,73,69,69,73,73,77,77,81,81,85,85,73,89,125,134,125,89,85,85,85,81,81,89,81,89,81,85,89,89,89,85,93,93,89,97,101,93,85,89,93,93,97,101,121,77,56,85,81,81,73,77,77,77,77,81,81,85,89,93,101,97,89,85,85,81,85,89,73,77,73,73,69,69,69,69,73,81,77,81,97,73,69,69,69,69,69,69,69,69,73,73,69,73,73,73,73,73,69,69,69,69,73,73,81,73,73,77,73,77,93,105,101,89,89,105,97,93,97,101,97,81,81,73,77,77,77,81,85,85,81,81,81,85,81,81,85,81,81,81,81,77,81,77,77,77,81,81,81,77,77,73,77,73,73,77,77,81,81,85,85,81,81,89,89,93,93,97,97,89,89,89,89,89,85,89,89,85,85,77,69,77,69,69,69,65,65,65,69,73,73,69,
73,73,73,73,73,73,77,81,77,77,81,81,77,85,85,81,81,81,93,93,93,93,97,97,97,89,93,97,97,101,101,97,97,93,89,93,93,89,81,85,101,101,97,97,93,89,89,89,85,85,85,85,85,81,81,81,77,85,77,77,69,65,73,73,73,69,73,73,73,73,77,77,81,81,85,77,97,121,134,134,130,97,81,73,73,77,73,73,89,101,85,81,81,89,89,89,93,97,93,97,89,89,113,105,101,109,93,105,81,48,77,85,81,73,77,77,81,85,81,81,85,85,89,89,97,101,101,89,81,89,89,93,97,85,77,77,73,73,73,69,77,77,81,89,89,73,69,69,65,69,69,69,69,69,77,81,81,77,81,77,77,73,69,69,65,65,69,81,81,81,77,77,77,81,105,97,81,85,85,89,97,97,109,105,101,81,77,81,81,81,81,81,81,81,81,77,85,85,81,81,85,85,81,85,85,85,85,81,77,77,77,81,81,77,73,77,77,73,77,77,77,81,85,81,85,85,85,85,93,93,97,97,101,85,85,85,89,89,85,85,89,81,77,77,69,93,105,93,65,65,65,65,69,69,69,69,
69,69,73,69,73,73,77,77,73,77,77,73,81,85,85,85,89,85,93,97,89,89,89,89,89,93,93,93,93,101,105,101,93,93,97,97,93,93,97,101,93,101,101,97,93,93,93,89,89,85,85,85,81,81,81,81,81,85,81,77,69,69,73,77,77,73,73,73,73,73,81,77,81,85,77,97,130,130,158,146,142,134,125,109,117,125,125,134,109,77,77,77,85,85,85,89,81,85,89,97,113,130,134,125,65,60,52,48,48,69,85,85,81,81,81,81,85,85,85,85,85,93,93,97,101,101,101,109,109,97,109,97,97,97,93,81,73,77,73,77,77,81,85,85,85,85,73,77,69,65,69,69,73,73,81,93,93,85,85,81,81,81,73,85,93,77,69,73,73,77,81,77,77,81,81,77,81,85,85,89,109,109,109,105,93,85,73,77,77,77,77,77,81,81,81,85,85,89,97,89,85,81,85,85,85,89,89,85,81,77,81,81,81,81,81,77,77,77,77,81,81,81,81,85,81,85,89,89,97,93,97,101,93,85,89,89,85,85,81,85,97,77,77,77,93,105,117,117,113,73,60,69,73,73,69,69,
69,69,69,69,69,69,73,73,73,77,73,73,77,81,81,85,85,85,89,89,85,85,89,85,93,89,93,97,109,105,101,101,109,93,89,85,85,93,93,93,97,97,97,101,101,93,93,89,89,93,85,85,85,85,81,81,81,81,81,81,73,73,73,77,77,73,73,73,77,81,81,81,85,85,85,117,134,134,134,125,138,134,134,130,134,138,138,125,113,117,121,109,77,77,81,81,89,93,109,121,134,142,138,97,89,77,73,69,69,73,77,85,81,81,81,77,85,85,85,89,93,93,93,97,101,105,105,101,97,101,113,105,101,93,89,89,89,77,81,81,89,89,89,89,89,89,89,73,73,69,65,69,69,73,77,93,101,93,89,81,77,77,81,77,117,93,77,73,73,73,77,77,77,77,77,77,81,85,93,105,109,117,113,109,89,85,97,77,81,77,81,77,81,81,81,81,89,85,89,89,85,85,81,85,85,89,89,85,85,81,81,81,81,81,81,81,77,77,77,77,81,81,85,85,81,85,89,89,97,97,97,97,93,81,85,81,85,81,81,81,93,81,77,77,85,113,117,121,117,113,81,65,69,69,73,69,
69,69,65,69,69,69,65,73,73,77,77,73,81,81,81,81,85,81,89,81,85,81,85,85,89,93,97,101,105,101,97,93,77,85,85,89,85,89,89,89,93,97,97,97,101,93,93,89,89,89,85,85,85,81,81,81,81,81,77,81,77,73,73,77,77,73,73,73,77,77,81,81,85,85,105,130,138,138,125,130,134,134,130,130,125,117,109,101,97,97,113,117,121,93,105,109,117,125,121,97,97,113,101,93,101,93,89,81,77,73,77,85,81,81,81,81,85,85,89,89,93,93,97,97,105,109,101,105,101,97,101,101,105,101,89,89,89,89,81,85,93,97,93,97,97,93,89,77,77,69,69,69,69,77,81,89,101,101,97,113,109,97,109,81,89,89,77,77,81,73,73,73,77,81,81,77,81,85,101,117,117,117,117,105,101,105,89,81,77,77,81,81,81,81,81,85,85,85,89,89,85,85,85,85,85,89,89,85,85,85,81,85,81,77,77,77,77,77,81,81,85,85,85,85,89,85,89,89,93,97,97,101,81,85,85,81,81,81,81,81,77,85,89,81,81,109,117,121,125,125,130,101,73,73,73,69,
73,69,69,69,65,65,65,73,73,73,77,77,77,81,81,81,85,81,81,85,81,81,81,85,89,89,97,97,89,93,85,77,85,81,89,85,85,89,89,93,97,97,97,101,101,93,93,89,89,89,89,85,85,85,85,81,81,77,81,77,77,77,73,77,73,73,77,73,77,77,81,81,85,85,125,130,142,130,125,130,134,134,134,134,130,130,134,117,113,105,93,93,93,89,89,93,93,97,93,89,89,109,93,89,101,89,93,89,77,77,97,89,77,85,85,85,85,85,89,89,93,97,97,101,105,109,109,101,101,105,97,93,97,93,93,97,93,93,93,93,97,93,97,101,101,97,85,81,77,69,69,69,73,77,81,89,101,113,109,121,97,93,89,81,89,81,85,77,77,73,73,77,77,81,77,81,81,85,97,130,134,125,125,125,97,89,89,81,81,81,77,81,81,81,81,85,85,85,85,85,89,89,85,85,85,89,89,89,85,85,85,81,77,77,77,81,81,73,81,85,85,89,89,89,89,93,93,97,93,93,93,93,81,85,85,85,81,81,81,81,85,89,85,89,85,113,117,121,130,130,130,117,73,69,69,69,
73,69,69,65,65,65,73,73,73,73,73,77,77,73,81,85,77,81,81,81,77,81,81,85,81,89,85,93,97,77,85,81,81,85,81,85,85,89,89,89,93,97,97,101,101,93,93,89,89,85,89,85,85,81,81,81,81,77,77,77,77,73,77,77,77,77,77,77,81,81,81,85,89,89,130,138,138,134,117,134,134,134,134,134,130,117,117,130,117,113,109,105,105,105,101,97,97,93,89,89,93,93,81,85,113,101,97,93,77,97,85,77,77,77,81,81,85,81,89,89,93,97,101,105,105,101,101,101,97,97,97,85,85,85,89,93,97,101,105,101,101,93,93,89,93,85,85,85,73,77,65,73,73,77,77,85,93,105,105,101,93,89,81,73,73,81,81,81,77,73,77,73,81,77,81,85,89,93,109,121,130,130,113,101,89,89,85,81,81,81,81,81,81,81,85,85,85,85,89,89,89,89,85,93,89,89,89,89,89,89,89,85,85,81,81,77,77,77,85,85,85,89,89,89,89,93,101,101,89,89,93,89,85,81,77,85,81,77,77,81,81,89,93,81,81,101,117,125,130,130,130,121,89,73,73,73,
77,73,69,69,65,69,73,73,73,73,77,77,73,77,81,77,81,81,81,77,81,81,81,85,89,81,89,89,77,81,81,85,81,81,81,85,85,85,89,89,89,93,93,97,101,93,93,89,89,89,89,89,85,81,85,77,81,81,77,77,73,73,73,77,77,77,77,81,81,81,85,89,85,89,125,138,142,138,125,138,134,134,134,134,134,134,134,130,121,113,109,105,105,101,101,97,101,113,97,85,85,81,77,89,101,89,85,77,85,97,89,77,81,81,81,81,81,89,85,89,85,97,101,109,109,101,97,101,117,97,93,85,85,85,85,89,97,97,89,93,89,89,85,89,85,85,81,89,85,77,73,69,73,73,77,85,93,93,97,93,85,85,77,77,77,77,89,89,81,73,73,81,81,81,89,101,105,105,125,130,130,125,101,89,89,89,85,81,81,81,81,81,81,81,85,85,85,89,89,89,85,89,93,85,89,89,89,85,89,89,89,89,89,85,81,81,81,81,85,89,89,93,93,93,93,93,97,93,85,89,89,81,81,85,81,81,81,81,81,77,81,85,93,89,81,105,121,125,125,125,130,125,113,69,73,73,
77,85,81,73,69,73,73,73,73,73,73,73,77,77,69,73,73,77,77,77,77,81,81,85,81,85,81,77,81,85,81,77,81,77,81,85,85,85,89,93,93,93,93,97,101,97,97,93,89,89,89,89,89,85,85,81,81,81,81,81,73,73,77,73,73,77,81,81,81,81,85,85,85,101,130,146,154,150,138,134,134,134,134,134,134,134,134,130,121,113,109,109,101,101,105,117,121,121,109,93,77,73,85,85,81,81,77,69,81,97,81,81,77,81,81,85,85,89,89,89,93,93,97,109,101,101,97,101,97,93,105,97,85,85,81,85,89,97,93,89,85,89,85,81,81,77,85,77,81,81,77,73,69,77,81,85,89,89,85,81,85,77,77,77,77,73,81,85,77,77,77,77,73,85,97,105,109,121,125,130,130,117,97,93,89,85,85,81,81,81,81,81,81,89,85,89,89,89,89,89,89,93,93,93,89,93,93,89,89,93,89,89,89,85,85,81,81,81,89,89,93,97,93,97,97,97,97,89,89,89,85,81,81,81,89,81,81,81,77,81,81,81,81,97,101,101,130,125,125,125,125,121,109,89,69,73,
81,97,121,73,69,69,73,73,73,73,73,73,73,77,77,73,69,73,77,77,77,85,85,77,81,81,81,77,81,81,81,81,77,77,81,85,85,89,85,85,89,93,93,101,101,105,97,97,97,93,93,89,85,85,85,81,81,81,81,77,77,73,73,77,77,77,81,81,81,85,85,89,85,101,130,146,166,162,134,117,134,134,134,134,134,134,130,130,125,117,113,105,105,101,97,97,101,109,113,101,81,69,77,73,73,73,77,73,85,77,77,77,81,81,81,85,85,85,85,89,89,101,101,97,97,97,97,93,89,89,93,97,101,85,85,89,85,85,81,85,81,85,81,81,85,77,73,77,85,77,77,73,73,73,73,81,81,85,81,81,81,77,81,81,81,81,81,81,81,77,77,81,81,117,125,109,134,125,130,130,117,101,97,89,89,85,85,81,85,85,81,85,85,85,89,89,89,89,93,93,89,93,93,89,93,93,93,93,93,89,89,89,93,93,89,85,89,85,93,89,89,89,93,93,93,93,97,89,85,85,85,81,77,81,81,81,77,73,77,81,77,77,81,81,105,93,134,130,125,125,125,125,121,113,109,97,
101,85,81,73,69,69,73,73,69,73,69,73,73,73,73,73,73,73,77,77,81,81,81,81,77,81,77,77,81,77,81,77,77,77,77,81,85,89,85,89,93,97,97,97,97,93,101,101,97,97,93,89,89,81,85,81,81,81,85,77,77,73,77,81,77,81,77,81,81,81,85,85,85,105,130,154,166,162,154,134,134,134,134,134,134,130,130,130,121,121,85,69,60,65,65,65,69,69,69,77,69,77,77,77,73,77,65,85,85,77,77,81,89,85,81,81,85,85,89,89,101,101,93,97,93,89,89,93,85,89,89,93,85,101,81,89,85,81,85,77,85,81,77,77,81,77,77,77,81,85,89,77,77,77,77,81,81,81,81,85,81,81,81,81,81,81,81,81,81,81,77,89,105,109,109,117,134,134,130,113,101,97,97,93,89,89,85,85,81,85,85,85,85,85,89,93,93,93,93,93,97,93,97,97,93,93,93,89,89,93,89,89,89,85,85,89,89,85,85,85,89,89,89,93,89,89,93,85,89,85,85,81,77,77,101,97,81,81,77,73,73,77,81,81,89,93,121,121,125,125,130,130,125,113,117,117,
117,73,77,73,69,69,69,69,73,73,73,77,77,73,73,73,77,77,77,77,77,73,85,81,81,77,81,77,77,77,77,77,77,77,81,81,85,85,89,89,89,89,89,93,101,97,93,101,97,93,93,89,85,85,81,85,81,81,81,81,77,77,77,77,77,77,81,81,81,81,85,85,89,101,134,150,170,174,178,142,121,134,134,134,134,130,125,125,105,77,60,65,60,60,60,65,60,65,65,65,65,69,69,73,73,77,81,81,77,77,81,81,81,85,85,85,85,93,93,97,101,101,93,89,89,85,85,85,89,85,85,93,97,105,89,85,85,81,73,81,73,77,81,77,77,73,69,73,73,81,81,77,85,81,81,81,81,81,81,81,85,81,85,81,81,85,85,81,81,81,81,89,105,101,113,125,130,134,121,105,101,97,97,93,93,89,89,85,85,85,85,85,85,85,93,93,93,97,97,93,93,97,93,93,97,93,93,89,89,89,89,85,89,81,81,81,85,85,89,85,85,85,85,89,89,89,89,81,81,77,81,85,93,97,113,89,73,77,73,73,73,73,77,89,77,101,130,125,125,121,121,121,121,117,117,125,
134,81,73,73,73,73,73,73,69,69,73,73,77,77,73,73,73,73,77,77,77,81,81,77,77,77,73,73,77,73,73,73,77,81,81,81,81,81,89,85,89,89,89,93,93,93,97,101,101,97,93,89,85,85,85,81,81,81,81,77,77,81,77,85,81,81,81,85,85,85,85,89,89,97,130,142,166,170,178,142,125,130,134,134,134,125,105,85,73,60,60,56,60,60,60,60,65,65,60,65,65,65,65,69,69,73,73,77,77,81,81,81,81,85,85,89,93,89,97,101,113,101,93,89,85,85,85,89,89,85,81,81,81,93,89,89,81,77,77,77,77,77,77,73,73,73,73,69,77,81,89,97,85,85,81,81,85,85,85,89,85,93,89,85,85,85,85,85,81,81,77,85,93,97,117,130,130,134,134,117,109,101,97,93,93,93,89,85,85,85,85,85,89,89,89,93,93,97,97,97,97,97,93,93,93,93,89,89,85,85,85,85,85,81,85,85,85,81,85,85,81,81,85,85,85,85,89,81,81,81,81,89,105,117,109,85,77,73,73,77,73,73,77,77,81,93,125,130,121,117,117,117,117,121,130,138,
105,81,73,73,73,73,73,69,69,73,73,73,77,77,77,77,77,77,81,81,77,77,77,77,77,73,73,73,73,69,77,77,77,77,77,81,81,85,85,85,85,85,89,89,93,93,97,101,97,97,93,89,89,89,85,85,85,81,81,81,77,77,81,81,85,81,81,81,89,89,89,85,89,93,125,146,170,166,166,142,134,134,134,134,134,121,97,85,69,65,60,56,60,60,65,65,69,65,60,65,65,60,60,65,69,69,73,73,77,77,81,85,85,85,89,89,93,97,101,97,101,105,93,89,89,89,85,85,85,85,81,81,85,109,93,81,77,77,73,77,69,65,73,73,73,73,69,69,69,77,85,93,93,85,97,89,85,85,81,89,93,97,85,85,97,93,85,85,81,81,81,81,85,89,113,130,134,130,125,113,93,93,97,93,93,93,93,89,89,89,89,89,93,89,89,93,97,97,97,97,97,93,93,89,89,93,89,85,85,85,85,85,85,81,77,81,85,81,81,81,81,81,81,81,85,85,89,81,81,81,81,93,117,121,93,77,73,73,73,73,77,73,77,77,77,105,113,130,125,113,117,113,113,109,113,113,
89,81,77,77,77,73,73,69,69,69,73,73,73,77,77,77,77,85,81,73,77,77,73,73,73,73,73,73,73,73,69,73,73,77,81,77,81,81,81,81,81,85,89,89,93,97,97,101,97,97,93,93,93,89,85,85,85,85,85,85,81,85,85,85,85,85,85,85,93,89,89,81,93,97,130,142,170,170,166,150,134,134,134,134,134,121,101,81,65,56,60,60,65,65,69,69,69,69,65,69,65,65,65,69,69,69,73,73,77,77,81,81,81,89,85,89,93,97,101,97,97,89,89,89,89,81,85,85,85,81,73,77,93,101,77,73,77,81,81,77,77,69,73,73,73,69,65,65,69,73,85,93,97,97,101,105,105,97,113,97,109,101,101,125,125,101,89,85,81,81,77,77,81,85,97,121,117,97,101,97,93,93,93,89,89,93,89,93,89,89,93,93,89,93,93,89,97,97,97,93,97,93,93,89,89,89,85,85,85,85,85,85,81,81,81,81,81,81,77,81,81,81,81,81,81,85,85,77,77,73,81,97,109,97,85,81,77,77,77,77,69,73,73,81,81,97,134,125,130,125,117,109,105,105,97,93,
93,77,81,81,69,73,69,69,69,69,69,69,69,73,73,81,85,77,77,73,73,69,73,73,73,69,69,73,73,73,73,73,77,77,77,77,77,77,81,85,89,85,89,93,93,93,97,101,97,97,97,93,89,93,89,85,89,85,81,85,85,89,81,85,85,85,81,81,89,89,93,93,101,97,130,138,162,170,162,158,138,134,134,134,134,125,101,77,65,60,60,60,65,65,69,69,69,69,69,69,69,69,65,65,69,69,73,77,77,77,81,85,85,81,85,97,93,101,93,97,97,93,89,89,85,85,85,89,89,77,73,85,85,85,77,77,77,73,73,77,81,81,77,77,69,65,65,65,65,69,77,85,101,101,101,101,109,117,113,109,113,109,97,130,121,97,89,85,81,81,77,77,81,77,85,101,105,93,93,89,85,89,89,93,93,89,89,89,93,89,89,93,93,93,93,93,101,93,93,93,93,89,89,89,89,85,85,85,85,85,85,81,85,77,81,77,77,77,77,81,77,77,77,81,81,81,81,77,77,77,77,109,97,81,77,69,77,77,73,73,73,73,77,77,77,81,138,154,162,130,113,113,113,105,97,101,
109,109,105,93,89,77,77,73,69,69,69,69,73,73,77,81,77,85,73,73,73,73,73,73,73,73,69,69,73,73,69,73,77,73,73,73,77,77,81,81,81,85,85,89,93,93,97,101,101,97,93,93,93,89,89,89,85,81,85,85,85,85,81,81,85,89,85,89,93,89,89,93,101,97,125,130,166,174,170,162,146,130,134,134,134,125,101,77,65,65,65,65,65,69,69,73,73,73,73,73,73,69,69,69,69,73,73,77,77,81,77,85,85,85,89,89,93,97,93,93,93,89,93,85,93,101,89,81,77,81,93,93,85,77,77,77,73,77,77,77,77,81,81,77,73,69,65,65,65,73,77,77,93,109,105,109,105,113,113,117,113,109,97,101,97,93,89,85,81,81,77,77,77,73,77,85,89,85,89,89,93,85,89,89,89,89,89,89,89,89,93,93,97,93,93,97,97,93,89,89,89,89,89,85,85,89,81,85,81,81,81,81,81,81,81,77,81,77,81,77,77,77,77,77,77,77,81,77,77,73,81,93,85,81,85,85,73,73,73,77,69,73,73,73,73,77,109,170,162,142,117,117,117,113,105,97,
125,130,130,125,101,89,77,69,69,69,69,73,73,77,77,69,73,77,73,73,73,73,73,73,73,73,69,69,73,73,73,77,73,73,73,73,77,77,81,81,81,85,85,89,89,89,97,101,101,97,97,93,93,89,85,85,85,85,81,85,81,85,81,85,85,89,89,89,93,97,93,93,93,93,121,130,154,174,174,154,146,138,134,134,134,125,105,77,69,65,65,65,69,73,73,73,73,73,73,73,73,69,69,69,69,73,77,77,77,81,77,81,85,89,89,93,97,93,89,93,89,89,85,89,85,89,93,77,85,81,89,81,81,81,77,77,77,77,73,73,73,77,77,73,73,73,69,65,65,69,69,81,85,101,113,101,105,101,101,109,109,101,97,97,93,93,89,81,81,77,77,73,73,73,73,81,85,85,89,89,89,93,89,93,93,89,93,93,93,93,93,93,93,93,97,97,93,93,89,89,89,89,85,85,85,81,81,81,81,81,81,81,77,77,77,77,77,77,73,73,73,77,77,77,77,77,81,77,77,73,81,101,117,89,97,89,77,73,73,77,73,69,69,73,73,77,85,130,158,146,125,130,125,121,117,121,
130,134,134,125,113,109,89,81,77,69,69,73,69,93,73,73,73,73,73,73,73,73,69,69,73,73,69,69,69,69,73,73,73,73,73,73,77,77,81,81,81,85,89,89,85,89,93,97,101,93,93,93,93,89,89,85,85,81,89,85,85,81,81,81,85,89,93,89,93,97,93,89,93,93,113,134,158,170,174,158,134,125,138,134,134,125,101,81,69,65,65,69,69,69,73,73,73,73,73,73,73,69,73,73,73,73,77,77,77,77,77,81,85,89,89,93,101,93,89,85,89,89,85,85,85,81,89,93,85,77,81,77,85,93,81,73,73,73,77,77,77,73,73,73,73,69,69,69,69,65,69,77,81,85,97,105,105,105,97,101,101,105,105,105,97,89,85,81,77,77,73,69,73,77,77,77,81,85,85,89,89,93,93,93,93,93,93,93,93,93,93,97,93,101,97,97,93,93,89,85,85,85,85,85,85,81,85,81,81,77,81,81,77,77,77,77,77,77,77,73,73,73,73,73,77,77,77,77,73,77,81,113,138,97,97,89,77,77,77,73,77,73,73,73,77,81,85,113,134,162,134,134,130,130,130,130,
130,130,121,117,117,113,113,101,93,73,73,73,77,73,73,77,73,73,73,69,69,73,73,69,69,69,69,69,69,69,69,73,73,77,73,77,77,81,77,81,85,89,89,85,85,89,93,97,101,97,93,93,93,89,89,85,81,85,81,77,81,81,81,85,85,89,93,93,97,97,93,89,89,89,109,125,150,170,170,170,146,125,121,138,134,134,113,93,73,65,65,65,65,69,69,69,73,73,73,73,73,73,73,73,69,77,81,81,77,77,81,81,85,89,93,97,101,93,93,89,89,85,89,81,81,81,93,81,85,89,77,77,77,77,85,89,73,77,69,77,73,77,73,77,81,73,69,69,69,69,65,77,77,81,89,97,105,97,93,97,93,97,97,101,89,89,85,81,77,73,73,73,73,73,77,81,85,81,85,85,89,93,97,93,93,93,97,93,97,97,97,97,101,97,97,93,89,89,85,85,89,89,85,85,81,85,81,81,81,77,81,77,77,77,77,77,77,77,73,69,73,73,73,73,77,77,73,77,77,73,89,138,150,117,89,85,77,77,77,77,73,73,73,73,89,81,89,117,125,138,166,125,125,130,125,125,
105,105,101,105,105,109,101,93,85,77,73,73,85,73,73,73,77,73,73,73,73,73,69,69,65,65,69,73,65,73,73,73,73,73,73,73,77,77,77,81,81,85,85,85,89,89,93,97,101,97,93,93,93,89,85,85,81,85,85,81,81,81,85,85,85,93,93,93,101,97,93,93,89,93,105,130,150,166,170,174,166,142,134,138,134,134,130,105,77,69,65,65,65,65,69,73,73,73,73,73,73,73,73,73,73,73,77,77,81,77,81,85,89,89,93,97,101,97,97,93,89,89,85,81,85,85,89,117,121,101,81,77,73,77,81,93,93,77,73,69,73,69,73,73,89,89,85,85,77,69,69,73,77,77,81,97,101,105,93,93,93,97,97,97,89,85,85,77,77,73,77,73,73,77,77,77,81,81,85,89,85,93,93,97,97,101,101,97,93,97,101,101,97,97,93,93,93,89,89,89,85,85,85,85,81,81,81,81,81,77,81,81,77,77,77,77,73,73,73,73,77,73,69,73,73,73,73,77,73,73,101,154,158,130,85,77,73,77,81,77,77,73,73,77,77,77,89,109,117,130,158,150,97,93,101,101,
101,101,101,97,101,89,85,85,85,77,69,89,73,69,73,73,73,73,73,73,73,73,69,69,65,69,69,65,69,69,73,77,73,73,73,73,77,77,77,81,85,85,85,85,89,93,93,93,101,97,93,93,89,93,89,85,85,81,85,85,85,89,93,89,101,81,93,89,93,93,89,89,85,89,101,130,150,170,178,178,178,138,130,134,138,134,134,121,81,73,69,69,65,65,69,73,73,73,73,73,73,73,73,73,73,73,73,77,81,81,85,85,89,89,93,101,101,97,93,89,85,89,93,85,81,81,89,97,97,81,77,77,77,73,77,73,81,89,73,69,73,73,73,73,81,97,97,93,77,73,77,69,73,77,85,93,97,109,101,93,97,93,93,93,89,93,81,77,77,73,77,73,69,73,77,81,85,85,85,85,89,93,93,97,101,97,101,97,93,101,101,101,97,93,93,93,89,89,85,81,81,81,85,81,81,81,81,81,77,77,77,77,77,73,73,73,73,73,73,73,65,69,73,73,73,73,77,73,73,81,109,142,138,130,81,73,81,73,77,77,77,73,73,73,73,81,97,117,121,130,150,142,125,109,97,101,
101,97,89,89,89,81,85,81,81,73,97,73,69,69,73,77,77,73,73,73,73,73,69,69,69,65,69,69,73,73,73,73,73,73,73,77,77,77,81,81,85,85,85,85,85,89,93,97,101,97,93,89,89,89,85,85,85,77,85,85,89,89,97,93,89,93,89,93,85,89,89,89,93,89,97,134,146,170,178,178,150,121,117,113,138,138,134,130,105,73,69,65,69,69,73,73,73,73,73,73,73,69,73,73,73,77,77,81,81,81,81,85,85,89,93,101,97,97,93,93,97,89,89,89,85,81,81,81,81,77,77,73,73,73,77,77,77,85,101,73,73,73,73,73,77,93,101,101,85,77,73,73,73,81,81,85,89,101,101,97,97,97,93,89,89,85,81,77,77,73,69,69,69,73,77,81,81,85,85,85,85,89,97,97,97,97,97,93,93,101,101,97,93,93,93,89,89,89,85,85,81,81,85,81,81,77,81,77,77,77,77,77,73,73,73,73,73,73,69,69,69,69,69,69,69,69,73,69,73,93,130,134,134,125,81,77,73,73,81,77,73,73,77,77,77,81,101,121,121,130,134,134,134,125,97,97,
93,89,89,81,81,81,81,77,73,85,77,73,73,73,73,77,77,77,73,77,73,73,69,65,69,69,69,73,69,73,69,73,73,73,73,77,77,77,81,81,85,81,81,85,85,89,93,97,101,97,93,89,89,89,85,85,81,81,85,89,93,93,97,93,89,85,85,81,81,85,85,81,85,85,93,134,146,170,170,174,142,125,117,113,138,138,138,134,117,81,69,69,69,69,73,73,73,73,73,73,73,73,73,73,69,77,77,81,81,85,85,85,85,89,93,97,97,93,97,93,93,93,89,101,89,81,77,73,77,73,73,73,73,73,73,73,77,73,85,77,73,73,73,69,73,93,105,97,85,77,85,85,73,73,77,81,89,97,105,97,101,97,93,89,85,85,81,77,73,73,69,69,69,73,77,81,85,81,85,85,85,89,97,101,93,93,93,93,93,89,93,97,93,93,93,89,85,85,81,85,81,81,81,77,81,81,77,77,77,77,77,73,73,73,73,69,69,73,69,69,65,65,65,69,69,69,73,73,77,109,130,138,138,125,85,77,73,81,77,77,73,73,73,73,85,93,105,121,121,125,130,134,138,138,109,93,
93,93,85,77,77,77,81,81,81,89,77,73,73,73,81,81,77,77,77,73,73,69,69,69,69,69,69,69,73,73,73,73,77,73,73,77,81,77,77,81,85,85,77,81,85,89,93,93,101,97,93,89,89,85,85,85,81,81,85,89,93,93,93,93,93,89,89,81,85,89,85,85,85,85,89,125,142,158,174,158,142,134,121,113,130,134,138,134,125,97,73,69,69,69,73,73,73,73,73,73,73,73,73,73,77,73,77,81,81,81,85,85,85,85,93,97,101,101,93,93,93,97,101,105,85,81,73,77,73,73,73,69,69,69,73,77,73,85,73,77,73,73,73,69,73,93,105,97,85,81,85,85,77,69,77,73,81,89,101,97,97,101,93,97,85,81,81,77,73,69,69,69,73,73,77,81,81,85,81,81,81,89,93,109,93,93,93,93,89,89,89,89,93,93,89,89,85,85,81,81,81,77,77,77,81,77,77,77,77,77,73,77,73,73,73,69,69,69,69,69,69,65,65,65,69,69,65,73,89,121,134,134,134,130,81,77,77,81,77,73,73,73,77,77,97,101,101,125,125,121,130,134,154,158,125,93,
93,89,85,73,73,77,77,77,101,73,73,73,73,73,77,77,73,73,73,73,73,69,69,69,73,69,69,69,69,73,73,73,73,73,77,77,77,81,81,81,77,81,81,85,85,89,93,97,101,101,93,89,89,85,85,85,85,85,85,89,93,97,101,93,93,93,89,85,85,85,85,85,85,85,85,125,150,162,166,162,142,138,117,130,134,121,117,138,134,109,77,69,69,73,73,73,73,73,73,73,73,73,77,73,73,77,77,85,85,89,85,85,85,89,89,101,101,97,97,101,97,93,93,89,85,77,77,73,73,73,73,69,69,69,69,73,73,81,81,73,77,73,69,73,73,81,97,93,81,81,85,85,77,69,73,77,81,85,97,97,93,109,105,93,89,85,81,77,73,69,69,69,69,77,77,81,81,81,81,81,81,89,101,117,97,93,93,89,89,89,89,89,85,89,89,89,85,85,81,81,77,81,77,77,77,77,77,77,77,77,73,69,73,73,73,73,69,73,69,65,69,65,65,65,69,65,69,89,121,125,130,121,125,121,89,77,77,77,77,73,77,77,73,77,89,105,109,125,125,125,121,134,138,154,142,93,
93,93,77,73,73,73,77,81,89,73,69,73,69,73,81,73,69,69,69,73,69,69,65,69,65,69,69,69,73,73,73,77,77,77,77,77,81,85,85,81,85,85,85,81,85,93,93,101,101,101,97,93,89,85,85,85,89,85,85,89,97,97,97,97,89,89,85,85,89,85,85,85,85,85,81,121,146,154,170,166,146,146,134,142,142,138,121,130,134,113,85,77,73,73,73,73,73,73,73,73,73,73,73,73,77,81,85,89,85,85,85,85,85,89,89,97,101,93,93,89,89,97,93,93,89,77,77,73,69,69,73,73,73,73,73,69,69,73,77,77,77,77,73,69,69,81,97,93,85,85,85,85,81,65,69,73,77,81,93,97,93,101,105,109,101,85,85,77,73,69,69,69,73,73,77,81,81,81,81,81,81,89,97,113,101,89,89,89,89,89,89,89,85,89,89,85,81,81,81,81,81,77,77,77,77,85,81,81,81,73,73,69,69,73,73,69,69,69,69,69,69,65,65,65,69,60,81,117,121,138,142,150,138,130,117,77,77,77,81,77,77,73,69,77,101,109,109,125,125,113,113,121,121,138,146,109,
89,89,73,69,73,69,73,81,77,85,69,69,73,73,73,73,69,65,69,69,65,65,69,69,69,69,73,69,73,73,73,77,73,77,77,81,81,81,85,81,89,81,85,85,85,89,101,105,101,101,93,89,89,85,85,89,89,93,97,93,97,97,89,89,89,85,85,85,85,85,85,85,85,85,81,121,134,146,150,174,150,150,130,125,130,130,117,117,138,121,93,81,73,73,73,73,73,73,77,73,77,73,73,77,77,81,89,81,81,81,85,85,85,89,89,97,97,93,93,97,89,93,97,93,89,89,85,77,73,73,73,73,77,73,73,73,73,73,73,77,81,77,97,81,69,85,97,93,85,77,81,85,81,69,69,73,77,77,89,97,89,89,93,105,97,93,85,81,73,69,73,73,73,77,77,81,81,81,77,85,85,89,93,105,105,85,89,89,85,85,89,89,85,89,85,81,81,81,77,77,77,73,77,77,73,73,69,69,73,69,73,73,73,69,69,69,65,65,65,65,65,65,65,65,60,77,121,121,125,142,146,150,170,170,142,77,77,81,77,77,69,73,73,89,109,113,117,121,113,109,109,121,121,130,117,109,
81,73,69,65,69,69,73,77,77,81,73,73,69,73,69,69,69,69,69,69,65,69,69,69,69,73,73,73,73,73,77,77,77,77,81,81,81,85,89,85,85,85,81,85,89,89,105,101,97,101,93,89,89,89,89,93,89,89,93,97,97,93,93,85,89,85,85,85,89,89,85,85,85,85,85,109,130,150,138,166,154,150,125,121,121,117,113,125,138,134,101,85,77,77,77,73,73,77,77,77,73,73,77,81,81,81,81,81,81,85,85,85,85,85,97,101,97,93,93,85,89,89,93,85,85,81,73,73,73,73,73,73,73,77,73,73,73,73,77,77,81,85,125,121,89,77,89,85,77,77,81,85,89,69,65,69,77,77,81,101,93,89,89,93,97,93,85,81,81,73,73,73,77,77,81,81,81,81,81,81,85,89,93,101,101,97,85,85,85,85,85,89,85,85,81,85,81,81,81,77,77,73,77,73,73,73,77,69,65,69,73,73,73,69,69,65,65,65,65,65,65,60,56,65,89,125,138,117,125,125,121,125,154,162,146,73,77,77,77,81,73,69,81,97,105,117,117,109,105,105,109,121,134,117,105,101,
81,65,65,69,69,73,77,81,73,73,73,69,69,69,73,73,69,69,69,69,69,73,73,73,73,73,69,77,77,73,77,77,77,81,85,81,81,85,89,85,85,85,81,89,93,97,97,97,97,101,97,93,93,93,89,97,97,93,89,93,93,89,93,89,85,85,85,85,85,85,85,85,85,85,85,93,138,142,146,166,158,150,125,121,117,113,113,125,138,138,121,93,81,77,77,77,77,77,77,77,73,77,77,77,81,85,77,77,81,81,81,89,89,85,93,101,89,93,85,85,85,89,85,93,89,81,77,77,73,73,69,69,73,73,73,69,73,77,73,81,89,109,134,130,109,81,77,77,77,77,81,81,89,73,69,69,69,73,85,93,89,85,85,89,93,97,89,85,77,73,73,73,77,81,81,81,81,77,81,81,85,89,93,97,101,97,85,85,85,85,85,85,85,85,81,81,77,77,77,81,73,77,69,73,69,65,69,69,65,60,73,89,69,69,69,73,69,69,65,65,65,69,93,93,125,130,125,113,121,117,121,125,142,174,154,81,77,77,77,77,73,73,97,97,113,121,109,101,101,109,117,121,138,113,105,101,
73,65,69,69,65,69,81,73,73,69,73,73,69,69,73,69,69,69,69,69,69,73,73,73,73,73,73,77,77,81,77,77,81,93,85,89,93,89,97,85,85,85,93,93,85,89,97,93,93,97,89,93,93,93,93,93,93,89,93,93,93,93,89,93,85,85,85,85,85,89,89,85,85,85,85,85,130,150,138,170,162,154,130,121,117,113,117,134,125,130,134,101,85,77,77,77,77,77,77,77,73,77,77,81,81,81,93,89,85,85,89,89,89,89,89,93,101,89,93,89,85,85,89,89,101,81,81,77,73,73,73,73,69,73,73,73,73,77,77,81,97,130,130,134,125,109,73,81,81,81,81,93,93,77,65,69,69,73,85,101,97,89,85,85,77,85,97,89,85,77,73,73,77,77,81,81,81,81,81,81,85,85,93,97,97,101,85,85,85,85,85,81,85,85,81,77,77,77,77,77,81,69,69,65,65,69,77,81,73,105,125,121,117,77,73,77,69,73,69,73,81,109,117,125,130,121,134,117,117,117,121,125,138,158,166,97,73,73,77,77,77,77,93,109,117,121,97,101,121,109,121,134,125,109,101,105,
81,65,69,65,65,69,69,69,73,69,69,69,69,73,73,73,73,69,69,69,69,73,69,73,73,69,73,73,77,77,77,77,81,85,93,93,93,89,93,85,89,89,89,89,89,89,93,93,97,97,97,93,93,93,93,89,93,93,89,89,93,89,89,89,85,85,85,85,89,89,85,81,81,85,85,77,117,150,146,174,166,158,134,125,117,113,117,117,125,117,138,113,93,85,77,77,77,77,77,77,77,77,77,81,81,89,89,77,81,85,85,85,85,89,89,89,97,97,93,85,85,85,81,85,93,97,85,81,85,73,73,69,69,73,73,73,73,77,81,85,113,134,134,130,130,134,125,85,85,81,85,105,101,85,65,69,73,73,89,109,109,93,85,81,81,85,93,97,85,81,73,73,77,81,77,77,77,81,77,81,85,89,93,101,97,97,101,93,85,93,85,81,81,81,77,77,81,77,81,81,69,73,65,69,69,69,105,105,101,125,130,142,130,134,130,134,109,81,77,81,105,117,130,138,117,134,130,117,117,117,121,125,138,158,166,121,69,73,73,77,73,85,105,113,121,105,97,113,109,113,134,121,113,101,101,105,
97,60,65,69,65,69,77,69,69,69,69,69,69,69,73,73,69,69,73,73,69,69,73,69,73,73,73,77,77,77,81,77,77,81,89,89,89,89,85,97,85,89,89,89,89,93,93,101,97,97,101,97,97,97,93,93,93,89,93,89,89,89,89,89,85,89,89,85,85,89,97,101,105,89,85,81,105,146,150,174,170,166,142,125,117,113,113,121,130,117,125,125,105,93,89,85,85,81,81,77,81,77,81,81,81,93,105,85,77,81,81,85,89,89,89,93,93,93,93,89,85,81,85,81,85,97,97,93,77,77,73,73,73,69,73,73,77,77,81,93,125,138,174,170,174,162,142,117,85,85,85,105,109,101,69,69,73,73,93,117,113,93,85,81,81,81,89,97,89,85,73,73,77,77,77,77,77,81,81,81,85,93,93,97,97,89,97,89,89,97,93,85,85,77,81,77,77,81,77,77,77,69,65,69,73,77,105,109,97,130,134,150,150,138,125,121,134,121,117,109,117,125,134,134,117,130,146,121,117,117,121,125,138,154,178,130,81,73,73,73,81,97,109,121,117,97,105,105,109,117,121,105,105,97,97,97,
101,56,65,69,65,69,73,69,69,69,69,69,69,73,69,69,69,69,73,73,73,73,69,73,69,69,73,77,77,77,77,77,81,85,89,93,85,93,93,89,89,89,97,93,93,97,97,101,101,93,97,93,93,93,93,89,89,89,93,89,89,93,85,85,93,89,89,89,89,85,85,85,85,81,81,93,93,146,150,170,174,178,150,125,117,113,109,117,125,121,117,134,121,97,89,85,81,81,77,77,77,77,85,85,85,85,93,97,85,81,81,85,85,89,89,93,93,101,93,89,85,85,89,85,89,89,101,101,81,105,73,73,69,73,73,73,77,85,89,101,130,154,162,166,174,166,166,150,105,89,89,93,109,109,73,73,73,73,97,125,113,93,85,81,81,77,81,89,85,81,77,73,77,73,77,77,77,81,81,85,85,89,97,97,93,93,93,93,89,97,93,89,81,85,81,77,81,73,73,77,81,69,65,69,69,69,101,81,97,130,134,150,150,150,142,138,125,134,138,134,134,134,134,121,130,125,154,142,121,117,121,134,138,154,170,130,105,73,81,89,97,97,113,121,105,93,109,113,109,101,105,105,89,89,101,97,
105,65,65,69,65,69,69,69,69,73,69,69,69,69,69,69,69,73,69,73,73,73,77,77,73,73,73,73,73,77,81,81,81,85,89,89,89,89,93,93,93,97,93,93,93,97,97,101,101,105,97,93,93,93,89,85,89,85,89,89,89,93,93,93,89,89,89,85,85,89,85,85,85,85,85,85,85,146,146,162,162,162,154,130,117,117,113,125,125,125,117,134,117,97,89,85,85,85,85,81,81,81,93,85,85,85,89,89,85,81,81,81,85,85,85,89,93,97,97,89,89,85,81,81,85,89,85,89,81,89,77,73,73,73,73,77,81,93,93,121,134,146,166,166,166,158,166,174,142,93,89,89,109,109,73,73,73,81,97,117,109,93,93,89,81,77,81,85,89,89,81,77,73,77,77,77,77,77,81,85,89,93,97,97,89,89,93,97,89,97,105,89,85,77,77,81,97,117,101,105,93,69,69,73,69,69,73,73,77,113,138,142,154,158,150,142,130,117,117,130,138,134,121,121,130,121,150,138,134,117,121,138,138,146,162,150,121,73,73,85,85,97,117,121,105,97,121,113,89,89,105,97,85,85,93,101,
109,69,69,69,65,77,65,69,69,73,69,69,73,69,69,69,69,73,73,73,73,73,77,73,73,73,73,77,81,81,81,81,85,85,89,89,89,89,89,85,93,89,93,89,93,93,97,101,101,97,97,93,93,89,89,89,89,89,89,89,89,89,93,97,93,85,89,85,89,85,85,85,85,85,85,85,85,158,142,166,166,158,154,125,117,113,113,125,134,138,134,125,125,97,93,89,89,89,89,85,85,89,105,105,105,89,85,89,77,77,81,81,81,85,85,89,89,93,101,93,89,89,85,81,81,89,81,89,81,97,73,73,69,77,77,73,85,89,105,130,134,154,182,162,162,158,154,146,166,109,93,89,97,97,73,73,73,77,101,109,109,89,85,77,77,77,81,81,85,93,85,73,77,73,73,77,77,81,81,81,89,93,97,93,89,85,85,89,89,101,109,89,81,77,81,109,109,105,105,101,89,69,69,69,69,69,73,69,73,109,130,146,158,162,154,146,134,130,125,121,121,117,121,125,130,121,138,117,130,130,121,134,134,142,162,170,142,77,73,81,93,117,117,117,105,97,117,105,81,89,109,93,89,85,89,101,
109,93,60,69,65,69,69,69,69,69,73,73,69,69,73,73,73,73,73,73,73,77,77,73,73,77,73,81,81,89,85,81,85,85,89,89,89,85,85,85,89,89,93,93,93,93,97,101,101,97,97,97,93,89,89,89,89,89,93,89,89,89,93,93,89,89,89,89,89,85,85,85,85,81,81,85,85,150,142,166,170,146,158,121,117,113,113,125,134,134,134,130,130,113,93,93,93,89,89,81,89,105,121,117,117,89,89,89,77,77,81,77,77,81,85,85,89,97,101,93,89,85,85,81,81,77,77,89,85,89,85,73,73,73,73,77,85,97,105,130,138,170,182,182,174,162,158,142,150,142,89,93,101,109,77,73,73,77,101,105,109,101,77,73,73,73,85,81,85,93,89,81,73,77,77,77,77,81,81,85,85,97,97,93,89,85,85,85,89,97,117,101,89,101,117,113,101,105,101,93,81,73,77,69,73,69,69,73,73,109,138,154,158,162,158,150,138,134,134,130,125,125,130,125,125,117,146,113,121,125,121,125,130,130,150,174,146,77,77,93,85,109,113,117,113,93,101,97,89,89,113,101,85,81,85,105,
113,101,60,65,73,65,65,69,69,69,73,69,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,81,85,81,85,85,81,85,81,85,85,85,85,89,89,89,89,93,93,93,97,97,101,97,93,93,93,89,89,89,89,89,89,89,89,89,93,93,89,85,89,89,85,85,85,85,81,85,81,81,81,146,142,158,158,138,150,121,117,117,117,117,125,125,117,117,130,134,109,93,93,89,89,93,85,109,121,117,93,89,89,85,77,77,77,77,77,81,81,85,93,93,97,93,89,85,85,81,77,77,81,81,105,93,97,73,69,69,73,77,85,97,125,134,150,182,178,182,178,170,158,142,130,154,113,105,101,109,81,73,73,77,89,101,109,101,81,73,73,77,81,81,77,81,89,81,77,73,77,81,81,81,81,85,89,97,93,89,89,85,85,85,85,93,109,113,109,105,105,109,97,97,97,85,81,73,77,69,69,69,69,73,73,117,146,154,166,162,158,158,146,138,138,134,134,134,134,130,130,117,130,117,125,121,125,125,125,130,146,174,146,89,73,81,101,105,117,117,109,97,101,101,97,105,109,97,85,81,85,101,
109,109,69,65,69,65,69,69,69,69,73,73,69,69,69,73,77,73,73,73,73,85,77,77,77,77,81,81,81,81,85,85,81,85,85,85,85,85,85,85,89,89,89,93,89,93,97,97,97,97,97,97,93,97,93,93,89,89,89,89,89,89,93,93,89,85,85,89,85,85,85,85,85,81,85,85,77,150,154,146,146,146,134,121,117,117,117,117,125,154,154,154,146,134,109,97,89,85,85,85,81,89,97,105,93,85,93,89,73,73,69,77,77,81,81,85,89,89,97,93,85,85,85,85,81,77,77,81,85,97,81,73,69,69,73,77,89,97,130,130,158,178,182,182,170,174,162,146,134,170,130,109,101,109,77,73,73,77,89,101,105,97,89,81,73,73,77,77,73,77,85,85,77,77,77,77,81,81,81,85,89,93,93,85,85,85,85,85,85,89,113,97,101,93,101,101,97,93,97,81,77,73,77,69,69,69,65,65,89,130,146,154,162,162,162,162,154,138,138,142,142,138,134,130,125,109,113,113,125,121,125,125,125,130,138,166,142,105,77,77,105,105,113,117,101,89,93,117,101,101,101,93,81,81,89,101,
109,117,77,65,73,69,73,69,69,69,69,69,73,69,73,73,77,73,73,73,77,77,77,81,81,77,81,85,89,85,85,81,81,85,81,89,85,81,89,89,89,89,93,93,93,93,97,97,97,97,97,97,93,93,93,93,93,93,89,89,89,93,93,97,93,89,89,89,85,85,85,85,89,81,81,81,77,158,154,138,170,158,125,121,117,117,117,117,121,150,166,174,158,130,121,97,89,85,85,85,81,85,85,85,101,109,105,85,77,73,77,77,77,77,81,85,85,93,93,93,89,85,81,81,81,77,77,81,81,93,81,69,73,73,73,77,85,101,130,134,166,174,174,178,162,174,166,154,146,170,146,109,105,105,81,73,77,77,81,101,97,97,101,77,73,73,73,73,69,77,81,85,89,81,81,77,81,85,85,89,93,93,89,89,85,85,81,81,89,89,93,89,85,81,97,105,89,101,105,85,77,77,73,73,69,65,65,69,113,134,150,158,166,166,166,166,158,150,150,150,150,150,142,134,121,101,109,109,121,121,130,130,130,130,138,158,150,101,81,73,93,97,113,113,105,93,97,113,93,97,101,97,81,81,85,93,
113,113,77,65,85,73,73,69,69,65,69,73,73,73,73,73,69,73,73,73,77,81,77,81,81,93,101,93,85,81,85,85,85,85,85,85,85,89,89,89,93,93,93,93,93,93,93,101,97,101,101,97,97,97,93,93,89,93,93,93,89,89,93,93,93,89,85,89,85,85,85,85,85,85,81,85,73,138,158,150,150,158,134,125,117,117,117,117,125,150,170,174,178,142,125,101,89,93,93,93,81,81,77,81,89,85,81,73,73,73,73,77,77,77,81,85,85,93,97,93,89,85,81,81,81,77,77,77,77,85,89,69,73,69,73,77,81,101,130,146,166,174,178,182,166,166,170,154,142,158,158,113,109,109,85,73,77,77,77,97,105,97,105,73,69,69,69,73,73,69,77,81,85,89,85,85,81,85,89,89,93,89,85,81,81,81,81,77,81,85,89,81,77,81,85,89,81,101,97,77,77,81,73,69,69,65,65,77,130,134,150,162,166,166,166,166,162,158,158,158,162,158,150,138,121,105,113,113,121,125,130,134,134,138,142,154,134,121,85,77,101,93,113,113,105,89,93,101,97,97,97,93,85,81,89,97,
109,105,89,65,77,73,77,69,65,69,65,69,69,73,73,73,73,73,69,73,85,81,81,85,97,109,101,89,85,81,81,85,85,85,85,81,85,89,89,89,89,93,93,89,93,97,97,101,101,101,105,97,97,97,93,97,97,93,93,93,89,93,89,89,89,97,89,85,89,85,85,81,89,89,85,85,77,125,154,154,134,146,134,130,121,117,117,117,130,150,166,170,170,134,130,105,101,101,93,89,85,77,81,85,77,73,73,69,73,73,73,73,73,81,81,81,89,89,97,93,89,85,81,81,81,77,77,73,73,77,97,77,73,73,73,77,81,105,130,166,174,178,178,182,174,166,162,158,150,154,154,113,113,113,89,77,77,77,81,101,113,113,89,73,69,69,69,73,69,69,69,77,81,89,93,85,85,85,89,97,97,89,89,85,81,85,81,77,81,93,101,77,73,77,81,81,81,85,85,77,77,77,77,73,65,69,65,101,134,130,150,166,166,166,166,166,166,162,162,166,166,166,162,142,121,113,113,113,121,125,134,138,146,146,146,158,138,109,81,85,97,93,109,117,105,89,97,97,93,97,97,89,81,81,81,93,
105,109,101,69,73,73,69,65,65,69,69,69,69,73,73,73,73,73,73,73,81,77,85,97,101,93,89,85,81,85,81,81,85,85,89,89,89,85,89,85,89,93,89,93,93,97,105,101,101,101,97,97,105,101,97,93,93,89,89,89,93,93,93,89,93,93,93,85,85,89,85,93,89,89,85,85,77,113,158,162,150,162,142,134,125,117,117,121,138,154,174,182,178,130,134,113,101,101,101,93,85,81,77,81,81,73,73,73,73,73,73,73,77,77,81,85,85,93,97,89,85,85,85,81,81,77,77,73,73,77,97,105,77,73,73,77,85,113,134,166,178,182,182,182,178,170,158,154,146,150,154,117,117,113,89,77,81,81,81,97,109,101,81,69,69,69,69,69,69,69,65,73,81,85,85,89,89,89,93,97,93,89,85,89,85,81,81,77,81,93,101,77,73,73,77,77,77,73,81,69,73,73,77,69,69,65,81,113,125,125,150,162,166,166,166,170,166,166,166,162,166,170,166,146,125,113,109,113,121,130,138,146,158,158,150,158,138,101,73,81,89,105,113,117,109,89,97,105,93,81,89,85,77,77,81,89,
113,105,105,77,73,69,69,73,65,69,69,69,69,77,73,73,73,73,77,77,81,81,77,105,85,85,85,81,81,85,81,81,85,85,89,89,85,89,93,93,93,93,101,97,101,105,97,97,101,97,93,93,93,93,97,101,109,93,93,101,97,89,89,85,93,93,97,97,97,85,85,85,89,93,81,81,81,105,150,158,158,150,154,134,125,121,117,125,142,146,170,178,178,142,134,125,105,105,101,89,85,81,81,81,77,73,73,73,73,73,73,77,81,81,85,81,89,93,93,89,81,85,81,77,77,77,73,73,73,69,81,101,101,73,77,77,85,117,142,166,170,182,182,182,182,174,166,170,166,154,154,121,125,113,101,85,81,81,81,113,121,101,77,73,69,69,69,69,69,69,69,73,73,77,77,85,93,93,93,97,89,85,81,85,85,85,81,81,77,89,105,73,73,77,77,73,73,69,85,101,73,69,73,73,69,69,89,121,130,121,146,162,166,166,166,166,166,166,166,166,170,166,166,150,130,117,113,117,121,125,142,154,162,162,146,146,121,105,77,77,93,101,113,117,109,93,101,105,97,93,85,77,77,81,81,101,
113,113,117,73,73,69,65,65,65,65,69,65,69,77,73,73,77,73,81,77,81,77,85,85,85,81,81,81,81,85,85,85,85,85,85,93,93,93,89,89,93,97,97,97,101,97,97,97,97,93,93,93,89,93,93,93,97,105,101,101,93,93,101,105,93,97,89,93,85,101,85,81,85,85,93,85,89,97,138,162,154,158,154,134,125,121,117,121,142,154,170,182,174,150,134,134,113,105,101,93,85,85,85,81,77,73,69,69,69,73,73,77,77,77,85,85,85,89,97,89,85,81,77,77,77,73,73,73,69,73,73,89,113,81,77,81,89,117,142,166,170,178,182,182,182,174,178,178,178,166,146,113,125,113,97,89,85,85,85,113,134,121,77,73,73,73,73,73,73,69,69,73,77,77,81,81,85,93,93,89,89,85,85,81,81,85,81,77,77,85,105,77,73,73,73,73,69,65,65,89,73,69,77,73,73,89,93,125,130,121,146,162,166,170,166,166,166,166,166,170,166,166,166,150,134,121,117,117,125,130,142,154,166,162,146,142,121,105,81,81,101,117,113,117,105,89,97,113,105,89,81,77,77,77,81,97,
117,113,117,65,69,69,65,65,69,65,69,73,73,73,73,77,77,81,77,77,77,77,85,89,89,77,81,81,81,85,85,85,85,85,89,89,93,93,97,105,97,93,93,93,97,101,93,93,97,93,89,89,89,89,89,89,93,93,89,93,93,89,89,93,89,93,85,101,89,85,85,81,81,77,85,89,81,97,154,158,162,154,154,134,130,121,121,121,142,150,166,174,178,166,130,138,130,109,101,97,89,85,85,81,77,73,69,69,69,69,77,77,77,81,81,81,85,93,97,89,85,81,77,73,73,69,73,73,69,69,73,93,113,81,77,81,93,121,146,166,170,174,174,178,182,178,178,178,170,170,146,113,113,113,93,93,89,89,89,134,154,138,81,73,73,73,77,73,73,73,73,77,77,77,81,85,89,97,93,93,85,85,81,81,81,81,81,81,77,85,101,73,73,73,73,69,69,69,65,73,77,69,69,73,93,93,97,125,121,125,150,166,166,166,166,166,162,162,166,166,166,166,166,158,142,125,117,121,125,134,138,150,162,146,130,134,134,85,77,101,101,109,113,117,101,89,101,113,105,89,81,81,77,77,81,97,
113,109,121,65,65,65,65,65,65,65,69,73,73,77,81,77,77,77,81,77,77,81,77,97,81,77,77,77,81,81,81,85,85,89,89,93,97,93,93,97,93,93,97,93,97,97,97,93,97,89,85,89,89,89,89,89,85,89,85,85,89,89,89,85,85,85,93,93,89,85,81,81,77,81,81,89,81,89,154,142,158,146,150,138,130,125,117,125,146,146,154,170,170,166,178,154,134,134,117,97,93,85,85,81,77,73,69,69,65,65,65,69,69,73,81,81,85,89,97,93,85,77,77,77,73,73,69,69,69,69,73,101,105,77,77,85,97,125,146,162,162,170,174,178,178,182,178,178,178,170,146,117,121,121,97,97,93,89,97,138,170,146,93,85,73,73,77,77,77,73,77,77,81,77,85,85,93,93,93,89,85,85,81,81,81,81,81,81,77,89,93,73,69,73,69,69,69,65,65,65,73,65,69,69,97,101,81,117,130,125,154,154,170,166,162,158,158,158,162,166,170,174,174,170,150,134,125,125,125,138,138,150,158,134,125,130,130,109,93,105,101,105,113,113,101,89,101,113,109,85,89,81,77,77,81,97,
113,105,117,69,69,65,65,65,65,65,69,73,77,77,77,77,77,77,77,77,77,85,81,77,77,77,77,77,81,81,93,85,93,93,101,97,89,89,89,89,89,93,93,93,93,97,93,93,93,89,89,89,85,85,85,89,85,85,85,85,89,89,85,81,81,85,85,89,85,97,85,77,77,81,77,89,89,85,154,142,162,154,154,134,134,125,121,130,158,146,150,162,166,174,170,166,150,121,134,97,93,85,85,81,77,73,69,69,69,69,69,73,73,77,77,81,81,85,97,89,85,77,81,73,73,69,73,73,69,73,77,97,105,85,81,85,101,130,146,162,146,162,170,178,186,186,178,178,178,174,146,117,125,121,97,97,93,93,97,162,178,150,97,81,77,77,81,81,77,77,77,77,85,85,85,85,93,97,89,85,85,81,81,77,81,81,81,81,77,85,89,73,73,73,69,69,69,65,65,69,73,73,69,69,85,93,73,97,130,117,138,158,170,166,162,154,154,158,162,162,162,166,166,170,158,138,130,130,130,138,138,150,146,138,117,130,130,125,109,109,105,105,113,109,105,89,117,121,105,69,65,77,81,81,81,93,
113,105,109,97,60,65,65,69,65,65,69,73,77,77,77,77,77,73,81,85,93,77,77,77,81,81,81,81,81,89,81,85,97,93,93,93,89,85,89,89,89,93,89,93,93,93,97,93,93,89,89,89,85,85,85,85,85,85,85,85,85,85,85,81,81,85,85,81,97,97,89,77,77,77,77,81,89,77,158,150,166,154,162,142,134,125,121,138,162,150,146,158,170,170,174,178,162,166,125,121,97,93,81,77,77,77,69,69,65,69,73,73,69,73,73,77,85,89,89,89,85,81,77,73,73,73,69,69,69,69,73,89,105,89,81,89,101,134,150,166,146,154,170,178,186,186,178,182,170,166,146,125,125,121,97,93,97,93,109,154,174,154,101,77,73,77,81,81,77,77,81,81,81,85,85,89,93,97,89,81,81,81,85,77,77,77,77,77,77,81,89,73,73,73,69,69,69,65,65,65,73,73,97,77,97,81,73,77,117,117,138,170,162,166,158,146,150,154,158,158,166,170,170,166,158,138,134,142,138,138,142,146,138,138,134,134,130,121,101,105,97,109,113,105,101,89,125,109,93,89,105,89,77,81,85,93,
109,109,109,117,65,65,69,69,69,69,69,73,77,81,77,81,73,81,81,77,81,77,77,77,81,81,81,85,93,101,93,113,93,89,89,89,85,85,89,85,89,89,93,93,93,93,97,93,93,93,89,85,89,85,85,85,85,85,89,85,85,85,85,85,85,85,85,85,89,105,89,77,77,77,77,77,81,77,162,162,162,142,158,150,134,125,117,146,158,154,150,150,166,170,174,178,178,158,130,125,101,85,81,73,77,77,73,69,69,69,65,69,73,77,77,81,81,85,89,97,89,85,77,73,77,69,69,69,69,69,73,77,93,89,81,89,113,130,166,162,154,158,170,178,182,182,182,182,174,166,158,134,121,125,97,97,101,93,117,134,166,170,109,77,73,77,81,89,85,81,81,85,85,85,89,93,97,97,89,85,85,81,81,77,77,73,73,73,77,81,89,73,73,73,73,69,73,60,60,60,65,93,101,73,85,77,73,69,109,134,125,146,142,150,146,146,146,154,158,158,166,166,166,166,154,142,138,154,138,138,146,150,138,142,134,134,134,121,97,121,109,113,109,117,89,109,125,121,81,105,93,101,109,85,81,89,
113,113,109,121,69,65,65,69,69,69,73,73,77,77,85,77,81,81,77,81,81,77,77,77,81,81,85,77,81,93,101,89,85,89,89,89,85,85,85,85,89,89,93,93,93,93,97,93,93,93,89,89,89,89,85,85,85,85,85,85,85,85,85,85,81,81,81,81,85,97,101,81,77,77,73,77,81,85,158,158,158,146,162,162,138,125,117,142,146,162,150,150,162,170,178,178,182,174,150,121,97,89,85,101,85,85,69,73,69,65,69,69,69,69,77,81,81,81,85,93,89,85,81,77,73,69,69,69,65,69,73,89,85,101,89,97,117,134,170,162,162,166,174,182,186,182,182,178,174,174,162,146,117,125,101,97,97,97,113,130,162,162,121,77,73,73,85,130,81,77,85,85,85,89,93,97,101,93,89,85,77,81,77,77,77,77,69,77,77,85,97,77,77,73,73,69,69,65,60,60,65,77,77,69,73,73,69,97,117,130,130,117,117,130,142,142,146,146,154,158,158,162,162,162,150,138,142,150,130,134,154,154,138,142,134,134,130,113,101,109,121,113,121,109,89,138,109,101,89,105,97,97,93,101,93,89,
109,109,105,121,77,65,69,69,73,73,73,73,77,77,77,85,85,77,77,81,85,85,81,81,81,85,85,81,93,93,89,85,85,85,89,89,85,85,89,85,93,93,93,93,93,93,93,93,93,93,89,85,85,85,85,85,85,85,85,85,85,85,85,85,81,85,81,81,81,85,97,81,77,77,73,73,81,89,150,154,154,146,154,166,142,134,121,130,138,166,158,158,162,166,174,178,178,166,178,130,105,109,105,89,81,81,77,81,69,69,69,73,73,73,73,81,81,85,93,97,89,85,81,77,73,73,69,69,65,65,65,73,81,93,113,113,125,146,174,166,158,170,174,182,182,182,182,178,166,174,170,150,125,130,109,101,97,101,109,121,154,154,134,81,73,73,77,85,93,85,85,85,85,93,97,101,101,97,89,85,81,81,77,73,73,73,73,73,77,85,97,73,81,73,69,69,69,60,60,60,65,65,69,69,69,69,85,117,121,125,134,134,130,121,125,134,138,142,146,158,158,154,150,154,142,138,146,138,121,138,170,158,130,130,134,130,125,101,93,105,121,109,125,89,109,113,113,73,109,93,93,97,93,97,89,89,
105,109,105,113,93,65,69,69,73,73,73,73,77,77,73,89,77,77,77,77,85,85,89,81,81,81,81,85,97,89,81,85,93,97,93,85,85,85,85,89,93,93,89,93,93,93,93,93,93,89,89,85,85,85,85,85,85,81,81,81,85,85,81,81,81,85,81,81,81,81,97,89,77,77,73,77,85,89,150,158,158,150,158,166,146,142,130,121,130,166,166,162,170,178,178,178,178,170,154,125,125,97,85,85,85,81,77,73,69,69,69,73,69,69,77,77,85,85,93,97,89,85,77,77,73,73,73,69,69,65,69,69,69,73,93,121,134,158,174,178,166,174,178,182,186,186,182,186,170,166,174,166,117,134,113,105,101,101,109,121,162,158,146,85,73,73,81,81,89,101,77,93,113,113,101,97,97,93,89,85,85,77,73,73,73,73,73,73,73,85,105,77,77,73,73,69,69,65,60,60,60,65,65,65,69,77,93,113,121,117,134,134,134,138,117,125,130,138,150,158,158,146,146,146,138,142,142,125,117,142,170,158,134,134,130,130,125,101,93,101,125,113,97,85,121,105,85,73,117,97,97,97,93,93,93,93,
117,117,105,113,101,69,73,89,73,73,69,69,77,73,85,81,77,77,77,81,89,85,81,81,81,81,77,93,85,89,93,105,101,89,85,85,85,85,89,89,89,89,89,93,93,93,97,97,93,93,89,89,85,85,85,85,85,81,81,81,81,85,81,81,81,81,81,81,81,81,85,93,81,77,77,77,69,105,154,158,158,146,150,154,150,146,142,121,130,162,170,166,166,174,178,174,174,174,154,130,134,93,85,85,85,81,77,73,69,65,69,69,69,77,77,85,89,89,93,97,89,85,81,81,73,73,77,77,69,65,69,69,69,69,77,105,130,162,174,178,178,174,178,182,182,182,182,182,178,174,162,162,134,113,125,105,101,105,109,130,166,162,158,89,73,73,77,81,101,113,97,85,89,101,101,97,93,93,81,81,77,77,73,73,73,73,69,73,73,81,101,77,69,77,73,69,65,65,60,60,60,65,65,65,65,73,81,97,117,113,125,134,134,134,121,130,125,134,154,158,158,142,142,142,138,142,130,117,113,138,166,154,134,134,125,121,117,101,101,105,105,105,93,101,105,97,81,89,113,97,93,97,97,101,113,97,
117,117,105,109,113,65,73,85,77,69,73,89,81,77,73,81,81,73,89,89,85,89,93,81,81,85,93,97,89,93,105,93,89,85,81,85,85,85,89,89,89,89,89,89,93,93,93,97,93,93,89,85,85,85,85,85,85,85,81,81,85,81,81,81,81,81,81,81,81,77,81,93,85,81,81,81,69,125,154,158,158,130,162,150,150,158,146,125,130,154,174,170,170,174,174,174,174,174,162,125,134,113,93,81,81,81,77,73,69,69,69,69,73,73,81,85,89,89,93,101,89,89,85,77,73,73,77,69,69,65,65,65,69,73,77,93,146,170,178,178,178,178,178,182,186,182,174,174,178,174,162,174,142,117,121,105,101,105,109,130,170,178,174,97,77,73,77,77,85,97,89,85,93,89,101,97,97,85,85,81,81,77,77,73,73,69,69,69,69,77,105,73,69,69,73,65,65,65,60,60,65,60,65,65,65,65,77,73,109,113,121,125,134,130,134,117,117,134,158,154,154,138,138,138,138,142,121,109,113,130,162,154,134,121,117,109,105,101,109,97,93,85,101,109,97,81,77,97,113,97,93,97,101,97,117,109,
121,109,105,105,121,69,73,73,69,73,69,69,77,77,73,73,77,77,73,85,81,113,89,85,89,85,105,97,93,105,97,89,81,81,81,81,85,85,89,89,89,89,89,93,93,97,97,97,93,93,89,85,85,77,85,81,85,81,81,81,85,81,81,81,81,81,81,77,77,81,81,93,93,81,85,65,105,138,158,158,150,166,150,146,150,146,130,125,130,166,174,178,170,174,174,170,170,170,166,138,134,97,89,81,81,77,77,73,69,69,69,69,77,77,85,89,93,93,97,93,89,89,85,81,77,77,73,69,69,65,65,65,69,73,77,97,150,174,178,178,174,178,178,186,186,182,178,166,174,174,178,170,142,134,113,117,105,105,117,125,158,162,170,113,73,73,77,77,81,97,113,89,89,89,93,93,93,85,77,81,77,77,73,77,73,69,73,69,77,81,105,73,69,69,73,65,65,69,69,65,60,60,65,60,65,65,69,73,101,101,105,109,134,130,130,117,117,150,162,146,150,134,138,142,138,134,113,138,113,125,150,154,121,121,130,130,113,105,105,101,93,81,85,89,93,81,73,105,105,97,97,97,101,109,134,105,
130,109,105,105,117,73,77,73,73,65,69,69,73,73,73,73,77,85,93,89,109,89,85,81,109,125,113,97,101,105,89,81,81,85,85,85,85,89,85,89,89,93,93,93,93,93,93,97,93,93,89,89,93,85,85,89,85,85,85,85,81,85,81,81,81,81,81,77,77,77,77,81,97,89,73,73,138,142,162,154,166,146,138,146,162,142,130,125,142,158,166,166,170,182,174,170,174,174,162,150,117,97,85,81,81,77,77,73,69,69,69,73,77,77,81,89,89,97,93,93,93,85,85,81,77,77,73,73,69,65,65,65,69,77,81,101,146,174,178,178,174,174,178,182,182,182,178,174,170,182,174,154,134,146,138,113,113,105,117,125,130,134,178,130,81,77,77,77,81,93,130,89,89,89,93,93,93,81,81,77,77,73,77,77,73,69,69,69,69,77,105,77,69,69,69,65,65,65,65,65,56,60,60,65,65,65,65,73,101,113,101,89,125,130,134,130,125,162,162,134,134,130,142,142,125,117,134,130,121,121,142,146,117,121,125,125,113,101,101,97,97,85,77,81,81,69,73,117,97,93,97,97,101,105,134,125,
125,105,109,109,121,69,73,73,73,69,69,69,73,77,73,73,77,81,85,85,93,81,81,113,125,117,117,113,113,93,85,81,81,81,85,89,85,89,89,89,89,93,89,89,93,93,97,97,93,93,89,89,89,85,85,89,89,89,85,93,85,81,81,81,81,81,81,77,77,77,77,77,93,97,73,121,134,162,158,166,166,134,134,154,154,146,138,138,146,166,162,158,174,182,178,166,170,174,174,150,125,93,81,81,77,77,73,73,69,65,73,73,77,81,81,85,89,93,93,89,85,85,85,89,81,73,73,73,69,69,69,69,69,73,81,93,134,170,170,170,170,170,174,182,182,178,178,182,170,158,158,158,154,174,158,146,117,105,101,138,130,121,166,138,85,77,81,77,81,93,134,109,89,89,93,93,93,85,77,77,73,77,73,73,73,73,69,69,69,69,101,73,69,73,69,69,69,65,69,60,60,60,60,60,65,65,65,77,97,65,65,65,101,125,130,134,130,162,150,125,121,130,134,130,117,130,138,134,121,117,142,130,113,121,125,125,105,89,85,101,93,89,77,77,73,85,97,121,97,93,93,97,97,101,101,130,
101,109,109,113,117,73,77,69,69,69,69,69,69,77,73,77,77,81,89,77,81,81,97,130,113,97,93,113,105,85,81,85,85,85,85,85,85,89,89,85,85,89,93,89,93,93,97,97,93,93,89,89,85,85,85,89,93,93,93,89,89,85,81,81,81,81,77,77,77,77,77,77,89,89,130,138,162,166,158,162,170,130,130,142,142,142,150,142,158,170,166,150,170,178,174,174,170,174,174,150,117,85,81,81,77,77,73,69,69,65,69,73,73,73,81,85,89,93,101,97,89,89,85,85,77,73,73,69,69,69,69,69,69,73,81,93,134,154,166,162,162,166,174,182,182,174,178,178,178,170,174,162,170,170,174,162,125,105,97,97,117,130,158,150,89,77,77,81,81,85,109,121,89,89,89,97,93,89,81,73,73,73,73,73,73,73,73,73,77,97,105,73,69,69,65,69,69,69,69,60,60,56,60,56,60,65,65,77,65,65,60,65,89,117,134,134,134,146,142,117,121,134,130,121,121,138,134,134,125,121,121,121,113,121,125,113,85,77,89,93,93,89,77,77,89,89,117,109,93,89,93,93,93,97,97,97,
105,113,113,101,77,65,93,85,77,69,65,69,73,73,73,73,77,73,77,77,81,85,117,113,113,101,89,97,97,89,85,81,81,85,85,85,85,89,85,89,89,89,89,93,93,93,93,97,97,93,89,93,89,85,85,85,89,89,93,89,89,89,85,85,81,81,77,77,77,77,77,81,85,93,142,158,166,158,166,166,142,130,130,138,142,154,170,150,158,166,170,150,158,170,174,178,170,170,170,158,109,85,81,77,81,77,73,69,69,69,69,69,73,73,77,81,85,93,101,97,97,89,81,81,81,77,73,69,69,69,69,69,69,77,81,93,117,174,158,154,158,162,170,182,182,174,178,174,174,170,178,170,170,174,166,162,134,105,93,93,97,125,150,146,89,77,81,81,81,85,105,117,85,89,97,101,93,85,81,73,73,73,73,73,73,73,73,77,85,113,105,73,73,69,69,73,73,69,65,65,73,65,60,69,65,77,65,73,89,73,65,65,77,109,130,134,134,125,125,138,121,130,134,121,125,134,134,138,121,121,121,125,113,121,97,81,77,77,89,85,101,93,89,73,81,85,113,97,89,93,89,97,97,97,101,105,
109,113,105,77,73,117,105,93,73,69,69,65,81,73,73,73,73,73,73,77,81,105,85,81,81,89,85,89,89,85,85,85,81,81,85,85,85,85,89,89,89,89,93,89,93,93,97,97,97,93,93,89,89,85,85,85,89,89,89,89,89,85,85,89,85,81,81,77,73,73,73,77,77,117,146,158,154,170,174,162,138,125,125,134,138,158,170,162,166,162,158,150,150,166,174,178,170,174,162,158,109,85,81,77,77,77,73,73,73,73,69,73,73,77,81,85,89,93,97,93,93,89,89,85,85,77,73,69,65,65,69,69,69,77,81,89,113,170,154,150,154,162,166,178,182,178,170,174,166,162,178,174,170,174,174,162,134,109,93,89,93,109,150,142,85,77,81,81,81,85,97,117,89,89,93,93,89,85,81,77,73,69,69,73,73,73,77,73,77,93,97,81,69,65,69,69,73,77,65,65,73,65,60,69,60,85,60,69,77,65,65,65,73,101,117,130,134,134,130,134,117,125,146,130,125,130,134,134,125,125,130,101,117,93,77,77,77,77,93,89,89,97,93,89,93,117,89,109,93,97,97,93,93,97,105,113,
109,93,97,89,93,97,77,73,73,69,69,77,101,89,73,73,73,73,73,73,77,85,85,77,77,81,81,81,85,85,81,81,81,81,89,89,89,85,85,93,89,89,89,93,93,97,97,97,97,97,93,93,89,85,85,81,85,85,85,89,89,89,89,85,85,85,85,77,73,73,77,77,77,125,154,154,162,174,162,142,138,125,130,134,142,162,166,158,158,150,150,150,142,162,162,182,166,170,174,162,117,85,81,81,77,73,69,65,69,69,69,65,69,77,81,81,89,97,93,93,89,89,89,93,81,77,69,69,65,69,69,69,69,73,81,89,105,158,158,142,158,158,170,182,174,174,170,170,170,166,166,178,170,174,166,166,134,105,93,93,89,97,130,121,85,77,77,81,81,85,89,109,89,93,97,93,89,89,85,73,73,73,69,69,73,73,77,81,77,77,93,77,73,69,65,69,89,73,65,60,81,73,65,69,85,93,60,65,69,65,65,65,69,109,117,130,134,134,134,134,125,113,134,130,117,134,134,134,125,121,113,97,97,77,77,77,77,85,105,105,85,97,93,89,97,113,101,97,89,93,93,105,101,97,97,89,
105,113,101,93,89,77,73,73,69,77,65,81,105,93,73,73,73,77,73,73,81,77,73,77,77,77,77,81,85,85,85,81,81,85,85,85,85,85,85,89,89,89,89,93,93,97,93,93,97,97,93,89,89,89,81,81,85,85,85,89,89,89,85,85,85,85,85,81,77,73,77,77,97,134,158,158,162,166,142,134,134,125,130,138,150,162,158,158,158,146,146,146,138,150,162,178,174,170,174,150,125,97,85,81,81,81,69,69,65,65,69,69,73,73,77,85,89,97,93,85,85,81,81,89,89,77,73,69,69,65,69,69,69,73,81,89,101,138,162,146,158,162,170,182,174,166,162,166,174,166,166,178,170,178,166,158,134,105,93,105,105,101,142,117,81,77,77,81,81,81,89,105,85,89,93,97,89,85,85,77,73,73,69,69,73,73,73,77,73,77,85,81,69,65,65,85,81,73,65,65,85,77,69,69,77,81,81,89,81,69,69,65,69,97,105,125,134,134,134,134,134,121,117,113,121,130,134,134,125,117,105,89,89,81,77,77,77,81,109,109,101,93,97,81,81,77,97,101,93,93,109,89,97,97,89,97,
109,109,85,81,81,77,77,73,69,65,77,89,101,97,73,73,73,73,69,73,73,77,77,77,77,77,77,81,85,89,81,85,81,85,85,85,85,85,85,85,85,89,89,93,89,93,93,93,97,97,93,89,89,85,81,85,85,85,85,89,89,89,85,85,85,81,81,81,77,77,77,69,117,146,166,174,162,154,146,138,134,130,134,142,146,154,150,150,154,150,146,146,138,150,166,178,166,170,178,162,142,109,85,85,85,77,65,69,65,69,65,69,73,77,81,81,85,93,93,89,85,81,85,85,81,73,77,65,65,65,69,69,69,73,81,89,105,121,162,150,162,162,174,182,174,158,162,170,174,174,166,174,166,166,162,146,138,105,109,97,89,93,109,101,81,77,77,81,81,81,93,121,97,85,93,93,89,89,89,77,73,69,69,69,69,73,73,77,69,73,81,85,77,65,65,73,89,77,65,73,81,73,77,69,73,73,89,89,85,81,73,69,77,85,97,130,134,134,134,134,125,125,121,134,134,138,134,134,138,121,113,101,89,85,81,73,81,109,89,105,101,97,101,89,81,65,109,97,93,97,97,105,101,109,105,101,
109,93,97,81,77,77,77,73,69,69,89,89,105,93,73,73,69,65,65,73,81,77,77,77,77,77,77,81,85,85,93,89,85,85,85,85,85,89,89,89,89,89,89,85,89,89,93,93,97,97,93,89,89,85,81,81,85,85,85,85,89,89,85,85,85,81,81,81,81,77,77,73,125,154,162,166,162,154,146,138,134,130,146,142,142,138,142,146,154,150,146,146,138,150,166,170,170,166,170,162,146,125,89,81,77,73,69,69,69,69,69,69,73,73,77,81,89,93,97,93,85,81,81,81,77,73,73,81,65,65,65,69,73,73,77,85,101,121,162,162,174,170,174,178,174,170,162,174,174,174,166,170,166,178,170,146,125,109,101,93,89,85,89,97,77,77,77,81,77,85,97,134,113,89,89,93,89,89,93,81,73,69,69,69,69,73,73,77,69,73,85,89,69,73,69,69,77,77,85,81,69,73,85,65,69,73,77,81,73,60,60,65,60,97,109,113,125,134,134,134,134,134,134,134,134,134,134,138,138,125,121,113,105,105,101,117,130,113,109,105,89,101,73,77,73,77,113,93,97,97,93,97,105,85,97,101,
101,81,89,89,81,81,73,77,85,85,77,93,101,97,73,69,69,69,77,81,77,81,77,77,77,77,77,81,81,97,89,85,85,85,85,85,85,89,85,89,89,85,85,85,85,89,89,93,93,97,93,89,89,85,81,81,85,85,85,89,93,89,85,81,81,81,81,81,77,77,77,85,134,154,162,162,162,146,138,134,134,130,134,138,142,138,142,146,146,158,146,150,138,146,158,174,166,166,170,170,158,134,105,77,77,69,69,69,69,65,69,69,69,73,77,81,85,93,101,97,89,81,81,77,81,77,73,65,60,65,65,69,73,73,77,85,109,121,166,174,178,174,178,178,182,182,166,174,174,158,166,162,174,182,178,158,134,105,97,89,89,85,85,97,89,77,77,81,97,89,109,134,117,89,85,97,89,89,93,81,73,69,69,69,69,69,73,73,77,73,73,77,73,69,65,73,73,73,73,69,69,65,81,73,65,52,60,69,93,105,85,81,85,117,125,130,113,130,134,134,134,134,134,134,134,134,134,134,134,130,121,117,105,101,134,130,109,97,93,97,105,93,93,105,101,109,109,93,85,77,89,73,77,73,73,97,
85,81,81,85,89,85,89,77,85,93,89,93,101,85,73,65,69,69,69,81,77,81,77,77,73,73,77,81,89,109,81,81,81,81,81,85,85,85,89,89,89,85,85,81,81,85,89,93,93,97,93,93,89,89,81,81,81,81,85,85,89,89,85,85,85,81,81,81,77,77,69,117,142,158,162,150,150,142,138,134,130,125,125,130,134,134,138,138,146,158,150,158,138,142,158,162,162,166,166,162,150,146,134,85,77,69,69,73,65,65,65,69,69,77,77,81,85,97,105,97,89,89,81,85,77,81,73,73,73,65,65,69,73,73,77,89,109,125,154,178,174,178,182,182,178,178,170,166,178,166,158,162,158,170,166,146,117,101,93,89,89,97,81,93,105,81,81,89,85,93,117,130,105,85,89,93,89,85,97,89,73,69,69,69,69,73,73,69,73,73,73,77,69,69,69,69,69,69,65,69,65,65,77,69,52,97,113,97,97,77,77,89,121,142,105,109,150,105,121,138,130,134,134,134,138,134,134,134,138,134,130,109,109,150,130,113,97,93,93,85,73,109,125,81,93,101,113,93,85,81,73,69,69,73,73,85,
77,73,69,77,81,93,89,77,81,89,93,89,97,81,73,89,69,69,73,77,81,77,77,73,73,73,81,85,113,85,81,81,81,77,77,77,77,81,85,85,85,85,81,81,85,85,85,89,93,97,97,93,93,85,81,81,81,81,85,89,89,85,85,85,81,81,81,81,81,81,73,130,146,162,154,138,138,138,138,130,125,125,121,121,125,125,130,134,154,158,150,162,138,138,158,162,154,162,162,162,158,166,150,105,77,77,69,69,65,65,65,69,73,81,81,81,89,93,105,97,89,85,85,81,81,77,73,69,65,65,69,69,73,77,77,89,113,125,162,178,174,178,178,182,182,182,174,166,178,174,158,166,162,154,162,138,109,97,89,85,85,89,81,89,105,81,85,89,89,97,125,109,101,85,85,93,89,97,105,89,77,73,69,69,69,73,73,77,73,73,77,81,73,69,73,73,69,73,65,65,69,69,65,60,105,89,89,101,101,97,113,130,117,130,113,89,113,146,105,105,121,134,130,134,134,134,138,138,109,113,134,113,134,142,130,125,130,109,89,89,113,125,125,89,85,85,85,81,85,73,69,65,69,69,73,77,
73,73,69,73,77,89,77,81,81,85,93,89,93,89,73,69,69,73,73,77,81,73,73,69,73,77,81,93,93,85,81,77,81,77,77,77,81,77,81,81,81,81,81,81,81,85,85,93,93,93,93,93,93,89,85,81,85,85,85,89,85,85,85,81,81,85,81,81,81,81,89,130,142,166,146,138,138,138,134,125,121,121,121,121,125,125,125,146,158,154,146,154,146,134,150,158,154,150,158,166,166,174,154,121,77,69,69,69,65,73,65,65,65,73,81,89,93,97,101,97,89,89,81,81,77,77,81,73,73,69,69,69,73,77,81,89,105,134,170,178,170,182,178,178,182,182,170,174,170,162,154,166,170,142,142,125,117,97,89,85,85,93,77,81,81,85,81,89,93,101,121,101,93,85,85,89,89,93,109,97,73,73,69,65,69,73,73,73,73,69,73,85,69,69,69,73,69,73,65,65,69,69,56,93,89,109,130,138,138,142,138,130,138,138,125,125,130,113,121,121,125,117,134,134,134,134,109,117,113,113,130,130,146,134,138,125,81,97,89,109,117,130,101,101,97,81,73,89,81,69,69,69,69,69,81,81,
77,65,65,69,73,73,77,73,81,85,89,85,89,81,77,69,69,73,73,73,77,73,69,73,77,81,81,89,101,85,81,81,77,77,77,77,77,77,81,77,81,81,81,81,81,81,89,89,89,93,93,93,93,89,85,89,81,85,85,85,85,85,85,85,85,85,81,81,81,81,93,134,146,170,134,138,138,134,130,125,121,121,121,121,121,125,125,142,146,146,150,150,146,138,142,150,150,142,150,178,166,170,146,113,81,73,69,69,65,65,65,69,73,77,81,81,85,93,101,93,93,89,81,81,77,81,81,81,77,69,69,69,77,81,85,93,117,146,174,174,170,182,174,174,182,178,178,170,162,166,170,162,170,170,158,121,121,97,89,85,85,97,77,85,81,85,85,89,97,105,105,93,89,85,85,89,97,85,109,101,73,69,69,69,69,69,73,73,73,69,73,85,69,73,73,73,73,73,69,65,65,52,81,105,138,125,146,125,130,130,113,121,89,69,105,97,85,105,105,89,117,125,130,134,134,138,121,109,113,121,117,134,150,89,77,77,81,85,89,121,130,109,101,109,89,93,89,81,73,65,65,69,65,77,85,81,
69,65,65,65,73,73,73,69,73,77,89,85,81,77,69,69,69,73,73,81,73,69,69,73,77,81,81,85,85,81,81,81,77,77,77,81,81,81,77,81,81,81,81,81,81,85,85,85,85,89,93,93,93,89,89,89,89,85,89,85,85,85,81,85,85,85,85,81,81,81,117,134,150,166,138,134,134,134,130,121,121,121,121,121,121,121,125,134,134,142,146,150,146,134,142,154,146,138,154,166,154,150,150,113,81,73,69,69,65,65,65,65,69,73,77,85,89,89,93,89,89,89,81,77,77,85,81,89,69,65,69,73,77,81,85,101,130,150,170,178,178,178,170,170,178,174,178,170,174,174,174,170,174,174,166,125,121,97,89,85,81,81,89,89,81,89,85,93,101,113,89,85,85,85,85,89,97,89,117,113,77,69,69,69,73,73,77,73,77,69,73,93,73,73,73,73,69,73,73,69,65,97,109,130,150,134,130,130,130,134,130,130,125,113,117,93,85,85,81,101,81,130,130,125,134,134,125,113,117,142,154,146,125,85,44,69,77,60,113,125,105,89,109,97,89,89,89,85,77,69,65,69,69,69,69,69,
77,69,65,65,69,69,69,69,69,81,89,73,85,73,73,69,73,69,73,81,73,73,73,73,77,81,81,81,81,81,81,81,77,77,77,77,77,81,81,77,77,81,81,81,85,81,85,85,89,89,93,97,97,89,89,85,85,85,89,89,85,85,85,85,85,85,85,85,85,77,113,142,154,158,130,130,130,125,125,121,121,121,121,117,117,121,125,125,138,134,142,146,142,130,142,142,142,138,154,166,142,134,138,109,77,77,69,69,65,65,69,73,73,77,81,81,85,85,89,97,97,85,77,77,77,77,81,81,89,69,69,73,77,81,89,109,125,142,170,170,174,174,170,170,170,174,170,166,174,166,174,170,166,174,162,138,117,97,85,81,81,77,77,85,73,97,85,97,109,113,85,85,85,85,85,85,93,85,109,125,81,69,73,73,73,73,69,73,73,73,73,93,77,69,73,73,73,73,73,69,73,113,121,130,130,134,134,134,138,134,134,130,130,117,105,97,97,85,73,77,81,89,105,125,134,134,117,113,121,134,134,150,158,109,130,77,69,69,134,97,93,105,105,93,89,85,89,93,89,81,65,65,65,81,73,69,
69,69,65,65,69,60,73,69,69,77,97,77,81,77,77,77,73,81,77,77,69,73,73,77,77,77,77,81,85,81,81,81,77,77,77,77,81,77,81,81,81,81,81,81,81,85,85,85,89,93,93,93,97,89,93,85,89,89,89,89,89,85,85,85,85,85,85,85,89,81,121,142,170,142,130,125,125,125,121,121,121,121,117,117,117,117,121,125,134,134,138,142,130,125,142,130,130,130,146,162,130,121,125,97,77,73,73,69,65,69,69,69,73,77,81,81,85,89,93,97,97,89,85,77,69,69,81,89,85,81,73,73,77,81,93,105,125,146,162,170,170,166,170,166,166,170,170,174,174,174,178,174,166,166,174,138,117,97,89,81,81,77,77,77,73,97,93,97,125,93,85,85,85,85,85,85,93,89,101,117,81,69,69,73,73,73,69,69,73,73,73,89,73,77,73,77,73,73,69,65,113,109,134,130,134,134,134,134,134,138,134,134,130,130,113,121,117,93,97,81,85,77,130,117,134,130,113,117,142,158,166,138,121,138,138,150,81,105,113,105,105,117,105,97,89,101,101,101,93,89,77,65,69,73,65,69,
65,65,69,73,73,77,69,73,65,73,97,93,81,73,69,73,73,73,77,73,73,77,73,77,81,77,77,81,81,81,81,81,77,77,77,77,81,77,81,81,81,85,85,81,85,81,81,85,85,93,93,93,97,93,93,89,89,89,89,89,89,85,85,85,85,85,89,89,85,85,134,150,154,134,130,125,125,125,121,121,121,121,117,117,117,117,121,121,130,130,130,134,130,130,134,125,121,121,146,154,130,134,134,97,81,77,73,69,69,69,69,69,69,73,77,81,89,89,97,97,93,89,85,81,77,77,73,81,81,73,77,73,77,85,89,101,125,154,158,170,162,166,166,166,170,170,170,170,166,166,178,174,166,158,170,146,121,101,85,81,81,77,73,73,73,85,113,130,121,85,81,89,85,81,85,89,97,93,89,117,85,73,73,73,69,73,77,73,73,73,73,81,73,73,77,73,73,73,73,73,113,134,125,130,138,134,138,134,134,138,134,121,125,130,117,117,81,97,97,77,85,85,113,113,125,117,125,146,158,146,125,138,113,109,113,125,117,97,105,117,113,117,113,101,109,105,97,97,93,93,85,73,69,73,65,65,
60,65,65,73,69,73,69,73,69,69,93,85,77,73,73,73,69,77,73,77,77,81,77,81,77,81,81,81,81,77,77,81,81,77,77,77,77,81,81,81,81,81,81,81,85,85,81,85,85,89,93,93,93,97,97,93,89,89,89,89,89,89,89,89,89,89,93,93,89,85,134,146,166,134,130,125,125,121,121,121,121,121,117,117,117,113,117,121,121,125,121,121,121,125,134,117,117,121,138,138,125,125,109,93,97,81,77,73,69,73,69,73,73,73,77,77,85,89,89,93,89,85,85,81,81,77,81,73,73,77,73,77,77,85,89,121,134,150,162,166,154,158,162,166,166,170,166,174,146,154,174,174,174,162,174,162,121,105,89,81,77,77,73,73,73,85,117,142,97,85,89,89,85,85,85,89,97,89,85,97,89,73,73,73,77,73,81,77,73,73,73,97,77,73,77,73,73,77,77,97,121,150,113,130,138,138,138,134,138,130,130,117,113,113,134,113,73,81,93,89,85,117,125,130,146,142,150,166,146,130,125,113,109,109,109,113,125,109,109,113,109,109,105,97,105,97,97,93,93,89,85,73,77,73,73,65,
69,65,60,65,73,69,85,69,69,73,81,73,73,69,73,73,77,77,73,73,77,77,77,77,77,81,81,81,81,81,81,81,81,77,77,77,81,77,77,81,81,81,81,81,81,81,81,85,85,85,85,89,93,93,93,93,93,93,89,89,89,89,89,89,89,89,93,93,97,89,130,138,158,142,134,130,125,121,121,121,117,117,117,117,117,117,117,117,121,121,121,117,117,121,125,121,113,117,121,117,142,109,97,89,85,81,77,73,69,69,69,73,69,73,73,81,81,89,93,101,89,85,85,81,77,77,77,85,85,77,77,77,81,81,105,138,154,162,166,158,150,158,162,166,166,170,170,178,154,150,166,174,158,154,162,166,125,101,93,81,77,77,77,73,73,81,97,97,85,85,93,85,81,81,85,93,101,89,81,85,85,73,73,73,73,73,81,77,77,77,73,93,81,73,77,73,73,77,69,117,142,117,113,125,130,138,134,121,117,117,130,130,130,142,150,117,69,113,134,130,130,117,117,150,138,170,146,146,146,146,121,105,109,117,101,109,121,109,109,113,109,105,105,97,93,93,89,89,93,85,81,77,69,69,69,69,
69,65,65,69,69,77,77,69,69,69,73,69,73,73,69,73,73,77,73,77,77,77,77,77,77,77,81,81,81,81,81,81,81,81,81,77,81,81,77,77,81,81,85,81,85,81,81,85,85,85,89,85,89,89,93,93,93,93,89,93,93,89,89,93,97,93,93,93,93,93,117,138,154,146,134,130,125,125,121,121,117,117,117,113,117,121,117,113,117,117,117,109,113,117,121,117,121,125,138,142,117,93,89,85,85,81,77,73,73,69,65,69,65,69,73,73,81,85,93,97,89,85,81,77,77,77,77,77,81,81,77,81,81,89,125,125,162,170,170,158,154,158,162,170,170,170,174,174,146,150,170,174,158,158,170,158,117,109,93,85,81,77,73,73,73,81,85,89,81,81,81,77,81,85,89,89,97,85,85,89,89,73,73,73,73,73,81,81,77,77,73,93,85,77,77,73,77,77,81,117,150,117,113,125,134,138,121,121,117,113,125,138,134,138,146,77,65,81,89,130,121,125,125,130,125,150,146,146,134,101,105,113,117,101,113,125,113,89,105,113,109,105,101,89,81,81,85,89,89,85,81,77,73,85,69,69,
69,69,65,81,69,73,69,73,65,69,69,73,69,69,73,73,77,77,77,77,77,77,77,77,77,81,81,81,85,81,81,81,81,81,81,77,81,81,81,77,81,81,81,81,81,85,81,85,85,85,85,89,89,89,93,93,93,93,93,93,93,93,93,89,89,89,97,101,105,101,125,130,154,146,134,130,125,125,121,121,121,117,117,117,117,121,117,117,117,121,113,109,117,117,113,113,125,134,121,113,101,93,89,85,81,77,73,69,69,73,77,81,77,77,77,81,81,89,89,93,85,81,81,73,73,73,73,77,81,81,85,85,93,93,121,134,174,166,166,154,158,158,162,166,170,170,170,178,150,146,170,178,158,146,158,158,121,109,93,85,81,77,77,73,73,73,81,81,81,81,81,77,81,85,85,93,93,85,81,89,93,77,73,73,73,77,77,77,77,77,77,85,77,77,77,81,77,69,113,125,142,117,125,130,134,134,125,130,117,117,125,121,117,162,134,125,130,125,109,109,130,130,117,130,125,125,134,113,89,101,113,125,130,125,117,117,89,101,109,113,109,101,97,89,85,77,85,89,85,85,85,77,81,69,73,69,
73,73,73,73,69,69,65,69,69,65,69,69,69,73,73,73,77,81,77,77,73,77,77,81,81,81,81,81,81,81,85,81,81,81,81,81,81,77,77,81,81,81,81,85,81,85,81,85,85,85,85,89,89,89,93,97,93,93,93,93,93,93,97,109,125,113,109,109,117,113,125,142,150,146,134,130,125,121,121,125,125,117,117,117,121,121,121,125,138,142,125,113,113,117,113,130,134,113,97,89,93,85,81,81,81,85,81,85,81,77,77,77,69,81,81,89,93,81,93,89,85,81,77,73,73,73,73,77,77,81,85,93,93,105,117,134,166,154,170,154,154,162,162,166,170,166,170,174,158,154,170,178,154,130,158,162,125,113,101,89,81,77,77,73,73,77,77,77,81,77,77,77,77,81,85,93,97,89,85,89,97,77,77,77,77,77,77,77,77,77,77,97,77,77,81,77,81,81,121,146,125,117,134,138,138,130,125,142,125,117,130,121,113,150,150,130,117,105,117,125,130,121,162,142,125,138,109,93,89,93,125,109,113,117,113,77,77,89,105,113,109,105,89,85,81,81,81,85,81,81,81,73,93,89,65,69,
69,69,69,69,69,69,77,65,73,73,69,69,73,73,77,73,81,85,81,77,77,81,81,85,85,85,81,81,81,81,81,81,81,85,81,81,77,81,77,81,81,81,81,85,85,85,85,85,85,85,89,89,89,89,93,93,93,93,93,93,93,93,97,134,130,113,105,105,109,117,121,146,154,146,138,130,130,125,125,125,121,117,117,117,121,130,130,138,150,146,142,117,117,125,134,138,138,101,93,85,85,81,81,81,77,81,81,85,85,93,97,85,85,73,73,89,93,89,85,85,85,81,81,73,73,73,73,77,77,81,85,89,93,109,125,134,154,158,166,154,154,162,162,166,166,170,166,182,158,166,170,178,170,134,142,162,134,113,105,89,85,77,77,73,73,73,77,77,77,77,77,77,77,81,85,97,97,89,85,97,109,77,77,77,77,77,77,77,81,77,77,101,85,77,77,77,81,93,121,146,121,121,130,134,134,125,125,134,150,134,121,121,109,130,134,134,97,105,117,117,125,134,154,109,134,89,81,89,93,89,85,97,101,89,77,73,81,89,105,109,109,101,93,81,81,81,85,81,81,81,77,89,73,73,69,69,
69,69,73,69,69,65,65,69,69,73,77,77,73,73,73,77,85,81,77,81,85,81,85,81,85,81,81,81,85,85,85,81,89,81,81,81,81,81,77,77,81,81,85,85,85,85,85,85,85,89,89,89,89,89,93,97,93,93,93,93,93,97,101,117,109,101,101,93,97,109,121,146,146,154,138,134,146,134,130,121,121,134,121,121,121,134,138,138,146,142,130,117,125,138,134,138,117,93,89,89,81,81,77,77,77,81,85,85,89,93,97,89,81,81,85,93,93,85,81,81,77,77,73,77,73,73,73,73,77,81,85,89,109,101,130,138,150,166,166,154,158,162,162,166,166,166,166,174,178,166,170,178,158,146,162,158,130,117,109,97,85,81,77,73,73,73,73,89,77,77,77,81,81,85,85,97,93,85,85,93,105,81,77,77,77,81,81,81,81,77,77,81,77,77,77,81,73,113,134,142,113,121,134,134,134,125,117,117,158,158,125,117,105,134,125,117,97,101,130,117,138,97,81,93,69,77,89,93,93,97,93,93,81,77,73,77,81,97,105,109,109,101,89,81,81,81,81,81,81,77,77,93,73,73,69,69,
73,73,77,69,69,65,69,69,73,73,73,77,77,77,73,85,85,81,81,85,85,81,81,81,81,81,85,81,81,81,81,85,81,81,81,81,81,81,81,81,81,81,85,85,85,89,85,85,85,89,89,89,89,93,93,97,93,93,93,93,89,97,101,109,109,105,101,97,93,93,101,138,158,150,154,138,154,138,130,125,125,166,138,125,117,138,146,142,146,142,130,121,121,134,138,121,89,85,81,81,77,81,85,81,85,89,93,93,93,89,85,85,85,77,73,73,93,89,85,81,81,77,73,69,73,73,73,73,73,81,85,85,97,97,130,162,166,166,166,154,158,158,162,166,166,166,170,170,178,170,178,178,154,158,166,150,130,121,113,109,89,81,77,73,73,73,73,81,81,77,77,81,81,85,89,93,89,89,85,97,113,85,77,77,77,81,81,81,81,81,81,93,81,81,81,81,73,125,142,121,113,130,130,138,134,125,130,125,142,166,154,125,109,134,162,146,138,109,125,138,109,101,85,89,73,81,85,89,93,97,85,81,77,77,77,77,81,93,105,109,105,101,89,85,81,81,81,81,81,85,85,81,77,69,69,65,
69,73,69,69,69,69,69,69,73,69,69,69,73,73,81,89,101,81,81,85,85,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,77,77,81,81,81,85,85,89,89,89,89,89,89,89,93,93,93,97,93,93,97,93,97,101,105,113,105,101,101,101,93,93,97,125,138,142,158,146,150,138,130,134,121,154,154,146,125,146,154,150,150,142,146,121,125,138,138,101,85,81,81,81,89,85,85,85,89,93,97,93,89,93,97,81,77,77,77,73,73,77,77,77,73,73,73,73,73,73,73,73,77,81,85,89,93,113,130,162,170,166,166,154,158,158,162,166,166,170,166,166,178,158,178,182,170,170,170,150,142,134,125,117,97,85,77,77,73,73,73,77,77,81,77,81,85,85,89,97,89,85,85,93,105,97,85,77,81,81,81,81,81,81,81,93,89,81,81,77,81,130,146,113,125,113,138,134,134,130,130,125,138,158,170,134,125,109,121,97,121,113,117,117,89,89,85,81,81,81,81,85,97,93,81,77,77,73,81,73,85,93,101,105,105,101,89,85,81,81,81,81,81,81,89,85,77,73,65,69,
69,69,69,73,69,69,69,69,69,69,73,77,73,73,81,93,85,77,77,81,81,77,77,81,81,81,81,81,81,85,81,81,81,81,81,81,81,81,81,77,77,81,81,85,85,85,89,89,89,89,89,89,93,89,93,93,97,97,101,101,101,105,109,109,105,101,97,97,93,101,97,109,125,150,158,150,146,138,130,138,125,134,170,154,125,138,142,150,158,146,138,125,138,134,117,89,85,81,81,81,81,81,85,85,89,97,97,93,89,89,89,81,77,77,73,73,73,77,73,77,77,77,73,73,73,73,73,73,77,81,85,89,93,101,113,146,166,170,166,166,162,154,162,166,166,170,166,170,182,166,174,182,170,170,170,166,162,146,146,125,113,89,81,73,73,73,73,73,77,77,77,77,85,89,93,97,85,85,85,97,113,97,85,85,81,81,81,85,81,81,85,101,93,81,81,73,117,130,158,125,125,121,138,134,134,138,138,113,134,158,166,121,101,69,73,65,85,113,117,121,85,81,89,89,81,81,81,81,97,89,77,77,77,77,77,73,85,93,101,101,101,97,89,81,81,85,85,81,81,85,81,89,77,73,65,69,
69,73,69,73,69,69,69,69,73,69,73,73,73,77,85,101,81,77,77,77,77,77,77,81,81,81,81,81,85,85,81,81,85,81,81,81,81,81,81,81,77,81,85,85,85,85,89,89,89,89,89,89,93,89,93,93,93,97,97,97,101,101,101,109,113,113,97,97,97,101,97,101,130,154,154,150,146,138,130,130,134,142,170,150,125,134,134,142,146,134,134,125,134,134,113,89,85,81,77,81,81,81,85,85,93,101,97,93,89,85,81,77,77,81,73,77,77,77,77,77,77,77,73,77,77,73,69,73,77,81,85,93,105,109,117,146,170,170,166,166,162,154,166,166,166,166,170,174,178,178,178,182,170,162,166,166,170,162,154,146,125,105,85,81,73,73,73,73,77,77,81,85,89,93,97,101,89,81,81,101,113,97,85,93,85,81,81,85,85,85,81,93,97,81,77,121,125,142,134,134,125,125,134,134,138,134,134,134,134,154,158,125,85,77,69,73,85,113,97,93,89,93,81,81,81,81,77,81,97,89,77,77,81,81,73,73,81,93,101,97,97,93,89,85,81,85,81,81,81,81,93,77,73,69,69,69,
69,73,77,77,73,69,69,69,69,69,69,69,77,77,105,89,77,77,77,77,77,73,73,77,81,81,81,81,85,85,81,81,81,81,81,81,81,81,81,81,81,81,81,85,85,85,89,89,89,89,89,89,89,89,93,93,93,89,89,93,97,97,101,105,105,109,105,97,97,105,105,93,117,146,150,146,138,134,125,125,146,158,170,158,134,134,125,138,134,130,125,121,134,130,109,89,85,85,93,85,81,81,81,89,89,93,93,89,85,81,81,81,85,81,73,77,77,77,77,81,81,73,77,81,81,85,77,73,77,81,89,105,130,125,130,134,170,174,170,166,166,158,166,170,166,170,170,170,170,178,174,170,170,166,166,162,174,154,150,162,138,125,93,85,77,73,73,73,73,81,77,85,89,97,97,97,89,85,85,109,113,97,89,93,81,81,81,85,85,85,85,93,97,81,93,121,117,150,134,125,134,130,134,134,130,134,138,134,130,142,154,117,97,77,73,73,77,109,105,89,81,85,89,77,73,77,77,81,101,89,81,81,77,81,73,81,81,89,101,101,97,89,89,85,81,81,81,77,81,81,81,77,73,73,65,69,
69,69,77,77,69,73,69,65,69,69,69,73,81,81,101,85,81,81,77,77,73,73,77,73,73,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,85,85,85,89,85,85,85,89,89,89,93,93,93,93,93,93,89,93,97,101,105,109,113,97,93,93,117,97,109,130,154,142,134,130,125,130,154,162,170,178,174,162,130,125,121,125,117,134,134,121,101,89,89,89,85,81,81,81,89,89,97,97,93,85,85,85,81,81,89,85,73,73,73,77,77,81,89,113,117,101,85,97,121,89,81,85,97,125,125,134,134,142,170,174,170,166,166,166,166,166,166,170,170,174,170,178,174,170,170,170,174,162,174,158,154,166,142,130,121,89,73,77,73,77,81,77,81,85,101,93,89,89,85,85,85,105,113,101,93,93,81,81,85,85,85,85,85,89,97,81,105,117,146,138,138,130,146,138,134,134,134,134,134,134,134,130,166,150,125,77,73,73,77,117,117,73,77,89,93,81,73,77,77,81,97,93,81,81,81,89,81,81,77,89,93,93,97,85,93,81,81,81,77,81,85,77,97,73,73,65,60,65,
69,69,69,73,69,69,65,65,69,69,73,81,85,93,89,85,81,77,77,77,73,77,73,73,73,77,77,81,85,81,77,81,81,81,85,81,81,81,81,81,81,81,85,81,81,85,85,85,85,85,85,89,89,93,93,97,93,93,93,89,93,93,93,93,97,105,117,101,93,97,93,93,105,134,154,150,134,125,121,121,154,154,170,170,170,174,130,117,113,117,125,138,113,101,97,89,89,81,77,77,77,81,89,89,97,93,89,85,85,81,81,85,97,93,77,73,73,73,77,85,93,125,138,125,113,117,117,117,89,89,101,125,125,130,162,162,170,170,174,170,174,166,166,170,170,166,170,170,170,170,166,166,166,170,162,150,170,162,166,150,146,130,121,85,73,73,73,73,77,85,85,97,97,89,85,89,85,85,85,105,109,105,97,93,81,77,85,85,85,89,85,89,93,85,113,121,146,138,134,134,150,130,134,134,134,134,134,134,134,138,146,146,125,113,77,73,65,105,93,60,73,81,89,77,77,77,81,81,89,97,89,77,81,85,81,77,81,93,93,89,97,85,85,89,77,77,77,73,77,81,77,73,69,65,60,65,
65,73,69,69,69,65,65,69,69,73,81,85,93,109,93,81,81,77,77,77,73,73,77,73,73,73,73,77,77,77,77,81,81,85,85,85,85,81,81,81,85,85,85,81,81,85,85,85,85,85,89,89,89,93,97,97,93,93,93,93,89,93,89,89,97,105,113,101,97,105,101,93,101,138,146,154,142,130,121,117,162,158,166,170,170,146,117,121,125,130,138,130,93,93,89,89,89,77,77,77,77,81,81,89,97,93,89,85,85,85,85,77,89,97,77,73,73,77,77,89,113,130,142,138,125,121,130,130,113,97,105,121,125,130,150,166,178,178,178,174,170,166,170,166,170,170,170,170,166,170,166,166,174,166,154,134,170,170,162,158,158,138,125,89,73,73,77,73,81,85,93,97,93,85,81,85,85,85,85,109,113,105,105,93,89,101,81,85,89,89,85,93,93,85,113,125,121,134,134,138,134,138,134,138,134,134,130,125,109,130,150,134,138,138,93,77,93,109,69,73,65,69,89,81,77,81,77,85,85,101,77,93,81,89,93,77,89,101,85,97,89,81,81,77,77,73,73,85,97,77,93,73,69,69,65,65,
65,81,77,65,65,65,65,69,69,77,77,81,101,105,85,93,81,77,77,77,73,73,77,73,73,73,73,73,77,77,77,77,81,81,85,81,81,81,85,85,81,85,85,85,81,81,85,85,85,89,89,89,89,89,93,97,93,93,89,89,89,93,89,89,93,97,105,113,105,105,93,93,97,142,158,142,154,130,121,117,154,166,166,166,142,130,117,138,134,134,138,97,89,85,85,85,81,77,77,77,73,81,81,89,93,85,85,85,81,81,85,93,93,93,81,73,73,73,77,101,125,142,146,138,130,130,138,138,125,117,117,117,130,134,146,170,170,178,178,174,166,166,170,170,170,170,170,166,170,166,162,158,166,158,154,138,142,170,162,166,166,154,130,113,73,73,77,73,81,85,93,97,89,81,77,81,81,81,85,113,109,105,105,101,113,138,93,85,89,89,89,93,101,85,113,113,117,125,134,121,130,134,134,138,134,130,117,117,109,113,134,130,121,113,134,73,134,121,65,69,65,69,85,77,77,81,81,81,85,109,93,81,85,89,93,73,85,81,81,89,85,81,81,73,73,73,73,73,85,77,81,73,73,65,65,65,
65,77,89,65,65,65,65,65,73,77,77,77,93,97,85,81,73,73,77,73,73,77,77,73,73,73,73,73,73,77,77,77,77,81,81,81,81,81,81,81,81,85,85,85,85,85,85,85,85,85,89,85,89,93,97,97,93,93,93,89,89,93,93,89,93,93,97,109,117,101,117,97,113,138,158,138,154,130,121,117,125,146,158,158,138,125,130,138,138,134,125,85,85,85,85,81,81,77,77,77,81,81,85,89,89,89,85,81,81,81,85,93,93,85,81,73,73,77,105,113,142,154,158,146,138,134,146,130,138,125,125,150,142,130,130,154,170,178,174,170,166,162,170,170,174,174,170,170,166,162,162,150,166,138,138,134,142,170,178,178,166,162,146,113,73,73,73,81,81,89,97,93,85,81,81,77,77,81,85,113,105,105,113,109,113,142,101,85,89,89,89,93,97,85,121,105,121,130,130,130,134,138,138,138,134,130,109,109,113,101,130,134,109,81,113,113,134,146,69,69,65,73,85,97,85,77,89,93,101,89,105,97,101,93,89,101,101,77,89,81,97,77,73,77,73,73,73,81,85,93,93,69,69,65,65,65,
65,73,89,65,65,65,69,69,73,73,73,81,81,85,85,81,77,73,73,73,73,77,77,73,73,73,73,73,73,73,77,77,77,77,73,77,81,81,81,81,81,81,85,85,85,85,85,89,85,89,89,89,89,93,97,97,93,93,93,89,89,89,93,93,93,93,97,109,113,117,125,134,130,138,125,146,158,134,121,117,117,121,121,138,130,117,138,125,113,125,117,81,81,81,81,81,77,77,77,73,85,89,89,85,81,77,81,77,81,73,73,81,93,89,81,73,77,93,130,121,154,166,162,150,142,142,142,125,146,134,146,158,142,138,134,138,162,166,170,166,162,162,166,170,174,178,170,170,162,162,162,150,162,142,138,134,146,170,178,178,174,170,170,134,81,73,73,77,81,93,97,89,81,81,77,77,77,81,85,109,101,105,125,121,113,125,101,89,89,89,89,89,93,101,117,105,125,130,121,130,134,134,138,134,134,130,121,113,113,113,109,134,113,81,97,138,162,138,73,73,69,77,77,89,77,93,101,97,89,101,101,109,117,125,89,85,77,81,89,77,73,73,77,69,69,69,73,93,89,85,77,69,73,69,69,60,
65,65,69,60,65,65,69,69,73,73,69,85,85,77,81,73,73,69,73,73,73,77,73,69,73,73,73,73,73,77,77,77,77,77,73,77,77,77,81,81,81,81,85,85,89,85,85,85,85,85,89,89,93,97,97,97,93,89,89,89,89,93,93,93,93,93,97,101,121,146,146,130,134,134,117,138,125,146,130,117,121,125,130,113,117,138,130,109,101,121,93,77,81,77,81,77,77,77,81,89,89,81,81,77,77,77,73,77,73,73,77,77,77,93,77,77,73,101,125,134,162,174,162,158,150,150,138,125,146,146,158,142,130,154,142,138,166,150,162,166,162,158,166,166,182,178,166,166,162,162,158,154,158,142,134,125,162,146,154,174,178,170,162,150,81,73,73,85,81,97,93,85,81,77,81,77,77,77,85,105,105,109,130,121,125,121,89,89,89,93,93,93,93,105,113,101,125,134,121,138,134,134,125,138,134,130,121,117,113,113,109,130,113,89,81,113,142,134,69,60,60,69,77,93,89,105,89,85,97,109,97,97,101,121,113,97,97,69,77,73,73,73,81,89,73,69,77,85,81,97,73,69,69,69,60,60,
60,65,65,65,60,65,73,73,77,81,85,89,81,77,89,89,73,69,73,73,77,77,73,73,73,73,73,73,73,77,77,77,73,73,73,77,77,77,77,81,81,81,81,85,85,89,89,85,89,93,89,93,93,97,97,93,89,89,85,89,89,89,89,93,93,93,93,109,146,142,134,142,138,121,121,125,121,142,150,130,138,125,138,113,117,138,105,97,93,97,77,77,77,77,77,77,77,81,89,97,89,89,77,73,73,73,73,73,73,73,73,77,85,89,81,101,121,134,130,138,170,170,166,162,150,146,142,130,142,154,154,130,138,170,170,154,146,146,158,162,162,158,158,166,170,170,174,166,162,162,150,162,162,158,142,138,162,170,150,170,174,174,182,158,113,77,77,81,89,93,89,81,81,81,81,81,77,77,85,105,105,113,142,117,125,117,89,89,93,93,93,93,93,113,105,109,125,138,130,134,134,134,125,121,134,125,105,117,109,105,113,125,113,121,81,130,117,125,60,60,56,60,73,85,85,89,85,89,105,97,77,97,85,97,89,73,77,69,69,69,69,73,69,69,69,85,97,89,93,85,73,69,69,69,69,60,
60,65,65,65,65,65,81,77,69,81,97,81,81,73,69,77,73,73,73,69,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,77,81,77,77,77,81,81,85,81,81,85,85,89,89,93,97,93,97,97,97,93,89,85,85,89,89,89,89,89,93,97,93,134,146,117,105,117,113,113,121,125,134,142,166,162,154,138,154,125,130,130,105,93,89,81,73,77,77,77,77,73,77,85,89,93,89,81,81,77,73,73,73,69,69,69,69,73,77,77,85,117,134,134,134,154,166,162,166,162,146,150,142,130,138,158,150,138,146,170,178,162,154,170,154,150,154,158,158,170,170,166,170,166,162,166,158,162,170,162,138,138,158,174,174,158,170,166,178,162,125,81,77,89,89,93,85,81,81,81,81,81,81,77,89,109,109,113,142,138,125,117,89,89,93,93,93,93,93,117,101,105,121,134,130,134,138,134,121,109,138,130,101,101,109,117,113,113,134,113,101,138,125,117,56,65,60,60,65,85,81,81,77,121,97,81,81,89,77,89,65,69,69,65,69,73,69,73,97,105,73,81,77,81,109,77,69,69,69,65,65,60,
60,60,65,73,69,69,81,97,81,77,81,81,77,73,81,73,69,73,73,73,73,73,73,73,73,73,73,73,77,77,77,77,77,77,73,77,77,77,77,81,81,81,81,81,81,81,89,89,89,93,89,89,93,97,97,93,89,85,85,85,85,89,89,89,93,97,109,130,121,109,93,89,97,97,130,146,134,134,150,134,142,130,130,134,134,121,101,89,85,77,77,73,77,77,77,73,73,81,89,81,77,69,73,69,69,69,65,65,69,69,69,69,73,73,81,113,134,121,146,174,166,162,158,158,158,150,146,138,134,154,146,138,162,170,170,166,162,166,150,150,154,162,166,170,166,170,170,166,166,170,162,162,170,170,134,138,158,170,154,130,138,150,162,170,130,85,81,81,81,93,81,81,81,81,85,81,81,81,93,113,109,121,138,134,117,105,89,89,93,93,93,93,93,121,101,93,117,134,125,138,134,130,113,113,121,134,113,85,93,109,113,121,130,130,130,134,125,113,56,65,60,60,65,77,81,77,77,81,85,89,89,85,73,69,65,65,65,65,65,69,65,69,97,85,77,73,85,73,85,81,73,69,69,69,65,60,
60,65,65,73,69,73,73,77,73,73,85,77,73,69,77,69,69,73,69,73,69,69,73,69,69,73,73,73,77,77,73,73,77,77,73,77,77,77,77,77,81,81,81,81,85,85,85,85,89,89,89,93,93,97,97,97,93,89,85,85,85,85,89,89,97,81,130,121,121,97,93,93,93,97,117,138,121,134,130,121,113,125,134,138,134,117,109,81,81,77,73,73,73,73,73,81,89,93,85,81,77,73,69,65,69,69,69,69,69,69,69,73,73,73,81,109,134,117,142,174,166,162,154,158,158,150,150,142,138,146,138,142,166,170,166,166,166,154,150,150,158,170,166,166,170,170,170,170,166,170,166,162,170,174,134,130,162,162,146,125,113,121,134,150,138,109,85,89,89,81,81,81,81,85,85,85,81,81,97,117,109,130,166,150,121,101,89,93,93,97,97,97,93,117,117,97,117,130,130,134,134,138,113,113,154,134,113,89,81,113,117,125,130,130,134,130,130,93,65,65,60,60,60,73,73,73,81,93,56,44,85,81,69,60,65,60,60,60,60,81,65,73,81,97,73,89,117,93,93,77,73,65,69,65,65,60,
65,77,77,69,69,77,69,69,69,73,77,69,69,69,69,73,69,73,73,73,69,69,69,69,69,73,73,73,73,73,77,73,73,77,73,77,73,77,77,77,81,81,81,81,85,85,85,85,89,89,89,89,93,97,97,97,93,93,85,85,85,85,89,93,69,117,125,142,125,121,101,97,89,93,93,109,134,134,130,125,117,97,117,109,117,109,109,81,77,77,73,73,73,77,81,89,93,85,81,77,73,73,69,69,65,65,65,69,69,73,73,73,73,73,81,113,113,113,121,150,154,162,154,150,154,146,150,146,146,146,138,146,162,170,158,154,158,150,146,150,154,166,166,166,174,174,166,170,170,170,170,166,166,174,142,138,162,158,146,121,117,109,109,109,134,134,121,89,85,81,81,81,81,85,85,85,81,81,101,109,117,142,174,166,125,101,89,93,93,97,97,93,97,117,117,109,113,134,130,134,130,142,117,121,170,150,105,85,81,81,89,101,113,130,125,125,125,89,65,65,60,60,65,73,73,73,77,89,93,89,48,69,73,65,60,60,60,60,60,65,65,73,77,69,77,93,97,81,85,73,69,69,60,65,65,65,
69,77,77,69,73,69,69,65,73,73,73,69,69,69,73,73,69,69,69,73,69,69,69,69,73,73,73,77,77,77,73,77,77,73,77,77,77,77,77,77,77,81,81,85,85,85,85,85,85,85,89,89,93,97,97,93,93,93,89,81,85,85,85,77,121,130,150,142,121,125,105,93,93,89,89,93,117,134,125,97,81,77,105,97,113,109,109,81,81,77,73,73,73,77,81,85,89,85,77,73,69,65,60,65,65,65,65,69,69,73,73,77,77,77,81,121,113,113,117,125,146,158,158,150,150,146,150,146,146,138,142,146,154,170,162,154,150,146,146,146,146,154,166,174,178,170,170,166,170,170,166,162,166,170,162,138,150,138,138,134,117,105,105,105,109,109,113,89,85,85,81,81,85,85,85,85,81,81,105,117,121,142,182,174,130,109,93,93,93,97,97,97,97,113,113,109,117,138,138,130,125,113,113,121,146,150,109,89,77,77,81,85,105,125,134,117,125,69,69,65,60,60,60,81,73,73,77,81,97,89,89,48,69,77,60,60,60,60,60,81,65,65,65,73,69,73,77,73,77,73,69,65,65,65,60,60,
73,77,77,69,69,65,65,60,69,77,77,69,69,65,69,65,69,69,69,65,69,73,69,69,73,73,73,73,77,77,77,77,77,77,73,77,77,77,77,77,81,85,89,85,85,85,85,85,89,85,89,85,93,93,97,97,93,93,89,89,85,81,85,125,142,138,170,146,121,130,117,101,85,85,85,85,93,97,89,77,73,85,105,105,109,121,101,77,73,69,73,73,73,81,85,89,93,81,77,73,69,65,60,60,60,65,65,69,73,73,77,77,77,81,85,117,117,113,117,125,138,150,158,146,146,146,150,146,146,138,142,150,154,166,162,158,154,146,150,146,150,154,166,174,178,174,170,170,170,170,162,162,166,170,174,146,134,142,130,154,146,121,105,109,109,101,97,89,93,89,85,85,85,85,85,85,85,85,105,117,130,158,174,174,138,109,93,93,97,97,101,97,97,113,117,109,121,130,142,113,121,113,121,121,146,142,105,105,93,85,81,85,85,113,125,125,117,65,73,65,60,60,60,81,73,73,73,77,81,93,101,85,60,65,60,60,60,60,56,52,60,65,77,69,85,73,73,77,69,65,65,60,77,65,60,73,
65,69,69,69,65,65,73,89,77,77,77,69,65,65,65,69,65,65,65,65,65,69,69,69,73,77,73,73,73,77,77,77,73,73,73,73,77,77,81,77,81,81,85,85,85,85,85,85,85,93,89,89,93,97,97,93,93,93,93,89,81,77,125,138,166,170,170,150,117,134,121,105,109,81,85,85,89,89,77,73,73,81,101,105,105,105,89,73,73,69,73,73,73,73,85,97,93,85,77,77,69,69,69,60,65,60,65,69,73,77,77,81,81,81,89,117,113,113,117,121,138,146,150,146,146,154,146,146,146,142,142,150,162,166,170,166,158,150,154,150,150,154,162,182,178,182,178,170,166,166,162,162,166,166,178,146,134,142,125,142,146,166,142,101,101,109,101,97,97,85,81,85,89,85,89,85,85,85,105,113,130,162,170,154,125,105,93,93,93,97,101,101,101,105,125,130,134,134,142,117,146,130,130,134,162,146,113,105,93,85,85,81,85,121,130,138,113,60,73,65,60,60,60,73,73,69,69,73,77,93,93,101,56,77,60,60,60,60,73,85,65,65,73,73,81,77,81,77,73,65,65,69,81,77,69,65,
69,73,73,69,77,69,69,65,73,81,69,69,69,65,65,65,65,65,65,65,69,69,69,73,73,69,73,81,77,77,77,77,77,73,73,73,77,77,81,81,81,81,81,85,85,85,89,85,89,93,85,89,93,97,97,89,93,93,97,81,77,130,125,154,158,158,170,150,121,134,121,105,109,85,85,93,93,85,85,77,73,81,101,105,113,93,89,69,69,69,73,73,93,97,89,89,93,77,77,73,69,65,65,65,60,65,65,69,73,77,109,101,81,85,93,121,117,113,117,121,134,146,146,146,146,150,146,146,146,150,146,154,170,166,170,166,154,154,154,150,146,154,162,178,182,182,178,174,166,170,166,162,170,170,178,154,138,134,134,138,174,174,170,142,125,105,105,105,97,89,81,85,85,89,89,89,85,89,101,117,134,166,166,146,130,105,93,97,97,97,101,101,101,101,130,138,134,134,150,117,142,130,130,150,166,130,121,109,93,77,85,85,81,121,142,138,81,65,69,65,65,65,73,85,73,73,77,73,77,89,89,105,65,69,60,60,56,69,56,60,60,73,81,73,77,73,69,69,77,65,65,65,77,81,73,69,
69,77,69,65,69,73,77,93,81,73,69,65,65,69,69,69,69,69,69,65,69,69,73,69,69,69,69,69,73,77,77,77,77,73,73,73,73,77,81,81,81,85,85,85,89,85,89,89,89,93,81,85,93,97,93,89,93,85,81,101,125,138,166,158,134,142,150,138,134,134,125,113,105,97,85,85,97,85,89,81,73,81,105,105,117,85,73,65,65,65,69,81,81,85,89,89,85,81,73,73,69,73,77,65,65,69,69,73,73,81,85,105,89,89,93,117,121,117,113,121,138,134,146,150,150,146,146,150,146,150,146,158,170,170,174,166,158,158,150,146,146,150,162,170,178,178,178,174,166,166,162,166,166,166,166,154,134,130,138,154,182,174,174,170,162,109,101,97,93,81,89,85,85,89,89,85,85,89,101,117,142,170,162,150,130,117,101,97,97,101,101,101,105,105,117,121,134,125,150,121,142,130,130,146,154,134,130,117,109,101,85,85,93,121,125,77,89,73,73,69,65,69,69,85,73,69,77,73,77,93,85,105,69,73,69,65,77,65,89,60,65,77,73,77,73,73,69,65,65,69,73,65,73,89,77,69,
77,73,73,77,69,73,73,77,77,73,69,69,77,69,65,69,73,73,69,69,69,73,69,69,69,69,69,69,69,69,69,77,77,77,77,73,73,77,81,81,85,89,89,85,85,85,89,89,97,93,101,89,97,97,93,93,81,105,142,158,130,162,154,138,146,113,113,130,130,138,134,121,105,109,105,85,97,85,89,85,81,85,101,113,113,73,69,77,69,69,73,77,85,89,97,89,81,81,77,73,73,77,73,69,73,69,73,73,77,77,93,109,93,89,93,105,121,113,117,130,138,138,142,154,154,146,146,150,150,158,154,158,166,170,170,170,166,166,150,146,146,146,162,166,178,174,174,174,166,162,162,166,162,166,170,150,138,125,130,142,178,186,182,178,162,125,93,89,85,89,97,85,89,89,89,89,93,89,101,125,146,166,162,162,134,113,109,93,97,101,101,105,105,101,117,109,117,121,150,130,154,134,134,146,138,130,121,125,109,105,85,85,89,146,142,77,93,85,73,65,69,69,65,77,73,73,77,73,77,93,89,101,85,77,60,60,60,65,65,60,65,65,65,73,73,73,73,65,69,65,69,69,81,85,81,73,
69,73,77,73,69,69,73,81,85,69,69,69,69,69,65,73,73,77,73,73,69,69,69,73,69,69,69,69,69,69,73,73,69,73,77,77,77,81,81,81,81,85,85,85,93,89,89,93,93,93,89,85,97,97,93,81,117,150,138,150,138,154,158,134,142,121,81,93,121,134,134,121,130,109,109,89,85,89,69,65,69,69,101,121,101,73,65,65,65,69,77,77,85,85,93,93,89,81,77,69,69,69,69,73,69,73,73,77,77,89,117,101,93,93,93,105,125,117,121,138,138,138,142,154,154,154,142,150,154,170,166,162,166,170,166,170,170,170,154,146,146,146,162,174,182,170,170,166,162,162,158,166,158,162,158,150,125,134,130,154,178,178,174,174,178,178,154,101,77,89,93,85,89,93,89,89,93,89,101,134,154,170,162,170,138,125,121,105,101,101,105,105,105,105,109,117,113,130,146,142,150,138,138,146,130,130,117,125,109,105,85,85,93,130,146,89,101,85,73,69,69,60,60,73,73,73,73,77,77,93,85,101,81,65,89,77,81,89,65,60,60,65,65,77,65,73,73,69,65,65,65,69,77,81,77,73,
73,85,97,101,77,73,73,77,73,69,69,69,69,69,69,77,77,77,77,73,69,69,69,69,69,69,69,69,65,69,69,73,73,73,73,73,77,77,85,85,85,85,89,89,85,89,85,93,93,93,89,89,93,97,81,125,170,166,150,142,117,113,113,121,130,117,89,77,69,81,105,121,125,125,117,89,81,101,93,93,97,101,113,134,93,65,69,69,69,77,73,77,81,85,89,89,89,81,73,73,69,69,73,73,73,73,81,77,81,89,93,93,93,97,97,105,125,117,121,146,142,142,146,154,158,150,146,158,162,170,166,166,170,170,174,166,170,170,154,154,150,146,158,166,170,174,166,170,162,150,150,166,162,166,154,138,130,130,138,162,182,174,170,166,170,166,158,138,130,97,89,89,89,93,93,93,93,93,121,134,158,166,170,166,150,130,158,117,101,105,105,105,105,105,109,125,117,162,154,150,150,134,154,134,134,134,125,109,109,89,89,85,89,125,138,89,89,81,69,69,65,65,60,73,73,73,77,77,77,93,85,101,81,60,77,105,85,69,60,60,65,65,65,69,73,60,73,73,73,81,93,85,81,77,85,81,
101,89,89,109,101,77,77,81,77,69,69,69,69,69,73,85,81,65,73,73,69,69,69,69,69,69,69,69,69,69,73,69,73,73,69,73,77,77,85,85,85,85,85,89,93,89,97,93,97,93,89,89,101,89,142,162,158,150,134,130,138,138,125,117,130,117,85,97,101,77,85,89,121,121,121,130,146,146,117,130,150,146,125,105,69,60,65,69,69,77,77,73,81,85,97,93,85,77,77,73,69,65,65,73,73,77,77,77,77,85,89,89,97,97,97,101,121,113,125,146,158,154,154,150,154,146,146,162,166,166,166,170,170,170,178,170,170,166,162,162,166,158,166,170,178,170,170,170,158,146,150,162,162,170,154,134,125,138,142,166,178,170,166,158,154,150,142,138,130,97,89,89,89,93,93,93,93,97,134,130,162,166,170,162,138,142,166,125,109,105,105,109,109,105,117,130,134,170,158,158,150,150,158,130,130,138,130,113,105,85,85,89,85,121,138,89,69,73,73,69,65,60,60,60,81,73,77,73,77,93,85,97,89,65,69,73,65,65,65,65,60,65,73,69,69,81,77,73,69,109,97,93,93,85,89,77,
81,77,73,81,101,89,97,101,73,69,69,69,69,73,77,81,85,113,73,73,69,69,69,69,69,69,69,69,69,73,73,73,73,69,73,73,77,77,81,85,81,85,85,85,85,89,89,93,97,101,93,97,89,121,150,138,142,134,134,146,121,130,134,125,125,113,85,81,101,93,81,56,60,89,101,113,138,154,138,105,85,85,93,65,56,65,69,65,73,73,73,73,81,85,93,93,89,81,77,73,73,65,69,69,73,73,73,77,81,85,85,89,93,93,97,105,117,121,130,142,162,158,154,154,150,150,146,162,170,170,166,170,170,166,178,170,170,166,166,166,170,162,166,170,174,170,170,170,150,142,154,154,162,170,142,125,130,138,158,174,178,170,162,150,142,134,130,130,121,109,93,93,93,93,97,93,97,113,134,130,158,170,162,158,142,154,166,162,121,105,109,113,109,105,125,138,150,166,166,170,166,170,146,130,130,138,125,134,125,109,97,85,85,89,125,81,69,69,69,65,65,60,60,60,69,77,73,77,77,97,81,93,89,65,65,60,73,65,65,56,73,65,69,77,69,85,81,77,69,93,85,85,89,85,77,77,
85,77,73,73,85,97,101,77,85,69,73,69,73,77,81,85,73,146,77,73,69,69,69,69,69,69,69,69,69,73,69,73,69,73,73,73,77,77,77,81,85,81,85,85,89,89,89,93,93,97,97,93,101,146,146,142,134,134,158,134,109,125,134,130,121,117,97,77,89,97,105,117,109,109,105,113,146,130,97,65,40,48,52,52,73,73,73,69,69,73,73,77,81,85,93,97,85,81,73,77,69,69,69,69,69,73,77,77,77,81,81,85,89,93,97,117,125,130,138,150,150,154,154,150,146,150,150,158,170,174,170,170,166,170,170,170,170,166,170,166,166,162,166,170,174,170,170,166,154,142,158,154,162,170,138,121,130,142,178,182,174,166,158,146,134,130,121,125,125,121,89,89,93,97,97,97,97,125,134,130,166,166,166,154,138,158,158,162,121,117,113,113,117,125,130,138,154,170,170,162,166,174,162,121,130,134,121,134,130,121,109,97,93,93,109,81,65,69,69,65,60,60,60,65,77,77,77,73,77,93,85,101,73,85,89,85,65,73,60,81,77,85,69,85,69,73,73,69,69,69,93,89,85,93,77,81,
77,73,77,69,73,89,89,85,77,77,73,73,77,77,77,81,113,109,69,77,73,69,73,69,69,69,69,69,69,73,73,73,69,73,73,77,77,77,81,81,81,85,85,85,89,89,89,93,93,97,101,97,105,158,150,130,130,154,138,125,101,113,125,130,109,113,113,77,81,81,97,97,121,117,142,109,85,101,109,73,69,65,73,73,69,69,73,73,73,73,69,77,81,85,89,97,89,81,73,69,69,69,65,69,73,77,85,77,77,77,77,81,85,89,101,130,121,142,142,154,150,150,154,142,142,150,150,158,166,170,174,166,170,170,174,166,166,166,170,162,146,158,170,170,170,170,170,166,162,146,162,158,166,170,138,121,134,162,182,174,170,166,154,142,130,130,121,121,121,117,101,89,93,93,97,101,89,134,125,130,154,154,150,154,142,150,154,138,130,113,134,130,134,130,146,134,154,166,170,174,170,174,158,117,130,134,117,134,134,134,125,117,101,93,105,73,65,65,65,65,60,65,60,60,77,77,77,77,77,101,89,105,85,93,89,69,60,56,69,85,65,60,89,73,81,73,65,69,65,65,73,85,85,89,77,85,
85,73,69,69,69,73,77,85,81,77,77,77,77,81,73,109,125,73,73,69,69,69,69,69,69,65,69,69,73,73,73,73,73,73,73,77,77,81,81,81,81,85,89,85,85,89,93,93,93,93,101,97,117,154,142,130,138,154,125,117,97,101,130,138,130,117,121,85,81,85,89,121,117,125,105,109,105,117,81,69,69,69,69,69,65,65,69,77,69,69,73,77,81,81,85,97,85,81,77,73,69,60,65,69,77,81,81,73,73,73,77,77,81,85,97,125,130,146,150,158,154,146,154,146,146,150,154,154,166,166,170,170,170,170,182,166,166,170,170,174,170,166,170,166,170,166,170,166,154,150,154,158,170,166,130,121,154,174,178,182,174,166,150,138,125,125,121,117,125,121,105,101,89,93,97,105,117,125,125,117,138,150,154,162,150,154,146,138,146,125,130,138,134,125,158,134,154,174,166,170,178,166,142,125,134,130,113,130,134,138,130,121,101,101,101,73,65,65,73,73,65,60,65,60,69,81,77,77,81,89,101,93,73,73,69,60,73,73,77,85,81,81,77,85,77,65,73,65,65,65,69,97,93,105,101,97,
73,69,69,69,69,73,77,77,85,81,81,77,77,81,125,105,77,73,77,73,73,69,69,73,69,69,69,69,69,73,73,69,73,73,77,77,77,81,81,81,85,85,85,85,89,89,89,89,93,93,97,97,130,138,134,125,150,150,125,109,97,93,130,138,134,138,130,121,113,130,113,125,125,109,109,105,109,89,65,69,69,65,65,65,65,65,69,69,69,69,69,73,77,85,89,97,89,81,73,73,69,69,65,73,73,77,77,69,69,73,73,77,81,85,93,125,134,150,150,158,150,146,154,150,150,146,150,158,158,166,170,174,174,178,178,166,170,170,170,178,178,174,166,170,170,174,170,162,146,146,146,154,162,154,130,121,166,182,182,182,174,166,146,134,125,125,125,117,134,142,113,101,101,97,97,109,130,117,125,113,134,142,146,166,166,162,142,150,158,138,109,109,121,130,158,134,150,174,166,166,170,162,142,150,138,117,125,130,121,134,134,130,101,113,97,73,69,69,69,69,65,65,65,65,69,77,77,77,89,93,101,73,60,73,65,65,65,60,69,73,69,81,77,77,69,65,65,65,69,69,69,81,105,89,101,81,
69,69,69,69,73,77,77,77,81,85,77,73,81,89,89,77,81,85,77,73,69,69,69,69,65,69,69,73,73,73,73,73,73,77,77,77,81,85,85,85,85,85,85,85,85,85,89,89,93,97,97,101,125,146,125,130,146,142,125,105,93,89,93,134,134,134,130,109,134,125,121,130,130,134,109,125,85,73,69,69,65,65,65,65,65,60,65,65,69,69,69,73,81,81,85,97,93,85,77,69,65,69,69,73,69,73,65,65,69,73,73,77,81,85,93,117,134,146,150,158,150,146,150,146,146,142,150,158,154,166,166,174,162,178,178,174,178,178,174,174,170,178,166,170,170,170,174,162,142,134,138,146,166,138,121,125,174,182,182,178,174,170,146,130,117,121,125,125,150,162,134,97,93,113,105,117,134,125,117,113,138,166,162,154,166,174,166,166,158,134,113,109,113,125,162,134,158,170,162,162,154,154,162,162,138,125,138,134,113,121,125,134,134,130,93,69,65,69,65,77,60,60,60,81,69,81,77,81,89,101,89,56,60,69,65,65,65,73,73,69,65,69,77,69,65,65,65,65,65,65,65,73,85,77,69,69,
65,65,69,73,73,77,77,77,73,73,89,113,109,85,77,77,85,85,81,73,69,69,73,69,69,69,69,69,73,73,73,77,77,77,77,77,81,85,81,85,85,85,85,85,85,85,89,89,101,134,113,113,134,134,130,130,138,150,130,105,93,89,89,97,138,134,117,113,105,125,130,130,130,134,125,85,73,69,69,69,65,65,65,65,60,60,65,65,60,69,69,69,77,81,85,89,93,77,77,73,69,65,65,65,65,65,69,65,69,69,73,77,81,81,93,117,130,138,150,154,154,146,150,150,146,142,146,158,154,170,170,174,150,170,178,178,178,170,170,170,166,170,170,166,166,166,178,166,150,134,150,146,162,134,121,130,178,182,182,178,174,170,154,134,117,117,125,134,162,150,97,97,101,101,113,130,125,117,113,121,138,166,166,166,162,166,166,170,170,134,113,109,109,134,162,146,138,170,154,154,154,146,158,174,146,134,134,130,125,138,130,134,130,138,101,69,60,56,65,65,77,60,77,81,73,77,73,81,109,93,69,60,60,65,60,65,89,73,73,73,77,69,65,81,65,60,60,60,60,60,60,65,69,69,65,65,
65,69,73,73,77,81,77,77,81,117,105,85,77,81,77,81,85,85,77,73,69,69,69,69,73,73,73,73,73,73,77,73,73,77,77,81,81,81,85,81,85,85,85,85,89,89,89,89,125,134,113,130,146,130,134,138,134,146,125,109,89,89,89,89,101,134,117,93,109,121,121,134,125,125,109,77,69,69,69,65,65,65,65,65,65,60,60,60,60,65,69,73,73,77,89,89,89,81,77,73,73,65,69,65,65,65,65,65,65,69,73,77,81,89,97,113,134,130,150,154,150,146,154,150,150,150,150,154,154,166,174,174,174,174,178,174,182,174,166,166,158,162,166,158,162,162,170,166,154,134,162,138,162,130,121,150,178,182,182,186,174,166,154,134,121,130,125,142,142,109,89,93,89,93,109,134,109,113,109,134,154,166,158,166,162,158,154,146,154,138,113,109,109,121,162,142,138,154,150,142,142,138,166,166,162,142,146,150,142,150,142,134,130,138,130,113,105,97,60,69,81,93,93,73,73,77,77,85,109,89,65,65,60,65,81,73,69,77,65,69,69,77,77,69,65,60,60,60,60,60,65,65,69,65,65,65,
69,73,73,73,77,81,69,81,105,97,77,73,77,77,77,81,81,81,73,69,69,69,69,69,73,73,73,81,77,77,77,81,77,77,77,77,81,85,81,85,85,85,85,81,89,93,89,97,121,138,113,125,146,134,150,142,138,146,125,117,89,89,89,89,89,109,97,93,125,134,130,130,125,130,89,69,69,69,65,65,69,65,65,60,60,65,65,60,60,65,69,73,77,81,89,93,89,85,77,77,73,69,65,65,60,65,65,65,69,69,73,73,81,85,93,105,130,130,146,154,150,154,162,158,154,150,150,150,150,158,170,178,182,162,170,174,178,174,170,166,154,154,158,150,158,154,162,158,154,134,162,138,154,125,138,174,178,182,182,178,174,170,158,130,121,134,138,134,125,109,113,113,113,113,113,125,117,113,117,138,170,162,150,162,146,142,134,130,121,125,113,113,113,121,158,142,154,146,138,134,130,130,154,174,162,150,146,158,154,154,154,158,125,134,134,117,130,121,69,73,81,101,69,77,73,69,73,85,109,85,65,69,65,73,65,65,77,69,65,65,65,69,69,73,65,60,56,60,60,65,60,60,65,60,65,65,
69,73,73,77,77,105,121,105,121,81,73,77,73,73,81,77,77,77,73,69,69,73,73,69,73,73,77,77,77,77,77,77,77,81,77,77,81,81,81,81,81,81,85,89,89,85,89,113,134,117,113,146,130,138,174,166,170,134,113,130,93,89,89,93,93,93,97,101,134,138,113,130,130,101,77,73,69,69,69,69,69,69,65,60,60,65,60,60,65,69,69,73,73,81,89,97,89,89,81,77,73,69,69,65,60,60,65,69,69,73,73,73,77,81,101,97,125,130,138,170,162,158,166,162,158,154,150,146,146,146,166,174,182,170,178,170,178,170,166,170,166,150,146,142,154,150,150,146,142,146,158,142,146,121,142,162,174,182,174,174,174,170,154,125,125,138,134,134,134,121,121,117,121,138,134,134,121,113,130,130,158,154,146,150,130,121,117,117,113,113,113,113,150,170,150,150,154,154,130,130,138,125,146,170,178,162,158,150,162,146,154,170,150,134,138,117,105,130,101,60,77,85,105,81,93,69,73,93,105,93,93,60,77,85,65,65,69,65,65,60,60,60,65,65,65,56,60,60,60,60,60,65,65,60,65,65,
69,73,69,77,117,81,89,85,85,77,81,77,77,77,81,77,73,73,69,69,69,69,69,73,73,73,77,77,77,77,77,81,81,77,77,77,77,81,81,85,81,89,85,85,85,89,93,130,146,117,130,154,134,150,170,174,170,125,113,134,105,97,105,93,97,97,97,105,134,130,109,130,117,89,77,73,69,69,69,69,73,69,69,65,60,60,60,65,60,65,69,73,77,77,85,89,93,89,85,77,77,73,73,65,65,65,65,69,69,73,73,73,77,85,93,93,101,138,130,146,158,166,162,166,166,162,154,150,134,134,158,174,174,174,174,166,170,170,170,166,162,142,138,134,142,142,142,142,142,146,142,150,134,121,158,170,178,182,178,170,170,166,138,121,138,138,134,134,134,162,158,162,158,170,158,158,117,117,138,138,150,154,146,138,125,125,121,117,117,117,117,121,117,121,138,162,146,162,134,130,138,134,138,162,174,170,166,142,142,150,154,158,154,130,134,134,125,109,125,85,73,105,81,69,85,69,73,89,101,105,109,93,73,65,60,65,65,65,60,60,60,60,60,65,60,65,60,60,60,60,60,65,60,60,65,65,
73,73,89,77,77,73,77,81,89,85,81,73,73,81,81,73,73,69,69,69,69,69,69,73,73,77,77,77,77,77,77,81,77,77,77,77,81,81,81,85,89,85,85,85,85,93,101,130,138,113,138,138,142,158,170,166,158,125,117,125,113,113,109,105,101,101,97,109,134,121,109,130,138,97,77,81,73,69,69,69,69,69,69,60,60,60,60,60,60,69,69,69,77,77,81,89,93,85,85,77,73,73,73,69,69,69,69,73,73,73,73,73,77,81,89,89,89,109,130,138,150,170,158,158,166,162,154,146,150,146,162,170,170,166,166,166,166,162,166,170,174,146,134,125,134,138,138,134,138,134,150,162,121,130,166,182,182,182,178,170,166,154,121,130,134,138,150,130,134,174,170,166,174,178,166,162,113,117,134,142,150,162,150,130,130,125,121,117,125,142,138,134,130,130,125,138,158,154,142,138,134,134,142,170,178,166,162,138,130,134,146,158,162,138,130,134,134,117,125,109,73,73,73,81,85,73,73,89,101,97,73,77,69,65,60,65,60,60,60,60,65,60,60,65,65,60,60,60,65,60,60,60,65,65,69,69,
69,77,77,85,73,77,81,81,81,81,77,73,77,85,73,69,69,69,69,69,69,69,73,73,73,77,77,77,77,77,77,77,81,81,81,81,81,81,81,81,81,85,89,89,89,85,125,138,121,121,158,130,146,162,166,166,146,130,117,138,121,125,121,117,113,101,93,121,138,117,117,134,125,101,77,81,73,69,69,73,73,69,69,65,60,60,60,60,65,65,65,73,77,77,81,89,97,89,85,81,77,73,73,73,69,69,69,73,73,73,73,73,77,81,85,93,93,105,125,130,158,166,162,162,166,158,154,146,158,166,166,166,162,170,170,166,170,162,162,170,166,142,130,125,125,130,134,134,138,125,154,150,121,150,178,182,182,178,174,166,162,146,121,134,134,158,174,166,154,162,166,154,174,170,166,158,117,117,125,134,146,158,146,134,130,125,130,146,150,138,154,150,142,146,146,134,142,138,142,142,138,142,166,174,174,166,158,138,125,130,125,158,162,146,134,134,134,125,117,130,81,73,73,77,73,77,77,97,93,89,69,73,69,65,60,65,69,65,60,60,60,60,60,65,65,65,65,60,65,60,60,60,65,65,69,69,
69,101,97,77,73,73,81,81,77,77,73,73,73,77,73,69,69,69,65,69,69,69,73,73,77,73,77,77,77,77,77,77,81,85,81,81,77,81,81,85,81,85,85,85,89,97,134,150,121,146,158,130,146,162,170,166,150,130,117,121,138,134,134,134,121,101,117,134,138,117,121,130,121,97,77,81,73,69,69,69,73,69,69,65,65,65,65,60,65,69,69,69,77,77,85,89,97,97,85,85,81,77,77,81,73,73,73,73,73,69,73,73,77,81,85,113,130,121,125,138,142,154,166,166,170,162,154,150,154,170,170,166,158,166,170,170,166,170,170,166,150,134,130,121,130,125,125,125,134,125,154,142,146,170,178,178,182,178,174,166,158,146,130,134,138,162,162,146,150,158,174,154,166,170,162,138,117,121,121,125,138,142,138,138,134,134,142,134,154,174,166,174,174,170,138,146,142,154,150,154,138,150,166,174,174,170,154,134,121,142,113,125,158,154,125,134,134,130,121,125,113,97,97,85,73,81,85,97,89,93,56,65,65,60,56,60,65,65,60,60,60,60,65,65,60,65,65,69,65,60,60,60,65,69,69,69,
97,85,73,69,81,73,77,77,77,73,73,69,77,69,69,65,65,65,65,69,69,69,69,73,77,73,73,73,77,77,77,85,81,81,81,81,81,81,81,81,85,85,85,97,89,109,142,138,130,162,162,125,150,170,174,174,150,138,125,113,125,138,138,121,125,117,130,138,134,113,125,125,121,93,73,77,77,69,69,73,69,73,73,69,65,65,65,65,69,69,69,69,73,77,81,89,97,93,93,89,81,77,73,73,77,73,77,73,73,73,69,73,77,77,81,101,93,93,125,138,142,170,158,174,166,166,166,154,154,166,166,158,150,154,166,174,174,170,166,154,142,130,121,113,121,117,113,113,134,130,146,150,170,174,178,178,178,174,170,166,150,138,134,138,142,146,138,134,130,166,158,158,178,166,178,138,138,154,121,125,134,138,138,138,142,146,150,174,170,174,170,166,166,166,158,142,154,158,154,162,154,158,154,154,170,170,158,117,125,150,113,130,142,142,138,134,134,134,125,125,113,77,81,89,77,77,93,97,97,69,60,65,60,60,60,65,65,56,60,60,60,65,65,65,60,65,65,65,65,65,65,60,69,73,73,69,
73,69,69,73,77,73,73,73,73,73,69,73,69,65,69,65,65,65,65,65,65,69,77,77,77,73,73,73,77,77,81,81,85,81,81,77,81,81,81,81,81,85,89,93,101,117,154,134,162,174,154,142,158,162,170,170,170,166,134,121,113,117,113,113,125,138,134,117,121,113,130,125,125,105,77,81,73,69,69,69,73,73,73,73,69,65,65,65,65,69,69,73,73,77,81,89,93,101,93,89,85,85,77,77,81,81,77,101,73,69,69,73,77,77,81,85,89,89,109,113,130,154,158,170,166,166,166,166,166,166,154,150,142,146,158,166,170,166,154,150,142,121,109,113,117,117,130,109,121,130,134,154,162,174,182,170,170,170,166,158,138,125,121,130,154,134,134,134,142,158,162,170,170,178,178,146,154,162,125,125,130,138,142,146,142,146,154,170,174,178,174,174,170,170,166,154,166,158,162,162,150,170,162,154,166,170,166,121,113,121,117,142,146,130,121,134,134,134,130,121,125,77,85,81,77,81,93,101,85,56,60,60,60,56,60,60,65,73,65,60,65,60,60,60,60,60,60,60,65,65,60,77,73,73,65,77,
69,69,73,73,69,73,69,69,69,69,69,69,69,69,65,65,65,65,69,73,73,69,69,73,77,73,73,77,81,81,85,81,77,81,81,81,81,81,85,85,89,89,89,89,101,130,150,130,158,166,158,158,166,166,170,178,170,170,142,121,117,113,113,117,113,113,117,113,113,113,134,125,125,97,81,81,69,69,69,73,73,77,77,73,73,65,69,69,65,69,69,65,73,77,81,85,89,97,97,89,89,85,81,81,77,77,77,89,77,73,69,73,77,77,77,81,93,97,105,109,113,142,150,162,174,174,166,170,166,166,154,142,134,146,154,166,170,166,138,130,125,134,109,117,121,130,138,130,117,117,113,130,150,170,178,170,174,166,158,146,121,113,109,130,138,134,142,146,150,150,170,170,170,174,178,142,138,162,125,125,134,138,146,138,146,170,174,178,178,174,174,174,170,174,166,166,166,166,162,158,154,150,166,154,162,170,166,121,113,113,134,121,138,117,134,134,134,134,134,125,130,109,85,77,81,85,97,109,85,60,65,60,56,60,56,60,60,60,60,69,65,65,60,60,60,60,60,60,65,69,69,77,69,69,77,73,
77,73,69,69,73,69,69,69,69,65,65,65,65,69,65,65,65,65,69,69,73,73,73,69,65,69,77,77,81,77,81,77,77,77,77,77,81,85,85,85,85,85,89,101,113,154,138,134,174,158,158,166,166,166,178,174,170,166,146,121,121,117,113,121,121,117,117,121,117,113,130,130,125,97,93,77,69,69,69,73,73,77,77,77,73,65,69,69,65,65,65,69,73,81,81,85,89,93,101,93,97,89,85,81,81,77,81,97,77,69,69,73,73,77,77,81,81,89,101,105,125,166,162,134,170,178,170,174,170,170,158,138,134,138,146,166,166,158,130,130,138,125,121,125,130,134,125,142,138,121,117,134,138,170,170,178,174,162,150,130,113,109,109,142,134,142,138,150,162,166,170,174,170,182,178,146,125,150,130,130,134,138,154,142,174,170,178,170,166,170,174,170,170,170,174,166,162,166,158,162,154,146,162,158,162,154,158,142,121,125,150,113,113,109,121,134,134,134,134,125,130,121,77,81,81,81,97,113,85,56,60,60,56,52,60,65,60,60,65,77,69,73,65,60,60,60,60,60,65,69,65,69,73,73,65,69,
73,73,69,69,77,69,69,65,65,65,65,69,89,69,69,65,65,65,69,73,73,69,69,69,69,69,69,73,77,81,77,77,77,77,77,81,85,85,85,85,85,85,85,109,117,154,113,146,178,166,162,162,162,166,182,178,174,166,146,125,121,117,113,117,121,117,121,125,121,113,125,130,125,105,93,73,69,69,69,73,73,77,77,77,73,73,73,69,65,65,69,65,69,73,77,81,89,93,97,97,89,89,89,85,81,81,81,97,89,69,69,69,73,77,77,77,77,81,97,97,121,146,162,162,142,170,174,174,174,170,162,138,134,134,142,154,154,166,117,138,125,125,134,138,125,138,134,105,113,134,142,134,134,166,174,174,174,166,142,117,113,113,121,150,134,146,158,162,170,174,146,170,170,174,162,138,125,150,138,130,134,146,146,162,166,174,174,174,170,170,166,166,170,170,166,170,166,162,166,158,158,150,154,166,162,162,170,142,130,121,117,113,113,113,125,134,138,138,134,125,130,130,97,69,85,81,97,113,85,60,65,60,60,69,65,65,60,65,77,89,93,77,65,60,60,60,60,60,65,65,69,77,69,65,73,69,
69,73,69,81,69,69,65,65,65,65,69,77,73,69,69,65,65,65,69,69,69,69,69,65,69,69,69,73,73,73,77,77,81,81,81,81,81,89,85,81,85,85,97,125,121,146,125,146,170,170,154,146,154,162,178,182,170,166,146,130,125,117,113,117,125,117,125,134,130,121,113,134,130,113,89,73,69,69,69,73,73,89,89,77,81,73,69,69,69,69,69,73,81,73,73,85,85,89,93,105,97,93,93,89,85,89,89,89,101,73,69,69,73,77,85,93,93,81,85,93,97,134,154,170,146,162,166,166,174,174,166,150,130,125,134,142,117,130,134,125,117,117,146,162,138,113,93,97,105,117,121,121,125,154,174,174,174,166,130,113,113,134,150,134,134,138,174,174,174,170,142,170,170,142,146,125,125,146,146,154,142,146,150,174,170,174,170,170,174,170,174,170,170,170,170,170,162,166,162,162,154,150,146,170,174,166,166,134,130,113,109,113,113,109,138,134,134,138,134,125,134,146,121,93,69,81,101,113,81,60,65,60,60,65,65,60,69,73,81,85,101,81,65,60,56,56,60,60,65,65,89,69,65,65,65,69,
73,69,77,81,69,69,65,65,69,60,69,73,69,65,65,65,65,65,69,69,69,69,69,65,65,69,69,73,77,77,77,77,77,77,81,81,81,85,85,81,85,89,117,121,138,142,146,158,158,158,130,134,146,162,170,182,170,162,146,134,125,121,117,117,121,121,134,146,134,125,117,117,138,125,85,77,69,69,69,73,73,77,77,77,77,77,77,69,65,69,65,69,69,73,77,81,85,89,89,105,101,93,89,89,89,89,97,101,85,77,69,69,73,73,89,93,101,81,85,85,85,130,134,170,162,166,178,178,174,174,174,150,121,117,121,125,138,134,125,117,109,109,105,113,113,109,105,97,101,105,113,117,121,158,170,174,174,162,125,113,125,162,142,134,134,170,174,178,170,162,154,174,150,130,130,138,130,142,158,158,154,138,166,170,170,166,170,170,174,174,170,170,174,174,170,170,166,162,166,162,150,154,142,162,150,162,166,150,130,113,113,113,109,113,134,138,134,134,130,134,125,138,138,121,105,85,97,125,85,65,65,60,60,60,60,60,65,65,69,73,97,81,65,60,56,56,60,60,65,69,77,65,81,81,81,77,
73,81,85,69,65,65,65,65,69,81,69,69,69,65,65,60,65,65,69,69,69,65,69,69,69,69,69,73,73,77,73,73,77,73,73,77,81,81,81,81,85,89,117,121,150,162,146,166,158,134,134,134,134,154,166,182,174,158,146,138,134,130,117,117,121,130,138,146,146,130,121,113,117,134,93,81,73,69,69,73,73,73,77,81,77,73,81,69,69,69,69,73,77,73,69,73,81,89,89,93,101,101,97,93,93,93,101,101,85,77,69,69,69,73,77,85,85,85,81,81,81,101,142,134,154,170,178,178,182,170,170,150,109,117,121,134,134,134,130,117,105,93,101,109,113,105,97,101,97,97,105,105,105,150,178,170,162,150,125,117,150,146,134,138,166,174,178,174,178,162,170,174,154,138,134,138,138,146,162,158,146,142,166,170,174,170,174,174,170,170,174,174,174,170,166,170,166,166,162,162,154,146,134,150,162,170,178,170,134,117,113,113,109,121,134,134,134,134,134,134,138,134,138,138,142,105,101,121,73,65,69,65,60,60,60,60,60,60,60,69,89,89,77,60,56,60,60,65,65,73,73,81,97,93,97,101,
93,93,97,65,60,65,65,65,65,69,65,69,65,65,65,65,65,65,65,65,69,65,69,69,69,69,73,69,73,73,77,77,73,73,73,77,77,77,81,85,85,97,146,166,178,166,162,158,138,146,130,130,134,150,170,178,170,166,154,142,142,142,121,117,125,134,142,150,166,138,130,117,113,121,105,85,81,77,69,73,69,73,73,73,77,77,69,77,69,65,69,73,89,73,77,77,85,81,85,93,97,105,105,97,93,97,101,93,89,77,73,73,69,73,73,85,89,93,85,81,85,85,105,125,158,162,158,178,178,182,182,158,130,162,158,125,138,134,134,121,101,93,101,105,101,109,101,105,105,105,109,125,113,134,170,166,146,138,130,130,162,138,134,142,174,178,170,174,174,178,170,174,170,150,138,146,146,134,142,146,146,154,166,174,178,174,174,174,178,174,174,174,174,170,170,166,166,166,166,158,154,142,134,142,170,162,162,162,130,117,113,117,117,138,134,134,134,130,125,130,130,142,150,130,142,125,121,105,52,65,69,60,60,56,60,60,60,60,65,69,77,85,77,65,60,60,60,60,65,69,85,93,85,81,89,97,
85,89,97,77,65,65,60,65,65,60,65,65,65,65,65,65,65,65,65,65,65,65,69,69,73,73,69,69,69,73,77,73,73,73,73,77,77,77,81,85,85,113,150,138,170,166,178,150,138,138,130,130,130,138,166,178,178,166,158,142,138,146,134,121,121,134,146,154,166,166,142,125,117,113,125,93,81,81,73,73,73,77,73,73,77,77,77,73,69,69,69,77,77,85,77,85,77,85,89,89,89,101,101,105,101,97,97,93,89,81,73,73,73,69,73,85,105,93,89,89,85,93,113,130,142,138,138,146,162,174,170,158,174,178,170,121,134,130,125,117,93,93,101,93,105,146,134,113,97,109,109,134,121,138,158,162,146,138,134,154,162,130,134,150,158,138,162,166,170,154,150,174,170,162,146,154,154,146,146,142,146,158,166,182,174,178,178,170,170,174,174,170,170,170,166,170,166,166,162,150,154,138,130,138,166,166,166,170,150,117,113,130,125,130,134,134,134,130,138,125,138,134,142,146,142,146,154,113,105,56,65,65,60,60,60,60,60,65,69,73,73,81,81,69,60,60,65,65,69,101,97,81,73,81,89,85,
77,81,81,81,73,65,69,65,60,65,65,65,65,65,65,65,65,65,65,65,69,69,69,69,69,69,69,69,73,73,73,73,73,73,77,77,77,81,81,85,89,134,142,134,150,166,166,150,142,134,138,130,130,130,150,178,178,170,154,142,142,162,142,121,121,130,138,158,158,174,154,138,117,113,130,97,85,81,81,77,73,77,73,73,77,73,73,69,69,69,73,85,73,73,77,77,77,85,85,85,89,93,101,113,105,101,93,93,89,81,85,81,73,69,69,73,89,93,73,77,69,81,113,130,121,117,109,117,146,166,178,178,174,170,158,130,134,121,134,97,85,93,97,85,117,117,117,121,85,105,97,130,121,138,158,154,158,154,146,158,146,130,138,150,158,158,150,166,170,162,170,162,166,174,174,170,166,162,162,162,154,166,178,174,174,162,170,178,174,174,174,174,174,174,170,162,162,150,162,142,138,134,134,134,158,166,174,170,174,121,117,142,134,121,138,134,134,134,130,134,121,125,130,134,130,170,162,117,117,65,65,65,65,65,60,60,65,60,69,73,93,77,77,73,65,65,65,69,69,77,81,69,73,77,85,77,
73,73,73,77,69,69,65,65,60,65,65,60,65,65,65,65,65,65,69,65,65,69,69,69,69,69,69,69,69,73,69,73,73,73,77,77,77,81,81,85,93,134,125,142,150,158,162,154,146,150,146,125,134,134,146,178,174,166,158,146,146,154,154,134,125,130,134,146,162,170,174,142,121,117,134,101,89,81,81,73,73,73,77,73,77,73,73,73,69,69,69,69,69,73,69,73,73,77,85,85,89,93,101,109,105,101,93,89,93,93,89,81,81,73,69,69,81,109,93,93,97,105,121,121,158,146,130,101,113,130,138,154,150,142,138,125,125,121,134,93,89,89,93,113,134,130,130,130,142,150,134,158,130,125,170,166,158,158,158,150,158,138,150,146,113,105,125,162,166,150,162,142,158,162,150,154,158,170,150,166,170,170,170,166,158,162,162,162,174,170,166,170,166,158,146,138,138,142,150,146,138,130,138,146,150,162,178,166,170,121,113,121,117,117,121,134,134,134,125,154,117,109,125,125,130,138,158,154,121,65,73,69,65,65,60,65,60,60,65,69,89,77,73,73,73,69,69,73,73,81,69,69,81,85,85,73,
69,73,73,77,73,73,69,60,60,65,73,69,60,73,65,65,69,65,65,65,69,69,69,69,69,69,69,73,73,69,69,73,77,77,77,77,81,81,85,89,117,134,138,138,146,138,146,138,130,146,134,138,138,142,162,178,182,170,162,154,146,150,154,146,130,125,130,142,150,158,174,158,121,117,134,109,93,85,81,77,73,73,73,69,69,77,73,69,69,69,69,69,69,69,73,73,73,81,81,85,89,89,97,101,121,113,109,105,101,113,117,85,89,85,77,81,81,97,81,73,85,121,134,134,142,174,158,109,93,101,105,101,105,105,138,134,134,142,146,97,93,93,93,146,134,130,130,134,166,170,158,182,162,146,158,162,178,170,146,134,158,138,142,105,105,101,109,146,166,158,134,134,142,142,146,150,162,162,146,162,166,166,150,158,170,170,170,166,158,166,166,166,166,150,138,138,146,150,154,150,150,150,154,162,158,166,178,158,174,125,113,109,121,130,130,134,134,130,130,158,117,105,125,105,117,134,130,162,130,93,56,65,65,65,60,60,60,65,65,65,77,81,73,85,77,77,73,73,69,69,65,69,77,89,77,69,
69,69,73,73,69,73,77,73,60,65,73,73,69,65,73,73,69,65,69,73,69,69,69,73,73,69,69,69,69,69,73,73,73,73,77,77,77,81,85,85,125,121,146,142,134,138,134,138,138,150,138,146,134,142,162,178,182,170,166,158,146,142,142,138,130,125,134,138,142,142,166,170,130,121,121,121,97,93,85,81,77,77,73,85,81,73,73,73,69,69,69,69,69,69,69,69,69,77,77,81,85,93,89,93,105,113,109,121,109,113,97,89,77,69,73,69,73,73,81,69,69,117,134,166,166,166,174,142,113,101,101,101,101,101,113,130,130,138,138,134,105,89,117,146,138,134,125,142,170,170,170,182,166,154,150,170,166,154,138,138,158,142,142,105,101,101,109,146,170,125,125,130,134,138,150,162,154,150,150,162,162,158,162,170,174,174,174,174,174,178,174,154,142,138,138,154,166,162,162,154,146,162,166,166,162,166,174,154,166,125,113,117,134,134,134,134,134,121,146,142,113,121,105,113,101,121,130,150,125,113,65,69,65,65,60,60,65,65,65,65,65,69,77,89,73,69,69,69,73,89,60,65,81,85,73,69,
69,69,65,65,69,69,69,73,69,65,69,73,73,73,69,69,69,65,69,69,65,69,73,73,73,69,69,73,73,73,77,77,77,77,81,81,81,85,89,97,154,125,146,158,138,130,134,150,138,142,142,138,142,134,150,174,182,170,162,158,146,142,138,134,130,130,134,138,146,142,150,170,142,121,117,138,105,97,93,85,77,77,77,73,77,73,69,73,69,73,69,69,69,69,69,73,73,73,73,77,81,77,85,93,105,113,117,121,125,109,93,85,81,77,73,69,69,73,89,77,101,121,138,150,166,174,182,154,134,125,101,101,105,113,121,113,117,109,105,138,109,109,121,162,138,125,134,142,170,174,178,178,178,158,146,158,146,134,134,142,158,170,138,105,105,101,109,138,121,117,125,130,130,138,154,162,142,138,146,166,166,162,170,174,178,178,178,178,178,182,182,174,154,146,146,146,158,158,162,150,154,166,166,158,162,162,174,158,158,150,113,117,125,134,125,134,134,130,154,121,105,101,105,109,93,109,125,142,134,117,65,69,65,65,69,65,65,65,60,65,65,65,69,81,77,69,69,69,65,73,60,65,73,73,69,69,
73,69,69,65,65,69,69,65,65,65,69,69,69,69,69,73,69,73,73,69,69,69,69,73,77,73,65,60,65,65,69,77,69,77,81,81,85,85,89,109,162,134,146,162,146,134,130,154,142,134,138,134,142,146,158,178,178,166,166,158,146,142,138,130,134,134,142,146,146,146,150,166,146,125,113,125,130,101,97,93,81,81,77,73,73,73,73,69,69,73,73,65,65,65,73,81,77,77,73,77,77,81,85,89,105,117,113,109,113,97,89,89,81,73,77,77,69,69,81,81,93,130,146,150,166,174,174,150,121,130,121,109,105,117,142,105,93,89,101,146,117,121,146,154,130,130,134,150,170,178,174,178,178,166,150,146,134,130,134,158,138,146,109,105,105,101,121,117,117,121,130,130,134,134,154,174,166,170,170,158,154,130,154,166,182,182,182,186,182,182,178,178,174,166,166,162,158,162,162,162,166,154,162,174,162,162,170,162,170,166,130,113,117,130,121,125,125,134,138,113,109,101,109,117,121,101,117,130,154,117,69,69,69,65,65,69,65,65,65,65,65,65,69,73,73,73,69,65,60,60,60,73,77,69,69,69,
73,69,65,60,65,65,69,65,65,65,69,69,65,69,69,69,69,69,73,73,73,73,77,81,81,77,81,81,81,85,81,85,93,85,85,81,81,85,97,130,166,150,150,158,154,142,138,162,146,125,130,134,138,150,166,182,178,174,170,158,150,146,138,134,134,138,142,146,150,150,154,162,158,134,125,121,134,134,134,121,97,81,77,77,77,77,73,69,73,73,69,77,73,81,85,81,77,77,73,77,77,77,81,85,97,109,113,109,109,101,93,81,81,77,73,77,73,77,73,73,85,130,158,170,170,166,170,174,134,109,125,105,101,117,146,109,93,97,130,158,121,125,162,162,134,125,130,134,138,158,166,166,170,170,170,154,142,138,134,138,154,130,130,109,105,105,125,130,117,121,125,130,134,138,158,170,150,158,166,174,150,146,134,125,166,182,182,182,182,178,178,178,178,174,170,170,158,158,162,174,170,162,166,166,178,174,170,166,158,170,154,146,150,125,134,138,134,158,162,130,105,97,97,121,117,105,105,130,146,121,73,69,73,65,69,65,65,65,65,65,69,65,65,69,73,65,65,65,73,60,65,81,73,65,65,69,
69,65,65,60,65,65,65,65,65,73,69,69,69,69,69,69,69,73,73,73,77,77,73,77,77,77,81,77,81,81,85,85,85,89,89,97,97,101,97,130,162,162,146,154,154,134,138,166,150,138,130,130,134,138,162,178,182,174,166,158,158,150,142,138,138,138,138,142,142,146,150,162,162,150,150,125,121,134,138,138,125,89,81,77,77,77,73,73,73,73,73,73,89,93,89,81,77,77,77,77,77,77,81,89,93,105,109,109,105,97,89,89,89,81,73,69,77,73,73,73,81,121,162,174,174,174,178,166,142,117,101,105,101,113,142,113,101,121,154,142,138,125,158,162,138,138,130,121,130,134,158,170,166,166,150,150,150,158,134,150,158,138,154,105,105,101,105,130,121,117,121,125,130,146,146,142,142,158,146,154,134,146,150,146,150,174,182,186,182,174,154,166,174,174,170,146,130,150,166,186,178,174,178,162,170,166,146,146,154,162,162,162,166,146,113,125,162,162,166,158,109,93,93,93,93,93,89,121,130,113,69,73,69,69,69,69,65,65,65,65,65,65,65,65,73,65,65,65,73,89,73,73,65,65,65,69,
65,65,65,65,60,65,65,65,65,69,69,73,69,69,73,77,69,73,73,73,73,73,73,73,77,77,77,77,81,85,85,89,85,89,93,97,97,97,97,130,174,162,150,146,146,142,138,150,142,125,125,125,130,150,166,174,182,174,166,158,158,150,146,142,142,138,138,146,138,134,142,162,170,162,162,138,130,117,134,134,138,105,93,85,77,77,73,73,77,73,73,81,89,93,81,77,77,77,73,77,77,81,81,85,89,101,109,105,101,97,89,85,89,93,73,69,69,69,69,81,97,117,166,170,174,174,174,154,150,150,117,105,101,105,134,117,121,150,150,138,121,125,166,158,162,166,138,138,134,125,130,166,166,142,125,117,113,130,158,162,150,142,125,105,105,105,125,134,113,117,121,125,125,138,138,142,146,166,134,138,142,134,146,162,142,134,146,154,162,174,166,174,178,178,182,158,134,154,174,186,182,174,174,178,162,158,162,158,158,158,158,166,170,162,130,113,150,170,174,170,117,93,93,89,93,89,101,125,130,121,101,48,73,69,69,69,69,65,65,65,65,65,65,65,73,73,65,65,69,81,69,73,65,65,60,65,
65,56,60,65,65,65,65,69,65,69,65,69,69,69,73,73,69,69,73,73,73,73,73,77,77,77,77,81,81,85,85,89,89,89,93,97,97,101,101,142,166,154,150,154,158,162,170,158,138,134,130,134,138,154,170,178,178,174,166,162,162,154,150,146,146,138,134,142,142,134,134,142,162,154,166,146,146,121,134,134,134,130,109,97,85,77,77,77,81,77,81,93,89,89,81,77,77,77,73,77,81,85,81,85,89,97,105,105,101,93,89,89,85,85,85,73,73,73,73,93,105,125,170,170,174,178,170,162,154,158,125,105,105,105,146,125,138,162,138,134,125,150,162,174,174,162,146,134,121,109,109,113,121,117,113,113,109,117,142,146,150,158,105,105,105,117,121,130,121,121,117,121,125,150,142,134,138,162,178,162,166,162,142,142,154,162,146,138,138,130,150,146,170,158,166,158,158,162,170,174,170,170,158,174,182,174,178,178,178,170,162,158,174,166,146,121,142,158,170,174,142,113,101,89,89,89,89,134,125,138,117,85,48,77,77,73,73,69,65,69,69,65,65,69,73,73,69,69,69,85,69,69,65,60,65,65,
65,69,65,60,65,73,69,60,69,65,65,65,69,69,69,69,69,69,73,69,73,73,77,77,81,81,81,81,85,85,89,89,89,89,93,93,97,101,101,130,166,150,158,162,170,170,146,150,142,130,142,142,146,162,174,186,178,170,162,166,162,158,154,150,146,138,138,142,138,134,150,130,130,130,154,142,154,121,138,134,130,134,134,134,113,89,85,85,81,77,85,117,130,101,85,73,77,73,77,77,85,85,89,89,89,97,101,109,101,93,93,93,93,85,85,81,77,69,69,109,101,134,154,162,162,158,154,150,150,150,130,125,113,97,117,134,150,150,134,134,146,174,178,158,158,142,142,138,121,105,109,109,109,109,109,109,117,134,154,166,146,121,105,105,105,125,121,138,130,121,117,117,121,134,134,134,138,170,166,170,166,170,182,174,162,154,162,146,138,150,146,134,146,150,138,166,166,170,178,146,146,146,150,158,178,182,178,182,182,178,166,166,170,158,142,130,134,150,166,170,154,138,146,134,89,89,89,121,134,158,130,117,81,44,77,77,69,69,69,69,69,69,65,65,65,69,73,73,73,77,69,65,60,65,60,60,
65,69,65,65,65,65,69,69,65,65,65,69,69,69,69,69,73,69,69,69,73,73,73,73,77,81,81,81,85,85,85,89,89,93,93,93,97,101,101,130,150,166,166,154,170,154,130,134,142,134,142,150,158,162,166,174,166,166,162,166,158,154,154,150,146,138,138,150,138,134,154,138,125,121,158,154,154,142,121,134,134,113,134,134,134,134,101,85,85,85,113,134,134,101,85,81,81,77,77,69,85,89,89,89,89,93,101,105,101,97,93,97,93,85,77,93,81,81,81,73,81,125,150,146,138,125,125,117,130,150,154,134,154,130,113,142,154,138,130,150,174,174,158,154,125,121,121,130,130,125,113,109,109,105,109,113,166,174,170,138,113,101,105,105,113,130,134,130,130,121,117,117,121,125,130,130,162,154,158,162,170,178,170,162,158,162,150,150,178,178,174,178,178,150,174,162,170,166,158,162,166,158,162,162,174,178,182,178,178,174,174,170,170,158,138,130,134,138,158,166,166,138,150,166,113,89,93,113,134,154,138,134,130,77,56,77,73,69,65,65,65,69,65,65,65,65,73,69,69,73,69,73,65,65,65,65,
69,65,65,65,69,60,65,69,65,65,69,69,69,69,73,69,69,69,73,73,69,69,73,73,77,77,81,85,85,85,85,89,89,93,93,101,101,101,101,134,142,174,174,158,166,146,134,138,130,130,150,154,170,170,178,174,166,166,166,162,150,146,146,154,154,138,134,154,142,134,142,142,146,130,130,142,154,162,125,117,134,125,117,130,134,134,134,121,93,109,134,134,134,105,85,85,77,77,77,85,89,85,89,93,89,93,101,105,101,97,97,97,93,85,77,77,81,69,73,77,73,89,81,81,85,93,125,113,125,154,174,158,146,154,154,138,117,134,142,170,154,142,125,146,134,138,125,113,121,138,121,125,125,113,109,125,142,158,154,125,105,105,105,105,109,101,121,121,130,125,113,117,117,121,125,134,134,142,150,154,166,162,166,178,138,142,158,158,158,158,166,166,170,162,150,150,158,138,130,146,150,170,170,170,174,178,182,182,170,170,182,178,178,166,138,125,134,130,142,162,162,142,130,154,146,105,109,125,130,142,125,125,134,121,52,48,77,73,69,65,65,65,65,65,65,65,65,69,81,73,65,65,60,65,65,65,
65,65,65,65,65,69,65,60,69,73,69,69,73,73,73,69,73,69,73,69,73,73,73,73,77,77,81,81,85,85,85,85,85,89,93,101,101,101,101,130,134,170,170,174,166,150,138,130,146,146,166,174,178,182,182,174,166,166,166,154,158,150,150,162,166,142,134,142,138,134,134,150,158,138,121,117,138,166,150,125,117,130,125,121,121,134,134,130,134,134,134,134,134,117,89,85,77,77,81,89,85,81,85,85,89,93,97,105,105,97,97,93,89,85,81,81,85,81,89,81,85,77,77,77,77,89,134,117,134,166,174,162,154,142,125,121,117,134,158,134,134,121,121,146,166,166,162,117,113,138,138,121,121,121,125,113,121,138,138,125,101,101,105,105,101,101,105,117,121,121,117,117,117,121,125,125,134,142,154,166,158,158,158,162,174,158,150,146,150,158,170,178,166,170,142,134,130,142,150,154,146,162,162,166,174,178,178,182,178,166,178,178,178,178,146,125,125,130,138,150,158,138,121,146,170,134,109,125,125,134,130,101,121,134,121,60,48,77,73,73,77,69,65,65,56,60,60,65,65,65,65,60,65,65,65,65,
69,65,65,65,65,60,69,65,65,69,69,73,73,73,73,73,73,73,73,73,73,73,73,77,77,77,81,81,85,85,85,85,85,89,97,105,101,101,105,130,138,162,158,150,174,174,146,138,146,146,170,182,178,182,182,174,166,170,162,154,162,158,154,166,170,158,138,134,138,138,138,150,150,138,146,138,121,154,162,134,130,121,125,130,130,130,134,130,134,134,134,134,138,134,109,93,73,73,77,81,81,81,85,85,85,93,97,101,101,97,97,93,85,77,81,81,81,77,77,77,77,77,77,77,73,125,138,117,138,166,158,154,162,142,150,150,138,130,162,134,130,125,121,134,158,158,170,134,121,121,134,125,113,138,138,109,117,117,117,121,101,97,101,101,105,101,101,109,121,130,117,117,117,125,125,130,142,150,162,166,158,154,154,158,166,170,170,170,162,158,170,178,158,138,134,162,138,130,134,130,125,146,154,158,166,170,178,182,182,178,182,186,178,174,162,130,125,125,130,134,138,142,121,125,166,158,109,121,134,134,117,93,93,113,134,121,60,56,77,73,73,69,65,65,65,60,65,56,93,65,69,60,65,65,65,60,
69,65,69,69,65,69,69,69,65,69,69,73,77,73,73,73,73,69,69,73,69,73,73,77,77,77,81,81,85,85,85,85,89,89,101,105,101,101,105,125,130,166,158,154,166,166,158,146,154,150,170,182,182,178,178,174,166,170,158,154,166,162,154,146,150,150,138,138,158,162,154,150,154,154,154,166,138,138,158,138,150,117,130,134,138,138,130,134,130,134,134,134,134,134,125,130,109,85,81,81,81,81,81,81,85,89,93,97,105,101,97,85,81,77,81,81,81,77,81,81,77,77,77,73,109,134,125,121,125,138,146,142,174,174,158,138,142,154,166,142,134,125,121,134,166,158,170,138,125,117,117,113,113,117,130,121,117,117,121,121,101,97,97,101,105,101,101,117,121,130,125,117,117,125,130,146,146,158,166,166,162,158,158,158,162,158,154,150,138,166,170,170,130,138,146,150,134,125,125,130,134,142,154,158,162,166,170,174,178,178,174,178,182,174,166,134,125,130,134,154,130,125,121,130,158,174,130,117,134,125,105,93,93,93,97,113,101,52,73,73,77,69,69,65,65,60,60,60,73,60,60,60,65,65,69,65,
69,65,65,69,69,69,69,69,69,69,69,73,73,77,73,73,77,73,73,73,73,73,73,77,77,77,81,81,85,85,85,85,89,93,97,101,101,101,105,130,138,154,166,166,174,170,170,138,170,178,178,178,178,174,174,170,170,170,158,154,166,162,166,146,138,138,138,146,166,166,158,146,154,162,162,166,158,166,146,146,154,121,138,138,134,130,134,130,130,125,130,134,134,134,125,134,134,97,81,77,81,81,81,81,85,89,93,93,101,101,93,93,81,81,81,81,77,77,77,73,73,81,77,105,134,130,117,117,121,125,142,154,158,166,166,170,174,162,174,158,134,130,121,125,142,166,166,130,130,125,117,117,117,121,125,121,117,113,117,117,105,97,97,97,97,101,105,121,130,138,134,125,117,121,138,158,154,154,170,174,170,166,166,170,162,170,170,178,174,178,158,138,134,154,162,150,138,130,134,134,150,162,170,162,150,154,170,182,182,178,174,170,178,174,166,138,130,138,142,158,142,117,117,125,146,178,150,121,125,134,109,93,89,93,93,97,121,89,60,77,73,73,69,65,65,60,60,56,89,60,60,65,60,65,65,69,
65,69,69,65,65,69,69,69,73,73,73,73,73,73,73,73,73,73,73,73,77,81,77,77,81,81,81,81,85,85,85,85,89,97,101,97,105,101,113,138,142,150,158,166,170,162,170,150,182,178,182,174,170,174,170,170,170,170,158,150,158,162,162,166,142,138,138,158,162,158,154,146,154,158,166,162,154,154,138,142,146,134,134,138,134,134,142,146,138,125,134,134,134,138,134,130,130,93,77,77,77,81,81,85,85,89,97,97,105,97,89,81,81,81,81,81,77,77,81,81,85,97,125,134,130,125,117,125,130,125,130,146,158,158,170,166,170,166,158,146,130,142,138,125,146,178,146,134,134,130,130,125,121,125,130,134,125,121,117,117,105,105,97,97,101,101,113,125,134,142,138,125,121,125,142,166,162,158,170,174,174,174,174,170,174,178,170,162,166,154,138,134,138,162,170,146,125,138,134,130,146,158,174,162,138,146,170,178,174,174,166,170,174,178,174,150,138,142,154,162,154,134,117,113,125,166,170,130,125,130,130,113,101,93,89,93,109,113,60,73,73,69,69,65,65,65,60,65,77,56,65,69,73,65,65,65,
69,69,65,69,65,69,69,73,69,73,73,77,73,73,77,73,73,77,73,73,77,77,81,77,81,81,85,81,85,89,85,85,89,97,97,101,101,105,130,146,125,158,154,166,166,158,154,162,182,178,178,178,182,174,170,170,170,170,150,150,154,158,162,170,166,146,150,158,150,146,146,150,150,154,162,166,138,158,146,138,150,158,130,125,130,134,138,146,130,121,134,134,130,113,105,121,117,89,81,81,77,81,81,81,85,89,89,101,101,93,89,85,85,85,81,81,77,77,81,105,117,134,134,134,134,134,138,125,134,121,130,134,146,142,154,170,162,170,170,150,146,166,166,146,174,154,146,146,142,134,134,125,121,125,125,125,125,125,121,117,109,109,105,101,101,105,117,130,142,150,138,130,121,125,142,166,170,166,170,170,178,182,178,178,174,174,170,166,158,138,134,134,142,154,174,142,134,130,130,142,158,162,174,178,154,150,162,178,182,174,174,166,174,178,178,166,146,150,158,158,138,146,130,117,113,158,174,146,130,134,130,125,117,117,113,97,93,125,109,44,69,69,69,65,60,65,60,81,77,65,77,69,73,65,65,65,
77,81,73,73,73,73,73,69,69,73,73,77,77,73,77,73,73,77,77,77,77,77,77,81,81,81,85,85,85,89,89,89,93,97,101,105,101,121,154,138,146,158,162,162,150,146,146,182,182,182,182,178,178,174,170,170,166,162,146,146,154,158,166,170,158,158,154,150,142,138,142,150,146,150,154,162,150,158,158,138,134,134,125,125,134,134,138,142,130,130,134,134,125,109,101,97,97,85,81,81,85,81,85,85,85,89,97,97,101,89,89,85,85,85,81,77,77,77,97,125,134,134,134,134,134,134,130,134,121,125,121,138,146,146,146,154,166,166,162,166,154,170,166,158,150,150,150,150,142,134,125,121,125,130,125,130,130,125,125,121,113,113,109,105,105,109,121,134,146,154,146,138,125,125,134,158,170,162,166,170,174,174,178,166,162,162,170,170,158,134,138,134,134,154,162,158,138,125,130,146,158,162,174,178,174,162,150,166,178,174,170,170,170,174,178,166,154,158,146,130,134,166,162,146,113,125,174,146,130,134,130,130,117,121,121,117,109,117,125,81,48,69,65,69,65,65,65,81,69,65,73,73,77,73,77,77,
65,65,65,81,85,73,73,73,73,69,73,77,77,77,77,77,77,77,77,77,73,77,81,81,85,85,85,89,89,89,89,93,93,93,97,105,105,138,154,142,146,158,170,166,154,146,150,182,174,174,174,178,174,170,170,170,170,154,146,142,154,158,158,162,158,150,146,134,130,125,130,138,138,146,158,162,162,166,166,162,142,130,130,125,121,125,134,134,130,134,130,134,125,109,101,97,85,81,81,81,85,85,89,85,89,93,97,97,97,89,89,85,85,85,85,77,77,77,97,113,134,138,134,134,125,134,134,134,138,121,121,142,158,146,142,154,166,162,146,154,150,146,142,138,138,138,138,138,138,125,125,125,125,130,130,130,125,125,125,130,117,117,113,113,113,117,130,134,146,150,146,142,134,125,130,150,154,154,158,166,166,170,162,150,142,150,158,162,150,154,142,130,138,170,178,166,138,138,125,138,154,158,174,174,174,178,166,166,178,174,170,174,170,170,178,170,158,162,142,134,142,158,166,162,154,121,162,158,121,146,134,130,121,121,121,121,117,113,130,121,69,60,73,69,65,65,73,89,77,81,77,73,77,81,73,65,
69,69,69,56,56,52,60,81,73,73,77,77,77,77,77,77,77,77,77,73,73,77,81,81,81,85,93,89,89,93,89,89,93,97,101,105,130,138,150,138,142,166,170,154,146,142,158,186,174,174,174,174,166,166,170,166,166,150,146,142,158,162,162,158,158,150,138,130,125,125,117,117,134,146,154,162,166,170,170,162,162,166,158,150,142,130,130,134,125,134,130,134,121,105,105,93,85,81,81,81,85,85,81,85,89,89,93,101,89,85,89,89,93,89,85,77,81,101,105,109,130,134,134,134,138,130,117,121,117,125,109,113,125,146,150,150,142,146,150,146,130,142,142,138,138,134,134,134,134,125,125,130,130,134,134,130,125,125,125,130,125,117,117,117,113,117,125,130,146,150,150,146,142,134,138,146,150,154,158,166,166,158,142,134,138,146,166,166,162,154,142,138,166,158,154,170,162,142,138,134,138,142,162,170,178,178,178,174,182,174,174,182,170,178,178,174,166,162,142,134,146,166,166,170,162,125,154,146,130,142,130,130,121,117,117,117,121,121,130,134,113,60,69,65,65,69,77,89,77,81,77,85,65,52,56,60,
130,125,117,89,81,73,65,48,65,81,77,77,81,77,77,77,77,77,81,77,77,77,77,81,85,89,89,89,89,93,93,93,93,101,101,125,134,150,150,162,174,182,162,154,142,138,174,178,178,174,170,170,170,166,170,170,162,146,142,142,154,158,162,158,154,146,134,130,121,117,117,134,121,142,150,162,166,170,166,166,170,170,166,162,154,150,134,134,134,130,130,134,121,97,93,85,85,85,81,89,89,89,93,93,93,93,105,97,93,89,89,93,101,85,81,77,77,117,121,121,134,125,134,134,125,130,121,121,121,138,134,109,113,125,142,142,125,121,125,125,125,130,130,130,134,134,130,130,130,125,125,130,134,138,138,134,130,130,130,134,130,121,121,121,121,121,125,130,146,154,150,150,142,134,142,146,150,150,158,154,146,138,130,125,134,138,146,166,174,174,166,142,142,162,170,162,154,142,130,134,154,174,170,182,174,182,174,178,174,174,174,178,178,174,178,182,174,154,142,134,142,170,166,174,142,130,150,121,125,121,130,121,117,117,121,121,125,125,125,138,125,85,60,65,65,73,89,97,85,85,69,48,85,81,109,117,
113,101,113,134,138,138,113,93,69,56,65,81,81,81,77,77,81,81,77,81,81,85,93,85,85,89,89,89,89,93,93,93,97,101,113,134,130,150,162,166,174,174,150,142,138,158,182,178,174,174,174,170,170,166,170,166,150,142,142,142,154,154,154,154,150,138,134,130,121,113,138,138,125,142,150,162,170,174,170,170,170,170,170,162,154,158,158,146,125,134,134,134,101,93,89,85,85,85,89,97,93,93,93,89,85,97,93,93,89,93,89,93,89,85,81,81,93,125,125,130,134,121,121,130,134,142,125,117,113,134,138,113,109,117,121,121,117,117,117,117,121,121,121,125,130,134,125,125,125,125,125,130,134,138,138,134,130,130,130,134,138,130,121,121,125,125,138,138,158,158,154,146,138,134,134,146,158,158,154,142,130,125,125,125,130,138,138,134,142,154,166,174,170,162,162,166,170,150,138,134,174,170,170,166,178,170,174,182,178,178,174,170,174,170,178,174,166,150,146,142,142,154,174,166,142,138,150,130,125,121,130,117,117,121,121,121,125,130,130,130,142,89,56,69,69,77,89,89,81,56,69,109,130,130,130,134,
109,93,89,93,109,121,134,138,113,89,65,56,65,81,85,81,81,81,81,77,85,85,85,85,85,85,89,89,93,93,93,93,101,109,134,134,142,166,174,174,178,174,146,142,158,182,182,174,170,170,170,170,170,166,162,158,146,142,142,146,150,150,150,146,142,134,130,125,121,121,125,130,121,138,150,158,166,166,170,170,170,170,166,158,146,146,154,134,130,130,134,113,97,89,85,85,85,89,85,85,85,89,93,97,101,97,93,93,89,89,93,89,85,97,97,85,93,125,130,134,134,125,121,130,130,134,125,113,130,134,138,130,109,109,113,117,117,117,113,121,121,121,130,125,130,130,130,130,125,130,130,134,134,138,138,138,130,130,134,138,138,142,125,117,121,130,138,142,162,166,158,142,134,134,134,138,154,154,146,130,121,121,125,125,125,130,138,134,142,150,166,174,166,166,174,166,158,142,142,162,170,166,174,178,170,174,166,174,182,178,174,174,170,170,170,166,158,150,146,150,150,162,174,170,154,142,130,121,130,117,130,117,117,121,117,121,125,130,134,134,146,121,89,56,77,97,81,73,60,109,125,113,89,85,89,109,
113,89,89,89,93,97,105,113,138,138,125,101,77,56,52,69,81,85,81,77,77,77,85,85,85,97,85,89,89,93,93,101,97,125,134,142,154,178,178,178,174,174,150,154,178,178,174,174,170,170,170,170,166,166,150,150,146,142,142,142,142,142,146,138,134,130,125,125,121,121,134,134,121,134,150,154,162,166,166,170,170,170,166,166,146,138,146,130,134,134,134,105,93,89,89,89,89,89,93,89,97,101,105,105,101,97,97,93,89,89,89,89,89,105,101,105,97,113,142,138,134,117,121,130,134,134,130,113,134,134,138,138,138,130,117,113,113,113,121,121,130,117,130,130,130,130,134,138,130,130,134,134,134,134,138,138,130,130,134,134,138,138,125,121,125,134,142,138,158,166,158,142,134,130,130,134,134,134,130,121,121,121,125,125,130,130,134,134,142,154,158,174,166,154,162,162,146,154,174,174,166,166,178,174,170,170,162,162,174,178,178,174,174,170,166,162,162,154,158,162,166,170,154,170,158,130,134,130,138,134,125,113,117,113,121,125,130,134,130,154,170,146,93,60,93,89,73,65,109,97,85,85,85,85,89,101,
97,89,89,89,89,93,105,109,113,121,134,134,134,130,113,89,60,65,81,77,85,105,97,85,85,89,89,89,93,93,97,101,105,134,130,146,166,162,178,174,174,162,170,178,178,182,170,174,170,170,170,170,170,170,154,150,146,142,138,138,138,138,138,134,130,125,121,117,117,125,138,117,125,142,150,158,162,170,166,170,170,170,170,154,142,142,125,134,130,134,117,101,93,89,89,93,89,93,93,93,101,97,105,109,101,101,97,97,97,97,97,89,93,109,117,101,105,101,101,117,138,134,125,121,130,130,142,134,134,138,138,138,138,138,113,130,134,125,138,134,121,134,113,121,125,125,134,134,134,134,134,138,138,134,138,134,125,125,130,134,134,134,121,125,130,142,138,130,142,170,158,142,134,130,130,130,130,125,125,121,121,121,125,125,125,134,134,138,150,142,162,174,162,162,174,174,178,182,178,166,166,170,174,174,178,162,158,166,170,174,178,178,178,174,174,174,174,174,158,154,162,166,162,142,142,134,134,138,130,130,125,113,117,121,121,134,130,130,125,158,158,162,125,89,69,77,81,109,93,89,85,89,93,85,89,125,
89,89,89,89,93,93,101,101,113,138,134,138,130,134,134,134,121,89,69,89,93,85,85,85,85,89,89,89,97,97,97,101,121,134,134,146,170,166,174,174,170,174,182,174,170,178,174,170,170,174,170,170,166,162,158,154,150,146,138,138,134,130,130,125,125,121,117,121,125,134,138,138,130,134,150,158,166,166,166,166,170,170,162,162,134,130,134,138,138,134,113,101,93,89,93,93,93,93,93,97,101,105,109,105,101,101,101,97,97,93,101,97,93,105,117,121,101,101,101,101,121,138,130,134,130,134,134,134,134,138,138,138,138,138,117,121,121,134,134,134,138,134,138,113,121,121,130,130,130,130,134,138,138,134,134,130,125,125,130,130,130,130,125,125,130,134,130,125,142,158,166,142,134,130,125,130,130,125,125,125,125,121,125,125,125,130,130,134,138,138,162,170,162,158,166,166,166,170,166,166,166,166,174,174,174,170,154,154,162,162,174,174,174,174,174,170,170,170,162,166,166,170,166,162,142,134,134,134,134,130,121,121,125,125,130,130,130,130,125,158,158,142,170,101,69,77,138,97,89,89,89,89,89,113,121,101,
89,89,89,93,93,89,89,105,134,134,138,138,138,134,134,134,134,130,109,65,73,81,85,85,85,89,89,93,93,97,101,109,138,138,146,158,162,166,158,170,170,174,174,170,166,170,170,170,174,166,166,166,166,166,162,150,146,146,138,138,134,121,125,130,121,117,134,138,138,138,138,125,134,134,142,150,162,162,162,150,162,166,162,150,130,134,130,125,105,101,97,93,89,93,97,97,93,93,97,97,101,101,109,109,105,101,97,101,101,93,101,109,113,113,117,125,130,109,101,101,105,130,134,130,130,134,134,134,138,134,134,138,138,130,113,130,121,117,130,134,138,134,138,117,125,121,130,130,130,130,134,142,138,138,134,130,125,125,125,125,125,125,125,125,125,125,125,130,146,146,162,138,130,125,125,125,125,125,125,121,121,125,125,125,125,130,130,125,134,142,142,146,154,158,158,150,154,154,158,166,166,166,170,174,166,166,158,166,158,162,170,154,162,166,170,170,178,178,174,178,170,174,170,178,170,138,134,134,134,125,125,134,130,134,134,130,130,130,125,138,174,138,154,109,85,105,89,85,85,93,89,89,89,89,89,89,
89,89,89,93,93,113,130,134,134,134,138,138,138,138,134,130,134,138,134,125,77,65,85,89,93,89,97,89,93,97,105,117,134,130,162,162,166,150,146,162,166,178,174,174,170,170,174,166,166,166,170,170,170,170,158,154,150,146,146,138,130,117,113,117,113,134,134,134,134,134,138,130,134,134,142,146,150,154,150,142,154,158,166,150,130,130,134,113,101,97,93,93,93,89,93,93,93,93,93,97,101,105,109,109,109,105,101,97,101,97,97,105,113,117,117,125,130,130,105,101,109,125,134,134,150,142,134,134,134,134,134,138,138,134,109,125,138,125,125,121,138,138,134,117,117,117,125,125,125,125,134,142,138,130,130,134,130,125,125,121,121,125,130,130,125,130,130,130,142,146,158,138,130,125,121,121,121,121,121,121,121,121,125,125,130,125,125,121,130,130,134,138,142,150,142,150,146,146,158,166,162,166,170,170,166,178,170,162,158,162,158,154,158,166,170,178,174,178,166,170,174,174,178,174,166,174,130,130,130,130,130,130,134,134,134,130,130,130,130,117,158,166,134,134,105,89,89,85,89,101,85,89,89,89,89,89,
89,89,93,89,121,134,134,134,134,138,138,138,138,138,138,134,130,138,134,134,125,93,73,85,89,89,89,93,93,97,101,134,142,150,162,158,154,154,158,146,170,178,178,178,170,174,166,174,158,166,170,170,170,170,162,158,154,150,146,138,130,117,130,130,138,134,138,134,134,134,134,134,134,134,138,146,150,146,138,134,142,158,170,146,138,134,117,105,101,97,93,93,93,93,93,89,93,93,97,97,97,105,109,113,109,105,105,101,97,101,101,97,105,117,117,117,121,130,125,109,113,125,130,134,146,150,125,134,134,138,134,134,138,138,134,125,125,134,142,125,134,130,134,121,130,121,125,121,121,121,125,138,134,130,130,130,125,125,125,125,125,125,130,125,125,134,130,134,134,146,154,138,125,121,121,117,117,121,121,121,121,125,125,125,125,125,121,117,125,125,130,134,134,142,138,138,146,146,154,162,166,162,166,170,162,170,178,178,178,174,174,158,170,166,174,182,174,174,178,174,170,170,174,174,162,178,158,134,134,134,130,134,134,134,130,130,130,125,130,130,134,154,146,125,101,93,85,89,105,113,93,89,89,89,89,89,
89,89,89,97,130,134,134,134,134,138,138,134,138,138,134,138,113,138,138,138,134,125,101,73,89,89,89,93,93,101,121,142,142,162,162,166,158,150,154,146,178,170,174,174,158,162,154,162,154,154,170,170,166,170,162,158,158,150,146,138,125,113,134,138,134,134,134,134,134,134,134,134,134,125,134,142,138,142,134,121,130,154,166,142,134,130,109,101,97,93,93,93,93,93,97,101,93,93,93,97,97,101,101,109,117,109,105,105,101,101,101,97,97,113,121,121,121,130,134,113,109,130,134,125,138,134,138,134,134,134,138,134,138,134,130,138,121,134,134,121,138,134,134,134,134,121,121,117,121,117,117,130,130,130,130,125,125,130,130,125,125,130,125,130,134,134,134,130,130,146,150,130,125,121,117,117,117,117,121,121,121,125,125,125,121,121,121,121,121,125,130,130,130,130,134,142,154,150,146,154,154,166,166,166,162,158,170,174,166,170,174,170,178,178,178,174,178,178,178,182,170,174,170,166,162,166,178,154,134,134,134,134,134,134,134,134,134,130,130,130,125,138,150,130,109,93,89,89,101,117,93,89,89,89,89,89,
93,101,113,125,134,134,134,134,138,134,138,138,134,130,130,121,121,150,146,138,134,138,121,89,81,89,93,89,117,138,146,146,154,162,170,162,166,166,150,174,166,162,166,162,158,158,154,146,142,142,154,162,158,162,166,162,154,150,146,134,117,125,134,138,134,134,134,138,134,134,134,134,113,125,130,134,134,134,125,125,134,142,166,142,134,125,105,97,97,93,93,93,93,93,97,105,109,101,97,97,97,97,97,105,113,113,113,109,109,101,101,101,97,101,125,125,121,125,117,113,109,125,138,134,138,130,134,134,134,134,134,134,146,158,130,134,121,117,121,117,125,134,134,134,121,113,121,113,117,117,113,125,134,130,125,125,130,130,134,130,130,130,130,130,134,138,138,130,134,158,142,125,121,121,117,117,117,121,121,121,121,121,121,121,121,117,117,121,121,125,130,130,130,134,158,158,150,146,146,150,146,154,170,166,166,166,162,162,174,174,170,170,162,162,162,174,170,174,166,162,158,154,162,162,166,174,170,166,134,130,130,134,134,134,134,134,130,138,125,130,134,130,166,130,113,85,81,89,105,121,97,89,89,89,89,89,
93,130,134,134,134,138,138,138,138,142,138,138,138,134,138,121,121,134,134,134,138,130,134,121,101,97,97,130,130,142,162,150,166,170,170,158,182,178,170,166,166,170,170,170,158,174,178,150,142,146,146,154,158,158,166,162,154,150,142,130,121,134,134,134,134,134,134,134,134,134,134,134,130,117,125,130,134,134,121,134,130,142,154,138,134,117,101,97,97,93,93,93,93,93,97,105,109,109,101,97,97,97,101,105,105,117,117,109,105,105,105,101,101,101,105,125,125,121,121,113,117,117,121,134,134,134,134,138,134,134,134,130,158,174,146,121,130,121,125,117,113,130,134,134,138,125,121,125,113,117,113,117,130,130,130,130,125,130,130,134,134,134,134,134,134,134,134,130,130,158,142,121,121,121,117,117,113,117,121,121,121,121,121,121,117,117,121,125,125,130,130,125,130,150,162,162,162,158,154,150,154,158,166,166,162,166,162,154,166,178,178,170,158,158,158,166,170,166,166,166,158,146,150,158,158,170,170,170,158,121,130,134,125,130,134,130,146,125,134,130,130,134,154,150,134,125,109,89,105,121,97,89,89,89,89,89,
109,134,138,138,134,134,138,138,138,121,130,109,113,134,170,138,134,142,158,134,138,162,138,134,134,125,130,134,130,150,170,162,170,174,166,170,170,174,178,166,158,166,166,166,162,146,150,146,142,150,162,170,170,166,162,158,154,150,142,130,121,134,138,134,134,134,134,134,134,134,134,134,134,117,130,138,138,134,130,134,134,134,138,134,134,113,101,101,97,97,97,93,97,93,105,134,138,125,109,105,101,97,97,101,105,109,117,117,113,105,105,105,101,101,101,101,109,113,121,121,117,113,125,125,134,134,134,130,134,134,134,130,158,170,166,142,142,142,142,121,113,130,130,130,117,121,134,138,130,117,113,113,130,134,130,125,130,134,130,130,130,130,130,134,134,134,130,130,130,158,146,121,121,117,117,117,113,117,117,117,117,117,117,117,117,121,121,125,130,130,130,125,138,162,166,162,158,162,158,150,150,154,162,158,154,162,158,162,158,162,162,150,158,146,162,162,166,166,166,158,154,150,146,142,150,166,174,166,162,150,162,150,142,142,146,158,158,142,134,130,130,130,138,142,125,125,125,117,117,109,93,89,89,89,93,93,
125,134,134,138,138,138,138,138,138,138,130,117,113,113,150,146,138,154,162,146,125,154,142,125,142,158,162,146,134,154,174,170,170,170,166,166,170,166,174,178,154,166,158,150,142,134,138,138,142,154,166,170,166,162,158,154,154,150,138,130,113,134,138,138,134,134,134,134,134,134,134,134,125,125,142,154,154,150,134,134,130,130,130,130,121,109,105,97,101,97,97,97,97,121,130,130,142,130,113,105,97,97,97,101,101,105,113,121,113,109,109,109,101,105,105,105,105,113,117,130,134,130,121,130,121,130,138,134,134,134,134,130,162,166,174,158,154,162,146,134,130,138,138,113,125,125,113,113,113,113,113,113,125,125,134,130,130,130,125,130,130,130,130,130,134,134,130,130,138,154,150,121,121,117,117,117,113,117,117,117,113,113,117,117,117,121,121,125,130,130,130,125,150,154,146,154,162,162,162,158,158,162,162,158,150,154,162,166,158,150,150,150,154,146,154,158,158,154,154,154,150,146,150,142,150,174,174,170,170,170,174,162,174,174,178,178,178,178,146,130,130,130,138,134,125,146,134,138,138,142,117,109,93,89,93,109,
134,134,138,138,138,138,138,138,138,138,113,113,113,113,125,146,125,146,158,158,138,125,146,162,174,158,146,154,166,170,170,178,174,166,170,174,154,150,170,166,158,138,134,138,134,134,130,134,142,154,162,162,162,158,154,150,150,150,138,130,117,125,134,134,134,134,134,134,134,134,138,134,130,134,150,162,146,134,130,134,130,121,134,130,125,109,105,101,101,97,97,97,121,142,162,134,130,154,130,105,101,101,97,101,101,105,113,117,121,113,113,113,109,105,105,105,105,109,113,117,121,130,130,134,125,117,130,134,134,134,130,138,170,158,174,170,170,166,158,138,130,134,134,125,121,125,121,121,117,113,117,121,121,117,134,130,130,130,125,130,125,125,130,130,130,134,130,130,134,150,154,121,125,125,125,117,117,117,117,117,117,117,117,117,117,121,121,125,130,130,130,125,138,146,154,162,158,162,162,158,162,162,162,158,150,154,158,158,158,154,146,142,146,146,154,158,154,146,146,142,138,142,142,142,150,174,170,166,162,158,162,174,174,174,170,170,174,174,174,134,134,134,150,134,134,138,142,158,162,158,150,130,130,113,109,138,
134,134,134,138,138,138,134,138,138,138,121,113,117,125,117,134,142,146,174,166,142,150,166,170,170,166,162,170,174,178,182,170,174,166,174,166,154,142,154,178,146,142,162,154,142,134,134,138,142,146,154,158,158,154,150,150,146,142,130,125,117,113,134,138,134,134,134,134,125,130,138,125,130,142,146,138,142,130,134,130,138,134,130,130,130,113,105,101,101,101,97,101,130,154,134,130,134,150,130,117,109,101,101,97,101,105,109,113,117,121,113,113,113,113,109,109,105,109,117,121,121,130,138,130,134,125,113,130,134,134,134,138,150,170,166,174,174,170,158,146,130,134,138,121,125,130,125,125,121,121,130,125,117,117,130,125,125,130,117,121,125,130,130,125,130,130,130,130,130,146,146,117,121,121,121,117,117,121,117,117,117,117,121,121,121,125,125,125,125,125,134,130,142,146,162,166,170,162,162,158,158,162,162,158,150,150,154,154,154,150,138,130,138,146,154,150,146,142,142,142,125,134,138,138,138,170,166,154,146,162,166,166,174,178,170,174,166,166,174,170,154,138,134,142,138,130,125,150,174,178,158,146,125,125,138,134,
134,138,134,138,138,138,138,130,138,138,134,113,130,142,121,121,150,134,138,166,158,158,170,174,166,162,170,170,178,174,178,178,178,178,170,162,158,150,170,170,150,150,142,142,146,134,142,150,158,146,150,158,158,150,150,142,146,142,130,125,121,117,117,130,134,134,138,130,134,130,134,134,134,130,134,134,130,130,138,162,142,134,134,134,130,121,113,105,101,105,101,130,146,138,130,138,130,142,138,117,105,105,101,101,101,101,109,109,117,117,125,117,117,117,113,109,105,113,121,125,130,130,130,134,130,125,121,121,125,130,130,134,138,138,162,166,178,174,158,150,134,130,134,117,121,134,125,125,125,130,134,134,125,125,134,125,125,121,117,130,130,130,134,130,130,134,130,134,130,146,146,117,117,113,117,121,121,121,125,121,121,121,121,121,125,130,130,130,125,121,121,134,150,162,170,158,162,162,158,154,158,154,154,150,146,154,154,150,150,146,138,130,138,138,142,142,142,138,130,134,125,130,130,130,134,162,166,154,174,178,174,174,174,174,166,166,154,162,174,174,182,170,150,150,142,142,125,130,154,170,162,150,154,146,138,130,
138,138,134,138,138,134,130,134,138,138,138,138,134,142,138,117,130,146,150,146,158,182,166,166,174,166,174,174,174,170,170,174,170,182,158,158,154,158,178,154,162,150,158,154,142,142,150,162,166,166,162,162,158,146,146,142,138,134,130,121,117,117,113,117,134,138,125,113,130,125,117,134,134,130,130,134,130,138,158,138,158,150,130,134,134,125,121,109,117,117,121,138,174,142,134,138,138,134,130,130,121,113,105,101,97,101,109,113,117,125,134,134,130,130,150,125,125,121,121,130,130,130,125,121,109,105,105,113,117,121,121,121,134,134,134,138,162,166,158,150,146,130,125,138,117,125,130,130,130,130,134,130,121,125,125,117,117,113,121,125,130,130,130,134,130,134,125,130,125,146,146,117,121,117,113,117,117,121,121,121,121,121,117,117,121,121,117,121,121,113,121,146,150,158,158,158,150,154,158,162,162,154,150,150,154,154,154,158,158,150,138,130,130,130,130,130,130,121,125,130,130,142,146,154,166,170,166,166,178,178,162,178,170,174,174,166,154,150,166,170,178,174,170,170,162,166,150,121,138,138,150,146,134,125,113,134,
138,134,138,138,130,138,134,138,134,134,134,134,134,134,154,125,134,134,138,150,142,138,146,150,158,178,174,174,170,158,162,162,162,162,150,142,162,170,166,150,150,138,158,154,142,146,158,170,170,166,162,158,154,150,134,130,130,125,130,121,117,121,121,121,125,125,130,121,134,125,138,130,130,125,125,130,130,138,142,170,170,154,134,134,134,130,125,125,121,125,134,142,166,150,130,138,142,134,158,134,130,130,125,105,105,101,105,117,121,130,134,138,134,150,166,166,158,134,130,130,130,130,117,97,93,97,101,105,105,113,109,117,130,130,134,142,142,170,162,154,158,146,130,134,138,121,121,130,134,138,134,125,117,130,134,117,117,117,121,117,125,130,130,142,138,134,125,125,125,134,158,121,121,121,113,117,117,121,121,121,117,117,113,117,117,117,117,121,121,117,121,154,158,154,146,150,162,158,162,162,166,166,166,162,166,162,162,166,158,154,142,134,134,134,130,134,125,121,146,166,162,166,166,170,174,174,174,178,174,170,170,170,166,174,166,142,154,146,158,162,174,178,170,174,170,162,162,162,134,117,138,130,130,113,130,134,
130,138,138,138,146,125,138,138,134,134,130,134,134,121,162,142,121,146,142,142,134,142,142,158,174,182,174,166,170,178,174,178,178,162,166,170,178,150,138,134,138,138,146,146,146,154,166,170,170,170,166,154,150,146,138,134,130,130,125,130,130,134,138,142,142,121,134,125,146,138,130,134,134,121,113,117,125,125,150,162,142,134,130,134,134,134,130,125,125,134,130,146,170,150,134,138,142,134,154,138,130,134,130,121,109,101,105,117,125,134,134,134,142,162,170,178,174,166,138,130,130,113,105,97,97,97,97,101,105,101,113,125,134,134,134,134,134,170,174,166,162,150,138,130,130,134,117,134,138,134,125,125,125,134,130,134,125,125,117,117,117,125,130,138,130,125,121,125,121,130,174,162,125,117,113,113,117,117,117,117,117,117,113,113,113,113,113,121,121,117,121,154,162,162,154,166,162,166,166,162,162,166,166,170,166,162,166,166,166,154,146,142,134,134,138,125,117,134,170,166,174,178,178,182,174,178,178,170,166,170,170,162,166,166,146,125,146,150,146,158,166,162,154,178,174,178,166,154,146,117,121,117,117,113,117,121,
130,121,134,134,130,138,130,138,134,125,134,138,134,130,142,142,117,130,146,154,166,150,154,170,166,150,158,170,182,178,174,166,162,166,162,142,125,142,150,142,146,138,134,142,150,166,166,166,166,170,166,154,146,146,138,134,134,130,130,130,142,146,146,142,138,130,125,125,130,134,138,134,134,138,138,121,121,121,138,134,134,138,158,134,134,130,130,130,130,138,146,154,178,154,130,138,138,134,142,154,142,134,134,134,130,130,125,121,130,134,138,138,142,138,158,150,158,146,134,134,125,125,117,105,93,97,97,97,97,101,117,125,130,130,134,130,134,158,174,170,162,158,146,117,125,121,125,138,142,138,125,121,121,138,134,134,134,117,117,113,117,121,125,125,121,121,117,121,117,121,130,150,146,121,109,113,113,113,113,113,117,121,117,113,113,113,113,117,117,113,117,146,154,158,158,166,166,166,162,166,166,170,166,166,166,170,170,166,166,154,150,146,138,138,134,121,117,142,170,162,174,174,170,174,174,178,166,154,158,170,170,174,174,170,134,121,150,162,154,154,158,154,174,174,174,178,174,162,158,146,134,125,134,125,125,130,
150,138,146,130,130,142,138,138,138,138,130,125,138,125,121,125,142,138,146,138,146,158,138,134,130,134,146,166,174,170,170,170,146,125,130,125,121,134,146,142,142,138,134,142,150,162,158,166,166,166,154,138,146,142,138,130,134,130,125,121,138,150,146,154,154,142,125,125,130,138,134,134,138,138,134,130,113,113,117,130,134,162,166,154,134,130,130,130,134,138,162,178,174,162,134,134,134,134,130,134,150,142,146,138,134,130,130,130,130,134,138,138,138,134,138,138,134,134,134,130,121,121,113,97,93,89,93,97,97,105,117,125,130,134,134,134,134,146,178,174,166,166,150,138,125,125,130,138,146,138,121,125,134,121,121,130,125,134,130,125,113,113,125,125,125,117,121,121,117,121,121,121,130,142,117,113,113,117,121,130,113,117,117,113,113,113,113,113,117,117,121,146,150,162,166,170,170,170,170,166,166,166,166,170,170,170,154,166,162,158,154,146,142,138,134,121,121,154,178,170,178,162,162,170,174,174,174,158,166,154,158,170,154,130,121,117,134,150,146,150,150,142,158,150,154,162,166,174,170,162,154,130,150,146,158,158,
150,150,130,125,130,134,138,134,138,134,138,134,130,130,134,134,146,166,162,158,162,178,170,150,142,142,150,162,170,166,154,162,117,121,138,134,138,150,146,150,154,154,146,150,158,154,162,162,162,154,138,130,134,134,125,125,125,121,117,117,130,138,142,154,154,134,130,138,146,130,134,134,134,125,130,134,121,121,138,158,166,178,150,138,138,125,121,130,134,138,154,154,158,166,138,130,134,138,134,130,130,130,130,150,134,130,130,130,130,125,130,138,134,134,130,134,134,134,130,117,117,117,113,101,93,89,89,89,97,117,117,121,121,125,134,130,130,138,150,170,170,162,166,146,134,134,138,138,142,150,138,125,125,134,134,138,142,130,138,117,134,138,121,121,117,113,121,125,121,125,125,125,125,130,150,142,117,113,109,125,125,113,113,109,113,113,113,117,121,113,130,146,146,162,166,174,170,178,174,158,158,162,166,162,158,150,154,158,158,162,154,146,150,146,134,117,130,150,170,170,174,162,150,158,150,158,170,174,154,158,162,138,125,142,125,117,113,125,125,134,142,138,142,134,146,158,174,166,166,174,166,146,158,166,166,154,
154,125,121,134,134,134,134,138,138,138,134,125,138,158,158,162,174,174,162,170,166,154,166,170,170,174,166,166,154,158,174,154,113,134,138,138,134,146,146,150,158,166,166,154,146,130,138,142,138,130,130,130,121,117,121,134,125,130,117,121,121,130,142,134,134,138,125,154,154,134,138,134,138,117,117,125,121,142,154,162,162,150,142,134,121,117,130,134,134,134,130,134,166,166,138,130,130,138,138,138,138,142,138,134,150,138,138,134,130,130,117,125,130,130,130,125,125,125,113,117,113,113,113,101,93,89,89,89,97,117,121,121,121,117,125,134,134,130,134,158,174,182,162,154,146,146,146,142,146,138,142,142,138,138,142,138,138,134,134,125,121,134,134,121,117,113,113,121,121,125,121,125,121,134,142,142,113,113,117,113,142,117,113,117,113,113,117,117,121,117,125,154,162,158,178,170,170,178,162,158,142,154,158,154,150,150,150,150,150,150,138,142,146,142,134,117,125,154,178,166,170,162,154,138,146,162,166,154,150,130,117,113,125,150,125,117,113,113,113,121,125,138,121,125,142,154,166,174,170,150,154,162,170,170,174,174,
134,134,134,134,138,134,134,138,138,138,125,146,166,178,170,170,170,174,170,174,178,178,174,170,162,158,166,170,162,154,150,121,117,121,134,130,134,138,138,146,166,170,174,158,134,125,117,125,125,125,130,121,121,134,134,130,130,134,121,121,134,117,130,130,121,125,138,146,146,121,130,130,134,130,125,117,138,150,158,142,138,134,125,117,117,125,130,130,130,134,130,125,170,170,142,130,130,138,138,142,142,142,142,134,158,134,146,138,138,130,125,117,121,121,121,121,117,117,113,113,109,109,113,101,93,89,89,97,101,101,113,113,109,105,105,125,142,138,130,138,158,174,166,166,158,158,150,142,138,134,134,134,142,138,138,138,134,134,138,130,134,138,130,138,130,121,130,130,130,117,125,117,125,130,125,130,138,113,113,113,134,113,117,121,113,113,121,117,117,117,142,121,142,166,174,174,174,170,178,166,154,142,142,146,142,146,146,142,142,138,134,134,142,142,130,121,121,154,166,166,178,162,150,142,154,162,166,170,154,121,117,117,117,125,117,113,113,113,113,113,117,113,113,134,142,162,170,154,138,113,130,162,166,170,170,158,
138,134,134,134,134,134,138,138,138,138,138,142,134,150,150,150,142,138,134,138,134,146,150,170,182,166,170,162,158,134,138,125,117,117,113,121,125,142,138,125,146,170,154,138,138,134,130,130,130,125,121,117,130,113,117,125,134,130,113,121,138,113,125,121,134,138,134,130,134,121,138,134,130,125,125,146,158,162,174,146,130,130,121,113,113,117,130,134,134,134,134,138,162,166,138,130,134,138,138,142,146,146,138,134,130,134,130,130,138,158,125,121,125,117,113,117,117,117,113,113,109,117,113,101,93,89,97,105,97,97,93,93,97,97,97,97,101,121,138,142,138,150,170,174,162,158,150,134,125,130,130,130,138,138,134,130,134,134,134,134,138,138,125,125,134,138,138,134,134,138,134,121,130,121,134,130,117,113,113,121,125,121,117,113,113,113,117,113,113,117,138,134,158,170,178,174,178,182,170,162,154,142,150,162,158,158,158,150,146,130,130,134,138,142,138,121,117,134,174,174,170,146,146,134,150,162,166,158,146,138,125,121,117,125,125,117,113,113,113,113,113,109,113,142,142,142,130,130,134,134,138,138,142,154,150,134,
134,134,134,134,134,134,138,138,138,138,138,134,125,117,117,117,117,117,117,117,113,121,121,125,138,134,130,134,138,138,138,138,138,138,130,121,130,121,142,125,134,146,138,130,134,138,142,142,130,125,125,125,130,125,113,117,130,138,134,130,130,130,125,138,138,138,134,142,138,125,125,117,130,138,146,174,174,162,162,130,134,134,117,113,113,121,130,134,134,158,154,138,162,154,130,130,134,138,142,142,146,146,146,142,138,134,146,154,138,158,170,142,134,134,125,117,121,117,113,113,109,109,113,101,97,93,97,101,97,97,97,97,97,97,101,97,101,101,109,121,138,138,142,154,154,154,154,142,138,134,138,130,130,134,134,138,134,134,134,134,134,134,138,134,134,134,134,134,130,130,121,134,134,134,130,130,113,113,113,121,121,117,117,113,113,113,117,117,117,117,117,154,162,178,174,166,162,170,166,162,158,150,158,166,170,174,162,142,130,125,130,130,134,142,142,130,117,121,150,170,174,134,130,146,138,142,150,154,142,130,121,113,113,125,130,125,117,113,113,113,113,121,134,138,138,138,134,125,134,138,142,130,134,134,134,134,
134,138,138,138,138,138,138,138,138,138,138,138,138,138,125,121,109,109,117,121,138,134,138,138,138,142,138,138,134,130,130,138,138,138,134,138,134,138,134,134,130,125,134,138,130,142,138,138,130,138,130,125,125,117,130,138,134,134,138,134,154,150,134,134,130,121,125,134,130,130,125,125,142,158,162,170,162,158,138,138,138,121,113,113,121,130,130,130,134,146,142,146,166,138,130,134,138,138,142,146,146,146,146,146,142,138,142,150,142,150,134,134,134,134,125,117,125,121,113,117,117,125,125,105,101,97,97,97,97,97,97,97,97,101,101,105,105,105,105,113,130,138,134,134,142,142,138,138,146,142,134,134,134,138,134,134,134,134,138,138,138,138,134,134,134,134,125,121,125,138,134,130,130,134,134,130,109,113,113,117,130,113,109,113,113,113,113,121,117,117,113,117,130,134,134,125,125,125,134,142,158,150,154,162,166,166,166,134,125,130,130,130,130,125,130,138,138,130,134,158,134,121,113,125,121,113,113,117,113,113,109,113,113,117,117,113,113,117,109,109,113,125,134,138,134,134,134,138,138,134,134,134,138,134,138,130,
130,125,134,138,138,138,138,138,138,138,134,138,134,134,138,138,134,138,138,138,138,138,134,121,117,117,109,109,109,117,121,125,130,138,138,138,138,134,134,138,138,134,134,130,134,134,142,142,146,146,130,113,121,121,138,134,138,125,130,134,138,125,134,138,130,130,125,125,125,134,138,146,154,162,166,154,162,142,138,134,117,109,109,109,117,130,134,134,130,134,150,134,146,130,134,138,138,142,142,146,146,150,146,146,142,138,134,158,146,142,134,150,138,134,121,113,117,121,130,125,125,130,121,117,117,109,105,97,97,97,97,97,101,101,105,105,109,109,109,117,134,138,138,134,134,138,134,138,134,134,134,134,134,134,134,134,134,134,134,134,138,138,134,134,130,121,125,125,134,134,134,134,138,134,138,134,113,113,113,134,113,121,125,117,117,113,117,125,117,121,117,113,117,113,117,117,117,113,117,117,121,134,150,146,150,154,142,125,134,125,121,121,121,117,125,142,142,142,138,134,138,134,109,125,113,117,117,117,113,109,109,109,113,113,113,121,138,138,138,138,138,138,138,138,138,134,138,138,134,134,134,134,134,134,138,134,
138,138,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,142,125,113,105,101,97,97,97,101,101,105,109,109,113,117,121,125,134,134,130,130,121,138,138,130,134,134,138,134,142,142,146,130,134,130,130,134,134,121,113,121,125,134,138,134,138,125,138,134,130,142,146,138,146,154,174,158,134,134,125,117,109,109,109,109,109,113,130,134,134,142,154,158,138,130,130,134,138,142,142,146,146,150,150,150,146,142,138,130,138,150,154,166,146,134,134,130,113,117,121,113,109,109,109,105,109,109,109,113,109,105,101,101,97,101,105,105,109,113,113,121,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,134,134,130,138,146,134,130,134,134,138,134,134,138,138,134,113,113,121,138,125,130,113,113,130,125,117,113,117,117,113,117,117,117,113,117,117,117,117,113,117,125,134,138,134,121,121,121,117,117,117,117,117,121,121,130,130,117,121,134,138,138,138,142,138,138,117,117,113,109,109,113,113,130,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
134,134,138,134,138,138,138,138,138,138,138,138,138,138,142,142,130,117,105,97,93,93,93,93,97,97,97,101,101,105,105,105,109,113,117,121,134,138,138,121,130,130,134,130,134,130,125,130,130,138,138,130,125,134,138,117,125,121,121,130,134,130,130,134,134,142,142,146,158,162,146,134,146,142,134,130,125,121,113,109,109,109,109,113,125,130,138,134,134,162,166,138,130,134,138,142,142,146,146,146,150,150,150,146,146,142,134,134,154,142,150,162,138,134,134,130,117,113,113,113,109,109,109,109,101,101,105,105,109,109,109,105,105,105,109,109,113,121,125,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,138,146,134,134,134,138,134,138,138,138,138,138,121,121,130,134,130,138,138,130,130,134,130,117,117,117,113,117,117,117,113,117,117,117,117,117,117,113,117,117,113,113,113,113,113,113,113,117,117,125,130,117,109,113,109,134,138,134,138,138,138,134,138,125,130,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
138,138,138,138,138,138,138,138,138,138,138,138,138,134,125,117,101,93,93,89,89,93,89,93,93,93,97,97,97,101,101,101,105,105,109,113,130,134,134,130,121,130,130,138,134,125,138,138,138,138,134,138,125,130,134,134,121,125,125,138,138,146,142,134,134,142,142,138,158,154,142,170,162,138,130,130,125,121,113,109,109,113,121,130,134,134,130,130,142,166,142,130,130,134,138,142,142,146,146,150,150,150,150,146,146,142,134,130,146,150,134,166,134,125,134,134,121,105,105,101,101,105,101,101,105,105,101,101,101,101,105,109,109,101,109,113,113,121,130,130,130,130,130,130,134,134,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,150,138,134,134,134,138,134,138,138,138,134,125,134,138,134,138,138,138,134,134,134,121,113,113,117,121,121,121,125,121,121,121,121,121,121,117,113,134,134,113,117,121,121,117,125,134,138,138,134,117,125,125,138,138,138,138,138,138,138,138,138,113,109,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
138,138,138,138,134,134,138,138,138,138,138,134,134,130,105,89,89,89,89,89,89,89,89,89,93,93,93,97,97,97,97,101,101,101,109,117,130,134,138,125,130,134,130,134,142,138,134,130,130,130,134,134,138,134,134,138,138,134,134,134,138,138,142,138,134,134,134,134,130,130,130,125,130,125,125,125,125,121,117,109,109,117,130,130,130,134,134,130,158,166,138,130,130,134,138,138,142,142,146,146,146,146,146,146,146,142,134,130,142,150,166,166,150,138,134,134,130,113,101,101,101,97,97,93,93,97,97,97,97,97,93,101,101,113,105,109,109,113,117,130,134,134,134,134,130,130,134,130,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,138,150,134,134,134,134,138,134,138,138,134,138,134,138,138,138,138,138,138,138,134,134,125,113,125,130,130,138,146,146,134,125,117,117,121,125,121,121,117,134,130,125,138,138,138,138,138,138,138,138,138,134,134,138,138,138,138,134,138,138,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
138,134,138,138,138,138,134,134,134,134,134,130,125,113,109,105,89,89,89,93,89,89,93,93,93,93,93,93,97,97,97,97,93,97,105,121,130,134,134,138,134,138,134,130,130,130,130,134,125,125,121,121,130,130,134,134,130,134,134,125,125,130,130,134,142,150,158,158,142,158,142,130,130,130,125,125,125,121,113,109,105,117,134,134,130,130,134,138,174,150,130,130,134,134,138,138,142,142,146,146,142,142,142,142,142,142,134,130,125,134,134,154,170,142,130,130,134,134,113,97,97,97,97,93,93,93,93,97,93,93,97,93,97,105,101,109,109,109,117,130,134,138,138,134,138,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,130,154,166,134,138,138,134,134,138,138,138,138,138,138,138,138,138,138,138,134,138,138,130,121,125,134,142,142,134,130,134,134,121,130,130,125,125,130,138,130,130,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,121,121,125,121,130,138,130,117,117,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,134,
134,130,130,130,134,134,134,138,138,134,130,113,113,109,121,130,113,89,89,93,89,93,93,93,93,93,93,93,93,93,93,93,93,97,105,121,134,134,134,134,130,130,130,130,130,134,154,146,130,130,121,125,121,138,134,125,125,130,130,130,130,138,130,138,134,138,142,146,162,170,162,134,130,134,134,130,130,130,125,134,130,134,138,130,125,130,138,178,154,134,130,134,134,138,138,138,142,142,142,146,142,142,142,142,138,138,138,134,130,130,154,178,174,146,138,134,134,134,134,125,109,93,93,93,93,93,93,93,101,105,101,101,101,105,105,109,109,117,130,134,134,138,138,138,138,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,146,166,158,146,138,134,138,134,134,138,134,138,138,138,138,138,138,134,138,138,138,138,134,130,134,138,134,130,125,121,121,130,134,142,150,162,166,170,142,117,138,134,138,138,138,138,138,138,138,138,138,138,138,138,138,130,125,117,117,109,113,113,138,130,138,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,134,134,138,138,138,
125,125,117,113,113,113,113,121,130,134,130,117,113,113,113,117,121,97,81,89,89,93,93,93,93,93,93,93,93,93,93,93,97,97,101,113,125,134,138,134,134,117,117,125,130,134,125,134,138,130,121,138,138,134,125,134,130,130,130,134,134,130,130,134,134,138,130,125,134,134,138,146,138,134,134,134,134,130,134,146,150,142,138,138,146,154,162,150,134,130,134,134,138,138,142,138,142,142,142,142,142,142,138,138,138,134,134,134,130,138,174,154,130,134,138,134,134,134,134,134,134,125,109,101,97,93,93,97,105,101,101,101,109,105,113,109,109,117,130,134,134,134,134,134,138,138,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,134,134,138,138,138,150,150,146,146,134,134,134,138,138,134,138,138,138,138,134,138,138,138,134,134,134,138,138,130,134,138,130,117,117,121,134,138,138,138,134,117,134,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,138,134,142,138,138,138,138,138,138,134,138,138,138,138,138,138,138,138,138,138,134,134,134,134,134,134,134,130,130,
121,117,113,109,109,109,109,109,113,117,121,125,121,113,109,117,125,125,105,85,89,89,93,93,93,93,93,93,93,93,93,93,93,93,97,101,109,121,130,134,134,134,134,113,117,117,134,130,134,134,134,134,134,125,134,134,134,138,134,134,138,138,138,130,134,146,158,166,158,150,158,150,142,134,134,130,130,121,154,166,170,182,174,150,138,134,134,130,130,130,134,134,138,138,138,142,142,142,142,142,138,138,138,134,134,134,130,134,138,154,174,150,134,138,134,138,134,134,134,134,134,134,130,125,109,105,101,101,101,101,101,105,109,105,109,109,121,134,138,142,138,134,138,138,138,138,138,138,134,134,134,134,134,138,134,134,134,134,134,134,134,134,134,134,134,134,138,138,134,134,134,138,138,138,138,146,142,134,134,134,138,138,134,138,138,138,138,138,138,138,138,134,138,138,138,138,134,138,138,138,117,130,125,130,134,138,138,138,138,138,138,138,138,138,142,142,142,138,142,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,138,138,134,134,134,138,138,134,134,134,130,125,125,125,
117,121,125,117,113,113,113,117,130,130,134,134,125,113,117,121,121,125,121,113,97,93,93,93,93,93,93,93,93,93,93,93,93,93,93,101,105,113,125,134,134,134,138,138,138,134,125,130,113,117,134,134,134,134,134,130,130,130,134,125,125,130,134,130,134,130,134,142,146,146,166,178,134,130,134,130,138,142,158,154,146,162,158,138,130,130,130,130,130,134,134,134,138,138,138,138,142,142,138,138,138,134,134,134,134,130,138,146,154,166,178,170,138,130,138,130,134,134,134,134,134,138,134,134,125,109,101,101,101,97,97,101,105,105,109,125,134,130,134,150,138,138,134,138,130,134,134,134,134,134,138,134,134,138,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,138,134,134,134,134,134,134,134,134,134,134,134,138,138,138,134,134,134,134,138,134,138,138,138,134,134,138,142,134,134,134,134,134,134,138,138,138,134,134,134,130,130,121,117,121,121,125,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,130,121,121,125,125,121,
117,121,121,117,113,113,109,121,138,134,134,134,134,130,113,105,109,121,117,121,105,93,93,93,93,93,93,93,93,93,93,93,93,93,93,97,101,105,113,125,130,138,138,134,134,138,138,134,125,117,134,134,134,125,121,121,125,138,121,121,130,130,134,146,138,142,142,154,162,150,170,162,174,158,146,130,142,170,174,178,178,170,158,150,142,138,134,130,130,134,134,134,134,134,134,138,138,138,138,138,138,134,134,130,130,138,146,158,170,182,186,182,150,142,130,134,134,134,134,134,134,138,138,134,130,109,101,101,105,109,109,109,113,101,117,130,134,146,138,154,150,142,138,138,138,138,134,134,134,134,134,134,134,138,138,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,130,134,134,134,138,138,138,138,134,138,134,138,138,138,138,138,138,138,138,134,125,138,142,138,134,134,138,138,134,130,130,121,121,109,109,109,109,109,109,105,109,113,125,138,142,142,142,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,134,134,138,138,134,130,125,121,121,117,117,121,121,
117,117,117,113,113,109,109,101,105,117,121,121,121,117,121,125,117,105,101,97,93,89,89,93,93,93,93,93,93,93,93,93,93,93,93,97,97,97,101,105,105,113,117,130,134,134,134,134,138,134,134,130,134,121,125,134,138,134,134,138,125,134,142,162,170,154,138,142,142,150,162,170,154,150,142,138,134,138,142,146,146,158,178,182,170,158,150,142,138,134,130,130,130,134,134,134,134,134,134,134,134,130,130,130,134,142,150,162,174,186,182,170,158,146,134,134,134,134,134,134,134,134,134,134,130,117,109,109,105,105,97,105,109,117,130,134,146,166,162,154,178,150,138,138,134,134,138,134,138,134,134,134,134,134,138,138,138,134,134,134,138,134,134,134,134,134,134,134,134,134,134,138,134,134,134,134,134,130,134,130,134,134,134,134,134,138,138,134,138,138,134,134,134,138,134,138,138,130,146,138,138,142,142,138,138,138,130,117,113,109,109,109,105,101,101,105,105,105,105,101,101,105,109,113,109,113,125,134,138,138,138,138,138,138,138,138,138,134,138,138,138,134,125,117,113,113,113,113,113,113,113,113,109,113,117,117,
121,117,117,113,109,109,101,101,97,101,105,109,109,101,97,97,93,97,97,93,89,89,89,93,93,93,93,93,93,93,93,93,93,93,93,93,93,101,109,109,109,105,109,117,121,130,130,134,130,130,130,134,134,134,134,130,130,121,134,134,138,166,162,174,158,146,138,134,142,150,158,166,170,154,142,154,150,138,138,134,134,138,142,166,178,182,178,174,162,150,146,138,130,130,130,134,134,134,134,134,130,130,130,130,134,138,150,158,174,186,174,162,162,146,150,142,138,134,134,134,134,134,134,134,130,117,113,105,101,97,97,105,121,130,134,138,146,138,146,150,146,130,142,142,150,158,138,134,134,134,134,130,134,134,134,134,134,134,134,134,134,138,134,134,138,134,134,138,134,138,134,134,134,134,134,134,130,130,130,130,130,134,138,134,134,138,138,138,134,134,134,134,134,125,130,134,138,150,146,134,134,138,138,138,130,121,113,109,105,101,97,101,101,97,97,97,97,97,97,97,97,93,93,97,97,97,105,113,125,130,134,134,138,138,138,138,138,138,125,125,125,117,109,105,105,105,105,105,105,105,105,109,113,117,121,121,
121,113,113,109,105,101,97,97,97,97,101,101,101,97,97,93,89,89,89,89,89,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,97,105,105,101,101,109,113,113,117,121,125,130,134,134,134,134,134,134,134,134,138,142,138,138,146,170,162,146,130,134,138,150,138,134,138,154,162,174,170,150,158,162,146,134,138,158,166,166,158,154,166,174,166,162,158,154,158,154,150,138,138,134,130,130,130,134,138,142,150,154,154,170,182,158,146,154,174,162,166,146,138,138,138,134,134,134,134,134,130,109,97,97,101,105,121,130,130,130,125,130,130,134,138,142,142,142,142,142,138,142,146,138,138,134,138,134,134,138,138,134,134,134,134,134,130,138,134,130,134,134,130,134,134,130,134,138,134,134,134,134,130,130,130,130,134,134,134,138,138,138,138,134,134,134,134,134,138,130,134,162,142,134,142,138,138,125,121,113,109,109,105,101,97,97,97,97,93,97,93,93,93,89,89,93,97,97,93,97,97,101,105,105,113,117,117,117,121,121,121,117,117,113,113,109,109,109,105,105,109,109,105,105,105,105,105,109,113,117,121,121,
113,109,109,105,97,97,97,97,97,97,101,97,97,93,93,93,93,89,89,89,89,93,93,89,89,89,89,93,93,93,93,93,93,93,93,93,93,97,97,109,109,105,101,101,109,109,113,113,121,125,130,134,134,134,134,134,134,134,138,134,138,138,142,130,138,150,146,166,170,162,166,146,154,170,158,174,174,170,170,166,146,142,146,146,154,170,170,178,174,174,182,178,170,178,178,174,182,166,142,142,142,154,166,174,178,178,182,174,162,166,170,162,154,158,150,154,150,150,142,134,138,138,138,134,109,93,89,105,117,121,130,130,130,125,121,117,109,113,113,117,130,138,138,142,142,134,134,134,138,142,142,142,138,138,138,134,134,134,134,134,142,138,138,142,134,134,138,138,130,134,138,134,138,142,138,134,130,130,130,130,134,134,138,138,138,138,138,138,134,134,134,138,130,138,142,134,138,134,130,125,117,113,109,101,97,97,97,97,97,97,97,93,93,93,93,93,89,89,89,93,97,101,97,97,97,101,101,109,117,117,113,109,109,109,109,109,109,105,105,105,105,105,105,105,105,105,105,101,101,105,105,105,109,113,113,113,
113,113,109,101,97,97,93,93,97,93,93,89,89,89,89,89,93,89,93,93,97,97,97,97,97,97,97,93,93,93,93,93,93,93,93,93,97,97,97,97,93,93,93,93,97,101,101,105,105,109,109,113,117,121,125,134,134,134,134,134,134,138,138,138,134,146,150,158,182,170,158,166,170,162,166,158,154,146,158,150,154,162,154,134,134,134,150,162,162,146,154,150,146,154,150,138,158,178,174,174,174,174,178,170,170,162,158,162,170,154,146,138,142,138,134,138,138,134,146,142,142,138,121,101,89,93,101,101,101,105,117,125,134,138,134,125,117,113,109,105,105,109,113,117,121,125,121,117,117,117,117,121,125,125,130,130,134,138,142,142,142,142,142,138,138,138,134,134,138,142,134,134,134,130,125,125,125,130,130,130,130,130,130,134,130,130,134,134,134,134,138,138,138,138,138,134,125,113,109,109,105,105,101,97,97,97,97,97,97,93,97,93,89,101,97,97,93,89,89,89,89,89,93,93,97,97,105,113,117,113,109,109,105,105,105,105,105,105,105,105,101,101,101,101,101,101,101,105,105,105,101,105,105,109,109,113,
109,113,109,109,105,97,97,89,93,93,93,89,89,93,93,89,89,93,93,101,101,101,97,101,101,101,97,93,93,93,93,93,93,93,93,93,97,93,93,93,93,93,93,93,93,97,101,105,105,105,105,105,109,109,113,121,130,134,134,134,138,138,138,138,138,138,138,138,138,142,134,158,170,158,154,162,162,170,162,150,166,166,146,142,138,134,138,138,138,138,138,134,138,130,138,134,162,166,150,162,174,182,170,174,170,174,170,174,166,158,154,150,138,138,138,138,142,138,130,125,117,101,93,89,93,101,101,101,101,101,101,97,97,105,109,117,121,117,117,109,101,97,97,97,93,93,93,93,97,97,97,97,97,97,101,101,105,105,113,117,121,117,117,117,125,130,134,138,138,142,138,138,138,134,125,121,121,121,121,121,121,121,117,117,117,117,117,117,117,113,113,113,113,117,113,109,101,101,97,97,97,97,97,97,97,97,97,93,93,101,93,89,97,97,93,89,89,89,89,89,89,89,89,89,93,97,105,109,117,125,117,113,105,105,105,105,105,101,101,101,101,101,105,105,101,101,101,101,105,105,105,105,105,109,109,113,
109,109,109,109,109,105,97,93,93,93,89,93,97,97,97,93,93,93,93,97,97,101,101,101,101,101,101,101,101,97,97,93,93,93,93,93,89,89,93,89,89,93,93,93,97,101,101,105,109,109,105,105,105,105,109,109,113,113,117,117,117,121,121,121,121,125,130,134,134,138,138,138,138,142,130,130,134,138,142,138,138,138,138,134,138,138,138,134,134,134,134,134,130,134,134,138,138,142,138,138,146,162,166,166,170,154,158,158,154,146,142,138,142,138,125,125,113,101,97,101,97,97,97,97,93,101,101,101,89,85,89,97,97,93,89,89,93,93,93,93,93,93,93,93,93,93,93,93,93,89,89,89,93,93,93,93,93,93,97,97,97,93,97,97,97,97,101,101,109,109,109,109,113,113,113,109,109,109,109,109,109,109,109,109,105,101,97,97,97,97,93,97,93,93,93,93,97,97,97,97,93,89,97,97,93,93,97,97,93,89,97,101,105,97,93,89,89,89,89,89,89,89,89,89,89,97,101,105,113,121,121,117,109,105,105,105,101,105,105,109,105,105,101,101,101,101,101,101,101,105,105,105,105,105,105,109,
109,109,109,113,113,113,113,113,113,105,105,109,113,109,109,113,113,113,105,101,101,105,105,105,105,105,105,101,101,101,101,97,93,93,93,93,89,93,93,93,93,97,97,101,101,105,105,105,109,109,109,109,105,109,109,113,113,117,117,117,117,117,121,117,117,121,117,121,121,121,125,125,125,125,130,134,138,134,138,138,134,134,134,134,134,134,134,134,138,134,134,134,138,138,138,138,138,138,138,138,134,134,138,142,138,138,138,134,134,134,134,130,113,101,93,89,85,89,89,89,93,93,97,101,101,101,97,93,93,97,97,89,97,97,93,93,89,89,89,89,89,89,93,93,89,93,89,89,89,89,89,89,89,89,93,89,93,89,93,93,93,93,93,93,93,93,97,97,97,97,93,97,97,97,97,97,97,101,101,101,97,97,97,97,93,93,93,93,93,93,93,93,93,93,89,89,93,89,93,93,93,97,97,97,97,93,93,89,97,101,105,105,105,97,89,89,89,89,89,85,89,89,89,89,89,93,97,109,117,117,117,117,113,113,113,113,113,113,109,105,105,105,101,101,101,101,97,97,97,97,101,101,101,101,105,105,
109,109,113,113,113,113,113,113,113,113,113,113,113,113,117,117,117,117,113,113,113,113,113,109,109,113,113,113,109,109,105,105,105,101,101,101,101,101,105,105,105,105,105,109,109,113,113,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,113,117,117,113,117,121,121,117,117,117,117,121,121,121,121,121,121,125,121,121,125,121,121,125,125,125,125,125,121,121,121,125,121,121,121,125,125,130,130,134,134,134,130,130,130,130,130,121,113,101,89,85,85,85,85,89,89,89,89,97,101,101,101,101,101,101,93,89,89,93,93,97,93,89,93,85,89,89,89,89,89,89,89,89,89,89,89,89,89,89,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,89,89,89,93,93,93,93,93,93,93,97,97,93,97,93,93,93,93,93,93,97,97,101,97,97,101,101,101,97,93,89,89,89,89,89,89,85,89,89,89,89,89,89,97,101,101,109,117,117,117,113,113,113,113,113,109,105,105,101,101,97,97,97,97,97,97,97,97,101,105,105,109,109,
113,117,117,117,117,121,121,113,113,113,113,113,113,113,113,113,113,109,109,109,109,113,113,113,113,113,113,113,113,113,117,117,117,117,117,113,113,113,117,117,117,117,121,121,121,117,117,121,121,117,121,121,121,121,121,117,121,121,121,121,117,117,117,117,117,113,113,113,113,113,113,113,117,117,121,121,121,125,130,134,130,125,125,125,125,125,125,125,121,117,113,109,105,105,101,101,101,101,105,109,109,109,109,109,113,113,113,113,113,117,117,121,121,125,130,130,130,125,113,109,101,97,93,89,89,89,89,93,93,93,93,89,93,97,97,97,97,97,93,97,97,101,105,101,97,97,101,101,101,97,97,93,93,93,89,89,89,89,85,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,93,97,93,97,93,93,93,93,97,97,97,93,93,93,93,93,97,101,97,97,97,97,97,97,93,93,93,89,89,89,89,85,85,85,89,89,89,89,85,89,89,89,89,89,85,89,101,109,113,113,109,109,105,101,101,101,101,101,97,97,97,93,93,93,93,93,97,101,101,105,105,109,109,109,113,113,
101,105,105,105,105,105,109,109,109,109,109,105,105,101,101,105,109,105,101,105,105,109,109,109,109,113,113,113,113,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,113,113,113,113,113,109,109,109,109,109,109,109,113,113,113,113,113,117,117,121,121,125,125,125,130,130,134,134,134,130,121,113,109,109,105,101,101,101,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,93,93,93,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,93,97,101,101,101,101,97,97,97,97,97,101,101,97,89,89,89,93,93,97,97,97,101,97,93,93,93,93,97,93,93,93,93,93,93,93,93,97,97,97,101,101,101,101,101,97,97,97,101,101,97,97,101,101,101,97,97,97,97,97,101,101,101,97,93,89,89,89,89,89,85,85,85,85,85,85,89,89,89,89,89,89,89,89,89,89,89,85,89,101,113,117,117,109,105,101,97,97,97,97,97,93,93,89,93,89,89,93,93,93,97,97,101,101,101,101,101,101,101,101,
89,89,89,89,89,89,93,93,93,93,93,93,93,93,97,97,101,101,101,101,105,105,109,109,109,109,109,109,109,113,113,113,113,113,113,113,113,113,113,117,113,113,113,117,117,117,117,117,113,113,113,113,109,109,109,109,109,109,113,113,113,109,105,105,105,105,105,105,105,105,101,105,105,105,105,105,105,109,109,109,109,109,113,117,117,121,121,121,125,130,125,121,117,113,113,109,109,105,105,101,101,101,97,97,93,93,93,93,89,89,89,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,89,89,89,93,89,89,89,89,89,89,85,85,89,89,93,93,93,93,97,97,97,97,97,101,101,101,97,97,97,93,93,97,93,93,89,89,89,89,89,93,93,93,97,101,105,105,105,105,105,101,101,101,101,97,97,93,93,93,93,89,89,89,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,89,89,89,89,89,89,89,89,89,89,89,93,101,113,117,121,117,109,101,97,97,97,97,97,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,
89,93,89,93,89,89,89,89,89,89,89,89,93,93,97,97,97,97,101,101,101,105,105,105,105,105,105,109,109,109,105,109,109,109,109,109,109,109,109,105,109,109,105,105,105,105,105,105,105,105,105,105,105,105,101,101,101,101,105,109,109,109,113,117,117,117,117,117,117,117,117,117,113,109,105,105,105,105,109,109,109,113,113,117,117,121,121,121,121,121,121,117,117,113,113,109,109,105,105,101,101,101,101,101,97,97,97,93,93,93,89,89,89,89,89,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,85,85,89,85,89,89,85,85,85,85,85,85,85,89,89,89,89,89,89,89,89,89,89,89,89,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,89,89,89,89,89,89,85,89,93,105,113,117,125,125,121,117,113,105,101,97,93,93,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,93,89,
89,89,89,89,89,89,89,89,89,89,89,93,93,93,89,89,93,93,97,97,97,93,93,93,93,93,97,97,93,97,93,93,93,93,97,97,97,97,97,97,97,97,97,97,97,97,101,101,101,101,101,101,105,105,105,105,105,105,109,109,113,113,113,113,113,113,113,113,113,113,113,109,109,109,109,113,113,117,117,117,121,121,121,121,121,121,121,117,117,113,109,109,105,101,101,101,101,101,97,97,97,97,97,97,93,93,93,93,93,93,93,93,93,93,89,89,89,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,89,89,85,85,85,81,85,81,85,81,81,85,81,81,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,89,89,89,89,89,89,93,97,105,113,117,121,125,125,125,121,117,113,109,105,101,101,97,97,97,93,93,93,93,89,89,89,89,89,89,89,89,85,85,85,89,89,
105,105,105,101,101,101,101,101,101,101,101,97,97,93,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89,93,93,93,93,93,93,93,93,93,93,97,97,97,97,101,101,105,105,109,109,109,109,109,109,109,109,109,109,109,109,109,113,113,113,117,117,117,117,117,117,117,121,121,117,117,121,117,121,117,117,117,121,117,117,117,117,117,113,113,113,109,109,105,105,101,101,97,97,97,97,97,93,93,93,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,89,89,89,89,89,93,93,97,101,105,109,113,113,117,117,117,117,117,113,113,113,109,109,109,109,109,105,109,109,109,109,109,109,109,109,109,109,109,105,109,105,105,
89,89,89,89,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,97,97,97,97,97,97,97,101,101,97,101,97,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,97,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,97,97,97,97,97,97,97,97,97,97,93,93,93,93,93,93,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,89,89,89,89,89,89,89,85,89,85,89,89,89,85,89,89,89,89,89,89,89,89,93,93,93,93,93,93,93,93,89,93,89,89,89,89,89,89,89,89,89,89,89,89,89,89
};
GLubyte textureB[65536] = {132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,132,132,132,123,123,123,123,123,132,132,132,123,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,123,123,123,132,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,123,123,132,123,132,132,132,132,123,123,123,132,132,132,123,123,123,132,132,123,123,123,123,123,123,
132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
140,140,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,115,123,123,115,115,115,115,115,123,123,123,123,123,123,123,123,123,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,140,140,
132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,123,115,115,115,115,123,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
132,132,132,132,123,123,123,123,123,115,115,115,115,115,115,123,115,115,107,107,107,107,115,99,115,115,123,115,115,115,115,115,115,123,115,115,115,115,115,115,115,115,115,115,115,123,123,115,115,115,115,115,115,115,115,115,115,107,107,107,107,107,107,107,107,107,99,99,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
132,132,123,123,123,123,115,115,107,107,107,90,90,99,99,99,115,123,107,90,74,66,90,90,99,99,107,115,107,115,115,99,115,107,82,90,90,99,99,99,107,115,107,115,115,115,115,115,115,115,115,115,123,115,115,115,107,107,107,99,99,99,99,99,99,99,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,132,123,123,132,132,132,132,132,132,132,132,132,132,132,123,132,123,123,123,123,123,123,123,123,123,123,132,132,
115,115,107,115,123,123,115,123,140,148,115,107,99,115,107,107,123,140,107,115,123,107,66,82,90,82,82,82,82,82,82,90,74,66,74,82,107,90,107,115,107,107,107,107,115,115,115,107,115,115,115,115,115,115,115,115,115,99,99,99,99,99,99,99,90,90,82,82,82,82,82,82,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,90,90,90,90,90,90,90,99,90,90,99,99,99,99,107,107,107,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,99,107,115,107,107,115,115,115,115,
115,107,82,99,107,115,123,107,132,148,156,165,173,181,173,140,132,132,132,132,107,74,49,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,66,66,74,74,82,82,90,90,90,90,99,99,107,99,107,107,107,107,107,107,107,107,107,107,107,115,99,82,74,74,74,74,74,66,66,66,66,66,66,66,74,74,82,90,82,74,74,74,74,74,74,74,74,82,82,82,82,82,82,82,90,90,90,90,99,99,99,99,107,99,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,107,107,90,90,90,82,82,82,90,123,123,115,90,115,
165,165,173,173,173,181,181,181,189,189,189,189,189,123,82,66,66,57,57,66,57,66,66,66,57,66,66,57,57,57,66,66,66,66,66,57,66,66,66,66,57,57,66,66,66,74,74,82,90,90,99,99,99,99,99,107,107,107,107,107,99,99,99,99,99,90,82,82,82,74,74,74,66,66,57,66,57,57,57,57,57,57,49,66,66,66,57,66,66,74,74,74,74,66,66,74,74,74,82,82,82,82,90,90,90,90,99,99,99,99,99,99,99,99,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,115,115,123,123,123,115,115,115,115,115,115,115,107,107,107,107,99,107,107,123,90,90,66,107,123,132,115,140,156,
189,189,189,189,189,189,189,189,189,189,189,181,189,181,140,74,66,74,66,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,66,57,57,57,66,57,66,66,66,74,74,74,82,82,90,90,99,99,99,107,99,99,99,99,99,99,99,90,90,82,82,74,74,74,74,66,66,66,57,66,66,66,57,57,57,57,57,82,123,123,82,57,66,74,74,74,74,66,66,66,66,66,74,74,82,82,82,82,90,90,90,90,90,90,90,90,99,90,99,99,99,99,99,107,107,107,107,115,115,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,148,140,140,148,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,115,123,123,115,115,115,115,115,115,115,115,115,107,107,90,99,99,99,107,82,82,57,99,123,132,165,181,181,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,156,132,82,66,57,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,66,57,57,57,57,66,66,74,74,74,82,82,90,99,99,107,107,107,107,99,99,99,99,99,90,90,90,82,74,74,66,66,66,66,66,66,66,66,57,57,66,66,66,74,90,165,189,189,181,148,90,74,66,74,74,66,57,99,82,57,57,66,66,66,74,82,82,82,82,90,82,82,82,90,90,90,90,99,99,99,99,99,99,107,107,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,140,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,123,123,123,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,107,99,90,90,82,90,107,74,57,107,148,173,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,165,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,66,66,74,74,74,82,82,90,99,107,107,107,107,107,107,107,99,99,99,90,90,90,82,74,74,66,66,66,66,57,66,57,57,66,57,66,66,57,148,181,189,189,181,189,181,181,165,148,132,115,107,132,173,181,123,66,66,66,74,74,66,74,74,74,74,74,74,74,82,82,82,90,90,90,90,99,99,99,99,99,99,99,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,165,165,165,165,165,165,165,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,148,148,140,148,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,123,132,123,123,123,123,115,115,115,115,115,115,115,115,107,107,107,107,99,99,99,107,99,90,82,66,66,107,173,181,189,181,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,165,123,107,90,107,90,66,66,57,57,57,57,57,57,66,57,57,57,66,66,57,66,57,66,66,66,66,66,74,74,82,82,90,90,99,99,99,107,107,107,107,107,107,107,107,99,99,90,90,82,74,74,66,57,57,66,57,57,74,74,82,82,74,99,132,165,189,189,189,189,189,189,189,181,181,181,189,189,189,189,189,189,132,99,66,82,66,66,66,66,66,66,66,66,66,66,74,74,82,82,82,90,90,90,99,99,99,99,99,107,107,107,107,107,107,115,115,115,115,115,115,115,115,115,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,165,165,165,165,165,165,165,165,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,140,140,140,140,140,140,140,132,132,132,132,132,132,132,123,123,123,123,123,115,115,115,115,115,115,107,107,107,107,107,99,99,90,82,82,82,99,99,57,115,181,189,198,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,181,181,181,181,198,123,57,57,66,66,57,57,57,57,57,57,66,57,57,57,66,66,66,66,66,74,74,74,82,82,82,82,90,90,99,99,99,99,99,107,107,107,107,107,107,107,99,99,90,90,74,74,74,66,57,66,66,66,148,173,181,181,181,189,189,189,189,189,189,189,189,189,189,140,82,74,90,123,123,132,156,189,189,181,173,173,165,148,123,99,74,66,74,74,74,74,74,66,74,82,82,82,90,90,90,99,99,107,107,107,107,107,107,115,115,115,115,115,115,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,165,165,165,165,165,165,165,165,156,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,123,123,123,115,115,115,115,115,115,107,107,107,107,107,99,90,90,74,66,57,66,74,74,148,189,181,189,189,181,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,148,123,115,156,189,189,189,198,181,140,57,49,49,57,57,57,57,66,66,66,57,66,57,57,66,66,74,74,74,74,82,82,82,82,82,90,90,90,99,99,99,99,107,107,107,107,107,107,107,107,107,99,99,82,82,74,74,66,74,66,74,99,189,189,189,148,181,189,189,189,189,189,189,189,189,189,189,189,173,132,66,57,57,49,66,156,189,189,189,189,181,189,189,181,140,57,57,49,57,57,57,66,66,74,74,82,82,90,90,99,99,107,107,107,107,107,115,115,115,115,115,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,123,123,123,115,115,115,115,115,115,107,107,107,107,107,107,99,90,82,82,90,82,66,74,173,181,181,189,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,156,90,107,148,181,189,181,148,132,82,66,57,57,66,57,57,57,57,49,57,57,57,57,66,74,74,74,74,82,82,82,82,90,90,90,90,90,90,90,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,90,82,66,66,90,140,115,123,148,189,189,189,99,99,156,189,189,189,189,189,189,189,189,189,181,189,189,90,66,66,66,74,165,189,189,189,189,165,132,99,74,66,66,57,66,57,57,57,57,66,66,74,74,90,90,99,99,107,107,107,107,107,115,115,115,115,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,123,123,123,115,115,115,115,115,115,115,115,107,107,107,107,107,107,107,107,90,90,82,57,115,156,189,181,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,181,181,189,189,156,148,82,66,57,57,57,57,57,57,57,57,57,57,66,66,66,74,74,82,74,82,82,82,82,90,90,90,90,90,90,90,82,82,90,82,82,90,90,90,90,90,90,90,90,90,90,90,99,99,107,82,74,107,74,82,115,181,181,181,189,189,165,148,181,189,189,189,189,189,189,189,189,189,189,189,132,66,66,66,115,189,189,189,189,189,107,57,57,57,49,49,57,49,57,66,66,74,74,82,82,82,90,90,99,99,107,107,107,107,107,115,115,115,115,123,123,123,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,148,148,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,148,148,148,148,148,140,148,140,140,140,140,140,140,132,132,132,132,132,132,132,123,123,123,115,123,115,115,123,115,115,115,115,115,115,115,115,115,107,99,99,82,74,66,66,66,99,123,148,181,189,189,189,189,189,189,189,189,
181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,148,66,57,66,74,90,115,90,66,74,57,57,66,66,66,74,82,82,82,82,90,90,90,90,90,90,90,90,90,90,82,82,82,74,74,82,74,82,82,82,82,82,82,82,82,90,82,82,82,82,90,90,66,57,57,82,90,90,82,82,99,181,189,189,189,189,189,189,189,181,181,181,189,189,189,189,189,189,165,123,140,173,181,181,173,173,173,165,99,66,66,66,66,66,66,66,66,66,82,90,90,90,90,90,99,99,107,107,107,107,115,115,115,115,115,123,123,123,132,132,132,132,140,140,140,140,140,140,140,148,140,148,148,148,148,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,148,140,140,140,140,140,140,140,132,140,132,132,132,132,132,123,123,123,123,115,115,123,115,115,115,115,115,115,115,115,115,107,107,107,107,107,90,57,66,90,173,140,148,173,181,181,181,181,181,181,181,
181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,132,140,148,173,165,156,123,165,90,66,66,66,74,82,90,90,99,99,99,107,107,99,99,99,107,99,99,90,74,82,74,74,74,74,66,66,66,74,74,66,74,74,74,74,74,82,82,82,74,74,74,49,57,57,66,57,66,132,181,173,173,181,189,189,189,189,181,189,181,181,181,189,181,181,181,189,189,189,189,189,189,181,181,181,173,173,181,173,148,115,82,74,74,66,82,82,90,82,82,90,90,99,99,99,107,107,107,107,115,115,115,115,115,123,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,140,140,140,132,132,132,132,132,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,148,148,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,123,123,123,123,123,115,115,115,115,115,115,115,115,115,115,107,107,107,107,99,66,82,181,173,156,173,173,181,181,173,181,181,181,181,
181,181,181,181,181,181,181,181,181,181,189,189,189,189,189,189,181,181,181,181,181,173,132,140,82,66,57,74,74,82,90,99,99,107,107,107,107,107,107,107,99,99,99,90,90,82,74,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,57,57,57,66,107,132,82,66,57,57,107,148,173,181,189,189,181,181,181,181,181,181,181,181,189,189,181,189,181,189,181,181,181,173,173,181,181,181,165,132,107,82,74,74,74,82,82,82,82,90,99,107,107,115,115,115,115,115,115,123,123,123,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,132,132,123,123,123,115,115,115,115,115,115,115,115,123,123,123,123,132,132,140,140,140,140,148,148,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,123,123,123,115,115,123,123,115,115,115,115,115,115,115,107,107,107,99,82,66,115,181,173,181,181,181,181,181,181,181,181,181,181,
181,181,181,181,181,181,181,173,181,181,173,165,156,148,148,148,148,148,148,165,173,181,189,181,165,132,107,107,82,74,82,82,82,90,82,82,99,99,90,90,90,82,82,82,74,66,66,66,74,74,74,74,74,66,66,74,74,66,57,57,57,57,66,57,66,66,66,57,57,57,57,57,66,57,57,57,57,66,66,74,74,90,132,189,181,181,181,181,181,181,181,181,181,181,189,189,181,181,181,181,181,181,181,181,181,181,189,181,181,165,156,140,140,107,90,66,66,74,90,107,115,115,115,115,115,123,123,123,123,132,132,132,132,140,140,140,140,140,148,148,148,148,148,148,156,156,148,148,148,148,156,156,156,156,156,156,156,156,148,148,148,148,148,140,140,132,132,132,123,123,115,115,107,107,107,107,107,107,107,107,115,115,115,115,123,132,140,140,140,140,148,148,156,156,156,156,156,156,156,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,123,123,123,123,123,123,115,115,115,115,115,115,107,107,99,99,90,74,66,115,181,181,181,181,181,181,181,181,181,181,181,181,
181,181,173,173,173,165,165,165,156,156,148,148,148,148,148,140,140,140,140,140,140,140,148,165,189,189,181,181,173,148,123,82,90,107,107,123,107,90,99,99,99,82,90,74,82,82,57,90,107,123,165,173,173,156,148,165,148,66,57,57,57,57,57,66,66,66,74,66,57,57,57,57,57,57,57,66,66,66,74,82,82,66,74,115,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,181,181,181,181,181,181,165,74,66,66,74,90,107,115,115,123,123,123,123,132,132,123,132,132,132,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,132,132,123,123,115,107,107,99,99,90,90,90,90,99,107,107,115,115,123,123,132,140,140,140,148,148,148,156,156,156,148,148,148,148,148,148,140,140,140,140,140,140,140,132,132,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,123,123,123,123,123,123,115,115,115,115,107,107,107,99,90,82,66,66,90,156,173,173,181,181,181,181,181,181,181,181,181,
181,181,173,165,156,156,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,148,156,181,181,181,189,189,181,181,181,165,189,181,165,165,140,165,90,115,148,140,165,107,156,156,148,189,189,189,181,189,148,82,66,66,66,66,66,66,66,66,66,66,66,66,74,74,57,66,74,66,74,82,82,82,90,107,82,66,66,115,181,181,181,181,181,181,181,181,181,181,181,181,181,181,189,189,181,181,181,181,181,181,173,181,181,181,181,181,189,189,165,140,82,66,66,82,99,107,107,123,123,123,132,123,123,132,132,132,140,140,140,140,140,140,148,148,148,148,148,148,148,148,140,140,132,140,140,140,140,140,140,148,148,148,148,140,140,140,140,140,132,132,123,123,115,107,99,99,82,66,74,74,82,99,107,107,107,115,123,123,132,132,140,140,140,148,148,148,148,148,148,148,148,148,140,148,140,140,132,132,132,132,132,132,132,132,140,140,132,140,140,140,140,140,140,132,132,132,132,123,123,123,123,115,115,115,115,115,115,115,107,107,107,99,99,99,82,74,82,66,132,173,181,181,181,181,181,181,181,181,181,
181,181,165,156,148,156,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,156,156,165,165,148,165,189,181,189,156,115,173,173,156,173,181,181,173,165,181,189,181,181,181,181,181,156,115,115,66,74,82,82,82,82,82,74,82,82,107,132,173,132,66,107,148,90,123,107,90,74,82,90,90,82,57,99,173,181,181,181,181,181,181,181,181,181,181,181,181,181,173,165,156,156,156,156,156,156,156,173,173,173,189,189,181,189,189,123,66,57,66,66,74,82,99,107,115,115,107,115,115,123,123,132,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,123,123,132,132,132,132,140,140,140,140,140,140,140,140,140,132,132,132,123,115,115,107,99,90,66,66,66,74,82,90,99,99,99,107,115,123,132,132,140,140,140,140,140,148,148,148,148,148,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,132,132,132,132,123,123,123,123,115,115,115,115,115,115,115,107,107,107,107,107,107,99,99,115,99,66,115,173,173,181,181,181,181,181,181,181,
181,181,173,156,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,165,173,173,181,181,189,181,181,173,181,181,181,181,181,181,181,181,181,181,140,156,140,132,140,165,165,173,165,140,123,156,181,181,189,189,181,148,115,189,140,173,156,148,148,132,66,66,90,66,82,173,181,181,181,181,181,181,181,189,189,189,181,173,165,156,156,148,148,148,148,148,140,140,148,148,148,156,165,181,189,189,181,165,123,82,57,66,74,90,99,82,90,90,107,115,123,123,132,132,132,140,140,132,132,132,132,123,123,123,123,140,132,132,115,115,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,132,132,123,123,115,107,99,82,74,57,57,66,74,74,82,90,99,107,115,123,123,132,140,140,140,140,140,148,148,148,148,148,140,148,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,132,132,132,132,123,123,123,115,115,115,115,107,107,107,107,107,107,107,107,107,107,107,90,99,90,99,74,90,115,181,173,181,181,181,181,181,
173,181,181,173,148,140,140,140,140,132,132,132,132,140,132,140,140,140,140,140,140,140,132,132,140,132,140,140,132,140,140,140,140,148,148,148,156,165,165,156,165,165,165,173,181,173,173,173,181,181,181,181,173,181,181,148,123,99,107,132,173,181,173,181,181,181,181,181,181,181,181,173,165,189,165,132,140,99,66,156,99,66,90,74,107,189,181,181,181,173,173,173,189,189,181,173,165,156,156,148,140,140,140,148,148,148,140,140,140,148,140,140,140,148,156,181,189,189,181,165,74,66,74,82,74,74,57,66,74,90,99,123,115,115,115,115,107,115,107,107,107,90,90,90,99,99,82,90,90,99,90,99,107,115,123,115,123,123,123,123,123,132,132,132,132,132,132,132,123,123,115,99,90,82,66,57,82,99,74,74,82,99,107,107,115,123,123,132,132,132,140,140,140,140,140,140,140,140,140,140,132,132,132,123,132,132,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,115,115,115,115,115,107,107,107,107,107,107,107,107,107,107,107,107,99,82,66,90,99,90,66,90,165,189,181,181,173,156,165,
165,173,173,165,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,140,132,140,140,140,148,148,148,140,148,148,140,156,165,173,181,189,181,173,173,181,156,173,173,173,181,181,173,173,181,181,181,181,181,181,181,181,181,181,181,181,181,181,173,165,115,99,66,66,107,66,74,82,57,123,189,181,181,181,173,173,165,165,165,165,156,148,148,140,140,140,140,140,140,140,132,140,140,132,140,140,132,132,132,140,156,165,181,189,165,115,90,115,74,132,115,123,140,107,74,74,74,74,74,74,82,82,90,82,82,82,82,66,57,66,66,74,66,74,66,74,90,90,99,107,99,99,107,107,115,123,123,123,132,132,132,132,132,123,123,115,107,99,82,66,57,74,181,123,57,82,99,107,107,115,115,123,123,132,132,132,132,140,140,140,140,140,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,123,123,115,115,115,115,107,107,107,107,99,99,99,99,99,99,99,99,107,99,74,74,74,66,82,107,140,181,173,156,156,165,165,148,
173,165,148,140,140,140,132,140,140,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,140,140,140,140,132,148,148,165,156,156,156,156,156,156,156,156,156,156,165,173,173,165,173,181,189,181,181,189,189,189,181,181,181,181,181,173,181,181,173,181,181,189,181,132,57,123,49,82,99,82,148,181,181,181,173,165,156,156,156,148,148,148,140,140,140,132,132,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,148,156,165,173,189,181,156,132,173,181,181,189,181,165,140,115,107,82,82,107,107,66,74,66,90,99,148,90,115,123,173,132,99,66,66,66,74,82,82,82,82,90,99,107,115,115,115,123,123,123,123,132,123,123,115,115,99,90,82,66,57,173,189,90,74,82,90,99,107,115,115,123,123,123,123,123,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,107,107,99,99,90,90,90,90,90,90,90,90,90,90,90,99,99,115,123,165,189,165,156,156,156,156,148,173,
148,148,140,132,140,140,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,148,140,148,140,156,140,148,156,148,148,140,148,148,148,148,140,140,140,140,140,140,132,140,148,165,156,148,148,165,173,181,181,189,181,181,181,181,173,140,189,173,74,82,107,74,90,82,90,173,181,181,181,173,156,148,148,148,148,148,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,132,140,165,165,173,181,181,189,181,189,198,198,189,198,189,198,189,181,181,181,165,165,132,181,181,206,181,189,189,198,189,181,165,148,90,74,90,90,99,74,74,90,107,107,115,115,115,115,123,123,123,123,123,115,115,107,99,82,57,66,173,181,165,99,107,74,82,90,99,107,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,107,107,107,115,107,115,115,123,123,123,123,123,115,115,115,123,115,115,115,107,99,99,90,82,82,74,74,74,74,82,82,74,82,156,173,189,189,181,173,156,148,156,156,148,148,140,140,
140,140,140,132,132,132,140,140,132,132,132,132,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,148,140,148,148,148,148,148,156,148,148,140,132,140,148,140,140,140,140,140,140,132,132,132,132,132,132,140,132,132,140,156,156,165,156,173,181,181,189,181,181,173,148,74,140,140,82,74,82,132,173,181,181,181,173,156,148,148,140,140,140,132,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,132,132,123,132,132,140,156,156,156,156,148,148,165,173,156,165,165,165,173,165,181,189,189,198,189,189,173,173,165,148,156,165,173,189,189,189,82,90,173,181,189,90,74,82,90,99,99,90,99,107,115,115,115,115,115,115,107,99,99,82,57,57,173,189,189,189,181,132,82,74,99,99,99,107,107,107,107,115,115,115,115,115,115,115,115,115,115,115,107,107,107,107,107,107,107,107,107,107,107,107,107,115,115,107,107,107,107,115,115,115,115,115,107,99,99,90,74,74,74,66,57,66,66,74,99,123,156,181,181,165,165,156,156,148,156,156,148,148,140,140,140,
148,148,140,148,132,132,140,132,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,132,140,140,132,140,140,140,140,140,140,140,140,140,132,132,132,140,132,132,132,132,132,132,132,156,140,140,148,148,148,148,148,156,165,181,189,181,181,165,173,181,107,99,132,181,181,181,181,181,173,165,156,148,148,140,140,140,132,132,140,132,132,132,132,132,132,132,132,132,132,132,123,132,132,123,132,123,123,123,123,123,132,132,148,156,156,140,148,140,140,140,140,156,156,148,148,156,165,156,156,156,148,148,140,140,140,140,140,148,156,181,189,148,173,181,173,189,165,107,82,82,82,82,82,82,99,107,107,99,99,99,90,90,82,82,74,74,66,107,189,181,173,181,181,132,74,74,82,90,90,99,99,90,99,107,107,107,107,107,107,107,107,107,115,107,107,107,90,90,90,82,82,82,82,90,90,99,107,107,99,99,99,99,107,115,115,115,107,99,82,74,74,66,82,99,99,107,140,90,165,181,181,181,165,156,148,148,156,148,148,148,148,140,140,140,140,140,
156,148,148,140,132,132,140,140,132,140,140,132,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,140,140,140,132,132,132,140,140,140,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,132,132,140,156,181,181,181,173,156,90,123,189,189,181,181,181,181,173,156,148,148,148,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,132,123,123,123,123,132,132,132,132,140,132,132,132,123,132,140,140,140,148,156,156,148,140,132,132,132,140,132,132,140,140,140,140,148,181,173,181,165,165,156,173,198,156,132,90,66,74,74,82,90,82,82,82,90,82,82,90,82,99,99,123,132,181,181,181,181,181,181,148,123,90,74,74,74,74,74,82,90,90,90,90,99,90,90,90,99,99,99,90,82,74,74,74,74,74,74,74,74,74,82,90,82,82,82,82,90,90,99,99,99,90,82,74,57,90,82,156,181,181,181,181,181,181,181,173,156,156,156,156,140,156,148,148,148,148,148,140,140,140,148,
148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,132,140,132,132,132,132,140,132,140,140,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,140,132,140,140,148,173,189,181,181,99,90,74,173,189,181,181,181,181,173,156,148,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,140,132,132,140,140,148,156,140,140,132,132,132,140,132,132,132,132,132,140,140,156,173,156,148,156,140,156,148,173,189,173,148,140,107,66,66,74,57,107,123,156,165,173,181,181,181,189,181,181,181,181,181,181,181,181,181,181,132,107,99,82,74,82,74,74,74,82,74,74,74,82,90,90,82,82,90,74,57,57,82,123,99,107,115,99,74,74,66,90,107,66,74,74,82,74,82,82,82,74,82,123,181,189,181,173,173,173,173,173,181,156,156,156,148,156,173,156,156,148,148,148,148,140,140,140,148,
140,140,156,148,140,148,148,140,148,140,140,140,148,140,140,140,140,140,140,132,132,132,140,132,132,140,132,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,123,132,132,132,132,132,132,132,123,123,132,132,132,132,132,132,132,132,140,140,140,148,140,156,181,181,165,165,99,107,148,173,181,181,173,173,156,148,148,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,123,132,140,132,132,132,140,148,140,140,132,123,132,132,132,132,132,132,132,132,132,132,140,165,140,132,132,132,132,140,148,156,165,181,181,165,74,74,82,74,140,189,173,181,181,173,173,173,165,173,181,181,173,165,165,181,181,181,189,189,181,181,173,173,148,132,140,132,123,123,123,82,74,74,90,115,140,173,123,66,66,107,181,181,181,181,189,165,156,115,173,189,115,90,82,82,99,115,132,148,156,173,173,181,181,173,173,173,173,173,173,156,148,148,148,165,156,156,148,148,148,140,148,148,148,140,140,140,
156,156,148,148,148,148,148,148,140,140,140,140,140,140,140,140,132,132,140,132,132,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,123,132,132,132,132,132,132,123,123,123,123,123,132,132,132,132,123,123,123,132,132,132,123,123,123,123,132,123,132,132,132,132,132,132,132,140,140,140,132,140,148,165,181,173,189,156,90,82,173,181,181,181,181,165,148,148,140,140,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,148,140,132,132,132,132,132,140,148,156,140,140,123,132,123,132,123,132,132,123,132,132,132,165,148,132,132,132,132,132,140,156,148,156,165,173,173,148,148,165,181,165,156,148,148,148,148,148,148,156,156,156,156,148,156,148,165,181,189,189,189,189,189,181,181,181,173,181,173,181,189,156,148,148,165,173,181,173,173,148,140,181,181,181,181,189,189,181,181,181,181,181,181,173,165,181,181,181,173,189,189,181,173,181,181,173,181,173,156,156,148,148,148,148,148,156,156,148,148,148,148,148,148,140,140,140,140,132,
156,165,156,156,156,148,148,148,148,148,140,140,140,140,140,132,140,132,140,132,140,132,140,140,140,140,140,140,132,132,132,132,132,123,123,132,132,132,123,123,132,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,148,123,132,132,132,132,132,132,132,140,140,140,140,140,140,165,181,173,181,140,82,123,189,181,181,181,173,156,148,140,132,132,132,132,132,132,132,132,123,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,148,156,148,132,123,123,132,132,140,140,148,132,132,123,123,123,123,123,123,123,123,132,132,148,156,132,123,123,123,132,140,140,140,148,156,156,156,156,173,148,148,140,140,132,132,148,148,140,148,148,148,148,148,148,140,140,140,148,156,148,148,156,156,165,173,181,181,189,189,189,181,173,181,181,189,189,173,181,173,173,173,181,181,181,173,156,156,165,173,181,181,181,181,173,181,181,189,181,173,165,165,156,156,148,148,148,148,148,148,148,148,148,140,148,156,148,148,148,140,140,148,140,140,140,148,140,140,148,
156,156,148,156,156,156,148,156,156,148,148,148,148,140,140,140,140,140,140,132,132,140,140,140,140,140,140,132,132,132,132,132,123,132,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,123,132,132,123,132,132,132,132,132,132,140,140,132,140,140,140,148,165,181,181,148,132,132,99,132,148,189,173,148,148,140,140,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,148,156,156,148,140,123,123,132,132,132,123,132,123,123,123,123,123,123,123,123,123,123,132,140,132,132,123,123,123,132,132,132,148,148,140,148,156,148,140,140,140,140,132,140,140,148,140,140,148,148,140,140,140,140,148,140,140,140,140,140,140,140,148,140,148,156,156,165,181,189,181,189,181,173,165,156,148,148,156,156,165,165,156,156,148,148,148,156,156,148,156,165,165,173,173,165,156,156,148,148,148,140,148,140,140,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,140,156,148,148,148,156,156,
148,148,148,148,148,148,148,156,156,156,148,148,148,148,140,148,148,140,140,140,140,140,140,132,140,140,132,132,132,132,123,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,123,132,132,132,132,132,132,132,132,148,140,140,140,148,148,156,181,181,181,165,165,115,140,156,181,165,156,140,140,140,132,132,123,123,123,123,123,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,148,148,148,132,132,132,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,156,156,165,173,165,165,148,148,156,148,140,140,148,148,156,156,148,140,140,140,140,140,140,140,140,148,148,148,140,140,148,140,140,140,140,140,140,140,140,140,140,140,140,148,140,148,148,148,148,148,148,148,140,148,148,156,156,148,156,148,156,
140,140,148,140,148,148,148,148,156,156,156,156,148,156,148,148,156,148,148,148,148,140,140,140,140,140,140,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,148,181,173,173,173,181,173,165,181,189,165,156,148,148,140,140,132,140,123,132,132,132,132,123,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,132,140,148,148,140,140,132,140,140,140,148,148,156,156,165,173,156,148,140,140,148,140,132,140,140,140,148,148,140,140,140,140,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,132,140,140,140,140,148,148,148,156,148,148,148,148,148,148,148,156,165,156,156,140,140,140,140,
140,140,140,140,140,148,148,148,148,156,156,156,156,156,156,148,156,156,148,148,140,140,140,140,140,140,140,132,123,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,132,123,132,132,132,132,132,132,132,132,132,132,132,132,140,140,148,132,173,181,165,140,173,181,173,156,148,140,140,140,140,148,148,140,148,140,123,123,132,132,132,132,123,132,123,132,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,115,115,115,115,123,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,123,123,123,123,123,123,132,132,123,132,132,132,132,132,132,132,132,140,140,140,132,148,156,156,156,148,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,140,140,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,132,132,132,132,132,140,140,140,140,148,148,156,156,148,156,148,148,156,148,156,165,148,140,132,132,140,140,140,
132,140,140,140,140,140,148,148,156,148,148,148,148,148,140,148,148,156,156,148,148,148,140,148,140,140,140,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,132,148,181,189,181,156,173,165,148,140,140,165,181,181,173,156,140,156,140,148,148,132,140,140,148,123,123,123,132,132,123,132,123,132,123,115,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,140,156,156,156,148,140,140,140,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,148,148,156,148,156,156,156,148,148,156,148,156,132,132,132,132,123,132,132,140,
132,140,140,132,140,140,140,140,148,140,140,140,140,140,148,148,140,148,156,148,148,148,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,148,140,140,132,123,140,156,181,181,173,173,156,148,165,173,181,189,156,140,140,165,148,148,156,140,148,132,140,140,140,132,132,132,123,123,123,123,132,123,132,123,123,123,123,123,123,115,123,115,123,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,140,132,140,140,148,156,165,156,148,140,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,148,148,140,148,156,156,148,156,156,148,140,132,132,132,123,132,132,132,132,132,
132,140,132,140,132,132,140,132,132,132,140,132,132,132,140,140,140,140,148,156,156,148,148,148,148,140,140,140,140,140,132,140,132,132,132,140,132,132,123,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,148,148,140,140,140,132,132,140,140,156,165,148,165,156,181,148,140,140,156,165,148,165,165,156,148,165,156,148,165,123,123,140,132,140,140,140,140,140,132,123,123,123,123,123,123,123,123,123,115,123,123,115,123,115,123,123,123,115,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,123,132,132,132,132,132,132,140,148,140,140,148,165,165,165,148,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,148,148,148,148,148,148,148,148,140,132,140,132,132,132,123,123,123,123,132,132,132,
132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,148,148,156,156,148,148,148,140,148,140,140,140,140,140,132,132,132,132,132,132,132,132,123,132,123,132,123,123,123,123,123,123,123,123,123,132,123,123,123,123,123,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,140,132,140,140,140,140,140,140,148,140,132,132,140,140,132,140,165,156,148,165,165,156,156,148,165,173,148,132,140,132,140,148,140,140,132,132,123,123,123,123,115,123,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,140,156,165,165,165,156,165,165,165,148,132,123,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,123,132,132,132,123,132,132,123,123,123,132,132,132,132,123,132,132,132,132,132,132,132,140,140,148,148,148,148,148,148,148,140,140,132,132,132,123,123,123,123,123,123,123,123,123,132,
132,123,132,123,123,132,132,132,132,132,132,132,132,140,140,140,148,140,148,148,156,156,148,148,148,148,140,140,140,140,132,140,140,132,132,132,140,132,132,132,132,123,123,123,123,123,123,123,115,123,123,123,123,132,132,123,123,123,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,140,140,140,140,140,132,140,132,140,140,140,132,140,148,140,140,148,156,165,140,140,156,148,156,156,148,148,156,148,148,156,165,148,140,132,132,140,148,140,140,140,132,132,123,123,123,123,132,123,132,123,123,123,115,123,115,123,123,115,115,115,123,123,123,123,123,115,123,123,115,123,123,123,123,123,123,123,123,123,115,115,123,115,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,132,132,123,140,165,173,173,173,165,165,165,165,140,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,123,123,132,123,123,123,123,132,123,123,132,123,123,123,132,123,123,123,132,132,132,132,132,140,140,140,140,148,148,148,148,148,148,132,140,132,123,132,132,123,123,123,115,123,115,123,123,123,123,
123,132,123,123,132,123,132,132,132,132,132,132,132,132,140,140,140,140,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,148,140,140,140,140,132,132,132,132,132,132,132,132,123,123,132,123,123,123,132,132,132,132,123,123,123,132,148,132,123,123,123,123,123,123,115,123,123,123,123,132,132,123,132,132,140,140,140,148,140,140,140,140,140,132,132,132,140,140,140,140,148,148,148,148,148,148,140,148,156,148,148,148,148,148,148,165,148,123,140,132,132,140,140,123,132,132,123,123,132,123,132,115,123,132,132,132,123,115,123,123,132,115,115,115,123,115,123,123,123,123,115,115,115,115,123,123,123,123,123,115,123,123,123,123,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,123,123,123,148,165,173,165,165,165,165,148,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,132,123,123,123,132,132,132,123,123,132,123,123,123,123,132,123,132,132,132,132,132,140,140,140,148,148,148,140,148,140,140,132,140,140,132,123,123,123,115,115,123,115,123,123,123,123,123,
123,123,123,132,132,132,123,123,132,132,132,132,132,132,132,132,140,140,140,148,148,148,156,156,148,148,148,140,140,140,148,148,140,148,140,140,140,140,132,132,132,132,123,132,123,123,123,123,123,132,132,123,123,123,132,132,123,123,132,123,123,123,123,123,123,115,123,123,132,123,123,123,123,123,132,132,132,132,140,132,140,140,132,140,140,140,140,140,132,132,132,132,140,140,140,148,148,148,148,140,148,148,148,148,148,140,140,140,148,156,148,123,123,132,123,123,132,132,132,148,140,140,148,140,140,140,148,132,132,132,123,132,123,123,115,115,115,115,115,115,123,123,123,123,115,123,115,123,123,123,115,115,115,115,123,123,123,123,123,123,123,115,115,123,123,123,123,123,123,123,123,123,123,132,123,123,123,140,140,140,140,148,156,165,165,165,148,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,132,123,123,123,123,123,132,132,132,132,132,140,140,140,148,148,148,140,140,140,140,140,132,140,140,140,132,123,123,123,123,115,115,115,115,115,123,115,123,
123,123,123,123,123,132,123,132,132,132,132,132,132,132,132,132,140,140,140,148,148,148,148,156,148,148,148,140,148,148,148,148,140,148,140,140,140,140,132,140,140,123,132,132,140,132,140,140,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,123,132,140,140,123,156,148,140,140,140,140,140,140,140,140,132,140,132,132,132,140,140,148,140,140,148,148,148,140,148,140,140,148,148,156,156,140,123,132,123,132,123,132,132,132,132,132,140,148,156,148,140,132,132,140,132,132,132,123,115,123,115,115,115,115,123,123,123,132,123,132,123,123,115,115,115,115,115,115,123,123,115,115,123,123,123,123,115,115,115,115,115,123,123,123,123,123,123,123,123,140,165,173,165,173,156,148,156,156,165,165,140,132,132,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,132,132,132,123,132,132,140,140,148,148,148,148,140,140,140,140,140,132,148,132,140,123,123,115,115,115,115,115,115,115,115,123,123,123,
123,123,123,123,123,123,132,132,132,132,123,132,132,140,132,132,140,140,140,140,148,148,148,148,156,148,148,148,148,156,148,148,148,140,140,140,140,140,132,132,132,132,148,148,140,140,140,140,140,132,140,132,132,132,132,132,132,123,132,123,123,115,123,123,115,123,115,123,123,123,123,132,132,132,132,132,132,148,173,181,173,140,140,140,132,132,132,140,132,140,132,132,140,140,140,132,140,148,140,148,148,140,132,140,148,140,148,148,173,165,115,132,132,132,123,132,132,132,123,132,132,132,140,148,156,148,140,132,140,132,140,140,123,123,123,123,123,123,115,123,123,132,123,132,148,123,123,123,115,115,115,123,123,115,123,123,123,123,123,123,123,123,123,123,115,123,123,123,132,123,123,123,123,132,140,156,148,140,140,156,148,148,148,156,148,132,132,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,148,148,140,140,140,140,140,140,140,140,140,132,123,123,123,123,123,123,115,115,115,115,123,123,123,
123,123,123,123,123,123,132,132,132,132,132,132,132,132,140,132,132,132,140,148,140,140,148,148,148,140,140,148,148,156,148,148,148,148,140,140,140,140,132,140,148,156,148,148,148,140,140,140,140,132,140,140,132,132,132,132,132,140,123,132,123,115,123,123,123,123,123,123,123,123,123,132,132,132,132,132,148,148,115,107,132,140,132,123,123,123,123,123,140,148,140,132,132,140,140,140,140,148,140,148,140,140,165,156,156,156,156,173,165,132,123,132,132,123,132,123,132,132,132,132,140,140,140,140,148,148,148,140,132,140,140,148,148,140,123,132,123,123,123,123,132,132,132,140,140,123,123,115,115,115,123,115,123,115,123,132,132,132,132,123,123,123,123,115,115,115,123,132,132,132,123,132,123,132,156,148,132,132,132,140,148,148,165,156,156,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,140,132,140,132,132,132,132,132,132,132,123,123,123,123,123,123,132,132,132,132,132,140,132,132,140,148,148,148,148,148,132,140,140,140,140,132,132,140,132,132,132,115,148,156,140,115,115,115,115,123,123,123,123,
123,123,123,123,123,123,132,132,123,132,132,123,132,132,132,132,140,140,148,148,140,140,140,140,140,140,140,140,148,148,156,148,148,148,148,148,148,140,148,148,148,156,156,148,148,148,140,140,140,140,132,140,132,132,132,132,132,132,132,123,123,115,123,132,132,123,123,123,123,123,132,132,132,132,132,148,156,107,90,57,99,165,173,165,173,173,173,181,165,132,123,132,140,140,132,140,132,140,140,148,165,156,165,173,115,115,115,115,115,123,140,140,132,132,132,132,132,132,132,132,140,148,140,148,156,148,156,165,165,148,156,148,148,148,140,132,123,123,123,123,132,132,132,140,140,132,123,123,115,115,115,115,123,123,132,140,140,140,132,132,132,132,123,140,140,132,123,123,123,132,132,123,123,132,132,132,132,132,140,140,165,165,165,156,148,132,123,123,132,132,132,132,132,132,132,132,140,140,148,140,132,132,132,132,140,140,140,132,132,132,132,132,132,132,132,132,123,123,132,132,132,132,132,140,132,140,140,140,148,148,148,156,148,132,140,140,132,132,132,132,148,123,123,132,140,156,165,173,165,123,115,115,123,123,123,123,
123,123,123,115,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,140,140,140,140,148,148,156,156,148,148,156,140,140,132,140,140,148,148,148,148,148,148,148,148,140,140,140,140,140,140,132,132,132,132,132,132,132,132,123,123,123,123,132,123,123,123,123,132,132,132,132,132,132,148,90,107,90,82,173,181,181,181,181,189,189,173,165,173,173,156,132,123,132,132,140,148,165,173,189,181,181,148,140,132,123,115,115,123,132,140,132,132,132,132,132,132,132,140,140,148,148,148,156,156,156,156,148,148,165,156,148,140,140,140,140,132,132,132,140,140,140,140,140,140,140,123,123,115,115,115,123,123,132,140,156,148,140,132,132,132,132,132,165,148,123,123,123,123,132,123,123,123,132,132,132,132,148,156,156,173,165,165,140,132,148,132,132,123,132,132,132,132,132,132,140,140,140,140,140,140,132,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,140,140,140,148,148,148,148,140,132,132,132,132,132,132,132,140,132,123,123,132,165,165,173,173,165,132,115,123,123,123,115,
123,123,115,123,115,115,115,123,123,123,123,123,132,132,132,132,132,132,140,132,132,132,132,140,140,140,148,148,156,156,148,140,132,132,132,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,140,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,132,132,132,132,132,132,156,132,90,107,74,132,189,181,181,181,181,173,165,148,148,148,165,173,173,140,156,156,173,181,173,148,148,165,156,148,156,148,140,132,123,123,132,140,132,132,132,132,132,132,140,140,140,148,148,148,156,156,156,156,148,148,156,148,156,156,140,140,140,140,132,140,140,148,148,148,148,140,140,132,123,115,123,115,123,123,132,140,156,148,148,165,156,148,156,132,140,140,132,132,132,123,123,123,123,132,132,132,132,132,148,173,165,173,165,156,148,156,140,132,132,123,132,132,132,132,132,132,140,132,140,140,132,140,140,140,140,140,140,140,140,132,132,132,132,132,132,123,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,132,132,132,132,132,132,132,132,123,140,140,132,132,156,173,173,173,181,181,148,123,123,123,123,
123,123,115,115,115,115,115,123,123,123,123,132,123,132,132,132,132,132,132,140,132,132,132,140,140,140,148,148,140,140,132,123,132,132,140,132,140,140,140,140,148,148,148,156,148,148,140,140,140,140,140,140,140,132,132,132,132,123,132,132,132,123,123,123,123,123,123,123,123,132,132,132,140,140,165,99,82,66,107,156,189,181,181,181,181,165,173,173,165,156,148,140,140,140,140,140,140,148,148,140,140,165,140,140,148,140,148,140,123,123,148,140,132,132,132,132,132,140,140,140,148,148,148,148,156,156,156,156,156,156,148,140,148,148,148,148,140,148,140,140,148,148,148,148,148,148,140,132,123,115,115,115,123,132,132,140,148,165,156,173,148,148,140,132,140,132,132,132,132,123,123,123,123,132,132,132,132,132,148,181,181,181,173,173,148,140,140,132,132,132,132,132,132,132,132,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,123,132,132,132,140,140,140,140,148,148,148,148,140,140,148,132,140,140,140,132,132,132,132,132,140,132,140,132,165,173,173,181,181,181,173,123,123,123,123,
123,123,115,115,115,115,123,123,123,123,123,132,132,123,132,132,132,132,132,132,123,132,132,140,132,140,132,140,148,132,132,132,132,132,132,132,132,140,140,140,140,148,148,156,156,148,140,140,140,140,140,132,140,132,132,132,132,132,132,123,132,123,123,123,123,123,132,123,132,132,132,132,140,140,165,107,66,57,66,173,181,189,189,181,173,107,107,181,173,165,156,156,156,156,148,148,148,148,140,140,140,140,132,132,165,156,148,148,132,148,132,132,123,132,132,132,132,132,140,140,148,148,156,156,156,148,156,156,148,148,148,140,132,140,140,148,148,148,156,156,156,140,148,140,148,140,140,140,123,132,115,123,123,123,132,140,148,156,156,148,148,140,132,123,123,132,132,132,132,123,123,123,132,132,132,132,140,140,156,173,181,181,165,148,140,140,140,132,132,132,132,132,132,132,132,132,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,123,132,132,140,140,140,140,140,140,148,156,148,140,140,140,140,132,132,123,132,132,132,132,132,132,140,140,132,132,156,173,173,181,181,181,173,140,123,123,123,
132,123,123,115,115,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,132,132,132,132,140,132,140,140,132,132,132,132,132,132,132,132,132,140,140,140,140,140,148,148,148,148,140,140,140,140,140,140,132,132,140,132,132,132,132,123,123,123,123,123,132,123,132,132,132,132,132,140,140,140,148,74,49,57,74,189,189,181,189,189,189,181,181,181,173,165,165,156,156,156,148,148,148,165,148,140,132,132,123,140,156,140,132,132,132,148,140,132,132,132,132,132,132,140,140,140,140,148,156,156,156,148,148,148,165,148,140,140,140,140,132,140,148,148,140,140,140,140,132,140,132,132,132,140,140,123,123,123,123,123,132,132,148,148,148,140,140,132,132,132,132,132,140,140,132,123,123,132,132,132,140,156,156,165,181,181,181,181,148,140,140,140,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,140,140,140,140,140,148,148,148,148,140,140,140,132,132,132,132,132,132,132,132,132,132,132,140,140,132,156,173,173,181,181,181,181,165,123,123,123,
123,140,132,123,115,123,123,123,123,123,123,123,123,132,123,123,123,123,132,132,132,132,132,140,132,132,132,132,132,132,132,123,132,123,132,132,132,132,140,140,140,140,148,148,148,148,148,148,140,140,140,140,140,140,132,132,132,132,132,132,123,123,123,123,123,123,132,132,132,132,140,140,140,156,132,74,57,49,66,156,189,181,189,189,189,189,189,181,173,165,165,156,156,148,156,165,173,173,165,148,123,123,132,132,132,132,123,123,132,148,132,132,132,132,132,132,132,140,140,140,140,148,148,156,156,156,148,148,148,140,156,148,132,132,132,140,140,148,140,140,140,140,132,132,132,123,140,123,132,132,132,123,123,123,132,132,140,140,140,132,132,132,123,132,132,123,132,132,132,123,123,123,123,132,148,156,165,165,181,181,181,173,148,140,140,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,140,140,132,132,132,140,140,140,148,148,148,148,148,148,140,140,140,132,132,132,132,140,132,132,132,132,132,132,132,132,148,156,148,181,181,181,181,173,173,165,140,123,123,
132,148,173,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,140,132,132,132,132,123,132,132,132,132,123,132,132,132,132,140,140,140,140,148,148,148,148,156,148,148,148,140,140,140,140,140,132,132,132,132,132,132,132,123,123,132,132,132,132,132,132,132,140,140,132,156,115,74,57,57,49,74,189,189,189,189,189,181,181,181,173,173,165,156,156,148,148,148,156,156,165,156,132,115,132,123,123,123,123,123,140,132,132,132,132,132,132,132,132,140,140,140,140,148,148,148,148,148,148,148,140,140,148,148,148,132,132,140,132,132,132,132,132,132,132,132,132,123,123,132,132,132,132,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,132,132,173,173,156,173,132,173,181,173,156,148,140,140,140,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,148,140,148,140,140,140,140,140,140,140,132,140,140,140,140,140,140,140,148,140,148,148,140,140,132,140,132,132,132,132,132,132,123,123,132,123,123,132,132,156,148,181,181,181,181,181,181,173,165,165,148,
156,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,123,132,132,132,132,123,132,132,123,132,123,132,140,140,140,140,148,148,148,148,148,148,148,156,148,148,140,140,140,132,132,132,132,132,132,132,123,123,132,132,132,132,132,132,132,132,132,140,132,156,107,74,57,57,57,57,156,189,189,189,189,181,181,181,173,173,140,123,115,115,115,115,123,123,123,123,123,123,132,123,123,123,115,140,132,132,132,132,140,140,132,132,132,132,140,140,156,148,148,148,140,140,140,140,140,140,140,140,132,148,132,140,132,132,132,132,132,132,132,132,132,123,123,123,132,132,140,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,156,165,165,173,181,140,181,165,156,148,148,140,140,140,140,132,132,132,132,132,140,140,140,140,140,148,148,140,148,140,148,148,148,148,140,140,140,140,140,140,140,132,140,140,140,132,132,140,140,140,140,140,140,140,148,140,140,140,132,132,123,132,156,148,132,132,123,123,123,132,132,132,140,148,173,173,173,181,181,181,173,165,173,173,
165,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,140,132,132,132,132,123,123,132,123,123,123,123,132,132,132,140,140,140,140,140,140,148,148,148,148,156,148,148,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,148,115,82,57,57,57,57,82,173,189,189,181,181,173,181,156,123,123,123,115,115,115,115,115,115,115,115,115,115,123,123,123,123,132,132,132,132,132,132,132,132,132,140,140,140,140,148,148,148,148,140,140,132,140,140,140,140,140,140,148,156,140,132,140,132,123,132,123,123,132,132,123,123,123,123,123,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,140,156,156,165,181,181,181,173,156,156,148,148,140,140,140,140,140,132,132,140,132,140,140,140,140,148,148,148,148,148,148,140,148,148,140,140,140,140,140,140,140,140,132,132,132,132,140,140,140,132,140,140,140,140,140,140,132,132,132,132,132,148,148,165,140,123,132,123,123,123,123,123,140,123,148,181,189,173,173,173,173,173,165,165,173,
181,132,123,123,123,123,123,123,123,123,123,123,123,132,123,123,123,123,132,132,123,132,132,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,132,132,132,132,132,123,132,132,132,140,132,132,132,132,140,132,132,140,140,148,165,82,57,57,57,57,57,156,189,189,181,173,156,140,123,115,123,115,115,115,107,107,115,115,115,115,115,115,115,115,115,123,123,132,132,132,132,132,132,132,140,140,140,140,148,156,165,148,148,140,140,140,140,140,140,132,132,132,132,140,140,140,132,132,132,132,132,123,123,123,123,123,123,115,123,132,140,148,132,140,132,132,132,132,140,140,140,140,140,132,132,140,140,132,132,132,132,132,148,148,165,181,181,189,189,173,156,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,132,132,132,132,140,132,132,132,132,132,132,132,140,140,140,132,132,132,132,140,156,165,165,140,123,123,123,123,123,123,132,132,132,148,173,165,181,165,165,165,165,173,181,189,
156,132,123,123,123,123,123,123,123,123,123,123,123,132,123,132,123,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,140,140,132,140,140,140,140,148,148,156,148,148,148,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,132,140,140,140,90,66,57,57,57,132,181,189,189,181,173,148,132,115,115,115,115,107,115,115,115,123,115,115,115,115,115,115,115,123,123,123,123,132,132,132,132,132,132,140,140,140,148,148,148,148,156,148,140,140,140,140,140,140,132,132,132,132,156,148,132,123,123,123,123,123,115,123,123,123,123,115,115,123,132,140,140,148,140,148,140,132,140,132,140,148,148,140,140,148,140,140,132,132,132,132,132,132,140,165,181,189,181,181,165,148,140,148,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,148,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,132,132,132,148,165,173,148,132,123,123,123,123,132,123,123,132,123,156,165,156,156,173,173,165,165,156,165,165,
140,132,132,132,123,123,123,123,123,123,123,123,123,123,132,123,123,132,132,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,148,148,148,148,148,148,140,140,140,140,140,140,140,132,132,132,132,132,140,132,140,140,140,140,140,140,140,132,140,148,140,74,57,57,57,66,181,189,189,189,189,173,148,132,115,115,115,115,115,115,115,115,123,115,115,115,115,115,115,115,123,115,123,123,123,132,132,132,132,140,140,140,148,148,156,148,148,140,140,140,140,132,132,132,132,132,123,132,148,148,123,123,123,132,132,132,123,115,123,123,123,115,115,115,115,123,140,140,148,148,148,156,156,148,165,148,165,148,148,181,173,156,140,132,132,132,132,132,132,132,148,173,165,148,156,148,140,140,140,140,140,140,140,140,140,140,140,140,140,148,140,140,148,148,148,148,148,148,140,140,140,140,140,140,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,132,148,165,148,132,132,132,123,123,123,123,123,123,132,132,148,132,66,66,156,165,165,156,156,148,140,
140,132,132,132,123,123,123,123,123,123,115,123,123,123,123,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,140,140,140,140,148,148,148,148,156,148,148,148,140,140,140,140,140,140,132,132,132,132,140,132,140,140,140,132,132,140,140,148,148,156,148,165,90,57,57,57,49,132,181,189,189,189,173,148,123,115,115,115,115,115,115,115,123,123,123,115,123,123,115,115,115,123,123,123,123,132,123,132,132,140,132,140,148,140,156,148,148,148,140,140,140,132,132,140,140,140,132,123,132,140,132,132,123,123,123,123,123,132,132,132,123,123,115,115,115,115,115,132,132,156,148,156,148,156,173,165,156,165,165,148,181,173,148,140,132,132,132,132,132,132,132,140,148,156,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,140,140,148,148,140,148,140,140,140,140,140,132,140,132,132,132,132,132,132,132,132,132,123,132,132,132,123,132,132,132,132,132,132,123,132,132,132,165,148,132,132,123,123,132,123,123,123,123,123,123,123,132,123,57,66,123,165,165,165,156,148,148,
165,156,156,140,140,123,132,123,123,115,115,123,123,123,132,132,123,140,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,148,148,148,148,148,140,140,140,140,140,140,132,132,140,132,132,132,132,132,140,132,140,148,140,140,140,156,148,173,115,66,57,57,57,66,132,189,189,189,173,148,123,115,115,115,115,115,115,123,123,123,123,123,123,123,115,115,115,123,123,123,132,132,132,132,132,132,140,140,140,148,148,148,140,140,140,140,140,140,156,140,132,132,132,140,140,132,132,132,123,123,123,123,123,123,132,132,123,123,123,115,115,115,123,132,132,140,156,156,156,156,165,165,173,165,156,148,156,148,140,140,132,132,132,132,123,123,123,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,140,140,140,140,140,140,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,132,123,132,132,132,132,123,123,123,132,140,140,132,140,132,123,123,123,123,123,123,123,123,123,132,156,82,57,90,181,165,173,165,156,148,
181,181,181,173,148,140,123,123,123,123,123,123,123,132,132,123,123,132,123,123,123,123,123,123,123,123,115,115,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,140,132,132,132,132,132,132,132,140,140,140,140,140,148,148,148,140,148,173,156,66,66,57,57,57,107,189,189,189,173,156,132,123,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,115,123,123,132,132,132,132,132,140,140,140,140,148,148,140,148,140,140,140,140,140,140,148,132,132,132,140,132,132,132,123,123,123,123,123,123,123,132,132,123,123,123,115,115,115,123,123,132,132,148,165,156,156,148,156,165,165,156,148,148,140,140,140,132,132,132,123,123,123,123,123,132,140,140,140,140,140,148,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,123,132,123,123,123,123,132,132,123,132,132,123,123,123,132,148,156,140,148,140,123,123,123,123,123,115,123,123,123,123,132,156,82,57,123,181,173,173,165,173,
181,189,189,173,165,156,140,132,123,123,123,123,123,140,123,123,123,123,123,123,123,123,123,115,123,123,123,115,123,123,123,123,123,123,123,123,123,123,132,132,132,140,140,140,140,140,148,148,148,148,148,140,140,140,140,132,132,132,140,132,132,132,132,132,132,140,140,140,148,148,148,140,140,140,165,132,82,66,57,49,57,82,189,189,181,181,156,132,123,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,148,148,140,140,140,140,140,140,132,132,132,140,148,132,123,132,132,132,148,132,123,123,123,123,123,123,123,123,123,123,115,123,115,115,115,123,123,132,140,148,156,156,156,148,148,156,156,156,156,148,140,140,132,132,123,123,123,123,123,132,132,132,132,140,140,140,148,148,148,140,140,148,148,140,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,123,132,123,123,132,123,123,123,123,123,123,123,132,123,123,123,132,123,107,148,148,140,123,123,123,123,132,123,123,123,123,132,140,165,165,82,66,181,189,181,181,181,
181,181,173,173,173,165,165,156,140,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,115,123,123,115,123,115,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,132,132,132,132,132,132,132,132,132,140,140,148,148,148,140,140,140,140,165,123,90,57,66,66,49,66,123,189,189,189,165,140,123,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,148,148,148,148,140,140,140,140,132,132,132,148,132,132,140,132,132,123,132,140,140,123,123,123,123,123,123,123,123,132,123,123,123,123,123,115,123,123,132,140,148,156,148,148,148,148,148,148,148,140,140,132,132,132,123,123,123,123,123,123,132,132,132,132,140,140,148,148,148,148,148,148,140,148,148,148,148,156,148,148,148,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,140,90,49,132,140,140,123,123,132,123,123,123,123,123,140,132,140,165,173,140,57,115,181,181,181,173,
156,156,156,156,156,165,156,148,132,132,123,123,140,123,123,123,123,123,123,123,123,123,123,123,115,115,123,123,115,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,148,156,148,148,148,140,140,140,140,132,132,132,132,132,132,132,140,140,148,140,148,156,148,140,140,140,140,156,132,90,57,66,66,49,82,181,189,189,189,181,156,123,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,148,148,148,148,140,140,140,132,132,132,132,140,165,173,148,132,123,123,132,132,140,140,123,123,123,123,115,123,123,140,140,132,140,123,115,123,123,123,132,132,148,148,156,148,148,148,148,148,148,140,140,132,132,132,123,123,123,123,123,123,132,132,132,132,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,132,140,132,132,132,132,132,132,132,132,132,132,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,148,74,57,123,132,123,123,123,132,123,123,123,123,123,132,132,140,165,173,165,66,90,140,148,156,156,
156,148,148,148,148,140,140,132,132,132,115,140,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,123,115,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,148,140,148,148,148,140,140,140,140,132,132,132,140,140,140,140,140,140,148,132,148,140,140,140,140,140,140,140,156,115,57,66,66,66,66,90,140,148,189,189,189,173,132,123,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,148,156,148,148,140,140,140,140,140,132,132,140,148,148,132,132,123,123,123,123,123,132,140,123,123,123,123,123,123,132,148,148,140,132,123,123,115,123,132,132,140,148,156,148,148,148,148,140,148,140,140,132,123,123,123,123,123,123,123,123,132,132,132,132,132,140,140,148,148,148,148,148,148,140,148,148,148,148,148,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,132,148,90,90,132,132,123,132,123,132,132,123,123,123,123,123,132,148,173,173,181,99,132,99,140,148,148,
156,148,140,140,140,132,132,132,132,123,148,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,132,132,132,140,140,148,148,148,148,148,140,140,140,140,132,140,132,140,140,140,140,148,148,140,148,140,140,140,140,140,140,140,140,148,123,57,57,66,66,49,57,57,82,189,189,189,181,156,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,132,140,140,148,148,148,148,148,148,148,140,140,140,132,132,132,132,132,132,123,123,123,123,132,123,132,132,148,123,123,123,123,123,132,140,148,156,140,132,123,123,123,132,132,140,140,156,148,148,148,148,148,140,140,132,132,132,123,123,123,123,123,123,132,132,132,132,132,132,132,140,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,132,140,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,148,181,181,181,165,132,123,123,123,132,132,123,123,123,123,132,132,156,173,173,181,165,189,115,115,140,148,
148,140,140,132,132,132,132,132,123,132,123,123,123,123,123,123,132,123,123,123,123,123,115,115,115,123,115,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,140,140,140,148,148,148,148,140,140,140,140,132,132,132,140,140,140,148,148,148,140,140,140,132,132,132,132,132,132,140,140,156,66,66,49,66,57,57,57,82,189,189,189,189,173,132,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,148,148,140,148,148,140,148,140,156,140,132,123,123,123,123,123,123,123,123,123,123,132,123,140,123,123,123,123,123,123,148,156,148,132,132,140,132,123,123,123,132,140,148,156,148,148,148,140,140,132,140,132,132,123,123,115,123,123,123,132,132,132,132,132,132,140,140,148,156,148,148,148,140,140,140,148,148,148,140,140,140,140,140,132,132,132,132,132,132,132,132,123,132,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,123,123,123,132,156,173,189,189,165,140,123,123,132,132,132,123,123,123,123,140,140,156,173,173,173,181,165,74,74,165,148,
140,140,132,123,123,132,132,132,132,140,123,123,123,123,132,132,132,123,132,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,140,140,148,148,148,148,140,140,140,140,140,132,132,140,140,140,140,148,148,140,140,140,132,132,140,132,140,132,132,132,156,57,66,66,57,57,57,57,66,132,156,181,189,181,148,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,148,148,156,148,148,140,148,148,156,156,140,132,123,123,123,123,123,123,115,115,123,123,123,140,123,123,123,123,123,115,123,140,156,148,140,132,132,132,123,123,123,123,132,140,156,148,148,156,148,148,140,132,132,132,123,123,123,115,123,123,132,132,132,132,132,132,132,140,148,156,148,140,140,140,140,140,140,140,148,140,140,140,140,132,132,132,132,132,132,123,132,132,123,132,132,123,123,123,123,123,123,115,123,123,123,123,115,115,115,115,115,123,115,123,140,173,181,173,181,181,132,123,132,132,132,123,123,123,123,132,148,156,148,173,181,173,181,165,66,66,140,148,
140,140,132,123,123,123,132,123,156,123,123,123,123,123,123,123,123,123,123,123,123,123,115,115,123,115,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,132,140,140,148,156,148,148,140,140,140,140,132,140,132,140,140,140,148,148,148,148,140,140,132,140,140,132,132,132,132,140,148,57,74,57,57,57,57,57,57,57,66,107,181,181,165,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,132,132,132,140,140,148,156,148,148,148,148,148,148,140,132,132,123,123,123,123,123,123,123,123,123,123,123,132,132,123,123,123,123,123,123,132,148,140,132,132,140,140,123,115,123,123,132,140,148,148,140,156,156,140,140,132,132,123,123,123,123,115,123,123,132,132,132,132,132,132,132,140,148,165,148,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,123,132,123,132,132,132,132,123,132,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,115,115,115,132,132,90,107,90,107,173,140,132,123,123,123,123,123,123,123,123,140,156,165,173,181,173,173,189,74,66,90,148,
148,140,132,123,123,123,123,132,140,123,123,123,123,123,132,123,123,123,123,123,123,115,115,115,115,115,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,132,132,132,140,140,140,148,156,156,148,140,140,140,132,140,140,140,132,140,148,148,148,148,140,140,140,132,140,132,140,132,132,140,140,140,49,74,57,49,57,57,57,66,57,57,57,148,181,165,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,140,132,140,140,140,140,140,140,148,156,140,140,140,140,148,140,148,140,132,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,123,123,123,115,132,148,148,132,132,132,132,132,115,123,123,123,132,148,148,140,148,156,165,156,140,132,132,123,123,123,123,123,123,132,132,132,132,132,132,132,140,148,165,156,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,123,123,123,123,132,132,132,132,123,123,115,115,123,123,123,115,123,115,115,115,115,115,115,115,115,132,132,57,57,57,66,49,82,132,123,123,123,132,132,123,123,123,123,156,165,165,181,181,165,165,173,82,140,140,156,
132,140,123,115,123,123,123,132,132,132,123,123,123,123,123,123,123,115,123,123,115,115,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,132,132,132,132,140,148,156,156,148,148,140,140,140,140,140,140,148,148,140,148,148,140,140,140,132,140,132,132,140,140,132,132,132,132,156,57,82,66,57,57,57,57,57,57,57,57,107,189,173,140,132,123,123,123,123,123,123,123,123,123,123,123,132,132,132,140,132,132,132,132,132,132,140,140,148,148,140,140,148,140,140,148,140,140,140,132,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,148,132,115,132,148,148,140,132,132,132,132,115,123,123,123,123,140,148,140,140,148,156,148,140,140,132,123,123,123,123,123,132,132,132,132,132,132,132,132,140,140,156,156,140,140,140,140,140,140,140,132,140,140,132,132,132,132,132,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,115,115,115,115,115,115,115,115,115,115,123,181,107,57,57,49,57,66,49,99,132,123,132,132,123,123,123,123,140,165,165,165,173,165,165,165,173,107,173,165,156,
132,132,115,115,115,123,123,123,132,132,123,123,123,123,123,123,115,115,115,115,115,115,123,123,115,123,123,123,123,123,132,132,132,132,132,132,132,132,140,132,140,132,132,132,140,140,156,156,148,148,140,140,140,140,140,140,140,140,148,148,148,148,148,140,140,140,140,132,140,140,132,132,132,140,132,156,82,90,90,66,57,57,57,57,57,57,57,123,189,181,156,140,132,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,140,148,148,148,140,140,140,140,140,148,132,132,132,123,123,123,123,123,123,123,132,123,123,123,123,123,132,132,140,181,173,140,123,140,132,123,132,132,132,140,115,115,123,123,123,132,148,148,140,140,148,148,140,140,132,132,123,123,123,132,132,132,132,132,132,132,132,132,140,148,148,156,148,140,140,132,140,140,140,132,140,132,132,132,132,132,132,123,123,132,123,123,123,123,115,115,123,123,123,123,115,115,115,115,115,115,115,115,115,107,115,140,165,181,90,57,57,57,57,57,66,90,123,123,132,132,132,123,123,132,148,156,173,165,156,156,156,165,132,165,173,148,156,
140,140,115,115,115,123,123,132,123,123,123,123,123,123,123,123,115,115,123,123,115,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,132,132,140,148,148,148,148,148,148,148,140,140,140,140,148,148,148,140,140,140,140,140,140,140,140,132,140,140,140,140,140,140,132,132,148,115,74,90,66,57,57,57,57,57,57,57,156,181,189,173,148,132,123,123,123,123,123,132,123,123,123,132,132,132,132,132,132,132,132,132,140,140,140,148,148,140,148,140,140,140,140,140,140,140,132,123,132,123,123,115,123,123,123,123,123,123,123,123,132,140,165,189,181,156,132,123,123,132,132,132,132,140,123,115,123,123,123,132,148,140,140,140,140,140,148,140,132,132,123,123,123,132,132,132,132,132,132,132,132,132,140,148,148,148,148,140,132,140,132,140,140,140,132,132,132,132,132,132,132,123,132,123,123,115,115,115,115,115,115,123,132,123,115,115,115,123,123,115,115,115,123,148,148,173,148,123,66,57,57,57,57,57,57,74,123,123,132,132,123,123,123,148,148,165,173,165,156,148,165,173,99,173,165,156,156,
132,140,115,115,115,123,132,123,123,123,123,123,123,123,123,123,115,115,115,115,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,148,132,132,132,140,148,140,140,148,148,140,148,140,148,148,148,148,148,140,140,140,148,140,148,140,140,140,132,140,132,140,140,140,140,132,140,132,132,140,82,99,66,57,57,57,57,57,57,82,148,123,148,181,156,140,132,123,123,123,123,132,132,123,132,123,132,132,132,140,140,132,140,140,140,140,140,140,140,148,140,140,140,132,140,140,140,148,132,132,132,123,123,123,123,123,123,123,123,123,132,123,132,148,165,156,181,173,156,123,132,132,132,132,148,140,132,115,115,123,123,140,148,148,140,140,140,132,132,148,140,140,123,123,123,123,132,132,132,132,132,132,132,140,140,148,148,148,148,140,140,132,140,132,132,140,132,132,132,132,132,132,132,132,123,123,115,115,123,123,132,123,156,123,82,132,132,132,132,123,123,123,123,132,165,165,181,148,148,99,57,57,57,57,57,57,57,57,123,123,123,132,132,123,132,148,165,165,173,148,156,173,156,173,156,181,156,148,156,
132,148,123,115,115,123,115,123,123,123,115,115,115,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,132,132,132,132,148,140,140,140,140,132,140,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,156,66,123,66,57,57,57,57,57,57,82,74,57,74,181,165,148,132,132,123,123,132,132,123,123,132,132,132,132,140,140,123,132,140,140,140,140,140,140,140,148,148,140,140,132,132,132,132,148,148,132,132,132,123,123,123,123,123,123,123,123,123,132,132,165,99,57,99,123,123,148,140,132,132,140,156,148,140,115,123,123,123,140,165,165,148,132,132,132,140,148,148,132,132,123,123,123,132,132,132,132,132,132,132,132,140,140,148,148,148,156,140,140,140,132,132,132,132,132,132,132,132,132,132,123,123,115,115,115,123,156,156,156,156,66,57,66,148,148,156,156,132,123,132,156,165,181,181,82,148,66,57,57,57,57,57,57,57,49,115,123,123,123,132,123,132,156,165,173,156,148,165,165,165,181,181,165,156,148,156,
148,148,123,115,115,115,123,115,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,148,132,140,140,140,140,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,156,156,140,132,132,156,66,115,57,57,57,57,57,57,57,57,57,57,57,148,181,156,148,140,132,132,132,132,132,132,132,132,132,132,140,156,132,132,132,132,132,140,140,140,140,140,140,140,140,140,132,132,132,132,148,148,140,132,132,123,123,123,123,123,123,123,132,132,148,165,57,57,57,66,57,66,115,140,140,132,156,156,148,123,123,123,123,148,173,165,148,132,132,132,132,140,148,140,132,123,123,123,132,123,123,132,132,132,132,132,140,148,148,148,140,148,140,140,148,140,140,132,132,132,132,132,132,123,132,132,115,115,115,123,132,156,156,148,173,66,49,49,66,66,66,156,181,165,156,173,173,189,148,57,107,66,49,57,57,57,57,57,57,57,90,132,123,123,123,132,148,156,173,165,148,156,156,165,173,173,156,156,148,148,148,
156,140,132,123,115,123,123,123,123,115,115,115,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,132,132,123,132,132,140,140,140,148,140,140,140,140,148,140,140,148,148,148,156,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,140,148,82,132,66,57,66,57,57,57,57,57,57,57,57,90,189,173,148,140,132,132,132,132,123,132,132,132,132,140,140,140,148,140,132,132,132,132,140,140,140,140,156,140,140,132,132,140,140,140,140,148,148,132,156,123,123,123,123,123,123,132,132,140,156,165,66,57,57,57,57,49,66,132,140,140,140,165,156,123,123,123,123,148,173,165,148,140,132,132,132,132,140,132,132,132,123,132,123,123,132,132,132,132,132,140,140,148,148,140,140,140,140,140,148,148,140,132,132,132,132,132,123,123,132,132,123,115,115,115,123,148,132,148,189,90,66,57,49,57,57,90,165,181,181,181,189,189,99,57,66,57,57,57,57,57,57,57,57,57,57,140,123,132,140,148,148,165,173,156,148,165,165,156,156,165,156,140,140,156,148,
156,140,132,123,115,123,115,115,115,123,123,123,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,140,148,148,148,140,148,140,148,148,148,148,156,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,140,90,132,66,57,57,57,57,57,57,57,57,57,57,66,181,173,148,140,140,140,132,132,132,132,132,140,140,132,140,140,140,132,132,132,132,132,132,140,140,148,148,148,140,140,140,132,132,140,140,140,140,132,140,123,123,123,123,123,123,132,140,148,173,181,57,57,66,66,66,74,57,82,140,140,140,156,165,123,123,123,132,148,173,165,140,140,140,132,132,132,132,140,140,132,123,123,123,123,123,132,132,132,132,140,140,148,148,140,140,148,148,140,148,156,140,132,132,132,132,148,165,156,156,140,115,123,123,123,123,123,123,132,173,90,57,57,57,57,57,66,74,82,156,181,173,115,66,57,57,57,57,57,57,57,57,57,57,57,57,115,123,123,140,132,148,165,173,156,148,173,165,140,140,156,148,140,140,140,148,
156,132,140,115,115,123,115,115,115,123,123,123,123,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,140,140,140,132,132,132,132,140,140,90,132,66,57,66,57,57,57,57,57,57,57,57,57,148,181,148,148,140,140,140,140,140,132,140,156,156,156,140,140,140,132,132,132,132,132,132,140,140,140,148,148,140,140,140,132,132,132,140,132,140,132,148,123,123,123,132,132,123,132,140,156,181,148,49,66,74,66,74,74,74,57,115,148,140,148,148,123,123,123,132,148,165,156,140,132,132,132,132,132,132,132,140,140,123,123,123,123,123,132,132,132,132,140,140,148,140,140,140,132,140,140,148,165,140,132,123,132,156,156,156,156,148,140,115,123,123,123,123,123,123,123,156,66,57,57,57,57,57,57,57,66,66,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,132,123,132,140,165,173,173,156,148,173,156,132,140,156,148,140,140,140,148,
156,140,148,115,115,123,115,115,123,123,123,123,123,115,123,123,123,123,123,123,123,132,132,123,123,123,123,132,132,140,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,148,148,148,140,140,140,140,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,140,132,132,132,140,140,82,132,66,66,57,57,57,57,57,57,57,57,66,57,99,165,165,148,140,140,140,140,132,140,156,173,173,165,140,140,140,132,132,132,132,132,132,132,140,140,148,148,148,140,132,132,132,132,132,132,140,132,140,132,123,123,123,123,123,132,148,156,181,107,57,57,66,66,74,74,90,74,90,140,140,148,156,132,123,123,132,156,156,156,148,132,123,123,123,132,132,132,140,140,132,123,132,132,132,132,132,132,132,140,148,148,148,140,132,140,132,140,148,165,156,140,148,165,165,156,156,156,140,132,123,123,123,123,115,123,123,123,148,57,57,57,57,57,57,57,66,57,66,66,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,74,132,123,148,140,165,165,173,165,140,156,148,140,140,165,148,132,132,132,156,
165,148,140,115,123,115,115,115,123,115,123,123,123,123,123,123,123,123,123,123,123,132,132,123,123,132,123,132,132,132,132,140,132,132,132,132,132,140,140,140,140,140,140,140,148,140,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,140,132,132,132,132,140,99,140,74,57,57,57,57,57,57,57,57,57,57,57,57,132,181,165,148,140,140,140,140,132,156,173,173,148,140,140,140,132,123,132,123,132,132,132,132,140,148,148,140,140,140,132,132,132,132,132,132,156,148,148,123,123,123,123,132,132,148,173,189,74,57,57,57,57,66,74,82,90,66,156,156,148,156,132,123,123,123,140,156,165,148,132,123,123,123,132,132,132,132,140,132,123,123,123,132,132,132,132,140,140,148,148,140,140,140,132,132,140,140,156,165,156,156,156,156,148,148,148,140,132,123,123,123,123,115,115,123,123,148,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,140,123,132,148,156,165,173,156,148,148,148,148,156,165,148,132,132,132,156,
165,156,140,123,115,115,115,115,123,123,123,123,123,123,115,123,123,123,123,123,123,132,132,132,123,123,132,132,132,132,132,132,132,132,132,132,132,140,132,140,140,140,140,140,140,148,148,148,148,148,148,148,140,148,140,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,132,140,132,132,132,132,132,99,156,90,66,57,57,57,57,57,57,57,57,57,57,57,90,181,165,148,140,132,140,140,132,140,148,156,140,132,140,140,123,123,123,132,132,132,132,140,140,140,148,140,140,140,132,132,132,132,132,132,132,148,132,123,123,123,123,132,140,148,173,173,66,57,57,57,66,66,66,82,107,74,115,165,156,165,123,123,123,123,140,156,156,148,140,132,123,123,123,123,123,132,132,140,132,132,132,132,132,132,132,132,140,148,140,140,132,140,132,132,140,140,165,148,156,140,156,148,148,140,148,132,123,123,123,115,123,115,115,115,140,140,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,140,132,123,156,156,165,173,156,140,148,165,148,148,148,148,132,132,140,156,
156,165,140,132,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,132,132,132,132,132,132,140,140,132,140,140,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,148,140,140,140,140,140,148,148,148,148,140,140,140,140,140,140,132,140,132,132,132,132,107,140,107,74,57,66,57,57,57,57,57,57,57,49,49,57,148,173,148,140,132,140,132,132,132,132,140,148,165,156,140,132,123,123,123,132,132,132,132,140,140,148,148,140,140,132,132,132,132,123,132,132,140,132,123,123,123,123,123,132,156,189,123,57,49,57,57,66,66,66,74,90,57,66,156,156,156,132,123,123,132,132,156,148,148,148,123,123,123,123,123,123,123,132,140,140,132,132,132,132,132,132,140,140,148,140,140,132,132,132,132,140,140,148,140,140,132,148,156,140,148,156,132,123,132,123,123,123,115,115,123,165,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,140,132,123,140,148,165,165,156,148,148,165,148,148,156,148,132,132,140,148,
165,165,132,132,140,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,148,156,148,140,132,132,132,132,132,140,140,140,140,140,140,140,140,148,140,140,140,148,148,148,148,148,148,148,148,140,148,140,140,140,140,140,140,140,148,148,140,140,140,140,140,132,140,132,140,132,132,132,107,132,140,74,66,57,57,57,57,57,57,57,57,57,57,66,123,181,148,140,148,148,148,132,132,132,132,140,140,132,123,123,123,123,123,123,132,132,132,140,140,148,140,140,132,132,132,132,132,132,123,132,132,140,123,123,123,123,123,132,148,173,74,57,66,57,57,66,66,66,74,82,66,57,140,165,165,140,123,132,132,132,148,156,148,156,123,123,115,123,123,123,115,123,132,140,140,132,132,132,132,140,140,148,140,140,132,132,132,132,132,132,140,140,132,132,132,140,140,132,148,148,123,132,132,123,123,115,115,115,132,181,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,165,140,132,148,140,165,165,156,140,148,156,148,148,148,148,140,132,140,148,
165,156,148,132,132,123,132,115,115,115,115,115,115,123,123,123,123,123,123,123,132,132,132,132,148,165,148,140,132,132,132,132,140,140,140,132,140,140,140,140,140,140,140,140,140,148,148,156,148,148,156,148,148,148,148,148,148,140,140,140,140,140,140,140,140,148,140,140,140,140,140,132,140,140,140,132,132,123,115,148,115,66,57,57,57,57,57,57,57,57,49,57,57,123,181,156,148,156,148,140,140,123,132,132,132,123,123,115,123,123,123,123,123,132,132,132,140,140,148,140,140,140,132,132,132,123,123,123,123,132,148,123,123,123,123,123,132,156,156,57,57,66,57,57,66,74,66,74,82,74,57,132,165,165,140,123,132,132,132,148,165,165,140,123,115,115,115,123,123,115,123,123,132,140,140,140,140,140,140,148,148,140,140,140,132,132,132,132,132,140,156,132,123,132,132,132,132,140,132,123,123,123,123,123,115,115,115,156,165,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,156,132,132,148,140,165,165,156,140,148,148,140,148,148,140,132,132,132,140,
156,156,156,132,123,123,123,115,115,115,115,115,123,123,123,123,123,123,123,123,132,132,132,148,156,148,140,132,132,132,132,132,132,140,140,140,140,140,140,140,140,148,140,140,148,148,156,156,148,148,148,148,156,156,148,148,140,140,140,140,148,148,140,140,140,140,140,132,140,140,140,140,140,140,140,140,132,132,115,165,140,82,57,57,57,57,57,57,57,57,57,57,57,123,189,165,156,156,156,148,140,132,132,132,132,123,123,123,123,123,123,123,123,123,132,132,140,140,148,140,140,132,132,132,132,132,132,123,123,123,148,156,132,123,123,123,140,165,140,57,57,57,57,57,57,66,74,74,82,82,57,132,165,165,140,123,132,132,132,148,156,156,132,123,123,115,123,123,123,123,115,123,132,140,132,140,140,140,148,148,140,140,132,140,140,132,132,132,132,148,156,132,123,123,132,132,123,123,132,123,123,123,123,115,115,115,132,173,156,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,156,123,132,140,156,165,173,156,140,148,156,148,132,140,132,123,132,132,140,
165,156,156,140,123,115,115,123,115,115,123,123,123,123,123,123,123,123,132,132,132,132,132,156,132,132,132,132,132,132,132,132,140,132,140,140,132,140,140,140,140,140,148,148,148,156,148,148,148,148,148,148,148,148,148,156,156,148,148,148,148,140,140,140,140,148,148,148,148,140,132,140,140,140,132,132,132,132,107,156,156,82,57,57,57,57,57,57,57,57,57,57,57,107,189,181,156,156,148,140,132,132,132,132,132,123,123,123,123,123,123,123,132,132,132,132,140,148,140,140,132,132,132,132,132,132,123,123,123,123,132,156,156,123,123,132,140,173,132,66,57,57,57,57,57,66,74,74,74,74,49,140,181,165,148,132,132,132,132,156,156,148,132,123,123,115,115,123,123,123,123,123,123,132,123,140,140,148,148,148,140,140,132,132,140,132,132,132,132,140,156,123,123,132,123,123,123,115,140,148,123,123,123,123,115,123,140,181,165,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,82,156,132,123,148,148,165,173,156,140,156,156,148,140,132,132,123,132,132,148,
165,165,165,140,123,115,115,115,115,115,115,115,115,123,123,123,123,123,132,132,132,132,132,132,140,132,132,132,132,132,132,132,140,140,140,140,148,140,140,140,140,148,148,148,148,148,148,148,148,140,140,140,140,140,140,148,148,156,156,148,140,148,148,156,148,148,140,148,132,148,132,132,132,132,148,140,140,132,115,156,156,90,57,57,57,57,57,57,57,57,57,57,57,66,173,189,165,156,156,148,140,132,132,132,123,123,115,115,123,123,123,132,132,123,132,132,140,140,148,140,140,132,132,132,123,123,123,123,123,123,123,140,165,132,123,132,140,173,123,66,66,57,57,57,57,66,66,57,57,74,57,66,140,165,148,140,132,132,140,90,66,123,132,123,123,123,123,123,123,123,115,123,123,132,132,132,140,140,148,140,140,140,132,132,132,132,132,132,123,140,156,123,123,123,123,123,123,115,115,140,123,123,123,123,123,140,140,173,156,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,123,156,132,132,148,173,165,173,156,140,148,165,156,140,132,132,123,132,132,148,
165,165,165,148,115,115,115,115,115,115,123,123,123,123,123,123,132,132,123,123,132,132,132,140,140,132,132,132,132,132,132,132,140,132,140,140,148,140,148,156,148,148,148,148,148,148,140,140,148,140,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,140,140,148,140,140,132,132,132,132,132,140,132,148,99,156,156,99,66,66,57,57,57,57,57,57,57,57,66,57,90,173,173,165,156,148,140,132,132,132,123,123,123,115,115,123,123,123,132,132,132,132,132,140,148,140,140,132,123,123,123,123,123,123,123,123,123,140,165,132,123,132,140,173,99,66,66,66,66,66,57,66,57,66,57,57,57,57,57,156,148,140,140,140,148,66,49,90,132,123,123,123,123,123,123,123,123,123,132,132,132,132,140,148,148,140,140,132,132,132,132,132,132,132,123,132,148,123,123,123,123,123,115,115,115,123,123,115,115,123,148,140,148,173,140,57,57,49,57,57,57,57,57,57,57,57,57,49,49,57,57,57,57,57,57,57,57,57,57,57,57,74,173,140,123,156,148,165,165,173,156,140,148,165,156,140,132,132,132,132,132,148,
165,165,165,148,123,115,115,115,115,115,115,123,123,123,132,132,132,123,132,123,123,132,123,148,132,123,132,132,132,132,132,140,132,140,140,148,148,148,148,148,140,140,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,140,132,132,132,132,132,132,140,132,132,82,132,156,115,57,57,57,57,57,57,57,57,57,57,57,57,66,82,173,181,173,148,140,140,132,132,123,123,123,115,115,115,115,115,123,123,132,132,140,140,148,140,132,132,123,123,123,123,115,115,123,123,123,148,156,123,123,132,148,181,90,74,74,66,66,66,66,57,57,57,66,57,49,57,57,148,148,148,140,140,140,57,57,74,140,132,123,123,132,132,123,123,123,132,132,132,140,140,140,148,140,140,140,132,132,132,132,132,132,132,132,140,148,123,123,123,123,123,115,115,115,115,123,115,123,123,148,148,132,173,156,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,132,181,156,140,156,148,156,165,165,148,140,156,165,156,140,140,132,132,132,132,148,
165,156,165,140,140,115,115,115,115,115,123,123,123,132,132,132,123,123,132,132,132,140,132,132,123,132,123,132,132,132,148,140,140,140,148,148,140,140,140,140,140,140,140,140,148,148,148,140,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,140,132,148,132,132,132,132,132,140,140,148,90,132,165,140,57,57,57,57,57,57,57,57,57,57,57,66,57,57,82,107,173,148,148,132,132,132,123,123,123,123,115,115,123,123,123,123,132,132,132,132,148,140,132,132,132,123,123,123,123,123,115,123,132,148,156,140,132,140,148,181,90,66,74,74,66,66,66,57,57,57,57,66,57,57,57,148,148,148,148,148,132,66,57,66,148,132,132,123,132,132,132,123,132,132,132,132,132,140,140,148,140,132,132,132,132,132,132,132,132,132,132,132,140,123,123,123,115,123,115,115,115,123,123,123,115,123,140,148,123,148,165,66,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,57,49,57,165,181,181,156,156,156,156,165,156,156,140,156,173,156,123,115,123,132,132,132,148,
165,156,165,148,140,115,115,115,115,115,123,123,132,123,132,132,123,123,132,132,140,132,123,132,132,132,132,132,132,140,132,132,148,140,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,140,140,140,140,140,140,132,132,140,132,140,140,132,132,132,132,132,132,148,148,140,132,132,123,132,132,140,148,82,148,165,140,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,115,173,148,140,132,132,132,123,123,115,115,115,123,123,123,123,123,132,132,140,140,140,140,132,132,123,123,123,123,115,115,123,123,140,156,140,132,140,156,181,74,66,82,74,66,57,57,66,57,57,57,57,57,57,57,148,148,140,148,148,140,57,57,57,132,132,123,132,132,132,132,132,132,132,132,132,132,140,148,148,140,132,132,132,132,132,123,132,123,132,132,132,140,123,123,123,123,123,123,115,115,115,123,123,148,123,148,132,123,132,165,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,123,181,181,173,148,156,148,165,165,156,148,132,140,156,140,140,156,140,123,132,132,140,
165,156,156,165,148,115,115,115,115,115,123,123,123,132,132,132,123,132,132,132,132,132,132,123,132,132,132,132,140,156,140,165,148,140,140,140,140,132,140,140,140,140,140,140,140,148,148,140,140,140,140,140,140,140,140,140,132,132,140,132,132,140,132,132,132,132,140,132,140,156,140,132,123,132,123,132,132,140,90,165,165,140,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,74,181,148,140,132,123,132,132,123,123,115,115,115,115,123,123,132,132,132,140,140,148,140,132,123,123,132,123,115,115,115,115,123,132,148,140,132,140,165,165,57,66,82,74,66,57,57,57,66,57,49,57,57,57,66,165,148,148,156,148,156,66,49,57,123,123,123,132,132,123,132,132,132,132,132,140,140,140,148,148,140,132,132,132,132,132,123,123,123,123,132,132,140,123,123,123,123,123,123,115,115,115,115,148,148,123,140,132,123,115,165,165,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,165,189,181,173,148,173,156,165,165,173,140,99,156,173,132,156,148,148,165,132,132,140,
165,165,156,173,148,123,115,115,115,123,123,123,123,132,132,123,132,132,123,132,132,132,132,123,132,132,132,132,132,140,156,140,132,140,140,140,132,132,140,140,140,140,140,148,140,148,148,148,140,140,140,140,140,140,140,140,132,132,140,132,132,140,132,132,132,132,132,132,140,148,148,132,132,123,123,123,132,148,82,156,156,140,74,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,156,148,140,132,148,140,140,123,123,123,115,123,123,123,123,123,132,132,132,140,140,140,132,132,132,123,123,115,115,115,115,123,140,140,148,140,148,173,123,49,66,82,74,66,57,57,57,57,66,57,57,49,57,82,173,148,148,148,148,165,90,57,66,107,132,123,123,140,165,132,123,132,132,140,140,140,148,148,148,140,132,132,132,123,123,123,132,123,123,132,140,148,123,123,123,123,123,123,115,115,115,115,123,132,123,123,123,115,148,173,181,156,99,66,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,49,57,74,181,181,181,165,156,156,173,165,173,156,123,148,156,148,148,156,148,148,148,148,140,140,
156,165,156,173,140,132,115,123,123,123,123,123,123,123,132,132,140,132,132,132,132,132,132,132,132,132,132,132,140,148,140,132,140,140,140,140,132,140,140,140,140,148,148,148,140,148,148,148,140,140,140,140,140,140,132,140,132,132,132,132,132,140,132,132,132,132,132,132,132,140,148,132,132,123,123,123,140,148,90,156,156,140,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,115,156,165,156,140,132,132,132,132,123,123,123,123,123,123,123,132,132,132,140,148,140,132,132,123,123,123,123,123,115,115,115,123,132,140,165,165,181,90,66,66,74,66,66,57,57,66,57,66,66,57,57,57,82,181,156,148,148,148,165,115,57,74,90,132,123,123,132,140,148,132,132,140,132,148,148,148,156,148,140,132,132,132,132,123,123,123,123,123,123,132,148,123,132,123,123,123,123,115,107,115,115,115,123,115,123,123,132,165,173,173,189,181,140,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,132,189,181,181,148,148,156,173,165,173,140,156,156,165,123,156,148,140,148,148,148,140,140,
156,165,156,165,148,132,123,115,123,123,123,123,123,123,123,140,132,123,132,132,140,132,140,132,132,132,132,132,148,140,132,140,148,148,140,132,132,140,140,140,140,140,140,140,140,148,148,148,148,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,148,140,132,132,123,123,140,140,107,156,165,140,82,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,90,181,148,132,132,140,132,123,123,123,123,115,123,123,115,123,132,132,140,140,148,140,132,132,123,123,123,123,115,123,115,115,123,123,123,148,173,181,57,66,66,74,66,66,57,57,66,57,57,66,66,57,57,57,156,165,156,148,148,156,123,49,82,74,132,123,123,132,132,140,148,123,140,165,165,156,148,148,140,140,140,132,123,123,123,123,123,123,123,123,140,156,132,132,123,123,123,115,115,115,115,115,115,115,115,115,132,140,165,173,173,181,189,189,181,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,107,181,181,181,173,156,148,148,181,165,148,140,173,156,140,123,165,148,148,148,148,140,140,140,
165,165,156,165,156,132,123,140,123,123,123,123,123,123,140,132,132,132,123,132,140,132,132,132,132,132,132,140,140,140,148,156,156,140,132,132,140,132,140,140,140,140,140,140,140,140,148,148,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,132,132,123,132,148,115,148,156,132,74,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,82,189,148,140,132,132,132,132,123,123,115,123,115,123,123,132,140,140,140,148,148,140,132,132,132,123,123,123,123,115,115,115,123,115,123,123,156,140,57,66,66,66,66,57,57,57,57,57,66,66,74,66,57,57,82,173,156,148,156,165,107,57,66,57,140,123,123,123,132,148,165,148,140,140,148,148,148,148,140,132,132,132,132,123,123,123,123,123,123,123,132,156,132,115,123,123,123,115,115,107,115,115,115,115,115,115,123,132,148,165,165,181,189,181,189,132,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,173,189,173,173,165,148,148,156,156,156,140,148,156,148,132,140,156,148,148,148,148,148,156,148,
165,173,156,165,165,132,123,140,123,115,123,140,132,123,123,132,132,123,140,140,140,140,148,132,132,132,140,148,140,140,156,148,140,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,140,140,140,140,140,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,148,132,132,132,148,123,115,132,156,156,107,82,57,57,66,66,57,57,49,57,57,57,57,57,57,57,57,57,66,181,165,148,132,132,132,132,123,115,123,115,115,123,123,132,140,140,140,148,148,140,140,132,132,123,123,123,123,115,115,115,115,115,123,132,148,107,66,66,66,57,57,57,57,57,57,57,57,57,66,66,66,57,49,140,156,156,156,165,90,57,66,57,140,123,123,123,132,140,148,140,140,140,140,156,148,148,140,132,132,132,132,123,123,123,123,123,115,123,123,156,123,123,115,123,115,115,115,115,115,115,115,115,115,115,115,123,123,156,165,173,173,181,181,173,49,57,57,57,57,57,57,57,57,57,66,57,74,57,57,57,74,189,173,173,165,156,148,156,148,140,140,148,156,148,132,123,140,165,148,148,148,148,148,90,156,
173,165,156,156,165,140,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,165,140,132,140,132,156,148,140,156,148,140,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,148,148,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,148,132,132,123,140,82,156,156,148,115,57,57,57,57,57,57,57,66,57,66,49,49,57,57,57,49,57,57,173,148,140,132,132,123,123,123,123,123,123,123,123,123,132,140,148,148,148,140,140,140,132,132,132,123,123,123,123,115,115,115,115,123,132,148,99,66,66,66,57,66,57,57,57,57,57,57,57,66,66,57,57,57,66,132,156,156,173,107,57,57,49,132,123,123,123,132,132,148,165,140,140,140,140,148,148,132,132,132,132,123,123,123,123,123,123,123,123,132,156,123,123,115,123,115,115,115,115,115,115,115,115,115,115,115,123,123,156,156,156,156,181,181,173,82,57,57,57,57,57,57,57,57,57,57,66,165,74,57,57,99,173,173,181,181,165,156,156,148,148,132,140,140,148,132,123,148,156,148,148,148,156,156,156,156,
181,165,156,156,165,140,132,123,123,115,115,115,123,123,123,123,123,132,140,140,156,140,132,132,156,173,165,148,148,156,140,132,132,132,132,132,140,140,140,140,140,140,148,140,140,148,148,148,148,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,148,140,123,115,90,132,165,148,115,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,148,148,132,132,132,123,123,123,115,115,115,123,123,123,132,140,140,148,148,140,140,140,140,132,123,123,123,123,115,115,115,115,115,123,132,156,107,57,66,66,66,66,66,57,57,57,66,57,66,66,66,49,57,57,49,66,148,156,173,140,57,57,57,132,132,123,123,132,132,148,181,140,140,140,148,148,148,132,132,123,123,123,123,132,123,123,115,123,123,132,156,123,123,123,123,115,115,115,115,115,115,115,115,115,115,115,115,123,156,165,148,140,173,181,181,148,66,57,49,57,57,57,57,57,57,66,148,173,107,49,49,132,173,173,181,173,165,156,156,148,148,140,132,132,132,123,123,148,148,148,148,148,148,156,173,132,
173,156,156,156,165,140,123,123,123,123,115,115,123,132,123,123,132,132,140,132,140,132,132,165,173,173,165,165,165,148,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,123,132,123,132,132,148,148,115,90,99,165,156,123,66,49,57,66,57,57,57,57,49,57,57,57,57,57,66,57,57,57,57,57,148,140,132,132,132,132,123,123,115,115,123,123,123,132,132,140,140,148,148,140,140,140,132,140,132,123,123,123,115,115,115,115,123,123,132,148,107,66,66,66,66,66,66,57,57,57,57,66,49,49,49,57,57,57,57,57,99,156,156,181,132,66,49,99,140,132,132,132,132,140,189,165,140,140,148,148,148,132,132,123,123,132,123,123,123,123,123,123,123,123,156,123,123,123,123,115,115,115,115,115,115,115,115,115,115,115,115,123,148,115,115,115,148,173,189,181,115,57,57,57,57,57,57,57,57,148,189,189,132,57,57,140,165,173,181,173,156,140,140,148,148,140,132,132,123,140,123,156,148,140,148,148,148,156,156,173,
156,156,165,165,173,132,132,115,123,123,115,115,123,132,123,123,132,132,140,132,132,132,148,181,165,148,148,165,156,140,132,132,132,140,140,140,140,140,140,140,140,140,140,140,148,140,148,148,148,140,140,140,140,140,132,140,140,140,140,140,140,140,132,132,132,132,132,123,123,123,132,132,140,140,99,123,165,165,156,82,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,140,140,132,132,132,132,123,123,115,115,123,123,123,123,132,132,140,140,156,148,140,140,140,132,132,123,123,123,115,115,115,115,123,123,132,148,123,66,66,66,74,66,66,57,57,66,57,57,66,57,57,57,57,57,66,57,66,156,148,148,173,115,57,90,140,132,132,132,132,140,165,173,140,140,140,148,140,140,132,123,123,123,123,123,123,123,123,123,132,148,156,123,123,123,115,123,115,115,115,115,115,107,115,107,115,115,115,123,115,115,115,115,140,173,181,181,156,57,57,82,57,57,57,57,123,189,181,189,140,57,49,148,165,173,173,165,132,123,140,148,148,140,132,123,140,140,132,156,148,140,140,140,148,148,148,148,
156,165,165,156,132,123,140,132,123,123,115,115,123,123,123,123,123,123,132,123,132,140,165,165,165,148,140,148,148,140,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,140,140,132,132,140,140,140,140,140,140,132,132,132,132,123,123,123,123,123,132,140,132,74,156,173,156,156,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,132,132,132,132,132,132,123,123,123,123,115,123,123,123,123,132,140,140,156,148,148,140,132,132,132,123,123,123,115,115,115,115,123,123,132,140,140,66,66,74,74,66,66,57,57,66,66,66,57,49,66,49,66,57,49,57,66,156,148,140,148,173,66,99,140,132,132,132,132,132,156,165,140,140,148,148,140,140,132,123,123,123,123,123,123,123,123,132,140,165,156,123,123,115,123,123,123,123,115,115,123,115,115,115,115,123,115,123,140,123,115,115,132,165,181,181,189,107,82,173,66,57,57,57,123,181,189,181,140,57,115,173,165,173,148,132,123,132,140,132,156,148,140,123,132,140,165,148,140,140,140,148,148,148,148,156,
165,165,156,123,123,148,148,140,123,115,123,115,132,123,123,123,123,123,123,123,132,156,140,132,132,140,132,140,140,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,123,123,123,123,132,123,140,115,148,148,165,99,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,49,132,132,132,123,132,123,123,123,123,123,123,123,123,123,132,132,140,148,148,148,140,140,140,132,132,132,123,123,115,115,115,115,123,123,132,140,148,57,74,74,74,74,66,57,57,66,66,66,66,66,57,57,57,57,57,57,74,156,140,140,140,165,90,99,140,132,132,132,132,132,148,173,140,140,140,148,140,140,132,123,123,123,115,123,123,123,123,123,132,140,148,132,123,115,115,115,123,132,115,115,123,115,115,115,107,132,115,115,132,115,115,115,123,148,173,181,189,181,156,189,90,57,57,57,99,173,189,181,132,57,173,148,165,140,123,123,123,132,140,140,140,148,140,140,148,165,140,165,140,148,148,140,148,148,156,165,
165,148,148,140,148,148,132,123,123,115,123,132,148,140,123,123,123,123,123,123,132,132,140,123,123,132,132,132,140,140,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,140,140,140,140,132,132,140,140,140,140,140,140,140,140,140,132,132,132,123,123,123,132,123,132,148,132,140,90,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,99,140,132,132,132,123,123,115,115,123,115,115,115,123,132,132,140,148,140,140,140,140,140,140,132,132,123,123,115,115,115,115,123,123,132,140,148,82,74,82,74,74,66,57,66,66,66,66,66,66,49,66,57,57,57,57,74,156,140,140,140,140,148,123,132,132,132,132,132,132,140,156,140,140,148,148,140,140,132,123,123,123,115,123,123,123,123,132,123,132,148,123,123,123,115,115,140,123,115,115,132,123,115,123,140,148,115,115,115,115,115,115,115,156,165,181,181,189,189,189,123,57,57,57,74,181,189,189,148,57,156,148,148,132,123,123,123,140,156,156,140,148,140,140,148,165,156,148,140,148,140,156,148,148,148,140,
156,165,156,140,140,132,132,123,115,123,115,132,156,140,123,123,123,123,123,123,132,132,123,123,123,123,123,132,132,140,132,132,132,132,140,132,140,140,140,140,140,140,140,140,140,148,148,148,148,148,140,140,140,140,132,132,132,132,140,140,140,140,140,132,132,132,132,132,123,123,123,123,148,123,156,99,90,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,140,132,132,132,132,115,115,115,115,123,123,123,123,123,132,140,148,140,140,132,132,132,140,140,132,123,115,115,115,115,115,123,123,132,140,156,132,74,82,74,74,66,57,66,66,66,66,66,66,57,66,57,66,57,57,74,156,140,156,156,156,173,148,132,132,132,132,132,132,140,156,132,140,148,148,140,140,140,123,123,123,123,115,123,123,123,132,123,123,132,132,123,115,115,132,132,123,115,115,140,132,123,115,132,132,132,140,132,123,115,115,123,148,156,181,181,181,189,189,173,107,66,74,90,165,189,189,156,82,156,140,140,132,123,123,123,132,156,165,148,140,148,132,132,132,148,156,140,148,156,140,148,148,140,148,
165,165,140,132,132,123,123,123,115,115,123,140,156,148,123,123,123,123,123,123,123,123,123,132,132,132,123,132,132,140,132,132,132,132,140,140,132,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,140,132,140,132,132,140,140,140,140,140,140,132,132,132,132,132,132,132,123,165,115,148,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,49,115,140,132,140,123,115,115,115,115,115,123,123,123,132,132,140,140,140,140,140,132,132,132,132,123,123,115,115,115,115,115,123,123,132,140,148,156,66,82,74,74,66,57,66,74,66,74,66,66,66,57,57,57,49,57,90,165,156,148,140,148,156,156,132,132,132,132,132,132,140,173,148,140,140,148,140,140,140,132,123,123,115,115,123,123,123,132,123,123,132,132,123,115,115,123,140,123,115,123,132,123,123,123,123,123,140,140,132,132,123,123,132,132,148,181,189,181,181,189,148,140,123,173,181,181,189,189,181,107,165,148,140,140,132,123,132,156,140,156,148,148,156,148,140,123,165,148,148,148,148,156,156,165,156,156,
156,140,148,132,123,123,123,123,123,115,140,140,156,140,123,123,123,115,115,123,132,132,123,123,132,123,132,132,140,132,140,140,132,140,140,132,132,140,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,132,132,132,132,132,140,140,140,140,140,132,132,132,132,132,132,132,132,123,140,148,90,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,140,123,132,123,115,115,123,115,115,123,123,123,132,132,140,148,148,148,132,132,132,132,132,123,123,132,115,115,115,115,123,123,132,132,156,148,66,74,66,66,66,57,66,66,74,66,66,66,66,66,66,57,57,57,82,165,156,148,140,140,140,148,132,123,123,132,132,132,148,181,165,140,140,140,140,140,148,132,123,123,115,115,123,123,123,132,123,123,140,140,115,123,123,123,132,123,132,132,123,123,140,115,123,132,132,132,123,115,115,115,115,148,156,156,173,189,181,181,181,173,173,189,189,189,189,189,189,148,173,165,156,156,140,165,181,165,156,156,140,156,115,123,132,123,165,148,148,148,140,148,156,132,148,156,
148,132,140,140,132,132,123,123,132,132,123,140,156,148,123,123,123,123,123,132,123,132,123,123,132,123,123,132,132,148,140,132,140,140,140,132,132,140,140,140,140,140,140,132,140,140,140,140,148,148,148,140,140,140,132,132,132,132,132,140,148,140,140,132,132,132,132,132,132,132,132,140,123,156,82,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,123,132,123,123,123,115,115,115,115,115,115,123,123,132,140,140,148,148,140,132,132,132,132,123,123,115,115,115,115,115,123,123,132,140,165,132,66,66,57,66,66,57,57,66,66,57,66,66,66,74,66,57,66,57,115,156,148,140,140,132,140,148,140,132,132,132,148,140,165,181,173,140,140,148,140,140,148,132,123,123,115,123,115,123,123,123,123,123,123,132,123,123,115,123,123,123,123,123,115,115,132,123,140,115,123,115,148,156,132,140,132,123,173,165,123,181,189,181,189,189,181,189,189,189,189,189,189,181,165,173,148,99,99,165,165,148,140,148,156,132,123,148,148,156,156,148,140,132,140,123,123,123,123,148,
140,132,132,132,140,140,140,123,140,140,140,140,156,140,123,115,123,123,115,132,123,132,123,132,123,123,123,132,140,165,132,132,132,132,132,140,132,140,140,140,140,140,132,132,132,132,140,140,140,148,148,140,140,140,132,132,132,132,140,140,140,140,132,132,132,132,132,132,132,132,123,165,123,140,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,140,123,123,123,123,115,115,115,115,123,123,123,132,140,148,156,148,140,140,132,132,132,132,123,123,123,115,115,123,123,123,132,140,165,107,49,57,57,57,57,57,57,57,66,66,57,74,66,74,57,66,57,57,148,156,148,140,140,148,132,140,156,132,132,140,140,140,173,181,156,132,140,140,140,140,148,140,123,123,115,123,115,123,123,123,123,123,123,132,115,115,123,123,115,123,115,123,115,115,132,123,115,148,165,148,148,123,123,132,156,140,156,148,99,140,173,189,181,189,189,189,189,189,189,189,165,165,181,156,123,57,132,148,148,140,148,140,132,123,148,132,148,156,165,140,132,132,123,123,123,123,123,132,
123,123,123,132,132,140,140,132,132,140,140,140,148,132,123,140,123,123,123,123,132,123,123,123,123,123,132,132,165,140,132,132,132,132,132,132,132,132,132,140,140,132,132,132,132,132,140,140,148,148,148,140,140,140,132,132,132,132,140,140,140,140,140,140,132,132,132,132,132,132,123,181,115,107,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,57,57,57,57,57,148,123,132,123,115,115,115,115,123,123,132,132,132,140,148,156,148,140,140,132,132,132,132,123,123,115,115,115,123,123,123,132,140,165,107,57,57,57,57,57,57,57,57,57,66,57,66,74,74,74,57,57,57,156,140,140,140,132,140,132,140,156,132,140,140,140,148,173,165,148,140,140,140,140,148,156,140,123,123,115,115,123,123,123,123,123,123,123,132,123,123,123,123,115,123,115,115,115,115,123,123,156,140,140,148,140,123,115,90,115,115,115,123,132,99,140,156,165,181,189,181,189,189,181,173,74,82,181,173,74,123,181,173,181,165,140,132,156,156,148,140,132,132,140,132,132,123,115,115,123,123,123,123,
123,123,115,123,132,140,132,132,132,132,140,140,148,140,123,115,115,123,123,123,132,123,123,123,123,132,132,148,148,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,148,148,140,140,140,132,140,132,140,140,140,140,132,132,132,132,132,132,132,132,140,148,123,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,49,57,57,57,156,123,123,115,115,115,123,115,115,115,123,132,140,140,148,148,148,140,140,132,132,132,132,132,123,123,115,115,123,123,132,132,140,156,107,57,57,57,57,57,57,57,57,57,66,66,66,74,66,66,74,49,57,165,148,140,132,140,148,132,132,132,140,132,140,140,148,173,156,148,140,132,140,140,148,156,148,123,123,115,115,123,123,123,123,123,123,123,140,123,115,115,123,115,123,115,115,115,123,115,148,123,156,115,74,82,115,156,156,165,156,156,156,156,132,148,165,173,156,189,189,189,173,82,90,57,66,156,132,82,165,181,173,132,148,140,132,148,156,148,156,148,132,123,140,132,123,123,123,123,123,132,132,
123,115,115,123,123,123,132,123,132,132,140,140,140,132,123,115,123,123,123,123,132,123,123,123,123,132,132,140,156,140,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,148,148,148,140,140,140,140,132,140,140,140,140,140,132,132,132,132,132,132,132,132,156,115,123,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,66,57,57,66,57,49,140,132,123,115,115,115,115,115,115,123,123,132,132,140,140,148,148,140,140,132,132,132,132,132,132,123,115,115,123,123,132,132,148,173,74,57,57,49,57,57,57,57,57,57,57,74,74,66,74,66,66,66,66,165,148,140,132,132,148,123,140,132,140,140,140,148,156,156,140,140,140,140,140,148,140,165,156,123,123,123,123,115,123,123,123,123,123,123,140,123,123,123,123,123,123,123,115,115,107,132,123,74,66,66,57,132,181,165,173,132,115,156,148,132,148,156,140,165,148,181,189,189,189,115,66,57,57,66,66,115,140,140,132,132,140,132,148,181,156,156,165,140,140,140,132,123,115,115,115,115,123,132,132,
123,115,115,115,123,123,123,123,123,132,140,132,132,132,115,115,115,123,123,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,148,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,156,82,115,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,66,148,132,123,115,123,115,115,115,115,123,123,132,140,140,140,140,140,140,140,132,132,132,132,132,140,123,115,123,123,123,132,132,148,173,57,57,57,57,57,57,57,57,57,57,57,66,66,66,66,66,57,57,74,173,148,140,132,132,132,140,140,132,140,140,148,148,165,140,140,140,132,140,140,148,140,173,165,123,123,123,123,123,123,123,123,123,123,123,140,123,123,123,123,123,123,123,123,115,156,156,90,66,132,132,132,156,181,181,181,181,156,165,140,140,132,132,148,140,173,181,148,189,189,123,57,57,57,57,74,82,123,90,132,132,140,123,165,156,148,156,148,140,140,140,140,123,115,115,115,115,115,115,115,
132,115,115,115,115,123,115,115,123,132,140,123,132,123,123,123,123,115,123,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,148,148,148,140,140,140,140,140,140,140,140,140,140,132,140,132,132,132,132,123,107,82,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,148,132,123,123,115,115,115,115,123,123,132,132,132,132,140,140,148,148,140,132,132,123,123,132,132,140,115,123,123,132,132,140,156,156,57,66,57,57,57,57,57,57,66,57,57,57,66,74,66,66,57,57,90,165,156,140,132,132,132,132,132,123,148,140,148,156,165,132,132,132,140,140,140,148,140,165,181,132,123,123,123,123,123,123,123,123,123,123,148,123,123,123,123,123,123,123,123,123,156,148,132,148,181,181,181,181,181,181,173,173,156,156,140,148,140,123,123,140,156,156,132,181,181,99,57,49,74,82,82,132,132,82,82,132,132,140,148,140,156,156,148,140,132,140,148,140,132,115,115,115,132,123,115,
115,115,115,115,123,115,123,123,115,132,148,132,132,132,123,123,123,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,148,148,140,140,140,140,140,140,140,140,140,140,132,140,140,140,132,140,132,107,82,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,66,115,148,132,123,123,115,115,115,123,123,123,132,132,132,140,140,140,148,148,140,132,123,123,123,132,140,140,132,123,123,132,132,140,165,132,57,57,57,57,57,57,57,57,57,57,57,57,66,57,66,66,66,66,82,165,148,140,132,132,123,123,132,123,148,140,148,181,148,132,140,132,132,132,140,148,140,148,165,132,123,123,123,123,123,123,123,123,123,123,140,123,123,123,123,123,123,123,107,165,140,66,165,189,189,189,189,189,189,181,181,165,123,140,140,173,140,148,123,148,148,173,156,189,165,66,49,66,99,90,90,165,173,148,115,123,156,148,156,156,165,156,148,140,156,148,148,148,140,123,115,115,123,115,123,
115,115,123,123,123,123,123,123,115,123,148,140,132,123,123,123,123,123,123,123,123,132,123,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,82,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,148,173,148,132,132,123,123,115,123,115,115,115,123,123,132,140,140,148,148,140,140,132,132,132,132,123,132,132,123,123,123,132,132,140,156,99,57,57,57,57,57,57,66,57,57,57,49,66,66,57,57,66,74,57,57,165,148,140,132,132,132,123,123,123,132,165,181,173,132,132,140,132,132,140,140,148,140,140,173,140,123,123,123,123,123,132,123,123,123,123,132,123,123,123,123,123,123,123,123,165,82,49,156,189,189,189,189,189,181,189,173,165,115,115,123,132,156,156,132,140,140,156,156,123,66,57,82,82,57,57,132,173,165,165,132,107,148,156,173,165,165,165,156,156,156,148,148,148,140,132,123,115,123,115,115,
107,115,115,123,123,123,123,123,115,123,148,140,123,123,123,123,123,132,123,123,123,132,123,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,148,148,140,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,123,90,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,99,181,156,140,148,132,123,123,123,123,115,123,123,123,132,132,140,140,140,148,140,140,140,132,132,132,132,123,123,123,123,132,132,132,140,156,57,49,57,57,57,57,57,57,57,57,57,57,74,74,66,66,66,74,66,49,140,156,140,132,132,123,123,123,123,140,173,189,148,140,140,140,132,132,132,140,148,140,140,148,140,123,123,123,123,123,132,132,123,123,123,148,123,123,123,123,123,132,123,148,132,66,66,156,189,189,189,189,181,132,148,173,148,90,74,140,123,115,115,132,115,165,132,90,82,99,107,82,49,49,115,165,156,165,156,165,148,156,156,165,165,165,156,148,156,148,148,140,140,140,132,123,123,123,123,115,
123,115,115,115,123,115,132,123,123,123,132,123,123,123,123,123,123,123,123,123,123,132,132,123,132,132,132,132,132,132,132,132,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,148,148,148,140,140,140,140,140,140,140,140,140,140,148,148,148,140,165,107,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,74,82,173,156,148,140,140,132,123,123,123,115,123,123,123,123,123,132,132,140,140,148,140,140,132,132,132,123,132,140,140,132,132,123,132,132,165,107,49,57,57,57,57,57,57,57,57,57,57,57,90,74,66,66,74,74,66,57,115,156,140,132,132,123,123,123,123,132,148,148,132,132,140,132,132,132,140,140,156,140,132,140,132,123,123,123,123,123,132,123,123,123,123,140,132,123,123,123,123,123,115,156,82,57,57,132,148,189,165,115,107,66,107,189,107,115,82,165,123,132,148,107,115,165,74,82,115,74,74,57,74,148,165,156,156,173,148,140,165,156,156,165,165,156,156,148,140,140,140,140,140,140,132,132,123,115,123,115,
123,115,115,123,123,132,123,123,123,115,123,123,123,123,123,123,123,132,123,132,123,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,140,140,148,148,148,148,148,140,99,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,107,132,173,173,173,148,140,140,132,132,123,123,123,115,115,115,115,115,123,123,132,132,140,148,140,132,132,132,123,123,123,132,132,132,132,132,132,140,165,66,57,57,57,57,66,57,57,57,57,57,57,49,74,74,66,66,74,74,74,57,82,148,140,140,132,123,123,123,123,132,132,140,132,132,132,132,132,132,140,140,148,140,132,140,140,123,123,123,123,123,132,132,123,123,123,140,132,123,123,123,123,132,123,148,66,57,82,123,173,189,90,66,57,57,90,189,132,74,99,132,115,123,140,165,156,165,115,115,156,74,57,99,156,156,156,165,165,156,156,165,165,140,156,165,165,156,156,140,132,132,132,140,140,132,132,132,123,132,115,123,
123,115,115,132,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,132,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,148,148,140,140,148,148,140,148,148,148,140,140,148,156,156,156,123,74,99,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,66,74,57,66,165,189,173,165,156,140,140,132,132,123,123,123,123,123,132,132,123,132,132,132,132,140,140,140,132,132,132,123,123,123,123,132,132,132,140,140,140,148,123,57,66,57,57,57,66,57,57,57,57,57,57,57,90,82,66,66,74,74,66,57,57,107,148,140,132,123,123,123,123,123,132,132,132,132,132,132,132,132,140,140,148,140,132,140,140,132,123,123,123,123,132,123,132,123,132,140,123,132,132,132,123,123,148,123,57,57,132,148,189,181,82,57,57,57,82,173,148,74,99,165,148,165,140,156,165,148,57,132,173,132,132,156,148,148,165,173,173,173,165,173,140,156,156,165,165,156,148,140,132,132,132,140,132,132,132,132,132,115,123,115,
123,123,123,123,123,115,115,123,123,115,123,123,123,123,123,123,132,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,148,148,148,140,140,140,165,165,156,156,173,165,132,82,99,57,57,57,57,57,57,66,57,57,57,66,57,57,57,57,57,57,57,57,57,82,74,148,189,165,148,140,148,132,132,132,132,132,132,140,132,132,132,132,123,132,132,140,140,132,140,140,140,132,132,123,123,123,123,132,132,132,132,148,148,156,99,57,57,57,57,57,57,66,66,57,57,57,57,57,74,82,66,66,74,90,82,57,57,82,148,140,132,123,123,123,123,123,132,132,132,132,132,132,132,132,140,148,148,140,132,140,148,123,123,123,123,123,123,132,132,132,123,148,132,132,132,123,132,123,156,107,57,82,173,181,189,156,66,49,57,57,57,140,148,115,123,123,165,156,140,165,165,90,57,165,148,189,165,140,140,140,173,165,165,165,165,132,132,140,156,165,165,156,140,132,132,132,132,140,132,132,132,123,140,140,115,115,
123,123,123,115,115,115,123,115,123,123,123,123,123,123,123,123,132,132,132,123,132,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,148,148,148,148,140,156,181,165,156,156,156,173,156,66,123,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,74,74,123,173,189,189,148,140,140,140,132,132,132,132,132,132,132,140,140,148,140,140,123,123,140,148,140,140,132,140,132,132,123,123,123,123,123,132,132,132,140,140,156,132,57,57,57,57,57,57,57,57,57,57,57,57,57,74,74,66,66,74,107,82,57,57,57,132,140,132,132,123,123,123,123,123,123,132,132,132,132,132,132,132,148,148,140,132,148,156,132,123,123,132,132,132,132,132,132,132,148,140,132,132,132,132,140,165,66,57,107,165,189,189,132,57,57,57,49,57,115,156,148,173,173,156,156,140,165,156,156,156,165,181,140,132,140,140,140,140,148,156,140,132,123,132,140,156,165,156,148,148,132,132,132,140,132,132,132,132,140,123,123,123,115,
123,123,123,123,123,115,115,123,115,123,123,132,123,123,123,132,132,132,123,132,140,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,156,165,156,148,148,148,165,165,74,115,57,57,57,57,57,57,57,57,49,57,57,66,57,57,57,57,57,57,74,132,189,189,189,173,140,140,140,132,132,132,132,123,132,132,132,140,140,148,140,132,132,140,148,140,140,132,132,123,123,123,123,123,123,123,123,123,132,132,140,156,156,148,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,57,74,90,90,57,57,57,90,140,132,132,132,123,123,123,123,140,123,123,132,132,132,132,140,148,140,140,132,140,156,132,132,123,132,132,132,132,132,132,132,132,132,132,132,132,123,165,123,57,57,107,173,189,181,115,57,57,57,57,49,99,148,132,123,107,107,148,148,148,181,140,140,148,115,123,140,148,140,148,140,140,132,132,123,123,132,148,156,156,156,156,140,132,132,132,132,132,132,132,123,148,123,123,115,123,
123,123,123,123,123,115,115,123,123,123,123,123,123,123,123,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,140,148,156,165,156,156,156,148,140,148,148,123,107,74,57,57,57,57,57,57,57,66,57,49,57,57,57,57,57,57,57,57,132,189,181,173,140,132,132,132,132,132,132,132,132,140,140,140,148,140,140,140,132,132,123,123,140,140,132,132,132,123,123,123,123,123,123,123,123,132,132,140,148,148,148,57,57,57,57,66,57,57,57,57,57,57,57,57,49,66,66,66,74,82,74,57,57,57,57,123,148,132,132,123,123,123,123,132,132,123,132,132,132,140,140,148,140,140,132,148,165,140,132,123,132,132,132,132,132,132,132,140,132,132,132,132,123,156,99,57,74,140,165,189,189,115,57,57,57,57,57,57,132,148,123,156,123,156,132,140,165,148,132,140,123,132,140,140,148,148,140,132,132,132,132,123,132,148,156,156,156,148,140,132,132,132,132,132,132,132,132,132,132,123,115,115,
123,123,123,115,115,123,115,123,123,115,123,123,123,123,132,140,156,132,132,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,148,148,140,140,148,148,148,148,156,165,156,156,148,148,140,140,148,173,74,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,140,189,189,148,140,132,132,132,140,132,140,140,140,140,148,148,140,140,148,132,132,132,132,123,123,132,132,123,123,123,123,123,123,123,123,123,123,132,132,140,140,165,156,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,82,132,132,132,123,123,123,123,123,132,132,132,132,132,140,140,148,140,140,132,148,156,148,140,132,132,132,132,132,132,132,132,140,140,132,132,132,132,173,74,57,132,82,181,189,189,148,132,57,57,57,57,74,165,156,173,148,156,156,140,148,140,140,140,132,132,132,132,140,148,140,132,132,132,123,132,123,132,148,156,156,156,148,140,132,132,132,132,132,132,132,140,132,123,123,115,115,
123,115,123,123,115,123,123,123,115,123,123,123,123,123,132,148,140,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,156,156,156,156,156,156,148,148,148,140,148,148,165,90,99,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,181,189,165,140,132,132,132,132,132,132,132,140,140,148,148,140,140,140,140,132,123,123,123,123,123,123,123,123,132,123,123,123,123,123,123,123,123,132,132,140,140,156,165,57,57,57,57,57,66,57,57,57,57,57,57,57,57,74,57,57,66,66,57,57,57,57,57,57,90,140,132,123,123,123,123,123,132,123,123,132,132,140,140,148,132,140,132,148,165,148,140,132,132,132,132,132,132,132,132,148,148,132,132,123,148,115,66,132,107,82,189,189,181,181,181,82,57,66,57,82,148,123,123,115,132,165,165,148,132,132,140,140,132,132,132,132,148,140,132,132,132,123,123,123,132,148,148,156,148,148,140,132,132,132,132,132,132,140,132,140,123,123,115,115,
123,123,123,123,123,123,123,123,123,115,123,123,123,123,132,156,132,132,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,148,140,148,148,148,148,156,156,156,165,165,148,148,148,156,148,148,165,90,82,66,57,57,57,57,57,49,57,57,57,66,57,57,57,57,57,90,189,189,165,140,132,132,132,132,132,132,140,140,140,148,148,140,140,132,132,132,132,132,123,123,123,123,132,132,132,123,123,132,123,123,123,123,132,132,140,148,156,156,156,66,66,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,49,57,66,57,57,57,123,140,132,123,123,123,123,123,123,132,132,140,140,148,148,140,132,132,156,165,148,132,140,132,132,132,132,132,132,132,148,148,132,132,173,173,74,82,181,57,115,189,181,189,181,189,165,82,66,57,107,140,123,123,123,140,165,148,140,140,148,132,132,132,132,132,132,148,140,132,123,132,132,123,123,132,140,148,148,148,148,140,132,132,132,132,132,132,132,140,132,123,115,115,115,
123,123,123,123,123,123,123,115,123,115,123,123,132,132,156,140,132,132,123,132,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,148,148,140,140,140,148,148,156,156,156,165,156,148,148,156,156,148,173,74,82,74,57,57,57,57,57,66,57,57,49,49,49,57,57,57,57,107,181,181,156,140,132,140,140,132,132,132,132,140,140,148,140,140,140,132,132,132,132,132,123,123,123,132,132,132,132,123,123,132,132,132,123,123,132,132,140,156,173,181,140,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,66,57,57,57,57,57,90,140,132,123,123,123,123,123,132,132,132,140,148,148,148,140,140,132,156,165,148,140,140,132,132,132,132,132,132,132,148,148,132,140,165,123,74,165,140,57,123,189,189,181,181,181,189,148,57,57,90,148,132,123,123,132,156,156,148,132,140,140,123,123,123,132,132,148,140,132,132,132,132,123,132,132,140,148,148,148,140,140,140,132,132,132,132,132,132,132,123,123,123,115,115,
115,123,123,123,115,123,115,115,115,115,115,123,132,132,156,132,132,132,132,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,148,148,148,156,165,165,148,148,148,173,148,156,57,82,99,57,57,57,57,74,74,66,57,57,57,57,57,57,57,66,165,189,173,148,140,140,140,140,132,132,132,140,140,148,148,148,140,132,132,132,132,140,132,123,123,123,123,132,132,140,148,107,123,132,140,156,140,132,140,148,173,82,115,74,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,57,57,57,74,57,57,57,66,57,66,148,140,123,123,123,123,132,132,132,140,148,140,140,140,140,140,132,156,165,156,148,148,132,132,132,132,140,140,140,140,148,132,156,156,66,99,189,115,57,123,181,189,181,181,189,181,181,90,57,66,148,123,123,123,123,173,173,132,123,140,148,132,123,123,132,132,148,148,132,132,132,140,132,132,132,140,140,148,148,140,140,132,132,132,132,132,132,132,148,123,123,115,115,115,
115,115,123,123,123,115,115,115,115,123,123,132,132,148,140,132,132,132,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,148,140,140,140,140,140,140,140,148,148,156,165,156,140,148,148,148,156,66,82,99,66,57,57,57,82,74,57,66,66,66,57,57,66,66,132,189,165,148,148,140,140,132,132,132,132,132,140,140,148,148,140,140,132,132,132,132,148,148,123,123,123,123,132,132,148,107,57,74,99,90,66,115,132,140,148,156,57,57,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,82,66,57,57,49,57,57,115,140,123,123,123,123,123,132,132,148,148,140,140,140,140,140,140,156,165,156,148,148,132,132,140,140,140,140,140,140,148,132,165,140,132,156,189,99,57,140,181,189,189,189,181,189,189,173,74,57,115,156,123,123,115,148,156,115,123,132,140,132,132,132,132,132,140,148,140,132,132,132,132,123,132,148,140,140,148,140,140,140,132,132,123,123,132,132,132,123,123,123,107,115,
115,123,123,115,123,115,115,115,123,123,132,132,140,156,140,132,132,132,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,140,132,132,140,140,140,140,148,148,148,140,140,140,140,140,140,140,148,156,165,156,148,156,148,148,148,66,74,90,90,57,57,57,74,82,57,66,74,57,57,107,132,140,189,181,148,140,140,140,140,132,123,123,132,132,132,140,148,140,140,132,140,132,132,132,140,148,132,123,123,123,132,140,132,57,57,57,57,57,57,57,99,140,156,107,57,57,57,66,57,49,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,74,82,66,57,57,57,66,57,82,140,123,123,123,123,132,132,140,148,140,132,132,132,132,132,140,165,165,156,156,148,140,107,140,132,140,140,140,148,140,132,165,173,173,181,181,90,82,189,189,189,189,181,181,181,165,189,115,82,173,181,132,132,90,132,140,123,115,123,140,132,123,132,132,132,132,148,132,140,132,140,140,123,140,156,140,148,140,132,132,132,123,123,123,132,148,132,140,123,123,123,115,115,
115,132,123,115,115,115,115,115,123,132,123,132,148,156,132,140,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,140,132,132,132,140,132,140,140,140,140,140,148,148,140,140,140,140,140,140,140,140,140,148,156,165,156,156,140,140,132,66,82,66,107,57,57,57,66,66,57,57,57,57,90,181,189,189,181,148,140,140,140,140,132,132,132,132,123,132,132,140,148,140,132,132,132,132,132,148,148,140,132,123,123,123,123,140,66,57,57,66,57,57,57,57,57,66,74,57,57,57,57,74,66,57,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,74,82,99,82,57,57,49,57,57,66,156,123,123,132,123,132,140,148,148,140,132,132,132,132,132,140,165,165,156,156,148,140,57,132,132,140,140,140,140,148,132,165,156,173,181,173,74,156,189,189,189,189,181,173,165,165,156,173,132,173,165,165,123,74,115,140,115,115,115,140,123,123,132,132,132,132,156,148,132,140,140,140,123,132,132,132,140,140,132,132,123,123,123,123,123,140,123,132,123,123,123,115,115,
115,132,140,115,115,115,115,115,123,123,123,132,148,148,140,132,123,123,123,123,123,123,132,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132,140,132,140,132,132,140,140,140,140,140,140,140,148,148,148,140,140,140,140,140,140,140,140,148,148,165,165,148,123,148,107,57,74,57,90,57,57,57,57,57,66,66,57,57,140,189,189,189,173,140,132,132,132,132,132,123,123,132,132,132,140,140,140,140,140,132,132,132,132,140,148,140,132,123,123,123,156,90,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,82,107,99,57,66,57,57,57,57,132,123,123,123,132,132,140,148,148,140,132,132,132,132,132,132,165,156,156,165,156,140,66,132,140,140,140,140,140,148,132,173,156,173,181,140,123,181,181,189,189,181,181,165,156,165,148,181,181,156,132,148,132,74,82,132,115,115,123,140,148,140,132,140,140,156,140,156,148,156,148,140,148,156,123,140,132,148,123,123,123,123,123,123,132,132,148,148,123,115,115,115,115,
115,123,140,115,115,115,115,123,123,123,123,132,132,140,140,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,123,123,123,132,132,132,132,132,132,132,132,140,132,140,140,140,140,140,140,140,140,148,148,148,140,140,140,140,140,140,140,140,148,148,156,165,132,66,181,99,74,57,57,74,66,57,57,66,57,57,57,66,82,173,181,165,173,173,132,132,132,132,132,123,123,123,123,140,140,140,140,132,132,132,132,132,123,123,132,148,140,132,123,123,140,156,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,99,99,99,99,57,57,57,57,66,57,107,132,123,123,132,132,140,148,140,132,132,132,132,132,132,140,156,156,156,156,148,140,66,148,140,140,140,140,140,148,148,173,156,181,173,82,148,181,198,189,189,189,181,173,165,165,165,156,173,165,132,140,99,82,74,140,123,123,132,132,140,132,148,156,148,140,148,148,165,173,173,140,140,132,132,140,123,123,123,132,123,123,123,123,140,140,140,123,123,123,123,123,115,
115,115,123,115,115,115,123,123,123,123,123,132,140,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,140,140,132,140,140,148,148,148,148,148,140,140,140,140,140,140,148,148,148,148,156,115,82,107,123,90,132,57,57,57,107,57,57,57,57,57,66,74,173,181,156,148,173,140,132,132,132,132,132,123,123,132,140,140,132,132,132,123,123,123,123,123,123,123,123,132,140,132,123,123,156,132,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,49,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,82,90,99,74,74,74,66,57,57,49,74,132,123,123,132,132,148,140,140,132,132,132,132,132,132,140,156,156,165,115,107,148,99,148,140,140,140,140,140,140,156,165,156,181,165,57,173,189,189,148,181,189,181,173,165,165,165,156,156,156,140,132,140,156,90,148,115,115,123,132,148,140,156,148,140,148,156,148,148,156,173,165,148,148,123,123,123,123,123,132,140,123,115,123,132,132,148,123,123,123,115,115,115,
115,115,115,115,115,115,123,123,123,132,132,140,132,132,140,140,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,123,123,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,140,140,140,140,140,140,140,140,140,140,148,148,123,99,148,181,132,156,173,74,66,74,115,66,49,49,57,57,57,115,189,156,148,148,148,123,123,123,132,123,123,123,132,140,148,140,140,132,123,123,123,123,123,123,123,123,123,140,140,132,156,173,189,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,49,57,57,66,57,66,57,57,57,57,66,57,57,57,57,74,82,90,107,74,90,74,66,57,49,57,57,148,123,132,132,140,148,140,132,132,132,132,132,132,132,132,156,156,165,90,57,148,140,140,140,140,140,140,148,148,165,156,156,173,173,115,181,189,181,132,115,189,173,156,165,156,156,165,165,148,173,132,107,140,140,148,107,115,115,123,132,140,140,148,140,156,148,123,148,132,148,140,123,123,115,123,123,123,123,123,115,123,132,148,140,148,140,123,123,115,123,123,115,
115,115,115,115,115,115,132,123,123,132,148,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,132,132,140,132,140,140,140,148,140,148,148,148,140,140,140,140,140,140,140,140,140,140,148,140,74,99,165,156,165,173,165,90,57,74,99,66,82,74,132,90,107,148,181,156,140,140,132,123,123,123,123,123,123,132,132,140,140,140,132,132,123,123,123,123,123,115,115,123,123,123,123,132,173,181,156,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,57,57,57,66,57,57,57,57,57,66,66,90,99,74,57,74,90,74,66,57,57,148,132,132,140,140,140,132,132,132,132,132,132,132,132,140,156,165,165,74,57,123,173,140,140,140,140,140,140,140,165,156,156,173,181,132,189,189,173,107,74,173,181,156,148,165,173,165,165,148,156,148,115,123,156,132,115,115,107,115,132,132,132,140,173,148,132,132,140,123,140,115,115,115,115,115,123,123,123,148,156,123,132,123,132,156,132,123,115,115,115,115,115,
115,115,115,123,115,115,132,148,132,123,132,132,132,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,132,132,132,132,140,140,140,148,140,140,148,148,148,140,140,140,132,140,140,140,140,140,140,148,156,66,115,156,140,140,148,148,148,99,74,90,57,123,173,181,156,165,165,173,148,140,132,132,123,123,123,123,123,123,123,132,140,132,123,123,123,123,123,123,115,115,123,123,123,123,123,123,132,165,181,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,99,107,82,57,66,156,148,123,82,57,132,132,132,132,132,140,132,132,132,132,132,132,132,132,148,165,165,165,57,57,90,148,140,140,140,148,148,140,140,165,156,148,173,181,115,181,189,132,57,57,74,173,165,140,148,165,165,173,173,173,148,107,115,156,123,115,115,115,115,132,132,123,132,132,156,165,140,132,123,123,115,115,115,115,115,115,115,123,148,132,132,123,132,123,140,132,123,115,115,115,115,115,
115,115,115,123,115,123,123,123,123,123,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,148,148,148,140,140,132,132,132,140,140,140,148,132,140,57,123,148,140,148,140,148,173,173,99,165,123,165,173,173,189,189,181,165,165,132,132,123,123,123,123,123,123,132,140,148,132,132,123,123,115,115,115,123,115,115,115,123,123,123,123,123,132,165,148,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,74,99,107,82,57,90,181,165,165,173,140,148,165,132,140,140,132,132,132,132,132,132,132,132,132,148,173,156,140,66,57,90,156,140,140,148,148,148,148,148,165,165,148,165,173,90,189,189,66,57,57,49,115,165,140,132,165,173,181,181,173,156,140,123,140,115,115,115,115,115,123,123,123,132,148,123,132,165,140,123,115,115,115,115,115,115,132,115,123,132,148,123,140,165,140,148,123,123,115,115,115,115,115,
115,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,140,132,140,140,140,140,140,148,148,148,148,140,140,132,140,140,140,140,123,165,82,57,115,165,156,148,140,140,140,156,173,148,173,173,165,156,165,156,165,165,165,132,132,123,123,123,123,123,132,140,140,132,132,132,123,123,123,115,115,115,115,115,123,123,123,123,123,123,132,165,90,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,90,107,66,57,82,165,165,165,156,156,181,181,140,140,140,132,132,132,132,132,132,132,132,132,156,165,165,99,57,57,74,148,140,148,148,148,148,148,148,156,165,156,165,173,66,173,132,57,66,57,57,107,165,140,132,132,140,156,165,165,140,156,115,140,115,115,115,107,115,123,123,123,132,140,140,140,123,156,132,115,115,115,107,115,115,115,115,123,123,115,123,140,148,132,140,123,123,115,115,115,115,115,
115,123,132,123,123,115,123,115,123,123,123,123,115,115,123,123,123,123,123,123,115,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,148,148,148,148,140,140,132,132,140,132,123,165,132,49,57,107,189,156,140,140,140,140,148,173,181,173,148,132,132,156,148,156,156,156,132,132,123,123,123,123,123,132,140,140,140,123,123,123,115,115,115,115,115,115,115,123,123,123,123,123,123,132,173,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,66,66,57,57,57,57,57,57,57,82,90,74,57,115,57,140,156,156,156,165,156,165,140,140,132,132,132,132,140,132,132,132,132,156,165,173,74,57,57,57,148,140,140,148,148,148,148,148,156,156,165,165,181,66,140,57,57,57,57,57,90,165,140,132,132,132,140,156,148,132,132,156,132,115,115,115,115,115,132,123,123,132,132,148,140,140,123,148,123,107,107,115,107,107,132,123,115,115,123,115,123,123,123,132,123,115,115,115,115,115,115,
123,123,123,123,123,115,115,115,123,123,123,123,115,115,115,115,115,115,123,115,115,123,123,123,123,123,123,123,123,123,132,132,123,123,123,123,123,132,132,132,132,132,140,132,132,140,140,140,140,140,140,140,140,148,148,148,148,140,140,140,140,123,132,140,82,57,66,57,99,189,165,148,140,140,140,132,148,148,140,132,123,132,156,156,156,173,148,123,123,123,123,123,123,132,140,140,148,132,132,123,115,115,115,115,115,115,115,115,123,123,132,132,132,132,132,165,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,82,74,82,148,66,66,90,148,156,156,156,148,140,140,140,132,132,132,140,140,140,132,132,156,165,181,66,57,66,66,148,140,148,148,148,148,148,148,156,165,165,173,156,57,74,49,57,57,57,57,99,156,156,140,132,132,140,140,132,115,115,156,132,123,115,115,115,115,132,123,123,123,123,132,140,156,140,140,115,115,115,107,107,107,107,115,115,123,115,132,123,123,123,115,115,115,115,132,115,115,123,
115,123,123,115,115,115,123,140,123,132,123,115,115,115,115,115,115,115,115,115,115,115,123,123,123,132,123,123,123,132,132,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,140,140,140,140,140,132,123,66,57,74,57,49,82,189,173,156,156,132,140,140,140,140,123,123,123,132,156,156,148,156,140,123,123,123,123,123,123,123,140,148,148,140,132,123,123,123,123,123,123,115,115,123,123,132,123,123,132,132,140,156,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,82,82,140,132,90,90,57,66,140,156,156,148,148,148,140,132,132,140,140,140,140,140,140,156,165,165,66,57,57,66,148,148,148,148,148,148,148,148,156,173,181,181,140,49,49,66,57,57,49,49,107,165,156,140,132,132,132,132,140,107,165,165,115,123,115,115,115,115,123,123,123,123,123,123,148,140,148,132,132,115,107,107,115,123,140,115,115,123,123,132,123,132,132,123,115,115,115,132,132,115,115,
115,123,123,115,123,115,123,115,123,132,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,115,123,132,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,148,148,140,140,148,148,132,132,165,82,82,66,66,57,57,99,189,173,156,165,140,132,140,140,132,132,132,123,132,156,156,156,148,140,123,115,115,123,123,140,148,140,140,140,132,132,123,123,115,115,115,115,115,115,123,123,123,156,148,132,132,148,165,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,82,115,189,107,90,74,66,66,74,123,156,156,156,148,140,132,140,140,140,140,140,140,140,156,165,123,57,57,57,66,156,148,148,148,148,156,156,148,156,181,181,189,123,57,57,57,57,57,57,57,132,173,165,140,123,132,140,140,90,132,189,132,115,115,115,115,115,123,132,123,123,132,123,123,140,140,156,132,123,107,107,107,115,107,115,115,123,132,123,123,123,123,115,132,115,115,115,132,132,123,123,
123,132,123,115,115,123,132,148,132,123,123,115,115,115,115,115,115,123,115,115,115,123,123,115,115,123,123,115,123,132,123,123,132,123,123,123,123,123,132,132,132,132,132,140,140,140,140,140,140,140,132,140,140,148,140,140,148,132,99,82,156,107,82,74,57,132,132,123,173,189,173,165,156,148,132,140,148,132,140,132,123,132,156,156,156,140,123,115,115,115,123,132,132,132,140,140,140,132,123,123,123,123,123,115,115,115,123,123,123,132,132,156,140,140,148,173,82,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,74,165,181,107,99,57,57,57,49,66,156,156,148,148,132,140,140,140,140,140,140,140,140,148,173,99,57,57,57,57,123,148,148,148,148,156,156,156,156,165,123,181,115,57,57,57,57,57,57,66,173,181,165,156,156,132,132,148,74,99,123,140,123,123,115,115,123,115,140,123,115,123,123,123,140,132,156,123,132,123,115,123,115,140,107,115,123,123,123,123,123,123,115,115,123,123,115,123,140,132,115,
123,123,123,123,115,123,123,132,132,123,123,115,123,115,115,115,123,123,123,123,123,123,123,115,123,123,115,123,123,123,123,123,132,123,123,123,123,123,132,132,140,140,140,140,140,140,140,140,148,148,156,140,148,148,140,140,123,99,66,82,66,57,74,57,57,148,165,173,181,189,181,173,156,156,156,132,148,140,140,132,132,132,148,165,156,123,123,132,123,115,123,123,140,140,148,140,132,132,123,123,123,132,123,123,123,123,123,123,123,132,140,156,148,140,148,156,99,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,66,57,57,57,57,66,57,57,66,57,57,57,57,82,198,173,107,74,57,66,57,57,49,82,132,140,132,140,148,140,140,140,140,140,140,140,148,181,74,57,57,57,49,66,132,148,148,156,156,156,156,148,165,74,107,82,57,57,66,57,57,57,115,181,173,181,156,156,140,140,140,132,66,123,148,140,123,115,123,123,115,132,123,123,123,123,132,148,140,156,140,140,107,107,107,115,115,107,115,115,115,123,123,123,123,115,115,115,123,115,132,140,132,123,
123,123,132,123,123,123,123,132,140,123,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,148,140,140,140,148,140,140,140,148,148,140,123,90,57,90,90,57,74,74,57,57,148,140,148,173,181,181,173,181,156,156,140,132,132,123,115,115,115,156,173,148,123,115,115,115,123,123,132,132,140,140,148,140,132,123,123,123,123,123,123,123,123,123,123,132,140,165,148,140,140,148,156,123,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,66,57,57,57,57,57,57,66,66,57,57,57,57,57,66,57,57,57,57,107,181,181,82,82,66,57,57,57,66,66,74,123,123,140,140,140,140,140,140,140,140,140,156,181,66,57,57,57,57,57,82,156,148,156,156,156,156,156,165,82,57,57,49,57,57,57,49,66,173,189,165,181,156,156,140,140,140,123,66,132,148,140,123,115,123,115,115,123,123,123,123,123,123,148,140,156,132,140,140,123,132,140,115,115,115,115,115,132,115,123,123,115,115,115,115,115,123,132,132,123,
123,132,148,148,132,123,123,123,123,123,123,115,115,115,123,132,132,132,123,123,123,123,123,123,115,123,123,123,115,115,123,123,123,123,123,123,132,132,132,140,140,140,140,140,140,140,140,140,148,148,140,140,140,148,115,90,74,74,90,66,66,66,66,57,57,132,132,123,115,132,156,173,148,123,165,115,99,107,140,140,115,140,165,181,148,123,123,123,115,123,123,123,132,140,140,140,140,132,123,123,115,115,123,123,123,123,132,132,132,140,140,148,148,148,148,156,132,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,66,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,132,173,148,74,66,57,57,57,66,57,57,57,99,165,148,140,140,140,140,140,148,140,140,173,173,66,49,57,57,57,57,57,123,148,156,156,156,156,156,156,74,57,57,57,57,57,49,57,107,181,173,173,165,156,140,140,140,140,123,74,140,140,132,115,123,115,115,115,123,123,123,123,123,123,140,140,148,140,132,123,156,132,115,115,115,115,115,115,123,123,107,123,123,123,132,148,140,132,132,140,132,
148,140,140,156,156,123,123,132,123,123,115,115,123,123,123,132,132,107,123,123,123,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,132,123,132,140,140,132,132,140,140,140,148,140,148,148,140,140,156,140,90,66,57,74,82,74,148,165,132,66,57,115,140,148,148,132,140,140,148,156,181,140,107,57,74,156,165,189,173,165,132,115,115,123,123,132,123,123,132,132,148,140,132,123,132,123,115,115,115,123,123,123,123,132,132,140,140,140,148,148,148,156,123,57,57,57,66,57,66,57,57,66,57,66,57,57,66,57,57,57,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,82,181,181,107,90,66,57,57,57,66,57,57,57,57,123,148,140,140,140,140,148,148,140,148,181,165,57,57,57,57,57,57,57,66,156,156,156,156,156,156,148,57,57,57,57,57,49,57,57,148,189,99,140,165,156,132,132,140,132,156,148,140,115,123,123,123,115,115,107,115,132,123,123,123,132,148,132,148,140,123,123,123,115,115,115,115,107,115,123,115,115,132,132,123,123,165,148,140,140,140,140,132,
132,132,123,132,156,140,148,148,123,123,115,123,123,123,132,132,132,99,123,123,123,115,115,123,115,123,123,115,115,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,140,140,148,148,148,140,140,99,57,74,82,115,107,115,173,189,189,115,57,82,140,132,148,140,140,115,107,140,148,156,82,82,132,173,181,181,165,148,115,115,123,115,123,123,123,123,132,132,140,148,140,132,132,123,123,115,115,123,123,123,123,132,132,132,140,140,148,148,148,156,107,57,57,57,66,66,66,57,57,57,57,57,57,57,66,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,115,181,181,74,82,57,57,57,57,57,57,57,57,57,66,156,140,140,140,148,148,148,148,165,189,148,57,57,49,57,57,57,57,57,115,156,156,165,165,156,123,57,57,57,57,66,57,66,49,165,181,107,99,181,181,165,148,140,132,140,181,140,115,123,123,115,115,115,107,107,123,123,123,123,132,148,132,148,140,115,115,115,123,115,115,107,123,115,123,123,123,140,132,132,123,140,140,140,140,140,123,123,
140,132,123,123,140,148,156,132,140,123,123,123,123,132,132,132,123,148,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,140,140,140,140,140,148,148,148,148,140,66,82,99,107,107,99,148,165,173,181,140,57,74,140,132,140,148,156,173,156,74,74,148,156,148,140,123,123,132,123,123,123,123,123,115,123,123,123,123,132,132,140,148,140,132,123,123,123,123,115,123,123,123,123,123,123,132,132,132,140,140,148,173,107,57,57,57,57,66,66,57,57,57,57,57,66,66,57,57,57,66,57,57,66,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,57,123,173,132,66,66,57,57,57,57,57,57,57,57,57,57,148,140,140,140,148,148,148,148,181,189,148,57,57,57,57,57,57,57,66,57,132,165,165,165,173,82,57,57,66,57,49,49,66,57,115,181,165,123,189,181,173,165,148,148,140,156,132,115,115,115,115,115,115,115,115,123,132,132,123,132,148,132,156,132,140,140,140,115,123,115,132,123,132,123,140,115,123,123,123,115,115,140,140,140,140,132,132,
132,123,123,115,123,140,140,132,123,132,123,123,123,123,132,132,140,156,115,123,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,148,82,82,90,99,90,74,173,156,165,181,148,57,66,140,123,132,140,148,148,123,66,132,148,140,156,156,123,115,115,123,123,115,123,123,123,123,123,123,123,132,132,140,148,140,132,123,123,115,115,115,115,123,132,132,123,123,123,132,132,140,140,148,181,82,57,57,57,57,57,66,57,57,57,57,57,66,57,57,57,57,57,57,57,66,57,57,66,74,66,57,57,57,66,57,57,57,57,57,57,57,57,132,173,74,74,57,57,57,57,57,57,57,57,57,57,66,99,148,140,140,148,148,148,140,173,123,156,57,49,57,57,57,57,57,57,57,90,189,181,189,132,57,57,66,66,57,57,57,57,57,66,173,181,132,189,181,181,181,173,148,148,156,123,115,115,115,115,115,115,115,115,123,123,123,123,132,148,140,156,140,140,140,123,107,107,123,140,115,115,140,123,132,123,115,115,115,115,123,132,132,140,123,140,
132,123,115,115,123,123,123,132,132,123,123,123,132,132,115,140,173,123,123,123,123,123,115,115,115,115,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,140,140,140,148,148,148,165,82,82,99,99,74,99,173,148,156,173,181,140,107,156,132,123,115,132,140,74,132,156,156,148,165,132,123,123,123,123,115,115,115,123,123,115,123,123,132,132,132,140,148,132,132,123,123,123,115,115,123,123,132,132,123,123,123,123,132,132,140,148,173,57,57,57,57,57,57,66,57,66,66,57,57,57,57,57,66,57,57,66,57,57,57,57,66,82,66,57,57,57,57,57,57,57,57,57,57,57,49,140,156,57,66,57,57,57,57,57,57,57,57,57,57,57,66,140,156,140,148,148,156,165,140,57,99,57,57,57,49,49,57,57,57,57,66,156,165,181,107,66,57,57,66,66,57,57,57,57,57,90,140,82,140,189,189,181,173,148,156,156,123,115,115,123,123,115,107,115,115,115,132,123,132,132,140,156,148,132,123,123,115,123,123,132,132,132,132,132,132,132,115,123,115,115,115,115,148,140,156,148,148,
123,115,115,123,123,123,123,132,140,132,132,132,132,132,165,148,132,123,123,123,123,115,123,123,123,123,115,123,123,123,123,123,123,123,132,123,132,132,132,132,140,132,140,140,140,140,140,140,148,148,156,148,165,66,90,107,90,57,123,156,148,148,181,189,189,181,181,173,115,165,99,74,123,165,165,148,156,140,115,123,115,115,115,115,115,115,115,123,123,115,115,123,132,132,140,148,140,132,123,123,123,115,115,123,123,123,123,123,123,123,123,132,132,132,148,173,74,66,57,57,57,57,66,66,57,66,66,66,57,57,57,57,49,57,57,57,57,49,57,57,57,66,57,57,66,57,57,57,66,57,57,57,57,74,165,148,57,66,57,57,57,57,57,57,57,57,57,57,57,57,107,148,156,148,148,156,181,90,57,74,57,49,57,57,57,57,57,49,57,57,74,82,123,90,66,57,57,57,66,66,57,66,49,57,57,57,49,66,115,173,189,181,156,148,148,123,115,115,123,123,115,115,115,115,123,123,123,123,140,148,156,156,123,123,115,115,115,115,115,123,123,132,123,132,123,115,115,115,115,115,123,132,156,140,148,132,
123,115,115,123,123,123,132,132,132,132,123,123,132,140,140,132,132,132,132,123,115,123,123,115,115,123,115,123,123,123,123,123,123,123,132,123,132,140,140,140,132,140,140,140,140,140,140,140,140,132,140,156,123,82,99,107,82,57,115,156,140,140,148,181,189,189,181,156,148,107,90,148,181,181,156,173,132,123,115,115,115,115,115,115,115,115,115,115,123,123,123,123,132,132,140,148,148,132,123,123,115,115,123,123,123,123,115,115,115,123,123,123,132,132,148,173,115,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,57,57,57,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,123,173,140,57,57,57,57,57,57,57,57,57,57,57,57,57,66,156,148,148,165,156,173,181,107,57,57,57,66,57,57,57,57,57,57,49,57,57,57,66,57,66,57,57,57,66,74,66,66,66,57,57,57,57,57,57,82,115,189,181,115,115,123,123,123,115,132,115,115,107,132,123,132,132,132,140,148,140,132,115,115,115,115,115,123,123,115,115,123,132,123,115,115,115,115,115,115,115,123,140,132,115,123,
115,115,123,123,123,123,132,132,123,123,140,165,165,132,123,132,132,132,132,123,115,123,123,115,115,115,123,123,123,123,123,132,123,123,132,132,132,132,132,132,132,132,132,140,140,140,140,140,156,123,148,156,82,99,107,99,90,74,123,156,148,140,140,148,189,189,173,165,156,165,173,181,173,181,181,132,123,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,132,140,140,140,132,132,123,123,115,115,115,115,115,115,115,115,123,123,123,132,132,148,165,148,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,66,57,57,57,57,57,57,57,66,57,57,57,66,57,57,57,57,57,57,57,148,173,99,57,57,57,57,57,57,57,57,57,66,57,57,74,123,156,148,156,156,165,181,123,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,66,57,57,66,66,74,74,74,66,66,49,57,49,57,49,57,57,140,189,115,107,123,115,115,132,115,123,115,123,132,123,132,123,132,156,148,140,115,115,115,115,115,140,123,123,123,123,115,115,132,115,115,115,115,115,115,115,115,123,115,115,115,
115,115,123,123,132,132,132,132,132,165,156,132,132,132,132,132,132,132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,132,132,140,140,140,140,140,115,165,140,74,107,99,90,90,66,115,165,140,140,140,140,148,189,165,148,165,173,173,189,148,173,156,132,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,132,140,140,140,132,123,123,123,115,123,115,115,115,115,115,115,123,123,123,132,140,148,165,173,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,156,140,66,49,57,57,57,57,57,57,66,99,156,115,57,132,165,140,140,140,140,165,173,66,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,74,57,57,66,82,82,82,82,74,49,57,57,66,57,49,57,57,74,173,140,107,165,148,156,132,123,132,148,148,123,123,132,123,132,156,140,132,115,115,115,132,123,115,132,115,115,123,123,132,123,115,115,115,115,115,115,115,115,115,115,115,115,
115,123,123,123,132,132,123,132,156,148,123,123,123,132,132,132,132,132,123,123,123,123,123,123,123,123,123,132,132,132,132,132,123,123,132,132,132,132,132,132,132,132,140,132,140,140,140,156,99,156,165,74,90,99,82,90,99,66,107,173,140,140,140,140,140,165,148,140,181,181,156,181,148,181,140,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,132,140,148,140,132,132,123,123,123,115,115,115,115,115,115,115,123,123,123,132,140,148,156,189,107,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,66,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,49,82,173,115,57,66,57,57,57,57,57,66,66,107,189,173,74,165,156,156,132,140,148,148,132,57,57,57,57,66,57,57,57,57,57,57,66,57,57,57,57,49,49,57,57,57,74,90,90,90,90,66,57,49,57,57,66,57,57,57,57,115,181,132,165,173,165,132,132,132,156,123,132,123,123,123,140,165,140,123,115,115,123,115,115,123,115,115,115,115,115,123,123,115,115,115,115,107,115,115,115,115,115,115,115,
115,123,123,123,123,156,173,156,173,132,123,132,123,123,132,123,132,123,123,123,123,123,123,123,123,123,123,132,132,132,123,123,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,165,99,165,99,57,99,90,74,74,82,57,82,181,148,140,140,140,140,148,148,148,189,181,99,181,181,156,132,123,115,115,115,115,115,115,115,115,115,115,115,115,123,123,115,123,123,132,140,148,140,140,132,123,123,123,115,115,115,115,115,115,115,123,123,123,132,132,148,148,181,132,57,66,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,115,173,74,49,66,57,57,57,57,57,57,90,123,189,189,140,156,99,74,57,57,66,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,57,66,57,74,99,99,90,99,82,57,57,57,57,57,57,57,49,57,66,173,181,165,156,181,156,123,132,140,156,132,140,115,123,140,156,148,140,115,132,140,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
123,123,123,123,173,132,140,132,140,132,132,123,132,123,132,132,123,123,123,123,115,123,123,123,123,123,132,132,123,123,123,132,132,132,123,132,132,132,132,132,132,140,132,140,140,140,148,148,90,173,82,74,107,82,66,74,66,57,82,181,156,148,156,148,148,148,148,156,189,148,57,173,165,132,132,123,123,115,115,115,123,115,115,115,115,115,115,123,115,115,123,123,132,132,140,140,140,140,140,132,132,123,123,115,115,115,115,115,123,123,123,123,132,140,148,140,156,173,74,66,57,66,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,148,156,57,57,66,57,57,57,57,57,57,107,181,181,165,156,132,49,57,57,49,49,49,49,57,57,57,49,57,57,57,57,57,57,57,57,66,57,49,57,49,49,57,74,49,74,115,107,90,107,82,66,57,57,57,57,57,57,57,57,57,165,181,181,181,156,173,140,132,156,132,123,132,115,123,140,148,156,165,148,123,115,115,115,115,115,107,115,107,115,107,115,115,115,107,115,115,107,115,115,115,115,115,115,
123,123,140,132,123,123,123,132,140,140,132,123,123,132,132,123,123,123,123,115,115,123,123,123,123,123,132,123,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,132,140,140,132,66,140,132,57,82,99,74,74,57,57,57,90,189,165,165,165,156,148,156,148,156,189,107,66,173,181,148,132,132,123,115,115,123,123,123,115,115,115,115,115,115,115,115,123,123,123,132,132,140,148,140,132,132,123,123,123,115,123,115,115,123,123,123,123,123,132,132,140,140,140,156,123,49,57,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,173,115,66,57,66,57,57,57,66,57,57,148,189,140,66,74,82,66,49,66,66,57,66,57,66,57,57,57,57,57,57,57,57,57,66,66,49,66,74,74,74,74,57,66,66,74,123,115,99,99,90,66,57,57,57,57,57,49,57,57,57,107,189,181,181,165,173,156,123,123,123,132,140,123,123,140,156,165,132,123,115,115,115,115,115,107,115,115,115,115,115,115,115,115,107,115,115,115,107,115,115,115,115,115,
123,123,132,140,123,123,132,132,132,132,132,123,123,132,123,123,115,115,115,123,115,123,123,123,123,132,123,123,123,132,123,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,132,66,156,90,57,99,90,74,74,66,57,57,74,173,173,181,173,173,165,156,140,173,189,82,82,181,173,148,132,132,123,115,115,123,123,123,115,115,115,115,115,115,115,115,115,123,123,132,132,140,148,140,132,132,123,123,123,123,123,123,123,123,123,123,123,123,132,132,140,140,132,148,148,74,57,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,82,140,74,66,57,57,57,57,57,66,57,90,189,156,74,66,57,49,49,57,74,66,57,74,66,57,57,57,57,57,57,57,57,57,57,57,49,74,115,140,148,140,132,82,57,74,90,132,132,107,99,74,66,57,57,57,57,57,57,57,57,57,66,173,189,181,181,165,173,132,123,123,132,123,123,132,148,148,165,132,123,115,115,115,115,115,115,107,107,115,115,107,115,115,115,115,115,115,107,107,107,115,115,115,123,
123,156,148,132,123,123,132,132,132,132,123,123,123,123,123,123,123,115,115,115,123,123,123,123,123,123,123,132,123,123,132,132,132,140,132,132,132,132,132,132,132,132,132,132,140,148,165,107,132,57,66,107,82,74,74,66,57,57,57,123,181,189,189,181,173,156,173,181,189,82,99,181,173,148,123,132,123,123,115,123,123,123,123,115,115,115,115,115,115,115,123,115,123,132,132,140,148,148,140,132,132,123,132,132,123,123,123,123,123,123,123,123,123,132,132,165,156,165,173,165,66,49,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,82,82,57,57,57,57,57,66,57,57,57,132,189,107,66,66,74,82,66,66,74,57,57,57,74,57,57,57,57,57,57,57,57,57,49,74,107,148,173,165,173,173,173,123,82,115,148,148,148,115,99,57,66,57,57,49,57,57,57,57,57,66,66,132,189,181,181,173,173,156,148,148,140,123,132,140,148,140,173,123,115,115,115,107,115,115,115,107,107,115,115,115,115,115,115,115,115,115,107,107,107,115,115,123,123,
148,132,123,123,132,123,132,123,123,123,123,123,123,123,115,115,115,115,115,123,115,123,115,123,123,123,123,123,123,132,123,140,132,132,132,132,132,132,132,132,132,132,140,148,140,156,115,148,74,57,74,99,82,74,66,74,57,57,57,57,132,189,173,132,156,165,181,181,181,66,132,181,173,148,123,132,132,123,123,123,123,123,123,123,115,115,115,115,115,115,115,123,123,132,132,140,148,140,140,140,132,132,123,123,123,123,123,123,123,123,123,123,132,132,132,156,140,148,173,189,140,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,66,57,49,57,90,74,57,57,57,57,57,57,57,57,57,156,189,66,82,82,90,107,74,66,74,66,57,66,90,49,57,57,57,57,57,57,57,57,74,132,173,173,173,173,165,165,165,156,115,148,156,148,156,140,74,57,49,66,57,57,57,57,57,57,49,57,57,107,189,181,181,173,173,165,132,132,140,123,132,148,148,148,156,115,115,115,115,115,115,115,107,115,107,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,115,
123,123,123,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,115,115,115,123,132,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,132,132,140,140,140,156,148,90,165,66,57,74,99,82,66,66,49,57,57,57,57,74,90,74,66,140,189,181,115,115,57,156,181,173,156,123,132,123,123,123,123,123,123,123,123,123,115,115,115,115,123,123,123,123,132,132,140,148,148,140,140,132,140,132,123,132,132,132,156,123,123,123,123,123,132,132,132,140,140,156,165,173,74,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,57,57,66,66,57,66,57,66,57,66,57,57,57,57,57,57,66,66,123,140,66,99,90,90,115,66,66,66,57,74,66,82,66,57,57,57,57,57,57,57,74,123,156,173,173,181,173,173,173,173,165,148,165,156,156,165,132,66,57,57,57,57,66,66,57,57,57,57,49,57,107,189,189,189,181,173,173,132,140,132,132,132,148,156,140,148,115,115,115,107,115,115,115,123,115,115,115,115,115,115,115,115,115,115,115,115,115,132,123,123,115,132,
115,123,123,123,123,123,123,115,115,115,123,123,115,115,115,115,115,115,115,123,123,115,115,123,132,123,123,123,132,132,140,132,132,132,132,132,132,132,132,132,140,140,140,140,156,107,132,140,41,66,74,82,74,74,66,66,57,57,57,57,57,66,66,57,74,90,90,57,57,57,173,173,181,148,132,132,123,123,123,123,123,123,123,123,123,115,115,115,115,115,115,115,123,123,132,140,140,148,148,140,140,140,132,132,123,132,132,140,132,123,123,123,123,123,132,132,148,148,156,165,165,66,74,66,57,57,57,57,57,57,57,57,57,66,57,57,57,66,57,57,74,156,82,57,57,57,49,66,66,49,57,74,57,66,57,57,57,57,57,57,57,57,66,57,82,99,90,90,99,49,66,57,57,57,57,82,82,74,57,57,57,57,57,74,132,173,173,181,181,173,173,173,173,173,173,165,165,165,165,156,148,66,57,57,57,66,66,49,57,57,49,57,57,66,148,189,189,189,181,173,173,148,132,132,132,132,148,165,140,148,115,115,115,115,115,115,115,115,115,123,115,115,115,115,115,107,107,115,115,115,123,123,115,115,123,123,
132,123,123,123,123,123,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,115,123,132,132,132,132,132,132,132,132,132,132,132,140,132,132,140,132,140,156,165,90,132,99,66,66,74,74,66,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,165,181,173,148,140,123,123,123,123,123,123,132,132,123,123,115,115,115,115,115,115,123,123,132,132,140,140,148,156,140,148,140,140,132,132,132,132,148,132,123,123,123,123,123,123,132,132,140,156,156,173,74,99,74,66,57,49,57,57,57,57,57,57,57,57,57,57,57,57,123,165,181,90,57,57,57,90,132,173,123,107,156,90,66,57,57,57,57,57,57,57,57,57,66,107,99,82,82,74,57,66,57,57,57,66,90,99,82,57,66,57,57,66,132,173,173,181,173,165,173,173,173,173,173,173,165,165,165,156,156,148,107,57,49,57,57,57,57,57,57,66,57,57,57,115,189,189,189,189,181,156,148,132,132,132,132,148,165,140,140,115,115,107,107,115,115,115,115,115,123,123,123,115,115,115,115,107,115,115,115,115,115,123,123,115,115,
123,123,123,123,123,115,115,115,115,115,115,115,140,115,115,115,115,115,115,123,123,123,115,115,115,123,115,123,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,156,156,66,66,57,57,74,74,74,74,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,123,189,181,156,148,123,123,123,123,123,123,132,123,123,123,123,123,115,115,115,115,115,123,123,123,132,140,140,148,148,140,140,140,132,132,132,132,148,140,123,115,123,123,132,132,132,132,132,148,148,173,90,57,99,74,66,66,57,57,57,57,57,57,57,57,57,57,57,74,181,173,181,90,49,82,140,173,156,165,181,181,189,140,66,57,57,57,57,57,57,57,57,49,74,99,82,82,74,66,57,74,57,49,57,66,90,99,82,57,57,66,57,82,156,165,173,173,173,173,173,165,165,173,173,165,173,165,165,165,156,156,132,66,57,57,82,74,57,57,57,57,57,57,66,132,189,189,189,181,181,132,115,148,123,132,132,148,165,148,140,115,107,107,123,115,115,115,115,132,140,140,132,115,115,115,115,115,115,115,115,123,123,115,115,123,123,
115,123,123,132,123,115,115,115,115,115,123,123,123,115,123,115,115,115,115,123,123,123,115,115,115,115,123,123,123,123,132,132,132,132,132,132,132,140,132,132,140,140,148,173,132,66,57,57,57,66,74,82,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,156,189,165,140,123,123,123,123,123,123,140,140,132,132,123,115,115,115,115,115,123,132,123,123,132,132,140,140,156,148,148,140,140,140,140,140,140,148,123,123,123,123,132,132,140,140,132,140,148,148,140,49,57,82,74,66,57,57,57,57,57,66,57,57,66,82,107,156,181,165,165,173,115,156,165,156,148,156,173,173,173,156,57,66,57,57,57,57,57,57,49,57,99,99,82,66,66,57,66,90,57,57,82,82,107,107,82,49,66,49,66,140,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,156,148,148,82,66,66,57,49,57,57,57,57,57,57,66,173,189,189,181,181,181,107,90,148,140,123,132,156,165,148,132,115,115,115,115,115,115,115,123,132,140,156,132,115,107,107,107,115,107,115,115,140,123,115,115,115,115,
123,115,123,132,115,115,115,115,115,115,123,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,132,132,132,132,132,132,132,132,140,140,165,165,90,66,57,49,49,66,90,90,82,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,181,181,140,123,123,123,123,123,123,132,132,132,123,123,123,123,115,115,115,123,123,123,123,132,140,140,140,156,156,140,140,140,140,140,148,156,132,132,123,123,123,123,140,148,148,132,132,140,140,173,99,66,82,66,66,66,57,57,57,57,57,57,57,90,173,181,181,165,156,165,156,165,165,156,156,148,148,156,165,165,173,74,49,57,57,66,57,66,57,66,82,107,90,82,57,57,57,74,82,57,82,107,99,123,115,99,57,49,57,99,165,173,173,165,173,173,173,173,173,173,173,173,173,173,165,165,165,156,148,148,99,66,66,66,57,49,57,57,57,57,57,90,189,189,189,173,181,181,115,123,90,132,115,140,148,173,156,132,115,115,115,115,115,115,115,115,115,123,148,132,115,107,107,115,107,115,115,115,123,115,132,132,132,132,
123,132,132,115,115,115,115,115,115,132,115,115,115,115,115,115,115,115,115,115,115,115,115,123,115,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,140,140,156,90,66,66,49,57,66,82,115,99,82,74,74,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,115,189,148,132,123,123,123,123,123,123,123,132,132,123,132,123,115,115,115,123,123,123,123,123,132,140,140,140,148,156,148,140,140,140,156,148,140,123,115,123,123,123,132,132,132,140,132,132,132,148,181,82,66,57,66,66,66,66,49,57,66,49,57,148,189,181,181,165,156,140,156,156,165,165,148,156,148,156,156,156,165,107,66,57,57,57,57,57,66,74,99,99,82,57,57,57,66,82,66,57,90,115,115,115,123,107,66,49,90,123,165,165,181,173,173,173,173,173,173,173,173,165,165,173,165,165,165,165,148,140,99,82,74,74,66,66,57,57,57,57,57,123,189,189,181,181,173,181,173,107,107,115,82,148,148,173,156,132,123,115,115,107,115,115,107,115,115,123,140,140,132,115,107,107,107,115,115,123,123,132,148,148,148,156,
148,148,148,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,156,90,74,57,49,57,74,90,90,99,99,90,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,49,57,57,57,123,156,140,132,123,115,123,123,123,123,123,132,132,123,132,115,115,115,123,140,123,132,132,132,132,140,140,148,156,156,148,140,148,156,140,140,123,123,123,123,123,123,140,140,140,132,132,132,132,156,115,66,74,74,66,66,57,66,57,49,57,57,90,189,181,181,173,148,140,156,156,156,123,132,156,156,148,148,107,165,123,66,57,57,57,57,57,57,82,90,90,57,49,57,66,57,57,57,57,74,99,123,132,132,99,74,74,115,148,165,173,181,173,181,181,181,173,173,173,173,173,173,165,165,165,165,156,148,132,99,74,57,49,57,57,49,57,57,57,74,181,189,189,189,148,90,148,189,148,66,74,57,90,99,148,123,132,123,115,115,107,107,107,107,115,115,123,123,140,132,115,107,115,115,115,115,123,132,140,132,132,140,148,
140,140,148,132,115,115,107,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,140,140,148,74,57,66,57,66,74,90,82,99,99,90,82,74,57,57,57,57,57,57,49,57,57,57,57,57,57,66,57,57,57,57,82,173,140,132,132,123,123,123,123,123,123,132,123,132,123,115,115,115,132,123,140,132,132,132,132,140,140,140,148,148,156,148,148,148,140,140,132,123,123,123,123,123,140,156,148,140,140,132,140,165,156,140,173,181,107,57,57,57,41,66,57,57,90,189,181,181,173,140,140,148,140,132,156,156,156,156,156,156,156,165,107,57,57,57,57,57,57,66,90,90,82,66,82,66,57,66,66,74,66,57,82,107,123,123,132,132,123,140,148,165,181,181,181,181,173,173,173,173,173,173,173,165,173,173,165,165,140,148,115,99,90,66,66,57,57,57,66,57,57,57,173,181,189,189,173,66,66,181,189,132,115,99,49,66,90,156,132,115,115,115,115,107,107,107,115,115,123,123,132,132,123,115,115,115,115,115,148,148,132,123,132,140,132,
132,132,132,132,123,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,140,140,107,57,66,74,66,57,82,90,90,99,99,107,99,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,66,173,148,140,132,132,123,123,123,123,123,123,123,123,123,123,123,123,140,123,123,123,123,123,132,132,140,140,148,156,165,156,148,148,148,140,132,132,132,123,123,115,123,140,140,123,123,123,132,165,140,140,165,156,165,123,74,66,74,66,66,57,115,189,173,181,148,140,140,148,132,165,165,173,156,115,107,132,90,156,115,57,57,57,57,49,57,82,90,90,74,115,99,74,66,66,74,74,57,57,57,82,82,90,115,156,156,148,165,173,173,165,148,165,173,173,173,173,173,173,173,165,148,156,140,156,132,123,99,90,90,74,66,66,57,66,57,57,57,57,99,181,181,189,173,66,49,173,173,181,181,165,74,66,57,165,140,115,115,115,115,107,107,115,115,115,123,140,132,123,123,115,115,115,115,115,132,132,123,123,132,140,132,
123,123,123,123,123,123,115,115,115,123,123,115,123,115,115,115,115,115,115,115,115,123,123,123,123,123,115,123,123,123,123,123,123,123,123,123,132,132,132,140,140,82,57,90,66,74,66,82,90,90,82,99,115,107,82,66,57,57,57,57,57,57,57,49,57,57,57,57,66,57,57,57,57,82,181,148,140,132,132,123,123,123,123,123,123,123,123,123,123,123,115,123,123,123,123,123,123,123,140,140,140,140,148,156,156,148,148,140,140,148,140,132,132,123,115,115,132,165,148,148,148,148,140,99,74,74,107,156,156,165,140,148,132,132,90,123,181,156,115,140,148,140,140,107,140,173,165,140,74,82,82,74,74,74,57,57,57,49,57,66,82,90,82,82,66,66,82,74,66,82,82,57,57,66,57,66,57,74,132,165,165,173,165,148,107,90,99,132,165,173,173,165,173,148,132,123,123,132,140,140,123,107,90,82,74,66,57,66,66,49,57,57,66,66,99,173,181,173,66,49,173,156,181,173,173,123,82,66,148,123,140,115,115,115,115,115,115,115,115,123,140,132,123,123,123,115,115,123,123,132,123,123,132,140,140,123,
123,123,132,123,123,123,123,115,115,115,123,123,115,123,115,115,115,115,115,115,115,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,140,156,66,57,107,82,74,82,90,90,82,90,123,132,99,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,99,165,165,148,132,132,123,123,123,123,123,123,123,123,123,123,115,115,115,115,123,123,123,123,132,132,140,140,140,148,156,173,165,165,156,156,156,165,140,140,140,132,132,132,148,132,123,132,140,57,66,49,66,66,123,156,148,148,156,156,156,181,181,173,82,82,140,140,148,140,90,115,156,173,99,57,66,66,66,82,57,57,57,57,57,90,99,82,90,82,66,74,66,57,66,74,82,57,57,57,57,57,57,49,66,132,156,165,156,123,82,74,66,66,74,99,156,165,165,156,132,115,132,140,148,156,148,132,99,82,74,74,66,57,66,66,57,57,57,107,132,148,181,181,140,66,99,173,156,181,156,173,173,132,57,148,148,123,115,115,115,115,115,115,115,115,115,123,132,123,132,123,123,123,123,123,123,115,115,123,140,123,123,
123,123,132,123,123,123,123,123,115,115,123,123,123,115,123,123,115,115,115,123,123,123,123,123,123,123,123,115,115,123,123,123,123,123,123,132,132,132,132,140,115,57,74,107,90,90,90,99,107,90,99,123,115,99,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,90,123,173,148,148,140,132,123,123,123,132,132,123,123,123,123,123,123,115,123,123,123,115,123,132,132,132,132,140,140,140,156,165,165,165,165,156,148,140,132,123,123,123,123,123,132,123,123,132,49,66,57,57,57,82,156,148,156,148,156,148,165,189,181,165,165,115,156,140,140,82,82,156,156,66,57,66,74,57,74,82,74,66,57,66,99,107,74,82,82,66,66,66,66,49,74,57,57,57,57,57,57,74,66,74,132,156,156,165,99,66,66,66,66,66,66,90,132,148,140,123,123,148,165,165,156,140,107,74,74,66,74,66,57,74,66,49,57,99,173,189,181,189,165,57,41,140,165,173,156,165,148,181,173,82,132,173,132,115,115,115,115,115,115,115,115,115,115,115,132,140,123,123,123,123,123,148,115,115,132,132,123,115,
123,123,115,115,115,115,123,123,123,115,123,123,123,123,115,115,123,115,115,123,115,123,123,123,123,115,123,123,123,123,123,123,132,132,132,132,132,132,140,148,66,49,90,82,90,99,99,82,99,82,90,107,132,99,82,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,99,181,156,148,148,140,132,123,132,123,132,123,123,123,123,123,123,123,115,123,115,123,123,123,123,132,132,123,132,148,156,165,173,165,173,165,140,140,132,132,123,123,115,123,140,132,156,107,57,57,57,57,57,74,173,173,148,156,156,156,123,156,173,165,156,107,148,156,123,66,132,173,156,66,57,66,57,57,57,74,82,74,74,82,90,90,74,82,66,66,66,66,57,57,57,66,57,57,57,57,57,74,115,107,132,165,173,123,66,66,66,66,57,57,66,57,74,115,123,132,140,140,156,156,140,90,82,74,74,74,74,66,66,82,66,49,57,90,148,181,148,181,181,57,82,165,156,148,156,156,140,156,181,107,82,165,132,115,115,115,115,115,115,115,115,115,115,115,123,132,123,115,115,115,115,140,107,115,123,123,115,115,
123,123,115,115,115,115,123,115,123,115,115,123,123,115,123,123,123,123,123,115,115,123,123,123,123,123,115,115,115,115,115,123,123,123,132,132,132,132,140,140,66,57,82,74,90,90,99,82,90,99,99,107,132,90,82,66,66,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,66,57,156,181,148,148,140,132,132,123,123,123,123,123,123,123,123,123,115,115,115,123,132,132,123,123,123,132,132,132,140,156,165,165,165,165,148,140,140,132,123,123,123,123,115,132,132,140,123,57,57,57,57,57,66,165,173,148,156,148,165,82,156,148,140,148,99,156,165,82,57,140,173,132,57,66,66,57,57,57,74,82,82,90,99,99,82,90,57,57,66,66,66,57,49,57,57,57,57,57,57,57,57,90,115,132,148,148,99,74,66,57,57,57,57,57,57,57,66,74,82,99,115,132,123,82,74,66,74,66,66,74,74,66,66,66,66,57,57,74,173,115,107,115,49,82,156,156,148,156,165,173,148,173,115,66,165,140,123,123,115,115,115,115,115,115,115,115,115,115,123,123,123,115,115,107,123,115,123,123,115,115,123,
123,115,115,115,115,115,115,115,115,115,115,115,115,115,123,123,115,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,140,140,132,132,132,140,148,132,66,66,74,74,82,90,90,74,90,99,90,107,123,90,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,115,181,181,189,173,148,132,123,123,123,123,123,123,123,123,115,132,123,132,140,132,132,123,123,123,132,132,132,140,148,165,165,156,156,148,140,132,132,123,123,123,123,123,123,123,132,148,57,57,57,49,57,66,132,173,173,156,156,156,74,156,140,148,115,57,107,148,66,66,99,156,140,115,107,49,57,66,66,57,82,90,99,99,99,82,99,57,49,66,66,57,57,57,57,57,57,57,57,57,57,66,57,66,74,82,123,148,115,90,66,66,57,57,57,57,57,57,57,57,66,74,82,74,66,66,66,74,74,66,66,66,66,74,66,66,57,57,49,90,148,49,57,57,66,99,156,148,148,173,165,156,156,123,99,173,140,123,115,115,115,115,115,115,115,115,115,115,115,115,123,115,115,115,123,123,115,132,123,115,115,123,
123,115,115,115,115,115,115,115,115,123,123,115,115,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,148,148,148,148,132,66,66,90,74,82,90,90,74,90,115,107,107,115,90,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,66,115,173,189,189,181,140,132,132,132,123,123,123,123,123,123,123,140,140,140,132,132,123,123,123,132,132,132,140,148,156,165,156,156,148,140,140,140,132,123,123,132,123,123,123,132,156,57,57,66,66,66,57,82,123,156,156,156,165,140,165,156,115,57,90,165,173,57,66,49,74,57,82,123,140,99,66,66,74,123,165,156,115,90,82,66,66,74,66,66,66,66,57,57,57,57,57,57,66,57,57,66,66,66,57,99,123,140,132,82,57,57,57,57,57,57,66,57,57,66,74,82,74,74,57,66,66,57,74,57,66,74,74,82,74,66,49,57,49,66,66,57,57,66,57,140,140,140,140,148,148,140,140,148,165,123,132,123,115,115,115,115,115,115,115,115,115,115,115,123,115,115,115,123,140,123,123,115,115,123,123,
123,115,115,115,115,115,115,115,115,123,123,123,115,115,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,140,140,140,140,148,148,148,148,148,140,74,74,82,82,74,99,90,74,82,99,99,99,107,90,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,90,181,189,189,156,140,140,132,123,123,123,123,123,123,132,140,140,132,132,123,123,123,123,132,132,132,140,140,156,165,156,156,148,140,140,140,140,123,115,115,123,123,132,148,132,57,57,49,57,66,49,49,57,148,156,165,148,115,173,123,66,90,156,173,140,66,49,66,66,57,74,181,173,173,123,115,165,181,165,165,140,90,74,57,99,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,74,107,90,115,115,132,148,123,99,74,57,57,66,82,66,66,66,66,82,99,74,66,57,57,66,57,66,74,74,82,82,74,74,74,57,57,57,49,57,57,57,57,74,107,140,140,140,140,140,156,132,165,148,156,115,132,123,123,123,115,115,115,115,115,115,115,115,123,123,115,115,115,123,115,123,115,115,115,123,
123,115,115,123,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,132,123,132,132,132,132,140,140,140,140,140,148,148,148,156,148,123,57,74,82,82,82,74,82,82,90,107,107,99,99,74,66,66,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,57,57,66,57,99,189,181,181,189,156,148,132,132,123,123,132,123,132,148,140,140,132,132,123,123,123,123,132,140,132,132,140,148,156,156,148,148,140,140,140,140,132,123,123,123,123,140,156,132,57,49,57,66,57,66,66,74,156,156,148,156,140,156,66,66,173,189,140,66,57,66,57,66,57,90,173,156,165,165,173,173,165,156,165,99,57,82,99,90,66,66,66,66,57,57,57,57,57,57,57,66,57,57,57,66,99,99,123,115,99,107,140,148,132,115,132,90,74,66,57,57,57,66,82,82,66,57,66,74,74,57,66,66,66,66,66,66,66,74,57,57,57,57,57,57,57,57,66,140,123,140,148,140,140,132,107,74,148,132,115,156,123,123,123,115,115,115,115,115,115,115,123,123,115,123,123,132,115,123,123,115,115,123,
123,123,123,123,115,123,115,115,115,115,115,115,115,115,115,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,148,132,57,82,82,74,66,66,66,82,90,115,107,90,82,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,49,57,74,189,189,189,173,189,181,165,140,132,132,132,132,140,165,181,148,140,123,132,123,123,123,132,140,140,140,140,148,156,156,148,148,148,140,148,132,140,132,123,123,115,165,156,148,74,90,107,107,107,66,66,57,123,132,90,148,165,107,49,99,189,140,74,66,66,57,66,49,57,66,156,156,165,165,165,165,156,165,123,90,115,74,66,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,49,66,57,66,57,66,99,107,90,90,90,107,123,132,82,82,57,66,82,90,57,74,66,74,82,74,82,66,57,66,57,66,57,66,74,74,57,57,57,57,57,66,57,57,49,82,57,82,132,140,148,156,99,49,74,140,132,132,156,123,123,115,115,115,115,115,115,115,115,123,123,123,123,123,123,115,115,115,115,115,
115,115,115,123,123,123,115,115,115,115,115,115,115,123,115,123,123,123,115,123,123,123,123,123,132,132,132,132,132,140,140,140,140,140,148,140,148,148,156,148,57,74,74,74,57,74,107,90,90,115,107,90,74,74,66,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,107,165,181,82,165,189,189,181,148,140,140,140,165,189,189,156,132,132,132,123,123,123,132,140,140,140,140,148,148,156,156,148,148,148,148,132,123,140,132,132,132,123,132,181,181,189,189,173,181,57,57,57,49,57,66,82,148,82,66,165,165,66,57,57,57,57,57,57,66,49,140,181,165,156,156,156,165,132,82,74,66,49,66,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,66,57,57,57,66,82,107,123,90,82,90,74,82,90,57,66,66,66,66,74,90,74,74,57,57,57,57,57,57,66,57,57,57,57,57,57,57,49,57,57,49,66,57,107,140,148,165,140,66,107,156,173,132,140,156,123,115,115,115,115,115,115,115,115,115,123,115,123,132,123,123,123,115,115,115,
115,115,115,115,123,115,115,123,115,115,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,140,140,140,140,140,148,156,156,148,156,165,57,57,66,74,74,82,107,107,90,115,90,90,74,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,49,74,148,90,90,148,181,181,181,173,140,165,181,189,189,156,140,132,123,123,123,140,140,140,140,148,140,148,148,156,156,148,148,148,148,132,123,132,132,123,123,123,123,140,132,132,132,148,173,74,57,57,66,57,82,66,74,57,90,173,123,66,66,66,57,57,49,57,49,57,99,181,173,148,107,156,132,66,57,57,57,57,57,66,66,66,66,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,99,90,66,74,66,57,49,49,66,66,57,74,82,74,90,82,74,66,66,66,66,66,57,57,66,66,57,66,66,49,57,57,57,57,49,66,49,66,57,49,74,156,156,173,148,107,181,173,165,165,115,140,156,123,123,115,115,115,115,115,115,115,115,115,132,140,115,123,115,115,115,115,
115,115,115,115,115,123,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,140,156,148,148,156,165,57,57,57,74,74,74,99,99,99,107,74,74,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,74,115,82,66,132,181,189,181,189,181,181,189,189,165,140,140,123,132,132,140,132,132,132,140,140,148,148,156,156,148,148,140,140,140,132,132,140,132,140,132,132,132,123,123,132,140,189,82,57,57,57,57,82,66,49,57,66,140,74,49,57,57,57,57,66,57,66,57,57,165,189,132,57,140,115,57,57,57,57,57,57,66,66,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,82,107,66,66,49,66,57,66,66,66,90,82,90,115,82,82,82,66,66,66,66,57,57,57,66,66,49,57,57,57,57,57,57,57,57,66,57,57,57,57,57,107,156,181,156,173,181,156,165,165,156,115,140,148,123,123,123,115,115,115,107,115,115,115,115,123,115,123,115,115,115,115,
115,115,115,115,115,115,123,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,148,156,156,148,156,165,57,57,57,57,74,74,82,90,82,90,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,49,57,107,140,107,148,181,181,189,189,189,189,189,189,165,140,123,123,132,132,132,132,132,140,140,140,148,156,148,148,148,140,140,132,132,132,132,123,123,123,123,123,132,132,123,173,181,74,57,57,57,57,66,90,74,74,66,57,57,57,57,57,57,57,57,57,57,57,57,107,165,107,82,181,181,74,57,57,57,57,57,66,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,66,74,66,66,57,57,49,74,82,107,90,99,90,82,82,90,82,82,74,66,66,66,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,49,57,66,156,173,173,173,165,148,148,156,173,165,123,140,123,123,123,115,115,115,115,107,115,123,140,115,115,115,115,115,115,115,
115,115,115,115,115,123,115,115,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,140,148,156,156,156,156,148,57,66,57,57,49,66,82,82,74,82,66,57,57,57,66,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,156,181,156,181,181,181,165,165,156,189,189,189,181,181,156,140,132,132,132,132,132,132,140,140,148,148,156,148,148,140,132,123,132,132,132,132,132,132,123,132,123,123,156,189,132,57,57,57,57,49,66,82,90,99,90,66,66,57,57,57,57,57,66,49,57,57,57,66,82,57,49,90,140,99,57,57,57,57,57,66,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,74,66,57,57,90,115,99,82,99,99,107,107,107,82,74,74,74,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,115,173,173,99,156,148,148,148,148,165,148,115,140,123,123,123,115,115,115,115,115,132,132,123,115,107,115,115,115,115,
115,115,115,123,115,115,123,115,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,140,132,140,140,148,148,156,148,156,132,66,66,57,57,57,66,74,82,74,74,66,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,57,66,82,189,181,181,173,140,140,115,107,140,189,189,189,181,181,181,148,132,132,132,132,132,132,140,140,140,148,156,148,140,140,132,132,132,132,123,123,132,123,123,132,132,156,189,156,82,57,57,57,57,57,49,66,57,82,82,74,66,57,57,57,57,57,66,57,66,49,57,57,57,57,57,57,66,66,57,57,57,57,66,57,66,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,82,82,66,57,82,115,99,82,74,99,115,115,107,82,82,66,66,82,74,66,57,57,57,57,57,57,66,49,57,57,57,57,49,49,57,57,57,57,66,66,173,165,123,156,140,140,140,140,148,173,140,132,132,132,123,115,115,115,115,115,123,148,115,115,115,115,115,115,115,
115,123,115,115,115,123,115,115,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,132,132,140,140,140,140,148,148,148,156,156,173,115,123,66,66,57,57,66,74,90,66,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,99,74,49,90,165,198,189,173,82,57,57,74,165,181,189,189,181,181,181,140,132,132,132,132,132,132,132,140,148,148,156,148,140,132,132,132,132,132,123,123,132,132,132,148,181,189,156,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,49,57,49,66,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,49,82,115,115,74,66,82,99,115,115,99,82,74,66,74,82,82,66,57,57,57,49,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,132,173,132,181,165,156,148,140,140,156,156,123,156,115,115,115,115,115,115,107,123,132,115,115,123,123,115,115,115,
123,115,115,115,115,123,123,123,115,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,132,140,140,132,140,140,148,148,148,156,156,148,74,115,66,74,66,66,66,74,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,132,99,74,165,156,181,181,115,66,66,82,181,189,181,165,156,173,173,140,132,132,132,132,132,132,140,140,140,148,156,148,140,140,132,132,132,132,132,132,132,156,165,181,181,181,181,148,148,66,57,57,57,57,57,57,57,66,57,57,57,49,57,57,57,49,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,99,115,107,107,74,66,82,99,99,99,90,74,74,57,66,82,82,66,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,49,57,57,66,49,90,173,99,165,181,173,165,165,148,148,165,156,115,140,123,115,115,115,115,115,140,132,115,132,123,123,115,115,115,
132,132,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,132,132,132,132,132,132,140,140,140,140,140,140,148,148,148,156,156,148,66,99,74,57,74,74,74,74,82,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,148,173,148,132,181,181,156,66,115,148,181,181,181,156,156,148,148,140,132,132,132,132,132,140,140,140,148,148,156,140,140,140,132,140,132,132,123,132,148,181,181,181,181,181,189,189,156,156,90,57,57,57,57,57,57,57,57,49,57,66,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,99,123,107,99,82,74,82,82,99,90,82,74,66,66,57,66,74,74,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,49,57,57,74,181,57,140,181,173,173,173,165,165,165,173,132,123,132,115,115,115,115,115,132,115,115,123,123,123,123,123,123,
140,140,132,148,140,123,123,123,123,123,123,123,123,132,132,132,123,132,123,123,123,132,132,132,132,140,140,140,140,140,140,140,140,148,148,156,156,90,74,66,82,74,74,66,82,82,90,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,49,74,107,107,107,99,132,181,90,173,181,181,181,173,156,148,148,132,132,132,132,132,132,140,140,140,140,148,148,148,140,140,132,140,140,132,123,123,123,148,165,181,181,189,189,140,156,173,189,173,66,57,57,66,49,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,74,82,99,107,99,107,66,66,66,99,99,99,82,82,74,57,57,57,66,74,66,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,49,57,66,173,57,156,181,173,173,173,173,165,165,156,173,123,132,123,115,115,115,123,140,123,132,123,123,132,140,140,140,
115,123,123,123,123,123,140,148,123,123,123,123,123,123,132,123,132,132,123,123,123,123,132,132,132,140,140,140,140,140,140,140,140,148,156,156,173,99,74,82,90,74,57,74,90,90,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,57,57,57,57,57,57,66,57,57,49,49,57,57,66,140,123,156,181,181,181,173,156,156,148,132,132,132,132,132,140,132,140,140,140,148,148,140,140,140,140,140,140,132,132,132,156,156,156,189,189,189,189,165,82,66,82,107,123,74,57,57,57,57,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,74,74,90,107,82,82,74,66,90,90,107,90,74,74,74,57,57,57,66,66,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,66,57,57,57,66,173,74,165,181,173,173,173,165,173,173,165,148,165,123,132,115,115,123,132,140,132,132,132,148,132,123,115,115,
173,173,156,132,123,123,115,115,132,140,132,132,132,132,132,123,123,132,132,132,123,123,123,132,132,140,140,140,140,140,140,140,148,148,148,173,181,82,82,82,82,57,66,74,90,107,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,107,148,66,57,57,57,57,57,57,57,57,66,57,57,57,57,57,90,148,181,181,181,173,148,140,140,132,132,132,140,140,140,140,140,140,148,156,148,140,140,140,148,148,140,132,123,132,173,173,173,165,99,148,189,148,82,57,66,90,189,148,66,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,66,57,57,57,57,57,66,74,74,82,90,74,66,66,57,74,82,99,99,90,74,57,66,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,49,66,49,49,57,57,132,74,181,173,173,173,173,173,173,173,181,99,140,140,132,123,115,123,140,148,140,140,132,107,140,132,156,165,
165,148,165,181,181,181,156,140,123,115,132,140,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,148,148,148,181,123,66,74,66,57,57,74,82,99,90,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,66,57,57,57,57,57,66,57,74,173,189,74,57,57,66,57,66,57,57,57,57,57,57,57,57,66,49,140,181,181,181,156,140,140,140,132,132,140,148,140,140,148,140,132,148,140,140,140,140,140,140,140,140,132,132,140,173,181,181,173,74,66,132,165,66,57,57,57,173,181,107,57,57,66,57,57,57,57,57,66,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,74,74,74,57,66,66,82,99,90,82,57,57,49,66,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,49,57,66,57,57,57,57,107,82,181,173,173,173,173,173,181,181,181,74,99,140,115,132,115,123,140,140,140,115,123,156,181,181,181,181,
165,140,140,140,156,173,181,189,148,132,123,115,123,148,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,156,132,148,156,90,66,66,66,57,74,74,90,90,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,99,156,173,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,66,148,181,181,165,148,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,140,140,148,148,132,140,181,181,181,181,90,57,99,165,90,57,66,140,189,189,165,82,66,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,66,74,57,66,74,90,82,57,57,57,66,57,66,66,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,123,90,181,173,165,173,173,173,181,181,181,49,66,132,132,132,132,148,132,132,115,165,165,156,140,140,140,156,
165,140,140,140,140,148,156,173,165,148,165,156,132,115,107,115,132,132,132,132,132,132,132,132,140,148,140,140,140,140,148,156,148,132,165,107,66,66,66,66,66,66,82,82,66,66,57,57,57,57,57,57,57,57,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,115,189,156,57,57,57,57,57,57,57,57,57,57,57,57,57,90,74,123,181,181,181,156,140,140,140,140,140,140,140,140,148,148,156,156,148,148,148,140,140,140,140,140,140,156,156,156,148,165,198,189,173,66,57,107,189,165,57,74,189,189,189,189,173,148,82,74,74,74,99,66,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,49,57,49,57,57,57,49,66,82,82,74,57,57,57,66,49,57,57,66,66,57,57,57,66,57,49,49,49,49,49,57,66,57,57,49,66,57,115,115,90,173,140,173,165,165,165,173,181,181,181,165,57,57,99,148,123,148,148,132,123,156,148,140,140,132,140,140,148,
148,140,140,140,140,140,156,165,173,173,173,148,173,181,165,140,115,115,132,132,132,156,148,140,132,140,140,140,140,148,148,156,156,165,173,90,66,57,57,57,57,66,82,66,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,123,189,132,57,57,57,57,57,57,57,57,57,57,57,57,57,66,82,173,181,189,173,148,140,140,140,148,140,140,140,148,148,148,156,156,156,148,148,148,148,148,148,140,140,156,165,156,156,148,156,165,189,148,66,66,156,123,57,123,189,189,189,181,189,189,90,132,148,148,181,148,82,140,82,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,57,74,74,66,57,57,57,57,49,57,66,57,74,74,66,57,57,57,57,57,66,57,57,57,49,49,49,57,57,57,99,140,173,181,181,173,173,165,165,173,173,181,181,181,140,57,66,57,107,132,123,132,132,165,148,140,140,140,140,140,140,173,
140,140,140,140,140,140,148,156,165,181,189,165,132,140,173,189,173,140,115,140,140,140,132,140,140,140,140,140,148,148,148,148,173,107,123,66,66,57,57,66,66,66,57,57,66,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,107,123,165,189,181,132,57,57,57,57,66,57,57,57,57,57,57,66,123,173,189,189,181,165,156,148,140,148,140,148,148,148,148,148,156,165,156,156,156,148,148,148,148,148,148,140,156,173,173,156,156,148,156,173,189,132,132,115,57,74,189,189,189,189,189,189,181,90,132,115,156,173,189,181,189,173,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,66,57,57,57,57,57,57,49,66,74,66,66,66,57,57,57,49,57,57,49,49,49,49,57,57,57,49,90,165,181,181,181,181,173,173,173,181,181,181,181,181,132,57,49,57,66,148,115,123,173,148,140,140,140,140,140,165,173,148,
140,140,140,140,140,140,140,156,181,189,189,189,173,123,99,156,189,189,165,115,123,132,132,132,132,140,140,148,148,148,156,156,165,99,82,66,57,66,74,66,66,57,57,57,57,57,57,57,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,82,148,181,189,189,189,156,181,107,57,57,57,57,57,57,57,57,57,57,99,181,181,173,156,156,148,148,140,140,148,148,148,148,148,148,148,156,165,165,156,156,148,148,148,148,156,165,165,165,165,173,181,165,148,148,156,181,189,165,82,66,140,189,189,189,189,189,189,165,57,140,132,74,132,173,189,189,181,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,82,74,66,66,66,57,57,57,66,57,57,66,66,66,66,66,57,115,173,181,181,181,181,181,181,181,181,181,181,181,140,57,66,49,66,115,132,156,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,165,181,181,189,189,189,189,189,189,140,90,148,181,165,173,123,115,140,140,148,140,148,140,148,148,156,156,115,90,74,66,74,66,74,66,66,57,57,57,57,57,66,57,57,57,57,57,57,57,57,66,57,57,66,57,57,66,66,66,82,156,198,189,181,189,189,156,181,140,57,57,57,57,57,57,57,57,57,66,148,189,181,165,148,148,140,140,140,140,140,140,140,148,148,148,148,156,165,165,156,156,148,148,148,148,148,156,165,165,173,173,181,181,156,156,165,173,189,148,57,57,156,189,189,189,189,189,189,173,66,123,189,57,57,99,181,181,181,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,49,66,57,57,57,57,57,57,57,57,57,66,74,66,74,57,66,82,74,66,49,66,66,57,57,57,57,57,66,57,49,57,148,181,189,181,181,181,181,181,181,181,181,181,173,66,57,66,57,74,148,140,140,140,140,148,132,140,140,140,140,140,
140,140,148,140,173,181,189,189,189,189,189,189,189,181,181,132,82,173,99,140,181,148,123,132,140,140,140,140,148,148,156,115,115,90,74,74,74,82,74,74,74,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,140,140,181,189,181,189,189,189,189,189,189,115,57,57,57,57,57,57,57,57,57,66,165,181,173,156,148,148,140,140,140,140,140,140,140,148,148,148,148,156,156,165,165,156,156,148,148,156,148,148,156,173,173,173,173,181,173,156,165,173,173,140,66,82,115,189,189,189,189,189,189,181,148,140,132,57,57,82,173,156,189,107,140,90,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,66,66,66,74,74,66,57,66,57,57,66,57,57,57,57,57,57,66,66,148,181,181,181,181,181,181,181,181,181,181,189,123,66,57,57,82,148,140,140,140,156,165,148,140,140,140,140,140,
140,140,140,148,181,181,189,189,189,189,189,189,189,189,189,173,66,82,148,123,189,181,156,123,140,140,140,140,140,148,156,99,82,74,66,66,82,82,82,82,57,57,57,57,57,66,66,66,66,66,66,57,57,57,66,57,57,57,66,57,57,66,181,189,189,189,189,189,189,189,189,181,173,66,57,57,57,57,57,66,66,57,57,115,181,181,156,148,148,148,140,140,140,140,148,156,140,140,148,148,148,148,156,156,165,165,156,156,156,156,156,148,148,165,173,173,173,181,181,165,165,181,173,148,90,123,181,189,189,189,189,189,148,123,181,189,82,66,66,74,181,173,189,165,173,99,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,66,49,57,66,66,66,57,66,57,57,66,66,66,66,57,49,57,57,49,57,74,173,181,189,181,181,189,181,189,181,181,181,173,115,57,57,140,156,148,140,140,148,173,148,140,140,140,140,140,
140,148,165,181,189,189,189,189,189,189,189,189,181,123,123,115,74,66,90,173,181,181,173,140,132,148,148,132,165,165,99,74,74,66,66,66,74,74,82,74,57,57,57,57,57,49,49,57,57,57,57,66,57,57,57,57,57,57,57,57,82,140,189,189,189,189,189,189,189,189,189,189,99,57,57,57,66,57,82,140,148,66,66,156,189,173,156,148,148,148,148,140,140,140,148,156,165,156,148,148,148,148,148,156,165,165,165,156,156,148,156,148,148,156,181,173,173,173,173,165,156,173,189,181,156,140,189,189,189,189,189,173,74,57,99,165,66,57,57,66,132,181,189,165,123,66,57,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,49,57,90,181,181,181,181,181,189,165,156,173,181,181,181,107,57,107,140,132,132,140,156,173,148,140,140,140,140,140,
140,181,189,189,189,189,189,189,189,173,189,173,173,66,57,57,57,57,90,181,107,156,181,173,156,140,148,181,156,74,74,57,74,66,66,66,74,57,66,57,57,66,57,66,49,57,66,57,57,57,57,57,57,57,57,66,57,57,57,57,107,189,189,189,189,189,189,189,189,189,181,189,140,57,66,57,57,57,115,181,189,107,90,189,181,173,156,148,148,148,148,148,140,148,148,156,156,165,156,148,148,148,148,156,156,165,165,165,156,156,156,156,148,148,156,173,181,173,173,165,173,173,173,189,189,181,181,181,189,189,181,156,74,57,49,90,57,49,57,57,57,148,181,181,173,123,107,123,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,49,49,57,57,57,57,57,57,57,57,57,49,49,57,57,90,99,99,90,107,148,115,66,99,173,181,181,173,82,57,165,173,156,140,156,181,148,140,140,140,140,140,
156,189,189,189,189,181,189,189,189,132,156,99,90,66,66,49,57,57,57,115,90,74,99,165,156,115,99,90,74,66,74,74,66,66,66,66,49,57,57,57,57,57,57,57,66,57,57,66,57,66,57,57,57,57,57,57,57,57,57,57,99,189,189,189,189,189,189,189,189,189,189,181,173,57,57,57,57,49,132,165,181,156,156,189,181,165,156,148,148,148,148,148,148,140,156,165,107,156,165,156,148,148,148,148,156,165,173,165,165,156,156,156,148,148,156,156,156,165,173,173,165,165,173,173,181,189,181,173,189,189,189,148,82,66,57,57,57,57,57,57,66,156,173,156,90,123,148,181,132,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,49,57,49,57,49,57,49,49,49,57,49,57,66,165,181,181,181,165,82,99,107,115,148,132,115,140,140,140,140,140,148,
181,189,189,189,189,189,189,189,189,189,132,74,57,57,66,57,66,57,66,66,107,90,82,107,74,66,66,99,99,82,66,57,57,74,74,66,66,66,66,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,181,181,189,189,189,189,189,189,189,189,189,132,57,57,57,66,82,140,181,181,173,181,181,173,156,156,148,148,148,148,148,148,156,107,90,66,115,173,156,148,148,148,148,156,156,165,173,165,165,165,165,156,156,156,156,156,165,173,181,181,181,173,181,173,181,189,181,189,189,189,132,66,74,57,49,57,57,57,57,140,189,181,90,57,49,57,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,66,57,57,57,57,49,57,66,57,57,66,57,74,173,181,173,132,165,74,57,49,66,66,74,123,165,140,140,148,165,
181,189,189,189,189,189,189,189,189,189,74,57,57,57,49,57,57,49,66,74,66,66,74,82,74,66,74,90,82,74,74,66,66,66,66,74,74,74,74,57,66,57,57,57,57,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,132,181,181,189,189,181,181,189,181,181,156,140,57,57,57,74,173,189,181,173,148,181,181,181,156,156,156,156,148,148,148,165,82,74,74,82,90,173,156,156,148,148,148,156,156,165,165,173,165,165,165,165,156,156,156,156,165,165,165,173,181,173,173,181,173,181,189,189,181,181,140,74,66,74,57,57,49,57,49,148,181,189,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,66,66,66,74,66,66,66,57,66,57,57,49,57,57,99,148,140,66,115,123,49,66,57,57,49,66,123,173,165,165,181,
189,189,189,189,189,181,189,189,189,189,107,57,49,57,57,57,66,57,74,57,49,57,74,57,57,82,99,74,57,66,74,57,74,66,66,66,82,82,74,66,49,57,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,74,165,189,181,189,189,189,148,156,181,148,140,99,123,107,165,181,165,115,99,165,181,181,181,165,156,156,156,156,148,156,123,66,90,115,107,90,181,165,156,156,148,148,148,156,165,165,173,173,165,165,165,165,165,156,156,165,165,173,173,181,181,173,189,173,165,181,181,181,181,165,99,74,66,57,49,57,57,57,123,189,189,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,66,57,57,57,57,57,57,57,57,74,82,74,74,57,57,57,57,66,66,57,57,57,57,57,49,66,140,66,57,57,57,66,49,57,82,123,156,165,
189,189,189,189,189,189,181,148,189,189,173,90,82,57,57,57,57,57,57,74,82,49,66,66,57,57,57,49,66,66,57,57,66,66,66,66,82,90,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,82,140,189,189,181,156,165,148,181,181,156,173,189,181,181,107,66,74,123,107,181,189,181,173,165,156,156,156,156,173,74,82,107,115,107,74,140,165,156,156,156,148,148,156,165,165,165,173,173,173,173,165,156,165,156,165,173,181,181,181,181,181,181,181,173,173,173,181,181,198,173,115,74,57,57,66,57,57,66,156,181,90,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,82,74,66,66,66,49,57,49,49,49,57,57,57,57,57,57,57,66,57,57,57,57,57,57,49,57,57,57,123,
189,189,189,189,189,181,140,173,189,189,189,181,173,123,57,57,57,57,57,57,66,74,57,82,82,66,57,57,57,57,57,57,57,66,66,82,74,74,66,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,66,57,57,66,66,66,90,181,181,132,74,140,140,123,189,165,165,181,181,148,66,57,90,57,66,156,181,181,173,173,165,165,173,173,123,66,90,115,123,123,90,82,173,173,165,156,156,148,156,156,165,165,173,189,173,156,115,74,115,156,173,173,189,181,181,173,173,165,156,156,165,165,173,173,173,181,173,140,90,66,57,49,57,57,74,132,173,82,57,57,57,57,57,57,57,57,66,90,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,49,49,49,57,57,57,66,74,66,57,66,66,66,66,57,57,57,49,66,57,57,57,57,49,49,57,57,49,57,57,57,57,57,57,57,173,
189,181,189,181,123,165,189,189,189,181,132,156,156,123,66,49,57,57,57,57,57,57,66,66,49,66,57,57,57,57,74,66,66,74,82,74,74,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,123,140,57,66,82,173,181,156,90,132,132,74,57,57,57,57,107,173,189,189,181,173,173,173,173,181,90,66,82,115,115,123,115,82,156,181,173,173,156,156,156,156,165,173,181,181,173,99,57,57,66,82,123,189,173,181,181,173,148,140,148,156,156,156,165,165,173,181,181,189,123,57,57,49,57,57,57,66,173,173,74,57,57,57,57,57,57,74,140,140,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,49,57,66,66,57,57,57,66,57,57,74,57,74,57,57,57,57,49,66,57,57,57,57,57,57,49,57,66,57,57,57,57,66,66,123,181,
165,181,181,82,57,123,189,181,181,132,57,57,57,66,57,57,57,57,57,57,49,57,57,49,57,74,66,57,57,66,66,74,74,74,74,82,82,66,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,57,66,90,140,66,107,173,189,189,156,74,90,66,57,57,57,57,115,165,123,173,189,181,181,181,181,189,156,74,57,82,107,115,115,107,74,132,173,181,181,173,156,156,156,165,181,181,189,148,74,66,57,66,57,57,156,181,181,165,156,148,148,148,148,156,156,156,165,173,181,189,181,189,115,57,57,57,57,57,49,148,189,165,57,57,57,57,57,57,99,181,132,181,115,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,66,49,57,57,66,66,66,66,66,57,57,57,57,57,57,57,57,57,57,57,66,57,57,49,57,57,49,57,57,57,66,66,74,
132,82,74,57,57,66,107,181,173,90,66,66,82,66,57,57,57,57,49,57,66,57,57,66,66,49,57,57,66,66,57,57,57,66,66,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,99,66,115,123,165,189,181,189,189,181,181,107,57,57,57,74,156,115,57,123,181,181,181,181,181,173,99,49,66,82,99,115,123,107,82,74,90,107,156,181,181,181,181,173,181,189,173,107,99,132,90,82,66,107,181,181,181,181,165,156,148,148,148,148,148,148,173,173,181,181,181,189,165,66,57,57,49,57,57,74,115,107,57,57,57,57,57,66,107,189,173,165,132,74,57,66,57,57,57,57,57,57,57,57,57,66,57,57,57,49,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,49,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,66,74,74,66,57,66,74,66,57,57,57,57,57,57,57,49,66,57,57,66,57,49,49,57,57,49,57,57,57,57,
74,57,57,74,90,66,115,181,189,181,140,148,173,107,66,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,66,57,57,57,57,57,57,57,57,57,57,57,57,57,90,99,107,156,181,189,189,189,189,140,66,57,57,57,90,66,57,82,165,181,181,181,189,173,82,74,66,82,99,107,115,115,99,90,74,90,74,123,189,181,181,181,181,181,189,165,165,181,173,181,140,173,189,181,173,173,165,148,148,140,148,148,148,156,173,173,181,181,181,181,189,107,57,57,49,57,49,57,57,57,57,57,57,49,57,90,132,99,74,66,90,156,132,115,57,66,57,57,57,57,57,57,57,57,57,57,57,66,49,57,66,66,99,132,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,66,66,74,66,57,57,74,66,57,57,57,57,57,57,57,57,57,57,57,57,66,49,66,57,57,57,49,57,57,57,57,
57,57,57,99,156,165,181,189,189,181,198,148,82,49,49,57,49,57,57,57,57,57,57,57,57,49,57,57,57,66,49,57,66,57,57,57,57,66,57,57,57,57,57,57,66,57,66,66,66,57,66,99,57,57,57,57,57,66,57,82,66,57,57,57,57,82,82,57,57,74,165,189,189,140,156,189,115,57,66,57,57,82,99,140,181,173,173,181,189,165,66,82,66,74,90,107,115,115,115,107,99,107,99,90,156,181,181,181,173,181,181,189,189,189,181,189,189,189,181,165,173,165,165,156,148,140,140,140,148,165,173,173,173,181,189,181,181,181,90,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,66,57,57,148,189,107,148,165,74,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,74,148,140,57,57,66,57,57,57,57,57,57,57,49,57,57,49,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,57,49,57,57,57,57,57,66,74,57,57,66,57,57,57,57,57,49,57,57,57,57,57,66,57,57,57,66,49,49,66,57,49,57,57,49,49,
49,66,107,173,198,189,189,189,189,181,132,66,57,57,57,57,66,66,57,57,57,57,66,57,49,57,49,57,66,57,66,57,57,66,57,57,57,57,57,57,57,57,57,57,57,66,115,148,148,123,148,115,66,74,107,148,140,132,90,115,107,57,57,66,57,140,123,57,57,90,181,181,181,90,107,132,90,57,57,66,90,123,173,189,173,165,181,189,189,181,90,82,66,74,90,99,107,115,123,115,123,132,123,90,82,148,156,181,181,181,173,181,173,181,181,173,181,173,165,165,165,165,165,148,140,140,140,140,148,173,173,173,173,165,173,189,189,165,148,90,66,66,49,57,57,57,57,57,57,57,57,57,57,57,57,74,123,189,189,107,90,181,148,90,57,57,74,66,57,49,66,57,57,57,57,57,74,57,49,74,181,74,74,90,57,57,57,57,57,57,57,66,57,49,57,57,49,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,57,57,57,57,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,49,57,66,66,57,57,57,57,57,57,66,
90,148,189,189,181,189,189,189,189,173,90,74,57,66,57,57,57,66,66,66,66,74,66,74,66,57,57,57,57,66,74,74,57,57,57,57,57,57,57,57,57,57,57,57,74,74,107,132,107,107,132,107,107,140,156,165,173,173,90,107,165,90,66,82,66,140,181,82,66,90,173,173,189,156,132,99,49,57,66,90,165,189,173,173,173,181,181,181,181,189,132,107,66,74,90,99,107,115,123,123,123,132,123,99,82,82,66,90,107,148,173,165,173,173,173,173,173,173,165,165,156,165,165,156,140,140,140,148,156,156,165,165,156,156,156,173,198,189,140,107,82,66,57,57,57,57,57,57,57,57,57,57,57,66,99,165,181,181,173,148,156,189,156,173,140,115,140,132,115,90,115,66,57,57,57,82,140,66,66,74,165,82,90,90,57,57,57,57,57,57,57,49,49,57,57,57,57,49,66,57,66,57,57,57,57,57,49,57,57,57,57,57,57,66,57,57,57,57,57,66,57,57,49,57,57,49,57,66,57,49,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,66,66,82,74,57,66,57,57,57,57,
181,189,189,189,189,189,189,189,189,189,181,148,66,57,66,66,66,57,57,57,66,66,57,66,82,90,66,74,82,132,173,132,90,90,66,66,57,57,90,82,82,66,99,148,173,115,107,66,57,57,66,82,107,74,82,132,181,156,74,107,156,82,74,115,148,189,189,99,66,90,173,165,165,140,82,49,57,57,74,99,165,181,173,165,165,165,181,181,181,140,132,165,66,74,90,99,107,115,123,123,132,132,123,107,90,115,99,99,90,74,99,173,181,173,165,173,173,173,165,165,156,165,165,148,140,140,148,156,148,148,148,148,148,148,148,148,156,173,181,165,123,74,74,57,57,57,49,57,57,66,66,99,132,140,173,181,189,189,181,181,189,189,132,148,189,181,173,189,198,181,173,74,66,90,148,173,115,57,57,107,132,90,82,66,57,57,57,57,57,57,57,49,57,57,57,66,66,66,57,57,57,57,57,57,57,49,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,49,66,57,57,49,49,57,57,57,57,57,57,57,57,57,57,57,57,66,90,74,74,82,74,90,165,99,49,49,57,74,99,140,
181,181,189,189,189,189,189,189,189,189,189,189,132,82,57,57,57,57,57,66,57,57,74,90,107,115,123,165,189,189,189,189,181,181,148,123,132,90,173,148,165,173,181,189,165,90,82,82,66,57,57,49,57,57,66,90,156,189,165,132,74,57,107,181,189,173,156,99,90,90,115,107,140,74,49,57,66,57,74,90,173,189,165,165,165,173,181,189,181,90,99,99,66,74,99,107,115,123,123,132,132,132,132,123,123,115,107,90,90,99,107,123,181,181,173,173,173,173,165,165,165,156,165,156,148,140,148,148,148,148,148,148,148,148,148,148,148,156,165,173,181,132,132,99,74,66,66,57,57,107,165,181,189,189,189,181,181,181,189,189,189,189,181,181,181,189,189,181,181,165,123,156,165,173,181,148,49,57,57,107,123,57,57,57,57,57,66,74,57,57,66,66,57,66,66,66,57,66,66,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,57,57,57,57,57,66,66,66,90,181,181,173,173,181,148,165,132,132,148,140,156,189,181,
148,181,189,189,189,189,189,189,189,189,189,189,189,181,123,107,66,74,90,99,173,165,173,181,189,198,198,181,181,181,181,189,198,189,189,189,189,173,189,189,181,181,181,181,107,82,90,99,66,57,57,57,66,74,132,181,189,189,189,123,57,66,148,181,148,90,57,66,57,57,57,57,57,57,57,57,66,99,123,173,189,173,165,165,173,181,181,181,181,140,107,123,66,90,107,115,115,123,132,132,140,140,132,132,123,115,82,82,99,99,165,82,140,181,173,165,173,173,165,165,173,173,173,156,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,165,181,181,189,173,140,115,115,107,115,148,173,181,181,181,181,189,189,189,189,189,189,189,189,189,181,173,132,107,140,181,181,181,189,189,189,148,57,66,57,107,140,66,74,74,57,57,90,90,57,57,57,57,57,57,57,57,57,57,57,66,66,57,57,66,66,57,66,57,57,57,57,57,57,57,57,49,49,57,49,66,82,90,57,57,57,57,57,57,57,57,57,57,57,57,57,66,90,90,66,66,74,140,181,189,189,189,189,189,181,189,189,181,189,189,181,148,
107,132,189,189,189,189,189,189,189,189,189,189,189,189,189,189,156,173,181,189,189,189,181,173,165,165,156,156,165,165,173,173,181,181,189,189,189,181,181,165,82,115,165,173,99,82,66,57,57,57,66,74,57,90,181,189,181,132,156,156,74,107,181,189,90,74,66,115,49,57,57,66,57,57,74,99,115,156,189,181,165,165,156,165,173,181,181,181,148,115,115,66,82,99,107,115,123,123,132,132,140,140,140,132,132,123,107,82,90,90,74,66,148,189,173,165,165,173,181,173,173,181,173,165,165,156,156,148,148,148,148,148,148,156,156,156,156,156,165,165,189,189,181,181,189,181,173,181,181,181,189,189,189,189,189,181,181,189,189,189,189,189,181,189,165,99,66,90,173,181,181,189,181,189,189,165,90,57,57,140,90,99,115,74,57,57,99,90,57,57,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,57,57,57,66,57,57,57,57,57,66,57,57,57,57,82,173,165,90,123,99,115,107,74,57,57,57,57,66,57,74,132,181,189,181,181,189,189,189,189,189,189,189,189,189,189,189,189,181,189,189,148,
181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,165,156,156,148,148,148,148,156,156,156,165,165,165,173,181,189,181,181,165,74,57,57,107,140,57,57,66,66,66,66,74,115,57,132,189,165,115,57,57,140,107,156,189,189,82,57,107,90,57,57,82,90,82,74,99,173,173,173,165,165,165,156,156,156,165,181,181,189,148,66,82,82,90,107,115,115,123,132,132,140,140,140,132,132,132,123,99,82,90,82,90,107,173,181,181,165,165,173,165,156,156,156,156,156,165,165,165,165,156,156,156,148,148,156,156,156,165,165,173,181,181,181,181,181,181,181,189,189,189,189,189,181,181,181,181,181,181,181,189,189,189,189,189,189,165,99,57,132,189,189,189,189,189,189,189,189,165,57,66,107,165,132,140,99,90,140,123,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,49,57,49,57,57,57,57,57,57,57,57,49,57,49,57,57,74,189,189,181,181,181,189,181,99,57,57,66,66,82,90,148,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,198,181,173,156,148,148,140,140,148,148,148,148,148,156,156,156,156,165,165,165,173,181,189,181,82,57,57,57,90,90,74,66,107,132,148,148,90,66,156,181,115,123,57,82,140,66,90,115,181,107,49,107,107,57,57,90,107,90,115,173,181,181,181,165,165,165,156,156,165,173,181,189,189,123,57,74,90,107,115,115,123,132,132,132,140,140,140,132,132,132,123,115,99,90,82,90,90,165,181,181,181,173,165,165,165,165,156,165,156,156,156,156,156,156,156,156,156,156,156,156,165,165,173,173,181,181,181,181,181,181,181,189,189,189,189,189,181,181,189,181,189,181,181,181,189,189,189,189,189,189,140,66,90,173,189,189,189,189,189,189,189,189,115,90,148,181,165,181,165,156,107,57,57,66,57,57,57,57,57,57,57,57,57,57,57,57,57,57,82,74,66,57,66,57,57,57,57,74,82,107,99,57,66,57,74,181,189,189,189,189,189,189,181,140,132,148,165,189,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,181,173,165,156,148,140,140,140,140,140,140,148,148,148,148,148,148,156,156,156,156,156,165,181,189,189,148,57,57,57,57,57,99,165,189,181,189,189,165,107,132,189,181,99,74,99,181,74,57,66,132,181,107,82,140,123,90,115,115,123,156,181,181,173,173,165,165,165,165,173,181,189,181,181,173,90,74,82,99,107,115,123,123,132,132,132,140,140,140,140,132,132,132,115,99,90,82,82,90,90,148,189,181,173,156,156,156,156,156,156,148,156,156,148,156,156,156,156,156,156,148,156,165,165,173,181,181,181,181,181,181,181,181,181,189,181,181,189,189,189,189,189,189,189,189,181,189,189,189,189,189,189,189,123,57,107,181,181,189,189,189,189,189,189,181,148,189,181,181,189,189,189,132,115,99,90,57,57,57,57,57,57,49,57,57,57,57,57,57,57,66,123,140,82,90,99,107,99,107,156,181,189,165,90,123,132,165,189,189,189,189,181,189,181,181,99,107,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,189,189,189,181,156,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,156,165,173,181,181,189,148,99,74,107,123,132,173,181,148,156,181,189,181,181,181,181,189,181,165,165,181,165,140,148,156,173,148,148,156,165,156,156,181,173,181,173,173,181,173,165,165,165,165,181,181,181,181,189,156,66,74,99,99,107,115,123,123,132,132,132,132,132,132,132,132,132,123,115,99,90,74,74,57,82,99,156,181,181,165,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,165,156,165,165,165,173,181,181,181,189,181,181,181,181,181,181,181,189,181,189,189,189,189,189,189,189,181,189,189,189,189,189,189,181,115,57,115,173,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,165,115,57,57,57,57,57,57,57,57,57,57,57,57,66,57,57,82,140,140,148,189,189,189,189,189,189,189,181,189,189,189,189,189,189,189,181,189,181,173,165,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
189,189,189,189,189,189,189,189,189,189,181,181,173,165,156,156,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,156,173,181,181,189,181,181,181,189,189,165,140,140,99,74,99,123,115,148,165,173,181,173,140,165,148,74,123,132,74,82,74,66,74,66,74,66,156,181,181,181,181,173,173,165,165,156,173,189,189,181,181,165,90,57,74,99,107,115,115,123,123,132,132,132,132,132,132,132,132,123,123,115,107,99,90,90,74,82,90,156,173,189,181,165,148,148,148,148,148,148,148,148,148,140,148,148,148,148,156,156,156,156,165,165,181,189,189,189,189,189,189,189,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,165,74,57,82,156,189,181,181,189,181,189,189,189,189,189,189,189,189,189,181,189,181,148,99,66,57,57,57,57,57,57,57,57,49,57,49,57,57,49,57,90,148,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,156,90,107,123,115,140,189,140,99,123,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
181,181,181,181,181,189,189,189,189,189,181,165,165,165,173,181,165,140,140,140,140,140,140,140,140,140,140,140,148,148,148,140,148,148,156,173,189,189,181,189,181,173,156,140,148,82,66,66,99,140,82,82,74,173,156,123,99,66,107,156,123,173,99,66,107,140,156,123,115,115,132,173,181,181,181,181,181,181,181,173,173,181,181,181,165,148,99,66,66,90,107,107,115,115,123,123,132,132,132,132,123,123,123,123,123,123,115,115,99,99,82,82,90,90,165,181,189,189,189,181,156,148,140,140,140,148,148,140,148,156,148,156,156,156,156,165,165,173,181,181,189,189,189,189,189,189,189,189,189,181,181,189,189,189,189,189,189,181,181,189,189,189,189,189,189,189,181,189,173,115,90,74,90,123,156,181,189,189,189,189,189,189,189,189,189,189,173,189,189,189,181,156,132,115,74,57,74,74,57,57,57,57,57,57,49,57,66,57,99,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,173,132,57,74,74,82,107,181,165,173,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
181,173,165,165,165,165,165,173,181,189,181,173,165,165,165,173,173,148,132,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,165,173,181,181,181,173,115,82,115,123,132,99,148,173,173,74,173,173,165,115,148,115,90,123,165,107,123,90,99,140,132,123,99,132,123,107,107,165,189,181,181,181,181,165,99,82,82,99,99,82,66,66,74,90,99,107,115,115,115,123,123,123,132,123,123,123,123,123,115,115,115,115,107,107,90,74,66,107,140,165,181,189,189,189,189,181,173,165,148,148,140,140,148,156,148,148,156,156,156,165,156,156,173,181,173,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,189,189,189,189,189,173,148,148,123,99,74,115,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,173,148,156,165,140,107,57,57,57,57,82,66,57,82,148,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,165,181,173,181,189,189,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,181,181,
173,173,165,156,156,165,156,165,165,165,173,173,173,165,156,165,181,181,156,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,156,173,181,189,189,189,148,82,82,115,173,173,173,181,165,189,189,148,189,181,181,181,181,140,123,156,181,148,148,107,66,74,74,66,82,82,156,189,181,181,181,132,107,74,74,66,74,82,82,90,90,99,99,107,107,115,115,123,123,123,123,123,123,123,115,115,115,115,107,107,107,99,99,82,66,57,74,99,107,181,189,189,189,189,189,189,181,173,165,156,148,148,148,148,148,156,156,156,156,156,173,181,140,90,148,189,189,181,165,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,181,189,189,189,189,189,189,189,189,189,156,148,189,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,173,181,189,173,90,57,82,115,165,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,181,181,173,173,
173,173,173,173,165,165,165,173,181,181,181,181,173,165,165,173,173,173,173,165,148,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,156,165,173,181,189,189,189,181,173,173,156,140,74,107,181,189,165,165,173,156,148,165,173,123,123,156,181,156,181,140,99,107,66,74,57,66,82,148,173,181,165,115,90,74,99,57,66,82,99,99,107,107,115,107,115,115,115,123,123,123,123,123,123,115,115,115,115,107,107,99,99,90,82,74,66,57,82,132,156,165,189,189,189,189,189,189,189,181,173,165,156,148,148,148,148,156,156,156,156,181,181,173,90,90,66,173,181,90,107,173,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,189,181,181,189,189,189,189,189,189,189,189,189,181,189,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,165,173,148,140,181,181,189,189,189,189,189,189,181,189,181,181,173,173,173,173,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,181,173,173,173,181,173,
173,173,173,165,165,165,165,173,189,189,181,189,189,181,165,156,156,173,173,173,156,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,156,165,173,181,189,189,181,189,189,173,173,140,115,173,181,189,148,107,82,82,165,107,99,156,156,90,74,90,132,90,74,82,66,66,66,66,66,140,181,140,99,74,74,66,82,82,82,90,99,99,99,107,107,115,107,115,115,115,115,115,115,115,115,115,107,107,107,99,90,90,82,74,66,57,66,74,156,165,189,189,189,189,189,189,189,189,189,181,165,156,156,156,165,165,165,165,156,173,173,140,74,123,90,49,82,132,115,165,189,189,181,189,189,189,189,189,189,189,189,189,189,189,189,181,189,189,189,181,181,189,189,189,189,189,189,181,181,189,181,181,181,181,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,181,165,99,82,82,123,173,173,189,189,189,181,181,173,173,165,165,156,156,156,156,156,156,165,181,189,198,198,198,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,181,181,181,173,173,173,165,173,173,
173,173,173,165,165,165,156,156,156,165,173,173,173,173,173,181,165,156,156,148,148,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,156,156,165,173,181,181,181,189,189,181,181,181,189,173,123,99,148,173,181,173,181,148,107,74,66,66,66,74,123,66,57,66,74,74,99,123,165,181,181,189,140,140,99,74,74,74,82,90,90,90,99,107,107,107,115,115,115,115,115,115,115,107,107,107,99,99,90,90,74,66,66,57,66,57,82,156,173,189,181,189,189,189,189,189,181,181,165,156,156,156,156,148,156,165,173,189,165,99,74,74,82,66,107,140,148,140,156,173,189,189,189,189,181,189,189,189,189,189,189,189,189,189,189,181,181,189,189,189,189,189,189,189,189,189,189,181,181,181,181,181,181,181,181,189,189,189,189,189,189,189,189,189,189,181,181,181,123,99,74,82,165,99,132,173,189,189,189,181,173,165,156,156,156,156,156,148,156,156,156,156,156,156,156,165,165,165,165,173,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,173,173,165,165,165,165,165,165,165,165,165,165,173,173,
173,173,165,165,156,156,156,148,148,156,156,165,165,156,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,156,156,156,156,156,165,165,173,181,181,181,181,181,181,181,189,189,181,181,181,148,189,140,74,66,74,74,66,82,123,90,74,99,82,66,66,74,57,99,99,123,181,189,156,132,74,57,66,66,82,74,82,82,90,99,99,99,107,107,107,115,107,107,107,107,99,99,90,90,82,82,66,66,66,57,57,74,115,140,181,189,189,189,189,189,189,181,181,173,165,156,148,148,148,156,173,181,189,181,132,156,156,123,132,107,90,90,66,74,99,173,189,189,181,165,189,181,181,189,189,189,189,189,181,181,173,165,173,181,181,181,165,165,181,189,181,181,181,181,181,181,181,181,181,189,189,189,189,189,189,189,189,181,189,189,181,132,115,74,66,115,107,181,181,189,189,189,181,173,165,165,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,165,173,181,189,189,189,189,189,189,189,189,181,181,173,173,165,156,156,156,156,156,156,156,156,156,165,173,173,173,
173,165,165,165,156,148,148,148,148,148,148,156,156,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,156,156,148,156,165,165,165,165,173,173,181,181,181,181,181,181,181,181,189,189,181,189,173,82,74,57,107,140,123,123,99,115,90,90,90,82,74,82,74,57,74,82,140,140,90,57,66,66,49,57,57,74,82,82,82,90,90,90,90,99,99,99,107,99,99,90,90,90,90,82,74,66,57,57,74,66,66,82,82,107,156,189,189,189,189,189,189,181,156,148,148,148,156,173,181,181,181,181,181,189,181,189,189,181,165,156,181,165,173,181,189,189,189,173,173,189,189,189,189,181,181,189,189,173,148,140,132,165,181,148,123,115,148,123,115,173,165,173,189,181,181,181,181,181,189,189,189,189,189,189,189,189,189,189,189,181,165,74,82,82,156,189,189,189,181,173,165,156,156,156,156,148,148,148,148,148,148,148,148,140,140,140,148,148,148,148,148,148,148,156,156,165,173,173,173,173,173,173,173,165,165,165,165,165,156,156,156,156,156,156,156,156,156,156,165,165,173,173,173,
165,165,156,156,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,156,156,156,148,156,156,165,165,165,173,173,181,181,181,189,181,181,181,181,189,189,165,132,123,156,90,57,74,74,66,74,57,66,82,74,49,66,82,66,74,82,82,148,165,140,115,66,74,74,66,66,74,74,74,66,74,82,74,82,90,90,90,90,82,74,66,74,66,66,57,74,74,66,99,107,82,107,74,74,90,148,189,189,189,189,156,140,140,156,165,173,181,181,181,181,173,165,165,165,165,173,181,181,189,189,189,189,189,181,189,198,198,189,189,189,189,189,189,189,189,189,181,189,189,173,181,189,181,165,115,140,173,165,165,148,173,181,181,181,181,181,181,181,189,189,189,189,189,189,189,189,189,189,165,189,165,148,156,181,189,181,173,165,156,156,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,148,148,148,148,148,148,156,156,173,173,165,165,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,
165,165,156,156,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,148,148,156,156,156,156,165,165,165,173,181,181,181,181,181,181,189,189,181,156,132,115,82,74,90,82,74,74,66,74,74,66,57,49,66,49,57,57,82,123,148,123,115,90,82,99,115,123,82,74,90,107,82,66,74,82,74,66,57,57,74,82,90,90,82,82,123,107,107,181,165,181,165,156,173,181,189,189,173,156,140,140,148,156,148,156,165,181,181,189,189,181,165,165,156,148,156,165,165,173,173,181,173,165,165,173,173,173,173,173,181,181,189,189,189,198,189,198,189,189,189,189,189,189,181,165,181,189,181,181,181,173,181,181,181,181,181,181,181,181,181,181,189,189,181,181,189,189,189,189,198,189,173,165,156,156,156,156,156,148,148,148,148,148,148,140,148,140,140,148,148,148,140,140,140,140,140,140,140,148,148,148,156,165,173,165,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,
165,165,165,156,156,148,148,140,148,148,140,140,140,140,148,140,140,148,148,148,156,148,148,148,156,148,148,148,140,140,148,148,148,140,148,148,148,148,140,140,140,140,140,140,140,148,148,156,156,156,156,156,156,156,165,173,181,189,189,189,189,189,189,189,189,189,181,165,173,156,99,99,99,74,57,74,74,82,74,82,107,107,107,140,173,189,181,181,181,181,181,173,140,156,140,123,115,90,82,99,74,74,57,66,74,66,66,74,74,74,90,115,156,189,189,189,189,189,181,181,165,156,148,140,148,156,148,156,156,156,148,148,148,156,165,165,173,165,165,165,156,148,148,148,148,140,148,148,148,148,148,148,148,148,148,148,156,156,165,173,173,173,173,173,173,181,189,189,189,189,189,189,189,181,173,173,173,173,173,173,173,173,165,165,165,173,173,173,165,165,165,165,165,165,165,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,148,148,140,140,140,140,140,140,140,140,140,140,140,148,156,165,173,173,173,165,156,156,156,156,156,156,156,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,
165,165,165,165,165,156,148,140,148,140,140,148,148,148,148,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,156,156,156,156,156,156,156,165,165,165,165,165,173,173,173,173,173,173,181,181,181,189,181,181,181,189,165,148,148,156,173,181,173,181,181,181,198,189,189,189,181,181,181,181,181,189,181,189,181,165,165,156,156,140,123,99,99,115,90,123,132,148,148,173,189,189,189,173,181,165,156,148,148,148,148,148,148,148,148,148,156,140,140,140,148,148,140,140,140,140,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,156,165,156,165,165,165,165,165,165,165,156,156,156,156,156,156,156,156,156,148,148,148,148,148,148,140,148,148,148,148,148,148,148,148,140,148,148,148,148,148,148,140,140,148,156,156,148,140,140,140,140,140,140,140,140,140,140,140,148,148,156,165,173,173,165,165,156,156,156,156,156,156,156,156,156,156,156,148,156,156,148,156,156,156,156,156,156,156,156,
156,165,165,165,165,165,165,165,165,156,156,165,165,165,165,165,165,165,156,156,156,156,156,156,156,156,156,156,156,156,148,148,148,148,140,140,140,140,140,148,148,148,148,148,156,156,156,156,156,165,165,156,156,156,165,165,165,165,173,173,173,173,173,173,173,173,165,165,173,181,181,181,173,173,181,181,181,189,189,189,198,189,181,181,181,189,181,189,181,189,189,189,181,181,189,189,189,198,189,198,198,189,181,189,181,173,181,189,189,189,198,181,173,156,148,140,140,140,140,140,140,148,148,156,156,148,148,140,148,148,148,140,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,148,148,148,148,148,148,140,140,140,148,156,156,156,156,148,140,140,140,140,140,140,140,140,140,140,140,148,148,156,173,173,173,173,165,165,165,165,165,165,156,156,156,156,156,156,148,148,148,148,148,148,148,156,156,156,156,156,
165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,165,165,165,165,165,165,165,165,165,165,165,165,156,156,156,156,156,156,148,156,156,156,156,156,156,156,156,165,165,165,165,173,173,173,173,173,173,173,165,173,173,173,173,173,173,173,173,173,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,181,173,173,173,173,173,173,173,181,181,181,173,173,173,173,173,173,173,173,181,181,181,189,189,181,181,173,181,181,173,173,165,148,140,132,132,140,140,140,140,140,140,148,148,148,156,148,148,156,148,140,140,140,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,140,148,148,140,140,148,148,156,148,148,156,156,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,156,156,165,173,173,165,165,165,165,165,165,156,156,148,148,148,148,148,148,148,148,148,148,148,156,156,156,165,
165,173,165,165,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,173,173,165,165,165,165,165,165,165,165,165,173,173,173,181,181,181,181,181,181,181,181,181,181,173,173,165,165,156,156,156,156,148,156,156,156,156,156,156,165,165,165,165,165,165,165,165,173,173,173,181,181,181,181,173,165,156,148,148,140,140,140,140,140,140,140,148,140,140,140,148,148,148,148,148,148,148,148,156,156,148,148,148,148,156,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,140,140,140,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,156,165,165,165,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,165,165,165,
156,156,156,156,156,156,156,165,165,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,165,173,165,165,165,165,165,173,173,165,165,165,165,165,173,173,173,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,181,181,181,181,181,181,181,181,173,165,165,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,156,148,148,148,148,148,156,148,148,140,140,140,140,140,148,148,148,148,148,148,148,140,148,148,148,148,148,148,140,148,148,148,148,148,148,148,148,148,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,165,173,165,165,156,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,148,148,148,156,156,156,156,156,156,156,
140,140,140,140,140,140,140,148,148,140,140,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,156,156,165,165,165,165,165,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,165,173,173,173,173,181,181,173,173,173,165,165,165,156,156,156,156,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,140,148,148,148,148,148,148,148,148,156,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,148,148,156,156,156,156,156,156,156,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,165,173,173,165,156,156,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,165,165,165,165,165,173,173,173,173,173,173,165,165,156,156,156,156,156,156,156,165,165,165,165,173,173,173,173,173,173,173,173,165,165,165,156,156,156,156,156,156,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,140,140,140,140,140,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,132,132,132,140,132,140,132,140,140,140,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,156,165,173,173,173,173,165,165,156,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,156,156,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,165,165,165,156,156,156,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,132,132,140,140,132,132,132,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,156,165,165,173,173,173,173,173,173,165,156,156,156,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
156,156,156,156,148,148,156,156,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,140,140,140,148,148,148,148,148,148,148,148,156,156,156,156,165,165,165,165,165,156,165,165,165,165,165,165,165,165,165,165,165,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,165,165,165,165,165,156,156,156,156,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,132,140,132,140,140,140,140,132,132,140,132,132,140,140,132,132,140,140,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,140,140,132,132,132,140,132,140,140,140,132,140,140,132,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,156,156,165,165,165,165,165,165,165,165,165,165,165,156,165,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140
};
/advdemos/tags/rel_1_5_beta1/gpsmesa/texture2.h
0,0 → 1,771
GLubyte texture2R[65536] = {203,191,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,190,189,189,189,189,189,189,189,188,188,186,185,185,184,182,181,179,177,176,176,175,175,175,175,175,176,176,177,177,177,176,176,175,175,175,175,175,175,175,175,174,174,174,174,174,174,174,174,175,175,175,175,177,177,177,177,176,176,175,175,175,175,175,175,176,176,176,176,176,176,176,175,175,175,175,174,174,174,174,174,174,174,173,172,171,169,166,164,164,163,163,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,160,160,160,160,160,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,161,163,163,164,164,164,163,163,160,160,159,159,159,159,159,159,159,159,159,158,158,156,155,153,150,148,146,146,145,144,144,144,144,144,144,144,144,144,144,144,143,143,143,144,143,144,146,144,144,144,144,143,143,145,146,145,145,145,145,144,145,143,143,143,143,143,143,143,143,143,144,145,143,143,144,145,144,147,148,171,
131,101,104,104,105,105,105,105,105,105,104,104,104,104,104,104,104,104,104,105,106,106,106,107,107,106,106,104,104,104,104,104,105,105,105,106,107,107,106,105,105,104,104,104,104,104,103,101,97,95,93,91,88,85,84,83,81,81,79,78,78,78,80,81,82,82,83,82,82,82,80,80,80,80,78,78,78,78,76,76,76,76,76,76,76,76,78,78,78,79,83,84,84,84,82,81,80,80,80,80,80,80,81,81,82,82,82,82,82,79,77,77,77,76,76,76,76,76,75,74,73,67,64,59,53,46,44,41,40,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,38,39,42,43,45,44,42,41,44,43,42,42,42,42,42,41,40,40,39,39,38,35,31,26,19,14,11,8,4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,5,3,0,0,0,0,0,0,1,5,6,10,9,9,8,7,9,6,1,1,0,0,0,1,4,4,5,5,4,3,2,0,0,0,1,2,59,
132,105,105,107,106,106,106,107,107,106,106,105,105,105,105,105,105,105,105,105,106,106,107,106,106,106,105,105,105,105,105,106,106,107,106,106,106,106,106,105,105,104,104,104,104,104,103,101,97,95,92,88,85,82,81,80,78,77,77,77,77,77,77,78,78,79,80,79,79,79,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,79,80,80,79,79,79,78,78,78,78,77,77,78,78,78,79,79,79,78,77,77,76,77,77,77,77,77,76,75,74,72,68,62,57,47,44,41,40,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,40,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,43,44,45,44,42,41,40,39,39,39,38,38,38,37,37,36,36,35,33,31,26,24,20,15,12,9,8,6,4,4,4,4,4,4,4,4,4,3,3,3,3,1,0,1,0,0,0,0,1,0,1,3,7,7,7,7,5,0,0,3,4,1,1,1,2,1,1,2,2,1,2,2,2,2,1,3,6,61,
132,106,105,107,105,105,105,105,105,105,105,105,104,104,104,104,104,104,104,106,106,106,107,107,107,107,106,104,104,104,104,105,105,105,106,107,108,108,106,104,104,103,103,103,103,103,103,101,98,95,93,91,88,85,83,79,78,77,77,78,78,78,77,77,78,78,79,79,79,79,77,76,76,76,78,78,78,78,77,77,77,77,77,77,77,77,78,78,78,78,78,80,80,79,78,78,78,77,77,77,77,77,77,77,78,78,79,79,79,78,77,77,76,76,77,77,77,76,76,75,74,68,64,59,54,47,45,41,40,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,39,41,42,44,45,44,42,41,37,37,37,37,37,37,37,37,35,34,34,34,34,31,27,24,21,15,12,8,4,3,3,1,1,1,1,1,1,1,1,0,0,0,0,1,1,3,1,0,1,2,2,1,1,2,4,7,7,6,4,1,1,1,2,1,1,1,1,1,0,1,1,0,0,1,2,4,2,2,4,59,
132,103,104,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,108,108,108,109,108,108,107,107,107,107,107,106,106,106,106,107,108,109,109,108,106,106,106,106,106,105,105,104,102,99,96,92,89,86,84,81,78,77,77,77,77,77,77,77,77,78,78,78,78,78,77,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,79,79,78,77,77,77,76,76,76,76,76,77,77,78,78,78,78,77,77,77,77,76,77,77,77,77,77,76,75,73,71,66,59,53,46,43,40,38,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,38,39,40,41,42,41,40,40,39,39,39,39,39,39,39,38,38,37,37,37,37,34,30,25,19,14,9,5,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,2,2,4,5,4,4,3,3,3,3,3,3,1,1,2,1,2,1,2,1,0,1,2,1,0,0,0,1,53,
132,105,106,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,107,107,107,107,106,106,106,105,105,104,104,104,101,98,95,91,88,85,83,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,71,65,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,40,41,42,42,42,41,41,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,16,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,5,6,5,4,3,2,2,1,0,0,0,0,3,3,3,2,0,0,0,0,0,0,0,1,50,
132,105,106,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,107,107,107,107,106,106,106,105,105,104,104,104,101,98,95,91,88,85,83,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,71,65,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,40,41,42,42,42,41,40,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,16,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,5,6,5,4,3,2,2,1,0,0,0,0,3,3,3,2,0,0,0,0,0,0,0,1,50,
132,105,106,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,107,107,107,107,106,106,106,105,105,104,104,104,101,98,95,91,88,85,83,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,70,65,59,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,41,41,41,42,41,41,40,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,16,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,5,5,5,4,3,2,2,1,0,0,0,0,3,3,3,2,0,0,0,0,0,0,0,0,50,
132,105,106,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,107,107,107,107,106,106,106,105,105,104,104,104,101,98,95,91,88,85,83,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,70,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,41,41,41,42,41,41,40,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,16,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,5,5,4,3,3,2,2,1,0,0,0,0,3,3,3,2,0,0,0,0,0,0,0,0,50,
132,105,106,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,107,107,107,107,106,106,106,105,105,104,104,104,101,98,95,91,88,85,82,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,70,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,41,41,40,41,41,41,40,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,16,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,5,5,4,3,3,2,2,1,0,0,0,0,3,3,3,2,0,0,0,0,0,0,0,0,48,
132,105,106,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,104,101,98,95,91,87,84,82,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,70,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,41,40,40,41,41,41,40,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,16,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,5,4,3,3,2,2,1,0,0,0,0,3,3,3,2,0,0,0,0,0,0,0,0,48,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,104,101,98,94,90,87,84,82,79,78,78,77,77,78,78,78,77,78,78,78,78,78,78,77,78,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,77,77,77,78,78,78,77,77,78,78,79,79,78,77,77,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,40,39,39,41,41,41,40,38,38,38,38,38,38,38,38,38,37,37,37,35,33,30,26,22,17,10,7,5,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,4,4,3,2,2,1,1,0,0,0,0,2,2,2,1,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,105,105,104,104,104,101,97,94,90,86,84,81,79,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,79,77,77,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,79,80,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,41,41,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,6,4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,3,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,105,105,104,104,104,101,97,94,90,86,84,81,79,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,76,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,79,80,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,41,41,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,2,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,105,105,104,104,104,101,97,94,90,86,84,81,79,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,76,76,75,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,79,80,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,41,41,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,2,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,105,105,104,104,104,101,97,94,90,86,84,81,79,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,76,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,79,80,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,41,41,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,2,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,2,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,105,105,104,104,104,101,97,94,90,86,84,81,79,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,77,75,77,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,79,80,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,41,41,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,2,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,48,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,105,105,104,104,104,101,97,94,90,86,84,81,79,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,76,76,82,82,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,79,80,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,41,41,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,6,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,3,2,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,101,97,94,90,86,84,81,79,78,77,77,77,78,78,78,78,78,78,78,78,77,78,78,77,84,93,90,80,78,77,77,77,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,79,79,79,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,40,40,40,38,38,38,38,38,38,38,38,38,38,38,37,35,33,30,26,22,17,11,8,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,81,75,79,79,68,86,95,102,101,80,77,75,76,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,19,14,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,78,74,81,77,71,71,124,79,93,85,76,74,76,77,76,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,19,14,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,75,76,75,72,86,116,98,85,81,79,76,78,77,76,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,19,14,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,77,64,93,99,77,98,82,78,78,76,76,80,79,76,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,19,14,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,85,71,127,147,81,79,72,78,76,78,80,87,84,77,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,20,14,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,101,88,181,207,102,76,70,79,74,78,78,84,85,76,75,80,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,20,14,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,7,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,102,100,97,94,90,86,83,81,78,78,77,77,77,78,78,78,78,78,78,78,96,120,217,243,110,75,81,75,73,77,90,99,89,77,74,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,79,79,79,78,78,78,78,78,78,78,78,77,76,75,72,71,65,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,24,20,15,10,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,17,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,78,78,78,78,78,78,78,75,78,82,93,83,201,238,227,107,79,77,77,77,77,80,81,79,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,60,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,29,25,20,14,12,9,6,4,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,1,18,16,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,79,79,79,78,78,78,78,77,78,80,78,100,234,243,234,118,76,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,30,25,20,15,12,10,6,4,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,2,0,10,9,0,0,1,1,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,79,79,79,78,78,78,78,77,78,79,72,137,243,237,238,181,82,71,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,30,26,21,16,12,10,6,4,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,2,0,3,3,0,0,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,79,79,79,78,78,78,78,79,78,78,72,157,236,240,244,196,84,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,33,31,27,22,17,13,10,7,4,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,2,0,3,2,0,1,0,0,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,79,79,79,78,78,78,78,79,74,76,105,161,232,241,244,228,97,81,75,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,33,31,28,22,18,13,10,7,5,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,2,0,1,1,0,3,0,2,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,79,79,79,78,78,78,78,80,74,88,120,170,233,240,237,178,96,79,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,33,32,28,24,19,14,10,7,5,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,2,1,0,0,1,2,3,20,10,4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,107,107,107,106,106,106,106,105,105,104,104,103,100,96,94,90,86,83,80,79,79,79,79,78,78,78,78,79,77,80,123,182,236,241,210,108,85,77,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,53,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,33,32,29,24,19,15,11,7,5,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,3,3,0,1,3,2,9,46,37,9,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,106,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,77,77,77,77,78,80,80,113,184,239,240,182,82,79,72,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,59,52,48,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,34,33,30,25,21,17,12,9,5,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,2,3,3,2,2,1,1,2,0,7,67,138,45,20,3,2,1,0,2,0,0,0,0,0,0,0,0,0,49,
132,105,107,106,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,78,77,77,77,78,79,77,88,185,237,243,178,83,79,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,48,43,42,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,35,33,29,26,22,18,13,9,5,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,2,3,3,3,2,2,2,2,1,0,2,49,168,191,89,8,1,3,4,0,4,0,0,0,0,0,0,0,0,49,
132,105,107,106,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,78,78,78,78,74,79,74,65,192,237,244,194,107,76,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,48,43,42,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,35,34,29,27,23,19,14,10,5,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,2,3,3,2,2,2,2,1,2,0,13,74,205,193,30,6,0,1,2,2,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,78,78,78,78,77,82,86,79,202,238,239,227,162,77,76,75,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,48,43,42,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,36,35,34,31,28,23,19,15,10,6,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,4,3,3,3,2,2,2,2,1,1,0,0,11,64,178,104,14,4,3,11,0,0,0,0,0,0,0,0,0,49,
135,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,78,78,78,78,78,82,111,142,220,241,236,241,187,81,75,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,48,43,42,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,36,36,35,32,28,25,21,17,12,7,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,16,4,4,3,3,3,2,2,2,2,1,2,3,0,0,10,50,134,80,58,4,4,2,0,0,0,0,0,0,0,0,49,
135,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,78,78,78,78,77,82,97,167,235,242,238,238,190,84,79,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,48,43,42,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,36,36,35,33,30,26,21,18,13,8,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,44,20,5,3,3,3,2,2,2,2,1,0,3,7,2,2,5,34,146,104,24,6,0,0,0,0,0,0,0,0,0,49,
135,106,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,83,81,79,79,79,79,78,78,78,78,79,77,90,181,240,244,240,240,191,81,81,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,64,58,52,48,43,42,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,36,36,36,34,31,27,22,18,13,9,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,71,106,23,2,3,3,2,2,2,2,2,0,0,6,2,6,1,7,41,114,79,25,4,0,0,0,0,0,0,0,0,49,
135,106,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,97,94,91,87,84,82,79,79,79,79,79,79,79,79,78,75,102,189,241,245,240,241,171,88,80,78,76,74,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,69,64,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,34,32,28,23,19,13,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,104,210,83,10,2,2,1,1,1,1,1,1,0,0,0,1,1,0,7,39,120,105,11,1,1,0,1,1,0,0,0,49,
135,106,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,78,80,128,217,241,242,242,242,135,99,78,76,77,72,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,76,73,69,64,58,52,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,33,29,24,20,13,8,5,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,5,95,139,127,29,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,8,72,153,30,30,8,1,4,3,0,0,0,49,
135,106,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,78,89,155,231,242,242,242,242,193,141,80,79,81,81,76,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,69,64,57,51,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,33,29,25,20,14,9,5,4,2,0,0,0,0,0,0,0,0,0,0,1,0,0,3,56,35,66,25,2,3,2,0,0,0,0,0,0,0,0,0,0,0,0,4,28,77,31,58,33,11,2,0,0,0,0,49,
135,106,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,78,100,174,240,242,242,242,242,240,178,87,76,77,82,76,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,69,64,57,51,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,33,29,25,20,15,9,6,4,2,0,0,0,0,0,0,0,0,0,0,0,0,2,3,11,7,9,5,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,5,14,7,69,130,24,4,0,1,2,1,49,
135,106,108,107,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,74,99,176,238,240,242,242,242,241,200,96,75,75,74,78,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,69,64,57,51,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,30,25,21,15,10,6,4,2,0,0,0,0,0,0,0,0,0,0,0,1,2,2,5,2,4,4,0,4,9,0,0,0,0,0,0,0,0,0,0,0,0,5,3,1,0,97,225,51,12,3,1,3,2,49,
135,106,108,108,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,75,104,178,234,241,242,242,242,251,217,106,99,77,75,76,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,68,63,57,51,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,30,26,22,16,11,6,4,2,0,0,0,0,0,0,0,0,0,0,1,1,2,7,18,29,34,39,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,6,5,1,1,48,135,100,49,15,0,1,1,49,
135,106,108,108,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,78,117,177,230,242,242,242,242,237,245,235,192,107,85,73,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,68,63,57,51,47,43,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,34,30,27,22,17,11,7,4,2,0,0,0,0,0,0,0,0,0,0,1,2,7,49,78,72,126,136,55,10,2,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,2,7,57,226,146,28,1,0,2,49,
135,107,109,108,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,98,95,91,87,84,82,80,80,80,80,79,79,79,79,83,131,186,236,242,242,242,242,234,246,236,234,170,90,73,78,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,76,74,71,67,62,56,51,47,43,41,38,38,37,37,38,38,37,38,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,31,27,23,17,12,6,3,2,1,0,0,0,0,0,0,0,0,0,1,3,14,122,228,229,220,220,146,81,30,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,23,188,75,26,0,0,2,49,
135,108,111,109,108,107,106,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,80,79,81,82,81,80,80,80,86,140,202,240,241,242,242,242,238,243,242,239,237,96,76,80,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,76,73,69,65,60,54,50,45,42,41,39,40,38,38,38,39,36,38,40,41,37,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,22,17,12,7,3,2,4,0,0,0,0,0,0,0,0,1,1,4,19,185,226,223,225,224,225,211,76,7,5,4,1,0,0,0,0,0,0,0,0,0,0,0,0,2,14,90,41,0,0,0,0,49,
135,108,111,109,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,81,79,80,80,79,80,80,80,85,130,202,239,241,242,242,242,241,239,238,239,228,96,73,81,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,76,72,69,65,60,54,49,44,42,41,38,39,39,39,36,35,36,38,37,37,37,33,34,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,26,22,22,9,12,7,4,2,1,1,1,1,0,0,0,0,3,9,23,23,173,223,224,223,222,226,234,146,11,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,17,0,0,0,0,49,
135,108,111,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,81,79,79,78,78,80,80,80,81,113,194,237,242,242,242,242,241,241,243,246,197,86,72,72,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,75,72,68,64,59,54,49,44,41,41,38,35,40,37,35,41,43,41,36,36,40,40,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,32,28,22,5,14,0,1,1,2,0,3,1,0,0,0,0,1,14,60,77,187,222,224,225,222,224,238,208,37,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,43,6,0,0,0,0,49,
135,108,111,110,109,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,81,80,78,78,79,80,80,80,76,107,190,238,242,242,242,242,241,243,246,231,135,82,84,73,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,76,74,71,67,63,58,53,48,44,41,40,38,35,38,35,39,37,42,40,39,35,39,42,40,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,30,24,25,45,30,2,3,2,0,0,2,2,0,0,0,0,0,16,106,118,205,227,220,227,227,216,231,222,103,16,3,1,0,0,0,0,0,0,0,0,0,0,0,0,3,11,46,7,0,0,0,0,49,
135,108,111,110,109,108,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,80,80,80,81,81,80,80,80,77,108,187,239,243,242,242,242,235,241,238,190,116,89,94,79,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,75,73,71,67,62,57,51,47,44,41,40,37,35,38,46,72,65,47,36,37,39,38,35,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,26,20,49,160,104,28,3,2,5,1,0,1,0,0,0,0,4,27,111,92,211,229,219,228,228,215,218,219,192,43,4,5,0,0,0,0,0,0,0,0,0,0,0,0,3,5,30,4,0,0,0,0,49,
135,108,111,110,109,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,80,80,85,88,82,80,80,80,76,108,189,234,243,242,242,242,238,241,238,161,179,207,202,91,78,78,78,78,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,75,73,70,66,61,56,51,46,44,41,40,37,36,38,64,177,196,114,72,67,69,46,34,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,25,70,207,218,117,41,50,50,11,1,2,0,0,0,0,4,58,142,114,198,225,223,226,220,223,222,221,222,123,18,5,0,0,0,0,0,0,0,0,0,0,0,0,2,1,18,1,0,0,0,0,49,
135,108,110,110,109,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,102,100,98,95,92,88,85,82,80,78,89,93,82,80,80,80,80,105,187,235,244,242,242,242,242,241,247,221,235,251,233,122,77,77,77,77,78,78,78,77,77,77,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,76,76,75,72,69,66,61,56,51,46,43,41,39,38,39,37,86,234,247,217,221,219,136,67,42,39,38,38,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,34,20,44,144,230,208,191,195,152,36,3,3,0,0,0,0,0,79,199,118,170,222,226,221,221,227,226,232,225,201,46,0,0,0,0,0,0,0,0,0,0,0,0,0,5,3,7,1,0,0,0,0,49,
135,106,109,110,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,80,109,199,237,241,242,242,242,240,243,238,243,242,240,246,138,75,77,76,76,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,74,72,69,65,60,56,50,46,42,41,38,38,34,42,78,243,242,242,242,241,239,134,49,33,39,39,31,35,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,24,27,115,231,224,224,224,224,136,46,8,4,0,1,0,8,92,216,170,157,220,221,224,224,224,224,224,228,230,149,41,3,4,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
135,106,109,110,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,79,107,208,238,242,242,242,242,241,243,237,247,246,243,226,144,88,79,78,75,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,74,72,69,65,60,56,50,46,42,41,38,37,34,43,77,242,242,242,242,242,246,212,78,46,39,42,34,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,27,27,20,69,225,224,224,224,224,218,160,85,32,12,11,11,37,128,229,217,202,226,223,224,224,224,224,223,225,222,209,97,3,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,109,109,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,81,120,226,239,241,242,242,242,240,241,239,245,246,232,196,165,80,84,74,76,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,74,71,69,64,59,55,49,45,42,41,38,37,37,40,107,241,242,242,242,242,246,234,158,68,36,41,38,40,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,26,25,18,42,220,224,224,224,217,221,232,207,131,105,104,101,130,209,225,225,225,229,223,225,224,224,224,223,227,223,225,157,25,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,109,109,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,83,136,233,239,241,242,242,242,242,241,239,234,232,201,178,169,72,80,73,77,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,74,71,68,64,58,54,49,44,42,41,38,38,38,41,154,237,242,242,242,239,239,240,227,129,41,35,37,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,32,25,17,47,218,224,224,224,224,227,226,224,220,215,214,207,211,231,222,221,224,225,220,225,224,224,224,223,221,225,227,213,75,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,108,109,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,81,148,233,239,242,242,242,242,240,240,240,236,214,169,173,171,98,81,74,78,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,71,68,64,58,53,48,44,42,41,38,37,38,49,173,235,242,242,242,239,236,239,233,193,53,36,33,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,33,22,16,58,218,224,224,224,225,226,224,222,222,220,221,219,220,223,221,225,221,220,219,225,224,224,224,223,223,223,226,221,147,17,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,108,109,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,80,158,239,238,242,242,242,242,241,240,239,240,196,164,173,172,141,102,78,78,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,71,68,64,57,52,47,43,42,41,38,37,38,62,210,238,242,242,242,242,234,239,226,219,89,40,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,31,22,20,53,217,224,224,224,223,224,228,223,225,226,225,225,226,218,223,223,221,220,223,225,224,224,224,224,224,219,225,222,193,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,108,109,110,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,100,98,95,93,89,87,83,80,80,80,80,80,81,80,80,82,161,243,239,242,242,242,242,242,239,241,239,199,175,174,174,177,122,82,77,78,78,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,71,68,64,57,52,47,42,42,41,38,38,40,64,240,239,242,242,242,243,244,231,225,236,116,50,38,40,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,31,21,20,44,222,224,224,224,225,224,223,224,227,225,225,224,225,226,222,224,225,227,227,221,223,224,224,224,227,222,220,223,201,41,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,107,108,109,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,103,102,100,98,95,93,89,87,83,81,79,79,79,80,81,80,80,79,161,236,240,241,242,242,242,243,240,243,245,227,181,165,174,175,157,82,78,78,78,78,77,77,78,78,78,80,79,79,78,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,63,57,52,48,44,41,41,38,37,44,148,237,230,240,238,241,247,248,237,236,238,218,93,40,37,36,37,37,39,39,35,36,37,37,36,37,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,25,20,48,221,224,224,224,224,220,223,226,225,224,221,225,225,227,227,220,222,224,226,220,224,222,221,223,224,221,218,222,218,106,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,107,108,109,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,95,93,89,87,83,81,82,80,78,80,81,80,80,78,153,224,240,242,242,242,242,239,241,237,239,235,193,163,172,173,168,77,77,78,78,78,77,77,78,78,79,80,80,80,79,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,62,57,52,48,44,41,41,38,37,55,190,226,225,246,240,241,242,243,241,238,236,241,122,40,38,36,36,36,38,35,39,40,38,39,40,39,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,24,15,43,221,224,224,224,224,226,225,222,224,226,225,226,218,222,227,226,225,222,227,221,225,225,221,223,226,223,221,228,226,168,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,107,108,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,95,93,89,87,83,82,83,79,81,81,81,80,80,86,155,216,240,242,242,242,242,239,238,234,241,240,231,177,171,173,164,78,75,78,78,78,77,77,78,78,79,81,80,80,79,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,62,57,52,48,44,41,41,38,37,84,214,224,225,244,246,235,234,235,241,241,240,239,169,44,39,37,36,36,37,37,43,40,38,36,34,37,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,29,27,15,66,213,224,224,224,226,222,221,227,228,223,218,228,226,223,218,222,226,224,224,227,226,224,225,224,232,225,226,225,222,201,26,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,107,107,108,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,95,93,89,87,83,83,78,76,83,81,81,80,80,82,149,201,242,242,242,242,242,241,243,245,221,222,246,193,172,173,158,78,75,78,78,78,77,77,78,78,79,81,80,80,79,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,62,57,52,47,43,41,41,38,38,125,229,220,222,239,241,238,238,235,240,241,240,235,173,45,37,38,37,36,36,41,39,34,36,36,37,35,35,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,26,19,127,222,224,224,224,218,186,180,214,216,184,186,207,184,183,188,223,209,205,201,216,194,205,187,187,223,202,214,224,220,203,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,95,93,89,87,83,82,80,77,82,81,81,80,80,84,148,192,240,242,242,242,242,238,244,242,234,221,238,197,173,173,164,86,77,78,78,78,77,77,78,78,79,81,80,80,79,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,62,57,52,47,43,41,41,38,38,147,235,216,224,241,235,240,244,240,243,240,239,232,182,63,38,39,38,36,36,41,34,31,39,37,37,39,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,29,24,17,106,216,224,224,224,183,70,62,172,176,66,72,141,29,52,49,178,129,149,135,174,81,133,70,60,201,102,181,219,226,203,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,95,93,89,87,83,82,83,80,79,80,81,80,80,81,146,195,237,242,242,242,242,238,242,235,234,233,221,186,173,169,170,106,81,78,78,78,77,77,78,78,79,81,81,80,79,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,62,56,51,47,43,41,41,38,38,149,229,221,224,244,243,239,244,240,246,240,241,237,200,83,47,42,39,37,36,40,33,39,59,50,38,41,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,29,22,16,58,212,224,224,224,127,120,128,115,115,129,107,117,105,184,94,85,58,181,132,162,49,134,66,67,99,54,213,219,228,212,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,95,93,89,87,83,81,81,79,79,80,81,80,80,78,147,203,238,241,242,242,242,238,241,233,233,229,206,168,173,166,175,118,82,78,78,78,77,77,78,78,79,81,81,80,79,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,72,70,66,62,56,51,47,43,41,41,38,38,149,226,223,221,237,245,239,242,241,246,240,244,241,204,113,57,44,38,37,36,40,36,56,131,128,59,36,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,22,15,47,217,224,224,224,103,177,189,101,95,187,192,141,78,146,125,66,48,204,138,128,73,139,66,101,77,52,224,224,224,210,49,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,106,106,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,100,98,96,94,90,88,84,82,81,80,81,81,81,80,80,85,150,197,242,238,243,241,240,239,237,225,225,221,193,167,171,169,175,141,86,74,75,78,81,76,79,78,79,81,81,81,80,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,70,65,61,56,51,47,43,41,39,36,37,144,227,225,220,240,245,243,245,242,242,242,242,247,209,156,111,56,39,37,35,38,38,68,195,208,76,41,35,38,38,38,39,38,37,36,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,30,20,15,53,205,227,223,218,100,185,193,97,94,190,215,156,50,100,147,104,85,218,136,76,125,137,67,145,114,88,225,226,226,149,25,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,106,106,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,94,91,88,85,83,82,82,82,81,81,80,80,91,155,181,235,239,242,239,240,239,217,227,231,217,188,170,170,172,173,164,113,84,81,76,79,77,79,79,79,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,69,65,60,55,51,46,43,42,38,41,39,144,228,224,221,241,244,242,244,241,239,245,240,244,204,171,155,72,39,38,37,39,36,68,216,221,112,37,39,38,38,38,39,38,37,38,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,31,19,16,38,172,222,223,223,117,144,148,104,105,154,137,111,103,185,193,75,101,224,136,50,159,138,67,189,55,123,226,223,224,106,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,106,106,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,94,91,88,85,83,82,82,82,81,81,80,80,91,151,175,225,239,237,234,239,227,220,231,233,193,175,170,174,171,174,174,155,135,100,89,82,77,78,79,80,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,69,65,60,55,51,46,43,41,40,43,52,161,229,221,226,238,243,241,244,244,240,240,235,237,195,170,167,78,38,37,37,39,34,76,225,217,139,36,39,38,38,38,37,38,37,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,30,22,15,18,152,225,223,231,176,53,47,167,160,51,53,128,35,56,157,57,128,224,135,79,172,139,73,214,27,160,221,221,220,100,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,106,107,106,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,94,91,88,85,83,82,82,82,81,81,80,80,84,149,171,221,244,240,241,233,223,230,223,213,179,165,170,170,170,172,176,174,165,149,109,90,80,77,79,80,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,69,65,60,55,51,46,43,39,41,37,61,198,228,219,225,237,242,241,243,243,245,239,241,240,194,171,169,78,38,37,35,37,42,95,221,225,159,48,38,38,38,38,37,38,38,35,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,21,13,15,141,212,222,225,216,175,166,222,221,168,177,198,146,149,196,163,195,224,187,182,201,195,165,224,152,213,224,222,213,81,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,107,107,106,106,106,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,94,91,88,85,83,82,82,82,81,81,80,80,81,150,181,231,239,232,245,224,227,233,217,200,173,167,176,172,171,170,169,171,173,176,164,116,84,78,77,79,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,69,65,60,55,51,46,43,40,42,34,63,221,225,221,224,235,243,241,241,241,242,240,229,219,202,173,158,78,37,37,39,37,41,79,207,231,208,50,38,38,38,38,38,44,40,38,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,28,17,21,17,53,131,210,218,225,227,224,225,230,225,226,228,220,224,220,219,224,221,216,222,224,222,222,223,225,221,226,222,165,34,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,106,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,94,91,88,85,83,82,82,82,81,81,80,80,81,150,188,217,221,223,232,224,228,231,200,169,173,171,173,170,172,170,166,170,172,175,172,155,83,77,78,81,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,69,65,60,55,51,46,43,39,41,31,95,224,226,223,224,232,243,242,241,243,239,239,227,231,212,174,148,65,37,39,39,39,33,56,204,229,220,80,38,38,38,38,42,54,44,42,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,30,20,27,13,12,37,140,230,227,234,218,215,219,223,225,221,225,224,223,224,223,224,221,226,223,223,224,223,222,222,230,212,81,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,106,106,107,105,105,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,94,91,88,85,83,82,82,82,81,81,80,80,77,153,200,223,224,225,226,223,229,225,195,169,175,168,172,172,170,175,168,173,173,171,169,162,84,78,78,82,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,75,75,73,69,65,60,55,51,46,43,39,41,38,141,227,227,225,220,227,243,242,242,245,243,235,228,230,219,179,138,46,37,40,37,40,37,47,182,224,213,131,36,38,38,38,42,54,50,43,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,35,32,31,20,19,7,12,5,57,162,153,200,224,219,223,223,223,220,227,227,225,226,223,221,225,224,225,225,224,223,223,221,222,172,28,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
131,105,104,106,107,105,110,105,105,106,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,99,97,95,92,88,85,83,82,81,82,82,83,80,80,95,161,205,225,224,223,228,221,229,225,194,172,173,166,170,171,169,175,170,173,169,171,169,159,96,78,77,81,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,74,72,69,64,59,54,50,46,43,42,38,50,185,224,225,225,220,224,242,242,240,242,239,225,226,227,224,186,138,45,36,38,37,38,38,38,150,221,222,148,40,38,40,36,40,44,47,41,38,37,37,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,34,32,29,19,13,5,8,4,16,34,36,115,196,228,229,228,224,222,223,221,222,222,221,224,222,223,221,225,224,223,226,226,218,116,11,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,5,1,1,0,50,
131,103,106,104,106,107,115,107,105,105,104,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,100,98,96,92,89,86,83,83,81,81,80,83,79,79,106,174,208,224,222,220,228,225,231,222,187,170,171,171,171,171,172,172,172,171,171,172,172,169,108,76,77,81,81,81,81,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,59,53,49,46,43,42,36,69,223,223,224,224,223,226,241,245,240,241,230,227,229,229,228,192,153,68,41,36,40,36,37,40,143,219,230,174,56,38,42,34,39,38,38,38,37,36,37,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,27,22,16,10,6,4,2,0,4,32,114,215,222,225,223,222,223,223,224,223,222,222,222,224,220,224,224,224,221,226,206,73,0,0,0,0,0,0,0,0,0,0,0,4,9,1,0,7,31,7,5,0,50,
131,105,108,105,107,103,110,106,107,109,106,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,100,98,96,92,89,86,83,83,81,81,80,81,76,76,101,179,215,225,223,221,225,226,226,221,184,171,172,172,172,172,172,172,172,171,171,172,172,170,108,77,77,80,81,81,81,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,59,53,49,46,43,38,40,110,220,228,226,227,227,230,237,246,243,244,224,225,228,227,222,188,167,111,56,41,42,37,40,35,138,216,226,212,66,36,40,35,40,38,38,38,38,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,27,22,16,10,6,4,2,0,0,10,41,181,221,221,224,226,224,222,224,225,223,222,224,223,223,229,231,224,222,224,153,31,0,0,0,0,0,0,0,0,0,0,0,5,13,1,0,9,39,7,6,0,50,
132,107,108,107,114,104,107,105,109,111,107,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,100,98,96,92,89,86,83,83,81,81,79,83,82,84,117,189,220,225,225,224,222,219,220,221,187,172,173,173,173,172,172,172,172,172,172,172,172,171,117,80,79,79,81,81,81,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,59,53,49,46,43,37,47,146,214,221,221,223,220,216,221,231,243,242,229,229,233,230,227,191,170,158,81,44,37,37,41,34,137,221,227,214,105,34,38,37,40,38,38,38,37,38,38,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,27,22,16,10,6,4,2,0,0,2,5,105,225,220,224,225,224,223,223,224,224,223,224,223,221,227,226,223,222,212,92,6,0,0,0,0,0,0,0,0,0,0,0,4,12,1,0,4,22,3,2,0,50,
132,107,107,110,100,112,104,106,108,108,108,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,100,98,96,92,89,86,83,83,81,81,76,81,85,91,158,208,225,225,224,228,226,222,224,223,189,172,172,172,172,172,172,172,172,172,172,172,172,171,126,80,81,82,81,81,81,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,59,53,49,46,43,39,55,174,215,207,205,203,193,179,181,201,234,236,236,228,222,230,234,199,170,172,123,49,38,35,40,39,152,216,226,218,128,36,37,36,39,38,38,38,40,40,38,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,27,22,16,10,6,4,2,0,0,0,1,51,200,211,227,221,219,222,222,225,223,223,221,223,226,218,212,225,220,194,51,0,0,0,0,0,0,0,0,0,0,0,0,1,5,0,1,10,44,3,2,1,50,
136,102,110,92,89,115,104,105,106,106,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,100,98,96,92,89,86,83,83,81,81,78,85,71,132,219,222,226,226,224,227,229,229,229,221,182,170,171,172,172,172,172,172,172,172,172,172,172,173,146,82,79,77,81,81,81,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,59,53,49,46,43,42,56,173,187,175,175,176,172,171,171,207,240,236,236,233,219,222,222,198,171,175,154,91,51,38,37,41,135,227,226,237,134,40,37,35,39,38,38,38,46,44,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,27,22,16,10,6,4,2,0,1,8,2,23,112,203,232,222,222,224,221,222,222,224,220,223,227,163,177,213,224,172,22,5,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,21,105,9,4,0,50,
136,108,61,81,78,114,112,106,104,104,104,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,102,101,100,98,96,92,89,86,83,83,81,81,84,91,107,200,247,227,224,225,225,222,224,226,214,199,172,172,173,173,173,173,172,172,172,172,172,172,171,172,150,81,82,80,81,81,81,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,59,53,49,46,43,39,58,168,179,170,169,169,170,172,179,221,239,239,238,245,237,213,193,177,175,184,172,158,100,53,37,36,68,194,215,219,157,46,38,37,39,38,38,38,46,45,39,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,34,32,27,22,16,10,6,4,2,0,1,4,2,11,59,169,217,222,222,222,222,224,222,224,222,222,208,59,49,132,222,136,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,103,4,2,2,50,
141,75,61,97,87,112,96,102,105,105,104,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,103,102,101,100,98,96,93,89,87,84,82,81,81,85,117,197,209,209,223,195,185,194,205,185,186,188,174,147,148,170,160,144,163,157,142,150,171,172,172,171,173,150,78,80,79,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,58,53,49,46,43,38,57,152,172,173,173,173,172,171,180,226,240,244,243,239,236,211,173,160,181,206,183,178,158,68,36,34,51,78,166,225,171,59,38,36,37,38,38,38,41,42,40,36,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,38,38,38,38,38,38,37,35,34,32,27,21,16,10,6,4,2,0,0,0,0,2,15,40,170,228,220,221,223,223,222,226,226,221,205,34,3,99,226,120,0,5,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,40,85,4,4,2,50,
143,111,112,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,86,77,83,84,108,207,198,25,52,161,60,40,79,133,27,43,156,150,44,32,137,75,29,95,85,26,49,160,172,172,172,172,151,82,82,79,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,68,63,57,51,48,44,42,40,42,125,168,172,172,172,172,174,179,238,239,242,242,240,242,219,183,170,181,234,178,175,169,85,39,37,33,52,71,201,206,86,37,35,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,39,39,38,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,3,10,141,225,203,186,222,221,221,227,225,216,179,38,1,94,224,113,0,0,0,0,0,0,0,0,0,0,5,1,2,1,1,0,3,67,90,10,1,1,49,
136,104,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,85,80,82,90,195,246,199,100,152,104,81,163,191,150,113,159,170,130,88,93,87,37,133,46,86,114,78,125,172,172,172,172,151,79,80,79,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,71,67,63,57,51,48,44,42,41,37,115,175,172,172,172,172,171,179,237,241,241,240,242,241,237,216,198,192,209,179,171,171,111,43,39,36,39,48,123,220,113,38,41,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,38,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,2,2,63,190,144,88,202,225,232,221,204,207,115,15,1,89,221,99,1,2,0,0,0,0,0,0,0,0,1,0,0,5,4,0,2,19,29,13,2,0,49,
136,105,109,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,87,84,76,103,238,249,203,119,205,92,77,131,171,154,135,178,171,161,113,64,104,51,175,48,85,137,119,106,172,172,172,172,150,75,81,79,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,70,67,62,57,51,48,44,42,41,36,106,176,172,172,172,172,171,179,236,239,240,238,241,240,241,238,233,199,159,179,169,174,129,44,40,37,38,39,72,212,106,33,39,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,36,38,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,0,1,16,103,63,26,149,225,222,225,207,175,50,1,3,68,216,69,6,3,0,0,0,0,0,0,0,0,0,0,2,8,7,0,0,5,29,9,1,1,49,
132,106,109,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,86,84,81,127,244,241,199,118,206,90,68,85,133,154,129,178,171,153,53,72,156,51,172,51,85,139,117,105,172,172,172,172,151,80,79,81,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,70,67,62,57,51,48,44,42,42,37,86,171,172,172,172,172,170,180,233,238,238,241,240,239,240,238,239,200,138,175,166,175,131,41,37,35,34,40,52,173,79,31,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,38,36,37,39,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,0,2,4,22,16,6,71,199,215,225,212,149,28,2,1,35,204,31,7,1,0,0,0,0,0,0,1,0,0,0,4,12,5,0,0,14,36,7,2,2,49,
132,105,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,85,86,83,162,248,240,199,115,186,100,81,166,194,158,120,181,171,129,70,109,132,51,174,49,85,136,92,120,172,172,172,172,156,94,80,81,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,70,67,62,57,51,48,44,42,41,39,58,153,172,172,172,172,171,174,197,209,238,242,242,234,233,240,239,195,130,173,169,174,129,38,34,53,42,31,46,129,64,37,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,34,42,48,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,2,1,5,4,3,4,27,132,221,220,214,145,27,5,4,15,162,22,1,0,0,0,0,0,1,0,0,1,0,0,13,22,1,0,0,15,18,2,4,0,49,
132,104,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,83,84,101,217,236,246,201,36,53,143,67,54,98,134,113,178,174,147,33,28,139,49,172,50,82,32,36,157,172,172,172,172,165,113,83,80,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,70,67,62,56,51,48,44,42,40,37,44,123,172,172,172,171,171,172,175,198,240,241,240,229,239,238,238,203,130,172,171,175,130,40,35,53,52,41,47,78,56,43,36,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,41,48,50,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,3,0,4,4,2,6,7,70,142,201,190,91,21,9,2,7,140,25,0,0,0,0,0,0,1,3,1,2,0,2,19,17,0,1,0,5,6,0,3,0,49,
130,103,104,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,103,102,100,99,97,93,90,87,81,87,109,244,239,240,227,153,162,219,159,141,158,137,144,166,170,170,130,128,171,128,175,128,141,110,137,174,172,172,172,171,174,132,80,81,81,81,81,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,73,70,67,62,56,51,48,44,42,40,43,31,106,172,172,172,172,172,170,169,196,239,226,231,238,247,241,241,211,146,173,177,178,131,45,39,49,47,37,48,43,36,37,36,35,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,38,56,63,38,38,38,37,36,34,30,26,20,14,9,5,3,1,0,0,0,0,0,0,1,5,0,3,0,3,56,91,71,76,32,8,5,0,4,136,23,3,2,0,0,0,0,2,9,5,2,0,2,20,21,0,1,2,13,22,1,0,0,49,
132,105,106,106,105,105,101,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,102,101,99,98,94,90,86,80,83,166,251,241,246,251,243,228,218,224,216,188,172,172,171,170,172,170,171,171,171,170,171,171,171,172,171,171,172,171,172,171,154,99,75,80,82,80,77,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,66,61,56,49,46,42,40,42,38,34,114,169,171,172,171,175,166,189,193,224,226,223,234,237,241,233,207,174,224,216,205,134,36,42,39,33,35,39,34,34,37,37,37,37,37,37,37,38,38,38,38,38,38,38,39,36,36,43,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,38,39,38,38,38,36,36,37,33,26,18,16,14,6,0,3,2,2,1,5,4,7,6,3,5,2,3,7,35,43,11,8,3,1,0,2,0,39,10,0,1,0,3,3,8,12,43,22,0,8,3,39,10,7,2,3,41,14,0,1,0,49,
132,105,106,106,105,105,108,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,102,101,99,98,94,90,86,85,96,197,248,242,243,244,240,225,213,221,207,177,173,171,171,173,170,174,169,173,171,173,170,173,170,173,171,173,170,172,171,172,167,109,84,79,80,80,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,66,61,56,49,45,42,40,41,38,34,115,170,172,175,176,171,169,202,217,224,225,222,237,243,238,242,179,163,228,223,220,125,39,39,36,40,49,52,36,40,44,41,38,38,38,37,37,38,38,38,38,38,38,38,38,37,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,35,35,29,25,18,8,5,7,2,8,2,1,2,8,19,16,30,15,2,2,0,4,9,16,3,5,3,4,7,3,4,7,7,0,2,4,9,35,36,17,14,2,0,1,4,2,17,34,8,1,29,11,0,2,0,49,
132,105,106,106,105,107,107,108,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,102,100,99,97,94,90,86,88,108,240,245,239,230,218,213,196,184,191,182,173,172,173,171,173,172,171,174,172,173,170,172,172,174,173,174,170,171,172,173,170,170,146,91,81,79,80,79,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,66,61,55,49,45,42,40,41,38,38,118,172,172,173,175,173,174,212,224,224,226,222,235,247,240,247,183,172,224,228,224,84,42,39,40,43,64,56,37,43,47,42,39,38,38,37,37,38,38,38,38,38,38,38,38,41,39,35,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,36,33,26,21,17,16,13,6,2,1,2,3,4,46,36,4,42,45,9,3,2,1,2,4,0,5,3,5,1,6,5,8,2,1,3,16,76,59,67,11,2,2,1,3,1,5,50,44,5,0,11,8,0,1,0,49,
132,105,106,105,104,105,96,109,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,100,99,97,94,90,87,83,144,243,245,241,202,147,177,139,147,142,138,144,146,111,112,150,131,170,124,138,155,158,113,143,127,174,141,159,172,172,172,174,170,172,104,84,79,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,65,60,55,49,45,42,40,40,38,42,121,172,170,168,170,172,175,217,224,224,225,223,232,240,236,239,216,210,231,228,211,71,40,33,37,41,62,48,35,39,44,39,38,38,37,37,37,38,38,38,38,38,38,38,38,44,43,35,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,31,26,27,21,13,11,9,3,11,19,26,25,108,69,17,56,81,46,15,5,3,5,1,0,6,1,3,2,10,28,35,12,1,2,52,134,43,33,19,11,1,1,6,1,32,82,32,2,0,5,4,0,1,0,49,
132,105,106,105,104,111,101,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,100,99,96,93,90,88,90,185,241,239,241,176,57,148,61,110,89,64,89,94,34,57,131,57,155,46,83,126,94,47,55,46,152,69,145,171,172,172,173,175,179,131,85,79,79,79,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,70,65,60,55,49,45,42,40,39,38,42,121,176,169,167,170,173,173,210,221,223,223,223,227,222,204,222,227,225,232,227,189,49,40,34,38,37,45,40,34,35,39,36,36,36,37,37,37,38,38,38,38,38,38,38,37,44,43,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,31,28,24,20,12,19,33,27,52,73,59,49,101,70,48,50,95,105,38,18,15,23,7,0,5,1,3,24,13,89,129,82,4,22,115,91,14,20,17,16,2,2,12,16,72,77,20,0,2,2,2,0,0,0,49,
132,105,106,105,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,100,99,96,93,90,88,108,220,240,242,237,176,47,62,53,126,76,54,81,95,91,153,167,57,112,86,92,126,47,139,68,52,56,39,166,171,171,172,170,171,170,148,85,78,79,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,60,55,49,45,42,40,39,38,44,127,173,170,179,190,172,171,205,222,223,222,224,225,181,164,227,231,229,227,230,173,50,40,34,37,34,34,39,35,36,38,38,36,36,38,38,37,38,38,38,38,38,38,38,37,40,41,44,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,32,32,37,46,37,104,151,94,110,63,38,24,22,25,26,18,56,83,41,31,32,24,21,3,4,2,8,82,112,174,205,159,30,55,176,38,2,18,10,4,3,7,40,107,80,27,7,0,1,1,0,0,0,0,49,
132,105,106,107,107,104,102,104,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,104,103,101,100,99,96,93,90,88,141,241,245,241,227,171,65,77,71,131,61,64,70,95,52,89,163,32,31,108,93,128,47,174,149,82,75,52,171,172,172,172,172,168,168,153,88,78,78,79,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,75,72,69,65,60,55,49,45,42,40,39,38,49,137,171,172,194,215,174,177,216,227,223,223,224,226,161,168,234,222,227,223,228,163,54,39,35,40,32,37,38,36,40,43,44,37,37,41,40,37,38,38,38,38,38,38,38,37,37,41,54,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,34,33,41,62,166,184,203,208,103,124,18,6,2,4,4,1,4,12,22,27,34,25,15,33,7,8,2,7,69,205,227,210,211,170,174,171,17,5,2,2,1,2,12,75,93,36,4,0,0,0,0,0,0,0,1,49,
132,105,106,107,105,105,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,102,101,100,99,97,92,90,93,95,184,239,242,243,227,172,91,82,101,129,51,89,57,95,48,80,161,40,86,57,90,128,46,173,160,110,86,82,172,173,173,174,174,172,172,154,85,77,77,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,68,63,58,53,48,44,41,39,35,35,51,162,169,175,215,222,208,210,223,227,224,221,224,212,151,188,226,228,227,227,227,162,48,35,34,39,36,38,38,39,38,43,54,36,39,48,39,38,38,38,38,38,38,38,38,38,38,37,44,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,46,37,36,34,36,33,62,180,157,107,104,91,57,75,21,3,1,2,2,0,0,3,3,7,11,9,7,11,14,29,3,2,32,235,213,209,225,230,232,167,20,6,2,0,0,0,36,54,24,5,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,103,102,101,100,99,96,97,92,82,113,230,241,241,243,228,177,121,42,127,130,36,108,38,94,97,162,172,54,154,40,87,127,45,156,56,133,44,106,168,169,168,169,174,169,170,151,86,77,77,80,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,68,63,58,52,48,43,41,39,41,31,56,168,174,179,220,223,219,221,223,225,221,222,226,193,135,209,233,232,226,228,229,151,57,38,34,38,38,38,38,40,37,41,61,39,38,49,37,38,38,38,38,38,38,38,38,38,41,40,57,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,41,39,38,36,38,33,66,97,69,24,15,17,8,9,4,0,0,3,2,3,2,1,1,2,1,1,4,6,30,56,5,5,22,231,222,190,231,221,221,135,18,36,44,5,4,11,49,26,8,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,103,101,100,99,98,96,96,92,85,167,245,245,242,241,237,186,141,31,150,133,33,126,35,97,11,16,129,26,14,53,93,128,102,14,60,160,22,137,173,173,171,169,169,176,167,134,87,78,77,79,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,68,62,57,52,48,43,41,39,41,40,86,209,213,205,224,223,220,222,223,225,223,225,222,195,154,226,225,221,227,227,232,162,57,43,36,38,38,38,38,38,37,43,67,41,42,57,37,38,38,38,38,38,38,38,38,36,40,63,77,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,42,41,39,46,35,65,82,22,23,8,3,9,1,1,3,0,2,23,11,13,29,2,0,0,0,0,0,6,49,67,13,2,51,226,235,204,233,232,146,44,11,88,124,37,6,8,36,4,0,0,1,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,100,99,96,95,93,85,101,209,240,244,244,241,241,195,172,140,172,161,139,165,138,153,133,132,163,135,136,160,153,163,173,138,168,172,141,166,168,169,172,172,174,164,123,92,86,80,77,79,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,67,62,57,52,48,43,41,39,42,34,144,220,226,218,224,224,222,223,224,224,221,226,221,188,151,218,226,229,227,225,228,161,35,41,39,37,38,38,38,36,38,45,65,40,47,63,38,37,38,38,38,38,38,38,38,37,42,59,50,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,37,41,54,54,152,123,27,14,11,8,7,2,3,10,2,2,43,32,35,28,3,0,3,5,5,3,4,4,8,8,22,137,239,216,214,216,225,109,5,2,20,47,66,29,5,6,0,0,0,2,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,99,97,95,94,92,86,93,221,240,240,246,241,242,210,185,174,170,171,171,171,172,175,172,172,172,172,170,172,170,173,169,171,173,171,173,174,168,169,172,175,173,135,93,80,81,79,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,67,62,57,52,47,43,41,39,37,56,193,240,239,230,225,224,223,223,224,224,224,226,221,190,171,225,228,232,226,227,220,169,43,35,38,39,38,38,38,36,40,42,56,38,47,56,37,37,38,38,38,38,38,38,38,37,37,43,56,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,35,37,41,93,224,141,24,16,17,9,5,0,4,4,1,3,54,96,73,40,2,1,2,0,1,0,5,5,9,70,104,217,242,219,205,229,196,50,2,3,0,4,44,49,11,1,0,0,0,1,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,99,96,95,94,91,88,91,176,249,237,246,242,242,231,215,190,170,172,171,172,172,172,172,172,172,172,173,171,173,172,172,173,169,173,172,172,172,173,170,170,152,100,79,77,79,79,78,77,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,67,62,57,51,47,43,41,39,35,90,238,242,242,233,224,224,224,224,224,223,221,224,224,189,157,231,223,227,227,227,220,201,59,36,35,38,38,38,38,36,40,37,46,37,45,52,37,38,38,38,38,38,38,38,38,39,36,37,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,35,35,40,58,173,244,153,20,17,13,8,12,18,32,19,2,2,58,155,148,25,4,5,18,20,22,17,4,20,67,169,232,241,235,231,197,173,108,14,3,2,1,3,24,37,7,0,2,2,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,102,101,99,96,94,93,92,89,86,126,244,239,245,242,242,243,237,210,173,170,172,172,172,172,172,172,172,171,172,172,172,172,173,172,172,172,169,172,164,156,136,126,107,85,77,82,79,79,78,77,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,73,71,67,62,57,51,47,43,41,39,44,140,245,237,244,233,223,224,226,225,224,224,224,222,224,198,184,230,220,229,228,227,231,228,86,41,33,38,38,38,38,36,40,34,38,37,42,47,37,38,38,38,38,38,38,38,38,40,36,36,35,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,43,48,100,231,241,157,39,31,10,23,48,101,134,73,10,7,110,143,164,17,7,9,43,51,47,44,13,79,151,174,234,241,237,222,149,45,26,1,3,1,2,1,4,21,3,2,0,1,1,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,103,102,99,98,95,93,91,90,87,85,88,239,239,243,244,241,243,243,222,177,171,173,173,171,172,171,172,172,171,172,172,172,173,166,170,157,165,172,169,119,109,92,81,83,77,79,82,80,79,78,78,78,78,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,71,66,61,56,51,48,43,39,41,67,188,240,234,243,234,221,224,224,224,224,224,224,222,224,212,208,205,159,194,223,229,238,237,138,48,33,35,38,39,37,36,39,36,37,38,38,40,37,38,38,38,38,38,38,38,38,38,38,36,37,38,38,39,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,39,62,102,179,234,212,113,49,46,14,99,161,209,236,171,22,8,151,183,138,9,6,5,18,31,27,43,21,101,146,158,178,238,184,124,40,8,0,0,0,0,1,0,0,4,1,2,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,101,101,99,98,94,92,89,87,86,84,127,243,234,241,242,240,233,239,224,178,171,172,173,172,172,172,172,172,172,172,172,169,179,162,98,125,167,173,138,89,85,81,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,70,66,61,55,50,48,42,37,48,130,220,237,230,244,237,223,224,224,224,224,224,224,224,224,209,184,176,174,169,229,237,241,242,211,70,38,37,37,38,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,38,37,37,37,38,38,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,43,102,167,221,242,182,68,43,35,23,150,240,245,238,215,27,3,100,226,115,32,29,31,6,27,14,43,27,120,130,231,162,151,82,22,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,101,101,99,97,93,91,88,84,88,83,175,245,236,239,237,243,222,229,221,179,170,171,172,172,172,172,172,172,172,172,172,177,173,103,106,83,138,157,106,82,80,79,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,70,66,60,55,50,47,44,39,53,200,224,237,232,243,240,228,224,224,224,224,224,224,224,224,216,172,178,208,165,225,241,239,241,240,137,46,36,36,36,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,38,39,36,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,41,49,126,177,231,232,107,61,33,29,42,167,238,245,239,215,51,9,71,195,161,90,27,18,3,31,8,31,48,177,162,195,80,43,18,6,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,102,100,103,100,93,89,86,87,84,79,165,249,245,240,243,238,224,226,215,175,167,170,169,171,172,172,172,172,172,172,172,165,172,123,117,107,86,99,87,77,77,77,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,70,65,60,55,50,45,45,43,52,221,227,226,224,243,244,235,224,224,224,224,224,224,224,224,224,225,199,215,204,214,236,236,244,246,202,57,38,36,35,37,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,38,39,39,36,36,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,41,49,155,179,247,180,46,31,23,18,71,207,238,249,238,235,97,16,63,159,129,42,10,4,5,24,4,24,111,92,69,77,36,4,3,3,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,69,89,95,91,89,85,88,77,79,118,248,243,237,238,227,230,225,210,172,168,171,172,172,172,172,172,172,172,172,172,165,169,121,70,76,75,79,75,75,76,77,78,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,70,65,60,55,50,44,43,45,52,203,237,228,227,243,246,239,224,224,224,224,224,224,224,224,225,247,206,191,214,226,234,246,238,234,230,86,37,36,35,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,38,46,38,38,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,35,44,163,208,238,159,59,30,21,14,123,241,239,244,239,243,202,21,20,149,233,124,7,0,1,30,9,26,53,34,8,5,7,1,5,6,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,103,102,104,93,89,87,84,85,78,79,93,221,237,232,228,229,230,221,214,175,174,172,173,172,172,172,172,172,172,172,172,175,170,143,97,78,79,74,70,76,77,78,78,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,70,65,60,55,49,43,45,45,45,150,225,231,229,243,245,239,226,224,224,224,224,224,224,224,224,240,234,163,162,216,244,239,237,237,227,158,64,43,36,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,39,58,39,36,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,40,45,138,232,231,69,35,25,25,17,149,238,237,241,239,248,221,34,15,109,188,133,38,5,6,52,11,18,5,6,4,3,2,1,4,4,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,100,100,96,94,89,85,83,80,80,82,83,160,231,237,223,227,230,226,213,174,173,179,180,172,172,172,172,172,172,172,172,174,170,183,105,80,70,77,76,78,77,78,77,77,78,78,78,80,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,70,65,60,54,49,43,48,44,42,143,231,227,220,244,242,238,228,224,224,224,224,224,224,224,222,239,246,231,217,243,238,248,236,242,230,213,98,51,36,37,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,38,40,56,41,34,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,49,84,173,239,171,109,60,23,17,22,150,217,227,239,234,236,239,107,44,64,104,39,55,18,13,85,11,3,5,7,5,4,3,1,3,4,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,102,98,96,93,88,85,82,78,82,82,84,112,219,236,231,227,230,227,207,177,178,196,200,177,171,169,171,181,179,174,170,172,166,171,97,80,74,79,80,79,78,77,76,77,78,78,78,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,73,73,70,66,60,54,49,44,44,45,43,141,238,221,233,229,228,241,230,223,223,223,223,225,223,224,222,226,247,245,239,233,239,244,241,241,236,220,168,84,43,36,37,38,37,37,37,38,38,38,38,38,38,38,38,38,38,38,37,38,37,40,53,40,36,38,38,38,38,38,38,38,38,37,37,37,37,37,38,37,38,51,129,202,211,126,111,58,33,20,20,109,148,190,210,222,235,238,112,20,31,30,11,29,29,15,70,11,0,7,1,5,4,5,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,90,88,85,83,81,79,79,78,92,210,229,234,222,228,227,208,192,200,215,221,190,171,166,170,214,210,199,175,174,172,161,96,78,78,78,78,78,78,78,77,77,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,78,76,78,71,72,69,67,60,52,49,47,39,50,40,120,218,189,206,190,203,245,233,225,223,222,223,227,221,223,224,225,239,244,241,243,234,242,241,241,235,221,225,173,60,39,37,37,37,35,36,38,38,38,38,38,38,38,38,38,38,38,36,40,36,38,65,39,38,37,38,38,38,38,38,38,38,37,37,37,37,36,38,37,44,64,140,210,161,132,131,58,22,23,16,34,62,139,166,193,240,235,110,4,0,2,2,7,22,13,33,16,4,11,3,4,4,2,3,3,2,0,0,0,0,0,0,0,0,0,3,0,1,0,0,1,1,3,0,0,0,1,3,2,1,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,90,88,85,83,81,79,79,78,84,140,233,225,222,226,229,223,223,225,227,222,196,171,169,175,240,237,237,213,203,194,166,86,78,78,78,78,78,78,78,77,77,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,75,74,72,78,78,72,69,65,58,52,49,48,40,39,50,99,174,174,173,176,212,236,230,226,224,223,222,225,222,221,221,223,237,240,240,242,238,242,238,241,237,224,225,214,107,51,35,37,37,37,37,38,38,38,38,38,38,38,38,38,38,38,35,40,37,37,62,39,38,36,38,38,38,38,38,38,38,37,37,37,37,37,34,38,52,125,176,196,165,132,127,47,22,21,11,14,26,82,105,178,232,224,65,0,4,1,3,3,23,8,19,11,18,28,7,3,4,3,3,3,2,0,0,0,0,0,0,0,0,0,1,1,2,0,0,0,1,2,0,1,0,0,0,0,2,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,90,87,84,82,80,79,79,78,76,100,216,224,231,227,229,232,230,222,224,224,194,172,172,180,236,243,244,241,233,221,152,83,78,78,78,78,78,78,78,77,77,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,75,73,73,77,72,74,69,64,61,55,51,49,48,41,37,60,126,173,172,172,182,229,242,232,224,222,222,223,224,224,221,222,226,238,244,238,237,240,244,231,233,236,224,222,225,188,63,35,36,37,39,39,38,38,38,38,38,38,38,38,38,38,38,36,38,37,44,55,40,38,37,38,38,38,38,38,38,38,37,37,37,37,37,34,33,42,147,188,109,145,159,115,36,25,21,17,8,7,20,52,173,222,215,27,2,3,2,1,3,23,9,7,4,20,19,3,1,3,2,3,3,2,0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,1,0,1,3,3,0,0,3,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,89,86,83,80,80,79,79,78,76,99,207,224,234,229,227,229,232,226,220,225,190,177,173,174,228,244,242,237,226,233,139,86,78,78,78,78,78,78,78,77,77,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,77,86,76,77,74,71,70,62,55,50,49,45,51,42,53,135,173,169,170,201,241,244,229,222,225,224,221,222,221,227,229,227,222,229,234,244,240,228,193,210,217,204,223,219,226,96,39,37,36,40,39,38,38,38,38,38,38,38,38,38,38,38,36,38,35,43,68,39,37,37,38,38,38,38,38,38,38,37,37,37,37,38,35,37,40,172,155,48,121,181,116,31,26,19,20,10,6,5,24,137,211,213,40,4,1,2,0,1,10,13,6,1,5,8,1,3,1,2,3,3,2,0,0,0,0,0,0,0,1,6,0,3,2,2,0,0,0,0,1,1,2,2,0,1,2,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,89,85,82,80,79,79,79,78,79,101,220,221,227,227,226,226,228,229,216,222,213,206,191,174,224,247,240,237,236,220,98,75,78,78,78,78,78,78,78,77,77,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,81,73,86,80,76,74,73,64,65,57,50,49,46,80,74,71,153,173,167,174,214,243,240,230,223,240,243,232,218,218,227,222,223,221,225,229,236,215,188,168,178,179,180,205,214,230,145,54,39,35,39,39,38,38,38,38,38,38,38,38,38,38,38,37,38,37,52,63,39,40,39,38,38,38,38,38,38,38,37,37,37,37,37,33,40,87,176,73,49,100,175,112,33,25,15,13,6,4,1,8,83,181,185,80,14,5,0,0,0,4,32,12,0,1,31,7,5,3,3,3,3,2,0,0,0,0,0,0,0,5,22,3,7,5,7,0,3,1,0,6,0,1,0,0,0,2,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,88,85,81,79,79,79,79,78,80,94,219,228,222,227,225,227,222,225,220,230,226,222,213,195,232,243,235,228,222,172,75,78,78,78,78,78,78,78,78,77,77,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,71,87,118,143,91,74,93,87,77,64,51,48,62,179,193,180,175,169,178,175,222,243,239,239,242,241,242,242,240,239,232,222,224,225,227,228,207,179,172,166,169,171,172,175,200,219,202,67,42,34,36,38,38,38,38,38,38,38,38,38,38,38,38,37,38,34,44,39,37,38,36,38,38,38,38,38,38,38,37,37,37,37,35,31,52,73,86,42,43,103,164,81,32,23,15,10,6,2,6,3,33,87,162,115,36,12,2,1,0,5,15,6,2,0,38,11,4,5,3,3,3,2,0,0,0,0,0,0,0,2,11,11,27,8,14,5,4,6,5,15,0,1,0,9,6,3,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,88,85,81,80,80,78,78,78,75,94,193,233,232,233,223,227,230,224,220,221,223,228,230,225,247,230,188,153,95,89,76,79,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,112,236,224,149,117,182,233,123,73,57,51,71,213,229,219,176,167,171,173,222,243,243,241,242,241,240,239,240,240,225,230,225,223,222,223,204,173,171,172,172,172,168,172,175,210,219,122,43,34,35,37,38,38,38,38,38,38,38,38,38,38,38,38,37,36,55,53,40,37,38,37,39,41,38,38,37,37,37,36,36,36,37,38,42,56,42,32,45,112,130,53,28,20,20,14,11,7,2,0,2,43,154,93,45,11,13,0,4,9,2,1,3,5,7,2,5,1,2,3,2,2,0,0,0,0,0,0,2,0,2,16,37,6,14,17,4,17,9,19,0,2,10,40,42,9,57,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,88,84,81,83,82,80,73,77,73,79,178,228,231,224,224,229,231,221,225,222,224,232,225,233,243,162,87,88,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,80,78,80,90,174,238,223,227,227,223,224,208,140,113,100,138,221,228,217,183,176,174,172,216,241,243,242,241,243,243,240,239,236,221,220,224,225,221,217,191,173,175,168,172,172,169,169,173,189,216,141,34,41,40,37,38,38,38,38,38,38,38,38,38,38,38,39,35,41,54,55,34,41,42,37,56,82,40,38,37,37,36,35,35,36,37,34,37,37,37,37,46,141,75,34,29,26,14,11,7,5,2,1,2,25,96,34,2,12,10,8,49,51,4,3,3,3,0,6,18,4,2,3,1,1,0,0,0,0,1,3,23,2,6,34,18,2,3,7,23,8,0,0,0,2,1,9,34,14,63,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,89,85,80,79,76,89,73,86,86,115,201,225,234,229,226,223,228,221,220,224,227,219,229,242,221,106,81,77,77,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,73,73,76,79,130,232,233,225,230,227,225,218,234,233,230,192,201,224,222,224,202,190,175,169,201,236,235,241,241,242,242,237,239,227,222,224,221,219,224,214,179,167,173,171,173,171,171,170,173,173,204,137,40,38,34,37,38,38,38,38,38,38,38,38,38,38,38,39,37,37,55,53,35,37,36,39,61,129,50,38,37,37,36,34,34,35,40,45,39,36,33,39,63,68,44,26,21,21,15,11,6,4,2,1,0,13,42,14,3,8,36,32,117,107,11,3,3,3,2,25,42,6,1,2,2,1,0,0,0,0,2,5,36,5,3,21,10,0,0,12,14,1,0,0,0,0,5,15,16,57,75,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,89,85,80,78,75,79,82,86,97,150,215,232,226,225,228,221,222,223,226,226,219,221,218,229,164,80,75,72,77,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,74,73,79,98,200,245,229,223,233,228,231,225,232,237,239,226,227,232,222,229,217,212,179,168,181,236,240,236,240,242,242,238,238,223,224,224,221,222,216,192,170,167,173,171,173,170,174,171,168,167,193,174,60,37,34,38,38,38,38,38,38,38,38,38,38,38,38,40,37,36,46,44,36,36,42,39,62,156,51,38,37,37,36,35,35,34,43,56,42,35,39,51,83,50,33,29,24,24,15,11,6,4,2,2,0,7,21,1,2,3,38,73,197,163,15,3,3,3,2,18,44,9,2,2,2,1,0,0,0,0,4,4,38,14,0,6,2,0,0,7,6,0,0,0,0,0,15,74,120,166,75,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,90,86,80,78,81,86,122,105,91,158,186,229,223,227,220,220,225,225,224,223,221,224,220,174,104,80,72,76,77,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,75,79,145,236,244,227,223,229,223,224,225,225,234,231,219,231,229,220,228,222,219,191,165,186,241,243,237,240,240,240,240,231,224,225,221,223,226,208,177,169,172,172,171,172,171,175,170,175,192,201,217,97,37,39,38,38,38,38,38,38,38,38,38,38,38,38,39,35,36,37,35,37,39,63,42,64,138,49,38,37,37,36,35,36,35,47,55,42,36,43,91,117,43,32,33,31,25,15,10,6,4,2,2,0,3,23,9,0,2,25,89,181,189,16,3,3,3,1,3,19,6,3,3,2,2,0,0,0,0,1,3,37,29,0,0,0,0,0,2,1,0,0,0,0,1,20,71,181,190,63,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,89,86,82,83,89,122,122,117,90,125,133,197,229,226,195,215,224,222,222,225,230,229,217,116,79,77,77,77,77,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,75,85,191,236,240,237,228,232,226,224,228,228,245,242,223,224,223,222,225,226,222,206,171,209,246,246,240,242,244,242,236,222,226,221,219,222,223,216,193,177,175,171,171,171,172,174,175,200,218,218,223,127,32,39,37,38,38,38,38,38,38,38,38,38,38,38,37,36,36,36,34,35,49,117,56,60,91,43,38,37,37,36,35,34,36,51,57,41,36,48,116,114,35,29,29,44,23,10,10,6,4,2,2,0,0,30,25,1,1,6,75,166,171,14,3,3,3,3,2,4,3,4,6,3,4,0,0,0,0,0,1,33,31,0,0,0,0,0,2,0,4,0,0,0,9,9,16,95,96,63,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,88,85,84,89,88,123,86,96,96,94,92,159,226,214,160,194,224,224,221,216,217,224,159,88,77,73,78,79,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,76,110,218,239,240,243,225,230,221,227,229,231,237,233,224,217,222,222,221,221,225,211,179,226,241,243,242,237,244,240,229,221,224,220,222,221,221,226,214,179,172,171,171,171,174,175,190,221,224,224,224,142,43,35,37,38,38,38,38,38,38,38,38,38,38,38,37,38,37,38,39,34,63,187,103,57,49,39,38,37,37,36,35,34,36,47,46,37,36,41,96,71,39,31,29,62,45,11,10,6,4,1,3,0,0,16,34,7,3,15,71,163,94,12,3,3,3,2,3,4,3,9,14,10,13,0,0,0,0,0,0,17,13,0,0,0,0,0,0,2,16,0,0,0,18,24,5,67,36,54,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,98,94,88,86,86,89,119,97,78,84,83,75,82,146,226,211,148,184,225,224,205,151,183,185,108,91,77,76,73,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,75,76,163,229,239,246,238,221,205,200,218,218,234,237,235,234,222,223,224,220,218,225,218,185,224,239,239,237,240,239,238,238,224,217,221,225,222,225,225,216,176,168,173,170,170,175,177,204,229,227,223,224,196,52,39,38,38,38,38,38,38,38,38,38,38,38,38,35,37,40,40,42,38,73,224,145,61,38,41,38,37,37,36,35,35,35,38,34,37,37,42,87,52,30,32,28,105,111,14,10,6,4,1,3,0,0,3,25,30,14,41,73,79,38,4,3,3,3,0,1,1,0,11,18,14,19,0,0,0,0,1,0,2,1,0,0,0,0,2,0,4,25,0,0,0,25,11,23,40,21,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,102,97,91,85,88,75,109,136,92,81,78,76,76,81,97,183,212,115,183,201,140,124,155,130,99,93,89,78,77,76,77,77,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,77,80,75,73,98,194,248,236,245,237,224,206,175,198,214,229,243,240,240,221,224,227,224,227,221,227,204,217,241,241,243,242,236,239,241,225,218,226,221,222,222,222,217,177,176,171,172,170,173,170,172,160,196,214,230,211,54,34,33,37,42,40,38,38,38,38,38,38,38,38,37,37,38,38,37,41,135,226,205,52,38,35,38,38,37,37,37,35,34,51,36,38,37,46,80,47,34,28,59,133,143,74,10,1,3,4,0,0,0,0,10,51,11,41,49,60,18,2,3,3,3,2,2,2,2,3,4,4,4,1,7,22,4,0,0,0,0,0,0,0,0,0,0,0,3,8,1,2,16,11,3,27,5,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,101,99,99,90,81,81,163,166,80,77,76,78,76,77,89,93,114,135,169,144,204,224,121,84,84,86,85,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,75,79,77,77,176,237,236,241,242,243,239,213,166,185,203,206,227,232,232,222,225,222,219,219,217,221,215,219,237,235,238,241,238,238,238,229,222,223,220,222,222,222,218,188,175,170,173,168,197,231,73,57,58,119,184,178,65,37,39,37,37,39,38,38,38,38,38,38,38,38,38,38,38,38,34,51,162,223,214,52,39,35,39,38,37,37,35,34,36,57,37,37,36,28,70,54,29,46,133,237,237,187,51,6,0,3,0,0,0,3,8,31,11,60,91,51,13,2,3,3,3,3,3,3,3,3,3,3,2,0,1,14,0,0,0,0,0,0,0,0,0,0,0,0,5,41,7,23,34,35,7,23,2,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,102,94,90,90,83,95,174,174,72,74,76,78,76,75,83,78,90,94,107,155,178,100,92,87,74,75,74,76,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,74,77,79,94,178,247,243,242,239,242,238,221,170,168,174,173,179,226,231,219,218,218,217,219,224,218,227,236,243,240,245,241,245,241,239,233,220,222,220,222,222,222,223,206,173,168,173,179,187,236,65,34,34,55,65,77,58,42,53,44,34,36,38,38,38,38,38,38,38,38,38,38,38,38,31,59,204,230,217,56,40,37,39,38,37,36,32,36,37,60,41,37,36,40,135,78,31,50,219,247,220,223,129,4,0,0,0,0,0,1,8,27,24,79,165,107,15,2,3,3,3,3,3,3,3,3,3,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,32,7,18,19,23,3,21,1,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,101,98,91,88,85,123,239,185,83,74,80,77,78,76,77,77,81,80,91,87,81,87,77,82,72,68,73,77,78,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,74,76,83,146,179,234,241,239,240,241,236,235,184,167,168,166,169,213,226,221,219,221,217,222,229,226,234,239,241,238,239,239,242,245,243,231,221,222,220,222,222,222,225,219,179,168,166,172,185,186,59,47,45,34,31,45,50,50,70,51,35,35,37,38,38,38,38,38,38,38,38,38,38,38,38,86,221,227,218,61,41,39,39,38,37,36,32,36,36,60,44,37,35,45,150,82,45,89,230,241,238,238,145,8,0,1,0,0,0,0,1,18,53,102,83,62,11,2,3,3,3,3,3,3,3,3,3,3,2,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,7,1,2,3,4,1,23,3,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,100,96,97,91,181,243,224,91,77,82,76,78,76,76,79,79,79,76,77,81,75,74,79,76,79,78,77,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,75,77,90,182,196,218,228,241,238,239,240,245,202,175,171,169,183,219,218,226,221,213,215,222,224,216,236,243,237,241,235,239,239,240,238,221,220,221,220,222,222,222,225,224,190,170,170,170,186,127,101,74,45,41,37,35,40,38,52,45,34,36,38,38,38,38,38,38,38,38,38,38,38,38,44,134,226,224,217,64,41,40,39,38,37,36,32,38,36,56,44,37,36,43,169,94,128,173,239,246,245,240,135,7,4,3,0,0,0,0,3,18,69,130,66,16,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,10,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,2,0,5,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,106,100,101,108,153,220,236,240,90,81,81,74,77,77,78,76,77,77,76,78,79,80,81,80,74,85,78,78,79,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,78,79,93,216,224,228,231,242,238,240,242,245,227,193,175,176,195,201,167,222,154,158,187,221,169,194,194,185,162,236,151,146,169,208,220,164,221,221,222,222,222,222,223,227,196,172,178,183,164,66,164,149,85,54,43,33,40,40,46,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,52,168,227,223,216,60,41,38,39,38,37,36,33,38,34,49,41,36,38,60,203,153,215,225,239,237,239,229,92,4,4,2,0,0,0,0,3,17,70,101,49,10,2,3,3,3,3,3,3,3,3,3,3,3,3,3,7,18,3,0,0,0,0,0,0,0,0,0,0,0,0,4,2,2,2,3,0,1,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,96,110,159,185,215,225,236,238,94,80,81,74,78,79,78,74,79,76,74,80,78,76,76,77,73,80,83,78,79,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,82,90,217,228,231,230,241,240,239,243,241,240,218,180,176,215,179,95,175,85,121,156,225,122,164,108,154,84,196,75,75,78,141,160,119,221,224,222,222,222,222,222,227,193,175,200,218,117,56,194,216,182,110,59,33,40,33,36,36,39,40,38,38,38,38,38,38,38,38,38,38,38,38,56,198,227,220,216,54,40,37,39,38,37,37,35,40,33,42,38,35,40,95,218,227,229,225,228,216,223,213,47,1,1,0,0,0,0,2,2,47,87,53,19,7,0,2,3,3,3,3,3,3,3,3,3,3,2,0,3,22,2,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,3,1,6,1,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,105,104,107,103,106,108,102,102,138,230,234,221,214,231,220,97,75,80,77,78,81,78,77,80,79,75,77,77,77,76,77,72,79,69,78,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,85,88,80,74,79,83,102,210,231,228,234,241,242,240,242,241,240,235,209,198,226,197,53,53,92,124,152,224,117,156,67,211,77,146,150,159,107,39,50,145,223,226,219,222,222,223,227,228,212,193,229,146,58,54,215,226,231,199,127,61,38,30,39,38,33,34,37,38,38,38,37,37,37,37,38,35,37,39,70,209,223,222,213,56,35,42,38,40,36,34,37,38,35,36,33,37,39,111,227,226,230,229,224,199,178,198,40,5,5,1,0,0,0,3,6,128,86,12,1,0,0,0,0,1,1,3,3,3,3,3,3,2,2,2,5,28,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,106,108,104,101,104,110,103,96,143,218,244,208,180,209,175,87,74,79,77,78,78,78,76,77,76,76,76,78,76,74,77,74,84,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,83,95,82,75,79,77,94,197,226,226,241,242,242,242,242,242,242,238,235,228,241,235,71,105,136,136,36,107,121,32,48,225,77,126,192,235,195,74,90,173,223,226,219,222,222,224,224,228,220,218,195,78,38,59,222,229,225,224,218,139,59,47,36,39,36,39,40,38,38,38,37,37,37,37,39,37,36,43,113,219,225,225,214,48,40,33,37,40,37,34,37,37,37,37,37,30,43,129,225,222,227,229,220,192,164,151,27,1,1,0,0,0,0,0,10,159,74,0,0,0,0,0,0,0,1,2,3,3,3,3,3,2,1,0,5,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,110,107,98,99,108,105,119,202,226,114,104,101,96,85,73,80,77,76,74,77,77,75,74,77,76,75,77,76,76,76,88,85,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,82,92,86,78,78,74,79,177,221,234,237,239,245,245,245,233,242,242,239,231,239,242,86,90,172,140,94,174,115,112,72,175,81,121,182,231,214,86,98,203,222,224,221,222,222,224,225,236,227,236,159,46,35,83,224,231,227,227,230,218,185,48,29,38,39,41,38,38,38,38,38,38,38,38,35,38,35,51,175,232,224,224,221,80,56,38,35,39,38,37,37,37,37,38,63,68,51,189,227,233,229,223,229,180,174,69,14,0,0,0,0,0,0,0,27,171,77,0,0,0,0,0,0,0,1,2,3,3,3,3,3,2,1,0,8,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,105,108,119,156,149,114,131,123,195,234,124,80,78,86,77,78,79,75,76,74,76,83,79,78,80,77,77,74,77,77,79,96,87,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,87,84,87,77,77,76,76,177,237,243,243,241,243,243,243,235,243,243,241,240,243,240,135,56,206,135,140,202,125,154,103,148,81,149,116,126,146,85,78,224,221,222,223,222,222,224,225,229,233,233,84,40,34,114,218,213,210,220,241,224,216,91,38,38,36,33,36,38,38,38,38,38,38,38,37,40,35,57,216,233,220,224,223,196,86,41,36,37,39,39,37,37,37,36,102,131,77,214,232,229,230,234,204,172,127,34,4,2,4,0,0,0,0,1,20,178,102,11,0,0,0,0,0,0,1,2,3,3,3,3,3,2,1,0,4,23,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,101,103,110,122,160,170,177,169,124,136,199,238,162,83,79,79,73,80,78,78,79,77,79,80,73,77,72,76,76,77,81,80,85,84,86,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,92,89,88,78,77,79,78,176,241,240,244,242,239,240,240,242,243,242,242,242,245,243,177,77,212,140,37,61,127,30,46,193,107,218,80,60,205,120,114,230,224,222,224,222,222,224,226,230,236,232,76,43,48,118,186,184,172,201,217,232,226,196,108,70,38,41,40,38,38,38,38,38,38,38,37,40,37,83,221,225,218,227,223,233,147,48,39,36,38,39,37,37,37,35,103,225,153,228,225,213,217,235,186,169,64,6,4,4,1,0,0,0,0,2,12,180,107,10,0,0,0,0,0,0,1,2,3,3,3,3,3,2,1,3,7,34,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,109,125,157,174,176,173,164,116,119,193,212,171,86,83,79,76,77,78,77,79,80,79,78,76,87,84,80,77,77,84,85,87,88,79,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,83,81,77,77,78,80,82,177,242,243,243,241,239,239,241,241,242,241,241,242,238,238,225,197,226,209,180,189,205,183,195,230,212,243,218,211,237,224,212,231,228,225,224,222,222,224,225,227,221,180,58,40,62,129,175,169,161,188,210,222,233,244,230,114,38,43,40,38,38,38,38,38,38,38,37,40,37,116,219,222,221,227,218,225,207,82,44,37,36,37,37,37,37,38,117,247,239,232,225,202,196,210,179,130,35,3,13,0,0,0,0,0,0,1,11,152,84,1,0,0,0,0,0,0,1,2,3,3,3,3,3,2,1,3,14,26,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,107,117,147,172,171,171,161,122,112,103,141,177,168,87,85,78,75,77,77,76,83,91,81,82,93,113,122,90,72,77,88,85,80,85,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,76,76,73,77,75,79,179,242,242,242,241,242,241,244,242,240,240,242,241,237,238,239,231,226,227,230,221,224,229,226,228,243,240,241,242,241,244,236,228,228,227,225,222,222,224,223,228,216,115,40,35,92,161,170,171,172,176,195,200,224,240,244,174,72,38,38,38,38,38,38,38,38,38,40,39,36,132,217,222,226,225,223,220,225,157,48,38,34,35,37,37,37,44,163,242,238,227,229,195,182,192,189,102,13,15,33,7,2,0,0,0,0,0,8,116,48,0,0,0,0,0,0,0,1,2,2,2,2,2,3,2,1,1,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,106,104,105,106,114,149,168,176,170,175,143,94,107,100,100,152,165,110,79,75,77,77,77,80,82,88,82,78,89,129,186,116,73,80,86,91,79,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,78,77,77,73,76,74,78,175,240,243,244,243,241,240,244,239,240,240,240,241,237,242,238,222,223,232,227,222,229,228,231,223,241,238,240,244,243,235,229,227,225,229,225,224,223,226,223,233,185,51,37,38,115,176,171,174,174,170,178,168,195,215,233,237,153,42,37,38,38,38,37,38,39,38,40,39,33,135,219,223,226,224,225,220,229,203,64,37,36,35,37,36,35,66,196,242,245,233,227,196,175,173,203,60,9,29,115,21,4,3,1,0,0,1,18,68,17,0,0,0,0,0,0,0,0,2,2,2,2,2,3,2,2,2,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,103,104,108,157,171,172,168,167,173,131,101,100,97,99,136,174,134,80,79,77,78,76,75,71,84,85,81,78,98,155,111,85,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,79,77,174,242,242,243,245,240,240,244,239,242,242,242,242,236,239,228,223,226,229,224,229,228,228,229,228,245,243,242,246,236,219,207,223,228,233,227,225,223,225,225,234,174,43,36,56,128,171,173,172,172,172,171,172,169,180,202,240,202,51,38,38,38,38,36,37,38,37,36,40,48,174,224,224,224,224,224,224,224,216,107,50,42,38,34,37,40,94,211,245,245,236,211,184,170,172,195,51,5,32,157,25,1,3,0,0,0,2,14,25,10,0,0,0,0,0,0,0,0,2,3,3,3,3,3,3,3,13,22,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,103,106,156,128,112,119,150,161,119,104,101,96,102,127,167,129,89,83,78,77,76,74,85,92,94,113,87,79,81,83,79,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,74,79,78,178,246,240,244,244,240,240,245,240,242,241,242,241,240,231,223,223,231,225,229,233,230,227,228,231,241,242,243,241,213,187,178,207,231,231,227,226,225,225,229,226,175,46,41,88,157,174,168,172,172,172,170,174,171,171,180,232,213,51,40,38,38,38,38,39,37,36,35,37,53,200,224,224,224,224,224,224,224,223,191,111,38,36,33,41,50,161,238,242,237,242,209,171,169,169,202,67,8,18,96,14,1,2,0,2,0,3,3,29,16,0,0,0,0,0,0,0,0,2,3,3,3,3,3,3,3,23,31,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,104,105,108,148,130,147,150,151,155,113,106,102,96,96,97,132,140,98,79,83,79,81,76,83,101,150,102,80,92,77,78,76,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,74,77,90,183,239,236,245,244,240,241,244,240,242,241,240,239,240,222,221,222,228,229,228,229,227,224,227,226,238,244,243,216,186,167,169,197,228,224,226,228,228,227,227,224,152,44,64,135,171,175,168,172,172,172,170,175,172,167,172,212,229,101,45,38,38,38,39,41,36,38,46,69,50,208,223,224,224,224,224,224,224,224,231,180,49,39,35,36,88,234,247,242,237,242,213,175,180,191,217,134,27,18,86,2,2,3,4,3,1,1,1,24,13,0,0,0,0,0,0,0,0,2,3,3,3,3,3,3,3,16,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,104,106,101,101,121,168,170,164,149,104,103,103,97,90,93,109,103,82,79,83,87,83,75,90,144,98,79,73,89,84,76,75,74,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,81,77,80,96,193,225,224,239,243,240,241,241,240,242,241,241,239,228,224,222,224,222,228,224,222,231,232,228,229,245,246,230,187,172,167,172,204,229,222,229,228,228,230,225,234,119,38,99,167,178,168,172,172,172,172,170,173,174,171,178,205,246,181,47,38,38,38,39,42,36,42,75,136,74,206,223,224,224,224,224,224,224,222,222,196,59,57,39,49,121,246,245,240,242,240,236,204,189,220,226,195,80,48,73,10,0,0,0,0,2,1,0,8,4,0,0,0,0,0,0,0,0,2,3,3,3,3,3,3,2,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,105,105,104,126,166,177,173,172,156,103,105,103,97,92,85,89,90,82,79,78,92,90,104,108,126,75,78,84,85,90,78,76,76,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,82,75,78,94,160,180,200,240,244,241,243,239,242,241,242,241,233,220,227,222,227,220,224,226,223,232,232,221,239,249,228,193,171,172,172,173,215,233,227,235,227,228,231,228,223,92,38,115,170,173,167,176,172,172,172,173,170,177,186,193,216,238,206,48,38,38,38,37,42,35,48,163,218,118,208,223,224,224,224,224,224,224,224,224,211,97,117,63,59,185,239,240,237,244,243,246,215,201,223,226,237,189,180,210,79,59,10,2,0,0,2,10,4,1,0,0,0,0,0,0,0,0,2,3,3,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,115,167,171,176,173,170,160,101,104,101,99,95,92,85,73,80,85,86,96,100,141,98,96,76,74,85,86,80,75,77,77,75,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,80,75,76,85,126,167,190,240,243,241,243,240,241,241,242,232,224,222,224,224,225,222,222,226,230,221,213,201,222,229,194,171,171,172,171,174,231,241,243,242,235,235,237,236,161,64,42,117,171,166,171,170,172,172,172,174,169,199,232,233,244,246,186,50,38,38,38,35,41,35,56,112,208,170,219,224,224,224,224,224,224,224,222,222,216,220,217,143,118,240,238,240,242,244,238,238,235,238,230,221,238,233,237,241,238,210,89,42,7,1,10,42,10,0,0,0,0,0,0,0,0,0,2,3,3,3,3,3,3,2,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,106,101,108,103,123,169,168,169,173,166,153,102,106,101,100,95,93,86,81,81,80,89,92,92,93,88,73,84,95,96,80,76,77,79,77,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,75,104,168,179,228,243,242,244,243,240,241,240,223,221,222,222,226,223,225,221,221,224,216,198,178,187,194,168,168,171,170,170,178,232,236,244,240,243,244,242,240,104,40,50,130,173,166,175,172,170,173,171,170,172,211,239,239,243,232,115,45,37,38,36,35,40,39,78,147,214,218,225,223,224,224,224,223,223,223,223,225,230,221,234,227,227,231,246,243,245,241,242,242,240,244,239,239,244,237,244,243,229,246,220,140,40,0,19,74,17,1,2,0,0,0,0,0,0,0,2,3,3,3,2,2,2,3,5,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,104,104,105,94,109,100,152,172,172,172,171,169,151,107,103,103,99,95,91,86,83,82,80,78,81,78,73,81,87,85,90,82,81,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,90,172,171,208,242,242,244,243,240,241,233,221,224,224,224,224,224,224,222,224,218,197,174,173,172,172,172,172,172,172,172,181,233,240,242,241,239,247,238,218,77,37,81,161,172,172,172,170,168,175,170,170,173,176,175,218,223,157,61,36,37,38,33,36,38,52,141,208,220,224,223,223,224,224,223,222,222,222,222,225,224,224,229,229,229,227,239,243,247,233,243,242,242,242,242,242,242,242,242,242,242,242,239,235,99,5,22,89,18,1,0,0,2,2,0,0,0,0,2,3,3,3,3,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,104,104,110,92,107,115,162,172,172,172,172,172,157,108,105,103,99,95,91,86,83,82,80,75,79,85,82,78,74,93,90,78,79,79,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,86,146,175,211,242,241,240,239,241,237,223,222,224,224,224,224,224,223,222,224,209,185,171,171,172,172,172,172,172,172,172,181,232,241,243,242,238,245,242,182,57,54,133,173,172,172,172,170,171,169,174,177,139,69,62,181,160,55,41,37,37,38,38,38,46,78,167,187,215,223,223,224,224,224,223,222,225,227,227,224,222,225,226,228,224,226,238,241,248,241,241,242,242,242,242,242,242,242,242,242,242,242,242,236,159,30,7,67,15,2,1,0,0,0,0,0,0,0,2,3,3,3,15,11,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,103,103,117,104,108,134,168,172,172,172,172,175,163,108,105,103,99,95,91,86,83,82,80,72,81,83,92,76,72,79,70,82,79,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,82,122,175,206,241,243,245,244,241,225,223,224,224,224,224,224,223,223,222,223,188,172,169,171,172,172,172,172,172,172,172,181,234,241,242,241,238,241,243,135,47,89,167,175,172,172,172,173,171,169,174,167,94,37,44,130,126,32,37,59,61,53,54,61,69,132,171,181,212,225,222,223,224,224,223,223,224,227,228,224,218,230,227,227,223,220,235,243,244,242,239,242,242,242,242,242,242,242,242,242,242,242,245,239,215,83,9,33,5,3,1,3,2,0,0,0,0,0,2,3,3,3,21,23,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,106,125,108,107,160,171,172,172,172,171,174,171,125,106,103,99,95,91,86,83,82,82,75,80,75,100,88,93,126,78,80,78,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,106,170,189,227,232,242,244,233,221,224,225,224,224,224,224,223,224,222,221,176,170,170,171,172,172,172,172,172,172,172,182,237,242,242,240,236,239,241,96,45,113,181,173,172,172,172,175,172,168,170,146,61,35,38,69,93,61,77,136,146,139,130,127,120,162,176,200,220,228,220,223,224,224,223,223,224,223,220,224,223,225,224,226,225,219,231,243,245,242,241,242,242,242,242,242,242,242,242,242,242,242,246,242,240,164,15,12,1,1,1,13,10,0,0,0,0,0,2,3,3,3,14,24,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,105,112,115,110,101,170,175,172,172,172,171,173,181,157,106,103,99,95,91,86,83,82,81,79,80,69,140,122,104,100,83,79,75,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,76,93,150,172,192,197,223,240,226,224,222,225,224,224,224,224,223,225,223,218,173,170,169,171,172,172,172,172,172,172,172,183,240,241,241,241,240,240,221,77,64,140,175,171,172,172,172,173,170,167,165,104,51,37,36,48,92,144,201,202,200,182,163,171,160,169,172,212,226,228,221,223,224,224,223,223,222,222,222,233,235,223,225,221,224,222,228,242,243,239,243,242,242,242,242,242,242,242,242,242,242,242,246,243,235,200,21,1,0,1,1,20,21,3,1,0,0,0,2,3,3,3,7,19,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,109,117,99,106,126,169,173,172,172,172,172,170,176,178,106,103,99,95,91,86,83,82,81,79,76,88,182,139,86,75,77,78,77,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,76,82,120,168,169,175,208,229,222,222,221,223,223,224,224,224,222,226,223,215,172,170,170,171,172,172,172,172,172,172,172,184,241,242,241,239,239,241,192,64,99,166,169,163,172,172,172,172,173,174,145,83,46,38,72,75,125,201,230,230,222,192,176,177,170,172,181,217,221,222,223,224,224,224,223,222,223,228,234,237,239,217,192,207,223,227,229,239,238,235,241,242,242,242,242,242,242,242,242,242,242,242,239,238,244,201,25,0,0,0,0,14,28,7,0,0,0,0,2,3,3,3,2,18,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,105,123,109,99,132,165,176,172,172,172,170,167,184,195,106,103,99,95,91,86,83,81,79,75,79,103,199,108,74,91,76,77,76,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,73,78,102,171,165,174,210,228,222,221,222,221,223,224,224,224,222,227,224,214,175,174,174,171,171,172,171,172,171,172,172,184,240,242,242,240,244,237,181,78,117,173,173,174,171,172,172,167,175,177,120,62,40,86,179,193,140,226,232,231,218,186,163,162,176,175,168,216,216,220,224,224,224,223,223,222,233,240,238,240,243,197,167,183,216,226,228,234,239,240,241,242,242,242,242,242,242,242,242,242,242,242,243,233,241,216,38,1,0,1,0,3,31,11,0,0,0,0,2,2,2,2,7,28,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,91,110,100,104,163,170,172,172,176,174,174,165,190,205,105,103,99,98,93,83,82,78,78,74,83,93,211,82,79,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,78,79,85,90,78,87,88,142,187,198,214,230,222,225,228,225,223,224,224,224,223,223,227,217,174,171,170,170,171,175,169,172,170,175,173,187,245,238,243,250,239,221,148,143,150,171,173,168,170,173,172,167,179,175,74,40,76,183,232,229,228,228,228,232,210,179,175,172,167,176,171,172,186,221,224,228,224,222,224,235,245,244,237,235,237,228,209,226,226,222,227,227,231,245,241,242,242,242,242,242,242,242,242,242,242,242,246,239,236,229,103,1,0,0,6,0,14,14,1,0,0,0,0,0,0,0,9,22,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,3,9,3,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,110,118,103,117,168,177,172,170,166,169,168,172,207,223,161,112,98,93,87,96,93,84,79,78,82,91,210,82,79,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,77,79,88,77,86,92,88,96,158,228,221,226,220,224,223,223,223,224,224,224,224,223,225,215,174,171,171,172,169,176,169,169,170,174,169,183,242,244,237,232,236,190,112,117,177,170,171,171,170,167,170,172,186,195,60,56,151,216,231,222,228,228,228,226,188,165,168,173,170,175,172,173,181,220,225,221,223,224,230,243,240,238,243,242,240,238,233,238,237,229,226,240,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,236,244,243,133,7,1,2,1,1,11,27,1,0,0,0,0,1,0,0,5,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,8,2,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,101,105,98,97,126,171,174,166,175,166,181,178,175,212,222,219,154,99,95,93,119,108,81,84,80,81,96,214,83,79,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,76,76,85,84,81,80,81,81,106,201,227,224,228,222,222,222,223,224,224,224,224,223,223,214,173,171,171,174,166,174,172,171,171,172,167,188,237,234,236,241,244,143,166,157,183,167,170,173,174,169,188,196,203,199,55,76,215,230,229,224,228,228,228,217,195,184,183,176,171,174,172,172,174,213,222,220,222,226,233,239,237,241,238,240,241,241,239,238,241,239,238,244,242,240,240,242,242,242,242,242,242,242,242,242,242,242,240,237,245,247,152,13,0,4,0,0,19,28,1,0,0,0,0,1,0,0,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,102,116,130,160,147,172,177,166,177,171,201,203,193,219,222,235,205,158,159,155,187,135,83,89,78,93,128,218,83,78,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,77,75,77,82,76,77,84,78,83,166,226,221,231,229,221,222,223,224,224,224,224,223,221,217,173,171,172,175,168,173,169,171,173,173,172,206,241,241,240,238,240,159,212,183,193,169,172,174,172,177,216,241,238,216,64,127,223,225,235,225,228,228,228,225,232,223,218,186,166,171,172,173,172,202,222,223,224,224,236,237,241,243,237,239,242,241,241,241,240,240,240,241,238,238,239,242,242,242,242,242,242,242,242,242,242,242,241,241,245,231,96,6,1,2,2,2,50,47,0,0,0,0,0,0,1,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,129,161,194,152,172,173,168,170,175,215,225,221,231,228,234,227,224,226,231,228,187,103,96,101,164,196,224,82,78,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,78,77,79,77,79,79,82,77,80,156,231,220,224,232,222,222,223,224,224,224,223,225,222,223,175,172,172,174,175,165,128,127,169,171,173,205,237,239,237,234,244,211,228,190,210,186,176,168,169,190,231,245,234,236,150,197,223,231,233,225,228,228,228,231,247,240,242,201,169,169,172,173,172,192,221,227,222,225,239,240,241,240,244,239,241,240,242,243,240,238,238,240,241,240,240,242,242,242,242,242,242,242,242,242,242,242,241,240,239,211,39,2,2,1,2,3,60,64,1,0,0,0,1,1,3,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,135,144,152,157,178,177,173,167,184,222,231,229,229,227,229,230,228,221,227,227,217,183,179,187,227,228,224,81,78,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,79,77,78,76,79,77,79,77,79,146,232,230,226,223,227,222,223,224,224,224,222,226,224,229,181,174,172,170,157,114,74,78,156,173,167,193,238,167,132,157,214,137,161,189,215,192,176,172,185,213,238,243,236,236,216,229,232,236,225,227,228,228,228,232,241,244,248,221,185,172,172,173,170,188,220,228,220,234,240,238,236,240,244,241,243,241,240,242,242,240,240,240,239,241,241,242,242,242,242,242,242,242,242,242,242,242,239,236,237,197,24,1,2,1,0,1,48,58,2,0,0,0,1,1,7,2,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,8,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,140,128,133,180,197,189,191,174,196,223,226,225,222,232,224,224,232,235,221,229,224,235,231,222,232,228,220,81,78,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,79,78,77,79,75,76,76,75,75,112,220,226,233,218,226,223,224,224,224,224,221,227,226,234,188,175,171,168,94,60,44,71,156,171,158,134,125,76,53,79,112,60,105,179,211,181,168,185,219,242,246,247,240,222,225,230,220,225,224,226,228,228,228,237,238,245,241,235,205,181,171,173,168,187,220,223,228,239,240,241,240,239,239,242,241,241,240,241,241,242,241,240,240,241,241,242,242,242,242,242,242,242,242,242,242,242,245,239,238,153,21,1,3,1,7,2,65,68,0,0,0,0,1,2,11,3,3,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,18,7,2,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,110,103,104,109,143,165,179,207,222,225,230,207,207,229,233,229,221,227,228,228,225,228,226,227,228,234,231,225,226,226,240,134,84,80,77,76,80,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,79,77,77,80,79,77,77,77,76,95,193,237,230,220,224,217,222,221,218,214,223,219,232,242,220,168,176,136,58,39,39,65,137,151,96,71,44,42,40,45,47,38,73,175,222,204,206,223,242,244,240,247,241,227,230,228,226,227,227,229,227,228,229,243,241,241,241,240,237,210,166,171,164,182,213,225,231,240,242,242,242,241,241,242,241,241,241,241,241,242,241,241,241,241,241,242,242,242,242,242,242,242,242,242,242,242,247,237,219,66,7,7,4,8,5,3,81,77,3,1,0,0,1,30,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,106,103,101,108,155,182,205,217,219,232,221,219,224,230,227,232,229,232,226,226,220,229,223,226,227,226,227,227,234,229,221,217,102,81,79,79,74,74,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,79,77,78,85,82,78,78,78,78,82,154,226,233,229,240,231,228,228,228,227,224,221,235,243,237,124,80,82,45,36,38,51,82,80,56,36,39,39,38,35,31,36,43,142,239,225,231,242,243,241,241,241,232,227,229,227,228,228,228,229,227,227,226,244,242,242,242,242,243,218,169,172,171,200,220,223,223,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,235,139,26,1,0,6,14,3,21,73,81,18,1,7,6,1,34,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,102,93,119,169,216,232,225,231,226,224,234,231,231,224,226,230,230,231,236,232,232,230,233,225,221,229,229,228,223,227,218,213,94,78,72,79,73,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,79,77,77,85,83,78,78,78,77,81,92,170,219,228,221,226,220,221,225,232,224,224,239,242,193,64,42,39,36,35,35,36,42,39,41,36,38,38,37,38,36,41,34,124,240,239,244,245,245,242,243,235,225,229,228,227,228,228,228,228,226,227,231,245,243,243,241,243,244,225,177,173,178,213,229,224,228,242,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,235,239,95,3,2,5,11,35,6,55,114,131,69,26,8,3,2,22,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,102,105,117,130,210,232,196,179,192,218,173,173,203,191,172,186,227,194,221,177,224,215,174,187,204,215,201,205,196,172,185,221,236,166,86,75,78,80,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,78,77,76,79,79,78,78,78,75,81,75,97,191,226,225,233,223,220,218,218,221,226,240,241,92,36,46,38,35,37,37,34,35,36,33,38,38,37,36,42,38,42,38,130,237,240,240,235,244,242,242,228,227,232,227,226,228,228,228,228,227,228,238,244,243,244,241,244,244,232,185,171,184,217,227,221,239,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,189,40,0,3,1,9,14,3,35,88,92,74,82,33,12,4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,133,181,228,233,99,46,79,172,25,58,137,68,53,116,227,98,183,46,198,151,60,71,112,166,119,140,105,50,69,209,229,218,151,91,74,82,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,77,77,77,77,77,78,78,78,78,77,73,80,192,235,208,197,223,228,227,221,222,225,239,242,83,30,35,37,38,41,41,37,36,33,43,53,49,37,33,37,39,57,44,128,239,238,240,238,241,240,243,227,228,231,227,227,228,228,228,228,227,229,231,239,241,244,241,243,245,238,192,168,185,218,220,224,241,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,234,84,18,4,1,1,48,59,14,21,86,163,130,187,121,74,23,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,106,105,160,217,228,225,104,150,100,137,88,189,207,90,168,199,234,101,144,49,204,85,161,87,72,159,73,207,116,147,112,162,224,234,215,131,84,77,80,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,77,78,80,77,76,78,78,78,77,78,74,85,149,170,134,115,195,222,233,227,223,222,235,243,133,41,40,39,39,41,41,38,38,42,61,80,57,38,35,40,47,76,54,126,243,242,239,241,242,241,245,228,227,228,227,227,228,228,228,226,228,229,221,234,240,243,242,242,244,241,197,168,183,218,225,237,240,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,227,24,4,6,0,7,107,152,54,7,33,137,146,201,210,161,74,9,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,101,106,108,178,225,226,227,109,187,141,114,63,136,203,94,202,226,226,94,103,79,204,80,215,146,41,65,54,227,112,175,157,132,223,228,228,193,103,72,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,78,78,79,79,79,76,78,81,75,75,78,78,78,76,79,75,76,75,90,75,77,121,173,217,219,222,219,231,243,133,36,45,32,38,35,35,38,38,40,59,62,48,37,44,59,41,59,45,126,238,242,240,241,242,241,244,227,227,226,228,228,228,228,228,227,228,230,221,234,240,243,243,241,243,242,200,171,190,226,239,242,240,238,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,224,33,0,4,2,11,159,208,74,3,18,46,53,165,224,218,97,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,104,108,191,227,227,234,104,187,140,118,44,100,190,94,204,230,226,87,88,106,204,78,219,148,41,79,73,183,115,177,147,137,225,226,230,218,115,68,76,77,78,75,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,76,76,77,78,78,80,78,78,78,76,76,78,78,78,78,74,75,74,85,98,85,69,67,102,150,180,192,208,223,241,120,37,42,44,35,34,31,38,38,45,40,41,41,62,73,84,64,61,67,122,228,235,237,240,240,241,233,225,234,228,174,126,187,224,227,230,230,223,224,229,231,241,242,239,244,244,214,181,207,235,244,241,240,243,242,243,240,245,244,242,244,240,243,242,243,241,241,242,242,242,242,242,242,242,242,242,242,242,238,241,238,237,230,101,26,2,1,24,167,193,32,1,5,10,10,119,222,234,71,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,109,102,109,182,227,230,232,104,179,109,134,92,194,221,94,198,223,227,61,113,114,202,82,183,103,58,149,106,151,118,173,116,160,231,227,228,218,126,76,77,80,77,75,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,77,79,85,86,79,79,78,77,77,77,78,78,78,81,77,86,99,164,168,135,84,58,56,80,98,105,119,121,133,95,44,62,68,39,39,41,34,55,73,36,36,49,109,142,125,125,131,122,145,189,196,208,220,223,221,224,226,224,215,91,55,110,209,233,225,224,230,229,222,228,239,240,238,245,238,226,214,230,239,241,241,237,248,238,241,239,237,241,241,240,241,238,242,241,242,241,242,242,242,242,242,242,242,242,242,242,242,241,235,240,165,113,182,67,2,4,44,181,137,14,0,0,0,9,52,161,229,53,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,109,101,113,178,229,227,232,104,41,54,162,18,43,144,87,202,219,227,59,163,119,202,142,42,51,100,35,29,178,109,40,60,198,230,226,232,228,118,74,84,81,76,76,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,81,84,88,86,78,78,78,77,77,77,78,78,78,78,71,104,212,237,238,215,138,72,42,49,42,43,44,43,54,45,48,127,127,43,42,38,35,82,130,46,37,64,146,173,159,170,174,167,173,172,172,178,180,181,187,230,225,216,110,56,32,71,205,223,224,229,232,223,224,226,232,246,225,228,246,228,229,242,238,239,239,100,234,147,186,152,49,154,128,107,239,130,208,243,241,241,242,242,242,242,242,242,242,242,242,242,242,243,238,236,57,37,75,53,3,34,82,186,73,2,0,0,0,1,52,106,188,37,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,104,113,191,229,226,233,182,152,191,218,155,160,200,179,224,228,228,170,216,190,223,217,164,198,205,160,170,234,191,155,179,227,226,229,225,235,154,78,77,78,76,75,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,81,89,93,91,86,78,77,78,77,77,77,78,78,78,72,71,114,237,243,250,243,225,106,52,46,36,44,39,39,41,35,57,81,80,67,35,44,36,95,146,72,41,87,168,167,179,173,170,174,170,169,171,173,169,168,188,234,230,165,50,32,39,73,219,226,232,228,222,222,222,222,225,231,224,232,235,222,231,246,237,236,241,73,167,73,212,55,137,61,106,47,166,79,229,240,243,242,242,242,242,242,242,242,242,242,242,242,242,239,230,67,27,7,6,3,6,98,139,122,30,2,0,0,0,1,25,118,178,32,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,100,108,110,214,230,222,227,225,227,225,223,229,229,232,222,232,231,225,232,225,230,235,230,222,228,228,222,222,226,222,227,227,227,228,226,232,226,142,82,82,72,77,74,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,81,79,82,83,76,79,78,77,77,77,78,78,78,79,77,139,239,235,239,242,247,116,54,55,38,39,35,40,41,33,41,41,39,81,39,31,51,114,155,68,45,113,171,172,172,169,170,170,171,171,170,171,172,168,204,228,218,147,41,40,43,77,216,226,223,222,221,223,222,234,238,239,228,228,229,238,241,243,238,242,241,114,24,29,240,170,192,63,106,42,32,63,241,243,239,241,242,242,242,242,242,242,242,242,242,242,242,240,239,32,3,30,31,9,38,133,141,50,6,0,0,0,0,3,8,101,196,33,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,97,107,108,218,229,226,230,228,230,232,227,228,226,229,224,225,224,223,227,224,225,224,229,230,226,229,227,229,231,227,230,228,230,227,230,225,217,184,111,105,72,77,73,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,79,86,87,84,81,77,77,78,77,77,77,78,78,78,77,85,169,247,245,240,241,243,111,49,72,52,40,37,54,65,43,43,36,42,88,60,33,75,183,147,49,43,109,173,167,168,174,172,174,174,172,173,173,175,166,211,239,224,154,38,39,43,107,220,222,223,225,223,220,232,240,238,244,232,227,246,243,238,235,240,243,245,153,141,80,241,156,52,126,112,79,143,111,240,242,241,241,242,242,242,242,242,242,242,242,242,242,242,240,240,96,23,32,60,13,61,171,99,10,0,0,0,0,0,1,5,118,151,17,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,106,107,198,229,230,224,230,233,230,231,228,227,225,232,227,227,224,229,227,227,229,226,229,229,225,225,229,225,228,231,225,227,227,228,231,231,209,182,154,78,77,76,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,82,84,77,76,78,76,78,77,77,77,78,78,78,80,82,131,237,239,243,241,239,111,51,65,50,35,37,63,82,36,37,30,46,102,67,44,122,227,114,38,45,113,143,171,174,171,172,175,170,171,172,168,172,183,220,239,228,155,49,35,64,183,221,224,226,224,224,227,237,238,241,240,238,237,246,243,240,238,243,239,242,192,84,115,235,75,153,175,114,117,90,150,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,246,236,230,64,46,146,112,136,173,93,12,2,0,0,0,0,3,18,124,71,7,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,102,174,225,233,224,230,180,200,209,173,178,180,188,182,157,135,154,190,193,207,173,160,223,168,138,180,193,231,160,227,225,227,223,231,236,234,229,180,85,76,79,77,78,77,77,78,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,78,79,79,78,78,77,77,77,78,78,78,73,75,112,246,239,240,244,241,150,63,48,35,36,37,63,74,37,39,49,107,146,80,64,209,234,131,60,72,110,108,149,166,167,172,171,156,140,156,157,168,206,236,233,236,140,66,37,88,221,229,224,224,226,225,233,238,237,241,235,240,241,244,243,241,241,243,237,241,226,46,155,235,78,122,96,115,158,53,180,241,242,242,241,242,239,240,240,240,243,241,241,242,242,242,243,239,243,163,100,221,242,204,177,125,29,4,1,1,0,0,2,22,107,24,2,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,96,149,227,232,224,229,125,137,144,118,105,108,122,122,71,79,113,139,139,137,126,75,192,74,61,85,114,178,88,219,230,220,182,209,226,232,227,208,123,82,92,83,74,81,75,76,76,77,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,80,80,80,79,78,77,77,77,78,78,78,77,74,115,239,237,240,242,238,214,96,60,37,40,35,55,57,34,50,82,190,121,54,78,233,230,210,159,155,146,100,97,119,155,174,155,115,85,106,117,174,220,234,220,228,110,49,38,125,208,226,220,223,223,230,241,241,237,222,207,232,241,236,242,243,242,239,240,240,238,113,204,242,160,94,180,158,203,118,213,240,242,240,240,240,241,237,241,236,241,239,243,242,242,242,241,243,243,226,201,237,240,223,188,157,29,1,1,2,1,1,5,39,49,6,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,106,102,123,235,223,230,227,161,43,47,148,104,88,105,117,90,186,208,149,129,84,187,77,152,112,161,113,36,54,101,167,236,204,159,161,189,219,224,229,203,169,171,85,75,76,73,76,78,80,80,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,80,80,80,79,78,77,77,77,78,78,78,76,73,115,236,235,240,239,241,243,188,95,46,41,40,54,59,47,85,138,141,65,38,84,211,230,226,224,215,164,63,48,62,97,112,102,66,51,53,69,194,229,230,224,180,70,38,47,146,189,227,222,225,230,234,241,243,228,190,176,198,212,214,240,244,248,239,240,242,239,218,237,244,235,215,239,227,231,216,236,241,241,240,241,234,233,222,240,240,240,235,244,242,242,242,239,239,240,237,234,241,244,236,220,164,27,2,0,1,2,0,12,60,25,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,102,107,103,92,219,227,229,229,197,73,84,177,101,84,95,112,67,95,146,153,36,44,205,67,127,156,215,202,49,95,99,109,229,212,156,137,154,185,226,223,228,229,194,97,73,74,78,76,77,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,80,80,80,79,78,77,77,77,78,78,78,81,77,117,242,241,242,240,243,244,222,122,48,38,40,52,57,76,186,156,46,41,57,122,183,198,218,229,224,177,59,39,47,49,49,50,37,38,41,55,204,230,231,231,110,43,37,62,159,177,237,240,233,243,235,239,239,204,171,172,176,185,188,226,239,240,243,238,242,241,242,243,243,239,243,245,244,240,236,241,231,225,232,228,221,225,223,224,229,244,238,240,242,242,242,240,237,241,241,242,241,243,242,244,182,35,25,10,1,3,0,20,93,81,58,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,102,107,109,102,180,230,229,231,215,71,94,210,97,108,90,117,71,103,154,158,83,97,148,76,128,161,221,210,60,99,134,80,188,232,182,186,163,159,176,207,228,232,213,103,79,82,79,78,77,75,76,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,80,80,80,79,78,77,77,77,78,78,78,78,75,119,232,235,238,237,242,210,181,126,54,76,58,45,50,132,223,90,37,49,96,183,166,182,218,225,227,182,52,35,32,33,40,37,38,36,51,106,219,222,241,218,68,38,56,94,173,185,229,245,240,250,238,237,222,176,167,169,174,173,168,206,204,194,207,214,240,241,243,237,239,239,239,243,237,242,241,235,225,222,223,225,228,232,233,227,222,229,239,242,242,242,242,242,244,240,241,245,240,236,242,244,226,144,119,54,6,3,0,20,150,206,142,24,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,107,131,218,234,227,220,77,86,223,82,114,91,104,90,192,211,150,139,134,120,79,158,107,160,111,91,66,198,86,164,210,120,134,194,127,161,143,234,225,220,122,80,72,73,87,83,76,71,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,80,80,80,79,78,77,77,77,78,78,78,81,73,89,118,108,108,101,118,167,165,148,83,135,89,33,47,217,161,58,57,101,208,214,175,186,232,225,217,185,51,37,33,37,42,37,42,45,77,202,226,233,236,165,42,45,63,152,176,187,235,233,215,221,193,177,179,170,168,175,172,173,164,178,170,167,176,200,239,239,243,243,238,238,239,243,244,241,238,229,231,233,229,232,229,227,226,228,230,225,225,244,242,242,242,244,245,237,238,240,236,237,237,242,249,230,235,149,16,1,0,16,139,208,133,44,27,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,108,104,101,192,225,226,221,107,98,230,90,129,114,108,69,19,72,145,18,27,180,82,217,61,27,182,138,71,225,87,134,212,124,91,146,167,155,155,232,225,223,200,108,92,77,97,94,83,74,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,80,80,80,80,79,78,77,77,77,78,78,78,78,71,78,77,74,74,65,92,164,173,168,166,171,153,106,118,222,85,47,100,237,248,196,179,193,230,230,229,188,58,38,37,63,57,34,51,78,206,235,245,234,249,98,45,34,79,170,169,211,247,151,79,143,167,171,170,173,171,172,171,172,169,170,167,166,171,215,235,241,244,240,242,241,243,240,247,236,234,227,227,228,228,228,227,220,221,225,226,228,241,242,242,242,242,241,240,242,243,240,241,242,241,237,227,241,249,201,24,0,1,16,83,62,62,22,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,102,107,101,98,150,228,223,227,211,209,227,193,206,203,197,179,180,190,209,178,186,225,199,228,207,194,225,213,200,222,97,84,191,130,86,127,194,234,238,232,230,234,232,222,137,110,122,115,111,83,78,76,76,78,77,77,77,76,78,78,78,78,78,78,78,77,77,78,78,78,79,79,80,80,80,79,79,78,78,77,77,77,78,78,78,76,75,76,70,71,72,62,79,152,171,170,173,179,201,214,222,224,94,85,160,235,239,200,175,210,219,222,226,208,86,37,43,97,116,49,86,174,249,236,246,238,238,75,44,44,73,157,169,200,227,127,54,133,176,174,175,173,174,169,168,171,160,162,171,169,174,206,216,242,241,244,244,245,243,239,235,225,221,225,227,226,227,228,229,228,228,229,230,220,228,228,243,241,241,241,238,243,241,240,244,244,243,239,239,246,239,214,27,0,2,44,42,3,1,10,13,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,106,110,206,228,225,231,232,228,230,228,228,226,225,227,225,227,228,228,228,229,230,228,228,226,226,227,227,136,91,107,106,77,153,202,240,241,238,230,229,234,229,226,205,168,139,149,88,83,73,74,79,73,78,74,76,78,78,78,78,78,78,78,77,77,78,78,78,79,79,80,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,72,70,64,72,152,173,174,172,178,196,233,229,227,156,145,200,237,227,186,198,218,223,227,225,228,151,47,46,137,173,99,153,242,244,240,240,239,238,115,43,45,63,109,168,175,183,114,53,137,177,169,171,172,172,172,174,165,109,140,164,167,173,169,177,236,242,243,240,239,232,231,225,224,228,226,228,228,228,228,230,230,228,227,227,225,223,223,239,239,238,244,242,242,242,241,243,241,244,241,240,245,244,211,44,0,6,33,13,0,0,8,34,12,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,115,176,234,228,223,224,228,227,227,226,226,229,230,230,230,226,226,227,227,228,228,226,228,227,219,209,197,114,139,107,89,152,219,240,241,242,242,241,236,231,228,237,214,166,103,81,97,84,76,78,76,83,73,84,78,78,78,78,78,78,78,77,77,78,78,78,79,79,80,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,75,76,69,74,155,175,172,172,182,206,232,225,238,189,200,198,233,233,216,222,229,228,228,230,245,198,70,65,174,140,196,155,232,242,240,245,244,237,192,69,41,45,116,173,170,173,126,74,139,174,170,172,172,172,172,173,161,127,140,155,160,170,167,172,212,243,239,241,242,219,226,222,224,227,227,228,228,228,227,225,228,227,228,227,229,226,224,222,237,237,241,242,242,242,242,240,239,240,242,242,244,242,226,76,1,17,33,8,1,0,1,23,22,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,103,157,207,232,226,224,224,230,231,229,227,226,226,226,227,229,229,229,229,229,229,228,223,228,165,158,176,132,131,92,161,194,239,242,242,242,242,240,239,216,220,241,239,172,85,90,94,83,74,75,89,92,79,79,78,78,78,78,78,78,78,77,77,78,78,78,79,79,80,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,75,70,72,98,164,175,171,171,175,197,239,235,245,240,227,191,220,232,225,226,235,229,230,237,243,222,161,161,206,183,181,152,217,240,240,243,238,245,235,113,61,51,123,172,168,175,153,121,150,174,171,170,172,172,172,168,168,141,136,156,159,165,164,166,187,243,239,243,232,222,230,225,226,227,228,228,228,228,228,226,226,227,230,227,234,228,227,226,233,239,244,242,242,242,242,240,237,238,240,241,244,241,226,75,1,37,51,18,1,0,0,9,26,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,101,104,138,151,203,226,229,225,226,227,227,226,225,226,222,225,227,227,227,226,226,225,225,224,225,167,120,144,91,94,115,220,238,245,241,241,240,240,241,242,173,178,231,241,156,73,81,80,76,80,100,96,114,89,78,78,78,78,78,78,78,78,77,77,78,78,79,79,80,80,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,73,70,84,134,177,171,171,85,66,106,164,101,181,243,128,178,105,194,119,107,216,157,211,219,147,236,151,217,233,233,206,173,197,238,242,247,239,233,205,157,131,125,156,175,168,175,171,163,169,174,171,170,172,172,172,170,170,157,153,167,162,164,162,165,182,236,238,240,232,225,228,231,227,228,227,228,228,228,228,230,228,230,231,227,230,224,231,226,229,244,240,242,242,242,242,241,240,243,240,238,239,242,232,75,7,40,29,7,2,0,1,1,16,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,102,111,113,115,172,230,234,228,228,228,229,229,228,229,224,226,229,229,229,230,231,229,230,233,229,221,139,100,86,72,141,232,244,240,236,239,240,240,240,242,194,96,202,217,130,84,76,75,76,89,163,159,188,80,80,78,78,78,78,78,78,78,77,77,78,78,79,80,80,80,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,73,83,107,165,179,169,172,45,83,127,79,104,83,233,51,158,54,144,66,85,142,109,200,210,76,189,93,228,244,241,246,218,195,235,243,248,237,205,170,166,167,176,173,171,170,172,173,176,178,174,172,171,172,172,172,168,169,172,169,175,169,167,163,166,190,222,241,240,245,223,224,230,228,229,227,228,228,228,229,232,227,230,230,227,227,222,239,237,240,244,241,242,242,242,242,241,243,234,237,242,237,241,236,86,15,21,5,0,1,0,1,0,24,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,106,106,106,121,158,224,225,226,230,229,228,227,227,227,225,226,232,232,232,231,230,228,227,226,188,229,198,134,86,87,173,238,240,238,236,239,240,242,242,232,204,99,141,162,141,96,76,79,80,92,207,226,215,89,79,78,78,78,78,78,78,78,77,77,78,78,79,80,80,80,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,73,88,110,147,177,171,167,58,153,190,78,216,68,232,49,97,123,103,140,189,91,107,155,206,61,33,66,233,243,244,241,242,206,232,242,243,226,185,174,167,168,175,169,169,174,173,172,174,176,172,170,171,172,172,172,172,169,173,171,168,166,166,166,175,216,229,234,240,242,222,224,227,227,228,229,228,228,228,228,227,221,219,221,223,226,223,240,237,235,238,242,242,242,242,239,244,247,238,237,242,241,242,217,50,49,47,20,5,0,0,2,1,49,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,102,122,141,163,241,244,239,238,237,236,237,242,241,244,239,237,237,237,237,239,237,233,233,134,233,241,226,113,146,231,248,241,240,245,243,240,239,240,239,240,225,139,139,135,96,94,78,74,85,181,169,113,93,78,78,78,78,78,78,78,78,77,77,78,78,79,80,80,81,80,80,79,79,78,78,78,78,78,78,78,78,77,77,77,76,75,79,94,110,166,170,170,36,53,124,79,227,72,234,15,13,122,87,169,219,82,92,20,69,101,137,117,242,237,235,241,230,203,233,244,246,228,181,176,174,173,173,174,177,176,168,170,164,168,168,172,173,172,172,172,174,166,171,167,163,162,164,168,190,240,250,239,244,240,231,230,227,227,226,233,228,228,228,228,227,242,242,243,232,231,231,238,242,245,239,236,242,242,242,239,245,234,245,249,243,245,242,198,26,94,83,12,0,2,0,0,1,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,106,103,106,104,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,112,148,132,183,240,240,242,242,242,242,242,242,242,242,242,242,242,242,244,239,240,234,239,180,229,233,244,247,241,239,243,239,234,239,244,240,240,236,240,242,242,242,168,223,220,110,92,74,83,91,112,74,74,81,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,75,80,68,82,85,67,70,69,82,114,169,48,97,172,78,232,81,220,45,126,44,92,149,201,84,105,193,90,103,93,149,241,239,237,229,217,201,231,241,244,236,185,180,163,172,169,168,169,161,173,170,175,173,173,172,174,174,172,172,167,168,168,167,170,168,165,165,204,240,246,239,239,246,242,226,223,233,226,228,228,215,216,234,243,242,241,242,244,238,240,245,232,241,237,240,240,237,247,247,238,242,239,245,242,249,242,160,55,76,46,0,0,0,0,7,3,43,27,0,0,0,0,0,0,0,0,2,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,106,102,104,105,104,104,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,106,103,129,130,231,243,241,241,242,242,242,242,242,242,242,242,242,242,242,242,236,225,147,234,237,242,238,239,244,239,241,242,241,239,239,236,238,248,241,241,242,242,242,205,159,178,160,129,121,95,89,95,81,80,76,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,77,73,81,72,71,61,74,56,57,99,153,50,126,189,82,235,75,223,51,136,44,120,76,110,99,99,150,79,147,54,183,243,236,225,202,197,220,241,242,240,242,218,202,165,171,180,189,195,188,196,175,172,172,173,173,168,167,168,168,172,169,173,172,167,175,174,178,219,242,240,234,235,239,240,237,233,242,226,221,234,250,251,241,242,242,242,241,244,245,240,236,237,242,237,245,238,240,239,239,240,242,240,234,234,240,229,175,148,83,15,0,0,0,0,0,4,64,39,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,106,103,105,104,105,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,109,119,192,242,245,240,240,242,242,242,242,242,242,242,242,242,242,242,242,243,222,137,202,229,246,243,241,238,236,242,240,243,244,227,192,196,239,239,240,242,242,242,240,219,202,206,217,233,146,92,104,87,77,77,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,73,79,82,76,71,86,92,120,116,101,166,57,50,114,110,238,115,236,53,40,94,171,59,54,170,126,65,104,209,88,210,244,215,200,211,234,243,242,242,240,247,241,228,189,192,210,228,234,228,227,189,173,172,172,173,170,170,171,171,174,167,172,173,181,206,210,211,235,244,236,234,238,238,237,242,242,234,219,228,242,215,222,242,242,242,242,241,241,245,243,239,246,241,235,242,242,240,239,242,240,242,244,243,246,246,216,161,122,46,4,0,0,0,0,1,1,79,37,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
135,109,105,107,103,105,102,104,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,109,103,111,220,243,240,240,242,242,242,242,242,242,242,242,242,242,242,242,234,239,192,110,140,173,242,238,241,238,238,242,242,241,240,200,107,124,216,236,241,242,242,242,243,244,240,240,239,244,233,173,126,93,76,80,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,72,84,109,88,77,84,160,221,198,76,65,105,195,221,211,240,215,248,165,150,176,176,166,167,200,208,202,225,230,203,236,228,201,217,234,241,242,242,242,241,247,244,243,224,228,237,246,247,241,232,181,169,172,172,173,174,175,173,172,171,170,167,180,215,234,244,238,242,244,238,241,243,244,240,245,242,234,230,241,241,155,163,242,242,242,242,241,240,244,245,242,245,240,238,242,242,236,244,245,243,247,246,245,242,239,188,129,53,9,1,0,0,0,0,4,12,106,41,0,0,0,0,0,0,0,0,6,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
136,113,108,107,106,104,104,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,104,105,93,211,238,235,241,241,242,242,242,242,242,242,242,242,242,242,242,239,246,206,100,123,148,239,234,242,241,240,240,239,243,237,169,87,106,214,239,241,242,242,242,240,237,236,239,243,236,239,235,204,127,75,75,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,77,86,162,166,109,82,194,248,222,82,40,91,217,238,234,240,243,251,188,173,175,174,176,177,197,220,217,219,218,222,236,205,216,239,242,239,242,242,243,244,242,239,247,241,242,243,243,245,244,238,186,171,172,172,173,171,170,171,171,168,176,170,201,237,244,248,242,243,242,241,247,244,247,243,248,242,242,241,240,242,177,101,211,242,242,242,241,242,244,244,239,239,240,238,244,238,242,247,239,241,246,245,240,243,224,108,106,20,3,3,0,0,0,0,1,39,170,48,0,0,0,0,0,0,0,1,21,30,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
139,115,109,110,112,108,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,98,111,70,200,238,237,242,240,242,242,242,242,242,242,242,242,242,242,242,242,235,222,106,128,158,243,232,241,241,241,239,238,241,238,151,97,93,203,244,242,242,242,242,244,236,233,244,230,179,211,234,231,140,74,75,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,79,78,151,224,129,76,169,242,167,81,39,54,141,209,244,237,241,238,173,174,170,172,173,171,198,227,217,219,222,229,229,206,237,240,242,243,242,241,244,243,240,238,246,245,244,241,238,239,240,240,195,175,173,173,173,167,169,180,185,177,177,189,226,240,242,243,239,243,240,242,247,245,247,241,246,243,241,244,244,239,229,89,142,241,242,242,243,243,242,243,242,241,245,235,241,237,246,243,237,243,248,234,238,237,185,101,75,5,5,4,0,0,0,0,22,102,202,45,0,0,0,0,0,0,0,0,16,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
136,112,108,110,102,113,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,102,70,190,242,242,246,237,242,242,242,242,242,242,242,242,242,242,242,244,236,238,197,146,162,240,241,242,239,240,238,239,240,237,183,89,88,193,238,242,242,242,242,243,242,243,241,165,186,158,116,145,110,75,82,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,79,78,78,78,78,78,78,78,78,76,76,155,229,128,65,128,235,116,55,42,46,72,108,176,241,235,225,160,176,172,170,169,166,192,219,223,226,220,226,206,225,243,240,242,246,242,242,241,243,241,246,245,240,243,244,243,242,242,247,217,187,174,173,173,169,179,203,214,198,178,215,247,243,240,240,242,246,241,243,247,244,245,238,241,246,243,243,244,238,245,98,96,241,242,241,243,245,243,243,244,240,248,239,240,241,240,240,245,245,221,139,122,119,95,99,33,1,2,2,0,0,0,0,93,208,219,44,0,0,0,0,0,0,0,0,3,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,107,106,107,109,99,116,105,102,106,103,105,101,103,103,108,107,106,107,106,106,106,106,106,106,106,106,110,157,152,222,242,242,243,240,242,242,242,242,242,242,242,242,239,241,243,247,242,242,241,201,211,235,241,248,236,242,246,242,249,249,208,87,92,176,232,248,247,242,239,242,244,243,237,213,227,216,142,98,86,76,79,78,78,78,78,78,78,78,78,78,78,79,79,80,81,81,81,80,79,78,77,78,78,78,78,78,78,78,79,81,131,222,142,76,124,237,100,48,42,39,41,43,140,181,119,111,96,136,167,139,178,173,204,224,232,226,222,222,202,236,243,242,242,243,243,243,242,243,242,244,243,242,243,243,243,243,243,244,239,230,221,200,171,175,216,234,238,231,225,236,244,243,242,242,243,243,242,243,243,243,243,241,242,244,243,242,243,245,236,100,140,242,242,242,243,243,243,242,243,242,244,242,242,243,242,242,239,217,131,89,47,30,39,51,8,0,0,0,1,3,6,50,193,248,186,38,0,10,35,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,106,100,71,102,115,105,106,103,106,105,102,102,103,103,105,106,106,106,106,106,106,105,107,135,133,216,242,242,242,242,242,242,242,242,242,242,242,242,241,240,239,239,234,236,240,242,247,245,234,238,229,235,234,230,243,233,191,90,87,109,174,225,241,241,238,242,243,243,241,240,240,247,203,96,83,75,76,78,78,78,78,78,78,78,78,78,78,79,79,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,73,80,94,171,154,112,138,208,69,48,42,39,34,36,100,124,117,40,44,80,81,84,156,224,219,231,223,221,222,201,213,245,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,243,227,203,199,234,242,242,238,238,241,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,243,242,141,189,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,236,177,57,52,13,4,13,16,0,0,0,0,3,4,20,171,241,236,171,33,0,10,36,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,104,105,110,112,114,101,101,108,109,112,105,98,109,100,99,105,106,106,106,106,106,106,105,107,95,101,179,242,242,242,242,242,242,242,242,242,242,242,241,241,240,238,238,237,245,246,237,241,242,240,240,241,242,245,249,202,110,111,98,76,78,94,144,231,235,241,239,238,241,245,245,245,228,101,87,79,76,78,78,78,78,78,78,78,78,78,78,78,79,79,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,78,72,76,102,131,139,230,128,62,47,41,40,37,42,96,39,34,56,41,37,38,36,118,231,232,228,223,211,193,199,242,246,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,246,248,246,238,231,247,245,242,241,241,243,244,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,241,242,249,182,221,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,182,31,21,0,0,0,0,0,0,0,0,7,13,80,224,244,238,149,9,2,4,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,105,104,104,103,106,110,117,107,132,118,108,103,113,106,106,107,105,106,106,106,106,106,106,105,103,83,94,173,242,242,242,242,242,242,242,242,242,242,242,241,241,242,241,238,243,239,201,174,230,245,243,234,240,242,238,217,131,81,83,77,76,73,74,98,190,240,243,242,237,237,242,250,242,201,84,78,75,77,80,78,78,78,78,78,78,78,78,78,78,79,79,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,83,76,71,82,131,156,200,76,52,47,41,40,38,49,124,67,36,130,65,32,32,38,127,224,227,227,220,193,207,227,246,245,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,241,241,245,243,243,248,242,242,243,243,243,245,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,243,248,222,238,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,210,29,4,1,2,0,1,1,0,0,0,0,24,200,244,245,241,122,28,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,105,105,105,106,104,103,105,107,102,111,105,115,106,102,108,107,106,106,106,106,106,106,106,105,104,87,63,195,242,242,242,242,242,242,242,242,242,242,242,241,242,246,244,239,239,232,139,111,223,251,240,242,245,232,195,135,90,75,76,77,76,75,78,87,148,245,240,241,244,246,247,239,237,212,94,76,75,77,76,78,78,78,78,78,78,78,78,78,78,79,79,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,78,78,76,81,93,189,211,83,51,45,40,40,42,53,160,67,46,214,137,38,47,41,123,220,224,238,205,218,236,241,240,240,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,240,239,241,240,241,243,239,242,243,244,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,241,244,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,245,229,29,2,0,1,3,1,0,0,0,0,3,43,220,242,237,186,59,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,104,106,104,104,102,102,102,104,105,104,110,125,120,71,107,105,106,106,106,106,106,106,106,105,106,92,66,202,242,242,242,242,242,242,242,242,242,242,242,240,240,244,236,235,241,238,176,98,190,240,238,241,240,194,106,89,76,72,78,78,76,77,82,82,137,245,238,237,241,242,241,229,239,234,92,76,76,77,77,78,78,78,78,78,78,78,78,78,78,79,79,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,75,70,76,77,107,155,208,96,51,44,40,41,33,49,66,52,72,221,219,63,66,38,69,156,184,235,195,234,241,241,239,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,241,240,240,242,243,243,243,242,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,240,244,240,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,245,227,32,1,0,0,2,0,0,0,0,0,6,77,222,240,208,70,12,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,105,106,104,103,105,107,106,108,111,134,151,108,83,89,106,106,106,106,106,106,106,105,106,77,70,179,242,242,242,242,242,242,242,242,242,242,242,240,238,237,216,219,234,238,229,168,182,239,238,238,249,181,88,77,76,74,78,79,77,77,76,81,143,244,239,244,239,205,159,169,204,204,88,77,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,78,71,76,82,95,113,115,67,52,44,40,41,49,62,43,45,128,222,227,60,57,36,62,146,168,199,165,237,242,242,242,245,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,243,246,244,243,244,241,242,242,242,241,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,240,245,239,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,236,235,62,6,0,1,3,0,0,0,0,0,0,39,209,238,151,41,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,106,107,106,106,105,106,107,103,97,103,108,140,196,113,98,107,106,105,105,106,108,107,107,107,135,134,205,242,242,242,242,242,242,242,242,242,242,242,243,241,238,184,143,147,174,245,231,234,245,241,241,243,146,80,77,75,77,79,77,77,77,73,82,148,236,245,245,242,168,82,80,135,165,82,78,78,78,78,78,78,78,78,79,76,78,77,78,77,78,81,80,81,82,81,80,79,78,77,78,78,78,78,78,78,78,79,76,78,80,77,84,80,64,53,44,38,44,85,110,59,48,188,227,224,77,46,39,50,98,143,168,158,235,243,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,242,242,242,242,241,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,239,245,239,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,236,246,110,22,18,30,12,2,25,36,32,0,0,19,215,236,127,34,2,4,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,107,106,107,110,106,104,122,174,197,236,185,110,110,95,105,108,101,101,104,104,104,209,214,228,242,242,242,242,242,242,242,242,242,242,242,246,233,244,199,118,107,158,238,239,242,242,242,239,237,141,76,77,74,76,76,75,76,77,75,75,120,220,241,237,247,172,78,74,102,159,73,78,78,78,78,78,78,78,76,77,81,73,78,78,80,80,80,80,81,82,81,81,79,78,78,78,78,78,78,78,78,78,77,77,77,76,72,75,79,70,53,44,38,50,108,166,114,84,217,229,227,142,48,38,32,59,105,117,167,241,243,243,241,241,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,248,183,126,128,127,62,45,104,145,41,5,4,19,192,195,175,42,6,3,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,104,107,105,91,107,116,156,234,232,234,233,186,127,103,118,109,103,105,106,105,135,232,238,240,242,242,242,242,242,242,242,242,242,242,242,242,229,231,233,208,199,216,243,241,242,242,242,234,244,164,82,79,75,76,75,76,75,77,75,77,97,212,243,238,248,182,81,83,82,101,80,78,78,78,78,78,78,78,77,74,82,77,93,80,77,82,77,80,81,82,81,81,79,78,78,78,78,78,78,78,78,78,77,77,77,76,73,72,71,69,53,45,39,53,117,175,164,142,212,224,238,199,56,44,59,92,179,189,164,167,241,242,242,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,244,229,220,225,201,198,217,178,23,2,2,22,153,185,125,53,13,34,3,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,107,105,104,104,109,105,188,217,223,220,219,228,194,91,87,128,104,124,184,217,212,237,230,246,242,242,242,242,242,242,242,242,242,242,242,240,187,151,172,223,244,244,244,234,242,242,242,238,242,217,116,81,73,82,81,77,77,75,78,75,83,191,233,246,245,174,71,75,72,72,78,78,78,78,78,78,78,78,79,75,89,101,151,92,78,80,76,80,81,82,81,81,79,78,78,78,78,78,78,78,78,78,77,77,77,76,75,70,64,62,51,44,42,50,137,172,169,170,203,221,232,162,49,47,122,187,152,136,124,186,242,243,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,244,248,239,242,240,245,247,249,173,13,12,48,16,95,225,223,150,54,115,9,2,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,105,105,107,107,101,100,178,225,229,227,226,228,223,205,120,148,200,200,230,229,224,234,238,238,242,242,242,242,242,242,242,242,242,242,242,235,168,183,120,129,200,229,239,240,242,242,242,239,245,245,164,82,75,77,78,76,77,78,87,80,80,153,232,230,234,123,74,73,73,83,70,78,78,78,78,78,78,78,78,80,114,152,210,126,80,81,78,80,81,82,81,81,79,78,78,78,78,78,78,78,78,78,77,77,77,76,74,68,62,60,51,44,44,51,156,176,167,173,202,227,227,68,39,45,149,220,217,221,221,200,233,243,242,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,240,245,244,240,249,246,241,246,238,192,60,65,154,61,119,240,239,242,238,183,45,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,107,105,105,105,106,114,118,203,230,231,233,231,229,237,214,224,229,224,231,225,230,233,236,241,242,242,242,242,242,242,242,242,242,242,242,239,235,166,144,144,143,186,238,243,242,242,242,241,235,234,219,132,91,77,73,75,76,85,100,93,96,145,194,175,183,97,71,88,126,88,81,78,78,78,78,78,78,78,78,100,180,211,227,171,91,79,82,80,81,82,81,81,79,78,78,78,78,78,78,78,78,78,77,77,77,76,72,70,65,58,50,45,42,54,135,166,169,169,214,238,220,57,32,39,157,227,224,218,213,203,218,241,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,244,245,242,238,241,249,245,241,233,188,194,213,120,216,243,245,237,236,237,146,72,56,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,106,105,106,107,108,106,101,132,193,201,223,221,229,223,228,232,228,229,235,229,226,229,231,240,242,242,242,242,242,242,242,242,242,242,242,241,235,233,149,200,155,141,217,240,242,242,242,242,240,239,237,215,147,97,81,75,75,92,127,116,111,92,97,98,96,78,87,134,184,104,93,78,78,78,78,78,78,78,79,127,220,227,227,202,113,76,80,80,81,82,81,81,79,78,78,78,78,78,78,78,78,78,77,77,77,76,73,72,69,55,50,44,38,48,63,134,170,169,225,233,229,104,43,52,169,227,223,224,225,214,216,242,241,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,243,239,239,236,244,245,238,242,236,249,222,146,221,237,241,242,246,236,236,200,146,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,106,107,107,107,106,106,107,107,105,102,101,105,105,129,185,212,228,224,225,230,227,228,224,227,228,227,224,232,241,243,241,241,242,242,242,241,241,242,245,240,242,241,233,245,224,170,222,242,242,241,241,243,242,242,242,248,217,149,101,80,81,104,146,155,143,79,72,76,77,73,109,211,134,153,124,75,77,78,77,77,77,77,80,158,225,225,226,218,144,84,78,81,80,80,82,80,76,76,77,78,77,79,84,85,81,77,77,77,76,76,73,72,68,57,51,43,38,40,45,86,146,179,219,226,232,177,70,49,139,217,222,225,223,202,216,240,244,227,240,242,242,243,243,240,243,244,242,242,242,242,243,243,243,242,241,244,246,242,243,239,240,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,240,241,242,243,245,241,244,241,243,242,245,245,245,244,239,244,240,244,249,242,241,246,197,22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,
132,105,106,107,107,107,107,107,107,106,106,108,108,105,104,107,121,124,122,214,222,227,228,227,228,228,227,225,231,226,229,243,241,240,241,242,242,242,241,242,242,247,229,231,233,239,247,239,237,243,241,240,244,239,239,239,241,241,241,237,231,159,97,95,111,170,170,111,80,79,85,87,83,144,232,181,221,155,74,79,76,76,76,77,77,80,153,226,226,224,227,198,108,79,83,83,78,83,79,75,75,75,80,74,97,150,145,105,84,77,77,76,75,74,69,64,58,50,44,42,39,38,65,124,163,199,224,230,229,151,50,78,176,223,221,217,199,229,231,177,129,221,245,241,245,241,238,244,244,243,243,242,241,243,243,243,242,240,243,246,239,239,238,242,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,247,245,240,243,244,215,27,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,107,107,106,106,108,108,105,104,105,157,180,108,209,233,236,225,228,228,228,227,226,230,229,220,236,235,242,241,242,242,242,240,243,240,235,178,168,168,217,235,236,240,241,241,237,240,243,243,241,241,242,239,237,244,223,184,166,115,190,154,105,77,81,107,119,135,177,172,235,219,129,81,84,77,74,77,77,77,77,108,220,220,226,221,220,155,82,82,87,82,84,82,80,78,76,81,64,133,218,224,185,126,80,77,76,75,74,69,64,58,50,44,42,39,38,55,116,129,173,213,232,231,212,72,43,95,219,221,205,215,242,173,78,71,143,220,239,238,238,242,241,241,244,244,244,244,243,243,243,243,242,240,239,240,237,243,247,244,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,238,231,173,234,243,224,30,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,107,107,106,106,107,107,105,105,102,138,205,203,221,227,225,232,228,228,228,228,228,230,227,229,223,234,244,241,242,242,242,241,244,239,232,143,90,113,146,200,236,243,240,246,238,242,249,238,242,242,239,239,247,244,233,232,149,94,128,98,76,73,83,104,114,124,197,124,230,184,136,91,93,80,81,78,78,78,78,139,220,221,224,220,231,193,105,96,92,85,80,79,80,79,75,78,73,134,175,205,228,182,80,77,76,75,74,69,64,58,50,44,42,39,37,48,67,81,157,213,232,234,221,103,40,75,212,222,197,229,240,122,48,54,83,213,242,245,246,243,237,238,242,239,239,245,243,243,243,243,242,240,244,246,240,237,240,240,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,239,133,60,171,234,114,25,8,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,107,107,106,106,106,106,105,105,107,112,151,194,133,170,228,228,227,228,228,228,228,226,228,231,226,228,245,237,242,242,242,240,243,242,235,146,93,99,115,137,224,247,238,242,240,240,234,239,240,240,240,242,241,241,243,229,125,168,133,100,88,81,77,86,84,92,166,162,146,179,148,129,146,81,83,77,77,78,86,180,232,217,223,221,229,219,169,134,108,99,84,72,79,79,74,75,89,101,106,113,117,127,76,77,76,75,74,69,64,58,50,44,42,39,38,38,44,55,126,200,228,225,232,158,76,94,215,221,197,239,183,78,69,82,86,115,209,236,245,245,244,240,245,242,234,241,243,243,243,247,241,239,245,208,241,239,238,244,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,240,189,46,11,135,171,23,40,10,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,107,107,106,106,105,105,105,105,107,101,113,122,109,126,227,228,227,228,228,227,228,226,233,231,229,226,236,238,242,242,242,241,241,243,245,209,132,112,91,130,230,244,233,216,242,187,151,236,241,237,238,242,235,231,220,237,230,234,176,148,104,94,83,75,73,80,133,128,91,201,199,222,200,80,80,77,77,79,83,177,223,220,221,223,229,223,217,201,200,152,86,80,78,83,78,75,84,81,72,83,81,92,77,77,76,75,74,69,64,58,50,44,42,39,37,36,36,41,101,188,216,229,223,218,195,205,218,216,205,220,106,103,194,210,129,57,106,204,201,243,252,243,251,250,239,239,243,243,243,245,242,243,212,135,201,245,233,246,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,181,64,14,6,130,67,5,40,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,107,107,106,106,105,104,105,106,107,101,109,111,110,130,227,225,228,228,228,227,228,227,226,227,230,230,224,244,242,242,242,242,242,239,244,237,239,243,234,230,240,247,185,110,187,159,92,191,231,231,224,216,218,183,131,221,242,239,154,150,222,178,89,82,83,88,144,157,187,242,242,218,122,93,73,77,78,78,81,171,212,223,220,222,225,218,227,223,229,205,135,97,80,85,77,79,74,78,78,78,73,80,77,77,76,75,74,69,64,58,50,44,42,39,39,36,40,59,70,148,201,229,226,220,234,220,223,212,224,225,175,225,242,233,168,41,98,147,162,205,245,225,228,248,242,243,243,243,243,244,240,240,220,118,105,205,171,241,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,77,10,1,12,64,18,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,106,107,107,107,107,107,107,106,106,104,104,105,106,102,104,104,99,109,154,210,214,228,227,228,228,224,230,228,225,227,228,226,228,243,236,222,229,243,235,242,233,236,232,235,236,243,225,154,96,114,97,81,119,133,134,146,150,152,131,176,158,244,193,147,93,166,231,114,68,83,93,40,67,241,241,226,127,82,78,82,78,78,77,79,90,182,213,227,222,221,225,227,216,220,236,201,125,107,99,82,78,81,76,79,79,75,73,76,77,76,75,74,69,64,58,50,44,42,39,35,38,42,40,104,92,157,195,227,233,221,218,226,206,226,239,247,241,210,104,58,43,97,148,171,144,205,176,166,214,225,229,242,244,244,231,214,239,238,112,86,113,105,244,243,242,242,243,243,243,243,243,243,243,243,242,243,243,243,243,242,242,242,242,242,241,241,242,243,241,242,243,243,242,243,243,244,242,244,243,242,242,243,244,242,242,242,243,244,242,242,243,244,243,237,225,234,243,243,241,242,242,67,1,3,5,42,6,5,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,109,103,104,145,213,223,229,228,222,230,229,232,226,225,229,232,225,183,115,142,211,208,225,234,241,232,201,215,199,115,95,91,112,144,134,146,167,152,177,181,187,121,151,164,232,132,127,86,95,185,119,75,79,81,77,194,247,238,205,115,74,82,78,78,78,78,77,83,108,201,221,224,224,224,224,224,224,224,225,208,185,165,127,111,80,81,77,77,77,76,76,77,76,75,73,68,64,58,49,45,41,39,38,38,38,38,48,59,97,162,204,197,196,210,220,216,229,216,203,160,73,50,36,46,62,60,79,78,66,59,63,60,115,126,237,221,205,162,99,248,186,57,68,44,175,242,246,240,241,243,243,243,243,243,243,243,243,237,245,242,246,247,242,241,241,241,243,239,238,240,243,236,238,246,246,242,243,244,246,238,249,244,239,240,247,250,241,241,241,246,246,207,190,197,204,205,187,126,175,229,224,192,195,191,46,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,105,106,100,117,150,184,207,226,227,225,229,200,206,194,179,178,141,108,113,103,107,121,169,184,182,168,122,136,100,96,92,98,152,189,209,211,155,164,208,153,158,128,135,146,212,129,101,81,86,121,111,85,91,89,157,234,239,238,242,87,75,81,78,78,78,78,78,87,101,165,220,224,224,224,224,224,224,224,224,223,223,222,193,145,102,78,75,77,78,76,77,77,76,75,73,68,64,58,49,45,41,39,38,38,38,38,40,48,69,118,142,162,169,184,207,177,180,130,70,60,41,39,36,38,42,39,46,43,39,41,41,39,103,110,176,114,59,124,163,243,127,84,99,108,230,235,238,248,241,241,243,243,243,243,243,243,243,241,240,240,244,245,242,242,245,242,246,248,247,239,240,244,244,242,245,245,236,241,238,240,241,241,238,237,242,246,240,242,244,236,205,96,30,39,46,75,96,89,95,132,126,41,38,42,18,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,104,104,97,108,113,111,153,177,216,212,176,143,148,127,104,98,108,103,104,108,106,106,109,114,114,112,94,107,96,89,83,91,125,129,173,242,239,228,230,122,90,96,95,120,221,115,77,82,107,133,155,161,159,118,220,240,249,219,178,97,74,80,78,78,78,78,80,85,61,134,224,224,224,224,224,224,224,224,225,221,227,232,175,112,143,89,78,73,74,76,77,77,76,75,73,68,64,58,50,45,41,39,38,38,38,38,37,36,51,63,74,108,134,117,136,122,67,52,44,42,37,41,37,36,35,34,41,40,35,49,51,40,76,61,63,54,46,146,236,221,98,174,219,209,238,194,199,246,245,241,243,243,243,243,243,243,243,247,245,244,244,241,240,240,239,240,236,248,248,248,230,240,229,210,230,240,241,248,242,246,238,248,252,242,232,162,160,224,218,161,124,55,4,3,6,27,28,24,17,24,27,6,2,8,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,101,108,105,109,103,109,107,113,149,142,121,106,111,107,106,103,105,103,102,112,105,103,102,104,108,108,95,96,100,92,91,91,84,149,202,237,234,239,233,118,81,77,89,117,183,134,79,83,111,199,190,231,237,197,238,241,230,147,95,88,75,78,78,78,78,78,79,90,92,137,226,224,224,224,224,224,224,224,226,224,226,227,198,157,136,140,93,75,73,76,77,77,76,75,73,68,64,58,50,46,42,39,38,38,38,38,36,37,38,39,43,59,81,55,68,73,44,30,35,36,33,37,37,38,37,37,35,36,57,74,65,41,55,38,41,46,61,198,235,136,69,159,162,237,221,132,175,242,246,243,243,243,243,243,243,243,243,245,244,243,245,239,247,241,241,245,235,247,240,244,235,171,117,104,133,139,144,219,242,240,223,235,215,148,133,44,37,120,104,43,51,35,2,1,0,4,4,3,1,1,7,3,4,3,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,103,106,104,104,106,101,99,109,111,102,114,102,104,107,106,103,106,103,102,105,108,106,103,103,105,105,100,94,110,188,134,96,112,210,246,239,207,166,200,124,81,80,120,137,132,121,87,87,138,225,161,222,246,205,178,219,165,98,80,80,73,77,76,78,78,78,79,90,126,181,228,224,224,224,224,224,224,224,223,224,226,227,227,224,179,102,66,78,75,76,78,77,76,75,73,68,64,58,50,46,42,40,38,38,38,38,38,40,37,36,41,49,50,42,43,51,34,34,32,36,37,39,37,39,41,41,33,58,156,126,53,38,39,36,40,39,63,189,222,112,65,130,99,177,152,124,204,243,241,243,243,243,243,243,243,243,243,236,240,244,241,246,244,236,247,242,230,249,241,238,209,70,25,31,25,25,36,147,228,201,125,119,98,32,20,9,7,23,16,7,16,12,1,1,0,0,1,5,3,2,8,0,0,4,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,104,103,102,98,103,99,107,102,109,105,105,108,99,105,108,107,102,105,104,99,107,108,111,108,102,103,102,94,111,144,208,132,113,170,212,146,114,104,176,148,90,89,138,192,130,149,101,97,129,214,150,184,231,161,150,127,110,87,80,78,74,75,78,78,78,78,78,93,164,217,227,224,224,224,224,224,224,224,220,217,220,225,228,218,174,61,87,84,75,75,77,77,76,75,73,68,64,58,50,46,42,40,38,38,38,38,38,41,38,38,38,37,35,35,32,37,37,43,41,42,37,38,37,39,42,41,41,66,211,153,47,32,39,41,32,35,43,133,103,80,65,139,62,140,132,184,240,243,238,243,243,243,243,243,243,243,243,206,228,243,232,236,250,235,225,192,182,238,235,220,92,27,5,11,1,1,21,99,92,79,45,15,15,3,0,2,1,1,5,2,2,2,0,0,3,3,0,1,3,5,2,0,1,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,105,108,107,104,110,109,105,102,102,103,105,110,105,102,101,102,105,108,106,100,103,101,102,105,107,104,106,89,98,130,214,156,102,81,100,87,149,178,96,73,102,172,187,134,170,125,157,118,134,108,101,160,102,138,96,92,73,75,76,76,75,77,78,78,78,77,81,186,231,226,224,224,224,224,224,224,224,226,228,222,218,219,228,160,149,121,95,76,76,76,77,76,75,73,68,64,58,50,46,42,40,38,38,38,38,37,34,37,41,39,35,38,39,41,35,39,36,37,36,39,37,38,36,35,31,41,49,205,156,45,38,39,39,41,39,39,61,42,64,71,70,65,126,222,243,245,242,245,244,243,243,243,243,243,243,243,111,125,179,152,105,210,166,91,83,81,156,144,83,36,8,10,7,5,31,49,54,22,9,6,2,1,2,1,2,0,0,4,2,2,2,1,0,0,0,2,0,0,0,2,2,4,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,106,106,106,105,105,105,105,106,105,105,105,105,105,106,106,105,105,105,105,105,104,101,100,94,87,101,192,148,104,98,81,79,166,160,100,72,97,92,95,105,187,179,126,138,216,177,148,199,209,168,114,78,69,83,81,75,77,77,76,78,76,79,84,178,217,224,224,224,224,224,224,224,224,224,224,223,223,225,219,188,144,135,71,88,77,77,76,75,73,72,69,65,60,52,47,43,40,36,37,36,35,38,35,52,40,38,32,42,39,38,37,38,37,37,37,38,37,38,37,37,36,41,46,132,174,49,39,42,37,39,40,36,51,51,40,45,52,45,53,48,82,192,241,237,240,241,248,235,246,245,244,242,207,130,78,49,45,74,69,42,38,41,50,45,23,15,11,26,14,15,62,57,35,6,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,100,93,87,96,112,94,76,82,79,88,104,103,80,90,84,78,73,99,131,192,125,163,155,132,114,128,126,122,120,76,78,71,71,76,75,77,78,80,78,73,92,188,219,224,224,224,224,224,224,224,224,224,224,224,224,228,228,224,213,207,118,82,84,73,76,75,73,72,70,65,60,52,47,44,40,38,40,41,39,38,37,45,39,38,31,39,37,38,38,38,38,38,38,38,38,38,38,38,37,41,39,82,178,112,49,46,33,31,36,39,40,41,36,39,43,48,47,59,82,181,239,240,247,240,241,246,234,240,244,239,249,180,59,57,37,44,43,36,36,35,35,30,20,18,22,37,80,52,160,55,36,59,41,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,99,94,90,90,86,77,78,78,61,85,141,150,121,127,93,78,82,90,107,140,97,141,142,201,147,158,171,185,107,82,77,78,80,76,79,83,80,81,80,84,115,215,223,220,224,224,224,224,224,224,224,224,224,224,224,224,224,223,226,221,167,106,71,76,76,75,73,72,70,65,60,52,47,44,41,38,38,38,43,37,39,37,43,38,40,37,35,38,38,38,38,38,38,38,38,38,38,38,37,39,36,46,120,190,103,70,54,42,34,41,37,35,34,37,41,51,47,38,52,69,167,208,209,200,229,243,247,238,238,247,223,193,72,41,36,37,37,36,35,33,33,29,19,22,38,72,164,127,37,32,23,38,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,98,93,93,85,84,75,84,81,90,146,113,112,155,156,94,87,88,80,92,90,83,129,132,145,163,174,131,128,132,122,78,70,76,72,85,105,126,131,136,142,162,225,224,225,224,224,224,224,224,224,224,224,224,224,224,222,222,220,220,217,139,161,88,75,76,75,73,72,70,65,60,52,48,44,41,41,37,38,37,48,47,36,36,40,45,38,34,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,49,66,107,103,90,65,34,41,40,36,37,41,48,54,46,34,42,41,64,72,60,69,164,237,221,184,159,185,145,61,48,38,38,35,36,38,35,33,32,28,20,18,28,36,38,36,15,3,1,0,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,98,93,93,83,78,79,83,86,76,99,79,74,106,133,86,75,91,84,87,89,72,81,92,86,97,116,115,93,135,178,62,82,75,72,83,90,135,187,213,215,214,231,223,223,224,224,224,224,224,224,224,224,224,224,224,225,225,227,225,218,145,134,95,76,76,75,73,72,70,65,60,52,48,44,41,41,37,38,44,82,69,43,43,49,49,42,35,38,38,38,38,38,38,38,38,38,38,38,39,38,38,40,39,39,51,59,80,63,34,38,37,38,39,46,54,41,40,35,49,36,37,57,45,42,72,156,119,62,56,60,53,40,38,36,42,38,38,42,36,33,29,26,21,14,12,12,7,7,4,3,1,2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,98,97,90,85,84,84,78,81,80,87,86,78,90,93,75,86,79,76,86,101,67,81,88,81,71,159,133,85,199,215,145,102,96,80,82,90,120,184,221,225,226,226,220,223,224,224,224,224,224,224,224,224,224,224,224,223,219,225,225,226,165,131,110,79,76,75,73,72,70,65,60,53,48,45,41,41,40,55,62,124,114,63,67,61,52,48,41,38,38,38,38,38,38,38,38,38,38,38,39,38,38,42,41,36,42,37,49,43,37,36,35,38,38,42,48,38,37,39,45,41,38,45,49,50,66,64,53,43,35,37,37,38,41,34,40,40,41,40,37,35,31,27,22,14,7,6,4,2,5,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,99,96,90,88,85,80,74,78,76,79,78,74,81,84,82,87,79,77,91,108,80,86,90,73,87,172,149,88,133,151,235,182,178,102,96,146,144,146,173,215,222,221,219,220,224,224,224,224,224,224,224,224,224,224,224,222,222,222,222,230,182,147,100,82,76,75,73,72,70,65,60,53,48,45,41,41,51,70,100,152,150,95,127,100,53,57,43,38,38,38,38,38,38,38,38,38,38,38,37,36,36,35,34,35,34,41,36,39,41,38,38,35,33,36,39,38,35,46,55,59,64,57,54,71,74,54,40,34,35,38,39,40,37,36,35,38,38,36,39,36,31,28,22,14,10,9,4,6,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,
132,105,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,102,100,95,92,89,84,80,77,77,76,78,77,77,78,77,81,79,78,78,83,85,80,85,90,81,114,213,216,172,136,117,156,199,233,182,124,114,150,200,173,187,224,220,224,227,228,223,227,227,226,221,221,219,217,217,218,223,226,225,226,231,214,181,108,79,77,72,72,70,69,65,60,54,49,45,42,41,56,52,72,82,92,71,105,99,66,58,40,57,41,37,39,39,37,39,48,67,53,37,49,50,33,44,37,40,34,37,36,37,42,50,40,38,39,36,32,37,35,56,114,129,120,84,50,51,48,42,38,36,36,38,38,39,37,38,37,37,37,37,38,35,31,27,21,14,10,8,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,1,49,
132,105,107,107,108,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,100,96,92,89,84,81,79,77,77,78,78,78,78,78,78,78,78,78,78,78,75,84,88,85,96,161,183,126,136,77,100,94,112,190,228,221,190,152,128,124,129,182,217,223,222,217,218,225,226,223,224,229,229,228,230,229,224,222,224,221,221,211,165,97,86,84,73,71,69,64,60,54,49,45,42,40,54,53,50,53,58,60,72,73,62,53,41,57,39,37,39,39,35,39,59,93,74,54,72,64,48,54,52,53,39,36,37,36,41,48,44,41,38,36,38,48,48,65,100,90,73,60,44,42,39,40,38,38,38,38,38,38,38,38,38,38,38,38,37,35,31,27,20,15,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,1,49,
132,105,107,107,108,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,100,96,93,89,84,81,79,77,77,78,78,78,78,78,78,78,78,78,78,78,75,80,84,81,77,98,101,61,120,162,198,191,153,187,228,233,233,229,157,210,217,134,141,201,206,190,196,206,204,210,228,228,222,221,223,218,217,213,213,156,108,114,110,93,72,76,77,73,69,64,60,54,49,46,42,35,40,46,36,39,42,46,47,43,43,41,39,45,38,37,39,38,34,39,54,74,59,46,66,56,50,63,64,57,41,36,37,38,39,38,47,42,37,37,43,50,50,61,70,50,34,35,38,40,39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,35,31,27,20,15,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,2,50,
132,105,107,107,108,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,100,96,93,89,84,81,79,78,77,78,78,78,78,78,78,78,78,78,78,78,75,78,79,77,74,76,75,71,91,93,91,97,114,176,153,108,184,177,144,73,88,91,100,100,99,97,99,94,90,106,167,202,209,207,210,198,206,236,202,113,84,96,83,95,98,90,78,71,69,64,60,54,49,46,43,39,38,37,34,37,37,35,38,35,36,36,38,37,36,36,38,38,37,38,41,39,35,32,40,43,38,50,46,45,38,36,37,38,38,34,41,39,38,38,38,38,34,41,39,40,42,38,37,36,38,38,37,38,38,38,38,38,38,38,38,38,38,38,37,35,31,27,20,15,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,2,50,
132,105,107,107,108,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,96,93,89,85,82,80,78,78,78,78,78,78,78,78,78,78,78,78,78,76,77,77,76,77,76,74,81,72,79,82,77,87,100,84,84,94,95,87,90,92,80,71,78,74,71,75,80,84,78,86,91,91,89,91,95,151,187,147,105,94,90,85,85,87,77,71,71,69,64,60,54,49,46,43,41,44,40,39,41,37,38,37,38,37,38,37,36,36,35,38,38,38,37,37,37,38,39,39,37,31,42,36,36,36,37,38,38,36,37,36,37,38,38,36,35,32,33,32,35,35,37,37,36,38,37,37,38,38,38,38,38,38,38,38,38,38,37,36,34,30,26,20,15,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,2,50,
132,105,107,107,108,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,97,93,90,85,82,80,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,76,76,75,72,75,81,75,78,80,82,71,79,77,69,76,74,78,80,81,81,77,73,74,75,75,78,80,76,81,81,80,79,80,79,89,97,92,79,73,71,72,77,75,75,71,71,69,64,60,54,49,47,43,42,42,42,42,40,39,38,37,41,40,40,37,38,37,36,36,37,37,37,37,36,38,37,38,39,37,43,36,33,35,37,38,37,37,40,36,36,36,38,38,39,38,36,38,38,37,41,38,36,37,37,37,38,38,38,38,38,38,38,38,38,38,37,36,34,30,26,20,15,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,1,50,
132,105,107,107,108,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,97,93,90,85,82,80,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,76,77,78,79,77,76,79,75,75,80,77,76,75,80,77,77,81,78,73,77,79,77,77,79,77,77,76,74,75,76,78,78,77,76,78,77,74,74,74,76,76,76,75,74,74,71,69,64,60,54,49,47,44,42,39,42,43,39,42,37,40,40,39,38,38,39,38,37,35,37,37,37,36,37,39,39,36,41,38,41,36,38,38,37,37,38,38,40,39,37,36,39,39,39,40,38,39,40,39,37,36,36,36,37,37,38,38,38,38,38,38,38,38,38,38,37,36,34,30,26,20,15,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,1,49,
132,105,107,107,108,108,108,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,104,103,101,98,94,90,86,83,81,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,78,80,78,76,78,76,77,79,79,76,76,80,80,75,74,77,76,75,76,77,77,77,77,76,76,78,77,78,77,78,77,78,77,76,77,76,78,77,78,76,77,74,73,70,67,64,60,54,49,47,43,41,40,40,41,40,40,38,40,38,37,36,37,38,38,37,36,37,38,37,37,38,40,40,36,38,36,38,37,40,39,38,37,38,38,38,39,37,37,39,38,38,38,38,37,37,37,35,36,37,37,37,37,38,38,38,37,37,37,37,38,38,38,37,36,34,30,26,20,15,10,7,5,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,1,50,
132,105,107,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,98,94,90,87,84,81,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,72,70,67,64,61,54,49,46,43,42,42,41,41,41,41,40,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,38,38,38,38,36,34,30,26,21,15,10,7,6,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,2,2,2,3,1,50,
132,105,107,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,98,95,90,87,84,82,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,72,70,67,64,61,54,49,46,43,42,42,41,41,41,41,40,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,34,30,26,21,15,10,7,6,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,2,2,2,3,2,50,
132,105,107,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,99,95,90,87,85,82,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,72,70,67,64,61,54,49,46,43,42,42,41,41,41,41,40,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,34,30,26,20,15,10,7,6,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,2,2,2,3,2,50,
132,105,107,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,99,95,90,88,85,82,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,72,70,67,64,61,54,49,46,43,42,42,41,41,41,41,40,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,34,30,26,20,14,10,7,6,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,2,2,3,3,3,50,
132,105,107,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,99,95,91,88,85,82,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,72,70,67,64,61,54,49,47,43,42,42,41,41,41,41,40,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,34,30,26,20,14,9,6,6,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,50,
132,105,107,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,101,99,95,91,88,85,82,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,76,75,73,72,70,67,64,61,55,50,47,44,42,42,41,41,41,41,40,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,34,30,26,20,14,9,6,6,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,4,2,50,
132,107,108,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104,102,99,95,91,88,85,82,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,78,78,78,78,78,78,78,78,77,77,77,78,78,78,78,77,76,74,72,70,67,65,62,55,51,48,45,41,41,40,40,40,40,39,39,38,38,38,38,39,39,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,38,38,38,38,39,39,40,40,40,39,39,38,38,38,38,38,38,38,38,38,39,39,38,37,37,37,37,36,33,29,24,19,14,9,6,6,4,2,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,2,2,3,4,2,50,
132,108,108,108,107,106,106,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,107,107,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,103,99,96,93,91,88,84,81,79,77,77,77,76,76,76,76,76,76,76,76,78,79,79,79,79,79,79,79,77,77,77,77,77,77,78,78,77,77,77,77,77,76,76,76,75,75,75,75,76,76,76,76,77,77,77,76,75,75,75,76,77,77,77,77,75,74,72,70,68,65,61,54,51,47,44,41,41,40,40,41,41,41,41,39,40,40,40,42,41,39,38,39,39,38,38,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,39,40,40,40,38,38,40,41,41,41,38,37,39,40,40,39,39,40,40,40,40,41,41,41,39,39,38,37,36,32,29,24,19,15,11,7,7,6,4,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,2,3,2,2,2,4,3,50,
132,105,106,109,109,108,108,107,107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,103,99,96,94,92,92,88,85,80,77,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,77,77,78,77,76,76,76,76,76,76,76,75,74,74,74,75,76,76,76,75,75,75,75,75,75,75,75,75,75,75,75,75,73,71,70,68,67,63,60,55,51,47,44,43,43,43,43,42,42,42,42,42,43,43,43,42,41,39,39,40,40,40,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,40,40,40,40,40,41,43,44,43,41,40,40,40,39,39,40,40,40,40,41,41,41,41,40,40,40,39,37,34,31,26,17,14,10,8,8,6,5,2,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,2,2,2,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,3,50,
135,106,108,110,106,106,105,103,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,101,97,94,92,90,88,85,82,80,81,80,80,80,79,79,79,79,78,78,78,77,77,77,77,77,77,77,77,79,79,79,79,79,79,80,80,79,79,79,79,80,79,79,79,78,78,78,78,79,79,79,78,77,77,77,78,79,79,79,78,77,77,77,76,75,74,73,71,69,66,63,57,53,49,47,42,41,41,40,37,37,37,37,40,40,41,41,43,42,40,38,36,35,35,35,35,35,35,35,34,34,34,35,35,35,35,35,34,34,34,35,36,36,36,40,43,45,47,47,46,44,42,38,37,37,36,36,36,36,36,37,37,37,37,36,35,35,35,34,31,27,23,18,14,11,8,9,7,5,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,50,
136,107,106,114,112,111,111,108,107,107,107,106,106,106,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,105,102,100,97,95,91,87,84,81,80,80,80,79,78,78,78,79,79,79,79,77,77,77,77,77,77,77,77,80,80,80,80,79,79,79,80,79,79,79,79,79,78,78,78,79,79,79,79,78,78,78,78,77,77,77,78,78,78,78,77,77,77,77,76,75,74,72,72,71,68,64,56,52,47,45,44,44,43,43,41,40,40,40,43,43,44,43,40,40,38,37,38,38,38,37,36,36,36,36,37,37,37,38,38,38,38,38,37,37,37,38,39,40,40,41,42,45,47,47,46,43,40,40,40,39,39,40,40,40,40,40,40,40,40,38,38,38,38,35,32,28,24,20,16,13,9,9,8,6,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,4,4,3,3,2,54,
132,104,106,107,108,108,107,106,105,105,105,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,102,100,98,96,93,89,85,81,82,82,82,82,80,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,78,78,78,78,79,79,79,80,81,81,81,81,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,76,76,76,73,69,64,57,52,47,43,43,43,43,42,41,41,41,41,43,43,43,44,42,41,39,38,39,39,39,38,39,39,39,39,40,40,40,40,40,40,40,39,38,38,38,38,40,40,40,41,43,46,49,50,49,45,43,40,40,39,39,40,40,40,40,40,40,40,40,39,39,39,38,38,35,32,25,15,12,7,5,6,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,1,1,0,59,
175,164,163,159,159,159,159,159,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,153,153,152,150,148,147,142,140,140,140,138,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,140,140,140,138,138,136,136,136,136,136,136,136,136,136,136,136,138,138,138,138,138,138,138,138,138,138,138,138,138,136,136,136,135,133,130,126,123,119,117,116,115,115,115,114,114,114,114,115,115,116,117,119,119,117,117,113,113,112,112,111,111,111,112,113,113,113,113,113,113,113,113,112,112,112,113,113,113,114,117,119,121,121,121,121,121,119,115,114,114,114,113,113,113,113,113,113,113,113,113,113,112,112,111,109,108,104,98,97,95,93,93,92,92,91,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,89,89,89,89,89,89,89,89,90,90,90,91,91,90,89,90,91,126,
};
GLubyte texture2G[65536] = {227,220,220,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,222,222,222,222,222,221,221,221,221,221,221,221,221,221,221,221,222,222,222,222,221,221,221,221,221,221,221,221,221,221,221,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,220,219,219,219,219,218,218,218,218,219,219,219,219,220,220,220,220,220,220,220,220,219,219,219,219,220,220,220,220,219,219,219,218,218,218,218,218,219,219,219,219,219,219,219,219,219,219,219,219,220,220,220,219,219,219,219,217,217,216,214,213,213,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,213,213,213,213,213,212,212,212,212,211,212,212,212,212,212,212,211,211,211,211,211,210,209,208,207,206,206,205,205,205,205,205,205,205,205,205,205,205,204,204,204,205,203,205,205,204,204,205,205,205,206,206,207,206,206,206,205,206,206,206,206,205,205,205,205,206,206,206,206,206,205,205,206,206,206,206,207,216,
192,177,181,178,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,179,179,179,180,181,180,180,180,177,177,177,177,178,178,179,179,180,181,180,180,179,179,178,178,177,177,177,177,178,177,176,175,175,174,174,172,171,171,171,170,170,170,170,171,171,172,172,171,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,173,173,173,172,171,170,170,170,170,170,170,171,171,172,171,170,170,170,171,171,171,171,170,170,170,170,169,169,169,168,168,168,167,164,161,159,157,157,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,156,156,156,156,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,157,157,158,159,160,159,159,158,157,156,155,155,155,155,155,155,155,155,154,154,155,154,153,150,149,146,145,145,145,144,143,142,141,141,141,142,142,142,142,142,141,141,141,141,142,141,140,144,144,142,142,140,141,140,141,146,145,145,143,139,139,140,142,141,141,141,141,141,140,141,142,142,142,141,140,145,146,145,145,171,
192,178,178,177,179,179,179,178,178,178,177,178,179,179,179,179,179,179,179,178,178,178,179,179,179,178,178,179,179,179,178,178,178,179,179,178,179,178,178,180,180,179,179,178,178,178,178,178,177,176,176,176,175,175,172,170,169,170,170,170,170,170,170,169,170,170,171,171,170,170,170,169,169,169,170,170,170,170,171,171,171,171,171,171,171,170,170,170,170,170,170,171,171,171,171,170,170,170,169,169,169,169,169,169,169,170,170,170,170,170,170,170,169,170,171,171,171,170,170,170,170,168,168,165,163,161,159,157,157,157,157,157,157,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,157,157,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,159,160,159,159,158,158,157,157,157,158,158,158,158,158,157,157,157,156,155,153,151,149,147,145,144,142,142,141,141,141,141,141,141,141,141,141,140,140,140,140,143,143,142,142,142,142,143,143,143,142,143,145,144,144,144,142,143,143,143,142,141,141,141,141,141,140,141,142,142,142,143,141,141,142,143,145,167,
191,179,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,178,178,177,177,177,177,178,178,177,177,178,178,178,178,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,178,177,177,176,174,173,173,172,173,171,172,171,171,171,171,171,172,172,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,173,174,173,172,172,172,172,171,171,171,171,171,172,172,172,172,172,172,171,171,171,170,170,171,171,171,170,170,169,169,169,168,167,164,162,159,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,158,159,159,159,158,157,157,157,157,157,157,157,158,158,158,157,157,156,155,153,152,150,146,144,144,144,143,143,142,142,142,142,142,142,142,142,141,141,141,141,141,140,141,141,140,140,141,141,144,142,144,145,143,143,143,142,144,143,142,140,141,141,141,141,142,141,142,144,143,142,143,141,142,143,141,144,166,
192,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,176,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,177,177,177,177,176,176,176,175,174,174,173,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,170,170,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,173,173,173,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,170,170,170,171,171,171,171,170,169,169,169,167,165,162,161,159,158,157,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,157,157,157,157,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,157,157,157,158,158,158,158,158,156,156,156,156,156,156,156,156,157,156,156,155,155,154,152,152,151,149,147,145,143,143,142,142,143,143,143,143,143,143,143,143,143,143,143,142,142,142,142,142,142,141,141,142,142,143,143,145,145,144,143,141,141,140,140,141,141,142,141,142,142,142,142,141,141,142,141,143,142,142,143,162,
192,178,176,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,177,176,178,177,177,177,177,177,176,175,174,174,173,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,169,169,166,166,163,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,144,143,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,176,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,177,176,178,177,177,177,177,177,176,175,174,174,173,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,169,169,166,166,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,143,144,143,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,176,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,177,176,178,177,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,169,169,166,166,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,157,157,158,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,143,143,143,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,176,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,177,176,178,177,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,169,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,157,157,158,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,143,143,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,176,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,177,176,178,177,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,169,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,143,143,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,176,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,178,177,177,177,177,177,176,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,169,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,157,157,156,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,142,143,142,141,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,142,162,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,178,177,177,177,177,176,176,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,171,170,170,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,170,169,168,165,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,157,157,156,157,157,157,157,157,157,157,157,157,156,156,156,156,155,153,152,150,148,146,144,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,142,143,142,141,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,141,162,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,170,169,170,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,171,170,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,141,165,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,170,170,170,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,171,170,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,141,162,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,171,170,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,141,162,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,171,170,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,144,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,141,162,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,172,170,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,171,170,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,144,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,141,162,
192,179,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,170,169,172,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,171,170,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,144,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,141,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,176,178,177,177,177,177,176,175,175,174,173,172,172,172,171,171,171,171,171,171,171,172,172,172,171,172,171,171,171,176,179,174,171,170,171,171,171,171,170,170,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,170,171,171,171,171,171,171,171,171,171,170,169,168,166,165,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,151,149,146,145,145,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,142,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,165,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,168,172,170,171,171,174,155,176,180,169,172,172,172,171,170,170,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,150,149,148,145,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,142,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,171,170,174,168,161,147,185,163,176,175,172,172,171,171,170,169,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,150,149,148,145,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,171,173,162,157,170,177,173,176,167,171,170,172,170,170,170,170,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,150,149,148,145,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,171,158,160,167,161,167,173,171,170,170,168,169,169,170,170,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,150,149,148,146,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,142,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,173,156,168,185,163,168,173,171,171,174,171,172,171,170,170,169,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,150,149,148,146,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,143,140,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,182,158,197,212,178,171,172,171,171,172,167,166,169,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,151,150,148,146,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,142,141,141,140,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,176,175,174,173,173,172,172,172,171,171,171,171,171,171,171,172,172,172,172,178,215,224,175,172,168,172,171,170,174,173,172,172,171,170,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,172,172,173,173,173,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,151,150,148,146,145,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,142,148,146,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,171,171,171,171,170,170,180,165,203,220,214,177,171,169,172,171,170,171,171,171,171,170,170,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,152,150,147,146,145,144,143,142,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,149,147,141,141,141,143,141,142,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,172,172,172,172,171,169,166,167,221,225,222,183,170,170,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,152,150,148,146,145,144,143,142,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,143,142,142,142,140,141,142,142,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,172,172,172,171,173,172,160,182,225,222,222,204,173,175,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,154,153,152,150,148,146,145,144,144,143,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,139,140,142,140,143,141,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,172,172,172,171,172,169,153,186,219,225,221,199,169,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,153,152,150,148,147,145,144,144,143,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,142,142,142,140,143,140,144,142,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,172,172,172,170,170,165,177,183,218,224,222,225,176,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,150,149,147,146,145,144,143,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,143,143,141,141,141,140,143,140,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,172,172,172,170,170,174,180,188,219,222,227,204,175,168,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,151,149,147,146,145,144,143,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,140,143,146,142,140,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,178,178,178,177,177,177,177,177,178,177,177,177,177,175,175,174,173,172,172,171,171,171,171,171,172,172,172,170,175,163,175,197,220,223,218,175,168,170,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,168,165,164,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,151,149,148,146,145,144,143,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,153,149,144,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,171,171,171,171,172,165,166,195,223,221,206,173,169,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,155,153,152,150,148,146,145,144,143,142,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,140,141,142,141,142,142,141,141,141,141,141,142,139,152,159,152,149,142,140,141,141,142,142,142,142,142,142,142,142,142,142,162,
192,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,171,171,171,173,168,163,155,197,222,223,201,170,171,173,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,161,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,153,152,151,148,146,145,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,144,142,142,142,142,141,141,141,141,141,142,141,149,167,166,156,148,140,141,142,145,140,142,142,142,142,142,142,142,142,162,
192,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,172,172,172,172,169,158,149,202,222,226,204,171,168,173,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,161,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,153,153,151,148,146,145,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,138,142,141,138,141,142,142,141,141,141,141,141,144,143,146,151,163,161,150,141,140,141,142,141,142,142,142,142,142,142,142,142,162,
192,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,172,172,172,173,171,168,155,206,222,223,222,200,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,161,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,154,153,151,148,146,146,144,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,145,144,146,143,141,142,142,141,141,141,141,141,141,142,145,142,154,163,153,146,143,140,139,142,142,142,142,142,142,142,142,142,162,
192,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,172,172,172,172,170,190,188,214,223,222,226,207,173,167,173,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,161,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,151,149,147,146,145,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,144,142,139,141,142,142,141,141,141,141,140,141,140,139,144,145,149,161,151,151,141,140,143,142,142,142,142,142,142,142,142,162,
195,180,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,172,172,172,170,171,172,190,220,220,225,220,206,174,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,161,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,157,157,156,154,153,151,149,147,146,146,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,145,154,144,142,141,142,142,141,141,141,141,141,142,140,138,140,142,143,147,164,158,149,143,142,142,142,142,142,142,142,142,142,162,
195,180,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,172,172,172,172,169,160,198,222,218,225,222,208,171,170,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,165,165,162,161,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,157,157,156,155,154,152,149,147,147,146,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,146,157,166,148,142,142,142,141,141,141,141,141,141,142,140,139,142,143,141,151,157,158,145,142,142,142,142,142,142,142,142,142,162,
195,180,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,172,173,173,173,172,169,163,197,222,221,223,223,200,175,169,169,171,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,166,165,162,160,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,153,150,148,147,146,144,143,142,141,142,142,142,142,142,142,142,142,141,142,141,142,144,163,186,161,146,144,142,141,141,141,141,141,143,144,140,142,140,141,142,143,149,160,155,146,142,142,143,142,141,142,142,142,162,
195,180,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,172,172,172,172,172,172,172,173,173,173,173,171,173,208,223,223,223,223,182,175,169,170,171,170,171,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,171,169,168,167,164,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,153,152,150,147,145,143,143,142,141,142,142,142,142,142,142,142,142,141,142,141,142,141,168,169,171,152,144,141,141,142,142,142,142,142,142,142,142,142,142,142,142,144,154,165,152,147,141,139,143,142,142,142,142,162,
195,180,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,172,172,172,172,172,172,172,173,173,173,171,171,184,216,223,223,223,223,201,192,172,170,169,171,169,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,164,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,153,152,150,147,145,143,143,142,141,142,142,142,142,142,142,142,142,142,142,141,142,141,155,145,159,149,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,148,156,150,152,149,142,142,142,142,141,142,162,
195,180,179,179,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,172,172,172,172,172,172,172,173,173,173,173,177,190,222,223,223,223,223,222,207,172,171,168,169,168,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,163,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,153,152,149,147,145,143,143,142,141,142,142,142,142,142,142,142,142,142,141,142,143,143,141,142,144,143,143,141,140,142,142,142,142,142,142,142,142,142,142,142,143,142,144,143,141,156,162,145,142,141,141,141,141,162,
195,180,179,179,180,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,172,172,172,172,172,172,172,173,173,173,171,172,189,222,222,223,223,223,219,211,178,170,172,165,172,172,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,163,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,154,152,149,147,145,143,143,142,141,142,142,142,142,142,142,142,142,141,141,142,141,140,145,143,141,142,143,141,140,142,142,142,142,142,142,142,142,142,142,142,142,140,140,141,143,158,171,151,148,141,140,142,141,162,
195,180,179,180,180,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,172,172,172,172,172,172,172,173,173,173,173,172,191,223,223,223,223,223,221,217,174,176,170,169,172,168,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,166,163,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,154,152,150,147,145,143,143,142,141,142,142,142,142,142,142,142,142,142,142,141,139,140,149,150,145,150,144,141,144,142,142,142,142,142,142,142,142,142,142,142,140,139,143,142,142,147,159,154,149,144,141,142,140,162,
195,180,179,180,180,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,172,172,172,172,172,172,172,173,173,173,171,174,189,217,223,223,223,223,227,219,225,204,178,171,171,170,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,166,163,162,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,149,147,145,143,143,142,141,142,142,142,142,142,142,142,142,142,143,140,143,160,158,161,177,170,153,145,144,142,142,142,142,142,142,142,142,142,142,142,141,139,141,141,142,143,149,169,165,144,141,144,139,162,
195,180,179,180,180,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,173,173,173,172,171,172,171,171,172,172,172,172,170,179,193,220,222,223,223,223,225,220,221,225,210,169,171,169,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,170,168,167,165,163,161,160,158,157,157,156,157,157,157,156,156,157,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,149,147,145,143,143,142,141,141,143,142,141,141,142,142,142,141,143,141,146,168,185,185,187,187,175,161,152,141,141,142,141,142,142,142,142,142,142,142,142,142,144,142,140,136,149,170,153,143,142,145,141,162,
195,179,179,179,179,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,171,171,171,171,171,172,172,172,168,183,199,226,223,223,223,223,223,223,222,222,223,171,172,167,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,169,168,167,165,163,161,159,159,157,157,155,158,157,157,156,156,157,155,154,156,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,152,147,147,143,143,143,142,142,145,142,142,141,142,142,142,141,143,143,147,181,187,186,186,188,187,187,164,141,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,146,160,152,142,142,142,142,162,
195,179,179,179,179,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,171,171,172,172,171,172,172,172,171,178,200,224,222,223,223,223,222,224,224,222,221,177,172,167,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,169,168,167,165,163,160,159,159,157,158,158,155,157,157,159,157,157,156,157,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,153,147,147,143,144,141,141,142,141,141,143,142,142,142,142,143,142,150,149,178,188,187,186,188,187,188,175,147,142,144,142,142,142,142,142,142,142,142,142,142,142,142,141,143,143,147,148,142,142,142,142,162,
195,179,179,180,180,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,171,171,172,172,171,172,172,172,173,169,195,222,222,223,223,223,222,223,220,224,209,175,173,170,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,169,168,166,164,162,160,159,158,157,157,158,155,156,158,157,156,156,158,158,158,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,151,148,146,146,145,144,144,140,143,140,141,142,141,142,142,142,142,144,158,168,183,186,189,187,187,188,183,188,148,142,144,143,142,142,142,142,142,142,142,142,142,142,142,143,142,145,150,143,142,142,142,142,162,
195,179,179,180,180,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,172,172,172,172,172,172,172,172,171,169,194,224,222,223,223,223,224,221,218,221,187,170,167,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,169,167,166,164,162,160,159,158,156,157,158,155,158,157,156,159,157,158,158,154,154,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,152,151,157,149,144,144,142,142,142,142,142,142,142,142,142,141,148,183,176,183,188,188,186,189,186,187,188,160,148,141,142,142,142,142,142,142,142,142,142,142,142,142,143,143,144,151,140,142,142,142,142,162,
195,179,179,180,180,180,180,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,172,173,172,172,173,172,172,172,173,173,194,226,222,223,223,223,221,223,221,209,175,170,167,177,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,169,167,166,164,162,160,159,158,156,157,156,157,163,162,168,161,156,156,157,157,155,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,156,155,151,186,163,154,141,142,138,144,142,139,141,142,142,142,140,149,174,160,184,188,188,186,189,188,188,190,180,155,139,141,142,142,142,142,142,142,142,142,142,142,142,142,142,143,149,141,142,142,142,142,162,
195,179,179,180,180,180,180,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,172,173,174,173,172,172,172,172,170,174,197,223,221,223,223,223,222,225,223,183,166,165,169,160,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,169,169,167,166,163,161,159,159,158,156,156,156,158,162,210,209,172,163,165,162,157,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,152,155,188,181,165,153,156,148,142,142,141,142,142,142,142,140,162,172,185,189,186,188,187,185,190,191,188,190,167,146,141,142,142,142,142,142,142,142,142,142,142,142,141,141,141,148,143,142,142,142,142,162,
195,179,179,180,180,180,180,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,173,172,172,171,176,174,170,172,172,172,171,171,195,224,222,223,223,223,223,220,218,217,175,170,174,173,170,170,170,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,169,169,167,166,163,161,159,158,158,156,156,156,156,167,224,222,220,223,212,196,160,156,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,149,156,178,188,185,188,180,190,151,140,141,142,142,142,142,142,156,181,173,180,188,187,187,190,187,183,185,189,186,157,143,141,141,142,141,142,142,142,142,142,142,142,141,140,143,139,140,142,142,142,142,162,
195,180,180,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,171,176,198,223,222,223,223,223,223,221,224,199,172,170,170,180,171,170,169,170,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,168,166,164,163,160,159,158,157,157,157,160,156,172,221,223,223,223,223,227,188,161,157,153,156,160,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,156,149,149,170,187,188,188,188,186,167,160,141,143,142,144,142,143,165,186,180,168,189,188,188,187,188,188,188,187,189,166,148,141,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,180,180,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,169,170,204,224,223,223,223,223,224,223,223,205,168,170,180,178,174,169,171,170,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,169,168,166,164,163,160,159,158,157,157,156,158,152,165,219,223,223,223,222,217,218,164,157,156,156,157,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,150,149,156,185,188,188,188,187,187,181,160,149,144,144,143,155,166,189,182,184,186,188,186,187,188,188,187,188,189,192,163,142,141,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,180,180,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,171,176,219,224,222,223,223,223,222,221,224,208,169,176,185,189,160,172,169,171,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,169,168,166,164,163,160,159,159,157,157,157,158,154,178,223,223,223,223,222,218,223,194,163,158,157,156,154,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,148,151,154,188,188,188,188,190,188,185,187,172,163,164,162,171,189,186,186,187,183,188,187,187,188,188,187,188,184,188,172,150,142,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,180,179,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,173,183,222,224,222,223,223,223,222,222,223,203,172,182,186,186,147,170,171,171,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,168,166,164,162,160,159,159,157,157,157,156,158,200,225,223,223,223,224,222,222,223,187,161,155,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,150,152,156,190,188,188,188,186,185,186,187,191,191,190,184,189,186,190,189,186,186,188,187,187,188,188,188,192,185,189,187,156,143,140,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,179,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,170,186,217,223,223,223,223,223,220,223,223,211,182,185,183,186,163,167,171,171,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,165,164,162,160,159,159,157,157,156,156,158,196,222,223,223,223,224,229,202,184,205,159,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,152,150,156,190,188,188,188,187,187,188,189,189,188,191,190,189,189,189,185,188,189,189,187,187,188,188,187,187,188,191,186,177,145,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,179,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,169,189,219,222,223,223,223,223,221,224,222,220,188,188,180,185,178,173,171,172,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,165,164,162,160,159,159,157,157,157,156,163,211,223,223,223,223,223,224,196,141,207,169,158,160,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,151,154,149,154,187,188,188,188,189,186,184,187,187,184,185,186,189,186,191,186,189,188,190,189,188,188,188,188,186,190,190,187,190,144,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,179,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,170,188,221,222,223,223,223,223,222,224,222,223,201,186,181,185,184,174,171,171,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,165,164,163,161,159,159,157,157,157,157,165,224,225,223,223,223,221,219,219,160,206,173,161,157,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,152,148,159,188,188,188,188,186,187,189,187,187,186,188,187,186,185,188,188,186,187,187,187,188,188,188,187,187,185,192,187,187,148,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,180,178,180,180,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,172,172,172,173,173,173,172,172,172,187,219,224,223,223,223,223,224,219,222,218,220,184,185,187,184,179,168,170,171,171,171,171,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,164,162,161,159,158,157,157,156,159,180,199,203,219,226,222,219,220,223,212,220,217,169,156,156,157,157,157,157,157,156,156,157,159,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,150,150,154,187,188,188,188,187,186,187,190,188,187,186,187,186,186,187,188,188,188,187,189,188,186,188,188,187,188,191,186,189,165,147,144,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,180,178,180,181,180,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,171,175,172,172,173,173,172,172,170,179,212,223,223,223,223,223,221,224,228,223,225,194,184,185,184,189,167,171,171,171,171,171,171,172,172,172,172,172,172,171,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,164,162,161,160,158,157,157,156,161,190,185,194,226,223,225,221,223,224,223,221,219,179,157,156,157,157,156,156,153,156,156,153,154,155,155,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,151,148,154,192,188,188,188,186,190,189,183,185,189,189,185,187,189,189,188,188,185,188,186,187,188,187,187,186,187,188,189,189,184,149,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,178,180,180,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,170,172,170,171,172,173,172,172,173,186,212,222,222,223,223,223,223,221,224,215,215,218,190,181,184,189,172,172,171,171,171,171,171,172,172,172,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,163,162,161,160,158,157,157,156,166,188,188,193,223,214,224,222,225,224,223,223,216,202,161,158,158,156,155,157,154,157,155,158,159,155,159,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,153,147,152,184,188,188,188,188,186,190,189,187,189,187,189,187,187,186,187,187,188,188,187,189,187,191,188,187,187,188,186,187,187,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,180,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,170,166,166,172,172,173,172,172,167,182,204,223,221,223,223,223,223,220,222,164,160,210,199,183,185,186,170,171,171,171,171,171,171,172,172,172,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,163,162,160,159,158,157,157,156,182,185,188,189,216,194,223,225,224,223,223,224,213,189,159,157,156,156,156,157,156,157,157,159,157,158,159,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,148,149,179,191,188,188,188,188,157,159,183,181,158,163,176,151,149,158,181,174,175,173,179,166,173,161,160,185,170,177,189,187,187,151,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,170,168,167,172,172,173,172,172,170,182,196,223,222,223,223,223,222,222,224,172,125,184,201,186,185,187,168,170,171,171,171,171,171,172,172,172,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,163,162,160,159,158,157,157,156,184,184,187,190,213,174,212,217,217,222,221,222,218,190,165,155,155,156,157,156,156,157,160,157,156,156,154,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,148,148,170,186,188,188,188,161,48,46,150,151,48,55,121,23,42,39,152,107,124,116,146,66,109,53,43,174,82,148,189,188,183,157,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,179,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,170,174,171,171,173,173,172,172,170,182,198,222,222,223,223,223,223,224,226,174,122,168,196,185,185,185,174,170,171,171,171,171,171,172,172,172,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,163,161,160,159,158,157,157,156,175,184,189,192,208,172,190,193,199,221,223,221,221,208,165,156,156,156,158,157,156,158,158,156,161,161,156,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,150,149,156,184,188,188,188,110,98,108,94,97,109,85,101,89,157,82,71,45,155,113,140,38,114,55,56,83,43,179,188,186,184,160,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,179,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,175,175,174,173,172,171,173,172,173,173,173,172,172,170,182,204,224,222,223,223,223,222,220,217,155,123,166,189,183,187,184,175,168,171,171,171,171,171,172,172,172,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,169,167,164,163,161,160,159,158,157,157,156,173,189,187,192,194,169,171,169,182,217,224,222,222,210,173,159,158,155,157,157,155,158,157,171,175,159,158,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,154,148,147,155,186,188,188,188,87,150,161,77,79,163,162,124,67,118,111,53,38,173,114,106,64,117,54,91,64,43,187,187,187,187,158,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,178,178,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,174,173,172,172,172,172,172,173,173,172,172,171,182,201,222,222,221,222,222,223,193,158,129,126,167,185,184,186,184,180,165,172,170,170,170,171,172,171,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,169,168,166,164,163,161,160,159,157,157,155,158,177,188,188,190,184,169,170,168,174,204,222,221,222,210,186,172,159,157,157,158,155,158,162,185,182,162,157,155,157,157,157,157,156,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,151,150,152,190,186,188,187,89,155,162,76,79,162,179,138,42,78,126,85,75,180,112,66,112,118,54,124,103,78,186,188,187,174,149,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,178,178,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,175,185,189,214,224,221,224,222,205,148,123,122,148,178,185,184,185,183,186,171,164,173,171,168,171,172,171,173,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,168,166,165,163,162,160,159,158,156,158,157,175,186,188,189,179,169,170,169,170,186,217,226,223,206,184,184,163,157,157,159,156,159,160,186,186,175,157,157,157,157,157,155,156,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,149,150,148,179,188,187,192,105,116,127,89,91,134,112,97,89,160,166,57,88,184,113,44,142,119,54,158,50,107,188,187,187,170,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,176,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,175,182,185,211,222,221,226,216,159,129,123,120,166,185,185,186,185,183,186,183,181,170,179,176,171,172,172,172,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,168,166,165,163,162,160,159,158,154,157,161,173,186,187,191,180,169,169,169,168,172,201,222,219,197,183,186,163,156,156,157,156,158,161,189,189,174,158,156,157,157,157,155,156,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,150,148,147,167,191,184,186,150,32,35,144,138,37,41,113,23,40,138,44,109,186,112,65,149,115,54,180,20,133,187,189,190,177,138,144,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,179,179,178,179,178,176,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,170,182,183,210,225,225,227,185,129,121,125,132,182,186,184,182,183,184,185,184,185,185,172,173,171,170,172,172,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,168,166,165,163,162,160,159,157,154,155,163,188,187,186,188,183,170,169,169,168,169,184,205,197,182,184,188,159,156,156,157,157,158,173,188,186,172,163,156,157,157,157,156,154,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,155,149,147,184,189,185,188,184,149,144,183,182,142,153,168,122,123,169,140,166,187,162,156,173,165,139,188,129,176,191,190,192,170,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,179,179,178,178,178,176,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,170,182,189,216,214,209,212,140,122,121,146,178,185,185,185,185,185,184,187,182,184,184,192,171,173,171,172,169,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,168,166,165,163,162,160,159,158,157,162,157,193,185,188,189,187,173,170,169,168,169,168,154,133,157,185,185,165,156,156,158,157,157,163,186,187,185,159,157,157,157,157,157,160,154,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,151,150,146,152,177,188,186,189,182,191,188,188,186,187,189,185,189,184,185,188,184,187,187,189,187,190,185,189,185,187,187,184,149,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,171,179,187,192,191,191,185,125,123,124,150,185,182,185,181,184,186,184,187,185,184,182,184,185,170,171,174,171,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,168,166,165,163,162,160,159,157,158,159,164,186,186,186,190,189,174,171,169,171,169,157,126,120,139,181,183,165,158,156,155,157,156,156,196,185,191,159,156,157,157,157,158,168,153,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,152,148,145,147,141,152,168,187,186,187,184,191,187,188,186,189,188,188,187,187,188,189,187,188,187,185,190,187,188,190,187,190,159,142,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,178,178,179,177,177,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,173,172,172,169,180,192,187,188,188,178,130,125,123,155,185,182,187,183,186,186,184,185,184,185,186,184,184,169,172,175,171,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,168,166,165,163,162,160,159,157,157,157,176,186,188,185,187,188,174,171,169,170,170,148,125,121,134,178,174,158,159,155,154,157,160,163,190,185,192,172,158,157,157,157,157,163,156,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,151,151,146,147,144,146,152,183,181,189,189,186,188,189,187,188,187,187,186,185,188,186,186,186,188,186,188,188,188,188,189,186,148,144,142,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,176,179,179,177,179,176,177,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,176,175,175,174,173,172,172,172,172,172,172,172,171,172,176,183,194,186,187,187,181,136,124,125,164,184,183,185,184,184,185,184,183,184,183,186,184,182,175,172,173,170,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,163,161,159,159,158,156,158,180,186,188,189,189,188,176,170,171,169,160,132,123,124,127,173,175,158,158,156,155,158,157,158,172,190,189,173,161,157,156,157,155,155,157,158,157,156,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,151,152,149,145,144,143,147,154,149,169,184,187,186,188,188,188,187,188,189,187,187,188,183,186,187,188,188,188,189,188,190,170,147,142,143,141,142,142,142,142,142,142,142,142,141,141,141,142,141,142,141,143,162,
192,177,177,180,179,178,181,177,178,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,173,173,173,173,171,170,171,171,176,190,192,188,187,190,184,151,142,138,174,186,184,184,184,184,185,185,185,184,184,185,185,185,177,171,172,172,173,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,157,157,161,187,187,188,188,188,187,175,168,171,168,142,123,122,123,123,170,182,162,158,156,155,157,155,156,172,189,187,181,163,157,156,157,157,157,157,157,157,157,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,143,148,168,186,188,188,186,188,188,187,188,187,186,186,186,188,189,188,186,189,188,186,190,163,142,142,142,142,142,142,142,142,142,142,142,143,143,141,141,144,144,143,140,143,162,
192,177,176,179,179,173,179,178,179,181,177,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,173,173,173,173,174,172,173,172,172,194,191,190,188,188,189,178,176,169,183,184,185,185,185,185,185,185,185,184,184,185,185,185,171,171,171,172,173,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,157,155,169,191,186,184,185,186,187,176,172,168,162,131,123,125,123,126,173,184,171,160,155,157,156,156,156,174,190,187,184,157,157,156,157,157,157,157,157,157,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,142,140,148,182,190,191,186,185,186,186,188,189,187,186,188,187,189,184,186,187,188,188,181,150,142,142,142,142,142,142,142,142,142,142,142,144,148,141,140,141,143,142,141,141,162,
191,178,175,178,185,173,178,177,180,182,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,173,173,173,173,173,173,172,175,175,194,188,189,189,187,188,188,191,188,192,184,185,186,186,185,185,185,185,185,185,185,185,185,172,173,172,172,173,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,157,157,173,193,188,188,191,189,196,193,187,183,161,141,126,121,123,124,170,185,181,163,160,156,157,156,157,179,190,184,191,169,157,156,158,156,157,157,157,155,155,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,142,142,143,163,186,191,189,185,187,187,187,188,188,187,188,187,189,188,186,187,188,186,165,145,142,142,142,142,142,142,142,142,142,142,142,144,148,141,141,143,142,146,140,143,162,
188,178,176,180,172,181,178,178,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,173,173,173,173,173,172,168,169,179,195,189,186,187,187,186,189,187,189,194,184,185,185,185,185,185,185,185,185,185,185,185,184,171,171,174,175,173,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,156,163,185,199,198,196,194,186,187,187,190,205,206,204,164,124,122,119,166,186,185,176,160,158,157,154,158,174,184,188,186,178,157,157,156,156,157,157,157,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,142,140,143,153,192,190,189,190,187,186,186,189,187,187,185,187,186,192,186,184,187,184,155,142,142,142,142,142,142,142,142,142,142,142,142,141,144,141,142,144,152,142,140,142,162,
192,176,185,167,162,186,177,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,173,173,173,173,172,173,174,175,179,192,190,185,186,186,185,187,186,189,186,184,184,185,185,185,185,185,185,185,185,185,185,185,184,172,170,171,173,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,157,163,185,178,187,187,187,184,186,186,206,221,225,226,188,131,123,128,171,184,184,185,165,159,155,155,158,169,191,189,182,175,157,157,155,156,157,157,157,161,159,155,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,139,141,142,150,165,174,183,190,189,188,185,186,186,188,184,187,186,179,195,194,189,186,146,144,142,142,142,142,142,142,142,142,142,142,142,140,141,141,141,146,191,144,141,141,162,
192,186,146,163,155,182,183,179,177,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,173,173,173,173,170,171,172,167,171,191,188,186,186,186,186,186,190,189,183,186,185,186,186,186,185,185,185,185,185,185,184,183,182,171,172,174,173,173,173,173,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,156,161,191,180,187,185,186,186,185,187,216,220,222,226,219,178,135,159,183,182,185,184,182,166,157,156,158,163,182,190,188,174,158,157,158,157,157,157,157,160,159,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,143,137,142,146,160,188,189,184,185,186,186,188,186,188,186,186,191,153,156,186,188,175,148,138,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,146,188,141,142,144,162,
197,153,148,182,165,178,166,176,177,179,177,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,175,173,173,172,173,173,172,174,174,169,140,144,191,164,155,160,176,160,157,189,184,165,160,182,171,156,175,168,153,162,183,185,185,184,183,179,167,170,172,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,165,162,160,159,158,158,160,186,182,185,185,184,184,184,188,219,222,220,223,225,205,158,186,190,184,185,182,186,183,161,156,159,161,155,181,189,185,162,157,157,156,157,157,157,156,156,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,157,157,157,157,156,155,154,151,150,148,145,144,143,142,141,141,142,142,139,143,152,182,189,185,188,186,188,187,188,190,184,184,149,141,178,191,176,143,142,142,142,142,142,142,142,142,142,142,141,142,142,141,141,141,155,165,143,144,141,162,
200,174,180,180,178,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,171,173,173,171,174,174,141,16,39,140,54,33,60,114,26,40,168,160,50,35,144,80,33,100,90,28,52,167,185,185,185,184,183,167,170,173,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,169,168,166,164,161,160,158,158,157,160,175,185,185,185,185,184,184,190,222,223,221,222,222,224,209,188,185,188,175,184,184,187,161,156,157,158,157,165,182,185,165,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,141,143,173,187,184,186,185,191,187,186,192,180,178,152,143,173,188,181,143,143,142,142,142,142,142,143,142,142,142,140,143,141,141,143,141,170,180,145,143,141,162,
195,169,175,178,178,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,170,173,172,168,167,169,139,65,117,84,69,138,160,124,95,150,182,140,95,97,92,41,137,49,91,119,83,132,185,185,185,184,186,169,171,173,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,164,161,160,158,158,158,157,170,186,185,185,185,184,183,190,220,223,222,222,224,223,221,211,196,190,186,184,183,185,172,155,155,157,156,161,171,187,176,156,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,156,157,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,141,143,154,190,170,164,185,183,187,191,188,186,167,148,143,173,186,175,141,142,142,142,142,142,142,141,141,141,140,141,140,143,142,142,142,146,154,149,142,140,162,
192,172,176,178,178,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,172,172,172,168,169,169,138,79,160,74,65,109,144,127,114,175,185,172,121,69,110,55,182,51,90,144,125,112,185,185,185,184,186,168,172,172,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,168,166,164,161,160,158,158,157,158,171,184,185,185,185,184,184,189,222,222,223,222,223,222,222,224,215,186,177,184,187,184,177,155,154,155,157,155,166,185,173,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,155,157,158,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,141,141,147,169,157,149,175,186,186,188,188,185,153,146,143,165,189,166,139,141,142,142,142,142,142,142,142,142,141,142,142,144,144,142,142,139,158,141,142,141,162,
192,176,178,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,171,173,173,168,169,174,139,81,158,72,57,70,114,127,115,183,185,163,61,76,163,57,181,54,90,146,123,111,185,185,185,184,184,168,169,173,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,166,164,161,160,158,158,158,158,167,185,185,185,185,184,183,191,224,225,223,224,221,220,222,223,214,182,186,183,187,185,174,156,157,157,157,157,165,183,165,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,157,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,142,140,143,144,149,143,160,188,189,184,192,181,153,143,142,153,196,151,138,143,142,142,142,142,142,142,143,142,142,142,142,145,143,142,142,143,153,139,142,142,162,
192,177,178,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,172,172,175,166,169,172,140,84,139,78,70,140,168,126,109,183,183,139,78,114,138,56,183,52,90,142,98,126,185,185,185,184,182,168,170,172,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,166,163,161,160,158,158,157,159,156,184,185,185,185,184,184,185,196,202,222,223,222,214,216,226,217,179,189,183,186,183,173,158,160,166,158,157,157,175,158,154,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,154,155,159,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,142,142,141,141,141,139,149,175,193,189,195,174,152,141,142,150,178,152,140,144,142,142,142,142,141,141,141,142,142,139,147,151,141,142,142,148,148,141,141,142,162,
192,179,178,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,173,172,172,171,167,172,138,20,35,120,53,41,74,110,110,184,187,157,40,32,146,54,180,54,87,37,41,165,185,185,185,185,184,171,174,170,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,165,163,161,160,158,158,158,154,159,175,185,185,185,184,184,185,184,198,222,220,215,204,219,223,219,188,181,184,184,184,175,159,158,153,152,158,154,160,159,155,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,159,156,155,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,142,144,142,141,146,141,144,151,173,192,184,160,150,141,144,144,172,153,143,140,142,142,142,142,141,143,141,141,141,141,148,142,142,142,141,142,145,140,144,140,162,
192,180,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,177,176,176,175,173,173,174,170,172,167,171,170,162,108,118,174,137,117,137,135,159,188,186,181,140,134,180,135,184,134,148,114,142,184,185,185,185,184,188,178,171,173,173,173,173,173,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,167,165,163,161,160,158,158,158,158,157,174,185,185,185,184,184,185,184,202,219,202,202,210,220,223,224,195,185,187,187,186,177,158,157,150,157,159,164,158,159,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,155,159,163,157,157,157,156,156,156,154,153,150,147,145,144,143,142,142,142,142,142,142,141,141,142,143,142,145,142,153,175,155,159,152,143,141,143,140,173,148,140,143,142,142,142,142,142,149,145,141,143,139,145,143,142,142,142,144,145,140,145,143,162,
192,179,176,177,176,178,177,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,178,177,176,175,175,174,173,174,172,174,164,172,166,169,172,166,178,183,187,192,183,184,186,184,185,184,184,184,184,183,184,185,183,185,184,184,185,184,186,185,180,171,174,173,172,172,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,169,167,165,163,161,159,158,157,155,157,156,171,187,185,185,184,184,187,193,187,190,185,190,214,225,224,225,199,162,126,135,152,172,156,154,156,158,157,157,158,157,155,158,157,156,156,156,156,157,157,157,157,157,157,157,156,158,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,157,157,157,157,157,157,154,154,152,151,147,140,143,149,140,142,142,142,140,139,143,146,140,141,143,144,142,155,157,145,146,143,140,142,144,146,152,147,141,145,143,138,139,140,142,160,144,144,141,138,153,145,142,140,142,157,145,142,140,142,162,
192,178,176,178,176,177,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,178,177,176,175,174,174,173,171,176,171,167,172,169,173,174,181,194,198,195,186,185,185,185,186,182,189,181,186,185,187,183,186,182,186,183,186,183,185,183,185,189,169,175,171,172,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,169,167,165,163,161,159,158,157,156,158,156,172,186,184,183,183,182,185,191,192,189,185,189,215,220,224,221,187,147,127,125,135,162,157,156,155,157,154,163,158,157,157,156,156,157,157,156,156,157,157,157,157,157,157,157,156,155,155,154,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,155,153,150,152,148,146,144,141,140,138,140,142,144,145,138,153,142,140,141,142,142,141,139,141,142,143,142,144,140,145,141,142,142,137,141,145,148,158,143,143,142,139,139,145,142,147,157,144,143,153,144,142,141,142,162,
192,178,176,179,177,177,173,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,178,177,176,175,175,174,173,171,176,171,168,169,174,182,186,183,188,188,186,185,184,186,185,184,182,183,184,185,186,184,184,183,184,185,185,183,184,185,185,182,188,181,169,171,172,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,169,167,165,163,161,159,158,157,157,157,158,174,185,184,183,183,185,185,188,186,189,186,188,212,220,225,219,175,129,122,124,122,153,153,157,156,155,158,162,157,157,159,155,156,157,157,156,156,157,157,157,157,157,157,157,156,155,155,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,153,152,151,144,144,143,145,141,142,145,143,155,153,139,153,153,148,140,142,143,142,141,143,140,143,141,144,140,141,145,140,144,140,140,142,144,158,138,142,142,145,141,141,142,157,156,142,144,143,142,142,141,142,162,
192,178,176,177,177,174,161,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,177,176,175,175,174,173,174,171,166,174,170,169,147,188,149,161,149,147,153,154,119,122,161,141,182,133,148,167,168,122,152,138,186,151,172,185,185,183,184,183,185,168,172,172,172,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,166,165,163,161,159,158,157,157,157,160,173,183,185,186,186,185,186,193,186,188,186,188,207,222,222,198,155,129,124,126,126,156,155,157,157,155,163,156,157,157,160,155,156,157,156,156,156,157,157,157,157,157,157,157,156,157,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,154,154,151,148,149,144,141,145,146,151,150,144,180,165,149,162,168,157,145,140,143,143,144,146,141,142,141,144,141,147,145,145,142,141,146,136,147,146,146,147,140,141,140,144,149,155,144,140,142,141,141,142,142,142,162,
192,178,176,177,177,181,167,175,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,177,176,176,175,174,173,173,170,169,171,170,159,66,158,73,122,95,70,96,98,40,64,141,63,163,53,90,136,102,54,61,52,160,75,158,184,185,184,184,183,185,180,171,172,173,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,166,164,163,161,159,158,157,156,155,157,170,185,187,188,187,185,187,192,190,188,186,188,197,217,200,147,123,123,121,123,133,160,157,158,156,157,160,154,157,157,158,156,156,155,156,156,156,157,157,157,157,157,157,157,157,158,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,155,155,153,151,149,151,152,150,147,149,162,151,157,185,165,154,150,171,168,154,146,144,152,144,144,140,141,144,150,144,156,127,142,144,143,136,144,144,149,144,147,139,141,140,145,164,158,144,141,142,139,141,142,142,142,162,
192,178,176,177,179,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,176,176,175,174,173,170,169,169,172,175,174,51,57,59,134,81,58,87,100,98,162,175,61,117,91,100,135,53,148,73,54,60,42,179,184,184,185,183,183,182,183,170,172,174,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,166,164,162,161,159,158,157,157,155,157,173,184,186,189,191,183,185,187,190,188,186,188,188,191,160,120,120,125,121,122,136,160,158,159,156,159,156,156,157,157,157,158,156,155,157,157,156,157,157,157,157,157,157,157,157,158,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,155,152,154,154,150,180,194,164,176,159,151,147,147,151,146,137,155,160,157,154,157,152,147,142,141,143,141,168,186,168,119,134,148,145,127,147,142,146,141,142,139,146,150,187,165,149,144,141,141,141,142,142,142,142,162,
192,178,176,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,176,176,175,173,173,173,171,168,169,173,182,74,75,79,138,68,70,76,99,57,97,171,34,34,113,101,136,53,186,156,87,80,57,184,185,185,185,186,184,186,182,171,172,173,170,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,166,164,162,161,159,158,157,159,156,161,183,185,183,187,192,185,187,189,187,188,187,187,186,184,151,122,125,124,125,123,138,156,154,158,157,157,158,155,156,157,156,159,155,156,160,159,156,157,157,157,157,157,157,157,157,158,157,161,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,155,156,159,205,199,211,215,160,191,148,144,141,141,143,146,145,145,149,150,153,149,145,153,143,148,143,143,163,221,184,119,127,130,129,134,148,139,141,140,142,142,144,168,178,148,145,142,142,141,142,142,143,141,143,162,
192,178,176,178,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,176,176,176,174,173,174,170,171,169,177,184,99,87,109,138,57,96,61,98,53,86,170,44,93,64,97,137,53,184,169,120,91,89,185,184,183,183,183,186,187,179,168,172,174,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,165,164,162,160,158,158,157,159,159,157,189,186,187,189,189,189,189,189,187,188,188,187,186,190,136,125,122,124,123,123,142,150,155,159,157,157,157,156,156,156,158,160,155,159,163,159,156,157,157,157,157,157,157,157,155,158,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,163,157,157,157,155,154,167,204,200,175,171,171,153,168,145,141,142,141,145,143,145,141,144,141,144,144,143,147,150,155,145,141,149,220,191,119,122,127,123,134,151,140,142,141,138,141,148,153,144,143,143,142,142,142,142,142,142,141,142,162,
192,178,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,177,176,175,173,176,176,172,170,170,171,170,174,184,127,46,133,139,41,117,43,99,102,168,182,59,163,47,94,136,52,165,64,142,47,112,185,186,186,187,188,179,184,185,170,172,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,165,164,162,160,158,158,157,156,158,151,187,181,184,188,189,190,189,188,187,186,187,188,185,191,130,121,121,124,123,122,128,158,156,158,156,157,157,157,156,156,156,163,158,156,158,156,157,157,157,157,157,157,157,157,156,158,153,161,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,155,156,157,155,158,154,166,167,165,151,144,142,144,150,142,140,140,143,142,140,142,141,143,141,140,140,142,141,146,147,144,140,144,221,181,118,119,127,121,131,149,151,151,143,143,145,151,144,142,141,142,142,142,142,142,142,142,142,142,162,
192,178,176,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,176,176,176,175,172,172,177,165,167,171,169,169,177,184,150,36,155,143,40,136,40,101,15,19,138,31,20,60,101,138,109,19,68,169,26,143,185,185,185,185,186,187,190,186,173,173,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,168,165,164,161,160,158,158,157,154,160,169,201,198,195,189,188,190,189,188,188,189,186,187,193,179,128,125,128,124,123,122,134,160,155,154,157,157,157,157,156,156,157,167,159,157,160,156,156,157,157,157,157,157,157,157,157,154,165,165,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,155,155,158,157,164,166,151,150,144,146,145,146,143,140,142,141,150,147,144,153,143,142,144,144,144,144,141,154,157,138,146,152,218,182,117,127,122,129,149,145,147,136,148,141,146,152,143,144,142,141,142,142,142,142,142,142,142,142,162,
192,178,176,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,175,175,176,171,172,169,179,170,169,170,174,179,182,153,180,172,148,176,149,163,143,141,174,144,146,170,162,174,183,147,180,184,151,177,184,183,183,182,183,188,172,164,173,173,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,167,165,164,161,160,158,158,157,154,160,163,195,186,190,186,188,189,188,188,188,188,186,188,192,165,121,124,121,124,123,123,138,149,156,155,154,157,157,157,155,156,159,165,158,160,161,156,156,157,157,157,157,157,157,157,158,157,161,142,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,164,161,197,185,155,148,148,147,141,145,140,140,145,141,152,153,148,141,143,141,142,141,141,141,143,145,146,148,153,193,226,188,121,125,118,144,142,144,152,151,152,146,141,142,141,143,141,140,142,142,142,142,142,142,142,142,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,175,175,175,176,174,171,184,203,169,170,171,171,175,182,186,184,184,183,184,184,186,183,182,185,184,184,185,183,187,182,183,188,185,185,187,186,185,185,185,184,182,169,171,172,172,172,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,167,165,164,161,160,158,158,157,161,159,164,181,180,188,187,187,188,188,188,188,190,187,187,194,183,123,126,123,123,124,128,157,159,157,156,156,157,157,157,156,156,159,160,157,161,156,156,157,157,157,157,157,157,157,157,157,155,156,165,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,158,155,157,169,219,181,150,146,147,142,144,144,144,141,144,142,162,179,151,153,140,140,144,142,142,143,139,142,147,164,169,223,220,189,117,123,126,148,143,140,142,141,146,153,147,141,141,142,141,141,142,142,142,142,142,142,142,142,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,175,175,175,174,175,173,197,217,174,170,172,169,175,184,179,185,185,184,185,185,184,184,184,185,186,186,185,186,186,186,186,185,186,184,182,181,185,187,191,187,171,172,173,171,172,172,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,167,165,164,161,160,158,158,157,156,159,169,169,172,185,188,187,188,188,188,187,186,186,188,188,175,126,124,124,122,125,146,197,162,157,157,155,157,157,157,157,156,157,157,156,163,158,158,157,157,157,157,157,157,157,157,156,157,159,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,159,157,156,164,201,219,191,154,148,145,143,147,146,154,153,142,143,154,206,192,146,142,142,147,147,149,143,147,147,160,195,222,226,220,185,119,132,140,141,141,138,143,139,150,144,143,143,141,141,141,142,142,142,142,142,142,142,142,142,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,175,175,175,175,174,171,172,185,222,182,170,172,170,169,174,167,183,183,184,185,186,185,186,185,185,184,185,184,185,185,186,186,187,187,182,184,182,186,179,180,174,172,173,170,172,171,173,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,168,167,164,163,161,160,158,158,157,158,148,170,170,171,184,189,187,188,188,188,187,188,188,187,185,201,142,132,124,123,124,173,227,166,155,158,157,157,157,157,157,155,158,156,157,161,158,157,156,157,157,157,157,157,157,157,156,156,160,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,158,156,174,221,221,199,153,155,146,154,153,172,184,167,143,145,175,190,195,145,141,146,153,158,154,150,146,166,193,200,216,220,223,190,126,144,148,143,143,142,141,141,141,143,141,143,142,141,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,176,175,174,174,173,172,171,161,223,206,182,171,171,167,169,164,185,184,185,184,184,184,184,185,184,184,185,184,184,185,187,188,185,189,183,185,178,176,170,167,169,172,171,171,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,168,167,165,164,161,159,159,160,156,154,142,168,174,169,182,190,187,188,188,188,187,187,188,187,188,202,154,154,141,124,154,204,225,183,158,159,156,156,157,157,156,156,157,156,157,157,156,156,156,157,157,157,157,157,157,157,156,157,157,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,160,175,201,224,212,176,153,161,146,179,192,210,224,201,144,146,195,199,184,144,141,145,147,148,146,153,148,172,184,201,192,229,207,173,142,145,143,142,143,142,141,143,142,140,141,143,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,175,175,174,173,173,171,173,183,225,222,207,175,168,155,159,157,186,184,184,184,184,185,185,185,185,185,185,185,186,185,187,162,171,188,186,184,172,170,173,171,171,172,172,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,167,167,165,164,161,158,158,160,160,139,130,142,143,169,180,189,187,188,188,188,188,188,188,188,188,188,158,209,166,146,202,222,223,214,165,161,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,156,156,157,157,157,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,157,181,212,218,227,200,154,152,156,150,194,227,221,222,215,145,145,173,222,176,153,151,144,145,152,147,159,148,178,182,244,204,189,168,148,146,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,178,177,175,175,174,173,172,173,172,206,220,222,220,183,165,131,133,140,183,185,184,185,185,185,185,185,185,185,185,185,184,182,159,170,157,174,188,171,170,169,170,169,171,172,172,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,167,167,165,163,161,159,157,157,162,127,121,123,122,169,175,185,188,188,188,188,188,188,188,188,190,189,160,228,192,200,219,226,222,222,184,158,157,158,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,154,156,155,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,154,153,192,215,219,222,169,162,152,154,152,199,224,217,223,210,146,140,159,210,199,169,149,145,140,153,146,153,153,209,206,234,169,154,145,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,178,178,182,177,175,174,174,174,171,171,197,218,221,219,190,152,121,123,132,180,183,185,182,184,185,185,185,185,185,185,185,184,188,171,174,177,154,171,175,171,170,168,169,171,172,172,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,167,167,165,163,161,160,157,157,158,126,123,126,122,170,170,180,189,188,188,188,188,188,188,188,188,188,169,230,219,212,227,220,222,225,203,163,157,158,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,152,156,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,216,197,225,197,154,154,149,150,153,215,223,222,222,224,179,147,166,192,181,146,150,141,141,143,141,146,177,173,164,169,151,143,144,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,180,147,167,173,174,174,173,172,170,175,177,223,222,226,184,127,123,126,144,182,183,185,185,185,185,185,185,185,185,185,185,190,182,179,157,162,167,167,171,171,172,171,171,171,172,172,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,167,167,165,163,161,161,155,157,157,134,120,125,128,171,167,176,189,188,188,188,188,188,188,188,188,175,172,228,234,223,224,224,224,221,204,165,155,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,159,157,159,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,162,216,207,215,204,165,152,148,147,178,224,223,224,224,224,217,144,151,206,246,182,140,144,143,146,148,150,160,151,143,145,141,143,140,141,142,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,179,179,182,173,174,174,173,170,174,172,181,220,221,220,164,121,122,126,160,188,187,183,185,185,185,185,185,185,185,185,185,182,186,188,171,168,176,168,175,172,172,172,172,171,172,172,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,167,167,165,163,161,160,157,159,155,140,124,125,140,170,167,174,191,188,188,188,188,188,188,188,188,179,176,181,190,213,222,217,223,224,212,180,158,156,157,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,158,170,159,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,159,157,175,222,224,143,155,153,150,147,191,217,222,224,224,226,214,149,145,176,222,205,153,143,145,153,147,147,147,140,142,144,145,143,141,143,143,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,176,176,174,174,174,174,173,172,172,171,171,195,191,164,135,122,121,127,154,184,184,188,188,184,185,185,185,185,185,185,185,186,188,186,166,168,170,170,173,171,171,171,171,171,172,172,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,169,167,166,164,163,160,159,159,160,158,185,164,122,145,169,170,173,191,188,188,188,188,188,188,188,188,180,165,173,176,211,224,220,223,225,205,191,165,158,157,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,159,164,159,157,155,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,159,171,193,225,201,185,170,155,150,149,195,212,218,219,219,222,218,175,153,159,178,150,155,147,146,170,143,141,144,143,143,142,141,145,140,143,142,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,175,175,175,174,173,173,173,172,171,169,173,139,118,122,124,121,123,148,183,183,197,196,185,185,185,185,184,184,185,184,186,183,182,170,172,172,169,169,170,170,171,170,171,172,172,172,172,172,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,171,171,170,167,166,164,163,160,159,160,160,162,197,189,134,171,175,175,172,189,187,187,188,188,188,188,187,187,192,173,172,174,205,225,221,223,222,206,187,185,162,160,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,157,159,157,157,158,156,157,157,157,157,157,157,157,156,156,156,156,156,156,156,156,156,192,211,208,171,170,156,156,150,146,179,180,197,198,209,225,222,177,151,145,154,144,143,152,146,162,144,143,140,143,143,142,139,142,142,141,141,141,142,141,142,142,142,142,142,141,142,142,141,141,142,141,140,142,141,142,142,141,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,173,172,172,172,171,171,170,166,128,122,122,123,123,123,144,158,165,187,190,189,186,186,184,179,182,201,185,185,183,190,168,171,171,171,171,171,171,171,171,171,172,172,172,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,169,168,171,169,170,171,168,167,166,165,163,160,158,160,160,158,179,196,167,184,184,183,169,186,187,187,189,188,189,187,187,187,189,178,172,171,201,226,223,222,223,209,188,188,179,168,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,155,157,158,164,156,156,156,157,157,157,157,157,157,157,156,156,156,156,156,155,154,160,161,184,213,196,183,181,159,153,151,147,150,152,180,186,194,223,224,173,141,142,141,141,143,151,145,153,147,141,142,144,143,142,141,142,142,142,142,142,142,142,142,142,142,141,143,141,142,142,141,141,142,143,138,144,141,142,142,140,141,143,165,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,173,172,172,172,171,171,170,171,148,120,123,125,125,122,125,125,144,184,190,195,183,185,186,174,175,218,205,179,165,187,170,171,171,171,171,171,171,171,171,171,172,172,172,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,168,173,172,170,168,167,168,167,165,163,160,156,159,157,160,172,182,183,183,182,194,172,184,187,189,188,187,187,187,188,189,190,179,170,174,208,224,222,223,222,210,188,185,190,170,157,158,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,156,158,155,161,156,156,156,157,157,157,157,157,157,157,156,156,156,156,156,157,156,161,189,199,206,204,179,184,159,152,149,148,146,146,166,175,191,223,218,164,139,144,139,142,140,154,145,148,143,143,146,144,141,140,142,142,142,142,142,142,142,142,142,142,142,141,143,142,141,141,141,142,143,143,142,144,141,141,142,143,141,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,173,173,172,172,171,171,170,171,166,123,124,122,123,123,121,122,145,189,188,196,186,184,186,171,177,217,220,178,137,183,171,171,171,171,171,171,171,171,171,171,172,172,172,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,172,172,169,170,171,169,172,170,167,165,163,160,158,156,157,160,180,182,185,185,192,213,197,192,187,187,188,189,187,188,187,189,185,175,168,173,214,222,220,220,222,216,192,186,187,179,167,157,157,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,155,158,159,154,158,156,157,157,157,157,157,157,157,157,156,156,156,156,155,156,158,157,188,203,173,192,182,171,156,152,147,146,143,143,147,152,184,211,214,147,141,142,140,140,141,156,145,141,140,144,147,145,141,142,142,142,142,142,142,142,142,142,142,142,142,141,141,143,140,141,141,143,143,141,143,142,141,141,141,141,141,140,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,173,173,172,172,171,171,170,169,172,125,124,122,122,124,124,121,147,188,187,188,186,183,183,177,192,220,223,189,127,162,168,171,171,171,171,171,171,171,171,171,172,172,172,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,170,169,168,171,170,169,168,168,166,164,162,159,160,159,162,162,175,185,184,184,204,221,218,204,187,193,193,189,188,188,188,182,166,142,138,156,216,222,211,195,213,212,188,195,186,184,175,156,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,156,155,156,155,167,157,156,157,157,157,157,157,157,157,157,156,156,156,156,155,158,155,157,201,198,163,177,180,170,151,151,149,146,143,145,143,147,172,210,214,150,140,141,143,141,140,145,142,137,141,142,143,144,143,142,141,142,142,142,142,142,142,142,142,142,142,141,140,142,143,143,140,142,141,142,140,141,141,139,140,142,142,139,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,174,172,172,172,171,171,170,169,170,123,126,124,123,124,123,124,160,191,188,191,195,193,186,179,203,221,225,178,126,167,174,171,171,171,171,171,171,171,171,171,172,172,172,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,169,170,171,175,168,169,171,168,168,163,161,160,166,159,159,159,182,189,183,187,208,221,223,216,194,213,217,207,190,191,181,150,137,125,123,134,187,206,193,187,192,188,182,196,195,189,176,159,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,159,162,163,157,158,159,157,157,157,157,157,157,157,156,156,156,156,156,157,155,168,199,165,161,171,187,175,152,152,149,149,144,145,140,143,153,180,189,160,145,141,141,142,141,140,153,145,146,145,152,143,142,141,142,142,142,142,142,142,142,142,142,142,142,144,153,140,141,145,143,139,142,140,138,142,140,141,143,142,141,143,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,174,173,172,172,171,171,170,171,172,125,121,124,122,125,123,124,159,188,184,188,190,192,187,176,194,222,223,169,140,177,168,171,171,171,171,171,171,171,171,171,172,172,172,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,170,175,180,162,171,173,171,165,171,164,160,160,163,185,190,184,185,180,186,181,211,221,221,225,219,220,222,222,218,220,176,126,123,121,123,125,147,181,189,187,185,185,183,187,190,191,183,157,157,157,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,156,151,138,155,156,156,157,157,157,157,157,157,157,156,156,156,156,156,156,156,167,164,160,152,169,185,167,154,152,149,149,144,144,143,145,144,158,188,178,154,147,141,144,142,142,147,140,141,144,155,144,141,143,142,142,142,142,142,142,142,142,142,142,142,142,146,143,150,146,144,142,143,141,139,147,140,143,141,141,141,141,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,174,173,172,172,171,171,171,172,172,130,119,122,123,125,123,122,149,188,187,188,186,189,184,168,175,201,182,176,164,170,169,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,172,180,210,145,142,149,161,183,177,166,162,162,160,183,186,191,186,185,185,184,215,222,220,222,223,223,224,223,223,224,161,121,121,120,123,126,151,183,183,184,184,184,183,187,184,187,190,176,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,158,160,152,159,156,157,157,157,157,157,157,156,156,156,155,156,156,156,155,160,163,152,157,162,171,173,158,151,150,148,146,143,144,145,141,142,150,189,164,155,144,145,140,142,145,142,142,141,139,139,142,143,143,142,142,141,141,142,142,142,142,142,142,141,141,142,144,151,140,142,149,141,148,142,151,140,142,140,153,156,140,170,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,174,174,171,170,172,174,173,174,172,133,126,121,123,122,124,132,153,188,188,188,184,192,176,170,168,177,176,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,170,168,169,169,170,207,199,129,123,124,166,187,190,171,180,175,173,188,188,189,184,186,186,181,212,222,224,221,225,221,223,223,225,205,137,125,122,124,123,134,169,185,180,187,185,186,185,185,180,189,191,170,159,155,156,157,157,157,157,157,157,157,157,157,157,157,157,156,157,155,156,155,158,157,156,158,162,165,158,157,156,156,155,155,157,156,155,157,156,155,156,155,159,172,159,155,153,148,150,147,145,144,145,143,140,146,169,154,143,146,144,142,149,151,142,142,142,142,142,144,139,141,142,144,140,141,142,142,142,141,144,143,144,143,145,154,144,142,141,140,148,144,142,142,141,141,140,140,151,149,167,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,173,173,171,171,171,173,170,171,157,130,124,122,122,137,143,178,187,189,189,186,190,186,173,169,168,172,171,170,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,172,170,170,172,185,219,168,123,121,126,170,188,183,190,212,186,193,185,188,187,191,190,184,182,199,224,223,221,225,221,221,221,221,177,129,121,120,122,122,140,180,185,182,186,186,184,186,184,186,188,193,170,161,156,156,157,157,157,157,157,157,157,157,157,157,157,157,155,159,154,164,160,158,155,156,155,161,178,160,157,156,156,155,154,156,155,155,159,157,155,157,154,156,156,162,154,153,152,148,147,144,144,143,142,141,140,145,148,137,144,147,153,157,161,143,142,142,142,143,149,146,141,142,143,141,142,142,142,142,141,141,144,155,143,143,148,141,142,140,145,144,141,142,142,141,142,142,144,143,166,174,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,173,172,173,172,173,168,172,168,167,128,124,122,123,129,171,180,191,189,187,186,185,190,188,181,167,171,169,172,170,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,173,172,170,175,213,212,147,127,121,125,165,187,185,190,215,193,184,187,192,185,191,198,182,185,185,204,208,223,223,222,223,223,206,145,122,121,121,120,131,164,187,186,185,184,186,183,186,185,184,186,189,181,159,155,156,157,157,157,157,157,157,157,157,157,157,157,157,156,159,154,161,162,157,156,161,156,156,181,159,157,156,156,155,154,157,155,154,160,159,156,156,156,150,151,152,156,152,151,146,146,144,143,143,142,143,141,147,144,140,142,145,161,164,160,144,142,142,142,143,145,155,143,142,143,142,142,142,142,142,141,139,142,153,144,142,142,140,142,141,143,142,142,142,142,142,141,144,169,190,208,175,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,174,173,172,173,170,167,165,166,124,127,126,121,133,184,190,188,187,187,188,188,188,191,180,170,169,171,173,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,170,171,172,182,217,199,152,123,124,125,155,186,191,192,214,189,185,186,188,185,187,192,186,184,182,176,180,214,222,222,222,220,174,124,121,122,123,120,137,178,185,185,186,184,185,183,185,185,184,191,187,188,169,155,156,157,157,157,157,157,157,157,157,157,157,157,157,156,157,157,157,158,157,157,160,162,158,178,159,157,156,156,155,155,158,155,156,154,159,157,155,152,145,154,154,153,150,148,149,146,144,143,143,142,143,143,149,146,144,143,147,160,167,170,144,142,142,142,142,142,150,143,143,142,142,141,142,142,142,142,140,140,147,152,141,141,141,142,144,141,141,141,142,142,142,141,148,179,221,225,167,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,174,173,173,172,178,173,166,169,165,146,152,133,123,140,185,187,187,189,188,188,186,187,191,172,173,168,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,170,172,178,185,197,177,160,121,120,123,146,187,187,191,213,187,187,186,187,186,188,187,192,186,178,170,169,187,213,218,215,201,142,118,122,123,123,121,128,160,182,182,184,185,185,183,183,185,192,192,188,189,171,157,155,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,158,170,161,156,167,158,157,156,156,155,155,156,156,162,161,158,157,159,149,150,157,157,153,156,150,147,146,144,143,143,141,143,141,148,148,142,141,145,167,191,167,145,142,142,142,142,142,139,141,142,142,140,141,142,142,142,142,143,140,148,154,142,142,143,142,143,142,140,141,142,142,142,144,147,150,181,177,167,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,173,171,172,172,169,167,172,172,170,171,168,138,124,150,191,184,187,188,188,189,188,185,179,168,169,173,172,169,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,170,173,170,185,182,170,158,126,122,130,146,184,185,194,218,191,186,187,185,187,188,186,190,188,181,170,168,171,187,198,193,171,127,121,123,122,122,122,118,141,182,183,183,185,186,184,182,188,193,184,188,188,171,156,154,157,157,157,157,157,157,157,157,157,157,157,157,158,158,156,157,157,155,160,188,168,157,157,155,157,156,156,155,155,156,156,161,160,155,156,156,149,152,152,153,155,158,148,148,146,144,143,143,141,143,143,141,148,137,140,143,164,200,157,144,142,142,142,142,140,140,141,145,148,144,148,142,142,142,142,143,142,145,146,142,143,144,142,140,142,140,145,141,142,142,147,154,142,164,151,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,175,174,170,168,172,169,175,171,172,171,172,147,123,152,200,179,187,189,189,171,189,187,179,175,171,171,173,169,170,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,172,169,168,186,172,171,164,127,145,162,168,189,189,202,228,203,189,188,187,188,188,186,192,189,189,170,165,170,169,173,171,160,126,124,123,120,122,120,119,144,183,186,184,184,184,185,183,191,185,187,189,188,181,161,156,156,157,157,157,157,157,157,157,157,157,157,157,158,156,156,156,154,158,162,186,172,161,156,155,157,156,156,155,155,157,155,156,157,156,154,152,160,152,157,155,151,173,170,146,146,143,143,143,141,142,142,142,140,150,146,152,160,167,154,141,142,142,142,143,143,145,142,144,150,146,151,142,142,142,142,141,144,140,142,142,141,141,141,141,142,141,146,141,142,142,146,144,146,148,148,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,176,178,176,172,174,180,178,172,170,173,172,173,172,164,139,143,169,186,193,169,178,203,188,170,170,170,170,170,171,170,170,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,171,171,171,171,171,171,171,171,170,170,170,170,176,172,171,167,172,170,191,185,191,184,183,191,190,209,224,210,186,184,185,188,184,188,188,191,176,168,165,166,168,168,169,164,133,121,121,121,122,121,121,133,182,182,182,185,184,179,197,181,177,186,187,182,183,157,160,156,157,157,156,156,157,157,157,157,157,157,157,157,156,157,156,157,157,167,188,185,159,158,158,157,157,156,155,155,154,154,158,157,156,155,156,162,155,154,154,162,177,178,154,150,144,143,141,141,142,142,141,143,152,147,155,148,147,147,141,142,142,142,142,142,142,142,142,142,142,142,142,142,148,140,141,142,141,142,142,141,141,141,141,142,141,141,141,142,140,145,141,140,147,144,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,177,173,171,174,174,190,192,172,171,170,173,171,170,169,163,156,161,183,176,227,242,189,164,171,171,174,170,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,171,171,170,172,169,163,172,172,173,173,206,218,205,184,189,195,190,216,224,211,187,190,187,189,187,188,189,193,178,168,172,166,166,167,168,165,134,124,120,121,122,122,122,125,169,185,186,185,187,206,217,163,166,164,176,192,183,158,154,156,155,155,155,156,157,157,157,157,157,157,157,157,157,157,157,156,162,173,184,188,157,157,157,158,157,156,155,154,154,155,161,156,156,156,149,156,157,160,157,185,222,205,185,157,144,143,143,142,142,142,140,143,150,145,155,159,148,144,141,142,142,142,142,142,142,142,142,142,142,142,142,141,145,141,142,142,142,142,142,142,142,142,142,142,142,145,156,144,147,158,159,147,148,145,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,179,177,174,177,175,213,199,172,173,170,172,171,171,170,173,172,167,167,193,226,170,179,174,172,170,170,170,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,171,170,173,175,178,171,166,180,181,215,226,214,190,186,184,184,189,217,204,187,186,186,185,191,187,187,189,172,163,168,165,165,167,167,167,134,121,122,123,122,122,122,121,154,186,187,184,184,195,221,161,159,158,161,165,163,167,153,159,156,155,156,157,157,157,157,157,157,157,157,157,157,157,157,154,166,187,186,188,158,155,157,158,157,156,156,156,154,155,163,156,156,156,154,157,159,154,159,213,222,213,192,178,143,145,140,142,142,142,140,143,148,148,159,217,185,145,143,142,142,142,142,142,142,142,142,142,142,142,142,141,140,143,142,142,142,142,142,142,142,142,142,142,142,141,148,143,142,146,150,141,147,140,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,178,174,171,175,182,219,209,176,170,170,171,172,172,170,170,173,172,172,167,166,177,172,172,172,163,169,171,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,171,170,174,174,183,176,183,207,201,222,224,219,194,187,186,188,183,175,173,190,188,183,165,177,173,180,173,168,165,170,168,169,164,165,165,136,123,125,123,122,122,122,120,138,180,187,186,185,189,207,165,155,158,158,157,156,156,151,166,162,158,157,156,157,157,157,157,157,157,157,157,157,157,157,158,167,186,185,187,161,154,157,158,157,156,156,158,155,155,163,158,156,156,159,157,157,156,170,223,219,224,204,174,141,144,141,142,142,142,142,140,139,160,171,167,160,144,142,142,142,142,142,142,142,142,142,142,142,141,141,141,138,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,140,141,151,143,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,174,174,174,168,194,227,224,172,169,170,172,171,172,171,171,171,172,165,165,174,171,171,168,173,170,168,170,172,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,170,177,164,170,157,181,223,215,223,222,221,199,186,185,184,180,139,148,186,187,165,141,145,152,151,165,167,165,168,169,168,166,167,168,137,122,123,122,122,122,122,121,126,174,186,186,185,180,173,159,152,165,154,157,156,156,159,158,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,177,189,186,187,164,155,157,158,157,156,156,157,155,155,163,158,157,155,157,151,150,145,188,224,220,218,211,171,144,142,141,142,142,142,143,142,151,156,188,170,153,141,141,142,142,142,142,142,142,142,142,142,142,141,140,141,141,141,142,142,142,142,142,142,142,142,142,142,142,143,142,143,144,142,141,142,142,143,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,178,175,164,150,205,226,227,166,171,168,172,171,170,172,174,169,171,170,170,170,169,168,168,171,172,165,171,173,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,169,175,159,157,123,166,223,222,224,220,220,213,194,185,183,156,104,105,166,117,106,107,123,101,123,134,123,110,167,106,100,121,148,153,96,123,120,123,122,122,122,122,123,169,184,184,183,169,156,138,137,159,155,155,158,155,157,156,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,180,185,189,188,162,155,158,158,157,156,156,155,155,156,160,158,158,155,158,155,136,125,183,223,226,223,205,164,143,142,141,142,142,142,141,142,148,144,169,143,145,140,140,142,142,142,142,142,142,142,142,142,142,141,140,142,147,140,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,141,141,143,143,144,162,
192,178,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,176,170,149,169,194,209,223,174,172,168,173,171,171,171,173,168,172,172,171,170,171,170,170,173,169,171,171,173,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,171,170,168,148,144,125,185,225,223,222,222,221,223,213,188,185,137,92,52,108,48,70,83,119,67,98,69,111,55,135,51,47,54,100,105,66,123,120,121,122,122,122,122,124,165,184,182,181,167,161,128,126,131,144,157,159,155,159,157,156,156,156,156,157,157,157,157,157,157,157,157,157,157,157,155,188,185,188,189,157,156,158,158,157,156,156,155,154,156,156,157,157,155,164,149,123,122,144,176,201,210,196,151,144,144,142,142,142,142,141,142,149,157,153,140,142,142,141,142,142,142,142,142,142,142,142,142,142,141,140,142,152,140,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,142,140,141,139,141,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,176,179,178,175,174,178,178,168,170,165,191,192,192,225,178,175,169,172,171,170,170,170,168,172,172,170,170,172,172,170,173,171,161,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,172,176,174,171,174,170,172,165,131,122,125,192,223,223,221,223,222,221,223,203,186,165,136,26,26,58,72,84,121,65,85,34,153,54,98,103,110,79,25,27,85,121,120,122,122,121,121,122,124,172,186,175,167,162,160,125,122,123,130,141,161,156,160,155,157,158,157,157,157,157,157,156,156,156,156,156,156,159,154,159,190,187,187,189,157,158,158,158,157,156,157,155,155,155,156,156,157,155,159,131,124,123,123,131,167,192,196,147,144,142,140,142,142,142,141,146,165,161,145,143,141,142,142,142,142,142,142,142,142,142,142,142,141,141,140,142,155,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,140,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,176,178,176,178,181,181,177,175,173,172,176,186,179,185,199,171,174,170,172,171,170,171,172,172,170,171,172,172,170,169,170,172,173,165,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,170,170,174,170,173,170,171,165,134,120,130,190,220,223,223,223,222,222,222,222,217,210,202,59,58,71,69,21,56,63,19,30,160,55,80,135,163,138,55,64,102,121,120,124,122,121,121,123,121,150,182,167,158,156,157,127,123,123,127,125,135,159,161,157,158,157,154,156,157,157,157,156,156,156,156,157,158,158,156,170,190,191,187,186,159,155,156,158,157,156,157,156,156,156,156,157,157,161,161,132,123,124,127,125,169,185,179,147,143,141,143,142,142,142,142,144,163,153,141,142,142,142,142,142,142,143,142,142,142,142,142,142,141,140,141,139,145,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,175,179,175,171,165,177,174,166,181,182,162,184,169,166,172,168,170,171,171,170,171,170,172,169,169,171,170,172,171,170,170,172,174,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,167,171,172,172,169,171,170,138,127,147,176,177,175,175,175,195,221,223,224,226,223,226,87,57,97,69,56,97,64,62,47,122,55,84,134,161,146,55,70,118,121,121,123,122,121,121,124,119,137,167,173,159,160,158,119,120,129,120,125,125,130,159,158,155,154,156,156,157,157,157,157,157,157,157,155,156,157,160,184,187,191,186,183,164,160,160,158,156,155,157,156,156,156,154,158,160,157,168,133,123,124,128,135,180,195,151,149,143,143,143,142,142,142,144,150,161,152,141,142,142,142,142,142,142,143,142,142,142,142,142,142,141,141,145,143,144,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,178,178,175,170,187,183,171,179,175,176,185,175,175,173,173,170,170,171,171,172,173,171,170,173,172,171,171,172,171,170,171,168,174,176,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,173,166,175,168,169,172,175,161,156,167,172,169,169,169,169,197,220,222,221,223,221,222,126,30,108,73,77,112,63,83,59,103,57,114,80,94,95,61,57,123,121,121,120,122,121,121,122,121,138,169,159,156,155,171,134,140,157,131,117,126,123,161,162,158,155,159,157,157,157,157,157,157,157,157,158,156,156,156,187,184,189,185,189,184,162,158,157,156,155,156,156,156,156,155,160,162,162,166,126,122,120,121,147,186,179,149,141,142,141,142,142,142,142,142,146,160,158,146,142,142,142,142,142,142,143,142,142,142,142,142,142,141,141,141,139,149,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,176,173,181,183,185,187,171,180,178,185,199,171,175,170,171,172,170,173,172,171,172,170,172,172,170,171,171,171,169,170,171,162,174,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,172,181,174,178,170,170,170,171,168,168,169,168,169,169,170,170,207,222,221,223,220,221,223,158,38,118,78,17,30,72,20,19,128,71,156,43,37,149,82,74,121,122,122,120,122,121,121,122,122,125,157,163,154,155,176,161,178,186,163,128,124,131,161,163,155,153,155,156,157,157,157,157,157,157,157,157,157,157,163,186,184,189,187,189,189,170,159,157,155,155,156,156,156,156,156,162,172,164,156,121,139,134,124,169,188,156,147,143,144,139,142,142,142,142,139,144,165,156,146,142,142,142,142,142,142,143,142,142,142,142,142,142,141,141,144,138,156,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,180,176,176,187,180,185,180,183,169,168,186,193,199,171,174,172,173,171,171,170,169,168,171,172,175,171,171,171,170,169,168,168,173,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,170,169,171,172,171,171,170,170,171,168,170,170,170,172,208,223,222,223,224,224,225,202,111,125,111,102,103,109,100,106,143,148,166,154,155,168,152,144,121,124,124,121,122,121,121,122,124,120,139,162,155,161,181,185,186,191,179,141,125,126,171,171,163,160,154,155,157,157,157,157,157,157,157,154,157,157,174,188,189,188,186,190,187,181,167,157,156,156,156,156,156,156,158,161,167,170,133,127,160,162,143,183,177,151,146,145,141,144,144,142,142,142,141,144,164,156,141,142,142,142,142,142,142,143,142,142,142,142,142,142,141,140,142,142,153,139,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,176,179,183,184,185,189,174,173,170,180,193,192,172,170,171,169,171,171,170,170,170,172,171,175,165,172,170,165,169,170,163,169,172,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,170,170,172,171,171,171,174,168,168,170,170,169,169,172,211,224,223,223,222,225,224,208,130,125,122,123,128,125,128,122,138,169,170,167,165,169,169,161,122,123,125,123,122,121,121,123,124,126,144,156,157,165,183,188,184,185,182,167,153,151,168,170,165,162,157,156,157,157,157,157,157,157,157,156,157,156,171,188,190,186,187,188,191,185,175,157,156,157,156,156,156,156,158,163,172,167,131,122,155,183,184,183,178,146,148,150,142,143,142,142,142,142,142,141,172,154,141,142,142,142,142,142,142,143,141,141,141,141,141,142,141,141,143,147,147,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,176,177,177,170,188,187,187,187,182,183,169,178,177,169,184,181,180,172,172,169,171,171,173,173,174,174,172,172,162,171,170,162,172,172,175,170,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,170,173,171,172,170,171,169,170,172,169,170,170,169,171,170,172,211,223,223,221,220,224,226,200,154,128,121,124,125,125,122,121,136,169,170,168,167,168,172,165,122,124,124,124,122,121,122,125,121,133,156,159,158,167,184,185,187,184,185,182,185,183,181,172,169,165,157,157,157,157,157,158,157,157,158,156,156,160,174,187,188,187,188,186,189,187,182,158,156,155,154,155,156,155,160,166,173,167,134,124,161,184,185,189,159,147,148,183,147,140,139,142,142,142,141,151,170,148,141,142,142,142,142,142,142,142,141,141,141,141,141,142,141,141,141,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,178,177,175,180,187,189,188,188,184,177,175,178,176,169,179,183,181,173,172,171,172,171,171,172,176,173,176,169,157,168,169,171,171,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,172,172,170,172,170,170,170,170,170,168,168,171,170,172,213,222,222,223,222,223,222,192,180,146,122,124,125,123,124,124,130,167,170,170,167,172,178,174,127,124,121,124,123,121,123,125,122,136,157,156,160,176,183,184,185,185,185,185,183,186,187,177,168,169,157,155,157,157,157,157,157,157,157,158,155,161,178,187,188,188,188,188,188,188,187,171,163,155,155,155,155,157,165,173,169,170,145,140,178,184,184,191,154,148,150,192,148,143,142,143,143,141,140,148,146,145,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,143,146,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,179,177,173,184,176,166,167,181,187,175,176,178,176,177,180,189,179,172,170,168,170,171,171,169,176,169,171,169,167,171,168,169,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,172,172,171,171,170,172,167,168,168,169,169,171,171,175,215,223,222,223,223,222,206,188,188,172,135,121,122,123,124,123,127,167,170,171,170,179,185,182,143,124,121,123,121,121,120,123,123,140,157,156,164,188,185,186,185,185,185,184,184,186,184,185,176,168,163,156,157,157,157,156,156,156,156,159,155,160,185,188,188,188,188,188,188,188,188,183,173,161,159,157,155,165,168,172,167,171,165,166,186,184,187,194,155,150,150,158,147,139,141,142,142,142,143,141,147,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,147,151,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,177,181,173,182,175,181,189,179,178,177,177,177,170,176,183,177,172,171,168,173,171,168,173,180,170,172,173,169,169,170,171,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,172,172,170,172,169,172,172,171,175,170,169,171,171,177,216,223,222,221,223,215,188,188,188,187,160,124,123,123,124,124,143,174,167,172,179,183,186,186,155,124,126,125,122,122,122,124,125,143,160,163,178,185,187,186,185,185,185,185,185,183,184,187,178,165,163,159,157,157,157,155,155,156,156,161,164,155,190,187,188,188,188,188,188,188,187,183,185,163,153,153,153,161,169,166,170,172,172,178,186,183,194,192,173,145,154,171,144,143,141,139,139,138,142,146,151,145,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,145,146,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,174,176,176,176,165,162,190,184,183,180,175,174,177,179,174,176,176,165,166,172,169,170,171,170,168,184,174,175,172,173,177,172,171,171,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,172,172,169,175,173,165,194,189,186,167,169,170,170,176,217,222,223,222,221,197,185,189,185,191,181,141,124,123,123,123,150,170,169,177,185,182,183,182,147,124,127,126,123,123,125,122,121,145,160,170,187,183,184,186,185,185,185,184,185,183,184,186,183,171,167,160,157,157,157,155,155,157,157,156,169,159,188,187,188,188,188,188,188,188,188,185,189,155,164,158,153,162,168,167,171,170,173,201,204,185,193,184,190,152,155,150,153,144,145,144,142,143,141,144,144,139,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,143,142,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,175,177,176,174,173,188,182,184,183,179,178,176,178,177,177,174,173,170,171,172,166,172,170,179,173,177,173,170,170,175,172,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,172,172,169,173,174,164,185,181,186,170,170,170,170,177,220,222,223,221,209,187,187,188,186,187,189,173,136,122,121,129,148,162,176,180,184,184,183,187,196,196,193,195,192,192,196,172,125,149,156,167,180,182,185,185,185,185,185,185,184,184,187,193,185,169,169,156,157,157,157,156,156,157,158,186,186,167,190,188,188,188,188,188,188,188,189,189,182,157,172,158,166,161,172,171,170,166,189,222,211,200,184,185,223,205,198,219,160,156,142,143,144,142,143,142,140,142,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,142,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,179,177,180,186,183,181,182,187,180,178,175,177,176,177,174,173,174,172,171,172,170,173,191,172,174,172,173,170,170,170,170,170,171,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,172,172,172,171,172,171,172,176,184,190,173,170,170,170,180,221,222,222,211,194,188,187,188,188,186,187,189,170,133,132,161,169,176,185,184,184,186,185,187,215,223,219,223,223,222,225,209,151,158,159,167,183,185,184,181,185,185,185,183,187,205,220,220,174,170,168,157,157,157,157,158,156,157,159,166,189,176,182,188,188,188,188,188,188,188,188,190,192,191,167,138,151,165,171,170,170,169,199,220,226,225,199,195,221,225,224,214,227,219,166,145,143,144,144,152,144,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,141,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,176,177,177,172,180,178,176,185,186,183,183,187,176,176,177,176,177,175,174,174,176,172,168,172,167,168,177,169,171,172,175,175,171,171,169,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,174,170,174,171,185,186,173,172,170,170,181,221,222,219,198,187,188,187,188,189,189,186,189,190,166,164,182,186,188,186,186,186,187,185,187,219,224,222,223,222,221,222,218,174,164,161,174,186,188,185,186,183,185,185,183,189,213,221,223,179,169,159,157,156,156,157,159,157,158,162,180,189,189,186,187,188,188,187,187,187,188,189,187,184,188,149,124,138,181,172,170,170,180,211,223,222,220,219,221,220,222,225,224,227,217,226,186,150,142,145,165,147,141,140,142,141,140,141,142,142,142,142,142,142,142,142,142,142,142,143,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,177,179,175,165,179,176,174,185,185,185,185,185,180,175,177,177,177,176,175,173,173,173,171,169,171,172,173,168,174,171,178,167,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,169,184,184,182,171,171,170,180,222,220,206,189,188,188,188,188,187,188,188,188,193,192,185,185,185,185,185,185,185,185,185,190,223,224,223,223,223,222,222,213,168,160,158,181,185,185,185,186,182,184,184,186,192,199,200,217,191,165,157,158,157,157,157,158,156,161,173,191,191,187,187,187,188,188,187,185,187,189,189,187,187,182,134,123,158,188,176,170,171,196,219,223,223,223,223,223,223,223,223,223,223,223,221,222,168,146,148,171,147,141,140,142,140,139,142,142,142,142,142,142,142,142,143,142,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,180,175,163,177,177,183,185,185,185,185,184,183,180,178,177,177,176,175,173,173,173,170,173,170,170,169,169,172,178,177,165,168,173,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,170,182,186,180,171,170,171,183,221,212,192,187,188,188,188,188,187,188,188,189,194,187,185,184,185,185,185,185,185,185,185,190,221,224,224,223,224,222,221,205,158,161,173,184,185,185,185,184,185,181,183,186,182,161,162,205,190,161,155,159,158,157,156,157,155,166,183,187,194,187,188,188,188,188,187,186,187,187,186,188,189,170,124,122,152,188,181,171,177,210,222,223,223,223,223,223,223,223,223,223,223,223,223,224,196,147,140,163,148,141,141,142,141,144,142,142,142,142,142,142,142,142,143,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,178,179,176,173,178,175,187,185,185,185,185,182,184,177,177,177,177,176,175,173,173,173,170,173,172,170,170,172,166,167,163,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,171,179,188,180,172,170,170,180,214,194,187,186,187,188,188,188,187,187,187,191,187,182,185,185,185,185,185,185,185,185,185,190,221,223,224,222,225,221,219,190,158,170,181,184,185,185,185,185,185,186,181,184,165,158,159,186,183,163,162,161,157,156,158,160,158,179,183,186,193,187,189,188,188,188,188,188,186,186,187,190,188,165,130,153,168,189,185,171,174,214,223,223,223,223,223,223,223,223,223,223,223,223,224,221,217,165,145,147,143,142,142,140,141,145,142,142,142,142,142,142,142,142,143,146,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,176,177,181,176,177,183,188,185,185,185,184,180,185,174,178,177,177,176,175,173,173,173,171,172,171,174,167,176,179,190,169,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,170,173,191,182,177,174,171,172,197,187,187,186,188,188,188,188,187,187,188,192,185,185,187,186,185,185,185,185,185,185,185,191,222,223,222,222,224,222,221,178,161,169,184,182,185,185,185,185,184,187,186,183,148,157,158,168,172,164,152,141,154,175,178,177,175,184,185,194,191,187,188,188,188,188,188,188,189,189,187,186,188,162,148,185,188,191,187,168,171,211,222,223,223,223,223,223,223,223,223,223,223,223,218,223,225,206,149,142,142,139,141,139,141,140,142,142,142,142,142,142,142,142,142,149,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,175,173,180,165,184,187,185,185,185,185,182,187,169,176,177,177,176,175,173,173,173,169,171,170,173,146,165,181,178,169,172,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,171,166,186,186,179,176,176,180,189,188,185,187,188,188,188,188,188,187,187,193,185,186,184,186,185,185,185,185,185,185,185,191,223,221,221,223,224,224,215,174,162,178,183,188,185,185,185,184,180,186,195,171,154,157,157,159,164,143,127,131,146,180,187,183,188,186,179,190,188,187,189,188,188,188,188,188,188,190,190,185,188,176,181,189,186,187,186,170,170,205,221,223,223,223,223,223,223,223,223,223,223,223,220,224,217,214,149,139,142,140,142,144,149,139,142,142,142,142,142,142,142,142,144,149,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,178,175,164,179,180,186,181,185,185,185,186,185,175,148,176,177,177,176,175,173,173,173,172,173,169,174,136,152,168,164,174,171,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,171,171,172,165,174,188,186,181,184,185,188,188,186,187,187,188,188,188,188,187,187,193,183,183,183,185,185,185,185,185,185,185,185,191,222,221,221,221,220,226,202,162,166,189,183,185,185,185,185,186,182,187,188,164,157,156,161,159,184,126,123,122,128,167,185,183,184,183,194,187,186,187,188,188,188,188,188,190,187,186,187,177,177,194,188,190,188,186,188,178,172,205,221,223,223,223,223,223,223,223,223,223,223,223,220,221,224,207,143,142,143,141,142,143,149,141,142,142,142,142,142,142,142,142,141,146,140,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,177,181,174,174,190,182,184,184,184,183,186,176,137,174,177,176,176,174,173,173,173,171,171,174,166,130,162,174,168,170,171,171,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,171,171,170,170,172,169,189,189,185,190,188,187,187,188,186,188,188,188,188,188,187,188,193,185,184,184,183,184,184,185,184,185,184,184,191,220,222,222,221,223,224,205,174,171,186,184,187,185,184,184,186,183,186,173,157,160,156,133,132,138,123,124,123,133,177,188,187,183,182,185,192,190,190,187,187,187,188,188,191,191,183,174,174,173,191,191,193,196,186,188,186,185,217,223,223,223,223,223,223,223,223,223,223,223,223,225,225,221,216,152,143,141,142,144,141,149,146,142,142,142,142,142,142,142,142,140,153,140,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,141,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,167,174,173,176,181,184,184,184,183,183,184,185,165,136,165,179,175,175,173,176,176,173,171,174,167,167,126,168,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,173,169,168,167,158,176,164,182,183,180,185,185,190,188,187,188,187,188,188,188,188,188,184,193,184,184,184,186,185,182,184,184,187,180,185,189,222,223,220,217,224,221,196,188,178,186,184,183,185,183,184,186,183,187,162,159,155,133,122,122,124,124,124,121,141,180,182,184,184,182,183,185,192,186,188,187,188,189,189,185,170,169,188,210,218,216,202,213,203,188,186,195,204,222,221,223,223,223,223,223,223,223,223,223,223,223,222,222,224,222,176,143,141,142,141,144,140,145,142,142,142,142,142,142,142,142,144,147,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,140,140,140,143,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,179,180,171,167,170,181,185,186,186,186,187,186,183,150,123,145,166,177,175,176,172,173,169,170,171,172,169,128,169,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,172,170,174,160,166,176,170,169,143,123,171,187,188,189,186,188,187,188,188,188,188,187,185,194,186,185,184,186,188,185,184,183,184,185,187,190,220,221,223,226,220,200,160,145,164,182,184,183,185,185,185,182,188,205,156,160,131,129,121,124,124,124,124,130,177,187,188,184,183,182,185,186,188,190,188,188,189,186,185,178,171,184,215,221,222,225,223,224,217,200,193,212,222,222,223,223,223,223,223,223,223,223,223,223,223,223,222,224,222,222,183,144,143,141,141,141,144,150,140,142,142,142,142,143,142,142,142,141,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,143,147,143,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,156,169,170,189,185,189,185,188,180,179,182,140,122,125,142,173,176,169,169,165,175,168,168,174,166,128,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,172,170,175,171,171,171,167,170,166,127,152,184,187,186,189,188,187,188,188,188,188,187,187,194,187,185,183,185,186,181,185,186,183,184,187,194,222,226,224,222,222,183,197,133,151,186,186,182,184,183,183,180,200,208,165,156,123,124,124,125,124,124,124,141,185,186,191,184,184,183,186,185,183,190,188,189,189,187,184,171,182,211,226,223,224,225,223,223,223,218,214,222,222,223,222,223,223,223,223,223,223,223,223,223,223,223,224,227,217,219,196,144,141,141,145,141,150,153,141,142,142,142,141,143,142,142,141,139,138,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,143,143,141,141,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,176,171,209,177,187,183,187,183,186,158,150,160,130,126,120,125,147,151,146,136,141,172,172,170,169,152,129,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,173,171,168,169,169,173,175,169,173,141,128,155,169,186,189,189,188,188,188,188,188,187,189,194,185,185,183,185,186,181,185,188,186,184,186,207,223,223,221,223,224,189,216,132,162,188,184,185,185,181,179,169,184,195,159,148,127,127,120,126,124,124,124,152,174,177,184,184,186,186,184,185,184,188,188,187,190,188,195,187,207,224,224,224,226,223,222,223,223,223,224,223,222,223,222,223,223,223,223,223,223,223,223,223,223,223,222,222,222,217,167,140,142,140,143,142,158,154,142,142,142,142,141,141,142,141,142,143,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,142,141,142,141,141,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,176,187,222,183,184,180,189,185,184,142,126,131,122,126,123,124,123,124,120,125,136,164,166,159,140,127,128,169,170,172,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,174,172,172,168,168,171,177,170,170,144,123,125,141,178,188,189,187,188,188,188,188,186,189,191,183,183,183,185,183,185,174,174,188,180,184,207,221,222,223,222,219,214,211,127,171,190,182,184,187,182,177,167,177,166,133,126,123,124,122,124,124,124,124,143,167,167,170,184,186,186,184,184,186,186,189,185,187,196,214,213,223,222,221,224,224,221,222,224,223,223,224,224,226,224,223,223,223,223,223,223,223,223,223,223,223,223,222,221,226,216,145,141,142,143,140,142,162,159,142,142,142,142,141,141,143,141,143,144,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,140,141,141,142,141,141,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,178,183,184,194,189,182,180,183,187,175,135,122,122,124,123,125,122,122,127,121,122,129,134,135,134,126,120,126,168,170,172,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,173,170,173,171,170,170,174,171,172,149,118,120,129,154,189,188,187,188,188,188,188,186,189,187,184,183,185,187,184,169,163,162,179,185,187,206,223,195,187,197,213,189,174,120,174,187,183,183,184,179,173,167,171,135,122,121,121,118,128,123,124,124,124,135,171,170,167,180,184,185,184,184,186,188,189,186,188,212,223,222,223,223,221,223,225,223,221,222,223,223,223,224,223,223,222,223,223,223,223,223,223,223,223,223,223,223,224,226,226,217,147,143,139,142,144,143,156,158,142,142,142,142,142,141,147,142,141,143,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,140,142,139,140,141,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,183,173,176,185,162,158,165,184,157,125,124,125,126,119,126,126,123,119,128,125,124,121,120,125,124,122,127,168,169,172,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,173,173,173,172,169,169,172,168,171,171,171,170,160,127,123,121,139,185,188,187,188,188,188,188,185,189,185,187,182,185,188,176,162,158,162,181,186,192,177,183,164,156,170,182,162,148,128,186,188,185,182,176,171,167,167,167,126,123,125,127,127,123,125,124,124,124,151,171,168,171,174,183,185,184,184,185,192,190,186,200,220,224,222,224,224,224,222,221,223,223,221,221,221,221,223,222,222,222,223,223,223,223,223,223,223,223,223,223,223,221,225,221,187,146,143,142,141,138,141,145,148,142,142,142,142,142,142,151,143,139,144,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,142,141,146,142,141,141,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,179,179,177,177,180,183,179,143,127,125,127,146,136,124,119,125,127,124,126,123,125,123,124,124,123,122,122,125,121,126,120,151,174,170,170,171,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,172,171,170,169,169,171,170,171,171,167,134,120,122,127,144,184,186,187,189,191,189,188,186,172,178,191,186,177,159,156,156,160,178,190,164,167,159,156,155,157,160,155,151,162,192,194,189,179,169,170,169,171,161,125,123,124,124,124,123,124,124,125,134,168,171,170,169,170,174,181,186,185,185,182,191,187,202,220,222,222,223,223,223,222,222,222,223,222,222,222,222,223,222,222,222,223,223,223,223,223,223,223,223,223,223,223,220,224,215,159,140,141,144,140,136,141,139,143,141,139,141,146,144,155,148,142,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,142,142,141,142,142,142,141,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,179,178,181,174,180,148,130,123,122,122,130,126,122,127,123,122,122,121,125,127,122,124,122,123,124,121,124,119,122,123,126,161,175,169,169,173,171,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,172,171,171,172,172,171,171,171,168,172,144,123,121,127,118,138,185,187,187,185,187,187,183,170,177,169,158,167,156,157,157,159,166,161,161,159,156,155,158,156,158,157,157,177,215,200,178,169,168,169,171,162,145,123,124,124,124,124,124,123,124,124,134,169,170,170,169,170,172,180,185,183,186,190,190,185,195,222,222,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,222,222,182,148,142,141,144,151,143,144,142,155,148,146,140,137,138,151,142,138,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,176,168,177,143,127,121,128,125,126,128,120,123,126,126,121,124,122,123,123,124,123,120,127,120,127,125,121,126,126,128,128,127,170,172,172,171,173,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,173,171,170,174,173,171,171,171,169,170,166,140,126,126,126,170,190,186,185,187,188,185,180,170,167,152,154,158,156,158,158,156,159,152,160,159,157,157,158,156,159,157,159,181,226,215,186,168,170,170,172,148,128,121,124,124,124,124,124,123,123,123,143,171,169,170,169,170,170,177,184,183,186,192,188,187,202,223,222,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,222,224,184,144,144,137,147,152,142,150,153,175,147,146,146,140,142,147,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,176,177,178,165,122,121,106,91,104,115,92,93,106,104,95,103,123,106,121,101,120,120,97,104,108,116,114,108,111,95,102,123,120,138,165,174,169,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,172,170,169,171,172,171,171,171,173,169,172,165,136,125,128,168,190,190,188,187,188,185,178,170,163,156,157,157,158,157,157,157,157,160,154,156,156,158,156,156,159,157,157,183,225,226,211,183,170,170,170,135,122,123,124,124,124,124,124,124,123,124,152,172,168,169,170,169,168,174,183,184,190,192,186,188,216,222,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,225,204,153,142,143,143,144,144,140,148,151,149,150,150,147,146,143,146,143,144,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,178,175,163,130,123,123,51,25,40,91,18,33,76,37,27,55,123,56,101,23,112,82,32,36,58,92,71,73,62,24,32,111,122,123,140,168,173,166,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,172,170,169,170,171,171,171,171,170,170,171,169,134,121,127,168,186,187,187,186,188,185,178,170,158,158,157,158,158,157,157,157,157,157,156,160,155,156,157,154,160,160,158,183,221,225,225,201,169,170,169,129,121,125,124,124,124,124,124,124,123,123,147,174,169,168,170,170,168,173,183,186,193,193,186,195,220,222,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,163,144,140,140,144,154,156,147,144,147,132,146,129,140,152,146,142,140,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,178,176,152,125,124,124,57,87,55,73,46,107,114,47,95,110,121,51,74,24,111,41,90,53,36,88,39,107,61,83,57,84,127,119,128,147,173,169,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,172,170,171,172,171,171,171,171,168,169,169,168,150,142,150,169,191,188,185,185,188,187,179,170,162,157,155,158,157,157,157,156,157,157,155,168,157,156,157,154,161,162,159,183,221,221,220,204,171,171,171,128,122,124,123,124,124,124,124,123,123,122,138,176,174,168,170,169,169,171,182,187,186,192,197,211,221,225,222,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,221,144,142,139,144,143,166,172,154,140,148,143,137,129,119,134,146,142,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,176,179,141,126,126,124,56,100,77,62,34,74,110,50,108,124,122,55,52,44,110,39,114,83,22,41,27,120,65,98,86,76,126,123,126,128,160,173,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,173,173,173,172,171,170,171,171,171,171,171,171,169,172,172,162,171,171,168,177,180,188,189,187,188,181,170,169,157,155,159,157,158,157,157,157,159,162,163,156,158,157,161,160,158,158,185,222,222,222,205,171,170,169,129,124,124,124,123,124,124,124,124,123,123,138,182,179,169,170,170,170,170,183,187,186,196,214,220,223,223,222,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,221,149,142,141,142,143,176,185,162,141,145,154,148,135,124,124,140,144,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,176,181,129,123,123,121,60,100,78,61,22,55,103,51,106,125,123,50,47,58,111,38,116,81,20,40,39,98,63,100,89,75,122,126,123,125,159,174,171,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,171,172,172,172,171,171,172,171,171,171,171,171,171,171,171,170,168,172,173,169,175,179,169,163,167,177,184,184,187,183,170,163,155,158,164,156,157,159,157,157,161,162,156,158,164,158,163,161,152,165,177,222,225,225,214,175,172,154,125,124,124,130,150,129,127,126,122,122,127,160,188,184,175,171,172,170,172,179,184,190,210,221,222,224,219,222,222,222,222,221,222,222,221,223,223,224,222,222,223,223,223,223,223,223,223,223,223,223,223,223,223,222,223,225,166,152,140,142,148,177,183,151,141,142,143,146,147,126,120,139,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,183,128,124,125,123,60,102,60,70,46,107,119,50,108,128,124,32,62,65,113,38,104,51,36,87,65,82,60,99,62,86,123,126,125,130,160,172,172,170,170,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,172,173,172,175,177,171,172,172,171,171,171,171,171,171,169,172,170,171,200,199,190,170,164,163,164,168,174,175,171,161,165,158,157,157,156,156,155,157,162,160,158,156,155,170,180,174,176,180,175,179,192,196,204,212,191,183,135,121,129,124,153,160,149,121,121,123,130,155,182,186,189,183,174,167,171,167,159,176,195,221,223,224,223,225,222,224,223,224,222,222,223,222,224,222,222,223,222,223,223,223,223,223,223,223,223,223,223,223,220,224,223,196,176,204,166,140,140,148,180,170,146,142,142,142,141,142,135,122,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,173,177,186,139,123,124,123,48,17,29,98,12,23,86,49,109,128,122,25,89,63,113,78,21,34,64,16,15,100,60,16,21,111,124,124,123,124,142,167,169,169,171,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,171,171,171,169,174,176,171,172,172,171,171,171,171,171,171,172,172,172,208,216,217,221,183,167,163,160,162,159,159,160,159,160,164,145,143,156,152,155,159,172,178,160,157,159,177,188,183,181,185,180,184,184,182,185,192,185,181,124,123,119,149,162,157,172,147,124,139,164,181,185,187,186,190,192,140,144,171,134,145,190,225,225,223,84,222,135,174,139,42,144,114,96,226,120,188,224,222,222,223,223,223,223,223,223,223,223,223,223,223,223,226,217,161,148,171,156,152,155,156,184,160,143,142,142,142,142,157,142,134,145,140,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,178,181,135,122,125,126,101,87,107,117,86,85,106,106,119,122,121,96,120,103,116,124,99,102,102,81,93,122,103,84,105,128,122,126,123,124,138,163,171,170,171,170,169,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,174,176,175,175,174,171,171,172,171,171,171,171,171,171,171,173,171,212,227,222,222,223,181,159,156,160,158,156,156,153,159,162,162,156,158,159,153,155,168,183,169,158,164,188,183,184,182,179,183,182,186,187,187,185,186,168,122,121,142,155,161,155,162,189,173,174,187,188,188,187,188,200,189,129,128,155,132,148,202,227,223,223,60,161,67,198,45,133,57,97,45,155,74,209,221,224,223,223,223,223,223,223,223,223,223,223,223,223,221,225,160,149,143,142,145,145,162,188,172,146,141,142,142,142,140,148,158,137,147,140,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,180,177,175,125,122,122,122,124,127,121,123,122,124,120,123,121,122,125,127,125,124,124,121,127,125,123,124,123,122,125,125,125,120,125,123,121,125,136,156,170,174,170,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,168,166,160,166,173,170,173,172,171,171,171,171,171,171,172,172,169,205,223,223,220,221,180,159,161,160,154,156,158,156,156,157,158,159,167,158,156,159,169,193,167,158,177,188,187,185,188,189,187,190,184,183,184,182,189,156,151,137,165,158,153,161,159,188,194,188,188,190,188,189,206,224,210,152,128,146,163,201,223,224,223,220,102,20,24,221,160,188,56,98,43,20,58,221,224,220,222,223,223,223,223,223,223,223,223,223,223,223,223,228,144,144,149,148,137,153,174,188,158,140,142,142,142,142,145,139,144,126,145,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,180,176,174,124,122,122,128,122,122,124,123,124,123,126,127,126,125,130,122,128,123,123,124,123,122,126,126,122,123,127,126,124,124,123,125,122,128,137,153,162,174,170,171,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,171,173,172,172,173,171,172,172,171,171,171,171,171,171,169,169,172,204,222,220,221,220,176,160,168,160,159,159,155,153,154,154,154,151,157,157,159,157,209,190,162,156,167,189,185,183,183,182,180,186,184,184,184,184,186,167,206,168,171,155,153,159,169,187,186,187,189,187,188,207,220,224,224,191,161,175,171,216,225,221,223,226,139,143,73,223,138,42,115,104,79,133,103,220,223,222,222,223,223,223,223,223,223,223,223,223,223,223,218,226,171,150,152,166,143,156,186,162,148,146,143,142,142,142,142,140,138,132,145,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,177,177,130,124,123,124,123,121,124,122,122,123,123,123,123,125,123,123,123,123,126,124,121,122,124,125,124,125,122,121,123,126,123,123,126,127,127,131,145,172,169,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,171,171,171,173,171,170,172,171,172,171,171,171,171,171,171,170,170,173,199,222,221,221,222,179,160,163,157,158,157,152,152,158,156,160,163,149,159,162,176,219,176,154,155,165,177,189,186,183,185,181,184,185,187,183,184,192,197,223,182,171,163,156,163,179,189,190,187,186,186,202,221,224,223,223,218,211,201,173,199,217,219,221,221,176,83,103,219,59,144,165,101,110,79,137,222,222,222,222,223,223,223,223,223,223,223,223,223,223,223,224,223,225,158,153,197,173,178,184,164,141,142,141,142,142,142,141,144,138,142,142,142,142,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,181,139,126,119,127,123,99,113,114,94,95,100,101,99,82,71,79,101,103,108,95,87,123,88,76,94,104,120,84,128,123,123,128,122,121,121,122,139,173,169,170,171,171,171,170,172,171,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,171,172,172,171,171,171,171,171,171,171,171,170,188,223,220,222,225,192,166,158,159,157,156,150,154,159,152,158,150,136,152,157,185,218,185,157,146,146,170,183,189,189,188,188,188,180,182,185,190,205,224,217,184,177,163,159,165,186,185,190,188,186,191,215,225,224,222,222,223,219,199,172,179,195,210,223,221,211,38,141,218,68,115,88,102,142,41,168,221,222,223,222,223,223,224,222,224,222,222,221,223,223,223,221,224,220,199,164,222,218,203,183,178,145,142,143,141,142,141,143,147,141,147,139,141,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,181,152,124,121,124,124,67,74,87,60,56,64,64,63,35,42,58,78,78,72,70,37,106,36,35,42,64,98,50,131,120,132,156,137,125,121,122,131,158,166,171,173,170,170,170,170,170,170,171,170,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,170,171,171,187,224,222,224,223,213,172,162,160,157,157,157,159,158,159,154,128,144,162,159,185,202,203,181,154,128,170,168,171,186,189,183,172,168,168,173,183,204,219,199,183,175,154,157,171,194,189,188,185,189,206,221,224,223,212,203,220,207,177,168,168,170,187,216,221,225,98,189,222,149,87,173,148,181,104,201,222,224,222,223,224,223,216,222,226,223,222,220,223,223,223,223,221,222,224,204,225,221,214,192,184,147,141,144,142,141,141,141,151,149,143,140,141,140,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,180,171,120,125,123,123,90,24,28,81,57,50,54,68,45,98,114,82,74,45,104,40,81,63,83,60,20,31,83,149,120,128,199,168,155,121,125,122,128,139,142,154,172,169,171,170,170,170,170,170,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,169,173,176,194,221,223,222,223,224,204,176,157,157,157,160,156,158,148,137,143,158,156,165,190,179,156,155,147,125,155,163,156,162,171,169,159,160,161,161,150,153,158,154,183,161,159,163,187,196,206,186,197,210,220,225,223,218,192,183,199,195,179,171,166,169,171,189,220,224,202,221,221,220,201,223,209,215,204,220,222,223,222,223,207,184,170,201,222,224,223,222,223,223,223,224,223,221,225,223,222,222,219,212,188,145,141,142,141,140,141,142,155,148,150,142,142,140,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,173,170,124,125,122,123,106,33,41,100,57,46,53,67,40,55,80,83,23,24,112,41,70,87,120,110,24,50,111,173,129,124,184,192,189,148,125,124,123,125,127,157,175,171,172,169,169,170,170,170,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,168,171,175,211,226,223,222,220,221,209,181,159,157,153,154,158,162,127,138,156,163,161,174,186,173,128,122,127,129,154,155,155,156,157,160,160,157,157,156,131,122,119,142,173,160,156,159,187,188,220,212,215,224,224,225,222,201,184,186,186,186,183,174,171,169,171,170,219,223,225,225,221,221,224,222,225,222,224,221,201,196,202,193,157,135,130,147,177,205,227,222,223,223,223,223,222,224,223,221,220,221,221,221,199,151,152,144,142,140,142,147,146,149,145,145,141,143,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,176,176,181,141,125,120,122,112,41,52,114,50,55,49,63,37,49,77,81,45,48,82,43,66,78,124,116,35,54,136,174,132,128,164,205,200,181,158,139,123,123,123,162,167,171,167,171,171,171,173,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,168,171,182,223,222,218,222,216,209,186,182,166,166,162,158,165,141,126,158,156,165,169,195,187,179,132,125,124,126,160,160,157,157,155,153,156,157,161,147,125,127,158,166,161,159,160,159,177,191,225,224,218,221,219,222,215,185,186,182,183,182,187,184,193,184,189,189,219,221,223,216,222,224,221,221,223,223,223,197,137,134,135,135,128,121,122,124,132,149,211,223,223,223,223,221,223,224,222,223,222,221,224,220,217,167,167,151,146,141,143,141,129,133,136,148,140,140,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,174,173,177,164,122,124,122,121,44,49,123,45,62,56,56,48,108,121,84,73,77,67,40,81,53,90,60,49,38,132,172,146,133,168,186,210,187,214,166,120,122,128,156,174,171,171,176,174,172,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,169,170,173,172,173,176,178,176,188,187,178,160,180,171,158,155,128,137,160,167,165,212,211,183,183,159,148,130,142,156,153,158,158,155,156,155,158,158,135,148,165,171,171,157,156,154,181,188,195,222,223,225,219,195,189,189,186,185,186,181,184,190,184,186,186,185,195,223,219,221,221,226,225,225,224,223,231,212,155,124,126,122,123,121,125,125,125,123,119,179,218,223,223,223,221,223,219,219,223,222,225,222,222,213,172,171,169,152,141,143,145,140,122,145,157,150,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,172,139,120,126,125,64,54,125,47,72,65,49,36,10,36,80,15,13,91,50,118,35,11,100,74,42,123,169,160,136,175,179,203,197,196,180,137,123,128,131,160,168,171,173,172,171,169,170,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,172,172,172,172,172,172,172,171,171,171,171,171,171,172,174,172,169,170,170,172,175,185,185,183,189,190,172,153,145,121,165,156,177,211,220,206,182,182,186,189,182,183,161,157,158,169,164,159,152,167,137,171,169,171,169,155,161,154,156,191,180,200,221,195,167,188,188,190,184,186,183,184,186,186,188,190,184,188,186,214,223,221,222,221,223,221,224,222,222,204,176,124,122,123,124,123,124,125,124,123,120,131,207,219,223,223,223,223,222,223,224,225,222,223,223,227,204,173,167,168,150,142,141,152,148,154,159,138,141,140,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,178,177,180,175,150,123,126,126,106,109,122,106,115,111,108,106,96,103,112,99,105,120,105,125,117,108,123,110,110,124,165,159,144,158,166,185,205,226,222,180,141,136,133,126,145,166,180,178,182,173,171,171,171,171,171,171,172,172,171,171,171,171,171,171,171,171,171,172,172,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,167,171,169,172,170,169,168,161,180,188,189,187,188,156,124,121,124,168,170,188,221,218,200,190,197,191,188,185,185,165,161,155,179,187,159,161,164,167,170,166,175,169,158,155,161,163,182,185,200,219,186,156,178,184,180,184,183,185,184,187,187,182,188,187,186,187,208,211,224,220,228,221,221,219,210,205,149,126,123,124,123,124,124,125,125,123,122,125,132,196,201,220,223,222,224,224,223,221,221,223,221,221,222,199,170,169,165,145,143,141,152,149,147,140,142,144,142,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,169,127,124,126,121,122,123,123,123,124,124,123,125,123,124,123,123,123,123,123,123,124,123,126,125,127,141,172,177,180,170,207,202,223,223,218,208,207,198,135,125,180,195,180,188,170,171,171,173,171,171,170,174,172,172,172,172,171,171,171,171,171,171,172,172,172,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,170,171,170,165,180,186,189,188,188,172,129,130,129,179,185,195,205,201,190,195,190,188,189,190,201,192,161,162,190,202,178,165,171,168,170,170,170,170,165,158,155,164,167,182,185,194,180,155,174,182,186,185,185,185,185,185,185,167,180,191,186,187,190,194,223,223,224,225,223,196,154,141,128,124,123,124,124,124,123,123,122,122,122,126,124,132,139,197,225,222,220,223,223,223,221,223,222,221,221,223,191,171,168,151,142,143,147,147,143,142,145,153,146,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,141,119,122,126,123,123,122,123,124,123,121,122,122,123,123,123,123,123,123,124,124,122,130,133,131,133,163,186,186,176,199,217,222,222,223,222,221,223,169,126,206,221,197,163,161,170,168,171,171,170,170,170,170,172,172,172,171,171,171,171,171,171,172,172,172,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,169,169,169,163,181,187,187,187,186,190,157,158,159,176,205,198,192,189,192,192,194,197,197,193,189,206,154,164,201,181,230,178,168,169,170,165,170,171,167,162,153,159,177,186,183,185,176,158,179,184,186,186,185,185,185,185,180,181,188,191,188,189,189,188,206,223,221,220,205,149,132,129,125,123,124,124,124,124,124,123,125,124,123,123,120,124,124,153,215,224,221,223,223,223,222,221,223,223,222,221,189,170,172,157,142,145,147,140,140,144,140,149,150,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,179,149,127,123,123,126,124,123,124,123,123,124,123,123,124,123,123,124,123,122,122,122,123,129,135,160,149,166,176,164,200,209,225,221,223,223,223,221,223,198,136,192,223,202,166,172,173,169,171,167,176,174,169,169,172,172,172,171,171,171,171,171,171,172,172,172,171,171,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,169,168,170,170,187,189,185,184,188,183,173,179,192,196,208,194,183,186,188,185,200,207,208,204,180,203,193,198,215,200,203,153,160,170,170,169,172,170,170,167,153,154,177,184,184,186,183,175,183,186,186,184,185,185,185,184,187,185,180,192,189,189,187,186,190,223,224,222,180,123,123,123,122,123,124,124,124,124,124,125,124,122,123,122,121,123,126,127,167,203,222,223,223,223,222,223,224,224,222,221,190,170,169,158,146,153,152,142,139,143,141,144,152,144,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,179,180,163,141,129,124,124,125,125,126,128,127,127,127,124,125,124,124,124,124,125,125,126,132,130,138,182,189,178,176,172,220,222,223,224,223,222,222,223,220,192,174,207,221,192,167,169,176,173,175,171,181,183,176,171,172,172,172,171,171,171,171,171,171,172,172,172,171,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,171,169,169,176,194,186,183,94,77,93,121,74,149,194,115,184,97,177,103,86,190,143,194,193,118,212,142,203,224,225,205,159,146,169,171,168,172,176,180,181,171,172,179,183,185,186,186,186,187,184,184,184,185,185,185,186,186,184,184,192,187,187,187,190,186,212,225,224,180,123,123,123,122,123,123,124,124,124,123,123,123,122,120,122,121,131,165,154,162,207,223,223,223,223,222,223,223,222,223,224,187,170,167,159,141,152,150,143,141,143,141,141,143,144,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,175,175,157,137,121,120,123,123,123,126,127,130,131,126,126,126,126,126,127,126,125,128,129,126,135,170,184,171,166,186,218,223,222,224,223,221,222,222,223,205,165,211,213,183,176,171,173,172,171,199,193,205,164,171,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,170,170,168,184,191,185,184,52,90,124,54,70,65,188,56,166,56,142,56,68,129,102,187,191,66,172,78,204,220,223,223,201,145,164,171,167,173,182,188,188,181,185,186,185,185,184,182,181,185,182,185,185,185,185,185,183,185,187,187,190,187,187,187,188,179,184,218,216,195,134,125,122,124,124,120,124,124,124,123,122,124,124,122,124,123,140,205,208,211,221,222,223,223,223,223,222,217,195,206,221,182,169,168,164,145,141,146,143,142,140,140,142,144,146,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,173,177,175,172,129,124,125,126,125,126,126,129,129,127,125,126,126,126,125,126,125,125,132,133,190,205,191,168,175,205,221,223,226,222,221,222,224,224,227,208,166,185,193,190,179,169,168,172,170,223,215,216,169,173,172,172,172,171,171,171,171,171,171,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,168,169,172,178,194,187,179,62,159,188,52,149,53,177,56,101,119,99,115,150,85,102,146,197,59,32,69,221,221,221,224,218,155,158,171,171,177,180,187,186,183,182,184,185,185,186,183,182,184,182,183,184,185,185,185,185,188,184,183,186,187,187,186,184,174,166,188,192,186,146,124,122,126,124,120,124,124,124,123,122,129,128,127,124,122,140,215,223,225,221,221,223,223,223,222,222,208,177,178,196,175,170,166,151,152,157,146,142,141,141,140,144,152,149,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,184,185,209,206,209,209,211,213,212,212,211,211,213,211,213,213,213,212,213,212,211,214,181,214,222,220,174,186,224,221,219,222,223,223,223,222,222,221,221,215,185,193,176,166,183,166,173,172,198,199,175,170,171,172,172,172,171,171,171,171,171,171,172,172,172,172,172,173,172,172,171,171,171,171,171,171,171,171,171,171,170,170,170,169,170,171,180,174,191,186,182,40,59,121,58,168,53,160,10,12,131,93,145,171,75,86,13,66,95,128,103,225,225,225,219,210,150,156,172,166,176,184,184,181,187,181,180,185,185,183,185,185,186,184,186,185,185,185,185,182,186,186,185,189,190,187,185,186,171,167,172,170,172,157,121,126,129,123,123,124,124,124,124,131,162,167,162,137,124,141,213,222,221,225,224,223,223,223,222,221,186,169,165,173,167,170,172,145,153,149,143,139,140,141,140,141,174,164,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,179,179,176,177,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,185,191,196,224,223,223,223,223,223,223,223,223,223,223,223,223,223,222,223,220,219,222,191,223,226,225,235,231,222,221,224,226,221,220,223,221,225,223,223,223,223,189,233,241,173,172,170,168,174,179,173,171,171,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,170,171,174,164,166,170,170,163,160,167,183,48,103,135,54,163,53,162,40,132,50,97,133,167,71,102,181,83,96,87,144,219,224,222,201,165,125,158,169,170,171,186,185,187,184,185,188,186,189,185,184,183,184,184,183,183,182,183,185,186,185,186,184,185,188,188,186,197,169,169,166,171,166,161,130,128,138,124,123,125,141,131,135,170,169,168,169,167,159,173,192,208,222,226,222,225,223,215,194,172,170,169,169,169,167,172,170,156,150,151,141,142,142,142,141,145,144,149,142,142,142,142,142,142,142,142,144,138,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,177,177,177,178,175,176,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,179,173,174,172,226,222,221,223,223,223,223,223,223,223,223,223,223,223,223,221,230,222,191,225,221,221,225,224,230,228,223,224,221,222,225,219,223,221,223,223,223,223,223,216,185,214,200,185,191,170,176,158,169,172,171,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,171,172,170,173,172,153,160,158,165,159,163,54,139,160,54,162,50,165,45,142,49,130,73,95,100,101,142,73,138,45,175,221,213,189,145,126,145,169,169,169,169,181,180,186,185,184,182,181,181,184,185,182,183,184,184,185,185,186,186,183,187,186,187,188,191,183,185,191,168,171,170,173,166,168,152,146,154,130,123,141,167,165,168,169,169,169,169,170,167,171,174,204,220,220,222,221,221,194,172,167,169,173,173,173,173,174,188,182,154,140,141,142,142,142,140,141,154,148,141,142,142,142,142,142,142,141,141,142,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,176,176,177,177,179,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,176,182,176,211,222,223,221,222,223,223,223,223,223,223,223,223,223,223,223,223,220,218,195,213,223,221,222,223,224,224,222,222,221,221,221,208,207,221,222,222,223,223,223,225,220,209,203,220,218,185,176,172,172,169,171,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,172,170,170,171,172,167,156,165,169,173,202,62,36,77,74,165,80,169,43,43,101,184,69,57,173,120,49,88,192,73,198,214,172,138,135,155,169,170,170,171,167,170,173,184,182,180,178,174,173,177,185,183,183,183,184,185,186,186,186,182,187,185,185,182,188,180,182,183,169,174,175,179,170,173,165,164,154,133,143,164,174,176,169,169,169,169,169,170,169,170,172,214,226,224,222,223,206,177,171,171,169,169,171,169,167,166,205,166,147,143,142,142,142,142,141,145,160,151,141,142,142,142,142,142,142,142,144,140,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,178,178,178,175,179,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,176,180,178,180,223,221,223,221,223,223,223,223,223,223,223,223,223,223,223,223,228,222,207,181,189,207,222,222,221,222,222,221,223,222,222,210,169,177,215,224,223,223,223,223,221,221,220,222,224,223,217,197,171,168,169,171,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,172,173,159,166,173,168,169,171,166,164,162,136,131,151,153,172,160,172,158,158,185,190,177,175,198,185,175,198,206,182,215,184,135,141,158,170,169,170,169,170,168,168,170,180,178,173,168,167,172,172,185,184,183,183,184,184,184,184,185,184,185,187,184,177,174,174,175,177,172,177,176,177,172,173,169,171,160,152,166,169,179,178,169,169,169,169,170,170,169,170,172,212,223,224,222,214,180,169,169,167,167,167,168,171,171,167,178,154,143,141,142,142,142,142,139,146,157,149,142,142,142,142,142,142,142,141,140,146,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
195,183,180,176,177,177,180,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,174,178,171,211,223,224,223,222,223,223,223,223,223,223,223,223,223,223,223,224,224,215,180,185,196,222,228,222,223,223,220,223,224,224,197,174,182,220,222,221,223,223,223,223,222,222,223,220,228,224,226,204,180,172,172,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,170,171,140,141,161,164,171,167,170,162,161,156,142,170,174,170,169,172,188,184,188,187,184,184,194,188,190,189,188,194,204,147,146,164,170,171,170,170,170,169,168,173,168,172,171,169,169,167,169,170,185,184,183,183,184,184,183,184,184,186,184,187,184,173,165,168,171,174,174,174,170,170,168,172,171,171,170,168,171,172,176,169,172,169,169,169,169,170,170,169,172,214,223,223,221,196,169,169,171,170,167,173,171,171,176,155,157,151,142,139,141,142,142,142,146,149,167,150,141,142,142,142,142,142,142,141,146,156,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
195,182,180,177,180,178,179,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,170,181,153,207,223,225,222,224,223,223,223,223,223,223,223,223,223,223,223,221,223,224,175,184,196,220,225,222,223,223,222,222,221,225,183,184,172,210,222,222,223,223,223,222,223,223,222,220,190,211,222,228,192,173,174,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,171,173,149,126,151,170,168,168,167,163,159,162,143,168,169,171,169,171,187,187,186,185,184,184,192,184,191,189,189,196,186,138,167,170,169,169,169,168,171,168,169,171,167,171,171,171,171,171,171,169,181,182,184,184,184,185,184,185,182,184,183,182,177,168,168,171,172,172,171,170,166,168,166,170,170,168,169,171,172,170,171,161,165,168,169,169,169,170,169,170,180,220,222,215,206,179,169,169,172,169,168,175,175,170,167,163,156,146,142,143,141,142,142,142,149,156,170,151,142,142,142,142,142,142,142,142,146,147,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
191,178,178,176,168,181,176,176,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,175,168,154,204,221,223,221,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,207,193,200,220,223,221,222,222,225,222,221,221,205,170,169,207,222,222,223,223,223,222,220,222,223,192,203,193,167,189,182,173,168,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,173,171,171,171,171,171,171,171,171,171,173,143,125,148,171,165,170,166,163,159,155,159,167,163,170,174,174,188,187,188,186,188,187,173,158,187,187,188,190,156,149,168,171,169,168,169,169,168,170,169,168,166,171,169,170,170,169,171,167,181,184,185,184,184,185,184,185,177,184,186,179,169,169,170,170,169,169,170,169,168,170,168,170,170,170,169,169,169,169,172,159,161,168,169,168,168,169,170,170,174,192,187,182,177,171,170,171,170,167,174,159,162,160,163,170,147,144,142,142,142,142,142,142,152,165,168,151,142,142,142,142,142,142,142,141,143,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,176,177,167,185,183,177,176,178,175,179,179,176,174,175,177,176,176,177,177,177,177,177,177,177,180,204,206,218,222,222,222,222,223,223,223,223,223,223,223,223,221,223,222,222,221,221,226,214,213,222,226,219,221,224,222,223,219,220,212,169,171,210,223,223,222,222,223,222,219,221,224,219,223,215,189,168,171,171,171,172,172,172,172,172,172,172,172,172,172,173,172,172,173,173,173,172,172,172,171,171,171,171,171,171,171,171,169,172,155,150,166,171,169,170,165,158,159,157,158,165,168,168,164,166,168,177,191,177,190,182,153,136,182,186,186,175,141,161,169,170,170,169,170,170,169,170,169,169,169,170,169,169,169,169,169,169,172,175,179,183,188,187,179,172,171,175,175,173,169,170,170,170,169,169,169,169,169,170,169,170,170,170,169,169,170,167,173,158,168,169,169,169,169,169,170,169,170,171,170,170,169,170,170,170,172,166,171,166,154,150,151,154,142,142,142,141,142,139,146,146,165,168,166,158,145,142,149,142,142,142,142,141,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,176,176,171,147,173,179,177,177,179,176,183,180,179,177,178,176,177,177,177,177,177,177,177,178,190,183,216,223,223,223,223,223,223,223,223,223,223,223,223,222,224,223,222,226,222,219,222,218,221,223,223,221,227,220,223,222,220,217,175,170,173,197,223,220,224,221,224,220,220,221,222,217,217,207,172,172,170,169,172,172,172,172,172,172,172,172,172,172,173,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,171,169,174,168,173,179,163,167,164,158,159,157,157,152,169,175,193,161,159,168,157,169,169,169,139,125,171,189,174,142,142,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,170,174,181,181,173,169,170,172,172,170,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,167,170,177,177,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,159,149,150,141,140,144,144,140,142,142,142,140,143,151,167,166,170,161,149,143,144,149,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,176,177,183,183,178,161,167,179,178,178,176,180,175,177,178,177,177,177,177,177,177,177,177,178,166,158,182,223,223,223,223,223,223,223,223,223,223,223,222,222,223,224,223,220,223,221,219,222,221,224,227,222,222,223,222,212,172,172,182,167,172,172,189,225,222,224,224,223,223,221,219,224,226,177,171,173,172,170,172,172,172,172,172,172,172,172,172,172,173,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,171,174,172,167,185,178,174,167,163,159,158,156,155,156,164,146,158,170,154,155,157,156,153,156,120,124,170,162,128,126,163,166,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,167,167,172,172,168,169,170,171,171,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,167,172,172,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,165,155,145,142,143,143,144,142,142,142,142,143,146,155,163,170,175,161,143,142,143,145,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,178,177,178,176,181,175,157,166,179,179,175,176,178,174,177,177,177,177,177,177,177,177,178,160,163,160,223,223,223,223,223,223,223,223,223,223,223,222,222,221,222,222,223,219,212,200,223,223,225,219,222,223,222,219,182,177,172,169,171,173,176,173,210,223,224,222,222,222,222,218,223,210,174,169,173,173,171,172,172,172,172,172,172,172,172,172,172,173,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,166,171,170,169,190,172,159,170,161,159,158,157,159,161,173,165,157,136,148,153,159,160,157,146,143,172,179,124,134,152,169,167,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,172,170,169,170,170,168,171,170,169,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,172,171,169,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,167,151,140,143,143,141,142,142,142,142,142,143,148,166,170,166,167,160,151,141,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,178,178,179,179,176,177,179,174,168,171,172,176,173,175,176,177,177,177,177,177,177,177,177,179,163,143,167,223,223,223,223,223,223,223,223,223,223,223,223,224,220,221,225,225,222,189,182,223,231,232,222,219,222,206,185,170,168,170,171,170,171,169,173,191,221,221,221,223,223,221,225,220,210,172,171,172,171,169,172,172,172,172,172,172,172,172,172,172,173,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,168,171,171,172,167,167,166,164,159,159,157,157,155,158,174,157,155,124,139,151,160,157,187,209,209,221,164,145,164,169,168,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,170,171,170,171,170,172,170,169,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,174,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,168,173,147,141,142,141,143,141,141,142,142,142,143,152,168,168,170,170,153,143,140,143,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,176,178,176,177,177,179,178,177,176,178,170,162,152,153,171,180,176,177,177,177,177,177,177,177,178,167,150,176,223,223,223,223,223,223,223,223,223,223,223,223,223,223,220,224,221,223,212,174,216,236,235,225,219,211,169,171,170,173,172,168,170,171,166,171,187,220,220,224,221,221,224,225,224,229,169,171,170,170,170,172,172,172,172,172,172,172,172,172,172,173,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,172,172,170,170,173,163,175,167,160,159,157,157,159,158,161,157,154,127,129,155,165,155,170,200,205,214,141,156,170,171,169,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,168,168,170,169,171,171,171,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,168,168,147,141,142,143,143,142,142,142,142,142,141,156,171,170,174,150,142,144,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,177,177,177,178,179,177,179,177,178,166,136,137,160,164,177,177,177,177,177,177,177,177,176,153,153,168,223,223,223,223,223,223,223,223,223,223,223,223,223,225,216,219,219,219,221,196,194,224,226,222,222,207,174,171,171,172,170,169,171,170,172,175,188,222,221,223,223,213,199,199,216,214,169,171,170,170,172,172,172,172,172,172,172,172,172,172,172,173,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,170,172,169,171,166,171,167,167,162,160,158,157,163,155,160,159,140,126,124,155,159,156,160,198,199,190,134,164,170,170,169,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,170,170,169,169,168,169,169,170,170,170,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,170,173,166,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,173,163,150,141,142,142,141,140,142,142,142,142,143,151,167,171,171,151,141,140,143,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,177,177,178,177,178,178,178,176,180,173,167,162,141,127,142,165,178,175,178,177,177,177,176,176,180,145,140,171,223,223,223,223,223,223,223,223,223,223,223,223,220,219,203,191,193,194,221,221,218,222,221,222,218,189,171,170,171,171,170,171,171,171,174,175,191,225,221,222,225,200,169,171,184,200,171,171,171,171,172,172,172,172,171,170,171,170,172,172,172,171,172,172,173,174,173,172,172,172,171,171,171,171,171,171,171,171,170,171,168,170,171,171,168,165,162,160,159,159,165,167,162,155,128,125,123,154,156,157,157,174,181,177,135,169,170,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,170,169,169,168,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,170,170,167,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,166,154,153,148,153,144,141,147,147,147,142,144,150,165,174,183,152,140,139,140,141,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,180,178,179,182,180,175,148,134,129,121,128,167,181,171,180,177,179,178,177,178,175,162,175,173,223,223,223,223,223,223,223,223,223,223,223,222,223,225,209,173,175,194,219,224,223,223,223,221,222,189,172,169,173,170,172,173,171,172,172,173,180,218,221,221,223,198,170,173,167,198,172,172,172,172,172,172,172,172,172,170,168,171,172,172,173,171,171,172,173,174,173,173,172,172,171,171,171,171,171,171,171,171,170,170,170,169,169,169,170,167,161,160,159,162,167,183,167,164,129,123,125,137,157,156,159,161,170,166,155,169,170,170,168,168,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,161,166,161,165,150,151,158,161,154,140,140,151,167,165,215,159,142,141,139,145,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,176,178,177,164,170,170,136,117,122,119,120,134,155,158,163,178,177,183,169,172,164,181,217,207,223,223,223,223,223,223,223,223,223,223,223,221,225,223,225,216,218,219,216,224,223,223,223,225,227,192,177,171,173,168,170,173,170,172,170,171,171,211,223,223,219,202,171,167,170,176,170,172,172,172,172,172,172,172,172,172,171,170,172,173,170,172,172,172,173,174,173,173,172,172,171,171,171,171,171,171,171,171,170,170,170,169,169,169,169,167,161,159,157,160,171,181,185,178,145,123,121,126,159,158,164,157,216,215,191,164,168,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,168,166,167,166,171,165,170,166,163,151,142,141,148,161,169,178,152,144,151,142,145,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,179,176,176,176,179,166,126,126,124,126,126,121,134,145,150,147,175,161,131,128,160,218,226,221,223,223,223,223,223,223,223,223,223,223,223,224,195,200,203,217,225,224,222,224,223,223,223,223,218,215,177,169,169,168,169,171,172,170,169,166,173,207,223,225,220,204,161,168,172,172,170,172,172,172,172,172,172,172,171,175,176,178,179,171,173,169,172,172,173,174,173,173,172,172,171,171,171,171,171,171,171,171,170,170,170,169,170,170,167,163,162,159,157,153,180,186,190,184,159,123,124,140,158,152,175,180,176,182,169,164,169,170,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,172,169,170,170,172,169,170,170,167,166,146,144,153,142,156,172,167,156,148,159,144,146,138,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,178,177,178,177,179,176,130,129,122,127,119,123,125,122,147,130,123,128,123,122,127,194,224,223,223,223,223,223,223,223,223,223,223,223,223,221,201,216,190,181,205,222,220,227,223,223,223,225,220,228,191,162,172,170,171,171,172,171,171,170,172,184,226,219,227,175,173,175,173,171,174,172,172,172,172,172,172,172,171,171,175,178,186,174,173,173,171,172,173,174,173,173,172,172,171,171,171,171,171,171,171,171,170,170,170,169,169,169,167,165,162,159,158,154,181,186,185,181,158,122,124,163,157,157,182,189,189,186,173,133,159,170,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,172,169,169,171,171,165,170,169,170,165,163,155,162,161,163,174,175,166,169,163,147,141,144,146,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,180,178,176,175,176,176,162,131,121,121,122,123,121,118,125,122,121,125,120,123,121,149,216,220,223,223,223,223,223,223,223,223,223,223,223,222,225,202,196,198,187,212,221,219,223,223,223,223,227,223,224,186,172,173,172,172,170,172,173,171,175,195,208,204,213,172,175,174,184,179,168,172,172,172,172,172,172,172,172,176,187,187,188,185,171,173,173,172,173,174,173,173,172,172,171,171,171,171,171,171,171,171,170,170,170,169,169,168,167,164,161,160,159,161,186,187,188,186,144,119,126,159,158,156,177,186,190,192,177,139,144,169,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,167,168,170,167,170,169,167,171,170,171,168,171,167,165,168,167,174,172,173,164,153,155,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,179,177,177,177,176,175,180,163,136,129,124,124,123,122,121,120,121,124,125,120,123,124,173,224,223,223,223,223,223,223,223,223,223,223,223,224,226,226,182,209,185,188,219,220,223,223,223,224,223,224,226,217,187,175,170,172,170,174,192,177,177,175,170,173,167,170,173,185,206,175,175,172,172,172,172,172,172,172,172,175,188,190,186,189,177,171,172,172,173,174,173,173,172,172,171,171,171,171,171,171,171,171,170,170,170,169,171,167,165,163,160,160,159,159,159,178,189,186,129,124,123,149,158,161,179,186,186,184,187,159,141,170,169,168,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,172,170,172,173,170,174,168,166,173,168,168,167,166,164,165,169,173,169,167,173,173,169,164,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,176,178,178,178,178,178,177,178,178,172,171,179,180,172,165,142,132,125,126,129,124,122,124,124,127,122,125,135,199,223,223,222,223,223,223,223,223,221,222,221,224,223,221,219,222,218,193,217,222,224,223,222,223,221,223,221,221,217,185,172,171,170,177,198,198,195,168,171,170,169,174,177,217,176,185,185,171,173,171,172,171,171,171,172,182,187,186,188,186,176,173,171,173,174,174,172,173,172,172,173,170,171,172,172,171,172,171,170,170,170,170,170,167,165,164,162,159,159,156,156,158,178,183,133,127,121,132,154,158,172,189,186,188,182,147,143,171,170,173,170,169,170,168,169,171,169,169,171,170,170,171,170,170,170,169,171,170,167,170,169,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,172,169,169,169,168,170,171,170,171,167,168,169,165,169,170,167,168,165,168,169,166,171,172,146,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,177,177,177,178,178,184,176,144,127,124,126,122,124,124,124,124,124,120,124,156,220,223,222,223,223,223,223,223,221,222,220,222,221,222,222,222,224,221,221,225,225,222,221,225,223,222,222,222,222,217,196,175,172,173,195,204,172,167,172,172,173,175,187,223,197,213,198,170,172,169,172,170,171,171,170,176,186,188,188,186,186,173,175,174,172,174,173,172,172,171,174,171,171,170,150,150,163,172,172,171,171,170,169,168,167,164,162,159,158,157,156,160,178,182,163,127,124,119,139,157,164,177,187,186,163,127,158,171,167,161,167,167,170,165,171,172,168,169,171,169,169,170,170,170,170,169,170,168,168,172,168,168,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,165,169,171,170,172,171,148,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,176,176,177,178,177,158,147,138,127,119,120,124,124,124,124,124,123,123,126,130,191,224,222,221,223,223,223,223,222,222,224,202,208,201,220,222,222,222,219,222,223,223,221,222,221,221,222,224,219,219,219,201,199,171,211,198,179,171,176,184,179,189,200,188,220,215,190,172,170,170,171,171,171,171,168,159,185,189,184,187,189,178,172,172,173,174,172,171,172,171,170,172,163,154,125,121,132,158,170,171,171,170,169,168,167,164,162,159,158,157,155,157,188,177,189,134,122,121,127,153,159,165,187,186,148,142,167,168,166,151,164,169,168,171,172,169,168,170,169,168,168,168,170,170,170,170,168,168,173,171,170,165,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,172,172,168,170,169,171,150,141,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,176,176,177,178,174,157,124,130,124,120,125,122,123,124,124,124,123,126,122,124,146,213,221,224,223,223,223,224,223,221,229,180,165,180,194,216,224,221,223,221,223,223,222,221,223,223,222,222,219,219,224,216,184,162,178,179,173,172,171,178,176,176,217,168,224,198,198,176,168,170,172,172,172,172,170,177,190,188,185,189,186,179,170,177,178,174,170,171,169,170,172,169,165,144,130,128,123,130,165,171,171,170,169,168,167,164,162,159,158,157,155,158,163,163,188,143,118,124,122,145,157,160,185,185,137,157,166,166,159,156,165,168,172,172,168,170,170,171,172,171,170,170,170,170,170,167,171,173,164,168,171,168,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,169,170,158,154,163,168,159,142,147,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,176,176,177,178,174,173,145,135,162,143,126,123,124,124,124,124,123,124,123,120,125,173,219,225,223,223,223,223,224,222,225,178,166,181,178,178,220,223,221,223,217,224,225,225,221,222,224,222,225,220,222,218,175,204,179,180,174,174,169,170,173,174,197,193,190,195,197,171,190,168,172,171,171,172,173,182,183,190,189,188,183,189,185,174,165,171,176,171,172,168,171,170,167,158,166,162,156,149,168,171,171,170,169,168,167,164,162,159,158,157,157,158,156,161,175,160,127,119,121,133,154,163,188,177,133,168,166,161,165,169,169,159,170,168,171,168,168,168,170,171,172,170,170,170,170,169,172,171,171,174,168,172,172,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,167,150,143,162,163,145,151,150,140,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,177,177,177,177,175,182,176,170,177,159,124,126,124,124,124,123,123,124,127,120,120,133,197,223,223,223,223,224,222,222,224,216,184,179,175,181,223,218,228,225,226,200,181,222,218,215,221,221,222,221,218,220,214,223,200,191,169,171,171,170,171,171,195,180,165,211,209,215,212,171,175,171,171,173,173,183,187,192,188,186,186,192,192,187,185,182,171,174,172,171,173,171,168,171,172,171,174,171,171,171,171,170,169,168,167,164,162,159,158,157,156,157,155,154,169,183,131,122,126,123,157,190,187,164,136,171,164,170,169,173,169,162,170,168,168,166,165,172,166,167,174,169,170,170,170,168,169,168,168,179,166,171,175,168,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,164,157,143,142,162,150,139,150,144,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,178,178,177,177,179,179,175,176,178,154,118,124,124,124,124,123,125,123,122,123,123,122,151,217,223,223,223,223,220,223,219,225,217,224,217,223,221,221,203,175,209,196,168,209,223,223,221,222,222,207,174,224,223,221,185,185,222,209,175,169,171,170,201,203,200,219,223,220,173,174,172,171,172,172,171,181,184,189,190,186,188,187,182,187,188,183,170,170,169,172,170,173,170,168,169,170,169,169,172,171,171,170,169,168,167,164,162,159,158,157,161,155,155,170,153,180,154,128,124,143,183,179,187,152,150,170,165,171,171,172,168,159,162,174,182,172,168,174,170,168,171,167,170,170,170,169,171,169,173,178,166,168,165,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,149,147,143,149,154,153,147,140,140,142,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,178,178,178,178,178,178,177,177,178,178,178,177,177,178,178,180,178,153,130,126,123,124,123,124,123,123,124,125,125,123,124,184,220,222,216,219,221,223,220,224,226,215,224,223,222,213,187,176,177,165,173,180,179,184,198,201,195,181,217,190,216,209,195,179,186,217,180,175,173,173,138,151,224,222,223,186,171,170,171,172,172,171,171,170,180,188,185,189,186,190,186,190,186,187,191,169,178,178,172,170,170,174,170,168,172,171,171,170,170,170,169,168,167,164,161,159,158,157,155,156,154,150,185,162,181,155,165,181,188,192,187,137,152,171,170,165,166,158,162,158,163,173,217,169,174,166,166,173,169,167,170,170,169,166,175,175,164,167,180,161,164,168,169,170,170,169,170,170,170,170,170,170,170,170,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,169,170,170,169,169,169,169,169,169,170,169,169,169,170,169,169,169,170,169,170,169,169,170,171,170,170,170,170,170,170,169,151,142,140,140,151,142,141,139,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,180,171,166,153,128,126,122,125,123,121,125,120,124,124,122,132,199,205,180,190,211,209,218,222,223,220,206,216,212,179,173,167,180,184,182,195,210,200,217,222,218,172,193,205,224,176,184,175,174,201,184,171,172,171,161,211,224,223,218,184,169,169,172,172,172,172,171,168,175,185,189,188,188,188,188,188,188,188,187,187,178,183,172,175,171,171,171,170,170,171,171,170,170,170,170,169,167,164,160,158,157,156,157,157,157,157,154,165,173,192,194,200,194,186,188,136,164,172,167,170,158,160,158,159,163,162,169,165,163,160,160,162,163,169,170,169,165,168,155,165,174,160,170,156,164,169,167,170,171,169,170,170,170,170,170,170,170,171,168,170,168,168,171,170,172,171,171,170,171,172,169,170,172,168,171,170,170,167,165,168,167,167,174,169,167,167,170,168,170,169,169,164,169,164,164,171,176,171,166,170,172,166,168,165,151,139,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,179,181,168,155,134,132,121,125,126,122,127,127,137,136,140,168,176,175,178,178,176,198,204,209,200,171,185,176,174,171,172,186,204,220,216,182,188,206,200,210,182,187,203,212,180,174,171,174,174,171,167,174,173,189,225,219,221,223,161,173,170,171,172,172,172,172,175,179,178,188,188,188,188,188,188,188,188,187,191,186,186,187,175,171,170,169,172,172,171,170,170,170,170,170,169,167,164,160,158,157,156,157,157,157,157,154,162,160,179,182,192,191,199,189,136,159,158,158,155,161,155,157,155,156,156,159,155,155,158,157,157,171,182,168,166,164,176,166,173,165,163,159,162,167,173,172,169,169,170,170,170,170,170,170,170,170,172,167,174,171,166,170,170,170,169,172,166,167,167,169,170,168,172,170,170,171,172,168,170,173,172,171,171,168,168,171,173,173,173,169,158,147,152,151,165,157,168,154,159,161,147,151,153,146,141,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,178,177,180,178,176,169,152,138,126,127,139,151,150,164,168,170,174,178,179,177,178,179,178,180,174,176,172,182,176,172,174,175,181,179,196,222,221,222,216,173,172,175,175,180,220,174,175,170,180,182,180,190,196,174,220,222,223,214,201,177,172,171,171,172,172,172,172,170,147,168,187,188,188,188,188,188,188,188,188,187,185,187,178,165,187,162,171,170,170,171,169,170,170,170,170,169,167,164,161,159,157,156,157,157,157,157,157,154,159,158,160,165,181,174,178,145,156,157,159,153,158,155,157,156,157,156,155,158,156,162,161,161,166,162,161,166,160,163,167,169,167,165,175,170,168,173,168,168,169,170,170,170,170,170,170,170,170,166,166,172,167,172,169,170,167,171,168,167,168,166,176,170,173,169,175,172,170,168,170,165,170,168,165,170,173,161,164,173,165,158,174,160,141,144,144,147,143,149,149,147,147,145,140,149,142,142,144,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,178,176,178,178,176,177,176,171,161,150,170,177,175,176,177,176,177,176,178,175,177,178,178,179,177,179,176,179,174,174,178,174,162,187,210,224,223,228,222,175,171,173,175,172,205,186,174,174,170,215,204,221,222,201,224,221,223,188,176,172,171,170,171,172,172,172,171,168,167,165,186,188,188,188,188,188,188,188,187,186,187,189,185,174,184,183,176,170,170,171,170,170,170,170,170,169,167,164,161,159,157,156,157,157,157,157,156,154,155,156,158,150,165,151,161,156,159,159,158,156,158,156,155,156,156,156,154,158,158,163,159,157,160,156,154,156,158,173,170,166,166,171,163,166,172,165,162,169,170,170,170,170,170,170,170,170,170,168,170,168,171,172,168,168,168,170,171,167,169,169,174,161,166,155,162,159,158,168,170,167,168,173,172,163,166,150,150,163,157,150,158,148,141,142,143,141,144,140,143,139,140,142,139,141,140,143,143,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,179,177,178,181,178,179,180,179,179,176,177,177,178,175,177,179,176,179,178,175,175,177,178,178,177,176,178,175,175,207,188,181,172,213,221,215,212,195,210,181,169,175,183,183,180,177,171,173,182,217,197,216,220,204,199,221,196,176,171,167,169,171,169,172,172,172,171,165,178,181,186,188,188,188,188,188,188,188,188,192,189,184,186,188,190,174,161,169,172,171,170,170,170,170,170,169,167,164,161,159,158,157,157,157,157,157,155,156,155,160,159,160,161,158,161,157,159,158,159,158,158,156,155,154,154,156,157,159,165,156,152,157,156,156,159,152,162,171,173,178,160,183,157,165,178,169,169,171,170,169,170,170,170,170,170,170,170,173,172,167,172,168,167,169,167,169,172,168,169,168,167,155,151,151,147,147,149,164,170,173,157,160,162,146,146,145,141,146,145,146,143,143,142,143,143,141,141,140,142,139,140,144,142,139,142,143,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,178,179,179,181,179,177,179,177,177,176,179,180,178,175,177,179,177,179,179,178,175,175,176,178,177,178,176,175,186,213,181,175,195,218,181,172,173,203,195,172,169,175,211,184,196,182,179,190,217,189,205,224,189,197,174,171,173,171,171,170,171,172,172,172,172,171,175,182,186,187,188,188,188,188,188,188,188,189,192,190,188,186,189,181,159,171,168,172,171,170,170,170,170,170,169,167,164,161,159,158,157,157,157,157,157,156,160,156,156,155,159,158,158,157,155,154,151,155,157,155,156,156,156,157,158,158,164,171,163,158,157,159,154,158,157,161,167,167,167,168,187,143,185,168,169,170,168,170,169,170,170,170,170,170,170,170,171,177,171,173,168,169,171,165,166,165,173,173,169,159,146,144,145,141,146,149,158,158,160,148,144,144,140,140,141,143,143,143,143,141,140,145,141,143,141,142,141,140,140,142,143,143,142,143,141,140,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,178,179,174,178,173,175,176,178,178,180,178,175,179,180,178,178,177,177,177,178,179,178,179,179,177,174,173,175,177,179,216,191,177,157,174,174,208,201,166,163,180,215,200,177,202,174,197,185,183,167,166,193,171,184,167,174,172,170,172,173,173,170,172,172,172,172,171,184,182,189,188,188,188,188,188,188,188,186,185,187,191,190,190,177,193,185,175,170,172,169,170,170,170,170,169,167,164,161,159,158,157,157,157,157,157,159,156,155,154,156,157,159,154,154,159,157,158,157,156,157,156,156,157,157,157,153,159,167,167,157,160,153,156,157,155,157,151,156,160,165,163,159,171,174,178,173,170,170,170,170,170,170,170,170,170,170,161,152,179,170,163,172,160,165,166,164,165,160,158,152,146,147,144,144,148,151,153,144,146,141,143,144,141,143,142,140,141,143,140,142,142,143,142,141,142,142,141,143,145,141,140,141,142,142,140,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,176,177,176,176,176,177,177,177,177,176,177,177,177,177,177,177,177,177,177,177,177,178,178,177,174,175,176,173,224,186,173,170,169,174,211,202,184,169,182,177,178,168,220,220,177,194,241,218,190,231,240,211,179,170,172,168,171,168,172,172,171,168,167,169,172,184,190,184,188,188,188,188,188,188,188,187,187,187,188,187,188,184,165,175,160,173,171,169,170,170,170,169,169,168,165,163,159,158,157,156,156,155,158,155,153,162,157,154,160,157,155,156,157,157,157,157,156,157,156,156,157,157,156,154,161,167,171,155,158,155,159,156,156,158,162,160,155,161,159,156,161,139,157,165,173,174,167,174,164,168,170,167,169,172,164,184,147,151,158,166,163,156,157,158,162,159,152,146,144,150,143,148,155,159,152,138,141,141,142,142,142,142,142,141,141,142,141,142,142,142,142,141,142,142,141,142,142,141,141,141,142,142,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,175,175,174,173,174,176,172,175,170,174,164,177,169,172,170,167,171,181,177,231,174,213,194,178,170,175,173,178,190,172,174,173,169,172,169,169,174,170,174,174,175,184,189,187,188,188,188,188,188,188,188,188,188,188,188,186,185,190,188,188,174,170,172,171,171,170,170,169,169,168,165,163,159,158,157,158,158,158,155,157,162,152,155,157,156,155,157,157,157,157,157,157,157,157,157,157,157,157,158,156,158,159,166,167,156,159,158,159,157,156,157,156,157,160,154,157,159,166,163,166,167,167,170,169,168,171,173,169,169,170,170,167,158,159,157,155,154,156,157,155,155,152,151,147,145,149,156,154,210,158,151,157,157,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,172,172,168,174,174,166,157,168,192,196,179,176,170,161,170,175,175,199,174,196,181,213,194,192,200,219,175,171,170,175,169,171,171,169,175,175,175,173,175,194,186,186,188,188,188,188,188,188,188,188,188,188,188,188,188,188,191,186,188,171,166,170,171,170,170,169,169,168,165,163,160,158,157,158,156,154,156,156,156,153,157,157,158,157,159,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,170,165,163,163,158,157,157,154,155,157,158,157,154,159,160,154,161,161,168,167,167,168,173,168,168,170,168,171,171,169,161,155,158,157,157,158,157,156,155,152,150,150,155,162,177,164,144,147,148,154,153,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,177,174,175,173,176,172,172,162,169,204,167,177,213,198,173,172,170,165,174,166,171,197,191,184,211,210,184,192,196,187,168,170,171,171,172,173,181,181,181,178,179,187,186,190,188,188,188,188,188,188,188,188,188,188,188,187,188,187,189,189,165,203,173,171,171,170,170,169,169,168,165,163,160,159,158,158,157,158,155,157,157,158,155,154,157,157,159,157,157,157,157,157,157,157,157,157,157,157,156,156,158,157,164,164,160,170,161,159,156,155,158,158,157,156,157,163,161,158,157,159,160,161,162,159,166,171,169,168,170,168,166,161,161,154,156,157,157,156,157,156,156,154,150,148,151,153,152,148,150,142,141,141,142,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,177,174,176,175,174,175,172,172,161,169,157,168,181,192,176,171,175,171,176,174,167,170,173,171,168,168,173,159,179,199,150,171,174,171,174,164,170,177,183,188,192,185,188,187,188,188,188,188,188,188,188,188,188,188,188,187,185,187,186,185,177,186,171,171,171,170,170,169,169,168,165,163,160,159,158,157,157,158,159,165,159,158,159,154,160,156,157,157,157,157,157,157,157,157,157,157,157,157,156,156,157,153,157,155,163,163,161,160,156,158,159,156,156,157,162,156,156,158,162,159,157,163,159,159,158,166,168,159,164,159,163,154,159,156,156,156,156,156,157,156,154,152,150,148,147,147,141,139,142,139,142,140,141,140,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,177,174,176,174,173,169,169,172,171,173,174,169,166,159,173,168,170,171,176,160,173,169,171,158,210,195,167,204,214,185,171,171,169,173,168,171,179,187,187,188,183,190,187,188,188,188,188,188,188,188,188,188,188,188,189,186,189,187,186,184,189,186,170,171,170,170,169,169,168,165,163,160,159,158,156,156,163,156,180,170,159,157,153,162,154,156,157,157,157,157,157,157,157,157,157,157,157,156,157,157,155,154,156,157,155,157,156,157,159,157,156,156,156,160,158,156,155,159,154,159,160,153,162,157,161,163,156,158,157,159,155,156,158,156,157,157,157,157,156,155,153,150,149,146,143,142,142,142,141,144,142,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,177,176,176,176,174,172,173,172,172,171,169,169,171,168,174,165,171,169,171,170,175,165,174,174,172,160,208,196,159,186,182,226,204,205,174,177,200,186,178,180,189,188,185,192,186,188,188,188,188,188,188,188,188,188,188,188,188,188,188,187,186,187,182,173,173,171,170,170,169,169,168,165,163,160,159,158,156,161,162,169,182,182,166,190,177,163,158,155,157,157,157,157,157,157,157,157,157,157,157,157,158,157,159,159,158,158,157,155,158,156,155,158,158,157,157,157,157,158,158,161,160,165,164,156,161,160,162,157,157,158,157,157,156,158,157,157,157,157,158,156,156,155,154,149,147,146,143,144,141,145,142,142,143,143,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,179,179,179,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,175,174,173,173,172,171,171,171,170,171,170,172,172,170,170,170,171,171,172,171,172,172,173,218,215,202,199,170,179,214,227,203,173,179,196,223,209,185,188,188,190,185,186,187,188,184,187,186,190,190,190,189,190,188,185,188,188,185,190,182,166,172,171,169,172,168,168,167,165,163,161,159,158,156,160,146,162,163,169,150,176,169,157,162,155,163,157,157,156,157,159,156,156,163,163,162,158,162,156,158,157,155,157,157,157,156,154,160,152,155,159,157,158,157,157,162,178,170,163,164,159,159,157,157,156,157,157,157,156,156,157,156,157,156,157,157,157,157,155,153,149,147,146,144,144,142,143,141,141,142,142,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,180,180,180,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,175,174,174,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,170,172,170,194,201,179,197,144,169,161,172,196,211,213,212,193,182,164,169,186,191,187,189,191,189,186,186,186,187,186,183,182,184,184,187,188,186,184,196,193,187,171,173,176,169,169,168,167,165,164,161,159,158,158,163,156,158,160,160,154,161,162,160,165,159,162,156,157,155,156,157,156,160,170,165,160,164,163,161,153,159,161,158,157,157,156,155,159,155,155,158,156,158,157,159,162,167,161,160,160,157,158,155,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,155,153,150,147,146,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,180,180,180,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,175,174,174,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,175,173,156,172,199,221,204,193,204,225,221,224,217,206,236,243,194,176,191,193,183,186,190,189,190,188,182,188,186,189,188,190,193,191,173,170,165,171,168,150,161,166,169,168,167,165,164,161,159,158,158,157,159,156,156,155,156,155,155,157,156,154,158,157,157,155,155,155,155,160,163,155,154,163,156,159,156,165,159,157,157,158,157,156,155,161,157,157,156,157,155,160,159,163,161,158,155,155,156,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,156,155,153,150,147,146,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,180,180,180,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,176,176,174,174,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,171,171,171,171,171,174,171,180,175,170,182,165,206,191,176,198,192,189,154,151,160,173,174,169,170,171,168,173,167,185,187,186,184,187,190,187,184,183,162,168,177,166,174,177,176,170,167,168,167,165,164,161,160,158,160,158,157,159,157,158,157,159,158,157,155,155,156,157,157,155,157,157,156,156,155,155,159,155,159,160,156,156,152,154,156,157,157,157,156,159,155,159,157,157,156,159,159,158,156,156,159,157,155,157,157,156,157,157,157,157,157,157,157,157,157,157,157,157,156,154,153,150,147,146,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,162,
192,179,177,179,180,180,180,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,174,175,173,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,169,173,171,169,170,170,168,169,175,182,168,175,179,177,184,175,177,181,170,169,170,169,172,171,171,174,174,170,174,172,174,168,178,185,182,169,170,170,169,168,173,171,169,169,168,167,165,164,161,160,159,156,158,158,159,160,156,159,159,158,158,157,157,157,157,156,156,156,158,156,155,156,158,159,156,158,156,154,155,157,158,156,156,156,156,159,155,155,158,157,157,157,159,159,156,157,156,155,156,155,157,156,156,157,157,157,157,157,157,157,157,157,157,156,156,156,154,152,150,147,146,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,162,
192,179,177,179,180,180,180,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,172,171,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,169,171,171,170,172,170,168,169,173,170,173,173,173,171,169,167,168,169,170,170,172,172,171,172,170,171,170,167,173,172,173,171,174,172,178,176,171,171,174,171,168,172,171,169,168,167,165,164,161,160,159,155,155,157,158,156,155,155,155,154,155,158,156,157,157,156,157,156,156,156,157,158,157,155,157,153,156,154,158,160,158,157,156,156,156,158,155,156,156,155,155,155,157,156,155,157,156,156,156,155,157,157,156,157,157,157,157,157,157,157,157,157,157,156,156,156,154,152,150,147,146,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,180,180,180,179,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,175,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,169,170,171,171,172,170,170,172,172,172,172,171,170,171,170,171,170,174,170,171,173,172,170,170,171,171,171,172,171,171,172,171,171,171,171,170,170,170,171,172,170,169,172,170,170,170,169,168,168,167,165,164,161,161,160,160,158,159,158,157,159,154,156,156,156,158,158,156,155,157,157,156,156,156,157,157,157,156,158,155,157,155,157,156,156,156,157,156,156,156,156,157,157,156,156,156,156,157,156,155,155,157,157,157,157,158,157,157,157,157,157,157,157,157,157,157,157,156,156,156,154,152,150,147,146,144,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,162,
192,179,177,179,180,180,180,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,177,177,177,176,175,174,173,172,172,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,170,172,170,171,173,171,170,171,170,170,168,171,171,172,171,171,172,171,170,169,170,171,171,172,171,172,171,172,171,171,171,171,171,171,171,169,171,170,172,170,168,168,168,167,165,164,161,160,159,160,159,158,157,157,158,156,156,157,156,156,157,156,156,157,157,156,156,156,156,156,156,157,157,156,157,157,157,155,156,156,156,156,156,155,157,157,157,157,157,157,156,158,157,156,157,158,157,157,157,157,157,157,157,157,156,156,156,156,157,157,157,156,156,155,154,152,150,147,146,145,144,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,162,
192,179,177,180,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,177,176,176,175,174,173,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,170,169,169,169,168,167,165,164,161,160,159,158,158,157,157,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,157,157,157,157,156,155,154,152,150,148,146,145,145,143,143,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,142,162,
192,179,177,180,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,177,176,176,175,174,173,173,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,170,169,169,169,168,167,165,164,161,160,159,158,158,157,157,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,152,150,148,146,145,145,143,143,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,143,162,
192,179,177,180,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,177,176,176,175,174,174,173,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,170,169,169,169,168,167,165,164,161,160,159,158,158,157,157,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,147,146,145,145,143,143,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,142,143,162,
192,179,177,180,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,176,176,175,174,173,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,170,169,169,169,168,167,165,164,161,160,159,158,158,157,157,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,150,147,146,145,145,143,143,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,142,142,144,165,
192,179,177,180,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,176,176,175,174,173,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,170,169,169,169,168,167,165,164,161,160,159,158,158,157,157,157,157,156,156,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,158,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,149,147,146,144,145,143,143,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,162,
192,179,177,180,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,177,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,176,175,174,173,173,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,171,171,171,170,169,169,169,168,167,165,165,162,161,160,158,158,157,157,157,157,156,156,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,158,158,158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,155,154,151,149,147,145,144,145,143,143,142,142,142,142,142,142,142,142,142,143,143,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,162,
192,178,178,179,180,180,180,178,178,177,177,177,178,178,178,177,177,177,177,177,177,177,177,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,177,177,176,175,175,174,172,172,171,171,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,171,171,170,170,170,170,170,170,169,168,168,167,167,165,165,162,161,160,158,158,157,157,157,157,156,156,158,158,158,158,156,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,157,157,157,157,158,158,158,158,158,158,158,157,157,157,157,157,157,157,157,157,158,158,157,157,157,157,157,156,155,154,151,149,147,145,144,145,144,143,142,142,141,141,141,141,141,141,142,142,142,142,142,141,141,141,142,142,142,142,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,142,142,142,142,142,142,143,143,165,
192,178,180,178,179,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,177,176,176,175,174,173,172,172,172,172,171,170,170,170,171,171,171,171,169,169,169,169,169,169,169,169,171,171,171,171,171,171,172,172,171,171,171,171,171,170,170,170,171,171,171,171,170,170,170,170,170,170,170,170,171,171,171,170,170,170,170,170,169,168,168,167,168,167,166,164,162,161,160,159,158,157,157,157,157,157,157,156,157,157,157,156,157,156,156,157,157,156,156,157,157,157,157,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,158,158,159,159,159,158,158,157,156,156,156,155,156,156,156,156,157,157,157,157,157,157,156,156,156,154,153,151,149,148,146,145,145,144,143,142,142,141,141,141,141,141,142,142,142,142,142,141,141,141,141,141,142,142,142,142,142,142,142,141,141,141,141,142,142,142,142,142,142,142,142,141,141,141,141,141,141,141,141,140,140,140,140,141,141,141,141,142,142,143,142,142,142,144,145,165,
192,179,179,178,178,178,178,178,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,177,176,176,175,174,173,172,173,174,173,173,172,172,172,172,172,171,171,171,171,172,172,172,172,172,172,172,171,171,171,172,172,173,173,173,172,172,172,173,173,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,173,173,173,173,173,173,173,172,171,170,171,170,170,169,167,164,162,160,159,158,158,158,157,157,158,158,157,157,157,158,158,158,158,158,157,157,157,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,155,155,156,156,158,159,159,159,160,160,160,159,156,155,155,155,155,156,156,156,156,157,157,157,157,157,156,156,155,154,153,151,149,147,147,146,145,145,144,143,143,142,142,142,143,143,143,143,143,143,143,143,143,143,143,142,142,142,142,142,142,142,142,142,141,141,141,142,142,142,142,142,142,142,142,141,141,141,141,142,142,142,142,141,141,141,141,142,142,142,142,143,143,144,144,143,143,144,144,162,
192,181,179,179,180,179,179,179,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,179,179,178,177,177,176,174,173,172,172,171,171,170,170,170,170,169,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,171,171,170,170,170,170,171,170,170,170,169,169,169,169,170,170,170,171,172,172,172,171,170,170,170,171,171,171,171,171,170,170,170,170,169,169,167,164,161,160,160,160,160,160,159,159,159,159,159,159,159,160,159,158,158,158,158,159,159,159,158,159,159,159,158,158,158,158,158,158,158,158,158,158,158,158,157,157,157,158,158,158,159,160,160,159,159,158,159,158,158,158,158,158,158,158,158,158,158,158,159,159,159,158,157,156,156,153,148,147,146,145,145,145,144,143,142,142,142,142,142,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,143,143,143,143,143,143,143,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,144,144,145,145,145,144,144,145,167,
192,182,178,179,178,178,178,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,177,176,176,176,177,177,176,174,172,172,172,171,170,170,170,170,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,169,169,170,170,170,170,170,170,169,169,169,169,169,169,169,169,169,169,169,170,170,170,170,170,169,169,169,170,171,171,171,169,169,169,168,170,170,170,168,167,164,162,162,159,158,158,157,158,159,159,158,157,158,158,158,160,159,159,158,159,158,158,158,156,156,156,157,158,158,158,158,159,159,159,158,157,157,157,157,158,158,159,158,159,161,162,162,161,160,158,158,158,157,157,158,159,159,159,159,159,159,159,159,158,158,158,155,154,152,149,149,147,145,143,142,142,142,142,142,142,141,141,141,141,141,142,142,142,142,141,141,141,141,142,143,143,143,143,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141,141,141,141,141,141,142,142,142,142,143,143,143,144,144,143,142,145,162,
197,180,182,178,179,179,178,179,180,180,180,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,177,177,177,177,178,179,177,175,173,171,171,171,170,170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,172,172,172,171,171,171,171,171,171,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,172,171,171,171,168,166,167,165,162,160,158,158,157,157,157,157,157,157,157,157,158,158,158,158,158,157,155,155,155,155,155,155,155,155,156,156,156,156,156,156,156,155,154,154,154,155,156,156,156,157,159,160,162,164,162,160,159,156,156,155,155,156,156,156,156,156,156,156,156,155,155,155,154,155,154,153,151,152,150,148,146,145,145,144,144,143,142,142,142,141,141,142,142,142,142,142,142,141,141,141,141,140,140,140,141,141,141,141,140,140,140,140,140,140,140,140,140,140,140,140,141,141,141,141,142,142,142,142,141,141,141,142,142,142,142,143,143,144,144,144,144,143,143,145,162,
214,205,206,206,207,207,207,207,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,204,204,204,204,203,203,202,203,203,203,203,202,202,202,202,200,200,200,200,199,199,199,199,199,199,199,199,201,201,201,201,201,201,201,202,202,202,202,202,203,202,202,201,200,200,200,201,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,201,201,202,202,201,201,199,197,197,195,193,193,193,193,193,193,193,193,193,193,193,193,193,193,191,191,191,191,191,191,191,191,190,190,190,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,193,193,195,195,193,193,193,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,189,189,189,187,186,185,185,184,182,182,183,182,181,181,180,180,180,180,180,180,180,180,180,180,180,180,180,180,181,181,181,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,181,181,180,180,180,182,195,
};
GLubyte texture2B[65536] = {248,243,245,244,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,244,244,244,244,243,243,243,243,244,244,244,244,243,243,243,243,243,243,243,244,245,246,246,246,246,247,247,246,245,245,246,245,245,245,245,246,246,246,246,245,245,244,244,245,245,245,245,245,245,245,245,246,246,246,246,246,246,246,245,245,245,245,245,245,246,246,246,246,246,245,245,245,245,245,245,245,245,246,245,244,244,244,245,245,245,245,245,246,246,246,245,245,245,246,249,250,251,250,248,248,248,248,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,248,248,248,248,248,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,248,248,249,248,249,249,248,248,248,248,247,247,247,247,247,247,247,247,247,246,247,247,248,249,249,249,249,249,251,250,251,251,251,251,251,251,251,251,251,251,251,251,251,251,249,250,247,250,250,251,251,249,250,248,248,251,251,251,251,250,249,248,249,249,249,249,249,247,248,248,248,247,247,248,249,249,248,249,251,253,
236,226,233,228,228,228,228,230,231,230,230,230,230,230,230,230,230,230,230,229,229,229,229,230,229,229,229,230,230,230,229,227,228,228,228,229,230,229,229,228,228,227,227,228,228,228,229,231,232,233,234,235,237,237,236,236,236,236,236,235,235,235,235,236,236,236,236,235,235,235,235,235,235,235,235,235,235,235,233,233,233,233,233,233,233,234,235,235,235,235,236,237,237,237,237,236,235,235,235,235,235,235,235,236,236,235,235,235,235,235,235,235,235,234,233,233,233,233,233,234,234,235,236,237,237,241,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,241,240,239,238,241,240,239,239,241,241,241,241,241,240,240,240,242,242,242,240,237,237,238,239,241,241,241,240,239,239,239,240,240,240,240,240,239,239,239,237,241,244,245,244,243,242,242,244,244,240,240,243,243,242,242,246,241,238,240,241,241,241,241,241,241,241,243,247,246,245,245,247,248,248,247,243,
235,227,230,228,230,230,230,230,231,230,230,230,230,230,230,230,230,230,230,229,229,229,230,229,229,229,228,230,230,230,230,229,229,230,230,229,229,229,229,230,230,229,229,230,230,230,230,230,232,232,234,235,237,238,238,238,237,238,238,238,238,238,238,238,238,239,239,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,238,239,239,239,239,239,238,238,238,238,237,238,238,238,238,238,238,238,238,238,238,237,238,238,238,238,238,237,239,239,237,238,239,238,241,239,238,239,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,239,239,239,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,239,239,239,240,240,239,238,239,239,239,239,240,240,240,240,240,239,239,239,240,240,240,241,242,241,242,242,240,241,241,241,240,240,240,240,240,240,240,240,240,240,240,243,243,241,241,241,241,242,242,243,241,239,242,239,239,239,238,242,242,241,241,242,242,242,243,243,242,244,243,241,241,241,238,239,240,242,242,240,
234,229,230,228,229,229,229,229,229,228,228,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,229,229,229,229,229,229,229,229,230,231,231,231,230,230,229,229,229,230,230,230,230,230,231,232,233,235,236,237,236,234,234,235,234,234,234,234,234,234,235,235,234,234,234,233,233,234,234,234,234,234,234,234,233,233,233,233,233,233,233,233,234,234,234,234,233,234,235,235,235,235,235,234,234,234,234,234,234,234,235,234,234,234,234,234,234,234,233,233,233,233,233,233,233,234,234,236,237,238,237,240,239,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,239,239,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,239,239,239,237,240,240,239,239,238,238,238,238,238,238,238,238,238,237,237,238,240,241,240,241,243,241,241,240,240,240,241,240,240,240,240,240,240,240,240,239,239,239,239,239,238,242,245,241,240,241,241,242,240,240,240,242,242,241,240,241,243,242,240,241,241,242,240,239,238,240,241,241,239,239,239,240,240,241,239,239,
235,228,230,228,228,228,228,228,228,227,227,227,227,227,227,227,227,227,227,229,229,229,230,229,229,228,228,227,227,227,228,228,228,228,229,229,229,229,229,228,228,228,228,229,228,228,228,228,229,230,232,233,235,236,236,235,236,236,236,236,236,236,235,236,236,236,235,234,234,234,235,235,235,235,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,235,236,236,236,236,235,235,235,236,236,236,236,235,236,236,236,235,235,234,235,236,236,235,236,236,236,236,235,235,236,237,237,237,238,237,240,240,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,240,241,241,241,241,241,241,241,241,241,240,240,240,241,242,242,241,239,239,239,241,244,243,244,244,244,244,244,244,244,244,244,244,244,244,244,241,239,240,240,242,243,242,242,244,242,243,243,243,243,242,241,242,244,243,242,240,240,240,240,242,241,242,242,242,242,242,242,243,242,243,244,244,
235,228,229,228,230,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,230,230,230,230,229,229,229,228,229,228,228,228,230,231,232,233,234,236,236,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,235,235,236,238,238,238,236,235,236,236,237,237,236,236,237,238,238,238,238,238,238,238,236,236,236,237,237,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,241,241,241,240,240,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,240,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,242,243,242,241,243,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,244,
235,228,229,228,230,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,230,230,230,230,229,229,229,228,229,228,228,228,230,231,232,232,234,235,236,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,235,235,236,238,238,238,236,235,236,236,237,237,236,236,237,238,238,238,238,238,238,238,236,236,236,237,237,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,241,241,241,240,240,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,240,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,242,243,242,241,243,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,244,
235,228,229,228,230,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,230,230,230,230,229,229,229,228,229,228,228,228,230,231,232,232,234,235,236,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,235,235,236,238,238,238,236,235,236,236,237,237,236,236,237,238,238,238,238,238,238,238,236,236,236,237,237,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,240,240,240,241,240,240,240,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,240,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,242,242,242,241,243,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,244,
235,228,229,228,230,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,230,230,230,230,229,229,229,228,229,228,228,228,230,231,232,232,234,235,236,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,235,235,236,238,238,238,236,235,236,236,237,237,236,236,237,238,238,238,238,238,238,238,236,236,236,237,237,237,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,240,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,242,242,241,241,243,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,244,
235,228,229,228,230,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,230,230,230,230,229,229,229,228,229,228,228,228,230,231,232,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,235,235,236,238,238,238,236,235,236,236,237,237,236,236,237,238,238,238,238,238,238,238,236,236,236,237,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,240,240,240,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,240,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,241,242,242,242,241,241,243,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,243,244,
235,228,229,228,230,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,228,228,228,230,231,232,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,235,235,235,236,235,235,236,238,238,238,236,235,236,236,237,237,236,236,237,238,238,238,238,238,238,238,236,236,236,237,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,239,240,240,240,240,241,241,241,241,241,241,241,241,241,240,240,240,240,241,240,240,240,240,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,241,242,241,242,241,241,243,242,242,242,242,242,242,242,243,243,243,242,242,242,242,241,241,241,241,243,244,
235,228,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,228,228,228,230,231,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,235,236,236,237,237,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,235,235,235,236,236,235,236,238,238,238,236,235,236,236,237,237,236,235,237,238,238,238,238,238,238,238,235,236,236,237,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,239,240,240,240,239,241,241,241,241,241,241,241,241,241,240,240,240,240,240,240,240,240,240,241,241,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,242,242,242,242,242,241,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,241,241,241,241,242,244,
235,228,228,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,228,229,228,228,228,230,230,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,236,234,233,235,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,236,236,237,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,241,241,242,242,241,240,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,243,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,248,
235,228,228,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,228,229,228,228,228,230,230,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,236,236,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,236,236,237,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,241,241,242,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,243,244,
235,228,228,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,228,229,228,228,228,230,230,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,236,237,237,236,237,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,236,236,237,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,241,241,242,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,244,240,
235,228,228,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,228,229,228,228,228,230,230,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,236,239,238,236,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,236,236,237,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,241,241,242,242,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,244,238,
235,228,228,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,228,229,228,228,228,230,230,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,236,238,233,232,231,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,236,236,237,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,241,241,242,242,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,243,240,
235,228,228,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,228,229,228,228,228,230,230,231,232,234,235,235,236,236,236,235,236,238,238,238,236,236,236,236,236,236,236,236,234,231,232,227,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,236,236,237,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,241,241,242,242,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,244,
235,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,228,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,236,235,235,235,234,236,234,227,236,236,237,238,237,237,237,237,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,236,235,236,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,241,240,241,242,242,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,249,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,237,233,233,232,230,220,170,205,230,220,232,241,237,234,234,237,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,241,240,240,240,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,242,239,240,240,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,235,234,225,229,217,173,202,209,231,230,231,235,235,235,235,236,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,242,240,240,240,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,237,234,204,199,216,193,213,231,237,239,236,236,232,234,235,237,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,242,240,240,241,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,237,210,191,171,195,202,231,232,237,241,239,237,229,233,237,236,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,242,241,241,241,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,245,242,242,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,232,199,170,149,196,220,239,236,232,235,227,218,229,235,237,234,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,242,241,241,241,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,245,237,237,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,230,183,161,150,213,233,236,237,237,234,211,189,225,235,239,236,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,242,241,241,241,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,241,235,234,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,234,235,235,236,236,235,235,236,238,238,238,236,236,236,236,215,181,154,154,205,237,235,235,238,238,232,214,227,236,238,234,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,236,235,235,236,236,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,237,238,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,242,241,241,241,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,241,240,239,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,235,235,236,236,236,236,237,242,237,236,186,157,152,155,218,235,230,247,238,238,238,236,236,237,238,237,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,237,237,237,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,240,239,239,239,239,240,241,241,241,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,240,241,240,240,240,245,243,247,244,243,242,241,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,236,236,236,234,239,232,211,170,165,158,165,214,234,231,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,239,239,239,240,240,241,241,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,241,236,236,242,241,241,239,242,244,242,243,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,236,236,236,231,234,231,196,164,164,156,160,188,236,241,234,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,239,239,240,240,240,241,241,241,242,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,244,236,237,244,241,242,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,236,236,236,233,235,230,184,154,157,158,153,154,216,237,233,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,240,239,238,240,240,241,241,241,242,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,245,241,241,245,242,243,245,244,240,241,241,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,236,236,236,237,236,228,200,145,157,155,153,167,223,234,240,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,240,240,241,241,242,242,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,242,243,241,242,238,240,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,236,236,236,238,234,232,190,145,158,151,168,183,224,232,241,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,239,240,240,241,242,242,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,242,241,241,241,240,241,244,230,230,236,238,242,244,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,229,228,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,230,230,230,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,236,236,236,235,232,213,170,148,158,152,171,208,230,234,234,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,238,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,238,239,240,240,242,242,242,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,242,240,241,240,240,242,241,217,222,239,238,242,243,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,228,229,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,235,235,235,235,232,235,210,164,148,158,151,184,237,235,233,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,237,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,239,239,239,241,241,241,241,242,242,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,244,240,243,235,242,243,243,242,241,241,241,241,244,240,204,171,222,236,239,241,240,241,239,239,242,242,242,242,242,242,242,239,247,
236,227,229,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,231,232,233,234,234,235,236,236,236,235,235,235,235,235,234,210,168,153,156,153,183,230,234,236,232,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,239,239,240,241,242,241,241,243,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,245,244,247,242,242,243,243,242,242,242,242,241,240,242,212,161,150,200,240,241,239,241,243,240,242,242,242,242,242,242,242,239,247,
236,227,229,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,231,232,233,234,234,235,236,236,236,236,236,236,236,237,232,204,170,156,156,154,170,201,233,241,233,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,239,239,240,241,241,241,242,242,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,241,242,245,243,243,243,243,242,242,242,242,241,238,244,233,200,152,152,232,239,247,236,244,240,242,242,242,242,242,242,242,239,247,
236,227,229,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,231,232,233,234,234,235,236,236,236,236,236,236,236,239,230,210,170,155,157,151,170,197,232,242,233,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,240,241,241,241,241,242,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,243,236,234,244,243,243,243,242,242,242,242,241,239,242,247,233,214,150,184,240,244,239,241,236,242,242,242,242,242,242,242,239,247,
236,228,229,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,231,232,233,234,234,235,236,236,236,236,236,236,236,235,227,226,179,153,158,150,161,181,231,238,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,240,240,241,241,241,242,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,239,233,242,244,242,243,243,242,242,242,242,242,247,240,243,247,239,224,186,202,210,247,242,244,242,242,242,242,242,242,242,239,247,
236,228,229,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,231,232,233,234,234,235,236,236,236,236,236,236,236,233,229,204,161,155,157,154,150,172,226,237,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,240,240,241,241,241,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,241,223,227,242,243,243,243,242,242,242,242,242,246,240,239,240,241,233,222,162,194,230,245,244,242,242,242,242,242,242,242,239,247,
236,228,230,228,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,231,232,233,234,234,235,236,236,236,236,236,236,236,237,225,189,162,158,157,158,153,173,215,233,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,235,236,235,236,236,237,237,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,240,240,241,242,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,203,184,228,243,243,243,242,242,242,242,241,237,239,242,241,244,242,241,219,187,203,222,241,242,242,242,242,242,242,242,239,247,
236,228,230,228,229,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,232,233,234,234,235,236,236,236,236,237,237,237,237,224,182,157,159,158,156,155,179,224,229,237,238,238,238,236,238,238,238,238,238,238,238,237,237,237,237,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,236,238,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,240,240,240,240,240,240,241,241,241,241,242,242,242,242,242,242,242,242,242,241,242,242,243,240,197,165,198,239,244,242,243,242,242,242,241,237,241,242,243,242,239,240,241,218,183,182,233,240,243,240,242,239,241,242,239,247,
236,229,230,228,229,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,235,236,237,237,237,237,237,237,237,235,223,173,159,158,157,157,157,187,222,229,237,237,235,237,237,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,237,237,237,236,236,238,239,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,239,239,240,240,240,242,241,242,242,242,242,242,242,242,242,242,242,241,242,242,244,240,206,184,187,231,239,238,243,242,242,242,242,242,242,242,242,242,242,242,240,240,202,170,228,224,238,241,245,239,241,242,238,247,
236,229,230,228,229,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,235,236,237,237,237,237,237,237,237,232,220,166,155,158,157,157,157,161,196,234,230,233,234,232,237,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,237,236,237,236,236,238,239,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,239,240,240,240,240,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,243,245,226,230,218,234,239,238,246,242,242,242,242,242,242,242,242,242,242,242,240,242,232,201,233,205,221,242,240,244,242,240,239,247,
236,229,230,228,229,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,235,236,237,237,237,237,237,237,237,236,222,156,152,158,157,157,157,162,186,234,240,235,237,229,237,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,237,236,236,238,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,239,240,240,240,240,242,241,242,242,242,242,242,242,242,242,242,242,242,241,241,241,240,240,244,237,242,246,239,243,242,242,242,242,242,242,242,242,242,242,242,240,243,246,226,235,203,181,233,242,247,242,241,241,247,
236,229,230,229,230,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,235,236,237,237,237,237,237,237,237,238,210,148,154,157,157,157,157,155,160,231,232,240,241,233,235,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,240,240,241,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,241,240,239,236,237,238,235,241,247,237,236,242,242,242,242,242,242,242,242,242,242,242,241,238,244,240,243,193,140,212,238,244,242,241,242,247,
236,229,230,229,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,235,236,237,237,237,237,237,237,237,241,196,150,159,157,157,157,157,142,176,217,227,225,246,235,231,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,236,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,241,240,240,241,241,241,242,241,242,242,242,242,242,242,242,242,242,242,243,242,239,236,237,245,245,219,228,243,242,246,242,242,242,242,242,242,242,242,242,242,242,242,235,235,240,243,202,172,186,207,236,243,240,241,247,
236,229,230,229,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,235,236,237,237,237,237,237,237,237,235,179,149,155,155,157,157,157,163,156,158,171,205,239,232,234,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,235,237,238,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,241,240,240,241,241,241,242,241,242,242,242,242,242,242,242,242,242,242,244,243,238,238,216,205,198,184,186,215,234,243,242,242,242,242,242,242,242,242,242,242,242,243,241,235,237,239,243,214,130,181,225,243,241,241,247,
236,229,231,229,230,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,231,231,233,234,234,236,236,236,236,236,237,237,237,229,170,147,157,153,157,157,157,153,154,154,165,201,226,233,232,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,235,236,236,236,235,235,237,238,239,239,239,240,239,241,240,240,241,239,239,240,240,241,240,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,241,243,240,243,242,243,242,242,241,241,242,242,242,242,242,243,243,239,239,202,156,141,164,152,183,206,227,242,241,242,243,242,242,242,242,242,242,242,243,246,246,241,241,241,229,142,197,223,243,242,241,247,
236,229,231,230,230,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,235,236,234,234,236,237,237,237,228,173,135,158,156,157,157,157,155,153,159,153,160,216,238,232,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,234,235,236,236,236,236,237,237,240,239,239,239,238,242,238,238,244,237,238,241,240,241,239,237,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,240,247,234,243,245,244,242,241,240,240,245,243,242,242,242,243,244,243,234,172,148,147,154,152,156,158,207,241,242,243,245,242,242,242,242,242,242,242,242,242,242,242,241,242,238,200,226,242,242,242,239,247,
236,229,231,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,235,235,237,236,236,237,237,237,233,177,145,156,155,157,157,157,160,152,158,161,162,222,232,236,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,235,235,236,236,237,236,237,237,240,239,239,240,242,236,238,240,238,240,243,243,241,241,238,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,237,239,233,237,244,240,237,237,238,242,243,242,242,242,242,240,237,234,230,169,155,154,151,151,156,152,187,237,240,244,236,242,242,242,242,242,242,242,242,242,242,242,241,251,244,199,235,242,242,242,239,247,
236,229,231,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,234,234,238,239,237,237,237,237,236,181,148,154,155,157,157,157,154,154,155,154,177,230,239,240,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,235,236,236,236,237,237,238,238,240,238,239,239,243,236,242,243,232,240,241,235,235,235,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,239,243,238,239,241,243,240,242,243,244,240,240,242,242,242,242,236,211,217,166,154,159,150,148,158,140,167,219,239,237,242,242,242,242,242,242,242,242,242,242,242,242,240,243,238,207,239,242,242,242,239,247,
236,229,231,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,234,235,236,238,238,237,237,237,236,191,152,156,155,157,157,157,154,154,157,157,189,239,239,241,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,235,236,237,237,237,237,238,238,240,238,239,239,243,239,244,236,239,243,240,240,238,237,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,240,242,220,235,245,239,236,245,250,242,241,243,242,242,242,244,234,206,203,155,148,155,150,150,157,144,147,199,235,244,243,242,242,242,242,242,242,242,242,242,242,242,239,237,231,210,239,242,242,242,239,247,
236,229,231,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,234,235,234,234,236,237,237,237,238,199,150,158,155,157,157,157,161,152,158,175,190,215,199,235,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,235,237,237,237,237,237,238,238,239,238,239,239,239,243,241,207,225,237,242,239,245,250,243,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,241,237,222,189,197,234,242,244,238,247,240,239,244,242,242,242,241,231,192,183,154,144,150,152,151,156,148,147,168,230,250,238,242,242,242,242,242,242,242,242,242,242,242,241,244,239,218,238,242,242,242,239,247,
236,229,231,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,235,234,233,230,233,237,237,237,233,199,148,155,156,157,157,157,165,154,158,155,170,161,154,209,238,238,238,238,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237,236,237,238,237,238,237,239,238,239,238,238,238,238,243,220,196,172,188,216,220,219,238,244,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,240,218,166,161,196,220,224,213,230,240,240,243,242,242,242,240,224,177,212,167,148,151,153,149,154,154,150,148,198,237,236,242,242,242,242,242,242,242,242,242,242,242,243,245,245,232,242,242,242,242,239,247,
236,229,231,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,231,231,231,233,234,234,236,233,233,227,230,237,237,237,234,193,141,158,158,157,157,157,153,155,154,160,120,110,121,186,238,238,237,237,238,238,238,237,235,235,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,238,238,238,237,239,239,239,238,238,238,238,240,204,168,159,165,172,169,199,213,237,238,240,241,241,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,242,227,173,140,157,181,161,199,222,240,240,241,241,242,242,246,209,166,175,166,157,152,152,155,146,148,153,145,161,219,245,241,242,241,241,242,242,242,242,242,242,242,240,236,245,236,242,242,242,242,239,247,
236,229,231,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,238,201,144,155,156,157,157,157,157,156,157,142,124,129,121,181,241,239,237,236,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,238,237,237,238,238,239,239,239,240,239,240,231,239,218,156,157,157,157,153,148,192,224,245,239,241,243,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,242,232,233,224,144,152,152,152,154,178,230,234,239,239,241,241,245,204,154,175,158,150,152,152,151,152,152,152,151,155,174,215,236,243,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,229,231,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,235,189,149,156,157,157,157,157,157,157,156,147,122,127,123,159,233,232,238,236,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,237,237,238,239,239,239,240,239,240,243,241,213,158,157,157,157,159,163,178,221,235,236,238,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,244,235,216,145,152,152,152,148,159,180,204,231,233,234,234,231,178,147,155,165,148,154,149,151,152,152,151,147,155,168,197,239,243,239,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,228,231,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,234,184,160,156,156,157,157,157,156,156,157,148,126,130,124,150,203,231,237,237,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,239,239,240,239,240,245,241,202,158,157,157,157,160,157,163,183,213,236,237,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,238,246,240,218,150,152,152,152,159,151,146,157,190,200,201,199,185,160,145,155,160,147,156,149,151,152,152,151,149,155,153,181,233,244,242,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,228,231,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,232,180,160,156,157,157,157,157,157,156,156,142,133,133,133,137,177,226,240,236,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,237,237,239,239,239,240,239,240,235,237,191,155,157,157,157,153,147,157,160,192,241,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,240,242,220,154,152,152,152,148,148,149,145,151,153,153,148,153,148,148,157,150,147,155,148,151,152,152,151,151,148,143,161,206,235,244,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
236,228,230,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,228,170,153,156,157,157,157,157,155,156,156,147,140,135,145,136,170,214,240,236,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,237,237,238,239,239,240,239,241,239,235,172,157,157,157,157,154,152,155,146,165,231,243,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,232,240,218,156,152,152,152,151,152,153,152,149,148,152,151,148,160,149,148,147,148,154,149,151,152,152,151,149,155,151,157,186,228,243,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,230,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,224,163,153,155,158,157,157,157,155,157,156,155,138,138,147,139,154,202,237,238,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,235,237,236,236,237,237,238,239,239,240,239,241,242,234,175,160,157,157,157,155,162,155,132,154,217,238,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,238,237,241,217,152,152,152,152,155,153,150,149,154,155,157,159,148,159,153,153,151,149,153,152,152,152,152,151,148,161,143,151,172,218,243,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,230,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,231,234,234,235,235,235,235,235,236,238,237,237,224,155,153,156,158,157,157,157,156,157,157,157,142,139,146,141,131,188,232,238,238,238,238,237,235,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,235,237,236,236,237,237,238,238,239,240,239,240,233,226,167,156,157,157,157,157,158,157,138,163,195,232,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,246,242,225,153,152,152,152,155,153,151,151,151,149,152,152,151,156,147,145,153,152,149,151,152,152,152,151,151,158,143,151,159,218,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,229,230,230,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,231,231,233,233,234,234,232,238,238,234,236,235,235,227,159,162,156,156,157,157,157,155,155,153,158,155,138,143,136,142,149,226,236,238,238,238,237,235,236,236,236,237,236,236,236,236,236,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,237,238,239,240,238,240,239,240,241,182,153,158,158,157,155,157,155,154,153,159,166,217,246,240,242,242,241,240,243,243,241,240,240,239,236,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,242,240,220,153,152,152,152,153,148,154,153,153,152,156,152,156,151,146,149,152,154,150,157,153,155,152,154,160,151,150,157,153,189,246,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,229,231,230,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,230,231,231,233,233,234,234,232,236,237,234,236,235,235,227,153,158,156,157,157,157,157,151,158,156,160,158,143,138,140,140,146,221,233,238,238,238,237,235,236,236,236,237,237,237,236,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,237,238,240,240,238,239,239,240,230,173,146,155,166,157,158,157,155,157,156,156,156,194,234,239,242,241,240,241,240,240,237,237,241,242,241,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,244,242,224,161,152,152,152,150,152,151,147,147,150,156,146,154,154,153,155,150,147,149,150,146,151,147,149,153,146,148,156,151,174,237,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,229,230,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,230,231,231,233,233,234,236,228,226,236,236,236,235,235,232,158,155,155,156,157,157,157,153,155,152,161,156,164,141,144,133,146,221,233,238,238,238,237,235,236,236,236,238,237,237,236,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,236,238,240,240,238,239,239,240,207,162,153,152,163,154,156,156,156,157,157,160,156,184,225,239,241,239,239,242,238,237,236,241,243,236,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,247,240,203,153,152,152,152,153,151,150,152,148,147,154,144,146,149,156,158,150,151,152,149,150,146,151,148,147,150,148,146,150,158,221,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,228,229,230,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,230,231,231,233,233,234,236,221,218,237,236,236,235,235,227,155,145,157,156,157,157,157,155,156,156,126,127,163,146,143,135,148,217,236,238,238,238,237,235,236,236,236,238,237,237,236,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,236,238,239,240,238,239,239,239,199,150,157,148,158,139,156,161,158,157,157,159,150,167,227,237,238,240,239,242,239,240,243,239,236,238,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,238,237,238,204,158,152,152,152,154,133,131,151,151,128,140,142,124,120,127,138,142,142,143,147,141,142,135,133,145,144,144,150,153,159,222,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,227,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,230,231,231,233,233,234,236,223,221,236,236,236,235,235,230,155,138,157,156,157,157,157,154,158,158,141,117,148,145,140,141,153,211,239,238,238,238,237,235,236,236,236,238,237,237,236,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,236,237,239,240,238,239,239,239,191,143,155,149,157,125,151,158,157,159,155,153,158,165,230,240,236,239,240,242,238,244,248,238,241,244,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,239,238,238,203,153,152,152,152,132,36,35,125,132,33,45,102,21,34,28,125,88,97,93,123,57,90,43,32,144,71,121,152,155,152,214,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
234,227,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,230,231,231,233,233,234,235,230,230,237,235,236,235,235,230,155,140,156,157,157,157,157,155,159,159,148,126,137,141,140,143,146,204,235,238,238,238,237,235,236,236,236,238,238,237,236,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,236,237,239,239,238,239,239,239,185,141,156,151,155,127,137,143,147,160,157,153,160,167,205,236,236,238,242,242,237,244,238,216,231,243,237,235,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,240,243,243,217,153,152,152,152,89,81,94,75,83,90,70,83,70,129,71,62,38,128,88,122,33,94,47,48,69,37,151,153,154,149,212,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
234,227,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,230,231,231,233,233,234,234,231,237,238,234,236,235,235,230,155,148,158,157,157,157,157,156,156,153,138,123,135,137,144,139,135,189,226,238,238,238,237,235,236,236,237,238,238,237,237,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,236,237,239,239,238,239,239,239,191,147,152,151,144,126,124,128,137,159,157,154,156,153,180,222,237,236,241,242,236,242,222,187,194,224,243,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,241,240,239,222,154,152,152,152,72,121,134,56,65,132,134,99,56,92,97,41,34,139,88,88,53,88,40,76,57,33,153,152,157,161,220,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,228,228,229,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,234,233,236,237,236,237,236,236,222,148,149,161,156,161,157,158,164,153,133,124,119,134,139,143,139,135,165,206,238,239,234,238,237,236,235,236,236,236,236,236,236,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,236,236,237,237,239,240,237,242,238,242,198,147,150,150,136,126,125,123,128,149,159,153,152,150,155,178,225,238,240,240,234,240,222,168,162,218,244,244,241,241,241,240,239,242,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,237,239,240,212,172,150,153,152,71,116,124,57,66,131,147,114,37,58,103,68,66,145,91,57,90,90,42,98,89,66,149,154,152,183,230,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,228,228,229,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,235,235,235,236,238,238,237,237,221,149,141,157,156,159,154,160,160,129,126,122,132,142,141,140,141,137,147,184,208,232,232,234,238,235,234,235,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,240,240,240,238,237,190,145,151,150,132,126,124,121,123,136,158,158,155,148,137,154,216,239,240,238,239,242,213,152,160,209,241,244,241,241,241,241,240,242,240,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,237,240,244,223,178,147,146,153,83,90,105,69,74,114,93,82,77,137,139,46,73,148,96,39,116,94,43,128,42,90,150,150,152,202,243,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,229,229,229,228,228,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,235,235,235,236,238,238,237,237,227,152,138,153,152,151,149,159,134,122,127,121,135,142,140,143,143,136,134,160,161,214,234,229,235,235,234,236,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,240,241,235,234,234,174,146,151,151,133,126,123,122,124,126,144,157,162,146,137,149,209,238,240,237,244,240,204,146,155,187,234,239,241,241,241,242,243,240,238,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,238,243,245,241,178,154,156,160,131,27,31,116,114,32,35,97,19,34,119,36,87,149,95,57,120,88,41,147,16,108,148,148,160,215,249,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,227,229,229,228,229,228,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,235,235,235,236,238,238,237,237,227,155,136,152,159,154,154,147,122,124,125,121,141,140,140,138,141,138,127,139,140,165,189,218,232,236,234,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,240,242,234,238,233,172,148,152,147,137,127,123,124,125,125,133,154,161,143,139,143,201,239,241,236,239,235,218,153,138,172,235,241,241,241,241,238,242,237,237,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,236,245,238,234,203,154,147,156,159,132,122,149,149,116,131,136,102,99,142,119,134,148,134,130,141,135,116,152,108,140,153,151,167,216,247,233,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,227,229,229,228,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,235,235,235,236,238,238,237,237,230,158,145,163,162,155,160,130,126,127,136,146,141,140,143,141,140,143,135,136,147,134,146,179,230,237,232,236,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,240,242,237,251,219,162,149,154,147,144,130,123,125,124,124,127,125,121,134,141,140,212,238,240,240,237,236,217,160,142,161,231,244,241,241,241,235,235,234,243,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,238,241,234,232,213,190,149,137,143,140,150,150,150,148,151,149,153,153,149,154,151,146,155,152,155,155,160,147,148,146,147,153,185,219,240,237,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,229,229,229,228,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,235,235,235,236,238,238,237,237,229,153,145,146,147,152,150,126,127,125,129,140,140,141,139,140,141,144,143,141,139,134,134,154,223,237,232,238,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,240,241,241,249,206,149,150,153,150,148,131,123,126,126,124,128,117,121,129,140,148,226,239,239,243,242,242,218,172,143,160,216,240,241,241,241,240,234,230,242,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,241,244,235,248,238,227,192,164,141,148,145,152,152,152,150,153,157,152,153,154,150,152,152,151,151,153,154,147,147,154,145,165,204,240,241,250,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,228,228,229,227,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,230,230,231,232,233,233,235,235,235,236,238,238,237,237,224,152,151,148,147,156,147,125,125,119,130,141,140,141,140,142,141,141,142,142,145,141,131,161,220,238,232,239,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,236,236,236,237,237,236,237,238,239,240,241,239,239,190,147,153,149,148,148,131,124,127,126,128,128,125,122,128,140,155,234,239,238,244,240,242,237,179,142,156,196,240,241,241,241,241,237,225,230,237,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,239,237,247,239,250,239,242,220,201,188,177,150,149,155,154,152,153,151,147,148,146,152,150,150,151,152,154,150,149,152,153,151,183,224,246,241,247,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
234,227,227,229,229,227,227,225,228,229,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,229,230,230,230,231,232,232,233,234,235,235,237,238,237,238,235,222,143,155,150,149,156,152,123,123,120,134,140,140,139,140,140,140,140,140,140,142,148,141,147,215,238,232,238,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,237,237,238,238,239,240,240,240,227,170,147,152,151,152,149,134,124,126,125,128,122,127,124,126,139,160,231,241,238,243,239,238,240,178,149,141,181,240,241,239,242,238,239,229,228,240,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,239,236,244,241,241,240,241,234,227,215,195,165,153,149,154,155,148,152,152,155,153,153,153,148,151,150,153,149,150,156,149,157,194,240,240,241,240,242,242,242,242,242,242,242,241,239,241,241,243,238,243,238,241,247,
234,225,227,231,227,227,226,224,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,230,232,232,232,233,234,235,236,237,240,236,238,237,209,137,158,152,154,155,154,131,134,129,138,138,140,140,140,140,141,141,141,140,140,141,141,142,201,236,235,239,236,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,237,244,212,158,151,152,152,152,151,135,124,123,129,126,125,125,125,122,139,153,210,240,240,238,240,242,241,189,155,144,178,237,242,236,243,239,241,241,241,241,241,240,238,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,240,240,240,240,241,241,241,240,241,237,221,198,158,149,154,157,151,151,151,152,151,150,150,150,152,150,150,150,154,155,145,166,216,242,242,242,242,242,242,242,242,242,242,242,240,237,240,241,239,221,238,235,242,247,
235,227,228,228,223,220,226,225,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,230,232,232,232,233,234,235,236,237,238,237,239,238,202,148,159,152,153,152,154,147,149,144,142,139,141,141,141,141,141,141,141,140,140,141,141,143,193,237,234,237,236,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,239,237,208,152,152,150,151,151,147,133,127,123,128,123,125,121,124,122,139,140,180,230,240,236,239,241,241,196,157,153,169,222,243,238,243,239,241,241,241,241,241,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,240,240,240,240,241,241,241,240,241,241,238,217,169,156,148,147,153,151,150,152,153,151,150,152,151,153,148,153,155,149,151,187,226,242,242,242,242,242,242,242,242,242,242,242,242,243,240,240,233,213,239,237,240,247,
236,229,227,225,225,218,227,225,227,227,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,230,232,232,232,233,234,235,236,237,230,235,239,233,186,149,155,149,152,150,150,149,151,152,148,141,141,142,142,141,141,141,141,141,141,141,141,144,189,239,235,236,236,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,241,233,191,144,151,151,153,151,150,144,138,137,127,127,126,122,125,122,138,137,147,208,245,237,244,239,237,194,153,143,166,210,243,239,243,239,241,241,241,238,238,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,240,240,240,240,241,241,241,240,241,243,245,240,190,150,155,146,147,152,151,151,152,152,151,152,151,161,155,154,159,148,151,204,240,242,242,242,242,242,242,242,242,242,242,242,242,245,241,241,242,229,250,239,239,247,
234,227,226,224,207,224,228,228,225,224,226,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,230,232,232,232,233,234,235,236,237,239,231,234,216,166,146,149,147,150,151,150,150,147,151,149,141,141,141,141,141,141,141,141,141,141,141,141,142,177,234,236,238,236,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,243,233,178,149,155,153,151,142,140,137,139,155,150,157,144,126,123,120,137,140,142,175,234,237,245,238,235,183,147,138,145,204,240,240,241,238,241,241,241,238,238,239,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,240,240,240,240,241,241,241,240,241,244,236,245,224,171,164,154,150,151,150,150,153,151,151,149,151,153,158,149,150,147,154,220,243,242,242,242,242,242,242,242,242,242,242,242,240,241,241,241,236,223,244,243,242,247,
236,221,229,207,195,226,227,228,226,223,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,230,232,232,232,233,234,235,236,237,241,239,246,198,143,143,147,149,150,150,150,152,148,151,142,141,141,141,141,141,141,141,141,141,141,141,141,142,173,231,232,234,236,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,242,228,155,135,138,138,139,136,144,140,155,167,158,157,150,127,120,121,140,143,141,154,194,222,238,238,233,197,159,155,136,191,234,241,240,239,241,241,241,242,239,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,240,240,240,240,241,241,241,240,241,246,235,241,233,170,142,144,155,152,152,149,150,150,152,148,151,146,170,184,169,152,173,229,242,242,242,242,242,242,242,242,242,242,242,242,239,239,242,240,230,240,237,241,240,247,
231,226,182,200,186,219,231,230,227,225,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,231,230,232,232,232,233,234,235,236,237,231,232,211,151,126,154,149,152,151,150,150,151,150,147,138,142,142,142,142,142,141,141,141,141,141,141,140,140,157,224,235,239,236,236,236,236,237,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,237,225,145,146,142,141,141,141,142,142,162,158,156,152,160,148,125,132,139,141,138,141,149,187,226,241,236,224,187,174,144,181,229,239,242,241,241,241,241,240,238,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,240,240,240,240,241,241,241,240,241,244,239,238,238,207,187,156,148,149,150,150,152,150,152,150,150,164,215,227,208,156,185,242,238,242,242,242,242,242,242,242,242,242,242,242,240,241,243,240,230,237,237,238,238,247,
236,190,181,219,200,218,214,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,230,231,232,232,233,234,234,236,237,234,207,151,107,111,163,133,127,129,142,128,126,145,139,123,122,140,130,118,133,129,117,123,140,141,141,141,139,146,218,232,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,237,239,239,239,239,236,227,143,149,142,142,142,141,139,138,157,153,158,154,153,149,135,142,139,138,139,128,138,156,217,241,243,242,199,172,154,182,227,240,243,241,241,241,241,237,237,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,240,241,241,241,240,239,240,240,240,240,240,241,241,241,241,241,239,238,243,237,242,216,175,148,150,154,149,153,152,152,154,149,151,234,247,216,158,204,243,247,242,242,242,242,241,242,242,242,241,241,242,241,241,243,240,227,202,238,242,238,247,
234,209,221,230,226,224,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,238,231,240,233,201,156,108,16,33,117,41,28,49,98,19,31,128,127,37,27,112,57,26,75,71,25,40,131,142,142,142,141,150,226,236,235,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,236,237,238,237,239,239,239,239,237,246,171,135,141,141,141,140,140,141,158,156,158,158,156,159,152,142,140,136,141,138,143,145,197,237,240,240,238,219,166,156,213,245,244,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,237,239,238,237,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,243,232,189,146,161,167,147,159,158,152,162,149,169,226,245,214,163,207,244,247,242,242,242,242,241,242,241,242,238,239,242,241,240,246,238,235,226,242,238,240,247,
231,207,219,229,226,224,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,237,232,234,217,158,135,111,57,93,63,55,117,134,102,80,123,140,104,74,78,72,28,121,38,69,98,61,98,142,142,142,141,151,226,233,232,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,236,237,238,237,239,239,239,239,238,243,174,133,141,141,141,140,140,141,158,155,158,155,157,155,158,152,143,142,152,139,143,141,184,234,239,242,234,238,192,160,208,234,241,237,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,239,239,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,239,247,212,178,176,187,166,149,152,162,169,159,199,237,244,217,159,205,238,243,242,242,242,242,241,240,240,241,238,242,239,242,240,245,242,236,232,239,242,239,247,
231,215,224,230,226,225,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,238,233,230,205,139,129,110,65,128,59,51,91,111,102,95,134,132,128,95,53,88,40,150,42,67,111,95,84,142,142,142,141,153,226,234,231,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,236,236,237,237,239,239,239,239,237,243,189,133,141,141,141,141,141,140,161,153,156,153,155,155,155,155,155,151,156,141,140,136,169,236,238,244,239,236,208,165,210,237,238,237,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,241,239,238,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,238,249,235,208,214,231,188,155,153,149,158,176,225,250,241,223,157,218,239,240,242,242,242,242,242,242,242,243,241,245,240,241,241,244,243,239,233,242,237,241,247,
235,223,229,231,227,226,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,234,236,233,194,121,130,115,59,117,60,50,53,80,104,95,136,141,130,43,64,133,38,135,42,71,112,96,89,142,142,142,142,155,225,236,237,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,236,236,237,237,239,239,239,239,238,242,203,142,141,141,141,141,141,142,168,158,154,157,156,157,157,151,154,159,178,141,134,137,163,240,239,243,246,242,227,184,218,247,241,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,238,243,237,235,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,241,242,238,227,240,247,202,161,152,144,161,179,240,246,240,230,172,228,242,241,242,242,242,241,241,241,241,243,241,247,236,240,239,243,244,235,226,245,237,241,247,
234,226,229,230,228,226,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,233,236,230,173,128,135,116,66,105,60,58,117,140,108,89,140,142,105,57,93,110,41,140,44,72,115,75,102,142,142,142,144,152,215,238,239,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,236,236,237,237,239,239,239,239,238,240,213,159,141,141,141,141,141,137,146,141,155,159,160,155,156,156,157,157,182,142,138,144,170,242,240,230,239,245,237,202,218,242,243,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,240,232,232,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,242,243,240,239,241,245,224,190,157,146,163,174,237,241,238,246,180,232,246,246,242,242,242,241,239,239,239,242,241,244,235,243,238,242,244,238,240,238,236,241,247,
235,229,229,230,228,226,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,233,235,221,147,133,133,104,17,29,103,42,33,61,90,83,141,143,123,27,23,117,38,142,42,66,27,24,128,142,142,142,144,143,197,236,234,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,236,239,239,239,239,240,233,233,171,141,141,141,141,141,138,141,143,158,160,158,150,160,156,157,161,175,143,140,147,178,240,239,201,218,240,231,215,225,235,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,242,244,227,223,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,242,246,242,238,234,238,235,186,170,172,166,193,237,238,242,246,196,227,244,240,242,242,242,241,239,241,239,241,238,245,232,232,243,242,240,239,239,238,235,241,247,
234,229,226,229,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,230,232,233,233,234,233,208,116,126,121,120,94,95,137,111,95,118,103,120,137,138,141,109,106,137,104,139,106,114,98,117,134,142,142,142,142,134,185,225,231,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,237,235,236,237,236,238,239,239,239,241,236,242,185,141,141,141,141,140,140,146,152,158,145,150,158,159,157,156,164,186,146,138,141,178,234,240,206,236,241,230,237,239,233,243,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,226,226,241,241,241,239,239,240,240,240,241,240,241,242,241,242,242,242,242,242,242,242,239,239,244,244,247,241,206,212,204,214,230,235,243,240,243,204,225,237,237,242,242,242,241,240,247,243,241,239,242,226,233,246,241,240,239,217,246,242,238,247,
235,228,228,228,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,229,230,230,230,232,232,229,235,242,239,161,123,125,129,132,137,136,144,153,157,156,142,142,146,136,144,130,139,139,144,137,139,130,143,139,137,141,142,141,142,134,159,214,240,240,237,232,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,237,237,238,238,239,239,239,239,242,245,246,188,141,141,142,142,142,138,146,140,153,150,148,160,154,153,159,172,174,122,133,128,170,234,241,236,243,239,237,241,242,243,241,239,240,240,240,240,241,241,241,241,241,241,241,239,244,245,237,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,241,241,241,243,241,235,237,244,235,242,248,244,243,236,240,239,244,245,233,232,240,246,242,243,234,236,208,214,233,235,238,243,240,239,245,221,231,243,240,246,238,240,241,241,224,224,244,235,242,226,229,231,235,243,232,235,245,237,241,247,
235,228,229,228,228,226,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,230,230,231,232,229,234,236,224,146,128,120,128,131,136,146,153,161,156,144,140,138,142,140,142,135,140,140,138,138,140,141,145,142,143,143,140,142,139,134,151,182,229,236,236,233,238,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,237,237,238,238,239,239,239,239,237,241,240,179,141,140,141,142,139,137,148,151,153,152,148,162,159,157,160,153,158,124,124,127,185,242,240,237,238,224,236,240,237,237,235,239,241,241,240,240,241,241,241,241,241,241,241,239,241,240,237,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,237,238,241,238,237,238,238,236,244,242,246,238,241,227,217,226,234,239,245,245,249,240,230,246,243,241,241,238,241,239,239,242,243,242,240,224,219,216,228,229,244,236,241,251,247,243,233,244,240,237,237,245,238,241,247,
235,228,229,229,228,224,217,226,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,230,229,230,231,231,231,234,234,209,127,126,117,129,136,140,146,145,148,144,136,135,137,137,143,145,132,150,142,137,138,148,145,145,137,145,140,141,142,141,138,136,155,210,233,236,234,238,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,237,237,238,238,239,239,239,239,235,237,237,172,141,140,139,140,142,139,149,149,153,153,149,158,156,158,156,137,139,117,123,122,208,236,242,240,234,218,229,240,235,232,233,240,241,241,240,240,241,241,241,241,241,241,241,239,236,237,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,242,245,239,240,242,239,243,239,247,233,205,228,233,228,226,240,242,245,245,247,242,245,244,244,239,246,247,237,236,239,236,244,235,185,209,184,223,240,249,245,238,239,234,216,226,242,240,237,237,244,238,240,247,
235,228,229,228,227,220,202,225,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,229,230,230,231,231,231,238,180,122,123,126,127,105,144,118,126,118,116,119,125,93,95,125,112,137,107,117,124,135,100,119,100,137,117,129,142,142,140,145,135,138,191,230,235,233,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,237,238,238,239,239,239,239,237,240,240,168,140,140,139,139,141,140,155,149,152,153,151,153,157,163,146,133,135,120,126,133,217,236,238,241,236,229,225,242,238,233,236,241,241,240,240,240,241,241,241,241,241,241,241,239,236,236,244,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,242,240,243,246,243,239,239,241,241,233,223,199,216,237,232,211,219,234,240,240,244,238,238,242,242,242,239,244,236,224,236,243,241,195,171,220,217,228,236,249,245,239,245,209,180,221,241,238,239,237,243,239,239,247,
235,228,229,228,226,226,209,223,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,229,230,230,232,232,229,230,160,127,119,130,124,42,130,53,97,76,54,72,84,29,49,106,48,130,35,71,104,83,38,41,32,130,58,115,141,142,140,147,145,137,178,226,235,234,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,236,237,237,239,239,239,239,241,244,240,163,144,141,138,137,141,140,151,151,151,152,152,151,175,168,131,124,122,119,126,140,218,230,239,239,242,237,230,244,241,237,240,242,239,240,240,240,241,241,241,241,241,241,241,239,236,235,238,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,239,241,239,241,240,242,239,228,227,212,222,202,222,231,219,223,210,191,203,221,238,241,240,240,242,243,241,240,232,240,199,160,194,241,235,178,189,232,233,229,238,243,240,233,230,212,205,230,244,233,239,239,243,240,238,247,
235,228,229,226,228,226,221,226,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,229,230,230,232,233,228,214,138,127,124,130,139,41,48,46,109,66,45,56,78,77,131,136,52,96,71,79,108,40,117,55,48,50,34,136,141,141,141,141,145,141,161,222,235,235,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,236,237,237,239,239,239,239,240,243,236,159,142,139,141,145,140,138,147,151,150,152,153,152,179,158,131,129,121,121,126,151,217,237,240,234,242,239,238,243,241,238,241,239,239,241,241,240,241,241,241,241,241,241,241,239,239,235,233,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,240,241,234,234,228,229,212,187,189,199,218,218,233,230,232,223,207,212,207,224,234,236,221,237,247,243,242,238,210,206,158,100,144,209,212,158,222,243,236,235,237,243,235,205,222,210,224,238,246,233,243,240,244,241,238,247,
235,228,229,227,227,226,225,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,229,230,230,233,234,228,199,123,125,131,117,140,60,64,60,108,50,56,49,84,44,74,131,30,26,90,75,108,39,141,122,71,64,41,141,142,142,142,138,138,145,148,221,235,235,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,236,236,236,237,237,239,239,239,239,236,239,234,160,142,139,144,152,141,141,152,151,150,153,154,155,184,161,127,121,125,125,121,159,221,242,241,233,237,240,239,239,237,238,237,236,240,244,243,240,241,241,241,241,241,241,241,239,241,237,232,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,234,220,195,173,176,171,173,214,238,241,239,238,242,237,238,241,234,233,233,229,229,220,237,241,239,241,209,179,140,100,132,153,150,147,233,244,238,243,235,244,241,213,210,225,235,245,243,243,245,242,244,242,239,247,
235,228,229,227,227,227,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,229,230,231,231,230,230,228,164,122,125,127,122,137,77,77,82,106,46,77,48,88,37,62,131,37,75,48,71,108,36,141,136,83,72,64,140,141,141,142,142,144,140,151,222,236,235,235,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,236,235,236,236,237,237,239,239,239,240,239,237,226,151,140,143,153,150,149,149,152,151,152,152,148,162,198,143,126,122,125,122,121,161,209,242,241,241,239,241,240,238,239,237,230,234,239,240,242,239,241,241,241,241,241,241,241,241,238,234,237,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,238,238,243,240,236,241,229,182,196,190,207,206,201,220,235,235,247,243,243,245,244,241,242,241,238,234,243,235,242,220,238,243,228,167,140,100,135,117,127,144,235,245,240,246,236,246,236,213,223,242,240,243,242,243,242,242,242,242,239,247,
235,228,229,227,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,231,234,232,230,208,141,124,125,125,122,138,104,35,103,106,31,90,25,84,80,140,146,50,140,30,71,107,33,132,50,114,40,88,134,135,135,135,140,142,129,154,225,236,234,235,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,235,235,236,237,237,237,239,239,239,240,240,241,214,140,135,141,153,150,152,152,152,151,151,151,150,162,198,135,121,121,123,122,124,149,207,245,239,242,241,241,241,239,240,235,231,239,239,235,243,240,241,241,241,241,241,241,241,243,237,225,230,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,236,225,236,241,239,238,239,216,197,224,234,239,234,232,237,245,241,250,236,238,243,238,236,245,246,242,238,247,241,234,200,245,241,221,165,138,85,131,122,127,170,229,218,214,239,244,232,216,222,237,242,240,242,242,242,242,242,242,242,239,247,
235,228,229,227,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,231,236,231,233,161,130,126,124,124,127,140,121,17,119,107,25,103,28,89,9,13,106,21,12,48,79,105,88,12,51,142,17,120,142,144,144,144,139,143,153,177,230,237,233,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,235,235,236,236,237,237,239,239,239,240,239,244,217,148,153,154,155,150,152,152,152,151,152,153,152,176,193,132,117,121,123,124,127,153,220,237,241,239,241,241,241,240,239,235,233,242,240,236,246,242,241,241,241,241,241,241,241,241,236,233,217,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,227,237,238,238,240,222,208,240,243,247,245,244,243,242,242,240,241,245,243,230,234,241,245,241,244,242,241,242,219,194,234,245,220,162,144,105,114,128,158,219,222,167,153,208,239,232,228,240,243,241,240,242,242,242,242,242,242,242,239,247,
235,228,229,227,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,231,231,232,236,225,143,121,125,124,124,125,135,144,114,139,131,120,137,113,129,112,114,134,117,113,140,131,132,152,122,139,139,116,136,140,140,142,143,143,144,184,205,232,238,232,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,235,235,236,236,237,237,239,239,239,240,241,241,175,144,144,150,152,151,152,152,152,150,150,155,155,176,180,123,123,126,123,125,125,159,212,240,240,239,241,241,241,240,239,238,231,239,239,230,241,241,241,241,241,241,241,241,241,240,242,234,191,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,237,242,241,240,231,189,217,243,241,242,236,236,243,242,237,237,239,227,233,221,207,244,239,239,245,247,238,238,243,234,246,225,181,150,138,113,120,133,188,235,240,232,230,201,230,244,243,246,243,240,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,230,231,231,231,227,235,223,152,146,123,125,125,123,132,138,141,140,141,146,140,139,142,143,146,137,142,139,142,140,136,139,146,139,134,141,141,149,143,136,133,138,166,215,240,234,238,232,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,235,235,236,236,237,237,239,239,239,240,248,226,148,129,138,148,151,151,152,152,152,151,152,155,153,179,200,129,125,127,123,126,120,159,237,232,242,242,241,241,241,241,239,239,230,234,233,219,235,240,241,241,241,241,241,241,241,238,243,237,228,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,243,244,247,241,235,209,164,188,234,236,234,236,241,243,244,238,240,248,215,223,196,220,241,239,237,239,243,236,241,237,239,229,189,171,153,144,102,123,148,209,242,244,241,249,216,213,241,239,242,239,239,243,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,231,231,231,231,232,223,188,159,125,126,125,122,132,137,138,141,142,143,140,138,138,139,141,136,138,139,138,138,136,138,139,140,143,143,142,137,138,135,136,153,197,231,239,235,238,233,238,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,235,235,236,236,237,236,239,239,239,240,238,205,126,123,128,143,151,153,152,152,152,151,150,152,152,169,178,130,119,121,124,125,124,171,228,238,237,241,241,241,241,243,237,240,232,233,236,225,237,239,241,241,241,241,241,241,241,239,242,243,235,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,243,242,235,231,185,151,187,245,240,240,246,239,231,233,236,237,242,212,213,191,228,239,241,232,233,237,229,239,233,212,174,171,155,160,139,101,157,179,235,243,245,238,245,226,195,235,239,238,238,240,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,231,231,231,231,233,232,235,193,163,131,126,125,123,124,128,137,145,141,142,139,138,138,137,137,141,140,141,143,140,143,142,135,142,144,140,144,142,158,167,176,192,226,237,233,238,237,233,238,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,236,235,235,236,236,236,236,239,239,239,240,229,173,119,126,123,140,151,153,152,152,152,151,153,151,147,156,173,129,126,126,126,123,138,165,218,239,237,238,241,241,241,243,235,243,235,238,241,233,242,239,241,241,241,241,241,241,241,240,237,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,236,236,227,210,167,154,193,232,229,239,235,222,204,184,212,234,242,198,184,176,235,238,243,224,220,217,215,233,208,190,171,158,150,165,144,146,212,225,243,240,242,245,239,229,222,242,241,240,243,243,240,242,242,242,242,242,242,242,239,247,
235,228,229,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,230,232,227,231,231,231,233,233,236,236,179,157,145,130,127,122,126,127,133,143,139,141,140,141,142,141,142,143,141,142,143,142,151,145,151,156,144,137,145,187,200,213,220,224,236,236,236,238,237,234,237,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,236,236,235,236,237,237,237,240,235,238,241,203,144,123,134,122,136,153,152,152,152,152,151,152,151,149,154,160,140,162,147,125,133,154,154,192,239,238,240,238,239,240,241,237,242,239,241,241,238,242,240,241,241,241,241,241,241,241,241,239,238,241,239,238,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,236,224,215,175,164,164,182,220,225,235,209,179,174,160,182,235,241,195,170,189,240,233,239,236,227,227,222,237,200,181,210,172,166,181,178,217,239,240,242,241,243,245,240,242,240,243,240,242,244,243,240,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,230,231,227,232,231,232,234,234,236,231,193,155,158,147,128,123,128,131,129,140,137,139,141,141,141,141,141,141,141,141,141,135,134,155,163,173,149,134,170,218,223,233,236,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,237,235,237,238,238,238,241,236,239,236,174,127,125,127,124,133,154,151,152,152,152,152,152,152,152,148,138,143,214,170,136,154,160,158,169,227,240,239,238,238,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,240,240,242,240,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,245,222,218,159,156,176,185,229,233,236,188,158,159,159,175,237,236,209,165,185,240,234,227,240,236,237,225,230,189,187,240,210,173,215,230,244,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,226,225,233,231,233,233,234,235,232,193,154,162,158,127,131,124,124,126,144,140,141,142,141,141,141,141,141,141,141,141,136,140,167,147,162,163,157,203,231,233,238,239,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,237,235,237,237,238,238,240,243,241,223,141,127,130,123,124,130,148,151,152,152,152,152,152,152,152,151,145,145,231,197,161,158,156,158,151,201,227,243,242,239,238,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,247,247,240,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,236,236,217,206,150,160,204,222,240,239,217,168,153,154,166,174,215,244,218,179,194,205,235,234,233,238,243,232,216,186,199,249,222,225,231,235,240,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,229,220,226,237,231,232,234,236,235,234,177,152,157,158,140,131,128,124,124,142,139,141,139,140,141,141,141,141,141,141,141,141,148,185,171,176,188,193,229,238,239,239,239,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,237,235,236,237,238,238,237,243,241,216,120,122,123,120,125,128,142,150,152,152,152,152,152,152,152,152,152,141,235,231,161,157,150,152,156,168,227,243,243,241,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,241,241,244,241,237,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,239,221,231,174,162,159,240,243,238,242,196,164,148,153,160,157,205,230,224,176,190,190,245,234,240,229,246,238,186,206,218,226,233,246,241,251,239,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,188,211,233,232,234,234,231,240,233,197,154,147,161,148,119,129,125,127,141,140,142,141,141,141,141,141,141,141,141,141,136,129,162,206,183,220,231,234,239,237,235,235,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,237,235,236,237,238,238,237,232,237,228,144,119,116,127,124,125,134,150,152,152,152,152,152,152,152,149,140,135,227,244,170,156,162,159,154,149,214,236,239,241,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,241,230,233,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,229,222,159,159,196,234,240,242,242,200,165,150,150,154,137,176,232,234,231,244,209,237,245,242,211,241,233,215,228,238,241,230,244,243,238,240,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,231,226,229,231,232,233,235,230,243,235,228,182,154,160,144,120,123,121,135,143,142,138,138,140,141,141,141,141,141,141,141,137,140,153,214,233,231,236,234,235,235,233,233,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,237,235,236,237,238,237,237,228,236,238,168,118,124,139,123,123,126,150,152,152,152,152,152,152,152,148,143,145,158,190,157,159,158,166,152,174,177,225,233,241,240,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,242,231,231,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,238,173,152,169,167,229,234,240,241,198,163,157,156,158,156,164,223,232,200,217,228,236,248,247,206,241,239,245,236,252,248,245,240,247,228,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,230,224,231,232,233,235,234,235,236,227,202,163,136,128,121,120,124,134,139,138,141,138,139,141,141,141,141,141,141,141,139,141,143,204,238,232,237,232,236,235,235,234,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,237,235,236,237,237,237,239,234,238,240,195,132,126,128,123,124,122,150,152,152,152,152,152,152,152,150,137,120,133,146,157,153,158,160,150,163,160,207,230,240,242,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,243,234,238,242,238,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,235,219,182,161,190,211,238,238,244,238,192,165,154,157,159,161,161,191,216,220,197,222,212,231,242,209,239,244,242,241,246,241,244,237,244,246,240,240,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,231,232,227,231,233,234,235,237,234,233,233,205,144,113,121,123,122,124,131,141,138,150,149,140,141,141,140,141,138,142,142,149,135,139,186,232,239,238,234,237,237,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,237,236,235,238,237,235,237,235,236,236,237,238,241,237,234,240,195,137,129,136,130,128,123,149,152,150,150,151,150,151,152,156,151,124,127,124,145,153,154,158,147,157,157,178,211,237,242,239,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,241,238,241,242,230,241,244,237,241,241,241,241,241,241,241,240,240,240,240,239,239,243,237,223,202,188,168,188,179,214,235,246,233,194,158,142,141,156,155,157,190,232,228,238,246,222,235,234,194,231,242,241,248,234,237,242,240,243,245,239,240,242,241,242,242,242,242,242,240,241,243,242,242,241,240,244,241,242,242,241,239,241,240,248,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,234,234,235,236,236,236,235,212,146,123,122,123,125,124,132,135,135,148,152,144,141,141,139,137,129,154,140,139,145,142,206,238,238,238,238,238,238,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,238,234,234,238,235,232,235,236,236,235,235,238,238,238,228,238,198,140,137,138,141,136,128,150,154,149,149,151,150,151,153,154,152,132,123,124,147,155,156,154,154,159,151,145,173,229,240,239,237,237,239,241,241,241,241,241,241,241,241,241,241,241,241,242,234,241,239,227,238,241,237,241,241,241,241,241,241,241,240,240,240,240,238,238,242,235,219,186,170,182,196,160,215,243,242,238,225,195,163,143,143,152,154,198,240,243,245,241,238,238,242,218,235,240,237,247,242,241,242,243,243,242,242,242,242,242,242,242,242,242,242,240,241,242,243,244,240,237,246,239,242,241,243,238,241,241,244,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,233,234,235,236,236,236,235,229,173,131,123,120,126,124,124,123,129,151,152,148,138,142,145,127,122,164,146,132,144,146,214,238,238,238,238,238,238,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,240,237,239,231,237,239,237,237,239,238,237,237,238,244,237,238,191,126,144,132,134,140,124,148,155,151,150,152,154,152,150,150,146,131,122,127,148,155,156,159,156,156,150,150,161,200,236,239,240,239,239,240,241,241,241,241,241,241,241,241,241,241,241,241,236,242,236,223,238,241,237,241,241,241,241,241,241,241,240,240,240,240,240,244,239,239,217,172,166,206,168,164,224,236,250,243,242,229,195,178,138,159,158,225,245,240,244,246,235,237,243,235,241,235,219,240,244,240,242,243,243,242,242,242,242,242,242,242,242,242,244,245,239,238,242,245,241,238,240,237,241,241,244,245,244,243,240,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,233,234,235,236,236,236,235,238,204,130,125,118,124,125,124,124,129,152,151,146,138,143,148,125,128,160,154,142,136,157,230,238,238,238,238,238,238,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,234,238,238,230,236,241,236,232,239,240,240,237,239,242,239,226,196,131,144,140,141,151,140,154,154,150,150,154,158,153,149,150,145,135,132,132,150,156,161,163,160,160,153,155,147,167,230,242,243,242,239,240,241,241,241,241,241,241,241,241,241,241,241,241,235,242,238,213,238,240,239,241,241,241,241,241,241,241,240,240,240,240,239,241,241,239,189,180,203,212,151,171,241,235,245,242,245,240,226,211,155,158,163,235,245,241,241,245,237,241,238,240,242,234,232,241,237,243,243,243,243,242,242,242,242,242,242,242,242,241,239,247,238,239,239,243,247,237,240,239,243,240,238,242,242,239,249,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,233,233,234,236,236,236,235,236,219,128,127,120,125,125,126,123,132,150,151,138,138,141,142,131,144,157,151,140,124,169,240,238,238,238,238,238,238,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,230,242,237,240,231,235,228,231,236,238,240,237,238,237,239,225,168,130,139,145,150,155,154,155,150,150,149,150,156,149,152,151,141,121,122,131,160,163,156,141,153,154,145,154,152,150,207,244,242,242,238,239,241,241,241,241,241,241,241,241,241,241,241,240,236,240,231,225,236,239,239,241,241,241,241,241,241,241,240,240,240,240,238,242,233,231,180,184,226,181,131,184,245,235,239,240,239,235,239,223,165,149,171,222,237,242,240,241,238,239,220,235,245,234,237,240,236,244,243,243,243,242,242,242,242,242,242,242,242,240,231,245,240,244,236,241,245,242,247,243,244,238,237,243,243,215,244,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,233,233,234,235,236,236,235,232,217,131,127,122,124,125,124,124,142,151,151,148,151,148,136,126,148,151,158,132,124,191,238,238,238,238,238,238,238,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,240,237,224,229,232,242,236,236,234,235,241,239,242,213,204,198,150,135,137,148,150,152,158,158,148,161,164,158,147,145,148,135,130,121,122,125,149,153,139,136,138,134,138,146,166,146,179,231,239,242,239,239,241,241,241,241,241,241,241,241,241,241,241,240,238,244,236,217,234,241,241,241,241,241,241,241,241,241,240,240,240,240,239,240,233,208,187,208,234,186,136,188,236,235,241,242,240,237,245,230,188,144,148,188,235,235,239,239,242,241,226,236,245,242,226,234,243,242,243,243,243,242,242,242,242,242,242,242,242,242,241,239,233,244,235,239,238,242,248,241,244,242,248,245,244,235,243,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,233,233,234,235,236,236,235,234,215,137,123,125,124,124,124,122,140,151,151,150,152,150,134,123,140,160,183,168,167,223,234,238,238,238,238,238,238,238,237,235,236,236,236,237,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,242,220,186,175,222,235,213,195,221,232,241,241,225,189,169,161,141,139,146,141,148,153,160,159,162,159,159,162,161,164,148,125,124,124,125,123,126,135,139,140,139,141,139,135,148,152,161,207,235,242,239,239,241,241,241,241,241,241,241,241,241,241,241,240,239,241,224,192,231,239,239,241,241,241,241,241,241,241,240,240,240,240,240,241,227,221,208,229,236,198,141,198,235,239,243,243,243,242,241,240,233,188,154,180,227,236,239,243,243,242,233,236,240,244,229,237,244,243,243,243,243,242,242,242,242,242,242,242,242,242,237,237,232,242,233,238,238,233,238,232,243,245,243,233,236,238,244,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,231,231,232,233,234,236,234,236,235,237,221,139,121,129,127,125,124,124,133,151,150,150,150,148,137,125,139,164,179,202,217,238,237,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,236,236,236,236,238,238,238,237,237,237,237,237,237,237,237,235,200,173,129,172,180,159,160,206,227,238,240,216,166,140,148,141,151,146,139,147,154,161,152,158,154,154,156,155,163,137,129,122,121,119,122,136,142,139,143,143,147,142,134,135,147,160,198,232,239,239,239,241,241,241,241,241,241,241,241,241,241,241,241,236,242,231,206,235,238,241,240,239,236,242,241,240,240,240,240,240,239,238,237,244,239,236,240,238,191,161,227,243,245,238,240,240,242,240,239,247,214,148,174,211,236,242,243,240,237,243,245,243,239,243,246,238,242,242,242,242,242,242,242,242,242,242,242,240,242,238,233,228,235,228,239,241,228,228,226,243,242,232,231,233,234,240,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,232,233,232,235,238,227,237,233,240,230,149,125,122,129,128,125,130,134,152,151,149,148,141,131,117,177,232,231,237,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,235,233,236,233,226,170,149,125,123,120,144,153,165,182,214,214,178,169,147,154,138,136,142,146,154,148,153,154,153,153,157,158,159,154,121,123,122,124,122,126,138,143,140,142,141,141,140,142,140,146,152,190,233,233,242,239,241,241,241,241,241,241,241,241,241,241,241,243,233,240,218,224,239,235,241,236,229,200,245,239,239,240,239,241,240,239,239,243,240,240,239,239,225,162,215,237,242,240,245,242,242,242,242,239,249,230,194,228,236,227,242,239,220,212,242,243,243,243,244,245,229,237,240,240,237,238,242,242,242,242,242,241,230,243,240,235,234,248,244,236,235,238,242,242,241,244,242,247,217,233,240,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,232,233,233,236,240,232,237,228,232,197,148,121,121,125,126,129,148,148,149,149,153,157,152,126,141,203,227,236,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,240,241,241,232,195,171,136,126,123,122,147,152,142,144,171,165,176,154,144,156,147,142,139,143,150,157,157,159,156,155,155,154,161,141,120,121,121,121,123,129,142,141,141,142,142,140,141,141,142,139,149,187,234,241,243,240,241,241,241,241,241,241,241,241,241,241,241,241,236,241,232,231,241,238,241,236,228,173,228,239,239,240,239,240,239,238,236,236,238,239,242,241,221,201,231,239,239,237,240,242,241,242,242,238,244,228,205,240,242,242,220,238,185,181,236,243,243,243,239,231,207,231,243,243,241,242,242,242,242,242,241,238,231,243,239,234,235,247,242,241,236,241,242,242,241,243,239,237,227,233,243,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,231,232,235,237,239,236,231,227,222,142,119,119,120,123,139,146,152,152,154,152,154,155,154,142,174,231,233,237,237,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,237,241,235,214,174,148,130,130,123,122,146,153,147,133,154,150,151,149,149,155,150,152,136,141,140,150,154,160,160,158,157,155,157,129,122,120,121,120,125,138,143,141,143,141,142,139,142,141,138,135,142,174,220,238,238,243,241,241,241,241,241,241,241,241,241,241,241,241,237,243,237,235,242,244,239,238,218,150,221,239,239,240,239,240,240,238,232,226,237,238,237,223,201,232,242,242,240,239,237,242,241,241,243,239,243,237,228,244,243,242,205,213,146,148,229,243,243,243,238,226,217,235,244,245,244,244,242,242,242,242,241,235,218,237,239,235,238,245,242,238,240,247,242,242,242,241,234,214,237,221,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,231,233,236,237,232,215,188,202,222,124,108,130,120,125,148,152,153,155,156,151,154,141,152,168,209,237,244,234,237,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,230,234,231,190,157,137,133,125,123,120,137,153,148,142,165,148,147,150,151,153,148,149,141,136,135,132,135,151,163,160,158,156,141,123,126,120,123,122,127,142,141,142,143,141,141,139,142,139,138,145,143,157,208,239,236,241,241,241,241,241,241,241,241,241,241,241,241,240,236,245,238,235,243,243,220,240,217,162,225,239,239,240,239,241,241,238,232,216,235,239,235,190,182,238,243,241,237,243,244,241,241,241,244,239,240,243,228,239,244,239,230,183,138,146,231,243,243,243,242,240,241,239,243,243,242,242,242,242,242,242,242,241,212,232,239,240,242,243,243,238,243,246,242,242,242,242,238,226,244,225,244,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,231,234,237,233,232,173,183,196,213,164,163,148,125,132,159,158,149,149,147,149,153,141,162,197,233,232,243,230,237,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,235,233,234,168,146,130,136,121,122,120,131,154,143,137,163,156,154,154,155,152,152,148,149,138,133,126,126,132,158,161,156,147,125,122,125,120,122,122,124,136,142,141,141,141,141,140,140,139,148,153,149,151,200,244,231,241,241,241,241,241,241,241,241,241,241,241,241,239,238,243,242,237,242,237,199,224,212,192,240,239,239,240,239,241,239,239,239,227,235,239,234,182,190,236,237,238,232,234,245,241,241,241,243,239,239,244,232,231,245,244,238,217,190,167,238,243,243,243,243,246,249,238,238,239,237,237,242,242,242,242,243,247,223,229,241,244,245,242,242,242,241,240,242,242,242,239,243,236,238,203,243,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,231,233,235,227,208,166,225,219,211,223,221,157,125,140,179,163,150,149,150,164,157,162,178,217,236,234,235,234,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,237,238,208,154,138,127,128,122,126,123,132,152,152,145,159,164,155,156,153,152,152,151,150,143,136,124,128,126,139,148,144,131,121,122,123,123,121,121,121,130,143,141,140,141,141,141,140,145,154,149,150,146,195,233,236,240,241,241,241,241,241,241,241,241,241,241,241,241,240,239,241,240,240,230,182,207,214,219,240,239,239,240,239,241,239,239,242,236,236,239,229,187,204,235,239,240,216,207,245,241,241,241,241,240,242,243,234,223,234,246,229,231,227,197,240,243,243,243,243,240,243,239,237,239,236,239,242,242,242,241,241,245,237,230,243,243,243,241,239,243,236,234,241,242,242,235,241,241,217,213,239,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,231,232,235,233,219,182,207,235,230,221,243,237,160,125,145,202,166,157,161,164,163,160,182,208,231,235,234,230,242,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,231,235,176,146,120,124,125,124,135,137,143,152,147,149,153,148,151,151,151,153,154,151,155,146,140,126,131,129,126,131,131,131,125,118,121,124,122,122,121,133,142,142,142,141,140,142,142,151,150,151,150,147,176,227,240,240,241,241,241,241,241,241,241,241,241,241,241,241,239,237,239,240,243,223,156,189,221,237,238,239,239,240,239,241,240,238,240,243,240,240,225,195,227,239,237,240,220,208,242,241,240,241,239,241,242,240,234,209,225,236,226,175,188,219,243,243,243,243,244,242,238,244,233,237,233,238,242,242,242,241,237,239,245,241,244,240,240,241,240,245,233,226,241,242,242,226,231,232,198,240,244,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,232,234,230,236,192,172,225,233,233,234,237,235,213,144,134,174,169,166,161,174,217,210,215,225,222,235,234,234,235,237,238,238,238,238,238,238,237,236,236,236,236,235,236,236,236,236,236,236,236,236,236,236,236,236,236,236,235,237,235,235,236,213,144,124,119,123,140,139,151,139,142,149,140,145,154,165,154,149,146,146,149,150,155,155,133,129,123,128,130,124,124,127,125,121,119,124,122,122,121,126,141,141,140,140,141,141,161,180,181,160,150,147,179,219,247,244,244,241,241,241,241,241,241,241,241,241,241,240,240,240,240,236,240,181,158,160,225,240,237,239,239,240,238,239,242,243,232,240,238,240,230,186,236,234,241,225,180,184,206,243,247,236,239,241,242,241,242,231,206,240,230,163,185,236,245,243,243,243,243,242,242,243,242,242,242,242,239,241,239,231,241,241,242,242,242,241,241,241,241,242,241,239,231,242,248,237,237,240,227,239,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,231,237,235,233,230,210,185,236,239,231,235,235,234,225,205,188,187,173,171,227,247,232,211,229,231,231,236,235,235,235,237,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,237,235,235,228,182,131,128,120,125,150,160,154,134,146,151,140,152,156,163,156,157,152,151,149,150,157,162,133,132,127,127,128,126,126,126,122,125,119,122,122,122,122,121,136,143,142,141,144,151,151,213,228,219,201,171,181,223,239,237,237,239,240,240,241,241,241,241,241,241,241,241,241,241,241,236,235,180,147,159,225,240,236,240,239,240,238,238,241,242,231,238,238,240,221,182,235,238,241,185,164,168,180,223,243,241,244,242,242,242,245,231,221,243,205,185,183,234,244,243,243,243,243,243,243,243,243,243,243,242,242,244,241,239,242,242,242,242,242,242,242,242,242,242,242,241,221,231,230,231,233,237,229,241,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,231,227,232,235,235,229,195,181,242,243,233,233,236,237,231,239,230,195,195,224,240,196,239,238,235,232,230,236,235,235,235,237,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,235,230,206,154,117,130,129,133,156,161,154,136,143,139,136,131,159,158,152,153,155,155,155,154,154,158,130,132,127,125,125,128,128,128,119,122,122,119,122,122,122,120,132,142,142,145,130,137,163,226,246,248,235,225,213,238,230,228,232,239,240,240,241,241,241,241,241,241,241,241,241,241,241,242,225,175,147,157,225,239,237,240,239,240,239,239,240,238,230,236,238,242,230,167,220,241,229,179,160,159,157,196,243,242,245,242,242,242,242,239,238,234,201,231,211,232,244,243,243,243,243,243,243,243,243,243,243,243,244,245,239,248,242,242,242,242,242,242,242,242,242,242,242,240,225,240,232,228,225,231,234,240,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,230,230,240,210,174,168,240,238,235,232,237,240,235,232,229,210,232,210,207,237,237,242,236,223,226,236,236,235,235,237,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,234,236,236,225,173,151,127,137,151,147,158,155,155,139,144,141,145,136,138,141,149,152,156,143,150,148,145,135,123,130,124,122,125,125,126,125,120,123,126,118,122,122,122,121,128,141,141,144,132,142,167,238,229,238,245,243,232,221,211,226,234,242,240,240,241,241,241,241,241,241,241,241,241,241,241,242,209,164,142,155,228,239,239,240,239,240,239,241,239,236,229,235,239,242,240,158,210,224,211,169,154,160,145,177,237,240,245,242,242,242,242,243,220,221,210,195,218,237,243,243,243,243,243,243,243,243,243,243,243,242,241,241,235,248,242,242,242,242,242,242,242,242,242,242,242,243,237,244,245,239,238,247,247,244,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,235,238,234,223,181,150,170,226,232,236,234,236,238,238,236,238,229,228,224,234,238,237,238,234,229,219,234,236,235,235,237,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,234,237,236,223,147,147,130,138,162,155,156,153,156,142,140,142,143,145,128,130,149,155,144,127,134,137,123,125,125,133,120,129,130,131,129,126,124,122,125,118,122,122,122,122,123,141,140,140,140,158,184,203,207,237,235,243,243,237,238,226,230,241,241,240,241,241,241,241,241,241,241,241,241,241,241,236,191,156,148,153,229,238,240,240,239,240,239,242,238,238,231,237,241,240,235,164,190,170,178,159,148,153,155,181,242,234,243,242,242,242,242,242,229,190,208,223,246,241,243,243,243,243,243,243,243,243,243,243,243,242,237,236,231,244,242,242,242,242,242,242,242,242,242,242,242,241,238,240,244,244,245,249,238,243,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,233,235,220,199,176,162,144,167,215,232,237,235,235,235,236,234,243,240,240,235,238,236,235,236,231,235,213,234,237,235,235,237,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,234,237,236,217,150,141,120,143,158,158,157,154,156,153,142,142,142,135,108,95,145,101,99,101,122,95,111,105,96,90,124,85,76,96,117,119,89,122,122,120,122,122,122,122,122,140,139,141,138,165,217,141,148,198,227,243,242,234,240,233,236,241,241,240,241,241,241,241,241,241,241,241,241,241,241,231,177,145,151,151,226,238,241,240,239,240,239,240,238,243,235,238,242,238,223,147,144,124,141,155,162,153,156,202,244,234,243,242,242,242,242,237,223,168,194,202,237,241,243,243,243,243,243,243,243,243,243,243,243,242,238,234,233,241,242,242,242,242,242,242,242,242,242,242,242,241,241,243,242,245,235,244,237,243,247,
235,228,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,230,217,182,150,148,142,159,154,225,235,238,237,237,234,233,231,243,234,237,232,238,234,233,235,235,239,220,234,237,235,235,237,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,233,237,238,207,139,134,119,156,159,158,156,158,159,159,154,143,139,130,100,48,104,48,77,84,121,64,102,59,94,45,100,45,38,42,82,80,65,120,123,120,122,122,122,122,124,136,139,141,129,187,231,139,127,138,189,224,238,240,242,239,241,240,240,241,241,241,241,241,241,241,241,241,241,241,241,225,168,144,153,150,221,239,240,240,239,240,239,240,239,246,236,238,243,236,213,126,128,125,131,137,158,147,159,215,246,239,245,242,242,242,239,240,223,180,204,223,238,243,242,243,243,243,243,243,243,243,243,243,243,243,244,236,239,240,242,242,242,242,242,242,242,242,242,242,242,242,243,242,241,247,236,243,239,243,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,228,225,229,231,233,233,234,235,188,137,140,149,153,154,182,216,236,235,238,234,233,235,237,232,231,235,233,238,233,237,235,233,238,212,236,237,237,237,237,238,238,238,238,238,238,237,237,237,237,237,236,236,236,236,236,236,236,236,237,237,237,236,233,226,229,235,238,232,201,133,130,126,152,157,157,155,158,159,158,159,144,136,137,116,27,27,55,75,89,125,67,95,34,124,52,79,81,86,61,25,25,84,124,121,118,122,121,122,123,126,134,138,128,171,218,217,131,126,125,138,178,220,244,238,242,236,235,239,241,241,241,241,240,240,240,240,238,239,241,238,212,160,150,150,163,222,242,238,238,238,238,241,240,239,242,236,239,233,237,192,120,125,124,126,125,134,141,163,212,240,240,243,242,242,242,240,235,182,203,235,242,241,243,242,242,242,243,243,243,243,243,243,243,242,242,239,238,238,241,242,242,242,242,242,242,242,242,242,242,242,242,241,241,241,243,241,242,241,241,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,227,231,230,223,225,223,229,228,219,160,124,129,151,157,159,187,216,239,232,238,235,233,237,242,234,236,237,231,234,232,240,237,234,233,216,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,232,230,232,238,238,231,210,143,124,126,147,155,157,157,157,158,159,157,157,158,159,155,47,63,70,74,20,57,69,20,29,122,45,62,101,120,106,41,58,101,125,120,118,122,121,122,124,121,122,140,142,208,234,214,131,124,122,124,137,176,201,231,240,246,244,240,241,241,241,241,240,240,240,240,240,240,239,238,199,152,154,151,165,226,235,242,240,239,238,241,240,240,240,239,240,241,247,185,126,122,121,119,129,129,140,183,226,243,241,242,242,242,242,241,229,158,204,243,242,242,242,242,242,242,243,243,243,243,243,243,243,242,242,241,238,230,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,227,229,229,231,218,202,202,221,198,156,147,146,181,229,210,209,238,239,233,237,236,237,235,237,236,237,233,232,234,234,235,238,233,222,222,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,238,230,228,236,238,236,236,233,152,114,125,131,127,128,128,128,138,158,159,159,155,156,162,55,62,98,71,58,95,65,63,40,91,40,56,103,122,108,36,58,117,124,123,121,122,121,122,128,128,126,127,183,233,247,212,131,122,126,120,117,134,170,225,241,237,237,233,238,241,241,241,241,241,241,241,238,238,238,237,181,143,156,148,156,207,236,246,243,242,240,240,240,240,240,239,214,226,237,169,124,125,125,125,124,144,151,209,249,246,237,243,242,242,242,244,236,156,198,242,242,242,242,242,242,242,243,243,243,243,243,243,243,242,242,248,248,226,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,234,226,228,226,183,154,163,185,168,162,137,137,184,240,229,237,243,238,233,235,237,240,234,230,234,239,235,238,243,237,233,237,231,217,222,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,233,225,215,228,231,235,236,244,171,128,127,126,123,124,124,124,140,157,159,158,154,152,153,91,33,114,71,84,112,68,84,57,90,44,89,63,80,74,51,49,123,121,123,124,122,121,122,123,116,127,131,198,240,245,193,132,126,137,123,124,117,131,207,238,233,244,246,240,241,241,241,241,241,241,241,243,237,239,221,162,141,158,145,148,174,213,234,243,243,241,238,240,240,240,242,201,175,207,142,121,122,124,125,122,146,192,227,237,240,236,241,242,242,242,245,235,149,194,244,242,242,242,242,242,242,243,243,243,243,243,243,243,242,241,239,249,220,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,230,234,218,183,155,143,137,153,153,153,132,130,189,238,230,236,236,234,233,238,236,235,233,232,236,240,238,237,238,244,239,232,230,206,225,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,235,236,227,234,235,235,230,236,167,128,120,121,124,123,124,124,148,157,156,157,155,157,156,117,34,115,77,17,29,74,17,22,123,51,128,31,30,123,66,66,122,122,124,123,122,121,122,125,118,124,137,210,237,244,170,131,141,143,137,124,118,125,154,184,223,246,243,242,241,241,241,241,241,241,241,242,238,241,211,154,148,160,148,145,153,189,226,242,243,242,238,240,240,240,240,192,140,142,128,116,129,128,125,131,152,222,240,239,241,235,242,242,242,242,241,237,159,189,240,242,242,242,242,242,242,243,243,243,243,243,243,243,242,241,236,241,226,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,226,221,223,191,158,138,140,131,150,160,158,140,138,184,231,231,238,233,231,234,237,232,224,228,237,239,230,231,234,233,234,224,220,225,222,228,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,238,234,236,239,237,232,233,162,126,124,122,125,125,126,127,148,157,156,157,159,159,156,159,111,123,116,102,107,114,103,118,132,113,123,122,116,127,113,120,123,125,125,122,122,121,122,123,114,123,153,228,237,226,157,144,140,141,142,125,129,123,136,137,197,233,233,241,241,241,241,241,241,241,241,238,241,243,202,154,155,156,150,152,151,169,209,236,241,242,237,240,240,240,240,198,130,132,126,123,140,136,123,142,171,239,244,243,242,240,244,242,242,242,241,240,173,201,237,242,242,242,242,242,242,243,243,243,243,243,243,243,242,241,234,239,233,238,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,217,183,154,139,134,139,150,173,191,188,162,140,184,222,232,240,234,237,235,236,229,220,226,232,227,198,204,217,215,222,210,205,215,233,235,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,236,236,233,236,236,238,237,236,162,124,126,125,125,126,125,128,150,157,156,157,156,158,151,160,127,120,128,124,122,119,121,126,123,131,120,130,122,126,124,130,124,124,124,121,122,121,122,127,128,135,174,230,238,197,141,146,139,140,139,139,137,129,124,120,150,210,244,242,241,241,241,241,241,241,241,238,243,242,183,151,153,149,153,149,157,148,177,230,239,242,237,240,240,240,234,167,123,126,122,125,135,143,143,142,197,247,238,225,236,244,242,242,242,242,241,239,197,221,241,242,242,242,242,242,242,243,242,242,242,242,242,243,242,242,238,245,236,248,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,229,231,225,196,158,132,137,144,129,167,210,226,225,199,152,160,206,236,239,238,238,234,237,229,227,228,229,224,178,161,197,210,229,224,227,225,235,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,235,234,232,234,233,238,237,236,160,125,129,125,124,125,124,129,150,157,159,157,155,153,154,155,129,119,128,124,123,120,121,122,125,131,123,129,127,126,129,134,123,123,123,122,121,120,122,127,124,136,206,239,238,174,135,145,141,140,139,142,142,132,132,131,122,173,235,242,241,241,241,240,241,239,239,238,240,244,176,150,150,148,154,148,153,145,156,221,236,244,239,237,239,240,222,149,122,131,124,128,137,141,140,145,213,243,231,205,236,238,243,241,243,243,241,238,206,233,244,242,242,242,242,242,242,242,242,242,242,242,242,243,242,242,239,236,237,247,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,227,229,231,206,157,142,133,144,144,132,180,225,227,235,218,165,133,176,231,237,233,236,233,233,233,235,234,236,229,184,170,201,228,238,237,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,236,236,236,237,238,235,236,161,126,127,122,125,122,122,130,151,158,159,159,158,152,158,152,146,131,123,122,123,122,121,121,123,127,126,126,123,125,132,138,125,125,124,124,122,121,123,127,119,142,234,239,222,162,136,145,141,141,141,143,141,137,137,136,124,149,230,241,241,241,241,239,240,238,236,242,239,241,174,152,152,152,152,152,152,152,155,199,231,241,242,236,242,234,207,146,118,127,126,129,142,140,141,155,222,238,238,183,233,244,242,236,241,240,237,241,215,243,241,242,242,242,242,242,242,242,242,243,243,243,243,243,243,242,238,228,242,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,225,226,227,201,153,151,163,154,149,145,193,229,228,232,230,183,145,163,223,241,232,234,235,234,234,235,211,213,221,224,225,225,230,238,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,236,236,236,237,237,234,236,159,123,124,126,126,122,122,132,154,157,156,155,156,159,155,151,154,147,125,122,125,125,123,122,120,123,122,123,124,131,139,141,132,127,126,126,125,125,124,126,122,161,236,233,184,148,135,144,141,141,141,140,142,142,139,137,139,140,225,240,241,241,241,238,239,241,237,244,236,225,160,151,152,152,152,152,152,152,152,166,197,234,237,243,243,232,172,136,120,129,133,133,142,142,141,157,210,241,238,179,240,244,238,238,243,241,240,244,236,243,241,242,242,242,242,242,242,242,242,243,243,243,243,243,243,242,235,230,238,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,227,229,208,162,154,153,150,151,155,213,233,228,229,233,202,170,175,219,240,240,237,244,238,232,218,193,203,213,225,236,236,235,238,234,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,236,236,236,236,238,234,228,156,124,126,128,127,122,123,133,156,157,154,152,155,161,150,154,156,153,137,122,124,124,123,125,126,124,120,125,130,137,142,142,136,126,125,126,127,127,127,126,119,175,240,217,161,134,141,139,141,141,141,139,142,141,143,139,134,129,200,233,241,241,241,238,239,244,238,228,228,210,160,151,152,152,152,152,152,152,150,145,173,229,240,239,242,207,129,121,127,129,126,130,140,144,145,151,192,234,236,224,246,240,244,241,242,244,242,238,221,236,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,242,233,230,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,232,235,218,178,152,135,151,145,149,220,230,229,229,233,234,217,189,211,233,226,230,237,243,218,203,206,233,230,219,231,237,239,238,234,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,236,236,236,232,241,239,210,169,140,133,126,128,122,123,131,158,156,153,154,157,151,154,155,154,151,148,129,120,124,126,126,128,124,126,131,139,142,141,137,126,119,118,121,121,121,123,122,116,184,238,192,152,140,143,136,141,141,141,139,141,140,141,139,128,122,163,228,241,241,241,239,238,246,236,202,203,205,171,152,152,152,152,152,152,152,152,155,169,223,239,237,228,186,112,120,131,124,116,142,154,142,151,146,159,202,224,191,236,235,247,240,233,240,244,244,234,244,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,242,238,244,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,233,234,217,162,141,144,139,136,152,226,229,230,229,235,235,235,231,233,230,198,209,217,212,207,194,235,232,236,232,222,235,239,237,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,236,236,236,231,238,239,209,165,136,131,128,128,123,123,131,160,155,155,161,156,147,156,152,151,149,152,145,125,120,123,126,129,121,133,134,143,143,140,136,150,156,152,156,151,152,155,146,134,203,234,167,140,147,145,138,141,141,141,142,140,136,137,139,125,113,138,228,241,241,241,240,238,243,229,189,160,163,151,152,152,152,152,152,152,152,152,157,150,193,183,216,217,160,124,126,127,117,129,157,152,146,151,157,154,182,165,163,189,225,244,249,245,235,238,233,251,250,239,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,248,245,243,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,224,226,227,205,146,132,137,141,141,160,224,223,230,231,233,231,235,236,236,242,212,204,207,205,213,225,232,233,218,215,235,236,235,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,238,238,238,237,236,236,236,233,235,235,229,173,152,136,129,126,123,123,133,160,154,156,158,152,150,150,150,149,150,152,150,145,122,122,139,135,128,138,142,141,139,140,141,155,164,162,163,160,160,162,157,172,224,234,168,137,141,137,141,141,141,141,144,141,150,160,158,125,124,159,234,241,241,241,241,236,241,223,172,152,160,158,152,152,152,152,152,152,152,149,145,156,166,146,170,172,133,131,127,125,121,147,154,160,165,154,156,146,167,154,160,165,173,192,219,250,244,238,201,238,242,238,242,242,242,242,242,242,242,242,243,243,243,243,243,243,242,241,242,241,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,228,229,210,224,224,184,142,144,137,141,143,159,222,225,228,233,231,232,235,231,231,243,238,214,210,217,229,238,234,234,232,235,235,235,234,234,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,237,237,237,236,236,236,236,236,237,235,240,188,154,138,128,125,124,124,135,159,155,158,152,151,150,148,150,147,153,152,148,152,137,135,143,138,132,136,146,139,136,139,144,152,155,156,156,155,154,158,153,202,236,229,170,138,137,134,149,140,140,139,142,138,154,158,155,131,136,184,235,240,241,241,242,238,239,209,178,151,159,150,152,152,152,152,151,151,151,152,156,151,146,130,133,128,141,131,128,124,130,161,158,155,156,155,164,151,163,146,162,151,147,172,177,232,245,241,191,232,239,239,242,242,241,242,242,242,242,242,243,243,243,243,241,244,241,237,240,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,232,226,228,199,226,223,154,141,141,141,142,139,154,218,232,230,231,232,232,233,233,235,234,242,230,238,232,237,227,227,233,224,238,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,235,235,209,143,144,136,118,127,126,132,160,160,155,149,152,152,152,152,151,152,151,152,146,143,140,143,141,141,141,141,141,141,141,143,158,155,156,158,159,158,165,153,218,242,197,140,141,141,141,145,141,137,139,141,148,171,178,161,151,171,229,235,238,242,240,240,244,228,175,151,152,151,151,151,152,152,151,151,151,151,150,149,150,154,130,127,140,146,134,127,129,141,158,157,157,157,157,157,157,157,157,157,157,157,163,147,207,245,236,195,230,242,238,243,244,239,241,242,242,242,242,243,243,243,243,233,248,235,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,224,228,229,209,203,223,203,151,141,141,141,141,141,154,215,230,230,231,232,232,233,233,235,234,242,227,230,225,236,214,229,234,224,236,237,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,235,235,217,157,136,136,119,127,122,131,161,159,150,149,152,152,152,152,151,152,151,152,150,141,139,142,141,141,141,141,141,141,141,143,157,156,156,157,159,159,156,179,224,231,163,140,141,141,141,138,141,142,146,144,180,218,218,179,171,217,241,236,238,237,236,238,237,198,157,142,153,151,152,152,152,152,151,150,151,152,153,153,152,145,121,120,131,147,139,127,133,153,159,157,157,157,157,157,157,157,157,157,157,157,153,157,185,232,234,207,236,241,241,243,239,236,240,242,242,242,242,243,243,243,235,220,246,237,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,225,226,231,194,218,226,173,144,141,141,141,139,143,148,201,228,230,231,232,232,233,233,235,234,240,231,227,222,238,213,209,217,231,237,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,235,235,229,180,130,139,124,128,123,130,158,150,154,150,151,152,152,152,151,151,151,153,146,139,140,141,141,141,141,141,141,141,141,143,158,155,156,157,157,156,149,195,235,207,147,143,141,141,141,136,141,148,140,145,187,240,230,194,195,234,238,230,225,218,216,213,213,166,136,138,151,151,152,152,152,152,151,150,151,154,156,155,150,141,121,133,138,146,143,128,130,156,159,157,157,157,157,157,157,157,157,157,157,157,159,159,165,199,240,217,237,242,240,244,239,239,241,242,242,242,242,243,243,243,230,222,243,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,228,231,197,221,220,154,139,141,141,141,138,142,144,188,227,230,231,232,232,233,233,235,232,236,237,238,201,224,229,225,220,233,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,235,235,235,204,139,139,131,133,124,126,148,150,159,151,151,152,152,152,151,151,151,153,144,142,142,142,141,141,141,141,141,141,141,144,159,155,155,156,155,156,156,211,244,168,146,140,141,141,141,140,146,141,131,159,191,239,237,225,214,228,204,159,159,165,158,175,184,140,138,149,152,153,151,151,152,152,151,150,152,154,153,150,149,136,129,150,151,149,146,126,129,154,159,157,157,157,157,157,157,157,157,157,157,157,163,160,158,180,244,233,240,239,243,238,245,247,243,242,242,242,242,243,243,243,234,234,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,232,231,220,195,224,195,139,140,141,141,141,139,143,142,177,224,230,231,232,232,233,233,235,233,240,240,234,160,196,227,208,224,236,233,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,235,235,238,220,159,139,131,130,127,136,147,154,156,152,151,152,152,152,151,151,151,153,143,143,141,142,141,141,141,141,141,141,141,144,161,154,154,156,158,157,165,227,230,157,136,146,141,141,141,143,145,133,140,169,206,236,240,231,195,162,129,131,137,148,141,144,152,131,139,151,152,152,151,152,152,152,151,150,150,150,150,146,149,142,150,151,150,149,146,126,127,148,159,157,157,157,157,157,157,157,157,157,157,157,162,155,150,166,242,240,241,240,239,201,215,235,241,242,242,242,242,243,243,243,242,242,241,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,228,199,191,223,188,135,141,141,141,141,141,143,128,155,223,230,231,232,232,233,233,235,232,235,235,232,150,187,218,203,234,238,235,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,236,236,235,235,238,229,181,138,140,136,134,143,152,153,151,151,151,152,152,152,151,152,151,152,138,139,140,144,141,141,141,141,141,141,141,144,160,155,154,155,156,157,172,225,194,150,144,140,141,141,141,144,143,134,159,206,231,230,212,209,211,132,128,125,122,135,138,135,133,137,151,150,149,151,152,152,152,152,152,152,148,144,144,133,137,149,146,150,153,151,147,131,127,148,159,157,157,157,157,157,157,157,157,157,157,157,156,150,154,166,229,244,243,241,242,222,226,238,242,242,242,242,242,243,243,243,242,233,240,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,227,216,181,210,219,166,142,146,140,140,140,140,141,130,144,221,230,231,232,232,233,234,235,235,235,232,211,154,207,238,229,239,238,234,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,236,236,236,235,236,234,233,232,237,202,140,149,144,144,150,155,151,149,150,152,152,152,152,151,152,151,151,138,139,142,143,141,141,141,141,141,140,140,144,159,155,155,156,159,153,192,231,173,132,148,140,141,140,140,140,139,137,177,230,234,209,148,121,154,127,114,120,123,140,138,143,137,149,133,152,150,152,151,151,151,151,151,153,152,141,130,125,130,138,139,147,158,151,148,135,136,157,160,157,157,157,157,157,157,157,157,157,157,157,158,159,152,181,228,242,240,243,239,246,227,233,243,242,242,242,242,242,242,242,238,229,244,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,241,241,241,241,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,203,168,218,206,162,147,142,138,140,140,141,140,132,145,187,229,231,236,238,236,235,235,236,236,237,215,126,224,234,235,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,232,238,223,208,208,231,212,187,160,140,154,156,150,152,154,151,151,152,152,152,151,152,151,152,142,141,141,143,142,143,141,142,141,138,135,139,159,159,156,156,156,161,197,195,144,135,141,142,141,139,138,142,139,144,210,236,199,144,123,124,125,125,125,127,125,145,145,140,137,141,143,141,147,151,151,149,151,151,148,141,127,121,133,153,158,154,138,153,152,148,152,150,143,156,158,157,157,157,157,157,157,157,157,157,157,157,157,164,162,158,205,242,244,240,239,240,231,230,241,242,242,242,242,242,242,242,237,225,240,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,238,238,237,238,240,242,241,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,220,177,199,183,148,140,139,139,139,141,141,141,129,135,172,208,232,233,230,226,225,236,237,233,234,216,132,224,234,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,235,240,223,189,209,225,219,208,170,130,142,152,148,152,150,151,151,152,152,152,151,152,151,150,143,142,141,143,140,140,142,145,139,141,142,144,155,156,154,154,149,181,158,154,137,135,141,138,138,141,139,134,143,161,219,228,163,132,126,121,125,125,125,127,136,138,140,141,140,141,143,142,143,153,151,149,153,150,147,138,126,129,152,159,159,161,157,160,160,153,151,160,157,156,160,157,157,157,157,157,157,157,157,157,157,157,155,149,154,165,194,240,245,238,242,248,241,239,240,242,242,242,242,243,242,242,244,229,241,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,241,243,244,241,242,241,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,227,215,160,181,158,139,131,137,141,141,142,140,141,126,124,142,160,206,223,216,203,204,236,230,237,233,209,134,225,233,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,235,241,231,214,230,228,218,229,210,145,127,151,153,151,151,150,151,152,152,152,151,152,152,148,143,142,140,142,137,137,140,136,138,143,144,148,162,156,157,161,157,177,165,128,120,138,144,135,139,142,140,127,145,161,233,204,135,117,129,122,125,125,125,127,136,135,138,140,141,142,142,141,138,151,150,152,154,151,146,130,131,148,158,156,157,157,155,154,159,160,159,160,154,155,159,157,157,157,157,157,157,157,157,157,157,157,156,150,149,151,194,238,239,239,241,246,231,232,242,242,242,242,241,243,242,242,249,235,244,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,240,242,245,245,244,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,209,169,220,150,133,134,141,141,142,135,130,134,124,121,122,130,157,169,165,145,161,233,234,234,208,184,130,225,233,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,234,239,236,237,243,233,228,236,231,160,112,138,147,155,150,151,151,152,152,152,151,153,151,146,140,141,140,141,141,143,143,138,139,145,143,147,149,158,161,157,161,178,160,103,123,140,144,138,142,139,137,125,136,155,204,176,126,115,124,123,125,125,125,132,134,134,137,138,141,144,140,141,139,147,151,153,154,148,150,140,148,156,156,155,157,154,154,154,155,158,158,154,152,155,158,157,157,157,157,157,157,157,157,157,157,157,156,160,158,163,200,238,239,241,238,241,225,222,242,242,242,242,241,241,241,240,248,239,244,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,240,244,245,244,245,243,242,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,233,196,177,233,146,135,140,146,141,142,128,123,125,123,123,120,126,126,124,124,114,143,199,208,196,152,147,125,225,233,237,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,233,234,237,236,237,231,234,239,237,173,117,127,130,151,149,152,151,152,152,152,152,152,150,146,140,140,140,141,139,154,161,171,143,142,139,149,154,156,159,157,154,168,148,98,133,146,143,137,142,134,129,127,132,141,158,140,128,122,118,123,125,125,125,124,128,127,128,135,137,142,140,141,141,143,151,153,151,151,158,156,157,155,157,154,155,153,155,155,154,154,155,154,156,156,157,157,157,157,157,157,157,157,157,157,157,157,156,166,156,172,217,243,238,245,240,242,234,225,242,242,242,242,240,239,241,239,243,239,240,235,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,240,245,241,240,242,243,241,239,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,181,167,195,145,139,149,143,141,139,127,124,122,123,126,122,124,123,128,128,120,129,143,157,155,118,130,122,224,233,237,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,236,232,233,230,234,233,235,234,240,186,123,130,125,133,150,151,151,152,152,152,151,152,150,144,141,139,140,140,156,173,203,213,142,141,142,164,163,178,191,187,172,193,167,95,139,143,142,138,137,128,124,128,134,123,132,120,129,122,120,124,125,125,125,117,125,127,123,130,135,141,140,141,141,143,152,153,148,160,159,159,154,156,158,156,158,156,155,157,157,155,154,155,155,157,155,157,157,157,157,157,157,157,157,157,157,157,153,164,149,172,224,246,238,242,245,245,225,218,241,242,242,242,240,239,245,240,239,240,240,237,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,241,245,237,236,237,239,241,241,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,223,169,160,168,143,133,141,133,142,133,122,124,123,122,131,125,120,121,120,125,122,120,127,122,128,113,138,127,223,232,236,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,237,237,237,240,239,237,239,236,236,232,232,239,193,133,127,120,122,146,152,152,152,152,152,151,152,150,142,144,138,139,140,195,222,235,216,153,136,150,173,204,221,230,225,203,230,193,116,148,137,140,139,133,122,124,124,131,116,127,119,119,120,123,126,125,125,125,128,123,124,121,123,137,143,140,142,139,145,153,149,157,164,154,159,156,156,159,158,157,158,159,161,158,156,156,158,157,155,154,157,157,157,157,157,157,157,157,157,157,157,149,154,159,190,229,244,243,238,240,242,201,206,241,242,242,242,240,240,249,241,239,246,245,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,243,244,235,236,237,239,242,241,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,226,227,227,228,180,137,142,126,119,123,128,135,126,127,126,123,121,130,127,124,127,126,126,123,122,125,121,123,123,126,121,177,235,239,235,231,240,239,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,236,238,238,229,230,237,237,237,240,215,147,119,120,116,129,150,155,154,153,159,153,153,141,127,130,136,140,164,222,236,236,223,183,161,187,224,239,238,234,236,234,243,209,137,150,150,146,135,122,127,117,133,133,123,127,123,123,124,124,124,127,126,125,130,127,125,123,126,123,135,139,142,145,143,148,150,154,161,159,157,157,156,157,157,157,157,157,157,157,157,156,157,157,156,156,157,157,157,157,157,157,157,157,157,157,157,156,157,165,222,242,243,241,235,240,245,188,190,241,244,250,240,242,238,240,245,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,242,242,240,241,241,241,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,223,230,224,220,176,138,128,130,124,127,128,128,124,124,130,126,121,130,121,122,122,124,122,121,123,126,126,131,131,128,123,143,191,235,236,233,235,234,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,235,237,239,231,232,238,238,238,239,229,170,129,126,128,131,135,152,149,145,143,150,154,139,125,126,175,185,213,230,241,240,231,200,183,229,242,239,240,238,246,250,240,235,180,161,151,136,128,120,126,118,131,125,124,126,124,125,125,125,123,127,123,121,127,126,124,124,126,120,134,139,139,141,148,149,150,146,161,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,155,172,229,248,245,236,245,225,188,173,205,222,234,235,237,242,238,240,243,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,225,232,208,200,146,120,124,128,123,121,123,121,117,122,125,126,124,129,123,127,122,126,122,130,123,127,128,120,121,123,127,116,147,203,235,238,232,233,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,236,237,238,234,235,238,238,238,236,237,207,161,129,119,117,138,149,151,150,148,150,153,138,125,137,207,246,243,239,243,243,238,231,220,243,239,240,243,238,243,246,233,244,194,158,154,134,123,123,127,122,126,120,125,125,123,125,125,125,123,126,121,124,123,122,124,124,128,121,132,139,138,135,149,153,151,152,160,153,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,156,159,217,239,242,234,236,223,237,205,169,199,198,227,236,244,242,240,242,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,225,235,211,172,132,126,113,97,105,120,92,100,111,110,100,106,125,109,123,103,121,125,97,109,115,116,114,109,107,95,103,122,120,157,210,239,237,235,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,236,236,235,232,234,238,238,238,232,234,235,200,141,121,122,139,149,159,163,161,153,154,138,125,199,242,237,234,243,239,239,242,244,241,242,235,239,246,236,237,240,236,242,189,155,157,146,129,122,127,122,123,123,128,123,123,125,125,125,124,126,121,131,122,120,123,125,127,121,130,138,141,140,150,156,149,162,155,153,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,158,179,217,243,230,241,238,233,246,217,176,165,179,185,227,241,238,243,242,237,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,232,190,143,129,127,58,27,42,106,14,35,81,40,27,56,126,54,104,23,114,89,28,35,65,87,67,77,63,27,33,120,120,131,169,219,240,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,236,236,235,232,235,238,238,238,237,236,241,223,150,126,132,153,145,146,154,156,153,154,137,125,195,244,245,244,241,236,236,240,238,240,244,231,229,243,240,240,240,224,236,198,156,157,159,146,122,125,124,124,125,128,123,123,125,125,125,123,126,122,128,124,123,124,124,124,123,127,138,144,147,153,154,149,162,155,154,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,162,204,230,243,240,243,225,217,229,235,191,142,146,141,171,207,228,244,243,234,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,230,173,132,123,121,62,90,51,81,49,115,117,47,96,111,129,56,80,28,116,44,94,51,40,94,32,114,63,89,61,87,128,123,138,176,229,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,237,236,236,235,237,238,238,238,240,237,236,231,177,160,173,185,171,153,145,143,150,154,136,125,175,235,244,238,238,238,238,237,240,238,220,216,226,242,239,238,235,204,229,207,159,155,156,152,123,127,128,125,124,124,123,124,125,125,125,122,126,124,125,132,131,125,124,123,124,124,137,142,143,150,151,157,159,157,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,162,226,243,246,245,241,201,177,221,239,230,173,154,126,122,147,207,238,245,246,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,229,158,123,122,116,62,104,75,68,33,77,113,51,116,128,128,57,54,50,111,41,121,83,23,45,22,124,65,104,83,75,123,122,119,141,203,234,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,236,236,236,237,237,237,237,236,235,236,237,238,238,238,236,232,234,237,210,216,226,228,200,176,161,151,151,154,136,125,181,233,245,233,239,242,242,239,242,239,218,226,231,245,232,233,237,214,235,205,156,152,155,151,124,126,128,125,122,121,124,125,125,125,125,122,126,128,131,143,139,127,123,121,125,122,136,136,140,149,153,158,156,156,160,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,165,226,236,246,238,237,184,157,217,240,230,221,214,143,126,129,192,235,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,228,228,144,123,122,121,62,103,77,69,21,52,102,54,109,127,128,53,50,62,112,42,124,81,23,42,34,100,66,103,83,79,121,123,121,130,192,235,235,235,237,236,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,234,238,240,239,234,231,234,236,236,234,235,236,238,238,238,237,235,238,235,216,228,238,232,225,197,189,175,164,154,142,127,196,242,238,234,245,237,237,237,245,236,228,241,236,227,198,206,215,201,226,185,157,156,156,154,128,128,128,129,123,114,157,176,144,120,121,119,123,122,139,149,144,128,121,124,123,118,134,133,145,157,153,161,163,152,158,156,160,154,156,159,159,154,162,159,157,155,156,157,157,157,157,157,157,157,157,157,157,157,156,151,159,170,162,199,238,243,238,227,175,156,224,242,234,237,238,174,132,120,199,240,240,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,230,227,135,126,126,125,62,106,56,78,52,118,122,53,106,127,129,33,67,64,113,41,107,51,37,92,61,80,65,107,60,90,125,125,127,129,186,232,235,235,235,234,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,235,233,238,239,236,237,234,232,237,236,235,235,236,238,238,238,232,232,228,210,199,188,198,223,240,226,222,211,218,201,195,181,202,243,222,196,243,242,241,240,226,213,243,241,222,179,158,176,164,167,172,153,142,144,150,155,138,137,124,127,125,129,205,222,180,123,130,122,123,137,151,151,153,136,127,132,133,120,128,140,151,161,155,156,164,153,155,158,160,153,155,162,153,157,156,159,154,156,156,157,157,157,157,157,157,157,157,157,157,157,160,147,160,177,202,175,206,240,239,226,160,181,237,242,242,242,241,181,150,131,210,242,238,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,228,225,134,125,126,124,52,18,23,106,10,23,81,52,110,126,125,25,96,60,109,82,19,27,67,17,11,98,61,18,20,113,123,124,128,125,160,220,236,237,233,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,235,234,229,227,232,233,233,237,236,235,235,236,238,238,238,234,234,206,171,155,144,164,189,228,242,244,240,241,231,237,236,222,228,191,171,228,238,248,247,211,201,244,242,222,164,147,158,138,139,143,141,146,142,144,141,131,137,124,122,125,182,234,242,221,138,128,132,142,150,154,158,157,146,150,126,128,141,122,124,145,157,156,151,59,152,100,119,101,30,103,80,64,161,78,125,156,154,156,157,157,157,157,157,157,157,157,157,157,157,159,155,161,215,218,209,220,239,220,207,181,217,244,242,242,242,238,232,174,142,214,241,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,228,220,129,124,126,126,106,92,114,128,89,90,108,113,123,126,122,91,123,105,115,131,97,114,114,88,98,127,110,95,104,127,119,128,125,124,160,213,234,238,233,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,238,234,226,223,230,232,234,236,236,235,235,236,238,238,238,237,244,196,149,152,154,150,163,211,232,239,241,240,239,242,242,248,224,186,189,204,243,230,242,211,178,224,240,193,146,134,134,147,143,153,141,142,143,141,136,138,141,127,118,149,234,233,243,217,153,138,146,153,148,156,155,154,150,144,124,129,134,119,124,147,152,157,158,39,115,49,142,35,98,40,68,34,107,50,146,154,156,157,157,157,157,157,157,157,157,157,157,157,157,163,164,210,236,248,238,245,234,188,154,196,232,239,242,242,242,243,237,171,143,223,240,240,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,228,213,130,124,125,122,132,134,123,123,125,129,121,126,122,127,123,127,124,129,123,127,129,129,122,125,128,122,124,128,122,119,123,125,125,121,145,194,222,236,233,236,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,228,216,207,221,234,233,237,236,235,235,236,238,238,238,231,237,190,144,149,167,161,147,200,234,239,240,239,241,234,226,241,239,228,228,198,233,244,222,188,187,224,234,179,141,150,128,138,139,141,140,139,138,137,137,144,137,137,120,178,241,239,244,205,145,148,149,150,149,153,146,158,161,154,132,122,121,134,156,158,151,159,169,74,14,20,156,117,131,38,80,30,16,43,158,156,153,156,157,157,157,157,157,157,157,157,157,157,157,160,154,223,235,246,222,240,233,172,147,208,238,244,242,242,242,233,243,183,122,227,242,240,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,227,214,135,122,128,125,128,124,121,120,123,123,122,123,120,126,127,121,124,126,120,127,125,120,123,123,124,125,122,120,119,124,124,127,122,121,145,168,201,233,236,235,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,234,233,228,225,231,237,235,235,236,235,235,236,238,238,238,239,226,176,137,152,157,157,157,204,240,231,232,234,232,213,199,243,241,247,247,196,224,245,201,181,195,241,234,174,136,148,147,139,138,140,142,141,143,144,145,139,134,164,133,178,235,244,236,196,160,157,152,153,150,146,152,161,155,159,145,132,138,129,159,158,154,160,154,94,105,49,154,100,32,80,68,49,107,72,157,156,155,156,157,157,157,157,157,157,157,157,157,157,157,155,156,207,236,227,208,239,200,132,185,241,245,240,242,242,242,244,234,182,157,235,242,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,227,219,138,123,129,121,126,124,123,124,126,125,123,124,123,125,124,124,123,127,123,125,123,123,126,124,124,125,123,121,122,127,127,125,127,123,127,135,180,230,239,233,237,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,236,234,236,234,232,234,237,236,233,236,235,235,236,238,238,238,239,233,197,145,156,160,154,159,209,240,223,232,240,241,215,202,241,236,240,225,170,216,232,182,167,190,225,232,166,147,138,138,143,144,142,142,139,141,140,142,144,144,163,139,184,227,241,223,173,156,155,148,153,153,151,157,162,154,158,157,162,151,125,144,157,159,157,155,125,59,74,153,44,107,122,73,81,56,98,159,155,155,156,157,157,157,157,157,157,157,157,157,157,157,162,156,154,215,227,189,197,156,137,196,238,243,238,242,242,242,243,232,176,197,238,242,242,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,226,225,155,120,128,123,126,99,113,119,97,100,105,105,100,85,73,81,106,109,112,95,88,125,93,78,96,107,123,86,119,128,124,128,118,125,120,124,162,221,237,232,236,238,237,235,236,236,238,239,238,238,238,237,237,237,237,237,238,238,238,238,238,238,238,237,237,237,237,236,235,237,236,235,237,239,236,234,236,235,235,236,238,238,238,239,234,201,131,156,162,158,160,193,237,234,241,243,249,221,208,235,241,235,171,164,197,220,171,165,187,204,207,158,182,151,150,137,134,142,148,150,147,148,138,151,156,160,141,199,217,243,206,163,143,148,147,153,154,160,161,160,156,159,158,161,146,123,130,143,153,158,155,152,23,101,160,42,82,62,78,109,23,117,158,157,157,157,156,155,156,156,157,156,158,157,157,157,157,157,159,152,186,189,166,161,146,145,172,227,240,240,237,242,241,236,229,179,227,239,241,242,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,225,228,183,117,125,122,127,68,77,87,62,58,66,69,64,37,45,60,81,82,72,67,40,108,38,38,41,66,99,53,114,128,131,156,132,128,119,125,139,187,224,221,232,236,237,233,233,233,237,239,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,236,236,236,237,237,237,237,237,236,236,235,235,236,238,238,238,234,230,206,136,154,160,157,162,167,210,235,243,238,241,225,220,238,231,202,145,182,226,211,144,155,167,180,147,130,211,189,174,153,138,157,182,204,192,191,145,152,158,158,139,207,229,238,185,160,150,159,158,157,155,153,156,157,150,146,156,150,130,123,124,123,132,154,152,159,71,135,155,108,65,124,105,135,78,139,154,156,154,155,156,159,156,161,156,155,156,158,157,157,157,157,159,155,170,159,163,152,154,149,148,219,238,245,238,244,240,238,223,213,237,243,245,241,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,233,197,121,120,125,126,93,21,25,82,58,49,57,65,46,107,115,78,80,40,106,43,83,65,93,57,21,32,93,149,126,134,208,180,156,121,125,124,134,166,168,202,234,233,232,236,235,234,234,237,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,236,236,236,237,237,237,237,237,236,236,235,235,236,238,238,238,233,232,212,149,150,158,158,167,161,186,209,240,240,233,217,223,239,194,158,186,223,237,205,137,141,129,141,115,105,217,236,214,175,167,188,221,235,231,221,146,128,144,133,161,221,238,231,171,139,158,152,157,158,160,156,152,155,139,136,143,143,131,129,120,122,122,136,155,155,149,153,151,160,148,152,149,148,153,148,154,154,154,156,151,142,137,161,159,158,153,155,157,157,157,156,158,150,157,165,160,157,158,159,150,220,242,248,249,246,239,237,190,222,235,242,246,243,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,231,200,133,120,125,126,112,38,46,100,58,44,54,66,40,53,76,82,22,24,124,40,69,86,119,113,26,53,133,206,142,124,186,207,198,147,120,135,121,117,132,203,233,232,231,238,237,235,233,237,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,236,236,236,237,237,237,237,237,236,236,235,235,236,238,238,238,239,236,203,153,150,156,158,157,150,155,187,241,243,243,211,217,219,148,165,221,237,232,184,145,149,130,129,118,109,221,241,234,215,228,232,241,240,243,212,135,121,125,125,194,234,243,214,151,134,162,149,154,159,155,154,153,146,141,144,137,139,133,133,126,127,131,128,156,153,156,154,158,157,161,153,162,150,162,156,156,151,157,150,128,121,124,133,138,156,160,153,157,157,157,156,156,156,150,154,157,158,158,157,160,228,235,229,250,245,241,228,163,178,213,236,235,247,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,228,234,222,153,128,122,125,119,41,59,116,54,55,48,65,38,50,75,80,43,47,81,41,67,83,124,119,32,56,164,230,151,125,170,205,207,193,150,138,121,115,127,208,235,243,235,240,239,239,240,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,236,236,236,237,237,237,237,237,236,236,235,235,236,238,238,238,240,238,213,183,162,161,163,147,149,135,185,236,221,243,231,226,167,134,195,239,237,195,156,133,137,124,120,122,140,231,241,239,236,244,243,242,248,239,183,133,124,135,141,226,243,241,184,136,144,158,153,159,155,150,159,157,138,146,139,140,140,137,140,140,135,144,141,157,154,154,156,160,158,157,162,156,151,160,148,130,127,129,130,127,125,126,124,122,129,159,158,157,157,157,155,158,162,158,154,155,156,156,151,166,169,181,201,242,240,243,222,158,125,171,215,235,234,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,226,229,228,182,137,123,123,122,45,49,123,44,58,52,54,50,117,123,80,80,78,62,43,94,60,99,58,53,41,160,228,160,132,186,200,181,213,239,178,129,125,127,191,231,242,243,235,234,236,239,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,236,236,236,237,237,237,237,237,236,236,235,235,236,238,238,238,235,235,222,189,203,214,211,191,147,143,160,180,162,181,227,210,127,153,207,236,190,173,158,137,128,137,137,130,153,230,241,243,238,239,238,240,238,193,140,132,138,124,166,237,248,196,163,148,139,155,187,194,155,132,148,146,143,145,140,139,144,141,135,136,140,140,145,159,156,160,168,151,153,152,161,150,157,153,123,124,126,122,126,129,129,125,125,129,118,142,159,157,157,157,156,157,160,163,155,154,159,153,148,152,139,127,169,233,236,243,242,155,128,145,225,224,249,240,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,228,227,229,208,157,114,124,124,55,54,125,45,67,66,54,44,11,37,87,11,11,99,47,126,32,12,99,74,35,138,215,178,139,209,221,197,202,198,179,131,119,119,145,178,216,229,212,216,226,234,237,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,236,236,236,236,236,237,237,237,237,237,236,236,235,235,236,238,238,238,234,235,236,234,233,232,234,219,150,138,135,152,139,159,191,178,124,190,242,210,175,155,144,149,158,158,149,138,161,218,238,240,229,226,238,229,200,145,132,132,128,123,189,239,238,186,138,133,149,158,187,210,178,135,134,136,142,139,139,141,142,143,141,139,145,138,155,159,159,164,157,152,156,150,155,156,156,146,118,119,121,121,121,123,120,121,122,122,126,163,157,157,157,157,160,153,157,163,158,157,155,157,160,143,129,113,154,230,239,243,234,181,196,204,206,242,236,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,225,229,224,171,123,121,124,112,118,120,114,115,120,112,103,96,100,112,103,108,119,107,117,118,116,128,113,106,130,202,195,148,190,228,206,190,151,159,140,133,129,116,145,166,198,203,207,220,229,235,239,237,236,235,235,236,237,237,237,237,237,238,238,238,237,235,236,236,236,236,236,237,237,237,236,236,236,236,236,235,236,238,238,238,235,237,231,239,238,238,246,223,156,149,138,138,132,151,127,130,128,198,228,164,154,161,138,139,147,146,156,155,164,215,236,241,213,197,232,214,161,125,116,117,123,128,216,239,233,177,138,145,155,152,194,230,186,146,144,143,139,139,141,138,143,149,146,142,142,140,148,150,161,160,157,160,165,157,157,159,136,127,131,125,124,125,124,119,121,123,122,122,121,154,145,157,155,155,162,152,152,154,154,158,155,158,158,141,126,128,151,226,242,244,222,210,246,240,232,234,247,238,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,212,150,116,120,129,124,121,123,123,123,123,123,125,123,124,123,123,123,123,124,124,125,128,125,129,128,162,229,213,224,239,224,163,160,158,159,155,159,154,129,115,163,188,178,189,210,222,241,235,234,235,232,238,235,236,236,236,236,238,238,238,237,235,236,236,236,236,236,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,233,232,238,223,156,143,144,143,141,142,128,125,129,185,163,162,161,153,148,150,154,155,153,149,151,198,232,233,198,183,218,177,126,124,129,126,123,133,200,241,233,221,170,143,145,137,197,232,168,132,140,139,141,141,141,141,148,171,161,149,138,145,142,145,164,155,164,161,153,157,147,139,128,125,122,125,125,125,125,126,124,122,120,123,123,129,129,152,151,152,159,157,157,157,156,158,156,156,157,159,140,126,136,220,238,242,231,236,239,243,235,225,233,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,230,220,154,119,125,131,127,128,126,127,127,127,125,126,126,127,127,127,127,128,128,129,128,123,123,139,127,135,203,217,217,230,211,169,149,152,157,159,162,162,134,122,148,165,167,174,200,211,232,238,240,241,234,239,230,236,236,236,236,238,238,238,237,235,236,236,236,236,236,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,235,237,232,216,160,144,143,146,150,161,143,142,146,164,167,152,160,148,153,151,157,162,167,158,142,181,209,216,182,175,242,176,128,124,127,124,123,126,158,214,231,239,185,139,143,132,176,208,168,137,141,140,141,141,141,144,146,187,182,172,146,143,144,141,150,160,157,158,151,129,131,129,126,124,124,125,125,125,124,120,123,121,122,124,124,125,122,134,159,158,157,157,157,157,156,155,156,156,158,158,137,124,124,220,241,231,214,235,239,240,241,235,229,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,231,223,168,132,130,124,125,125,124,125,124,123,122,122,122,123,124,124,124,124,124,124,123,121,128,138,167,148,187,209,185,203,179,162,150,154,155,154,153,149,157,137,142,158,175,195,226,222,234,240,229,234,232,235,238,236,236,236,236,238,238,238,237,235,236,236,236,236,236,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,236,243,240,197,158,146,142,148,148,146,148,154,176,176,171,148,155,144,149,146,156,157,160,152,136,159,180,183,164,167,194,146,127,122,124,125,121,121,128,183,205,210,176,136,143,137,160,184,158,140,141,140,141,141,141,133,141,184,188,188,151,139,143,140,138,164,154,161,140,122,126,126,125,124,125,125,125,125,124,121,121,123,125,125,128,123,124,125,138,149,156,157,157,157,157,157,156,157,157,158,138,124,129,211,237,234,197,229,242,240,247,241,230,238,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,231,229,195,150,134,121,123,124,123,125,126,126,127,127,124,124,123,123,123,123,122,121,123,126,137,143,208,215,219,231,188,174,155,148,157,161,157,155,154,155,168,171,157,163,190,229,235,233,235,236,206,204,203,228,235,236,236,236,236,238,238,238,237,235,236,236,236,236,237,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,237,239,226,163,153,143,143,72,55,71,105,63,136,172,90,146,79,146,80,67,157,102,136,132,87,150,102,149,158,164,167,130,115,122,123,127,121,121,135,156,163,161,147,131,144,141,145,157,143,135,140,140,141,141,141,143,138,156,161,175,146,139,140,143,136,157,153,161,145,128,125,127,125,126,125,125,125,125,124,125,125,127,126,125,127,125,141,132,131,154,155,157,157,157,157,158,158,159,158,159,135,124,130,208,239,218,222,239,244,239,242,241,228,238,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,232,212,171,148,126,126,128,126,127,129,132,136,137,132,131,130,130,129,129,129,127,129,126,135,138,198,236,235,240,194,152,154,154,159,162,161,159,157,155,180,167,170,159,197,233,242,240,234,214,179,161,177,210,235,236,236,236,236,238,238,238,237,235,236,236,236,237,237,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,234,224,189,145,149,143,146,39,70,100,41,56,51,158,39,132,43,123,48,60,107,71,132,130,49,124,52,145,153,163,158,141,113,121,123,126,127,125,154,136,136,147,140,131,142,142,134,133,130,134,142,141,141,141,141,144,134,136,135,151,140,144,137,141,131,131,152,155,158,132,124,125,125,128,124,125,125,125,125,127,126,126,123,124,127,125,158,155,158,160,156,157,157,157,158,158,156,138,147,158,131,124,133,208,229,185,237,241,246,244,237,238,226,235,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,231,227,213,185,173,123,116,118,119,119,119,119,120,120,118,117,120,120,121,119,118,116,116,114,143,149,178,199,221,234,178,160,164,160,154,155,157,160,160,157,163,173,187,174,191,226,230,236,238,212,174,151,173,208,233,236,236,236,236,238,238,238,237,235,236,236,236,237,237,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,235,219,183,155,158,145,143,52,135,159,40,122,34,142,43,79,94,74,99,128,57,68,105,145,47,23,51,159,155,161,159,154,119,118,121,127,133,129,148,137,136,147,144,138,141,144,138,137,134,140,141,138,141,141,141,136,134,134,142,138,135,145,139,139,130,116,134,138,144,133,121,122,127,127,126,125,125,125,124,120,120,113,114,121,124,120,159,157,156,153,156,157,157,157,157,160,152,128,128,141,127,125,146,226,210,216,233,240,240,239,240,239,216,229,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,225,215,186,186,162,157,156,157,159,158,156,149,149,152,152,159,159,159,158,158,157,155,164,177,159,150,166,177,203,156,150,152,159,158,153,153,153,156,152,154,169,191,207,192,202,227,215,236,236,180,195,206,223,242,236,236,236,236,238,238,238,237,235,236,236,236,237,237,238,237,237,236,236,236,238,238,238,238,238,238,238,237,237,237,236,240,229,223,180,160,145,147,32,43,98,44,123,44,133,8,12,101,72,123,138,55,65,10,49,68,80,78,152,160,153,165,156,111,120,122,124,138,139,119,147,143,139,141,145,139,140,145,150,144,147,144,138,141,141,141,144,145,141,144,141,136,144,142,144,129,121,129,123,127,139,121,124,128,126,129,125,125,125,123,119,140,136,134,130,124,120,156,160,153,153,155,157,157,157,157,159,132,125,124,126,123,124,135,226,198,178,223,247,239,243,248,238,217,234,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
231,230,228,225,226,228,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,226,219,203,195,156,158,161,156,157,157,157,157,157,157,157,157,157,157,157,149,163,156,171,161,170,169,158,157,204,192,156,157,152,164,151,160,155,155,161,160,157,157,157,187,238,246,183,228,230,237,229,207,233,234,236,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,235,231,232,236,229,237,229,219,209,185,142,40,79,109,43,127,41,131,35,101,41,72,115,138,49,77,131,56,70,74,97,162,154,156,146,128,102,116,120,124,125,132,143,143,142,143,144,145,141,137,139,141,142,142,141,144,143,141,141,140,139,140,141,142,143,142,140,158,126,119,125,123,127,123,122,130,127,124,127,119,130,128,121,125,124,123,125,125,118,128,145,153,159,158,158,160,158,156,143,126,123,119,110,134,122,128,172,209,197,209,244,242,242,242,233,237,177,228,241,242,242,242,242,242,242,241,240,238,245,237,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
236,233,231,227,230,227,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,230,216,195,159,170,151,160,155,157,157,157,157,157,157,157,157,157,157,157,156,161,156,199,165,164,146,151,156,182,174,153,157,157,156,161,157,164,155,151,158,157,157,157,170,165,211,190,202,201,221,229,192,226,241,233,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,239,239,240,240,239,205,209,221,235,181,119,41,110,134,42,122,30,128,38,115,34,101,59,78,77,78,110,51,96,26,121,159,158,140,106,96,115,124,123,123,125,134,139,137,140,137,134,135,132,134,136,139,141,142,142,139,138,138,138,141,142,142,143,141,145,139,142,151,127,122,125,127,125,126,133,128,135,128,124,129,126,128,136,124,124,124,125,127,126,126,129,149,156,153,160,157,158,140,126,128,131,129,132,126,133,129,183,188,202,221,240,242,242,242,248,244,217,236,242,242,242,242,242,242,242,242,244,240,245,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
236,232,231,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,231,201,175,154,150,159,153,157,157,157,157,157,157,157,157,157,157,157,162,146,163,208,164,180,151,157,159,158,156,152,157,159,157,164,181,177,159,152,157,157,157,157,152,161,164,163,162,155,198,218,190,225,238,233,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,238,237,227,234,234,217,179,195,192,205,199,68,29,64,57,126,62,135,34,34,78,151,55,47,139,90,38,73,142,53,142,155,133,105,105,125,130,122,123,125,125,128,132,133,134,133,131,129,126,132,139,141,141,141,142,136,136,138,140,140,142,141,140,135,147,143,144,140,130,129,129,135,128,127,133,124,125,123,130,133,138,134,122,124,124,124,124,126,127,127,128,156,157,153,158,159,148,128,122,124,128,122,124,128,120,136,208,184,222,243,241,242,242,242,241,244,209,226,241,242,242,242,242,242,242,242,246,234,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
234,226,227,229,229,230,227,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,210,173,153,155,161,153,157,157,157,157,157,157,157,157,157,157,157,160,150,184,222,191,200,158,157,154,150,150,156,159,156,160,174,195,187,161,162,159,157,157,157,155,156,156,161,167,154,161,174,170,222,242,236,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,234,228,196,201,228,216,170,138,147,225,227,162,111,117,115,124,127,125,124,129,149,150,150,144,154,138,139,160,160,142,163,139,103,109,123,129,123,121,124,125,124,124,126,129,129,127,126,124,124,130,139,142,141,141,142,139,139,141,143,141,141,139,136,130,133,137,136,129,131,135,133,138,131,128,129,121,122,128,134,119,168,175,125,124,124,124,124,125,126,127,127,152,154,154,157,153,129,124,122,123,128,124,120,122,118,157,188,219,241,242,242,242,242,242,243,235,193,222,242,242,242,242,242,242,242,241,236,231,237,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
231,223,222,223,229,227,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,219,228,204,159,160,160,162,153,157,157,157,157,157,157,157,157,157,157,157,157,159,181,232,213,201,153,162,152,155,154,161,157,156,157,186,226,222,176,155,155,157,157,157,163,162,160,159,161,153,155,152,161,205,240,234,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,233,225,172,154,213,218,153,119,136,220,236,200,145,137,124,124,132,125,145,147,145,142,145,141,152,146,153,150,152,151,158,114,108,125,125,123,121,122,125,126,123,123,122,121,120,123,127,126,125,131,140,142,141,141,142,141,141,142,142,139,141,136,135,125,121,124,124,123,129,133,131,134,128,129,126,124,126,131,123,118,163,198,150,124,124,124,124,125,125,125,126,151,154,156,159,141,124,125,129,128,120,119,122,127,127,160,175,237,239,237,244,242,242,242,245,215,169,220,242,242,242,242,242,242,242,241,233,237,237,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
231,223,222,221,225,227,229,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,208,228,188,164,160,160,158,157,157,157,157,157,157,157,157,157,157,157,157,157,160,166,219,221,200,157,170,154,159,156,159,154,158,153,172,233,227,171,152,153,157,157,157,156,155,155,158,171,176,167,154,163,190,231,232,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,235,231,164,125,192,231,169,124,150,220,238,231,168,141,111,124,122,122,136,140,139,138,140,139,157,156,153,153,158,151,145,108,122,125,123,122,122,123,126,125,124,125,123,123,121,124,127,128,126,128,134,139,142,142,142,141,140,140,137,136,138,135,131,122,121,124,122,124,125,127,128,130,124,129,124,126,121,129,124,124,132,202,177,123,124,124,124,125,124,125,132,157,157,152,149,129,125,124,128,123,117,128,134,126,148,170,212,238,239,241,244,242,242,242,225,182,153,220,242,242,242,242,242,242,242,241,235,234,240,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
234,223,224,218,209,228,227,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,209,212,190,170,154,152,154,158,157,157,157,157,157,157,157,157,157,157,157,160,159,151,189,203,194,153,161,148,159,154,154,153,162,149,168,218,228,169,161,155,157,157,157,155,160,162,154,168,170,176,171,182,215,240,237,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,236,237,237,237,236,238,238,238,238,238,238,238,236,235,159,123,185,241,183,129,193,240,236,240,212,198,152,128,125,131,138,141,139,140,145,147,137,137,150,158,154,146,117,116,123,126,125,125,125,127,124,125,127,128,126,127,127,127,124,126,125,123,131,140,143,142,142,139,137,139,132,137,137,138,126,127,128,128,127,127,122,123,129,128,123,130,123,128,118,126,128,131,119,201,202,123,124,123,124,125,125,125,129,139,137,134,131,125,124,124,121,116,142,161,179,182,199,197,231,236,242,240,243,242,242,242,199,138,133,217,242,242,242,242,242,242,242,241,240,237,244,236,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,227,228,223,223,211,228,226,224,226,228,231,234,233,226,231,231,230,228,228,229,229,229,229,229,229,228,225,231,210,159,155,155,156,157,157,157,157,157,157,157,157,158,156,153,154,159,155,147,161,174,160,154,151,148,166,149,153,156,145,151,175,215,218,184,164,149,151,154,156,166,166,164,159,146,166,161,165,200,229,242,236,236,236,236,236,236,236,236,236,236,236,237,236,235,236,236,237,237,236,236,236,238,238,238,238,238,238,238,239,234,188,136,186,235,192,128,211,236,239,240,235,229,181,143,168,198,203,159,151,160,157,147,126,124,143,155,155,140,103,122,124,125,125,125,125,125,124,125,125,126,125,125,125,125,124,125,124,124,126,129,134,139,140,139,134,126,127,129,129,129,126,126,125,125,125,125,124,124,126,125,124,126,124,125,123,125,126,125,136,194,173,124,124,124,124,125,125,124,125,126,125,125,125,124,124,125,128,133,169,202,220,233,215,213,238,240,242,241,243,247,238,205,146,122,136,219,239,236,221,235,242,242,242,241,242,241,242,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,225,221,213,187,215,224,219,227,229,225,231,229,229,228,229,228,229,229,229,229,229,229,229,228,222,194,170,157,157,157,157,157,157,157,157,157,157,157,158,157,157,158,153,155,160,160,159,153,169,165,151,158,152,160,159,159,166,183,210,234,189,193,177,153,159,155,148,150,155,156,161,167,145,165,214,231,239,234,236,236,236,236,236,236,236,236,236,236,237,236,235,236,237,237,237,236,236,236,238,238,238,238,238,238,238,237,234,216,174,173,215,170,152,229,235,239,240,247,235,202,200,238,232,223,205,176,215,160,118,125,128,141,155,144,109,105,128,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,122,127,132,135,135,130,121,126,127,127,127,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,122,131,192,159,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,140,188,212,232,245,239,236,241,242,242,242,237,237,225,173,128,126,157,218,243,232,217,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,227,225,228,226,221,203,203,209,217,229,228,225,225,227,229,229,229,229,229,229,229,229,229,231,208,186,163,157,157,157,157,157,157,157,157,157,157,157,156,157,162,161,153,155,163,155,159,162,150,158,163,161,153,162,157,188,207,212,229,240,233,219,196,177,157,158,148,154,157,151,161,165,177,219,226,233,237,237,236,236,236,236,236,236,236,236,236,236,237,236,235,236,237,237,237,236,236,236,238,238,238,238,238,238,238,237,237,238,216,214,175,141,184,228,236,240,239,242,246,204,203,229,228,245,242,233,242,186,146,117,125,150,132,96,92,125,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,122,120,124,128,129,125,121,127,127,127,127,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,122,118,158,132,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,147,226,232,240,242,245,242,241,242,242,242,240,240,191,135,125,110,172,227,239,238,234,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,228,228,225,226,224,225,213,195,200,221,230,229,228,230,229,229,229,229,229,229,229,229,228,229,198,191,146,157,157,157,157,157,157,157,157,157,157,157,155,156,159,154,149,158,155,175,190,163,159,148,160,159,150,153,151,184,240,232,230,236,237,234,219,189,152,162,157,162,165,162,152,154,161,228,234,233,236,239,236,236,236,236,236,236,236,236,236,236,237,236,235,236,237,237,237,236,236,236,238,238,238,238,238,238,238,236,236,241,238,220,171,141,220,236,238,240,238,232,217,197,228,238,171,208,233,243,237,184,126,128,137,146,91,98,113,127,122,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,123,123,124,122,122,128,127,127,127,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,116,139,120,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,124,135,225,238,237,240,235,235,241,242,242,242,241,226,155,129,118,123,180,243,239,242,246,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,229,229,230,231,229,226,224,215,203,199,216,221,219,225,227,229,229,229,229,229,229,229,228,226,191,163,146,157,157,157,157,157,157,157,157,157,157,157,157,158,155,151,153,155,157,195,230,163,203,172,156,152,162,174,195,221,240,237,239,236,231,237,235,192,147,161,153,154,156,155,157,146,159,232,241,235,234,236,236,236,236,236,236,236,236,236,236,236,237,236,235,236,237,237,237,236,236,236,238,238,238,238,238,238,238,238,234,236,232,203,142,143,212,237,238,239,238,241,233,193,214,229,133,169,203,238,236,207,165,173,152,122,104,122,125,122,121,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,127,128,127,124,123,121,123,126,127,127,127,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,121,117,136,123,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,121,134,228,246,241,245,245,244,243,242,242,242,243,220,138,120,127,166,210,236,242,240,245,246,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,226,229,227,228,231,232,230,228,229,223,206,190,181,174,210,226,228,229,229,229,229,229,229,228,225,193,169,156,157,157,157,157,157,157,157,157,157,157,157,157,156,155,159,166,159,152,191,221,169,197,184,155,154,182,202,222,236,239,232,235,236,241,240,236,197,148,161,162,149,145,157,165,149,169,218,239,236,235,235,236,236,236,236,236,236,236,236,236,236,237,236,235,236,237,237,237,236,236,236,238,238,238,238,238,238,238,239,232,232,221,205,157,143,209,237,240,240,238,238,232,212,219,205,129,134,211,212,239,217,184,172,148,110,116,125,125,123,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,126,127,127,126,125,124,126,125,126,127,127,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,122,125,126,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,130,228,249,244,240,244,246,242,242,242,242,242,203,125,127,145,201,239,237,240,243,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,227,228,229,228,228,230,230,227,232,223,191,151,148,181,207,228,229,229,229,229,229,229,228,226,190,177,157,157,157,157,157,157,157,157,157,157,157,157,157,154,157,169,173,162,151,160,187,156,160,175,150,155,184,231,234,230,234,236,235,232,241,235,235,192,158,161,156,157,172,194,185,179,177,228,236,238,237,234,236,236,236,236,236,236,236,236,236,236,237,236,235,236,237,237,237,236,236,236,238,238,238,238,238,238,238,237,234,237,227,200,193,183,231,239,241,240,237,228,224,227,231,182,124,119,214,211,240,218,213,184,138,114,127,123,124,124,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,123,123,124,126,127,128,124,126,127,127,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,128,119,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,133,119,212,245,246,237,239,242,242,242,242,242,240,217,145,128,165,223,246,242,242,242,239,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,227,228,229,229,227,227,228,226,226,218,202,175,145,139,152,203,228,229,228,228,226,228,228,230,230,174,147,152,157,157,157,157,157,157,157,157,157,157,157,154,156,165,185,195,198,174,154,164,164,155,163,152,164,192,240,237,233,232,233,235,234,236,232,233,192,158,156,153,147,192,219,221,204,186,235,235,237,236,235,236,236,236,235,235,237,236,236,236,237,235,235,235,236,237,236,236,236,236,236,238,238,238,238,238,238,238,237,237,239,235,228,217,212,234,241,239,239,238,199,182,225,220,138,120,125,201,238,240,222,206,166,137,108,129,122,125,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,123,123,123,125,126,126,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,121,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,127,129,194,243,237,240,239,243,233,216,225,242,238,225,150,128,180,217,243,245,243,242,242,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,230,230,230,231,230,229,224,224,206,162,149,128,121,139,196,224,207,223,223,229,229,229,230,215,157,145,144,157,157,157,157,157,157,157,157,157,157,157,154,159,153,171,206,222,205,157,155,157,157,157,156,158,199,238,235,238,241,235,236,235,236,234,229,206,172,155,164,149,191,233,237,212,199,243,236,236,236,236,236,236,236,235,237,233,239,233,237,238,235,235,235,236,237,236,236,235,236,236,238,238,238,238,238,238,238,237,237,237,236,238,228,225,234,239,238,238,238,173,145,175,179,121,128,121,169,226,240,243,218,164,157,139,126,124,126,125,123,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,121,124,152,183,166,191,203,216,183,180,216,242,238,223,147,137,220,234,238,239,244,238,237,247,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,230,230,230,231,234,227,203,212,195,136,126,121,126,125,149,174,180,199,216,224,223,205,200,183,146,157,154,157,157,157,157,157,157,157,157,157,157,157,157,164,146,164,178,170,170,152,160,157,157,157,166,153,188,230,232,240,236,241,238,234,236,238,232,219,177,154,160,153,175,224,234,233,214,241,236,236,236,236,236,236,236,236,236,233,236,218,235,233,233,239,235,236,237,236,236,235,236,236,238,238,238,238,238,238,238,237,237,237,236,236,233,230,235,236,241,238,230,164,128,146,146,133,133,110,145,217,239,229,201,226,219,200,158,123,125,126,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,124,114,127,133,126,140,139,144,130,158,234,244,242,234,172,147,174,206,233,218,242,243,237,248,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,230,230,230,232,232,226,218,222,197,142,116,119,131,123,125,135,142,167,183,207,183,151,137,162,162,156,145,157,157,157,157,157,157,157,157,157,157,157,161,172,202,200,166,165,152,158,162,157,157,157,161,161,160,204,238,235,233,232,236,235,234,239,243,237,183,147,158,159,194,217,240,226,232,231,236,236,236,236,236,236,236,234,237,231,224,191,221,237,230,239,235,236,237,236,236,235,236,236,238,238,238,238,238,238,238,237,237,237,236,237,238,237,233,235,241,240,217,166,141,151,144,138,129,114,159,225,231,194,166,187,198,176,138,127,125,124,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,122,116,126,129,128,123,121,116,122,155,238,236,211,232,183,127,151,181,211,186,234,242,241,228,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,230,230,230,226,227,231,228,228,218,163,126,118,123,127,120,122,139,151,144,140,134,127,118,125,143,163,144,157,157,157,157,157,157,157,157,157,157,157,164,193,232,228,209,189,161,151,162,157,157,157,151,163,156,177,213,234,237,230,235,236,233,230,236,231,188,149,158,166,197,236,235,242,223,236,236,236,236,236,236,236,236,235,231,201,177,166,201,235,236,234,235,236,237,236,236,235,236,236,238,238,238,238,238,238,238,237,237,237,236,234,239,241,235,235,241,241,218,146,139,143,141,130,119,128,202,233,241,185,154,145,147,151,104,120,125,124,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,128,124,122,116,114,130,130,130,155,212,216,156,223,183,119,119,122,126,145,211,241,245,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,230,230,230,227,227,230,229,230,226,187,140,125,116,129,121,129,132,132,132,116,119,125,128,122,124,172,153,157,157,157,157,157,157,157,157,157,157,157,156,162,197,218,222,185,177,152,152,157,157,157,156,159,136,169,198,223,233,238,236,236,231,215,219,208,212,182,184,182,214,234,228,218,227,241,236,236,236,236,236,236,236,237,225,171,158,152,183,224,237,233,235,236,237,236,236,235,236,236,238,238,238,238,238,238,238,237,237,237,236,235,237,240,237,236,241,240,230,172,145,136,146,125,116,133,217,235,236,176,151,150,151,144,107,108,123,124,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,132,126,123,132,131,129,129,121,134,140,144,133,190,148,114,117,119,131,125,169,200,228,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,228,228,230,230,230,229,230,231,228,224,216,219,187,156,138,127,128,125,124,116,123,115,120,130,128,124,116,153,160,157,157,157,157,157,157,157,157,157,157,157,151,161,166,176,185,197,205,169,155,157,157,157,160,160,157,157,165,195,218,233,236,238,233,216,203,209,224,219,220,209,236,230,204,186,212,237,236,236,236,236,236,236,236,233,197,157,156,144,164,214,234,234,235,236,237,236,236,235,236,236,238,238,238,238,238,238,238,237,237,237,236,238,235,236,237,239,238,238,236,205,167,146,143,125,124,122,192,238,231,172,148,158,155,151,127,107,124,122,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,118,128,123,121,123,118,120,124,126,126,119,118,134,153,130,129,127,136,115,123,138,126,168,231,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,232,231,226,216,210,232,228,207,191,144,126,121,121,124,123,130,127,119,117,127,119,126,154,155,157,157,157,157,157,157,156,157,155,155,156,150,159,152,149,162,177,166,157,155,155,155,159,163,156,153,150,174,190,220,233,234,223,212,206,229,236,243,240,242,241,211,165,174,178,205,237,238,236,233,235,235,235,229,183,155,156,146,151,190,226,232,233,237,239,236,236,236,235,237,233,239,235,227,230,237,237,236,236,236,236,237,235,236,238,241,238,238,236,235,186,157,134,128,124,118,155,213,227,183,159,157,151,147,123,110,125,122,137,124,121,129,123,125,122,125,125,125,124,123,124,125,125,125,124,122,126,123,126,124,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,123,130,124,120,130,128,125,121,119,125,124,127,123,121,127,119,124,134,117,129,125,117,144,236,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,229,229,221,220,226,230,228,217,186,160,126,125,119,125,124,125,125,125,125,122,119,136,156,157,157,158,157,157,157,156,160,153,157,160,163,159,155,154,159,160,156,152,153,154,155,159,155,155,158,158,155,163,187,217,215,194,180,187,202,229,235,225,230,235,193,161,170,156,194,236,238,236,234,234,235,235,230,176,161,150,155,150,168,200,235,234,236,238,235,234,236,235,236,232,234,216,179,184,203,226,235,235,236,236,237,237,239,238,239,239,239,240,243,208,180,149,135,121,126,126,157,224,214,174,156,148,137,103,115,130,144,160,133,123,134,122,125,119,128,124,125,126,123,123,125,125,125,127,121,130,123,125,125,125,122,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,126,131,117,127,127,122,133,233,239,240,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,229,229,225,225,228,229,221,178,156,155,125,123,118,131,125,125,125,125,124,124,121,118,147,159,155,155,157,157,157,156,158,159,162,177,192,176,172,161,151,156,159,156,153,161,161,156,161,159,160,162,156,153,170,173,185,180,175,180,221,236,237,202,211,208,177,174,159,166,214,234,227,237,241,235,235,235,229,167,159,150,152,150,158,183,236,241,232,233,237,232,233,235,237,240,213,179,132,125,142,191,228,235,236,236,237,237,239,238,239,239,239,240,241,225,219,168,138,133,119,126,134,211,235,198,156,149,120,109,123,166,196,190,172,130,123,130,121,125,130,123,124,130,128,125,125,125,125,131,125,128,122,122,123,133,119,127,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,116,125,121,150,128,121,139,225,239,240,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,229,229,230,230,229,229,221,167,126,123,140,134,120,131,125,125,125,125,124,126,119,121,129,157,156,156,157,157,157,156,155,159,161,185,198,210,203,192,153,149,165,152,157,167,155,146,158,156,152,154,154,154,177,152,167,173,179,225,232,237,236,211,215,185,174,178,162,169,238,229,202,236,236,236,236,236,231,182,154,149,152,151,146,161,209,232,231,235,240,236,231,234,239,240,210,162,129,127,124,156,214,235,236,236,237,237,239,238,239,239,239,240,243,236,223,196,149,132,116,129,130,192,239,209,154,149,107,119,139,194,232,224,209,143,123,123,120,126,127,123,127,130,124,123,125,125,125,126,121,122,115,130,122,134,122,128,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,116,127,166,216,154,129,194,212,245,238,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,229,229,232,232,230,228,234,212,178,156,179,157,125,123,124,125,125,125,125,122,122,121,126,138,160,157,157,157,157,155,155,158,149,187,214,232,216,187,164,149,158,154,149,156,166,165,160,161,157,157,161,155,153,165,179,177,181,226,228,229,238,235,234,217,182,178,172,162,222,176,190,223,228,235,235,236,234,171,142,146,156,150,145,157,175,185,196,219,240,241,237,231,236,237,221,192,198,197,174,192,227,235,236,236,237,237,239,238,239,239,239,240,242,235,243,226,171,121,124,125,124,153,202,192,156,143,101,128,146,208,227,210,217,183,139,123,131,121,121,121,122,125,120,121,125,125,125,126,120,121,132,153,120,126,125,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,162,227,241,175,161,233,216,248,238,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,229,229,231,231,229,228,228,226,224,217,222,174,126,119,124,125,125,124,123,122,129,124,126,121,151,160,157,157,157,156,154,155,147,190,194,217,213,186,172,145,174,183,145,176,178,154,150,152,151,150,153,165,166,155,155,157,176,186,195,214,237,241,239,230,238,180,184,164,172,163,187,221,236,235,235,237,232,163,146,150,155,150,154,155,149,155,168,191,215,239,238,231,235,234,230,232,231,232,224,231,237,235,236,236,237,237,239,238,239,239,239,240,237,237,235,242,200,137,129,128,129,121,156,169,153,132,106,135,173,182,154,133,174,236,205,145,142,130,119,126,121,120,126,126,125,125,125,129,128,132,139,171,146,124,127,119,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,155,218,236,234,188,203,243,230,242,239,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,229,229,228,228,228,228,230,226,223,231,230,176,123,121,124,125,125,124,123,123,123,124,124,123,128,163,157,157,157,155,157,159,152,163,153,161,155,165,158,151,172,205,176,193,216,172,163,173,167,162,165,173,170,167,156,151,167,177,166,179,223,236,230,221,219,201,168,156,144,164,201,216,243,235,236,236,232,193,166,156,151,151,155,147,144,148,138,156,187,216,228,230,234,237,235,238,238,238,236,234,236,235,236,236,237,237,239,238,239,239,239,240,238,240,240,237,195,164,141,128,126,122,138,133,150,122,121,129,137,137,127,133,167,236,208,163,176,152,127,134,139,123,124,128,125,125,125,130,129,127,140,183,210,152,140,130,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,199,235,238,246,203,239,244,238,238,240,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,229,229,229,229,230,229,229,227,226,228,229,225,232,229,227,223,181,138,131,125,124,124,125,122,125,126,127,121,128,119,140,156,161,165,160,158,163,163,150,161,155,160,152,155,158,179,235,204,205,230,189,183,201,210,209,204,197,228,179,155,170,191,225,177,166,207,232,234,214,184,177,159,174,159,189,234,237,234,236,236,235,232,199,181,158,147,153,150,149,159,161,154,153,177,191,221,224,233,235,238,231,234,238,240,236,234,235,236,236,237,237,239,238,239,239,239,240,237,239,239,206,228,179,153,127,143,158,140,160,147,105,122,119,122,131,126,197,231,236,196,185,229,165,151,145,159,144,131,132,124,124,125,129,130,118,128,209,235,197,179,127,125,125,125,125,125,125,125,125,125,125,125,126,124,126,125,124,124,124,124,125,124,126,125,123,122,127,125,123,124,124,125,125,124,126,126,124,126,125,123,123,124,125,125,125,124,126,126,125,125,124,129,129,128,123,121,125,126,126,208,241,238,239,220,231,235,246,241,239,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,228,203,201,173,133,130,124,122,124,125,127,125,122,124,124,127,156,188,212,199,170,175,168,154,153,159,165,177,175,212,223,216,194,185,203,205,223,218,213,227,217,182,196,198,158,184,194,226,212,174,207,231,235,232,189,163,154,159,167,227,241,235,236,236,236,236,234,217,190,163,153,152,152,152,152,152,152,152,149,158,158,178,192,218,228,227,237,235,232,235,239,237,237,236,237,237,239,238,238,238,237,238,240,241,241,241,223,228,189,144,154,146,143,154,152,97,125,125,140,180,207,239,240,232,227,228,225,213,233,210,224,218,199,174,129,135,147,176,168,130,151,234,237,230,163,123,127,125,126,125,125,125,125,125,125,125,125,130,121,131,125,123,125,120,120,124,119,130,126,120,114,132,124,118,123,124,127,126,123,131,128,123,131,126,118,118,124,129,126,124,121,148,152,147,144,138,156,165,149,127,122,146,155,152,220,238,247,238,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,232,226,233,207,180,159,140,121,118,121,123,120,130,146,146,151,188,207,226,231,223,210,198,186,196,193,180,195,225,231,234,209,180,180,157,165,181,161,169,202,228,207,207,219,155,201,223,238,232,184,195,220,225,228,175,154,154,163,156,195,235,233,237,236,236,236,235,224,201,173,154,152,152,152,152,152,152,152,147,155,149,155,161,189,210,224,231,239,235,233,238,237,237,236,237,237,239,238,238,238,237,238,240,241,241,241,232,238,210,185,166,152,137,150,155,123,164,182,217,222,232,236,240,236,234,231,230,217,237,239,239,231,215,203,172,201,219,204,155,127,174,217,202,202,128,124,124,124,126,125,125,125,125,125,125,125,125,124,116,129,123,124,127,126,124,125,122,120,118,136,125,116,119,130,124,122,122,125,123,129,118,125,124,127,126,122,118,122,121,128,135,200,217,223,212,203,186,209,186,179,197,214,222,215,233,240,246,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,231,227,238,227,225,202,178,158,123,139,156,166,181,202,206,204,222,233,227,227,228,234,223,216,208,212,216,229,234,233,236,216,193,196,164,153,167,155,161,177,219,226,231,202,161,195,238,232,223,185,173,188,182,202,163,152,148,169,185,213,231,232,236,236,236,236,235,218,173,175,156,152,152,152,152,152,152,152,154,160,150,147,160,179,199,198,233,238,235,234,237,237,237,236,237,237,239,238,238,238,238,238,240,241,241,241,242,243,237,217,183,165,167,162,156,154,209,230,241,237,241,240,241,242,244,243,243,235,240,227,233,241,227,218,227,237,234,175,123,134,221,168,132,141,126,149,134,126,122,124,125,125,125,125,125,125,125,121,122,131,123,129,120,126,126,132,128,125,123,124,128,124,129,139,133,126,127,125,123,132,124,123,118,129,138,155,153,137,129,165,186,217,237,245,242,231,225,245,237,237,234,242,238,241,241,241,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,227,225,232,225,235,230,217,207,175,179,206,218,215,230,235,227,232,232,227,225,225,230,226,226,224,225,231,234,220,222,231,225,195,183,164,154,168,155,163,195,230,234,230,202,184,201,239,225,186,170,165,160,150,165,159,160,166,186,223,225,236,234,236,236,236,236,235,210,187,170,153,152,152,152,152,152,152,152,152,154,149,148,160,164,187,189,223,238,235,234,237,237,237,236,237,237,239,238,238,239,238,239,240,241,241,241,243,243,242,239,216,194,208,205,202,211,232,238,237,238,241,243,242,242,243,244,246,240,224,198,213,236,237,237,244,240,215,140,127,176,229,170,148,130,140,173,146,127,122,124,125,125,125,125,125,125,125,124,126,124,127,119,120,128,120,125,132,126,127,114,124,156,189,176,178,174,174,144,119,127,131,127,142,162,177,215,228,196,195,225,211,218,240,244,244,242,240,244,243,248,240,248,245,245,246,242,240,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,233,230,230,228,228,226,226,228,223,221,229,228,228,233,234,227,228,231,227,231,229,229,227,226,227,225,230,229,192,179,200,227,164,164,147,153,165,167,172,202,233,230,210,192,191,202,228,231,182,150,199,158,149,159,184,176,187,217,236,238,239,236,234,236,236,236,235,204,189,169,150,152,152,152,152,152,152,152,146,144,146,147,152,159,168,187,203,233,237,234,238,237,237,236,237,237,239,238,239,239,238,239,240,241,241,241,239,239,238,243,239,231,235,244,236,240,242,244,237,239,238,238,241,238,237,234,237,224,182,181,217,239,239,236,248,240,217,146,137,217,222,192,162,153,173,173,145,125,127,125,125,125,125,125,125,125,125,132,127,117,127,114,128,141,120,118,130,117,121,116,151,211,235,225,222,227,224,162,129,143,172,180,201,221,229,245,245,229,241,247,224,242,247,243,239,242,240,240,238,241,237,247,247,241,246,242,239,244,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,232,231,231,230,225,222,225,225,230,229,228,231,229,226,225,228,222,224,222,227,229,225,228,229,228,227,235,234,209,197,181,191,185,191,168,180,184,193,192,200,222,210,177,179,183,216,217,226,207,160,195,180,173,177,206,171,195,235,230,242,236,234,236,236,236,236,236,221,178,158,151,152,152,152,152,152,152,152,149,148,152,155,152,165,170,185,209,227,235,235,238,237,237,236,237,237,239,238,239,239,238,239,240,241,241,241,237,239,236,239,241,238,237,243,243,233,249,233,236,242,242,245,239,238,239,235,236,216,136,172,241,242,243,233,241,243,228,185,188,238,223,212,175,193,176,141,120,119,130,125,125,125,125,125,125,125,125,141,137,121,138,127,113,132,133,141,145,124,127,148,195,243,237,237,239,240,232,183,200,212,224,228,233,246,249,235,241,241,225,242,238,243,243,238,240,244,242,239,238,238,243,239,244,237,239,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,229,230,229,229,229,229,229,229,229,229,229,229,223,224,227,229,229,229,233,234,228,228,229,229,231,223,227,235,235,230,225,231,234,229,228,230,230,230,231,232,234,226,202,164,178,192,186,228,230,224,210,179,198,235,223,159,178,214,173,192,208,174,193,178,174,172,183,187,221,243,238,235,229,233,236,236,236,236,236,229,168,145,155,152,152,152,152,152,152,152,154,156,152,149,150,142,162,211,217,229,234,237,237,237,237,236,237,237,239,238,239,239,238,239,240,241,241,241,238,237,240,243,242,242,242,236,234,237,240,238,240,238,238,236,238,240,243,242,241,229,136,166,237,239,243,237,230,247,237,203,199,236,209,226,210,192,150,130,118,128,126,122,125,125,125,125,125,125,125,170,149,163,176,194,145,153,207,218,215,165,163,205,228,239,242,242,240,230,220,199,229,243,243,240,237,242,243,243,242,243,240,248,239,242,239,243,243,242,244,244,244,242,239,238,241,244,236,240,245,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,228,228,228,229,229,229,229,229,228,228,229,228,229,228,228,229,229,229,228,229,229,229,229,229,229,229,229,232,235,232,211,211,189,208,215,231,233,237,239,242,233,232,232,227,207,233,222,188,204,243,236,214,242,243,225,213,232,240,238,233,234,236,232,236,239,237,234,227,178,147,156,152,152,152,152,152,152,152,152,152,152,151,147,151,163,161,179,201,237,236,234,236,236,237,237,237,239,239,239,238,238,238,240,238,237,241,242,236,236,241,238,247,236,236,240,240,240,240,241,240,240,240,240,240,241,242,241,244,189,165,232,242,233,242,242,237,239,236,233,234,239,236,242,218,179,193,141,112,124,130,128,126,130,127,128,130,122,141,201,178,205,237,230,230,237,238,237,238,236,241,246,242,233,233,238,201,218,229,242,242,238,241,241,241,241,242,242,242,242,242,241,242,241,242,242,241,242,242,242,242,241,241,241,242,241,241,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,231,233,233,227,211,233,240,240,236,223,182,212,226,226,231,233,236,223,184,225,193,224,196,176,186,180,176,179,223,231,234,225,233,236,233,236,235,233,237,236,227,165,146,160,152,152,152,152,152,152,152,152,152,152,152,150,149,158,160,166,174,210,226,236,236,236,237,237,237,240,239,239,238,239,238,242,240,238,237,239,244,219,232,239,239,237,241,241,241,241,241,241,241,241,241,241,241,241,240,236,243,210,152,195,230,234,248,247,241,241,239,236,240,243,223,224,232,236,215,160,122,128,118,120,129,117,126,128,127,123,116,145,181,237,241,231,231,240,240,238,237,235,242,241,232,224,210,228,235,230,213,203,212,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,234,239,232,247,240,219,204,181,174,195,196,198,212,206,225,213,195,224,218,210,174,180,198,193,187,196,194,245,236,236,228,232,234,232,230,230,230,230,208,161,146,155,152,152,152,152,152,152,152,152,152,152,152,152,152,148,150,150,174,203,214,237,236,236,237,237,237,240,239,239,239,239,238,240,240,238,239,244,241,242,242,244,239,239,240,241,241,241,241,241,241,241,241,241,241,241,239,232,244,236,195,154,199,226,222,233,243,237,240,241,244,240,229,213,234,243,234,205,178,143,148,140,146,113,116,130,128,125,133,164,220,241,243,241,241,243,242,241,240,237,240,238,235,212,160,168,190,219,216,219,224,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,227,232,238,241,234,223,204,215,219,162,190,231,211,225,226,228,218,217,218,233,232,203,177,228,224,202,203,218,222,225,235,237,237,229,217,208,202,196,194,178,151,149,151,152,152,152,152,152,152,152,152,152,152,152,152,153,153,155,152,171,230,231,236,236,236,237,237,237,240,239,239,239,239,239,240,242,244,240,222,223,248,236,237,234,240,238,241,241,241,241,241,241,241,241,241,241,241,240,236,242,246,238,216,186,194,195,221,242,235,240,242,241,236,238,230,235,244,241,236,232,215,223,209,176,131,140,153,167,153,186,220,229,246,239,243,242,239,242,242,243,241,240,235,234,228,222,222,242,246,243,244,239,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,229,235,237,232,230,219,207,189,222,230,208,231,231,223,224,228,229,231,224,217,222,206,187,191,177,168,180,181,232,234,239,235,205,170,161,153,157,159,152,153,143,152,152,152,152,152,152,152,152,152,152,152,152,151,155,154,156,165,213,225,237,236,236,237,237,237,240,239,239,239,239,239,239,241,240,234,202,204,243,232,214,229,243,242,241,241,241,241,241,241,241,241,241,241,241,243,243,237,238,241,240,236,228,214,230,241,239,240,237,236,233,238,237,235,239,235,239,242,230,237,239,216,173,199,213,224,219,230,246,234,243,236,239,239,237,242,241,241,239,240,238,238,241,243,242,242,247,240,246,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,227,234,229,228,234,236,237,237,240,232,233,240,224,204,203,229,225,227,217,213,217,228,223,234,199,217,207,194,179,170,168,220,220,238,225,180,165,163,159,154,144,155,150,150,152,152,152,152,152,152,152,152,152,152,152,152,148,151,146,150,158,199,226,237,236,236,237,237,237,240,239,240,239,240,239,240,237,230,205,180,174,225,198,194,229,240,239,241,241,241,241,241,241,241,241,241,241,241,242,245,238,233,239,243,237,242,240,240,240,242,241,237,238,235,239,242,234,236,235,239,242,239,230,221,219,221,232,231,244,241,240,235,229,242,237,238,238,238,239,240,241,241,241,241,242,241,243,243,235,245,238,250,236,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,226,235,237,233,235,235,239,235,229,230,237,237,228,233,203,227,241,238,216,211,214,221,230,238,195,193,191,188,183,175,169,179,189,223,232,204,187,177,162,157,151,158,145,160,152,152,152,152,152,152,152,152,152,152,152,151,151,152,152,148,167,185,207,234,236,236,237,237,237,240,239,240,239,240,239,242,237,211,189,154,158,207,200,220,234,234,222,241,241,241,241,241,241,241,241,241,241,241,238,242,242,235,240,238,241,240,241,238,236,240,242,242,243,240,242,245,241,234,228,236,221,217,221,204,208,233,240,244,242,237,238,241,241,239,242,239,239,243,237,239,241,241,241,238,241,241,248,239,241,244,240,241,239,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,239,247,
235,228,229,228,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,229,231,234,234,235,235,236,234,232,234,237,237,236,237,231,234,239,238,233,232,231,227,226,233,191,167,151,179,212,191,169,185,181,180,197,188,203,233,208,162,150,146,143,151,152,152,154,152,156,149,152,151,151,150,151,151,144,141,151,153,156,162,178,229,233,232,239,236,236,239,239,240,239,239,238,236,226,192,197,185,187,176,188,208,215,235,233,233,236,242,239,239,244,237,229,226,230,239,237,234,245,230,242,239,247,242,237,238,238,236,226,235,243,241,245,244,243,224,204,186,181,209,233,233,231,239,241,242,241,238,239,242,242,239,242,240,240,242,239,241,240,240,241,239,241,242,243,239,242,242,241,240,241,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,240,247,
235,228,229,228,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,231,234,235,235,234,234,236,238,238,238,238,238,238,238,238,238,238,238,236,230,223,231,217,199,183,197,214,161,182,166,172,164,153,162,184,194,185,177,164,176,165,146,150,153,151,146,143,146,152,155,154,153,155,152,152,154,156,159,168,171,187,216,225,233,236,237,236,239,239,240,239,239,238,242,237,221,224,226,219,204,202,197,207,227,229,229,236,243,238,238,243,237,227,209,219,235,219,221,237,210,228,226,237,240,237,238,241,233,228,234,240,240,241,234,235,216,201,198,211,231,241,243,240,241,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,241,240,242,242,241,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,240,247,
235,228,229,228,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,232,234,235,235,234,234,236,238,238,238,238,238,238,238,238,238,238,238,238,232,227,233,235,228,220,219,180,178,176,155,175,158,161,161,149,162,200,240,246,199,170,172,167,158,161,166,171,172,166,153,153,152,154,156,158,154,159,169,175,175,189,209,192,215,235,238,236,239,239,240,239,239,238,243,239,241,243,244,239,234,229,232,237,241,240,232,239,242,237,238,241,238,230,213,225,232,217,211,227,207,224,218,230,239,238,239,243,235,237,236,240,240,239,227,229,219,220,234,244,240,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,241,240,242,242,241,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,240,248,
235,228,229,228,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,230,232,234,235,235,234,235,236,238,238,238,238,238,238,238,238,238,238,238,239,235,232,235,229,227,234,236,245,224,214,231,201,178,202,210,176,182,180,168,172,204,223,217,216,219,219,216,219,192,176,159,160,157,160,170,164,152,162,173,199,220,208,224,222,230,236,236,236,239,239,240,239,239,239,240,235,236,243,242,240,237,238,245,244,241,242,238,242,241,236,238,242,238,234,235,238,239,238,232,240,223,233,235,241,241,237,239,244,240,239,237,242,240,245,237,236,237,235,235,237,243,241,239,241,241,240,241,241,241,241,241,241,241,241,241,241,240,240,241,240,240,241,240,242,242,241,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,241,248,
235,228,229,228,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,232,235,236,235,235,235,237,238,238,238,238,238,238,238,238,238,238,238,239,236,236,236,236,239,236,239,233,235,237,238,240,224,221,235,232,224,240,233,237,243,237,238,236,238,239,233,230,231,220,210,216,214,216,209,193,174,197,213,220,233,225,230,231,229,234,236,236,239,239,240,239,239,239,240,240,237,238,239,236,240,241,235,235,237,238,243,242,240,237,239,241,238,239,240,234,243,244,246,245,237,243,246,246,241,237,240,243,245,238,237,243,239,245,242,241,245,243,241,236,241,241,239,241,240,240,241,241,241,241,241,241,241,241,241,241,240,239,240,239,239,241,240,242,242,241,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,241,248,
235,228,229,228,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,232,235,236,236,235,235,237,238,238,238,238,238,238,238,238,238,238,238,237,235,237,236,238,238,235,238,233,240,241,238,233,232,234,238,240,233,237,244,236,232,233,235,230,234,232,233,238,240,236,231,237,235,237,233,230,224,230,236,235,246,236,240,234,234,236,236,236,239,239,240,239,240,239,243,244,243,240,240,241,242,242,237,241,244,244,243,240,238,239,239,239,240,242,242,239,241,242,241,242,237,240,237,237,238,240,240,240,244,238,240,242,238,238,237,238,239,237,241,241,236,239,239,241,240,240,241,241,241,241,241,241,241,241,241,241,240,239,240,239,239,241,240,242,242,241,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,240,248,
235,228,229,228,230,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,230,231,232,235,236,236,235,235,237,238,238,238,238,238,238,238,238,238,238,238,235,235,238,235,234,235,232,233,230,233,235,236,239,236,242,233,234,236,234,238,238,232,233,235,234,238,236,234,234,234,238,239,239,238,238,239,240,238,234,235,231,242,234,238,235,234,237,236,236,239,239,240,239,240,240,239,240,243,241,241,244,240,242,238,239,240,240,239,237,238,241,240,238,240,242,241,243,240,242,238,237,238,238,236,236,238,242,242,238,239,239,242,242,239,235,238,239,238,238,238,239,239,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,240,239,240,239,239,241,240,242,242,241,241,240,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,240,247,
235,228,229,228,230,230,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,229,230,231,232,234,236,236,235,234,236,236,236,236,237,238,238,238,238,238,238,238,236,236,238,236,233,235,235,235,234,235,236,234,238,231,237,233,233,235,234,232,239,235,234,235,239,240,240,238,237,236,236,238,235,236,235,237,236,234,234,235,233,238,236,236,236,235,236,236,237,239,239,240,239,240,240,237,238,240,238,240,240,238,239,240,239,238,239,239,238,239,241,240,240,240,241,238,240,240,240,239,239,241,241,241,240,240,241,241,239,238,240,241,242,240,239,242,242,241,242,240,240,244,242,241,241,241,241,241,241,241,240,240,240,240,241,241,241,240,239,240,240,240,241,240,242,243,242,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,240,247,
235,227,229,229,230,230,230,230,230,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,229,231,232,233,236,236,235,234,235,236,236,236,237,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,236,236,236,236,236,235,235,235,235,235,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,237,237,237,238,239,239,240,239,240,239,240,241,240,240,240,240,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,240,241,240,240,241,240,242,243,243,241,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,243,240,247,
235,227,229,229,230,230,230,230,230,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,229,231,232,233,236,236,235,234,235,236,236,236,237,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,236,236,236,236,236,235,235,235,235,235,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,237,237,237,238,239,239,240,239,239,239,240,241,240,240,240,240,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,240,240,241,240,242,243,243,241,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,243,240,247,
235,227,229,229,230,230,230,230,230,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,229,231,232,233,236,236,235,234,235,236,236,236,237,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,236,236,236,236,236,235,235,235,235,235,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,237,237,237,238,239,239,240,239,239,239,240,241,240,240,240,240,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,240,239,241,240,242,243,243,241,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,243,241,247,
235,227,229,229,230,230,230,230,230,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,230,231,232,233,237,236,235,235,235,236,236,236,237,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,236,236,236,236,236,235,235,235,235,236,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,237,237,237,238,239,239,240,239,239,239,240,241,240,240,240,240,239,239,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,240,239,241,240,242,243,243,241,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,242,242,243,243,242,247,
235,227,229,229,230,230,230,230,230,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,230,232,233,234,237,237,236,235,235,236,236,236,237,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,237,237,237,238,239,239,240,239,240,239,240,241,240,240,240,240,239,239,242,242,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,242,242,242,242,242,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,240,239,240,239,242,242,243,241,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,241,247,
235,227,229,229,230,230,230,230,230,229,229,229,230,230,230,229,229,229,229,229,229,229,229,229,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,229,229,230,232,233,234,237,237,236,235,235,236,236,236,237,238,238,238,238,238,238,238,238,238,238,238,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,238,238,238,238,238,238,238,238,238,238,238,237,236,236,236,236,238,238,238,238,238,238,238,237,236,237,237,237,238,239,239,241,240,240,240,240,241,240,240,240,240,239,239,242,242,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,242,242,242,242,242,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,241,240,239,240,239,241,242,243,241,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,244,241,247,
234,225,227,227,229,229,229,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,229,229,229,229,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,227,228,228,229,232,233,234,236,237,236,235,236,236,236,236,237,238,238,238,237,237,237,237,237,237,237,237,236,236,236,236,236,236,236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,236,236,236,236,237,237,237,237,237,237,237,237,237,237,237,236,237,238,239,240,239,240,240,240,240,239,239,239,239,238,238,240,240,240,240,240,240,239,239,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,241,241,241,241,241,242,241,242,240,240,240,240,240,240,240,240,241,241,241,241,240,240,240,240,240,240,240,239,241,241,242,242,242,242,241,242,242,242,242,242,242,242,242,242,243,243,243,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,241,241,241,241,242,242,242,242,242,242,242,242,242,242,243,239,247,
236,225,229,228,229,229,229,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,229,231,232,233,234,236,236,236,236,236,235,235,235,234,234,234,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,237,237,235,235,235,235,236,235,235,235,236,236,236,236,235,235,235,235,234,234,234,235,235,235,235,235,234,234,234,236,237,237,238,237,239,239,241,240,239,240,240,240,240,239,239,240,240,240,240,238,239,239,239,239,239,238,238,241,241,240,240,241,241,241,240,240,240,240,240,240,240,240,240,240,240,240,239,239,239,240,240,240,240,239,240,241,240,241,240,240,239,239,239,239,239,239,240,240,240,240,240,240,239,239,240,240,240,240,241,241,241,241,241,241,241,241,241,241,240,240,241,241,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,241,240,240,240,242,240,247,
238,231,233,230,230,230,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,229,230,231,232,233,235,236,236,234,232,232,231,232,232,232,232,233,233,233,233,233,233,233,233,233,233,233,233,233,232,232,233,233,234,234,234,232,232,232,232,232,232,231,232,233,233,233,232,231,231,231,231,232,232,232,231,231,231,231,232,232,232,232,233,234,234,235,238,241,241,242,243,242,242,243,241,241,240,240,240,240,240,240,240,240,240,240,240,240,239,239,241,241,241,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,239,238,238,239,240,240,240,239,240,240,240,241,239,238,238,238,238,238,238,238,239,239,239,239,239,239,239,239,239,240,241,240,238,238,240,240,242,242,242,242,241,241,240,240,241,241,242,242,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,242,241,241,241,241,243,243,243,242,241,241,241,241,241,242,242,242,242,241,242,245,240,
235,232,233,229,229,228,228,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,230,235,236,238,238,239,240,240,239,238,237,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,235,235,235,235,235,235,236,236,236,236,236,236,237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,237,237,237,237,237,236,236,237,236,237,238,238,239,239,240,241,239,238,238,238,237,237,237,237,237,238,238,238,238,238,237,237,238,238,238,237,238,238,238,237,237,237,237,237,237,237,237,237,237,237,237,236,236,236,237,238,239,239,238,237,236,237,236,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,238,238,239,238,243,244,244,244,242,242,242,242,241,241,240,240,241,241,242,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,240,240,240,240,241,241,241,241,240,240,240,240,241,241,242,242,242,241,241,243,240,
231,228,227,228,229,229,228,227,226,226,226,227,227,227,227,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,230,232,233,234,234,234,235,236,236,235,236,236,236,236,239,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,239,239,239,239,237,237,237,237,237,237,237,237,240,240,240,239,237,237,237,237,236,236,236,237,237,237,237,235,234,234,234,237,239,240,240,238,238,239,238,240,240,240,241,242,242,241,241,241,241,241,241,241,241,242,242,242,241,241,240,243,242,242,242,240,240,240,241,242,242,242,242,243,243,243,242,241,241,241,242,242,242,243,243,243,244,244,242,240,240,239,242,242,242,241,243,243,243,243,243,243,243,243,243,242,242,242,241,240,241,240,241,241,241,240,238,238,239,239,240,240,239,239,239,239,239,240,240,240,240,239,239,239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,240,240,240,240,240,240,239,239,239,239,239,240,240,240,240,240,240,240,240,240,240,241,241,241,240,240,243,240,
238,226,232,230,233,233,233,233,233,233,233,233,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,232,232,233,235,236,237,236,236,239,241,241,241,238,237,237,237,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,234,234,235,235,238,238,238,238,236,236,235,235,233,233,233,234,235,235,235,236,237,237,237,236,235,235,235,237,239,239,239,236,234,235,236,239,239,238,237,239,238,237,237,241,241,241,240,240,240,240,240,241,241,241,242,241,241,240,240,241,240,240,240,241,241,241,241,241,241,241,241,241,241,241,241,239,239,239,240,241,241,241,241,242,243,244,244,243,242,242,241,241,241,240,241,241,241,241,241,241,241,241,241,240,240,240,242,241,242,241,239,238,238,239,245,245,247,246,247,246,246,245,245,245,246,246,246,246,246,245,245,245,245,245,245,245,245,245,246,246,246,245,245,245,245,245,245,245,245,245,245,245,245,246,246,246,246,246,246,246,246,245,245,245,245,246,246,246,246,246,246,247,247,247,246,246,246,238,
242,233,238,238,238,238,238,237,237,237,237,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,237,239,240,242,241,241,242,243,242,241,240,240,242,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,244,243,243,243,243,243,243,243,243,244,244,244,244,243,243,243,243,243,243,243,243,243,243,243,242,241,241,241,243,244,245,246,248,248,248,246,246,245,245,245,246,246,246,245,245,245,245,245,246,246,246,246,246,246,245,244,244,244,244,243,243,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,244,244,245,245,246,246,246,248,248,248,246,246,246,245,245,244,244,244,244,244,244,244,244,244,244,244,244,243,244,245,244,245,245,246,246,248,248,248,248,248,248,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,246,246,246,246,248,248,248,248,246,246,246,246,248,248,248,248,248,246,248,246,242,
};
/advdemos/tags/rel_1_5_beta1/mesaref/test.png
0,0 → 1,373
‰PNG

+IHDRÈÈ":9ÉbKGDÿÿÿ ½§“ pHYs. . ÕtIMEÓ ÿÅ IDATxœì¼ùómÙUط֞Ît‡ï÷ûæîVOzjµf 4€(3ÉNÇ®Æ8ÓONŠ vå—üI¥R•TBœCBœªT\6B˜l™…µ‰žÇ×ݯß{ßáÞ{¦=®µòÃ}ï©5`‚ ¨ÜhÕ÷{ëÞ[ûܳÏޟ³ÖÚk¯uPDà­&ûkÂòÏüÌÏ~Ó7}ã}÷]AõÕîÔ_0yˎ·ˆ@)¿Ú½ù‹'oM°˜xžg"úWþòÖ öjŠ™ßŠ¶þ_y˂…ÀÌÌüÕîË_Dykƒ%D$ò5°¾
+ò–ë ¶ïkë«%oI°¾ _ó±¾ZòKäv ‹ˆJÉøµÖWCނƒŽ"""9ç”2"~Meýù‹ùjwàÏBP)¹m
+åk1Ò?oyëi,¹» üšƒõU”·X"p—%PJ)õV»Æ%ä-9è"€ˆÎ9­5~Íþ¹Ë[¬Û!*cŒÖú«Û›¿˜òÿƒóþÇú1øGk `Ü7¹Ó
+€œ@)û›Uà „_|¸ñµì— €òÅ÷:ßþâîúC„ PÁ~ЀH¢VÀˆ·Jî !Âz‚„PˆŒÖ,‚w¦Fö.€B`±ê+iäÎ_JRYw¦¾TGý™¯
+³ÞOÔÝs "
+@ÉÙßÔŠ²
+ÊÔN±zù¹§·7Ÿ7h꺑R
+>(EÎ9"R(Z"U
+ÄDR[hkMLT n”sÎJ(9ëF#’)•;[¦Ö¸B2o|‰DdSA"¡R ӁK­mmaS+£1„R'‘©ªª¬í©Ud Ð\i® ØJ9
+„ VZ‡ëÆ*«¢ä‹‚2†Drݶ˜eš³°(&¥QȤRäJ‰`¡"èKfÿÏ
+¬½™“7ɛ?Ò*
+ ueQ"E¡ÄiDA`ÇLY͡ԍžcĊqJžKªœA`d­8'¡âœ[/L¬B“àì£Odk•D-›V@â¶m9ykM×u)%f®*£AŽÑk*Æ؅s ç8禪÷›cÀœS¢B ,M»ŠTQ
+`Hkur¶5¦®êöÏ ¬7côfãµÿ¸7@D$% %x“zʁ)ß±–·ùRpÇxQ)Ä,̉øntïQ)lPR.¬ÂD
+ƒTUM¥0@Îe¿K–
+Bí
+˜8£«Ê#±Á„ì–m֜‘L[é
+5ÃnܬœµÊŸìòT<•“~K…D&d–£­QW(Z|Œ…8g,Ji0T$ÆbLÕ¶õ<Ï»'°TR[kš}Uk·\”qljÔ͗&½ýKj¬/‹ÝÖ7w”ŒhÄRÊ]ëFDDYC&–œ ƒòÞO>å\Yƒœ(6H9Î>(¥ *ÌD” BÐZ‹H¿ë)g\,BûŠÓ®xU öaB<=)›[7j73Û˜¹ªª‚bnË1R(…R@Î+F*¹¬W«RJˆ!ÇÄuUWm‰¾¤P‚ÏDÑÏÖVP(Ffkµ¶”RÊÙº…caUréû‘šºÑ bµʔ£¡…r,iÑuBُýj½ŽsŠ!H!%hµQPr)¹­¬Ñj³Ý8ÉRxŽá… 9¥Íé®ëºR‚ºqUs6x?Ž  ¦çP5N¡iºVˆ je•ÕŠxf‚‚¶ÎXìws!i«vÇq7)ÑõaŒR •<ù]½Ð­«£8Ѳ]TVçþT`}Š›ý§½W.ÌàŽ/tÇ~QFŽ,3e’ižÇٗR(ggµ.iö(”Ål´.”RŒˆP(ÅÛÚ óTÊ4MÖXcÌØ襤)¦ÄDܶ¾ïA Á‹à¼ f£‹Q TDؔÑ¥[…%†¼Aœ’ŸKÉе%†4ÏD4î¶J¸¶¦$M9Qaƒ`
+•Ñõªî,©œ
+°&@¥YJÊY!¬sÉÞS9D®juv6@TYh]kk›óæd·3Ö*­´Ñ
+!à4ŘÈ4Ñç¹$aîÚÖÙÚFß-¬ Œc4Ö± 6M‡Êìú‘YÖ«ƒâËöd@VÎãn¨šÖi•BúSõå0ÝýxW]ÝՈì×ØwE˜€CÊ%äbö>Ì1¦”JŠV«JcŽ³âL9aJJ ”S`&¢äý|txÂ^1d¨ªŠ™‚ÑÏû3†y†A£ò
+Å1šú\ŒB£tô¡ C)¨výˆ" pš§˜’³ÖÇ8oCôsÐÆ6m7 ãÙv×Ö5‘Œ£'A MS ©
+)öÞS!Ô*)SkیÉ07«&ÌÁƒU,‚ bʅX)]4Q™BÞöór¹œCâݘ2©
+­³µhT0úÂ,((Ä@"(Æd†$öµ[­µsÍà©[ÕsŠ4LÞԈ ÑÇ8ÇΚ£ 1ŠP5ËÕîx¢]•cÈRHXRÓê]ßǜ‡!SJ©ëLˆ‹ÔM—JÙn·Î¹ƒz(€ŠYH %ò#Kí¬ñO ֗¾Ü%ß+()¥ÄSJDB”gbHyò!Æ …r
+ ±˜â 9göˆA8Sb"@Ž!Páyž•Rû’ÖÞ97Íó¾$•Y`œF«mm,;žR?ö:f´±Àͳ @œãªªˆôœ2@KŠˆX €=ÞÌ9烃ƒ¦ZúÍF¿^™!H.‘mUK’ÍgæÌ
+­Ê‘´±ËÕ¡62‡b”b|.ÅÂ>¶]„Y!§ª^lNN6þXDT‹S?”$‰8‹Š1¹a$¥cŒ>„˜Ù9nëF”îÇÙk$U>ÇÖëP Œó¶šŽ ЅèoÛ¦Ù{K)f¡A¨äm
+d0ÛÊ{:i›ŽJلDÛd®ëåÈ܇ ´aÈ Žó\rc‹@zO¨êšõT¢@I)­í9ó¥²bçýËåMƎöʉJáE$çBˆ1–R„K
+Új;¦Pk$NÆ(¥ ¹U'3•ÅbAm¶žYŒs™‹¾l6¢Õ8Í%§ ±*ÄxôÞ: M,ºnF¥sάԨ´/d¬%m¦TI1gTi•)‚”%ø1±g9ÔÚZQz;{*Ô3dT‘yB¥@g–ÊDdÒØ6 2"²‚¢=hÕ¹Š¹”\°mÝ¢ûӁõÅhí—g9ç»ê*çœK¡Râ8îÁòއr)ÂŏۘS&gB )Ç(璓w*…™S0
+¦!¥È®29ǜ“±šJ™¦¡ª*£c.ÅÏsÓ4
+ZK&â£RègO…¶C4:َκÓÁaFŒ™mƒõ4Mû3Ÿ?wè ŸÚÖ JL%"McJ:ã¦>ZϹ€6퍛·Úv¡´žcÒAªºNbD!P)!ÆNkmm¦òڍ›G Gp·uÍC$2Z@RË ,!$Ó.O§4³ªêeT.$Ii«ØXŸ’P%Q–~j@ÅsŒJƒ©êî`í ‚³ ÑX³X.—MS˜•Ö¦­½S
+Ó<#'@ÛìbX,šÕ¥‹ÞOþ´¯—KH…<*[WÜDµZP@Œ«Û–P«œƒ1f¹\„BJ‹Å¢[,ú1Œ·¶»)Ýxé܅ 5Mg}oW hÿ°ÞG¸+w]õ/ Bw
+ªQ@H˜Hr¡˜bÌ9æäcL9©Ì£Ÿ#å)øÄäSœç¹L>¡Ì)¦¾ß¦Ñ[Aa)ª6c…Úšde
+#†’CàBV.êÎX+…„dŠ ƒ¯meZ=Ž±Bĺ®ÆœEÒ GªqÑh¸Ñ‚[]Ò¥ºfqìaÕ­¹…˜âŒº;Zn·»VE¨9<ðMM:MÞßbÊZ/¦äÒÑ;=@˜æ샤rÔvÔ4#¬§Mß×ΐˆgŒR÷ž÷ÆúiѺzšF£u1þyæ\_:P€4y¥Ûõò€D¦n=k%
+Ñâá•wsŽ³o«\cŸ¦©—S)(¡ÌFÝwoY.^öÓÄ<ÎÑ&Q¶™$Ÿ;X­zÛ­×^âeÝ‚9f¶­Œ}[¹¤øù×ßxàÝïcfÛlu2¢Öë~núpéÒúún÷ÒÞ7_¯zè¡[·n]¿~}Uw)#2.H'ÑQôåf1ª¦XkÚÏ®uzq´cëÐE\þËh¬»îÔݺõ»Á¤RJ
+)Ǻm‘­>wî܍ëoÄB³”œCœ'®ô–³qF4²”›Ó®F\¬W%Dh«ZFïmSS.§ý®ÖÖu­'Ó¶ƒŸKÝ4Ï.gý1£RvóÈ(®ivÓ¨S
+•'ÎeÕ-^+Eˆ‰|Š T1è›Úø˜GÉzÙBã"2—˜…—m­ëêO ÖÅÍîºSw=ª˜
+³¦œsˆÁ‡Sœ†qšç")ÑϳŸ}?O9 ³Ã8ÂÉ뮉)IŽ¢ÐZÛTM§“~·^­“°€”¥Ä"MÅV¢™(p±
+6U£•òeöTŠmÓ*çÆyY·ïzඪ¶ý®ŸÒMÛ®–\ˆs!æyö•s–0í|ãªÖ5n½X¶‹ÍæÌK¶UCsl–mÚ1DR˜A„Š˜§ ­vv‘| Y S·è€T µ\(†¦iÀYpFˆvó$’—‹EÈØkº«­Òu×Ã`œó9§œ˜¹ÖzêLjØ."œbŒ1èºY.”ö[Já\²6¬©l¥­æIçÜ-º8M”²Óf&©´‡jë KŽéâŋçW몪ÞvéÊf³ ™8³-,·=–9ÅÜv]eÝns¡,Ž.
+Ñà§?X{žnÇ<E˜9SÉ9çœïj¬œsfITbLsôÓ<÷ã0{ÏÌ$B(!§až‡yúq·Ù% Òj±\ÄL±p&6»ÊÚ¦²•®łœ²R­„,P¹ÊÛoz»X6u»¬ÛÆVã8ž½0¨BR
+•’KÙívÿ¿ÿûßû=ß½\.ôGôÒ¥Kÿáÿ0‹üèOüħŸ}J<@¡š÷ßøïúøw|ê³OüÿËO\Z¯ÿ³þ»GëÉÏh ù©Ÿÿ~ãñO°¾|I(w²Uö©vû (a.…r¡\(•bòÞÇï7ÛÝ4ϱ$Â0Ž»¾ÏÈ>„LT€Må|ˆ1¥ «£zÑíÂT
+Íã˜üÜTÕáúmÎÚ³ã
+ÓèCð>ö}Ï"Êê˜Ò<Ï)%öq
+^[Û¶m&PR‚×ÏNÞ؞úµ³½ŸŒµ‚ ´žü¹d*ž’[v©÷Y0 2Bˆ‰ÐtέÖk¥a±ê–Ë…s¶ŽÒ²·§ÓÉIÒZ
+BJ[¼+¾&1Ii2®R•5ÎTÚZ¥ÕÁŚH¬s ô4‡˜ÊüæÖIÉIJQ
+ã8ŽcÁY TŠŸfÜõ‚8ÞÍ%ÿí~øå×_ý…_øù¿ñWÿõ‹/l>û;ûˆÄ˜BJ¢µ5&û©ß­WTògŸüüÙv³emÈ)£¸¶a£tL)å„ZýêoüÆ÷ý›í?ü¿ý[ÆÚoyì±ÍnûÒSO^xÇP×µÄOÏNUšq6çòe%v_äc}Ñþ SþbªˆHD`a³Ùl‡~œ¦ižç9ìv;VÖøÇq )Æ~œ§©n›Æ8QYb’\6ÉRN™h·ÛicúÁLÞûœs™Jâbj'sÎ"1…ÆZM™R–ÆÙ¶ª4[2ŒI˜ã6N>QκrÐ8ö™f5)eÓ´÷8UÉSN‚Z)­³ÆYeŒ©«е‹f¢– IDAT±Ô¨.¬Wp°~Û¹óÁû·nÞ<¾sn¬n­qÆ´]§Œ9=;+1ÕuÅ,ÊÙ2û0LuUuU“­óPP´JÂèLgŒ!ˆkö[æ¥d­uL±Ÿ'VÖ`e0Î>Ŝµ«ÞñÎwV‹îc} ý ¿ôKÈÂDZéw=ú®ïüøwrçÆà_øü3¯¼üÒ}÷]ùà‡¿ážøì§ÿýïþøwÞwß½J©Ã4M1¥œs¤”³TJ;™ƒêÚèçÓí)£D.u×f¦~ ¶­Kʬ¸äœJ1•ûüÓO~{ü¾÷¿ë=æqíìG>ü‘k×®m¶Ûóðྖ$~ä‘G{ì1ªŒQæ7û·WŽþH°îRu#æ”Óݝ¾Û
+3)ƒhµÖÖ\½ïsõÒ>}íÅt—ï¹ò‘÷¼oq¸~öüó¯^{uÝtM7çøʍ7ú~èºVk[
+圸î. 목ëæá‡ßþØÇ;=;þ/ÿ»ÿö÷ÿÌ×àCÿÑßù÷¿çû¾÷þÒÏÖÎåX~ùŸ}òõWn…áú­›Û7NJHßð óËÏ>?ôۗž{á»?ñ‰«W¯þÎïüŽµÖãœ5ÕÊÜ{áÂ7}ðC
+ñ•›¯=þÔçn܈˶sJu¶úºw½7!>ùÌÓ]]G‚¦iLå2õûæ±üwέ>ôþ(¥üñw½ý* žw]HåÇÿçðýâÏéU‹¢^¼öÊ=ÝÿÀzsžÂÞäåœsÉ>„½­ !Œã8ŽãÊév»ëûÂ4 Ãv·E…óìSJژªm®\8ïªê•×^úátØ"[9J%¤˜J¶Ùp4Ð=nߐkE3ÅaRF¯ÚEÛ.ªº²ÙÇ0̛±ä„1]hË£¥±„•f+dJR‰€H
+j·«Ã£"”R  ˜Xˆ‹$³I¹ßžigÛÅâèÜÑÑáÑzyîêƒOÑ~~íÆE81¤’oÞ¸YÜ`AÍÃT×uœæWŸz®^/Cœ×M·²õåÅÁµÓ[Z› .P‘Rx»Ý¥T4B*̂ĐS)¥¼ôüKO?ûìoðÖññsÏ='ÄðŽw>²øv¹X®WK«µòó|zó8îÆ«<ô‘~ÝAÓþ{ûßR"W.\vÖ.—˺®µ6Z«¦iªº
+!Þºy³Ñö±oþÆ˽ŸyÛó_ý×R4ÇJ°f¬¬{àÂe·Ëw«`NñÚk¯ÍÃøMùèÕG}ⳟDZ†B”r.ªh…›ÍÙ /¼`Öݸ.Ýwߗ?ÇàN
+9 Q)D…8•s1Ìó<Žó<Ï)çqŽýàûÙ÷Ó´†BҐs 1ŽãÈÌm×vMsß=÷v‹…Ñú¥W^q'•C¬›ÆX3 îßqÎ {Ä^¡Ç7"t‹õásև|È2¢øƚºS®®–¬$ރÏD™™A$šŒ…}õ±Úç@µ¥TSc½h")9§B$Ä""À‚¹¢b₨4 ¦’ršæi»9{£m»ÃÕÁÁáÑѹ££Ãƒƒínwëôd˜ý'»©nÛ®=îÏ¢Åa@ã‰NŽ3SÛ4»²Ûmú76·Š…ûο­­»œ‹¦©,›•J>”œç~è§)å2õ£SFJ,M·HS
+!Žã¸ŸR*¹”” ¦¸ú¦ªœsËåòúõë¾µA"šæ*c;[Umc¨„m_bhëzÑAmœÐ̊ÎI]¥,èۏ-@©¥”VZïí 2bæ†T–êèâš1QÁ”SÉeÿäœC*6—”sN A@ˆÊ>¦Ç"‚˜¤dJq7œß8]œ¿ty}xxÏÑù£nyãÖ7óÉgnL±ˆ
+gߐA)Å̾ð4MÖZ¢¹âÔT®¶º2ŠSPh$—PŠµ¶®kT:&ãäX!†9”X4j¥´Æ"ý¶Ï¹ž;÷àƒºUsëôô¥ç_~û;®vm÷s?÷óϾøÂéØ÷›³aÿæüÀ¹váç ^:þ[>øá~žDä¥k¯\ö©º©‡q<\ÖΩÚõ9¾vzSiBa˒·Cœ£ r†át÷ùçžþà7}¤ŸÆ_|±ªêª®Ï5Ý{¯¼mÓïœ1WßõÈG¾ñËÃCDýÒõ×ë/߄އ«
+ñ~{&…C ý^Y;‡yò›Mï}Ã8ÎÓ8Ž9çív;Ž#ìŸ1Æq¯_¿NDUU3{cû”b…DSŠmëºj*wÔ­¹ÄPr.­ƒ +»lt¢™A3JÑ
+´V¦TN´VZ­µ1Zk¥Ð!(¥´ÖJ©}!†Çy€º®)»sçÏ75"ï :øn%
+1MÓ´_ÕïCŒY´² €V™T(yšç7nÞê–Ë˗ï¹péâÃ=|xîÜÍӓPò²jÀ(òiê{ç¬1V •ª’µ¼þúo¼ú†åG|Ìû‡6^¾|¹”rýúõ®[ø”±ÅwýØuÝÞË6V}ûwü¥¯ûƯ×Î\?=þ§¿øÏÞÿ®wÏ!>ðàƒ÷=üà¯üÖ¯ß|íÕ§ž|JP}Ë·~ë3Ï<3ŒãÇ>ö±÷}à“Àô~ú§?óÙÇcJÕ}÷ôÑ÷xïSH±”(”s%E‡31ÅZm¦‘ Î\>óÔ~Ûñ͗_~éÕë¯Ç’ØÏܬ–Õj Ö~ß_ù«û¶o7Z‡Rþ§ŸøñO}ö÷¿,œ¦‰™S¢˜bH)•4?NÓ®ïÇqÇi'fúišæÝØŸ—Rö F˜æ¹®ë”Ò8Ž{˜bJÎ¥”´ÖûõišêºZ¤VmsáÜ!pQ ~Pòª©N-+hŒ`IšX£å«
+y_*¨îNc8Ù¼ê¬M¡šFz÷{l+±wÒ™¥PùÂFgʹäcß÷ý®¿µócH1%F­´1Êè²R‰µuݲ{Ç;Y,—¦r>Å×®_æéôt3ûÔ¶-37MCDÞ{4°:X¤TÂäK,À€ öªhšæ‘GyßûÞÇÌO<ñÄË/<{õêÕgŸ}6Æh­}ûÓȋ×^×Õ«ßò‘æ2”Óqûò믝o*ԍ¶Ο?¼xá÷?÷Äk¯¼²lÚ˗¯„àoݺuõêÕår§éҥ˟øÄ'^»ñÆéæìÕ×^cïùÆoÆq¦ßüÌï>ñ̓fÑܺñƇ?ðÁÚUŸý½ÇEÔ#ï~×s/½ÌÀÎáÕû¼qýúÙé©kšÃ‹çÏ-V7^z…ˆºúv¬ëzÇÕzýÌË//þÓ_û"°v»ǔ}Œ>Ÿâ4MÃ8î†~†aœ*W]¾|B3MóÉÙÉgÿÌÓO?­µN)m6@¥´ÖûLŒýŠ:¦¤kçœÛW€µmÛ÷}NåÂÑÅE[/k %λSgteÕ²­ÛÚAXBe@eÀ6ƵbkÖš”ujÿ\¼ý¢[äý7ú¶¥tŠe˜oߧ'Ç?ú>g’½»4aÚë#b¦RˆIX
+û‹jWû•
+jŸLÆD€¨”á»*«”¢m[wçJÎ)MÞOó´íwǧ§›íf7g*D¨Ik´VÈ~ž‚Ÿâ4‘äÃo{ç£ëvIüY­õ}÷\yà¶ÛíµW^ñ¯Æ)%$æ¢ÓÎZ¢ßï¡Ý¼yóääd¯×«J·]ç½÷!Ló¼^¯A)ÕµÏ>÷ì Ï<cµjWmTäêzL“Óúðüù³ÓSp­‘BژåjÕ±TMKÄh”}6ìcðÑûãt#Šuî¬ß®Ž¬¶$p¸>êÓnµèÞùÐÛßÿèûžù¥'žnã{«UæÞû.7®ŠžxñY0fYwyöuÝ"h`Q
+aL0Á(BÆVǔpe‘&c\ðÀ!°ˆäÒ2Æ¥„ûG18g´1Fi¥”ÖJcP™¨²¨Ä¡ÔÕñ±æÄÄx’$+á`8èF…T€%` µªt֕yvùâ…l4šÝ·/®Õg§§‹¢èw»ép¨”ÚÜÜôú$
+Ýyìd¥ÙúÁ‹ÏäÃQ‹£söMM_\Y0EIbj²² £˜
+“Q‚cBüí‚@㜓Rú%xSí©"k(c‚Ѐ2„ ívõ`¹‰z(Bd©Ò9ËÄ0¢ s¡u3Œ1BØ9F©ßÀÁ¡xý§­
+qÁ1ÆÃáÐÙ#ŽS+‡´6Ji+Y`´2KÒ(vQTÍ+ùäXžæùÊÚÆêúæÖvßmю’4(Ïóþ(¹±²2>ޞÝ`ßԔTòҕ+›€1Å`¥¬×›wßvrj|"¥çΞÛX[¤¬UœÅÈ@ÄY-Ë0Ä(!È9)eˆl”
+e-çoVâ¤yžçy‘¤iVäIšfY6HFÃÑ0IÓÑh”ç¹Ö:I’Á`à±#_
+œMGC=FS!g¥”VËHð4I9
+ȝŽ†Œ1dÍ ÛqÕëõj½¢KF£ŸlXY‘’d˜Œ†i2LFƒÑ(Ͳa’¤I¤ÖYQ8ä8á^ŠÎ»
+sR!çZÕÚ©S'û۽ͭn¿Fá‰ûîÝ·o8.-/K«SU¾uª -v$I†Þ¶F£,Ï Y¦yšd;¬)¨(KPðû›½aÙ]7èœ ÃÐ9A¥R¯…ݍžÉ†ÍJÐ®Ä ³l”PÎaÀÄE¨Bˆ8K£]íT´;r×"»'üïu=ù“1r€•R¾VÀE῁Rš%i¯×«Õë„ÀØþK|yQ–åæææÙ³g«µxs]¿¶°oßÜì윒Ë\„¡”jyu•bR­Ö(çš8Ž £Š1RJkLEµZmb||©¾²º¾Ñë¤RÁÄ:k¬]¸~­,‹ƒ‡NO"ËC©Ô`4TZ—e©”ŠÂcìk(‹Â/ŒÁ`àóÔ$Iî¹ûîÏ|úS·ßþ6­¥ô駟þwÿîߟ¾ÿþÏ|êW>ÿùÏ?ùä“õjuvvö·~ë·þæoþF•å§?ýéÓ§OûGðòË/ÿþÿûǓ33¿ò«¿
+ÖÕ¢J£Vëw{©Ñ_ýêW·;Ýßùíߎ£(KRŒñF1üêŸý9ÕöŸýÆo´ÆZñø㹒„ÅŅ×ΝÿØ÷ÑÇ>úÑååå?ÿòŸŸ9wöãìxÄ{Ùõõõ?ý/ÿùåó¯NLM½%yOÓ,/¼£ò¬âþpP*Y;ñ‘(i­‚ck­–Ú»(¯ë;žÑl69çQQBòؚͅ V³Z**–ˆRǘlœ¶Èa„bÞ®º¹ƒÑx¼Ó²ÖA µÎË 9çb´§´æ½·ïÌʲ4ÆpÎcBð"/ŒÑ”Rkʽ¾¡^­ÅÝn×Çn\8‡BHáP\©
+Æ)〳ç™,2ã
+!AIGÈ9Áh†ÕJeaqy}cSj²Za¨”¼~õrž%·Ývg½Ö:2³}k´¦£’PĐô¾|ö…—ƒCyÙjµú裏¾ãí§¿üÕ¯\¾|ù§úƒþéŸùîßÿývg«V­<øÀéüþ÷ŒVï~×;§&'—ßóîw}ô#ù¾ðê™3¼óþЇÏ]¿òý§žúŸ~¡Q©~äg=0³ïñ¯üå•õÕs¯¾zôð‘ãǎýýßyùŗ8çe€¶ÖWÎ˜žh·Ûí>ò¿ûÎÖU`Í{ßó®±FM9§Ôé{ïý…Ç{öÙçžxâ‰|òé½ï|ç…Ë—ÞªÝM‹¢È²l8%YšæY’¦£$QZeE‘æY)wUD00ÁÁa)¥ŸøàcJyž{t2ŽcŸ"l÷{#‰ âÕ¥2”`*"Ë+@Àb§AÈ
+F°ÅVÛðvvÃrJ&¾aî÷ïsÎc9BJkg­Ú}ûÜjy÷5„·6Ƙ±ÆGY(oX¾CàE¶Š¢˜™™ñù™CŽx,µ
+£øȑc”-rŽA8̲¼‡³ss ’…Ö†RJ ‹ãj­V£xmks˜$c£ÁXpÖïu_yþ…ãGN=v̔2äÂ*¹Ôk<ùëñ·Ž Q…Ÿ£aŒ‡qßqÇÝ­­o~ó7nÜȲôÓŒµ~ðýï¿üÒK÷Ý{×ÖÖ>øS?õ쏟¹qýÚÏü1¥äW¾òå¥ÅÅ4Ïî½ûîÉ©É4Mo¤×:¢Š2¥g_9óò¥ JëÛNž€žþ™§¤µÆ`{}óøþƒƒþ`iqiöðÁ—_ziiii0èŸ:qrvzæÉxò¾{ïéw:'Ž?ØûÆã?ýôÓ333§Ž¯×j”ÒŸ
+³"Ïó¼ÌËd˜Ã</­qE^–y)ˆV&£$g8p”h
+
+‡©2Žñ°ÑÀJJ¥JÎc4Ã@0.è…ËW–ÖÖ­A4 µ¡4O¯\¾¤­9vüTµv‡Öv©Ó¢ÁXg4
+œµÆ¡ ”:甔aåiöŸ¿ôgþåÌïþÎï\½péÚõë—®7šæ õÜ />÷ ìコgŸ}öüÅK˜³'¾÷ä¡£G~ïwïþò_ÿÕ¥×(F›gŸ}îêå+ŒÀäÄ8— cJ(rî¡÷¾÷£iÀ/_½º¾¾îRZ½~፠ïø}_ÿö߶[c÷¿ýí?þÑ3ÃáЧ§ßûþ÷oûë¯}ⱏaø¹Ï}nkk ( bñVå:Ó$ FÃá(KÓÁp¨–Jù’ÕGw«˜¶sk@BXçXTêÁ–È2ÄdœÜZí4‚ A„ì]pÈù"ðæÁ½pvsšsÀçCžX’e™OãªÕj2¥iÒ¨7¼ì-c””þ
++•ŠÁ^òç¥=.ìCg’$£dT‰ãÑh4>ޞ˜h{˜ƒ‚€X FkB@©’|åê¥çž{îðþùWϞŸœ8|ô8••5]µ8ŠE5Ž"ƨ·zG@90¾ÙÝÖÎ
+ ÚY«e·»%µn6Æö˜?x`N9×ÙÞÖ ƒ àŒ”eYJGdIB†³ö̙3ÿößü›O|ì±Gzˆ ñÔ³Ï\½r•Á ?øñ³?þÐïþ.#øsÿå˪,ãV}m»ó•¿úK+õϼÿ‘#‡áϾôÔs/@·Óéoo÷kíh4rÖæyN)!&&ڙ,c½ññ( BQQJøÃ~øÑGï¾ýŽÉ‰‰}“S_ûê_ÆQèBollüɟüÉÖÖÖ'éo;uêñÇÿΓßMµ4Zÿ„ä=I³Ñh”eiQ–eQhc´5ތ|=¿‡)XcŠ¢ ”ªReQ‰ã0 ãjXäIÑïUmryŽÓ@„%@(ÂØ9ì[¿;CFö4'½áúÄÈ>`{ÀŒ1&„ð¹Ñp8œœœ¬T«Eš:çâ(΋!Ê9”繧."C»IL­^"°Öë¤I"K)ZÍÞhûèÔd£Ñ4|÷Ð!ŒEÆ9gýþK/½EA¯½öÚCÓSqQR.¯¬4ªÕj­æ8JET œ;tèhT©_¸tiayQM „(F£~ïüùWµQcã탳³`,ãüÐÑ#ýÁàÒÕËëkëÎÚfkl~ÿ~Œq–eN—`üú… ÿößþï/<óÜ/}ò—þég?{c}õêâb†Þ…ôºýÍÍJ­&µnOMNMO_¹|Y§ù±ãÇÿÇßüôÿûÓ'¾û$‚`†¡‡ñ8ù`(¥,
+ùÕ¯þåwžü{ˆRÊÍ­­#‡y2Ï /¼ðéÏ|æŸýÚo0Ɯ±W¯\¹çž{†0
+½ç´ì-êHÞ¦õneŽ1Ã!4”RzZEE¾í]E)%c<‚jµºof_E> 5Í0 0x¸ÕB’4Å;ë¬ucããƒsΫ•]5çÔYC)¾~ýêöööá#777§gfŽ=*„À0ÆkO0.&Â0Šƒ¨DÕ0ªNOO;rhßD›ƒÅβ X2ì-\¿6ì÷ZµÚ¡¹¹GßuÇíGªÕ*ˆ"#u»ÕºÿÞûÞ~ïýãͱf½þ ÿùN?¦é_í¯¿ø¥/ÍÏÏ¿ï}SBŠ<ïm÷úýÞõ7Ö×× @@èƒ÷Ýúžûdš÷»ßýãÿôŸ²ï~Ï»cmñhÙn£‚`L„‹‹‹—.]^\XØØÜôëÜ×I‹‹‹K7ÌÌÎÏÌ^zýÂúúz^äA¥Z}ä‘G>ö±Åqü /üÁüÁÕk×Þ÷ðÃSZ©7V–eišùñy–yõ<Ï}õça·‹æYcsÎX‚q­ZmÔêQ&›$ÏÇy#„µ!£17@q`rvLÊ7ÿÞH´ß;$»û}JäeÇιá`À9ã(Ë2C„/)¡µ@í‰öØØ£ÔƒòŒqB‰w¢ŒeYÊk)­ !1Æ!‡‚;°kk«çοZ«Wü­xÇ;lµZžû%„Ø7»¯ÞlaÊDsE ˜ÆÕZ­ÖŒâJ(¢}ÓÓ·8¾f&
+˜µÚÍ£ÃAïúÕ+ùh0^¯úýþàôÌÓ[Û[q5²Ö úƒ…ë7®\¾ÜítãŸøùO¼ï}—E‘§é…¢,i–YçF£Q–eI’ † 8æÁƒwÜslÿo~ýëßþö·Ïžus0 ”ùŒÅ_¶WoÑFSεVÞÇSƲÑHkí9>2t»Ý_|±WBÆ/_¸˜¥YžÆÙþpp÷ÝwÿÚ¯ý¥4I’­N§»½Mõ*o…eYyžE^¥’VÊCŽQy?á‘$„5Öû³3ÆÒ4M·»û[cUB@„aiµ2Ȳx7w~f8ðg·÷òVå;ŒØ ƒ1ñd˜½¦‡¢V«Y>%ã­±(Š†ƒ¡R2ŽãZ­^«Õ ”!çŒÆ„E Á„%µÑ†`W9¥$Ëó¨5›MOXÃÚZd0%œÒ¥âÜùsW¯^¾í¶S/¿üÒCï|ߝwÞ%æ„…bŒZ‹*•j‚'¤ÛݼtõÚüì¾F«%Ôæ¬G0£(8x”–eRt1`UËI–å*“§O?
+‡C')¥ ¡A §íf½‰Îújˆ6%Ô8l1ŒÎ4Ãغ½„éæAnviö?¸Ñû-ßøÛíî¯rAǔsÎ9ˆ‚0
+CŒ€Q¡¯þöܸ5®Uo8œ"„Ö–“óç®>ðàµz…à€P»ÕYþ‡ï~ç=ï~øöÛîæ"
+“áµk—Y(*µÆôD»74êµ¢(5„p‚±µÈ"”¤ép4²ÎY^«×Â(ocÆV¥\\XˆÃh~~¾Ùl@háFgs“267³o¬Ù £hu}-Ësk,¦D½¾¹á¬ã(G2+Ëë 7œsI‘úý½ùhmap n§ãœ ÂÐÏÖ[\\dœ,,• ‡ªÈ©8ça#Æ¡ðÕÕ­™>|tyyyc}ͽoß¾æÃ0Èó¼ÓëöFC„¡,K„6ȉ0¨V¢F­Jê4«
+Ν£`‹±%ÔŠ0~ *¼q’ÅŽŒé-©:Ú¥Ìã[fÍ{[ñ¿eŒ…aìšŸVê1Û,#„øñIADQT‰«Œ¥2ÆØæú@It×Ý·sN­A„¢K—^p'ŽŸTÊPʃ Ü!í"v„Âæ榵6KÓµµ‡zøè±ãJaƘwicÎ9£t»³ùÝï~§ÛÝ<tèÀ¹ógûýíÇȲ\\Z€z½n¬#˜"k¬Ra3!zý~2J1`Æ(!$/ò²(ÚãíƒTãJW†Ã¡*ËF£~èÀýs³adEfBxTªÕ¬ÌOÝ~ûô¾™~¯Õkõûî¹÷h·Ö·6G£¤R©œ8yâ®;ïäœoúÛýžEŽrAY…”Q)­)¥åLJɁ…qä*dY©V¥ÒžÌsò,&@œq–2F/eéâa@«Ök¿þØ'Þà±——:Ý-­Ê²(֖â8J³¬,
+ ¢0§<
+ZkÀöر£ss³/¾øbµZ?pਖØ!ä¯Á·öcÝNç©ïÿ·«—/ž<y|yé§À¼øÂsûff£(ˆã<¤˜ck±³8ËggfzýÑ(ɤÖÖYB vv4äÉpß䝷Ÿ8ùÌùsëë+E6Š?uòØÄÄę3g¶û=©‡ªÔq[䔔Ú%•/ž´Ö¾ˆ»²p½ÛïQÎJ)—–ª•êúÚZQ–Rëjµê5Ã@\‰ó¢ˆâØST€¶†NœC˜¼(Š²dœ‘(¹ËŒÀÄ9WJé{š!ã,`àœ ñ¢ßØD[Z…9¤iª¤”à ƒ8®‹
+XCÐé÷9 ˆq¢u±°F#Ä&  7Z•^{¾ÚqW·Hb|³íC›¯–ý¬s˜ǘRÊÃ)ó•¿RÊ7<2¢”´cËRyø-IÓR&ZÙ^o;IFss3”±j•eYfìV½^÷j`8§F㡇J’ŒQÎY¨åN)îÿ¢•••ïý·'_|þ™'Nlm¬¥Ùèرcׯ_ÍÓôÔ©“íñ BøhY‹ id6Æ:‹êǏɊâÚÂB©
+¬‰ÃIé§Z; À:d-´Ã#ö³Ówf¹»QøÝÙêàv:„;cэ1;ÌvÓ)B<Üï‘'ŸÖ8çœuFk­´sÎGÇ0³,óô
+Ÿœc)ÃHQH„0 „ ¡Îé,ϬƒJ¥@*Õ
+çÜh4€jµš%iQ–QaB¡J¥šçYY¨Rë 
+G܂$
+·mUÛ[ÝËK÷øٜs?ãJ…s!8wÛ] ¶Åã1Ãï<uÛäÄdÐßÞ\W²ôÁÔRbÀ9£µCˆX·orúm'N½¶puqqcƱgJ¶ÆƓ$µÆhc‘µ­Fóη½íâ•ËK뫾ÉF1Ás.´Ö¥”µ·i*Ë2ŽâãGOÔjÕ8Ž¥Tׯ_;{öl^J„ Æ~–
+¸(‹Â”9,õù6"`á&QÁÝba·Ê-Çšƒ·V‚o0£7ŽìñOÚˍ„aèi¢J)ç\-ˆBAÝiœsc,ޝíÝ^QªN§3 Z­6ñ”RF×66ʲtέ­­ù€ ˆ¼ÑʝsA ”Œ¢x~~¾ÛédY:¿ÿ@¯ß«µw¿ç½§n»=ÍKʘE9«µbŒíß¿!T©ÔŒ2¥Âi–u»ÝííN½Z9yüØ(KÖFçIrãê•Ûî¼ëøÜ|«:Üàp%®­7×7oìŒéðTf¥ÔÑ£GO>:ÕßX_ÿþÓ?Ô2?4à»ï/Šâå—^~핳gµÖZ’žos!„ön5g4Ïrì‚b0<|ààïüöoýÑ¿°²²â­OÕÓ41Z2ŠU)‘ss³ÓŸúÔ'¿ù­o­|㛜2ÊÙh8„(!J*Â(coIÞw–©R ì2ÆjÃ0IµF…B¨RÖ+Õz­:ô‰E•0b±nðçÀÛÖN#v?I‰!|‹ay—»ð­†å¬»kùUèWí^õw«ÁyÕóîÓ4B`LŒ5>ý÷`U¿ß[]]õ†%¥¤„æy¾µ²|ùê•V«577çõŒ1¾Ãè»=WÁ(ÅZ­Ö»Þõ®(àO<ñÄÜÜ\·Û)‹òÑþ̱ã'¥6"K©³ˆ‘’eQÚheÌV§síڕÁö6B&-òúXkÿìÌÆښ4š2á,²a%
+ëͱQoxñÕW;ýa§ßKŠd/ÑÜÉ;•VZaÀZë~¿ßëõH$Æyš¥iÚÛÞÞÜÜôgË\©¥¿ >§”ÚRɲ ŒRY¥§&¦}#د՝%Z–#«£„S
+Ύµš¡~§"Žã¼(œ¶žþV‹RJGÉè™ÿXk=J¯¾åon%Šf¦&9œmkt‘¦€a‚¤6Æ @Ú:Ë ØÜ»¶µWúÝ
+doC‡WŒã
+Î:gQb»ßO’Q«Õäœk­Ò4á<à"Ø©@€µ†bA %kµ³oàYZj‹0ÂþÚ)ÁÎÖÅ ¯]¿vuksSp…õn·såÒåæاÜY7&£A_k7>>GÑܾýëë[/_±Æ`ÂØh0ÜÚܜ™;8¿ŸÖâÅÕegœW+‹ÒiË0µÎi0ŽJ9„¬±ã@pJÈÔd»ÝžÖèÍÍõ²,uÖ:J(cœbR˜YÀË¢¸ôúë/½üÒCïyçâÂÂÕ+W<×HpþÈûßOéOÿtfjúSŸú•‡zèGO?…!Âä[_ý‹Jµúé_ûÌõ…ë_üâ«õ:ç¢tá7 §RJ!¸.KF ‚ `B˜çœÃP–e{[í¤MdÁ·)²˜`†ܬ r»=BB|n׏sÈYoÈZ„‘·0çސHì@Ö"laì,RÖ0
+Pj8‚’”±\J£”*ˆC[ Dð´¿æ IDATÊòâÙó¯J«Ód„•EÞjµ†ƒþË/¿ôŠ³£Œ`Çq„E^üð™g¾ö_¿Fûð£>zä0#$ä\–’p
+GËËˍññ²(ªÕj½ž­­¬:ʵ£´EB@ ­1Îƽá€2vpÿü‘C‡0ÆÏ?ÿü~ô#ßÐ *‘1¦Ÿç€\½Vkc‡[ŒQ«Q
+Y pÛm·—eÙïõg÷Í<x0MSBˆ¢þ¾Ñ°(¥A$ƒ~V”˜RŒU¦Ýž8tàÐx³q¶²p-ív¨3BØ!ì:övÖü„ãͶ…CœÛÁEÁC¨·¤VþÄX‹oæì7wÙc¼£áy2”ÒSJ `R(ä=­”µ~©…ÕªÊò¬(‹‹—//.¯X+…²@Y{jº^kDa ”PB5e,pgiêIϞƒw70îYó^‚„ÜZ»´´øõ¯?Þl<x`ksmey©Ùl>|xeeåƍûöí ÃðƍBˆ±±1_óSJ‘!AÈTW*•™™™åÕÕÁ`Àãŀ777××72g˲lT+e£&8oÔq
+.œµÖš0Š[ãcVsemuqi)͒íAŸ2ÊRmm‡Áh%n6ª!¦&&õºT
+0PJ‹,ç˜Ô+Õ©É)Np½R½ûλöïß¿°¸0?ü¡÷{ÛÿëÿùÎÿõÿò¯çææz.c¬W&Ûmk]œ‹£‡mÍJw3K~ÒX¹"/@$„l´‚7*ՙÉÉöØx™%Vi
+G‰Vöêå+ýno¬Ùrªì®¯… 3Á|*tÓª;ð>l—Íþ˺ùln>ßÕq€œÏè1Dêr;Ÿ¸ rbŒ½XƒÇu¼~Ä “@0ᜋ@XÊnc½»²¼Þï+ÕPÊ´(ˀq‡°”zqi™&”2*D€1„a(„hµÆؽmû{&µ§°p‹aYB€FÑ}÷ݳ´tcyeißôôö֖7¯V«µ¼¼Üjµ~øáƒ×ëõ~¿? ¼|&e!Ä9sªÕêìììòÊÊvš˜Bb‡2 ¼Q¯U«E‘W+xØïk¥¨W—#D+¹º²²¹µÉ¸ˆÃpnv¶Óë'IâKÂ,Ëc„àj7ëuU*«5ˆÂÐÇ)Ӕ:c àPFðÝwÝÙjµœ³ý^ÿëßøÆ¥K—{ì±0‡ª×ë~ Ǐ?öя58ŒÎ¾r&£~ðƒŒóþ7Ó«kKozþ$k!g)BBJiJi¥ZwÎ1ÆCYZfI#Ž9%Èh Ôbì ÀÎÿC?ÉctÓcíþƒv†€ý „áÖ÷x›th—•µ÷%€œïäøîÍÖÖÖææf?+”ÑcL å<Šã 0re¡”2EQ¶Ûc"dZ+„€ ±ov?c¼”
+tªß}ïk_=~2Ÿ­âÒݹs÷;ßùÎÙٙÖÚ:n¬ˆP1€³6iêêZIH7,†§‡'÷>$3
+¬›j=½ü胯e.泺©ƒ"Ë. Ëx~û®µ6ÏC]5•«¼”8îììóíF€ç|?ïé$eF!`nŒYÌ˲ö!H¢³£ã~ž}õìñÿ?ÿ»Öé;wHŠ'ϟMó/_>ü?¾:;:Šâ±!xdøë¿ÿŸ_=}º)«ª*Mcnœßúów“ Û“7 @&R9ëLðˆ˜·Ui½ÓZ“ I¬´ Þ *ä½ú^äé]Ï Îèĉâ
+ÐN±â)‰<ïnéîv»”„BB`Œ«ê¦¬() BLÆ£;wîܽ{7²>Œ1„8î{Öpµ)/^<Ët‘& 2ƒñx49š4Ö1¢gOÎ"K2­Uš&ñ¨íLêÊAgaà™£Ü¼s¡×¾ÿþGWW¶.¿õ­o}ôÑGÃᰭӑŠœsÀÌDÎ9•¦¤ÔÚù‘„ÄŸNŽs7¦‰01³¯6kÅAªd%•I‚EWm«Çϟ?{vñübFÈ£á@'R’ˆÖ{-Ež$"¢€LZ§yVx‚` ÌUÝ̗ËiY{R%³,˲T%j¶˜'B…jg¿|úxºX£aY×eYåyá}+fë/ž¼x~1ŸoÖ%eÖëé,…`ºq¿§¯g…Ƙª©PRäˆn6›~¿ppp0KBޚºÙV ‚øºªÈï»øuºßÄkÀÝסCS»ø,bWËåz:ŸyïIIçBQÿéƒ?ú³o'B1ðê÷ûyži)½Cï0ÍsÇÁ«$aæ^¯‡DuÓÈDÇò‹Ú±¾ªªZ­V/^¼˜L&´”Û7/Ø{I‘ÔÖµnÇžžžþàÿeØËNOO1‹Å"jïØQPkµ.//§ÓËÓ“B
+qrrrzzòðÑ£ˆç!bY–ëõúp4ÖZk„Mc®®®æ‹…±Ülø捳Û7o¨D†à˜G ÄYDyžçY_s|8ëõz:¡„÷aµZ‹üèð Y¾|ñl¾^>}ñbUm
+!„çù»w•À²®Mc„P.0{Ç( ÆìñúüóÏg³«¯øáx0”BJ!-Ñh4ºuûöWÇ¿kvÓ«éÑá$I7u$"‘: Î5Ö¸àن¼HT’$iª“$±¶$Ė=B,†FU°º®“aî¼3ƗˆBÈóósáÙô
+´äT-êreëUµ=>>î
+OON‹¢X­V•õÞÏfÓ(š%¥ŒNa“êTé„=ÇF!j‘«èn£ü3a,TÄ~n­u¯ß¯ëÚ5Gãq–èÒÚÍvë9yÞ+
+‡Ãxu³{ûb㼑‹ j­a·­ãïú(­ÀŒ™H¶Ÿ~ú駟~ºÝn[çŠÛ_ É[…03‚^¯;!„¨ÊjµZ‡ˆ-ÏGI•å¨śí6Š1xgLt$Ñ}î4Ì!úª=Ÿ
+Ƙ¦nØ9 \WՋç/`·nßÎýéjá­»œ^±q>õûu!Ñ ØÆÄÞ|!"/ášË‘eY«DZÇc£"
+µ›ÊlVh+©o‚G)3¾µ,øŠä·g6Й0¶±¥,Gÿ÷#†Ø€È ‘=âr»Ý4.Šív{÷üæûÑ_¾óÎíõjÌi‘%i"¥ŒpÌ%‡“$qÎ``bðƲs©L8ØÁ`PEt3DT7õrµÇñ迸¸ˆ°Et“boœXgî=qÇx~=¨ Ñï½ÏÒ ®®.þ¯?ý_?ûé³gÏÎÏÏÿòÏðõ¯]km=7$Œñ…ðBh”7NϾø⋦i„L¸5õ²ÚžpÀÀèC¯(jc2…ÀÌB$ ÖBpA2£sž¬³ ^%$ Ðyo90¡H”³Œ!8Ó8ÓXd\Ti‡LL«åŠëU¹Ùø²B;JZ•×€b% °õÞY‡ ®1J)ã\míIfÏשÉiš’$ãBòÎYc¥yš’II@*ïØCWï㷁 oý
+¿fU­ îútÚEzÅÒzU?Á£¤( î¼wUuxtôÃÿú_oœyë€9˳xî¼qà‘āØGtcÄÕ+zãñ¸1&B÷SA¤µöÎ/‹“““Åb‘eÙ.öUØÏLcœ´oXÑMî¿øèf¤”UY~ùèу>ýôÓËÏÇÃýÅ?øàƒ<ÏgÓ«²,=‹Ë«i¿ß?>>fĺi<30ƒ^¯·X,â
+–«UUÖ €Ù9ë9x瀄@òƙº­¥ RB 3Æ£3á­õΣ ­µ"º g€YU]͖sË¡4ÍÅŅ'PZåyî¼o¬‰“
+æ‹ùzµ‰Ób¢’s ѺøšÇ’ŠA¢$ĺtι<Ëó<G×HE"P,^ûµÿÈõBŠðÊavñ
+ì…\¯Ì‹9Äié»F€oûÛßýîwÑz½ÖZG èêÄ~7 £õùCà]¯%'JMŽ&Ãáp[–JëD)ǐ$É­[·œ51‘ŽÑn÷ÂZm€ˆ1±êx­]ØN»¦mÞUŸ¼÷=úôÓO˲ì÷ûïÝùÓóӓ££‰RÉz½Ùn·!ø2ê™o·[ï}Y–eYj%´ÖÃÁ`¹\:ïBXÍëå2ë÷”¦i‚ó‰Þ;/ ÄQ¸X* u]3s¿ßÏ"Làƒ±ÞsPDÎXkŒJ’¦ª”R’Te³6xÏ>Ô¾ª›Ú#˜¦nš&ë½¢UûýÚ×U|@€8e-²bá(v^Ä1joV–„ŒÒû „R4MÓÔ5°;ړìĺfUÐÆæ×2ˆýh&.’˜WÒí~øá·¿ýí¨Ôílÿ·âZvC ¼w»û´§Õ`0˜L&Zk"Zë˜H
+©µFàõzñåˆÙ@wv¥;õâçíMcÞ0¬.‡üq\EÈÈÁ9ï#=L43;Ï*ÑP×u üs¦.™9¥ñÎEð¹©êÍj¥´FöA
+‘¤ÚZÛ4•e‰À;cLp-&w29JoÜDĪ®MÝb@pÎXdˆ£b©”@[WÞÚ¦®Áï=
+»Ú5§ÇG¬¼­
+tç·»1ÜËó"%FÄ󸵬6à/w‡‘õ†ÁêTß}÷Öd2
+™y»ÝFì’1Íf½vBÖö.¸¶|O¢^Á®ÀŠˆDM òâk‹&ßQ·6{Ùtƒ ]”-f„,K•RÑÖ)ò
+½·Îzfä}‚P*ÚA8Á^SM–iªjï$
+Àìêª\¯µ \nÖ±;숨Èò4ÕÌ!¾6±'nà ±|×#bîÑJ"èǀǣp6›Eƒˆ‘ß?ˆ»5F$ï_cq”u¯*ŒËå2Þ?®ML"HFDŽ º`}ð!x!´1I´ŠÀ2D6|è¢i$ÑåL1Gf @¥{šÀ†LðÌ!t4'I`gÙ‹Á9R² D€’P’u–˜ƒ ò¾µJX 2®×ÛB$R(‰@€“$8•@lÒ–°'®»¬˜ÚQ‡2Ī0bK!m=0 T‚B $§d"…ÐZÇȺªê.ˆ€.¹efç< Yã¶Û²ª`R2k7ë±?”À³£ã$MƒEQ ‡Ãè"“•vÞ(Æ
+B­UG
+Àˆ´Îº°MvßbDˆ­Ðoœ'í ‚ ÁyD°{ßiµ<1HoÕ}™¼$%APpÖ9v¶aöÁû$IH\«®W%@­©+[¥Jso="N”`ŽŒ<Ž´vcî"Ö·^ûF°;1aKµ ~vö×þWU6Mð`<Ž¥È8ØKA­# q(3"9K!ðfcÊ­sbd[zcúy¶çŒ!yš•äy^–åÓ««ƒñÁÉñI¯×»l6›M§Ó4MgÓ˦i†Ãáx<®ª*΀˜ÍfϞ=»¸¸€ù|þøñãív3ÄXGÚ>ð+•€Îl)†\ØV¯ vþ©#3µŽ‡[NUçð8x@’\)4e£
+î@¿«/ŇûÊ®÷–[v×r(Bà RÆÖ/ã9
+ÌaçÀ
+=°pŽ«ÚéܽÅce遭+ÓÔÆX[7~蚦©·¥NJ‰Ÿ‘Ö+$Þw©8D’Õ[c,"ü¶ê~ÀöŠ<íVŽ(yDz„€ xâ ¥,ªÒ/æeÝ8BªÊ­‘±i›¦ … º2Æúùr¹\oUðP×õfµ°MI2U%«í:-r@2Æ̧³Ç_~y<Y†Ãêً“ÉÄ{ÿþýÓÓÓÉdrqqÙ4õh4Ún·?ÿùÏ£@RQËåòêê*_,B´*Þûñxüãÿøæ͛e¹Yo–Î9æ$IÔ@ìõúÌüøñãétöòåˋ‹ $!`YVŸ ¢¯D§(vS¥”J‚ÒIÑëYï·UÙëõ>þîÇ·o¼³¯Ž ;ZH·Ï»Ø—wÝÀ¯fÏþº/ù`«ª¬ªJ
+sH´žOySVÖº€äB¨ÊU
+ëà}ªÕj¹xçæ-[׶1:ë'Ig¤}Pó IDAT“€à‚{ùò¹ÖÉG}´Ù¬ÏÏÏÇ㑱4™6M3›M#íäìì,V~ò<¿¸¸(Ër2™D^$½üO¿÷'~øÁ|1kLåBE1 tªs³Ù¬èå³Ù|r4Q¿Q›Í˜„1ö€È’ˆU#Ú €1³dLŁ‰Dë$ÕãñøÃ?üÑ_üx0H!iGD¢6nEnÝPÏvϹEÒbô±ïÍ1@X.æ³ù÷{ƒýx£;—cÿLc­‚¤ð¬s Õj½ž?zð¦aiv¡*ÁY+<IÈD2Hó&/¤ÒÌÑ¡°(< ÙC§k°ûè¼{e,]Ê·ËØß&Þ8=¡M0#î¿Z­V‹EªõíwnþèÇßÏ´&âÉáam,Çãù|~yy‰ˆumàñ“'«õÚ±Ÿ¯–OÖª©kL"ziŠÎÖÞÛ€HÈ$ËOoÝ}õàž¤ðâù—ïÜ:…ДÛû¡RˆˆËÕÌ{r:™Ïç—/^ó~«°ÈBè÷ûBc} AeµÚ”ÓÅúEí™ê,Éb$·Ø.Ö/×e¹>½÷èѓwn¿û­¿û«_~öòéó]úF°½uþfw”)¬We<"gÍì¯ÿúï8Óþƒÿ’ë”+ `Ï!ƵƘ®l
+Áê´xï½÷>üê“O~zqq¹Ùl¨…îà•¹ì¼Tlèè(]ÆÀ;ŠlÔS$,<üÕ¯?¾÷ÇßÍó¼óX¿û|öãƒI–æeS7¶&ÈcûÝou~ñ>uSǍ÷šaÍ×KÊU’¥BUUH‚³ !PHB ÀŽƒ‡ø•aÁ®¦œ8Ê«™mT€-Š¸+3Å/wð 2‹hjB4¶Õ¶iª§OŸžŸœ zE¹)+k»6.9\\\Ü¿÷EÝԉ£A¿®¶y’ {=…D€¶m1PιífíœK¤X.æ:QiªY¥„ÀÞo7kï|š¦åfcëj³]Õuµ\®Á;¿^/Ê
+ò¼0¦vÎ:gŒ©×›UU™à="*™L&Ç7Îo‘¤ÕfÕÔÍv½ŽÂ‚Þ‡¢èFýùl©“´©~ùðށ‚ùu–N|2€pxrtttôèáCϞ™Ûj${„BãÁÁØ:3Ÿ-˜¡Z¯ÞûâäÆéÍããmUé,c±Ç=¼n¸WÀU6À¨|Fq“(©—ú`7$€:e¼·Vð¡ns]ƒ´d×ËzR·.x¯3¥E)—Ö;LH @öˆ,(0ÆIô…êD¨×·x2²BB`ÂNõ€ bµ0D,M‡¶M
+øÊUiš\\\<{úlôÁ‡‰H¶uBˆû8deY~ùè¾i¶x¯ ÆE~ûöí›G§
+…ªf€™ÖyžVeÖ4ÍhÐïùp8BɑÈÂj1÷E‘H¡
+¥SÌòžµ1FH,úí¸ò,×E/ôƒa¯¬¶ue@ràAo˜Èl:»¨Í‘”Jtšã¼÷½bH(­sÞ7‰‰àLˆ¥½7V E"oÿÁݓóÓ¯^>í \͖±C>@à¸Þ`üßxWeêù£—Oï=©·U9ŸÚ±&á)‘,fü-ñ´ð4Ân[ŒD HADXH“µMc7B°‹„‘~ø&„ADJJk®Öz½ž®Ç"yïëªÊ… )ŽÀ£6˜ÇáwaÓ[ßÃk à~ºÿOA½­qO2i%Ó4ÑÛíöòêŠ?€¼×ۘŠˆò<oš&Ò>§Óév»å=Núd2ù裏ÎÏÏcÎô´ÖY–Ÿ{ï‡Ãa4Šxpôz=DLÓÔ{oMÙ+úyž÷{cLYUiš@Ó4Ö¸ºn8@“›A¿¶†7›•÷!:§ˆ—E€Rª,-U×µq!XKDÖØBš¦Óæëë˜F£áååe–e“ãÓ¯¬_,¶ž= î÷‹ÁAÿäôèäôd0|íö¿}þÿþßÿ÷þüƍç7âëÌ<í1÷¯_ûQ
+ò ¯uŒDRk¡”ÎÒ|>Ÿs@¥ÒD¥B"E$»ÐG)Õëõ†Ã!
+v¾ººš"R‘÷­µÆØ8d/MõF
+ï}”ò²Ö^W ÞEaŒùÅ/~‘&z4Ý·Vjé­ïõzï}íÝ»ð
+ƒC‹ù|µZE¿¼¸œÏçIQôÅÁѨ7ìÉDnʕ]ÚñxœeéùûgßûÞ÷~}ïӃÃC­“È¡…À]iä-^ñµzõÝëṐq{k­V'mÿ–û˜ª~‹Td¯×WJŔØ{¼g¥”R*ÐǸ»µ—Ý!¸{it½¬ €Ñ?¦8÷±•R&"ˆŒ7)âp$)!2AHJ%ý¼·)·,D@x~ùòèÆéÑpÄ!ÄCg:>þ<„%\ò</Š¢(Š““ØSv4ÆD½
+)b¤i@„¦0v,Å7ÑÍÂB(©Ø9À"¬«˜‘&$¢މÎÚ(ý°X,['I²Z­­1ãC!¤gŠPèŠ0Ïsh“phêë֕fÙz³€?þøþoî]¾¼LS
+ûãþÁÑáp<̊t¶ºš¯æ½¢Ð;<¸}ðWõWßýÓo§µÙl³dˆˆÖ[ ,®‹ÿvÛzk¤Á¦•72Rñ®_2¶&úk¢ ·nݚW«e]‘”R¶TC!„PJ#I!‘‰BkP]Qsÿ£ˆÂÚo¾jÆMÛ©_݁ñˆ‚â(0„(ÅF”ÉÁ6ΪD-×믞<f92{ï///ïÝ»‰.wïÞí&eFºUÜ¢•Êoˆ’Åvœ>ï]ŒCŒ1°C’¼ ¥‚ƒoùBž#Ñ»à£X±$ASzæ][‡ÖZ&¦Ùáá$Ž@W*±>€àÍvñôÙÓ(?,¥Äæ-ëÙ|~|vZUeL{Q`¢“^¿7>ݼ}+ë§óù,QêÞ÷¸äÿü™Ü§÷µÝšoþ‘Šú¹R„#òw:­îöÁØÖÈâKuŽ#o‹‚–B^?´äv»f𠜤ZqÒl›ª±ŠTåüŠ›ƒŒÐ1¡P"5 ¸3Ž}ӊRîÝ{h?!äÀm]ˆARdÌ·Ýp„RäXI¡„ˆ
+“Gb%“^Ú/N‹”ò^‘-gëËÙź\s€zm./ž¾8>ô%¦B(ë\(q¯ÿeßz~¯©Å‘¦J
+†­Q`nšz7ÊÀÇÁ{ 5Ê¢(BqXµ”IUUUՌLJ<¸wïJ¤Î´w¾iç!3…¶Ì±«I€ÎÒÁ¤wûöí[·nŽÇ1Sùèÿðød2ßÿƒ÷¥ÔθAt~vûjquyyqqñìdrB°†~GßYÕïv`Ý{ïãHÇ=<2R0Ó$iú¦aA" Xßx‘$$$cEOŒÆ‡[ç¥RJ
+_Ռ,[¨öõׄ-Ü°³'l͔¨¢ˆØóÚIŒHR Ü±CD"S©¹Ü¬«ífS–B''7o£Qã‹ç//ž?zxx0V«Í`p0•e¼­kCBfE‘å}AÒïÍgYš¦i›H_÷Xaù*þØ{Ö¸«ij­csf¼[ìÒéªéÝåCˆ’Q«Õj<GPJ靑Bõ{ƒ'Ÿþò¿
+҉êÛ7ïTåçOž>šJ•z ‘7~ݤÞøø;Œ¯{Û»i¯L ®ê,Ëß4,ìkJí:¸”R¦jÖëµj¹©h[êB«H¡Œ§~Ô mƒvD±¿í B’‚ÚÚ#±@"D‰ª;‘2!’D((Q¼_¯W³éåf³rÞ{ÂM]Ý¾„Øn—Ãá`8gYV×f¹X#$išIæFÊ$ª´;¼€^1Ùy)×\Œéùu.¶Z-*þdôRñiF傪ª¢æ‡sQ
+@ !цpuuõ³Ÿýìôôô[ßú–”2Ëòí¦ÜnË{÷îÿÃ?üÏ/^23 H‹ìÎѝ¯ôõ<ϧÓé?ÿó?+™–ei¬enõÃÒ4†iš‘R`QJòŽ¥LbåLˆäð`2?šn·Ëårz0:"p oiR~êð÷U¬;Ï´OˁJ €¨ÕóšaQOK¥Biœ³ˆ”§™©Ýf³‘EŸ‘Œk|P
+/j‘'*¯êz]¯,yÔÒÏ Þùz³F¢~Þ;:™¬7U`(Mpf³±Í•Öio8TiF Øc°>˜óòž5uÝ4¤" ±±§ÓVèfÇí?bÂ×ÎÇ´Zg€!8oªj«A‘9… VœÞÿý[·ni­•RÀø䫧ŸþòWóٌ•”Þ{AiðÕã  ¬qôÎÝ;ÿ‡úgŸH©ž<y‚ ]`ë•Lc(ՅçPÕõb±l6u®ò~ÚcÌ%JoÓÃÞ¹ñÅŋT?»yC Ë ]™XûðZµ8¾ÓèÔ»”^2a\úÐÌæ——‰N‡ý‘T*QI¢u¦õÁøàMÒA¤R;Û$L(X»Y®›m•)=й P5v˜¦€€ZäH(L0'ä8ÊKÄÎ!8/””J¢ dïÆZbIJ ÷Ö90ˆèQpž€¶›í—ɼwçÝ?HtV7~[5Ö9$®Mm¬Í§Þ³:Ï{q9›)­µN]Qò‰¢Ô¥@Š¸¿N°nŸ&bt$Þ{ç\´˜<×uõôéÓØTÈišn·ï=ýŠqÁŸÅšRUU¿ùõÿþo¿¸ÿ~ð!øÐ5=gEá|˜Í‡“ãO>ù×Õ¦ú³ï|K'ɳ§OÜ¿Œãñôê*Ü ˆâ½»ï&GI¬„<<œ¨1õò{ïv…W™¢€DWýíl:-ËMU¯SÝG”bŽûÄ ùGyrû.ª{,¼w•åöùó§/_¾œLŽ&GyÞC¤PÇF£× k»XJš1T•0žkÛ`\½®2LPˆùv=,T&%¡#Dì‰bO"´ìŒ$ˆ‘&€’ŠIyð!
+­}GõÆÓ´Ö$Jᮼ^Z¿sîôôt:>~üD‰ý±ä‹¢ðRê4]­VDâêòêŸþéŸþíçÿ^×u—9J)µVU¹Mól¹œo7«“³Ó_üÛ¿¦àß}÷7/^¾¬·år¹,úE"51ŽRÎ§ó£Éñ³óLêN6"bÞ"IDy^L&“ÆTe¹•"ˆ9@
+ì "Q
+q6½œM§EÖÓy1‚ÇmYrÞ«Ëf1Ÿ%JND’DÜ¥¬ªõf¶-ËñÁ±í¶ëR›.UÞߎñiò[$kCÔ
+ã@÷”Ä·„óû}AûdA¶/;Ï{‰¾ ŒZ§DÂ;&"oÑâéW%{ï°+›8MS¥´i¬³~|p°ñMÍ!´l$µ*!’Qpû9
+@ë€ ì¬dD‰
+MÝo[¸¿GL!º–Xp”RÎÓº®G£ÑÁÁÁÓ§O«ª:<œlVkˆ‚q˜êÕÕL%iUU10 Ÿ~úë«Ë+nÇеJeÞûÈ騷›þh$õà‹{ï½ûîÇßýî¯~õ«?þøßøÆÃ{÷‹EU–?ýÉOïÞz÷ý»ïY¯ÈŠD&̾kƒæœ‹ˆÎyD,ò<I’Ùìªß_y!郏ñ%FHýÚQعÞÎ1óŽMÙ9ï]ÆÎyk}ðQ!†Bpo)!ý¶VRJï½ڑ7. õI'é[·–¹¤r…$‰‚§8Í«=
+®c »ó´=^÷žÆ«~*@%"6uÎ+%cYNì†k¼fX©”€¤uºÙn„R!PU•¨UO¥y–ŸÝ¸Ùï%³¯²ŽbÕÆX»ÞÕØÝùð„€*IP R¬& ¥U ùFæ
+… 'Ož|ýë_ÿå/¹^­ÿøÛ¼Ýnÿæoÿ&fÖØÕb¹]—ä… ‘´§V¾&¢Ì(¥’RXç‚E‘F£¯¾z,„èõ
+Â(¬J°#‚¾qÅ2”ߍPÐZÓN¡dC†àE¼ÏN—Ú‘hG½i¬ÅÁ¡Ê8kÝÿÏ؛5Iš×bîáñ­¹UUVU¯Óݳ÷`°ò‚Øš—0#ïå¥ìJfzÓ/қL¿B÷‰&M&Ҍ¤¡ b#H3ƒž­÷Ú+³rÏo‹Åõ™ÙÕË@ȗήÊÊíóˆp?~üÓ4µ"²e™& 8¨J3›MSMGê\Äi’K']¡$j”Âc$c…Jy¯5€BÐÀš½VÌYƒ7]©$‰)
+$jҊ”bÔ¨b]4ÕÅdì<
+'±$µ·»ÛÎÚy’½qýÆN?kw⬤ 4>蘡Œ´Ž’4k·;;Y¾•·{i֊ãT)-•"ÁŒì7üBÀ!è)8O²'DdOBcÚ¾\.<x°³³³e/˲€/´Z­ÙlÆ̳éÜZc­Cä÷ßïììl4i¥˜]]•$€m¼óBÈu]°Ò{"ŠStÆ ¦Ùdæcyûí7¯ß¸>™NËÅroïãßüV(©çcw¯[ˆBgZ
+AMQ(ÁˆEY•e§iÞjÅY§±’Qdy¾³ÓßÙÞÉ;E€Ä ˆ(µŽâ˜??ÀĊ|h¨b—¾x ×¢.›Q>^³þ™™Ë² bÝççg'''­V+ f-—ËÉx2 š¦F„$ïÝûQžç?AŠË«ì'@äx)©y^s­ûE¡ê†y½¼qýúµ+ךªœŸ{猵Ãá nš­í­k7®9v,ØÔ&¢8Š"‚mˆ—áù7<OD,ÊéááµÛ=)u0Ñ "€qÞpâ‡äD¬§6©ÛK›Ðº¬yᇈâÑÓ§ÃWKj­ó¼–ŒÖZoooK)›Ê„‹b<çY^–Å¢6uª„"Lk1úœ@*°@D‚Ù*%„@Ff`@Rº1 9ύ© kçY«éx¼œ5¶‰’„ˆúý}%µÒ:Šc’RhM¤™Ù1[kéE{ßðïånæ*©ZC/Ÿa`ß³qÛ"†Áù(Šž<yÂ0‚¨,Ë@auÞi­›¦fï}Y–×®]ë÷ûG‡'!ßßÀô—£êrx…Ã1ԛj.¾ü싷oÝyëÍ7›²Z.—ùWÿy¶œœž\¿vm1Ÿÿýßÿnݹùf÷k½V«.õªõôâ¼rˆ’+û×>½ÿðàøêþqÔò`šº(Ë*|Ò\©ðn/§›—Ãèµož_°Aç<¿Bˆ•Zë¦1eU„¿ét:wïލ¢¨XÌа/' uÔꖍ]«cM€Â³ ðƒÁ !œ2¡ÃC„ž¤´:‚W<eF®MÝX' J±,KcŠã¸•ÇIJR5‹¦öžÓ4ËÚ­ÁùHî'üÛ;„ðõÁ iøúÎó¥v\ØÄSøÕ%acŽ¢È{? æóy¿ß9ݸq£Óé4¦
+’ -Œ3eUFIšµZ(PH%µÞÉúµm¦Ó¹Ž"kmY•qœÌfÓ,oÅR!" B©ü+ÌÕW>üóóoÇðZC¬ØC¶1 6³Ú!òâ8€ù‚˲ â“ÉäììŒH²ó¡Ü‹¢¨ªêápøλïüö·=~ü8ÔVAQü’©Åk¢Ê¯E¿š¦Q€çǧ?ùçŸt{½üð‡ó²˜/—Wö÷Ó4œΆç{»»»»»ôŒ+¬‚íà«×Hè[·Þi·ZA~â8Ö*‚6Õæ¯6ߛxΈ|
+Ò¥Gnv,¿úz9°Â²ËÑÑh­Ó8®›
+#5˜Œ"¥¯î좊/“^¤z ‡„Ö;„•@àCT NtLöd Œdh¼w!ª’<„¢,1É2éÆZ©¤T
+M$0’’V‡ @I¤”")IøðfIRI2c÷>ÒQœ&Ö¹ù|Á€­N‡¤ÒQ§)
+¡”TJi-·[!ÈZ×ÞÚ)ª&J’«W¯7Æ5uëtx~ñåƒÛÛ;KÓévË¢
+„ûÒ#¥ ¾FÔQá݈°+rÇíVËTMSUeYnïïöw:fx|aÝV»M€‰ç…gƍA¬TˆÅjv"0ä=" ¥¤RÖ»Ê4Rë4ː(H
+Hdœ›Lfq’Ø¢˜†ú+Š" êt:Q ”qœÑ|¶Ÿõ¶['§Ï–‹Åo¼q>8MΈèË/ëÉdzûÎíùÜ<<9å¼ÕuÖÞýà.IŽbr\×M´µÝï÷§ÎƒÒqšµ¤Òa º,ËóósfnµZMÓ”›
+.\ŒÍze檪ÏNÏî~p÷÷ŸÜuÒjµF£QÇA¿$8¾„­…Ú6eA¸NA†yooo2N¦ShšæÙ³g¿úÕ¯®\ݾ~ý&3?xðeY.Ð+ԆU±2žxM'ƒœÉK¨Ç+IÒ^›8B„RFk-„r΅N× %IJ’yžWM-˜„$@l¬)‹"Š’kW¯îïí!Ãxx1ê²Üí_Wó£áY73I¤5{bdÈ^¬b ‰ƒw¢`(ˆ¤TŠêÆxæ(Ž¤RÆ;DÁ€JÅÖ»‹Ñ°¬ë7ºÝÁàâìtÐëmµZí^o ‘”R’¤÷ µ"’]½ºEÑx<ÎóÔØæ“O>RJcŸ<%"fÇì:Ý6
+žyùöÚÀzé”|)È.׆dlø4­ˆ˜¦óÙüåÀJ³”Áz˜Í2ªª’$‹ãX)©¢(ªëÚŸ&(8‰Æ^<Û»Ûä­˜mp‡†ÕF!ž‚éÊ
+¢ˆ³IXö(€ÆƘñlÊq’Eqõêõ³ÓsDlšˆ•ÒeY,E’äR*I:ɶà ,ø*Ún'×k­Vª1Ƴ,
+ÀXÓÔUc ‘dö‚ˆ=›¦fï€^– ‘YžÂ XÍç¡öÖ)A$u{«MDóù¼µ·7™L–Å’ÑÖÃó¬Ìúýþ¬¿›àUÍ{1ÄX_“O¬W£XJ@d!; (4€%•T
+χO>iå©^Á ¾ª*ôk3öð¡ÄZþ«ÚÌ/=k 6SUËÆTZÇY¡`çŒ@’l ˜W÷VžIÏhš†½WR¦IR23Ãv¿ÿÞ{ï%IR–%"~öÙg?ªª*Š¢ù|6ÃÅbñû£©¸±ÝdìDô¾ŽbM©†Ð‘`$A(X IH„bÕáwkòÉdz¢gƒQ¿ßÏóüÁ—‚Ÿ@˜33ÆÌçsiçÜh4*Šei›ºÉ³ö•+W­ud­ýÕ/1L¬µíNg±X|ï{ßët»Œ&H`8~òÉ'[öÅÅðg?û—ÿú_·³¬}y móÕommÝ»wo:~üÑGÃÁè­·ÞLÇãÉ
+EŒãxgg§×ëåyž¦ét:ýéOúçþçwîÜyðàz/¥tÞj­ú»;çççh!L;^.þy=P~¸IÌ«eQGÑñёwV*ñáw;½®Dyy»úª]góۗp9¿*(/…,„ão>ŸWUE:Žb)•sA”$„óž_•leYš$iKP‘Œu”D±>jÐU_K¬4þ˲‡Î¹V«õtQ|z>^p$TŒˆ,$Æ
+D2ôº®“$¹wïޕ+Wž={öÑG-—…”j±\ºµ_WÈG‰¥”³Ùììììììloo/p†Ó4vÎJ)nÝz£ßßöޅÑÊË\Íp1xöB-i]µ,烣££g‡Ór¡’À%üJùڗëuÈü xí“lž<‹EQÎ{)•R{®dÂå¥?I]b¥I¦Q\é̔¤ZÚé|þ›ßü&„W8¤T¼aºRvóöÁà4.£ýíLÑԊ½—N‰” aA0
+B°1¤P²1søì÷þìÏþõWÿöÙgŸ[ë"Òº“}¢Üßßû«¿ú«,Ë>ûì³û÷ïÿèG?zÿý÷ÏÎO÷¯ì;g¼÷7n\cupð”P¬‡2üæBPû…¨&@SÖK1·Ö4®Ù¹ÒßÞÚMQÁ¥ó—uFüå`
+·?œfʨs«F{{£(bFc]h©xÌV)ùªvƒH’$Ž¢8Žó,Ëó<I’HG±Öq‡­bCÙafæ xÊDΣñx,³í…Ì~{<üh8žÕ…fhJ_-]]²³ À‚#2 DÁÅt“$I²µµ<m•ÒívK)ÅuUœœx者 Ëz_IBŠP(©´ÔR{'عD«÷Þ~{:{k‘9]·Ý¹uóùlº·×ÿñÿãÑñáÇd­‘’<¯Ì™$ŒÖuÝjµÞÿý÷Þ{¯Óé ¢Rz³g„¯(Š¢n·{íÚµo~ó›wîÜ©ªj0|ÿûßëí·²<MÒ¸(—$Å·¿ó­7¯Gq¤µÞWx=‘¶A%V¨&ËÞ;kåòøôä|<b~úká«Ë»Î姅y›=éeX3a¤¬ßïommEQ̘‘HPXø:-]‘¥i;oµò<MÓ,M[yž& 9g‰(MÓ@ª Š±º
+ïÀ,—˃ãsˆ[&ï~1š|1V
+,yôÆ5U]MS¯òD!<{&2ˆ‚-­lÐ]·ÛmµZyž÷ûý4M˲ªëºÓi‡þ4Í‹óóó8NP`pÜßß÷k ¼sÁ«]
+¡ˆœ1ðî;ïÔeÉÞ# ”Ò+‰Ò$¹}ë¶Öúððàk_û`k«û/?ûé“'‚ÚEþ¼zJÓt¹\âÊA(%é¾Pç\UUÌ<™Lþîïþîÿñ1J©?þøË/¿¼zõê›o¾ùÖ[o„}ÿúõëaѾX/]éÖR[W%0’ãñøôüÜ]¢©ü3ñrw9€þp!ì¦B¥$‘§–µ.D•Ö‘Ò;BH©Øó«žÐ¢•¦Vžgi’D­VîıneٕþîÖVk«¿½Ýëv»ÝÎN¿ßív%
+°N I…©§ƒ¡³.ï÷Ë(ùôdüð¼Z¸¶@pԔ¢œaS2³ô¸ž†&Q”b¤€¬wŽ™”²tœf­¢œL¦UÕt:="å¬GÀù|TV³4ÕsÞÞÞi·ºÎ9ï€'Bï÷Öy[›ÊxcÙÔ¦Ú»²»,‹bnlÝ4ucë€ØÞéçyûÑÃǒÔûïÝ=;=ýò‹/¼3›ä=4ÚVô@ˆÂ{^.—Ãá`±˜Ï“ÆԌ’G½˜}ôÉ£GŽg³Ùb±øå/ùåœåïï‡ßþ֟(ŠØ¡ºÝîQžçᐢµóå&6[‘
+i¨©d˜&ƒ“Së,‡ØwÁÖõ«iBð"ñ^F]ß,sx$8ç½wD’H[ƒ¦¡ºÄÉxY×Á³¼7ˆ^FBTôª+¸Ì¢ˆ+ë:KöÎ:g”$o½·\T•SÒZëØk­{!„bäÆxÀª®¡®«ùd,VIV4öÑÈ To_Rp 8aJ»œ9R”¤‚Ø pÞyd¯™H €(Œsž!ŽR¥!¤Vº×íµZm!p2æ­HiEºªªÝþž÷`$P98À$ %‘$!¥q6måãéäéÁ³v·ç¼W*vì­ç¼ÕÙÛ½òøñ—'ǧÜýàÑÃGŸ}öé»ï¾sûöÛ¼¶ˆ6Æ\\\‘Jâ̵øæ͛ˆ8›Í˜½RÒû•oă¿øüÁÿûßÿy4…>®I)ŸÞÿìèðäÞ½{oܸýÎÛï¥IΊ4M«ªJ’$l?â/8f¶Îo­wZkg,“$FëœTj%/ÐlzÎYØs—됿šõ‡‡‘D"Á±Î…Q,X¹˜0(©e±¬ƒažÇûû¢`vHèÙ[×"i/V–9æ$€¢k§ç\UÖuÕX`>Ì# [U¦©3vYW¦ª”5†Ër8´­N¶½Õ]Õ¯ž@Ò{c»+¤©¨.¢97…yS¢lã¼%Y"RXUyž+µ<jµZÌahØ)%«ª:99‹£´,«(Ò¦qÝnÏÛ4͆_+Ċ«ÈžPI€ì¹ªêÃÃÃ?üFȗÂkµZï½÷Þ§Ÿ~|ppðýïÿÏþìÏþæoþæç?ÿùNÿ
+¼þêÅ~ýO˜›¦év{i3{"
+žiw»4͊etýZÚjušÚ#BHݚƒˆ¦iì«ì%¥÷>‘£¨AÄv[, f_šZ”¤‘ã”4Íçށµà.ŠÉ¢X
+ãg‰‚•’¬k’4ÎsM`PãV¯§¢þà´þݳ¦b÷A©Š¬kj¬&p65ót¯Fíd¹G žµX±SÐ9Ȉž™{[[Bc¬s†£ñd:Û»òV§»]WµTêøøäþýûúÝ?ýðÃCîrpppÿþýo}ë[W®\D<|òäé½{÷Ò$6¦Ñ$÷vv­µÎº$I˜YéhÿJ ‘
+D"%%×U(„ŠtÖÊÓ<GãÉx:#²g„Ûo½wý·vQÌ˲`öe5“´:i2ŠÊj!8ãWƒëº~øða°ä¬ªj#”â8ÀiÎ9&,êJÆ*înõ®Ý¼$9k­@Ð2*KÛ4ŽµQZíV»i¬$éü>xŽ£nK: î|p®‚Þ)f?™ŒóE'y«+I6Æ9ïÉpX‡ìƒì»@ÏÞ5 ¤æúj²$É
+Ò8êVÈ ÎykBfMQ,­3 PÖÒ9S¥"RIã­sN¡dYJc­|˜HÂjÆŠºð#×Î[ý«7ËÅò‹'ÃJ-o߸²ÓÉ0× i7ܔ†ŠN´»—uw ”¯-£RJ%Á{¶×¶š/A!Hk(Þ~û$I¬õ‚¤”*I’,Ëx±XÄq콪“ɤÛí¥*ÚêmUei­”D„Všóëß0Æ䝶6ֆ)¥4Óc%ÉV«ôæ‹ùl6;???=;›Œ'ì\½t¬Þ}ÿîöÎ~]Þ6Ëb9NÙ±Sš½óÆy'XXð€ P`S7ƒÁ `ÂËuç1D@ØÂ6™D±Ž5 Dqűuîðè¨Ì;ý~_JÕË ÖzÖ¸j±(’4õÞecç™ùá«`f#„0MžÝxrqzz²ÕÛ1n6›9k[íN’¤UÕ9ĕÁCPf!„ó.”VZkg¹,ªW›Ð+ùT†$¤`´¶¡:²¦1‚H’,”òαçM­€‰8ŽGËÂXk­ÓR.,T¦Iâx¾XÌg³þN?Ï҅m¾Çίo·nö;½¸ã\%L%še±<ŽâN¿ÓÛïtv(îºÕð…"R¡Ani‘dd{{[ª>ÂÌý~?xÇÛ&´â«N§sïÞ=(˂Hîïïïîînr¸¢(¥Rq–:`c¬Ä´–5 ݅F„цû÷ïþùçÇÇÇË刈„<o½ûNç¬*=‚qn¾\VuI˦®MíH‘·>8œ
+±WËb9¼8žNg{{WHHcÄÕ Xy̬X_ˆÇQ¨“f³ùd<îtÚ»»»‚èâ⢮ë~¿Ÿ$IÓØÍÐDx3aç z»P–eQ̼˜“éäU„V*¥P¬Ô¸ÃŠ ORVÖ6u½Þ<)”!:Šqó½7MÇ1˜¦ qŠ!=òÂ8W™º\ιý½ý¤Ó£´3¾,.–ÅÕN²·•o©HÕUäëeuîÌl±ÈIw?Ê»qšGi†$õ>V¤@1³$HA¬6d­u»ÝŽãèh8F½^/À•»»»D²,Ë8ŽÃ’X©ŸjY諸öÀ$€„aô>à ƒÁàäää÷÷?~öìÙÁÁÁl6 lOӘG˜C†D$¼CfDË岪 çŒ Ñêæžíb²`tŽQ€°µ‰âx±XœœœÜ¸qãêÕ«aß
+&.¥dDç\’%ýÝ~p–ÜÝÛS¬«¦Ñ*ÎÛ=f6Ɲýþ÷¿wŽ¿ño§IìÍÄڒfÓ¡
+ÒWÞùƚf¹lêZJR.Ë¢¶NeVϕÉÑàøxxqcÙ³Ÿí¨˜˜ yh–óårîƒ(iõvö:;ûI«‡*AM픒a»
+‡Ã^o+ÀE¼žÁ""@€‚= Œ’¸¬ëÅb1¿/F'''ÇÇÇGGGMÓX·ò ì4ˆtdØxvž½µn4yï‰Ú4EYÖuˆÎûªq΁ŠTœF2’Ö:Î[šaq£Ã`7 ¡­¤"É5‡…°aŒ.†¦®´Žœõvw{»åÊÕN+ïv»ÏžZkIX\É¢ãŽßœEEQ´Ú­ÙlòÑGýâ?^œ3sÒÞyóÎ’r6Î‹ñhT•¥­Íx<¾¸¸˜N§
+8¶¥ð ›mO¬guVÇ«wDôO蕆©µ~í„J(¬s(ê,K=
+R¨BӜp °qÉXƒÚK%Ó<3Aˆh¨ê’P`–„ˆ¥r ‚k°ìàb4@Iy»‰H¶ZE]|r1?m\¿×jçI u¤<HƪĦ¶°Ö\ N&O¿x’¤QÚj÷ú[;»y»w¶‰„RZk¥µV(¼qZë›7o6Móµ¯}íʕ+{{{iž¦ŽŒ1MSc˪,Šr¹,çƒÃ£Ã³³³‹‹‹ÅrIì|¨pQŽ›Ö‘ -]í4É$Ž­1uݔeÈ)É;_•UY–­V¯cL§ê4aÁŽXÅ©ŠbŠ£vUÔÃӉášY"¬.Ø|ºÌòƒµ› 5npv‘¥™±æŸþï~üæ³o~û[·nÝi·ÛíNg<>yz’µ{Ýíñ|抲h·Ú¥W¾âHGyž¼¨§¦ôsøÙÏ~ñӟþôÑ£g¡y`Œg(?ûøþMA=†ˆÂx;3³c€k®£¤Ê4¯:Ø=7s „$
+¥£V*Ž"ï= ‰Š cm]×À¬¥,ËR
+KŠ¼÷l½"åÁ¯mŸâ/¡—›t¬±UUyïëªþÝï>ú×û÷^¯wãƍþð‡{{{eYi-«ºžÍç_~ùežçƒÁ`±X GD±³³³½½MDEQEñùïF#cÌz—ι•A†/n¢ֈ¾¼¶§|ñÆpÖ~XáŸçGææ¿W/%VT]Bi]Uu¥t¤õBiÂh½Ílk£V2Î
+I)bàsRÇRp¾1&°äŒ1X×ÞÕ¶¶I¬w{´Õ2ŠØÙژ²¶¾¬ª8ÒJx#00dô–gŒ¢ªÝræΟwк•Ÿ{Àˆ›¦qìA®L÷6Œ^ç6*°&”öÞ3
+ˆ¤’(QRfÝ.!5u-Ù²oŒu«$Á#¢iÌx<N’”¹1ƚš‡çãó³Ñx4õ$©•wˆeÅÕ¢6MõU6¸¯\29®÷¾®ëUœ$ççÃáùÙYw7˲½ÝÅröìÙ³‹áŸž]\\xÀ$Iƒh÷~¹\4Mcµiš@ÖÝäõ_Ù¼&¾Ú,ºü0±RÎ}%°6ºÙœŸÇì%,DiT*AVGœ7²)=7í: óe)%¶³|UÚHł²4Ýîvcóóù<”Wá=I)ÙÛÉdIàÓ$Q:ӊ< u¼\ÎG£ ·\(IÈ~+d'eðŒ‡(ÐðŽïE8þ1ø›·Ö+;­_K„v)â†ô›8(3si")¥l·[JiÅeQ,–E]TÀZ&© ®ÃözˆÖZ%ÅéÉÁ¯ýë³Ó³ápXVe]׎Pô:ÍÞÎ^+ÍMe—~a_±æþªÐ
+hnY–•ßñÞ¹))°Þy/Zí²©‘YÄ12ÄJ! w^K ˆ>h;)E‘`´uÍΕU½¨ê8ŽRE2BŠ­¯ÊÂyç­.w6֘¥
+™¼ó$H±Þyr.°a‡RÈx0èM*ã½Çà‡à}€å²,#¢$˴֝N7äÎDTUÕp8*Šbx1vÆ&Q$¤Š$•B@.Šb413€_œ>yøèìtä,£`$5֍‡Wy­µ©jo›K)ʺ…~ó梀”IÓ4¦nÒ4a†¦¬lӏï<H!…1f>›Ycˆ(Œ7·ãuCúÛ7a´ †Ë—´Þ¤@×ø×ô
+Ba­‘(„óUUY¥Qpž‘Â$mU c#­Ë¢ðÞGq$¼ÔQ„γ1iI¥¢$Ëò–u—EY–K¤ 0KŽeYT}M䛪©kBôÖxc™YH)‰4¡7›EÒ,ã,H
+xúÇ
+*#!þÚíööövEY«€RªÉtrqq¾X.†ƒÁ¢® išXGQ;ç¼µ:Š–å2´"ö÷÷÷ööêjî\mšÒ$-˅÷ŽHˆ¬oóe¬8ÿh—MŸ`s*%I|óÆͪªŽÃ" ‡¸¶Æ€–S”õ`±Ö;G(@€àÕ!΢_Þ¢^>µ^Ô[{9°.EÞWÖåØ
+#äÂ{@ç°t$@h©5ɊÊH*%=ÆP9#"³ŸÏæƚ¤MF“¦iØ9‰B VP1sÀúk|Uc")“$öž¥RÛÛÛW®]wÞ[S?yúøøpà­SRDŠZ­¨LfQ–DÝ<×ÔÅØ/–‹Æ®*g-1I Š"ˆÆÏ,µ@É%Q’¤Q¤QI¥£HG10kò,ït;RÊÆòl>/Šâôôô|0@€ÅbR
+
+²m¬•R–uåVUå›)-•j·ÚQ¤…”äIÖ͝ÍæÅÂøᢐRÚ:ð^œcX֕Š"™gf¾D’H*¦m“8BoíhÄ—Óòû_ÿ÷ÿóöÿÕnåÓñÅáё5FªQèq¡Ò–R%‰@ PJ
+ĺnš¦A„«³{uˆ3WÍjxy}’0OÆ#@Ɓ¸¢0{ör8灐”fk]@øœ³èXJU75H¥B)¬©PÂ?—@F
+QUÕIš\½vSFéùÅÐcœ%%‘Hz¶ŽµzÕú«o4Œ×sþzmmÐá0OY’åyU׍1Y™fij¬5Î6MSEUU€˜Ä±âyí¢4qö‚A‰bi4M3™LœsuUm:Ù~m=åœ 
+y–ˆH!Ô]»¼¾ÚívÆØ¡?pa´šµò¨P$ƒrNµ«Úº‘Œgyy9ŸÍbŠ÷«»»»»qô ýg­¹¾º–“ìg‰Ê~¿ËP´ÒTˆ 7M³¼\6uS2ňÊz½îûƒTõg³®ëf2‡ˆ1¦ín›(mX`ûWWWõ Ã0®×ë£uN8Ê{úróùüâ₨h­›®#€D9 ÃJ&Òå ù ÞÅPqž\ðĔ"Ÿ];ídЌƒÒ@%¥„ÄÊ13C¦TQI9£RUUÍf3—+΄Ä\
+2+PxÊ%ōªª$‰ Á¸
+(Oê:ÌÜ÷½t-÷û}]×uUMÃX55 R¦c{ ‘ªªŠ9'"böÞOý4 ƒÌ#œ܄pr,W×ͦXŠ3FI›åxÑK©g]f”•RŽ éÊ# ²ÆkÎë梛IÂþôéÓår9cÊe?ŽÈHäàb­»¼z
+BJÆû0R¦ ¼¯›¦3ÆDeÏ… +]sá\˜Q+¥
+£.…–Ý•Úl6©PŠ¡h½ÐîŸ綇ýÝúÁ¶­­ªfÞÝÜ|”BØn·Ò¡»¾X.‹£Ü?fnÛVŸ‡¾'FTà*ÿ鳏=èïøa7¨•º¹~2kÛû»7Ê(ëk¥Ô‹§c¶Ûía˜èáAkýüù󋋋iš¾ýöÛRÊ.MŨ/^è¯n_M%çR../¿øòK­µ sêº*‰ÆðüÙ³ùâŸV«×www~õ6êÉÅå—Ï?Ý.®¶¿Y¯rÿõ‹/ç‹Åý›{Q:ô‡Ënþù?~q?«›®mÿûOB­r)‚€ª®û¾1
+ÜÃðõW_SÌF)kl.™™ʲÝneúcš¦ï¾û.¥ôìÙ³ív»Z­J)¯^½úÃþð鳏}割ô¤^¿~-Û^¥Tß÷›í«×·ýÐÿp·z¹º­«úööUÈIkóÇ?þñõ7ñuÕ\]´WKx½Zݾ¾˜aŒQiý§?ÿy½Ýl¶iÈ‘V:Œ“RX
+·^Ì}ÝXoí./ÚùL
+rU¼ê͛7Ûýî0MÓÈb]×1FÑѵ ¬R™¨j››ŸÀ¶n¬µ’•Ê…ýËW_'§CPÖk•V›ûuå=†º®C¨5)@€«åòæê ­aß÷«Õj°ÖŽãH)×]»¸Z~ûÿù¶{üâ¥ðG—<wàXG=ï•RF*C†Žƒ1¥CDÎ眫|•)g¢”SŠ)ÆS$¢B4¥OØꔒ€ÁÀLnR¡ifF›aШ(§’õN…ˆ™Â0…çÕjµÛí8¦œó8M„l¬ÅRåÝ.hÀÊúeݶ—M¿?l»Ýn7M“¨âh­×»í0 ÖZ`î‡A)å¬UZPÚZÅÇ2Û4G²Ö’€yÖ´Z©õ›ûa”VZë3Û¢TAe{;HKÞûv6‹Z&ºó>D"z8쪶É!úª’N³÷>çlµ¹š/q"NTòr `”Fk•5…Ëv»Ýí÷gš‚3P½”R×ÍÜ»ãaè§CŒuÛ8k«ª’8}\ˆ
+å°~X§)¤˜€9B­ëº¾¾¾†ÓÜpèA¸I~½c£ÔÛk¢B<÷**BRJ1þƌÖY"2†‰È[9],¥HWV¨išäd.S ò»Ä0D¬]<”ù÷âQ+]{g¤õA…]H˜©Ô±mZ]²1všÂhFç}Û¶¬° „‘²[R6…=êÖxßÀö°2µ˜ó8 *•âÍ1„ååeݶZ©Z[Ò¸î÷! Š™¤! âŒ‘^…¸Žd$²#M‡s Aî(ÔVDVY˜¦)ä”Æi¶XH K:V,%§}œÆép8(4Úsˆ¡EÊpÿð •jÚÆûª®«®ëè0çbJó‹Å~ÞÜ¿¡L
+‘Ë‘–)Řb4Î)£´R…Š¬0ÀÌuÛ
+94žFjS‘Hh›~½c+üæëˆå@ÐJ1¢bf.(<M¥¨B\ ‘¡BÎY*”sN9KF坕ðNÀ>º˜"paÁ—‚½Råe¡L¹NH…Èji PI)7uÙƒÖz®pÑ4C×µm{œ©¢Ni§´Rj*ã°?|óÕב g£
+S!N¢a]röÆ**Üøª2 …)E&1C"ßTÄSÌ\œsZÙB¡l¼uóNJe璲TéÚ¶µÖî÷{YY8$Ð &*!gm5tÝl¹XXk°PÑFk……¡nëë©öŒz¦Â¬0§$i“ÕÚûŠ*ïçó¹HH ¢F…ÐJ)µ¼X pLéaQÄZ °2† ‘$¢ ±
+\«RÊéŠrÎ1ÊßJEÞra§ôl6«}Å̍¯¦iJ1©\lAgÌ0M l”BYF
+¾´Þåß6M³X,d+pÞT‰KåœÊ{[À_¿+üö“ŸõWoòQððôãÇßO«í{/ßyó=Ǒr†SŸà§¿¯èŶó„F:?#ü6¨ò<©‚ïLœ‘DAðxBP1%«Þ~‰ˆò›<RçKq<IÄ÷iòÎ-ç|úD\|.¾G‹…€|¢P8^)|粋Àýû__Îô!~‹s›OW p91L^-—ïœãÿ¥c=ÚÿûÛ2=öh¿ÒëÑ>ˆ=:Ö£}{t¬Gû öèXöAìѱíƒØ£c=Ú±GÇz´bŽõhÄëÑ>ˆý/”Au•ËF¶•IEND®B`‚
\ No newline at end of file
/advdemos/tags/rel_1_5_beta1/mesaref/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS = mesaref
 
include $(BASE)/config/example.mk
 
mesaref:
make -f $(SUBMAKE) APP=mesaref INIT= OTHEROBJS="initfile.o" SHARKOPT="__OSMESA__ __PNG__ __OLDCHAR__ __GRX__"
 
/advdemos/tags/rel_1_5_beta1/mesaref/initfile.c
0,0 → 1,182
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: initfile.c,v 1.3 2005-02-26 10:57:27 pj Exp $
*
* File: $File$
* Revision: $Revision: 1.3 $
* Last update: $Date: 2005-02-26 10:57:27 $
*/
 
#include "kernel/kern.h"
#include "edf/edf/edf.h"
#include "rr/rr/rr.h"
#include "cbs/cbs/cbs.h"
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
#include "srp/srp/srp.h"
#include "npp/npp/npp.h"
#include "nop/nop/nop.h"
#include "nopm/nopm/nopm.h"
 
#include "fs/bdevinit.h"
#include "fs/fsinit.h"
#include "fs/bdev.h"
 
#include "drivers/keyb.h"
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
dev_t root_device=-1;
dev_t temp_device=-1;
 
int __register_sub_init(void)
{
#if defined(EDFSCHED)
extern void BD_EDF_register_module(void);
BD_EDF_register_module();
#elif defined(PSCANSCHED)
extern void BD_PSCAN_register_module(void);
BD_PSCAN_register_module();
#endif
return 0;
}
 
int choose_root_callback(dev_t dev,u_int8_t fs)
{
if (fs==FS_MSDOS) return dev;
return -1;
}
 
int choose_temp_callback(__dev_t dev,__uint8_t fs)
{
static int flag=0;
if (fs==FS_MSDOS) {
if (flag) return dev;
flag=1;
}
return -1;
}
 
int __bdev_sub_init(void)
{
BDEV_PARMS bdev=BASE_BDEV;
bdev_def_showinfo(bdev,FALSE);
bdev_init(&bdev);
 
root_device=bdev_scan_devices(choose_root_callback);
if (root_device<0) {
cprintf("can't find root device to mount on /!!!\n");
exit(1);
return -1;
}
 
return 0;
 
}
 
int __fs_sub_init(void)
{
extern int libc_initialize(void);
FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
filesystem_def_rootdevice(fs,root_device);
filesystem_def_fs(fs,FS_MSDOS);
filesystem_def_showinfo(fs,FALSE);
filesystem_init(&fs);
 
libc_initialize();
 
return 0;
}
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
extern int __register_sub_init(void);
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
CBS_register_level(CBS_ENABLE_ALL, 0);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
NOPM_register_module();
 
__register_sub_init();
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
KEYB_PARMS keyb = BASE_KEYB;
extern int __bdev_sub_init(void);
extern int __fs_sub_init(void);
HARTPORT_init();
KEYB_init(&keyb);
 
__bdev_sub_init();
__fs_sub_init();
__call_main__(mb);
 
return (void *)0;
}
 
/advdemos/tags/rel_1_5_beta1/mesaref/mesaref.c
0,0 → 1,514
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
*
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include <drivers/glib.h>
#include <drivers/keyb.h>
 
#include <GL/osmesa.h>
#include <GL/glut.h>
#include <png.h>
 
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include <kernel/log.h>
#include <kernel/kern.h>
 
#include <stdio.h>
 
#ifndef M_PI
#define M_PI 3.14159265
#endif
 
#define WIDTH 640
#define HEIGHT 480
#define BYTES_PP 2 //BytesPerPixel
 
#define DEG2RAD (3.14159/180.0)
 
static GLint ImgWidth = 0, ImgHeight = 0;
static GLenum ImgFormat = 0;
static GLubyte *Image = NULL;
 
#define MAX_OBJECTS 2
static GLint table_list;
static GLint objects_list[MAX_OBJECTS];
 
static GLfloat xrot, yrot;
static GLfloat spin;
 
OSMesaContext ctx;
 
unsigned char *rgb_565_buf = NULL; //RGB 16 bpp Buffer
unsigned char *video_buf = NULL; //Video Buffer
 
unsigned long int VMEMLONG = WIDTH * HEIGHT * BYTES_PP / 4; // Used by copy_videomem_16to16
unsigned long int RGB565MEM = WIDTH * HEIGHT * BYTES_PP; // Total video mem
 
unsigned long int PERIOD_REFRESH = 150000;
unsigned long int PERIOD_DISEGNA = 150000;
 
unsigned long int WCET_REFRESH, WCET_DISEGNA;
 
TASK refesh(void);
TASK disegna(void);
 
PID refresh_PID, disegna_PID;
 
void read_png_file(char *file_name, GLubyte **buffer, GLint *width, GLint *height, png_byte *color_type)
{
 
int y;
png_byte bit_depth;
 
png_structp png_ptr;
png_infop info_ptr;
int number_of_passes;
png_bytep * row_pointers;
 
char header[8]; // 8 is the maximum size that can be checked
 
/* open file and test for it being a png */
FILE *fp = fopen(file_name, "rb");
if (!fp) {
cprintf("[read_png_file] File %s could not be opened for reading\n", file_name);
exit(1);
}
fread(header, 1, 8, fp);
if (png_sig_cmp(header, 0, 8))
cprintf("[read_png_file] File %s is not recognized as a PNG file\n", file_name);
/* initialize stuff */
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr)
cprintf("[read_png_file] png_create_read_struct failed\n");
 
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
cprintf("[read_png_file] png_create_info_struct failed\n");
 
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, 8);
 
png_read_info(png_ptr, info_ptr);
 
*width = info_ptr->width;
*height = info_ptr->height;
*color_type = info_ptr->color_type;
bit_depth = info_ptr->bit_depth;
 
number_of_passes = png_set_interlace_handling(png_ptr);
cprintf("Open PNG W: %d H: %d CT: %d BD: %d\n",*width,*height,*color_type,bit_depth);
png_read_update_info(png_ptr, info_ptr);
 
row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * info_ptr->height);
for (y=0; y<info_ptr->height; y++)
row_pointers[y] = (png_byte*) malloc(info_ptr->rowbytes);
 
png_read_image(png_ptr, row_pointers);
 
if(info_ptr->color_type == PNG_COLOR_TYPE_RGB) {
*buffer = malloc(info_ptr->height * info_ptr->rowbytes);
for(y=0; y<info_ptr->height; y++)
memcpy(*buffer+y*info_ptr->rowbytes,row_pointers[y],info_ptr->rowbytes);
}
 
fclose(fp);
}
 
static void make_table( void )
{
static GLfloat table_mat[] = { 1.0, 1.0, 1.0, 0.6 };
static GLfloat gray[] = { 0.4, 0.4, 0.4, 1.0 };
 
table_list = glGenLists(1);
glNewList( table_list, GL_COMPILE );
 
/* load table's texture */
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_mat );
/* glMaterialfv( GL_FRONT, GL_EMISSION, gray );*/
glMaterialfv( GL_FRONT, GL_DIFFUSE, table_mat );
glMaterialfv( GL_FRONT, GL_AMBIENT, gray );
/* draw textured square for the table */
glPushMatrix();
glScalef( 4.0, 4.0, 4.0 );
glBegin( GL_POLYGON );
glNormal3f( 0.0, 1.0, 0.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 0.0, -1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 0.0, 1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 0.0, -1.0 );
glEnd();
glPopMatrix();
 
glDisable( GL_TEXTURE_2D );
 
glEndList();
}
 
 
static void make_objects( void )
{
GLUquadricObj *q;
 
static GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 };
static GLfloat green[] = { 0.2, 1.0, 0.2, 1.0 };
static GLfloat black[] = { 0.0, 0.0, 0.0, 0.0 };
 
q = gluNewQuadric();
gluQuadricDrawStyle( q, GLU_FILL );
gluQuadricNormals( q, GLU_SMOOTH );
 
objects_list[0] = glGenLists(1);
glNewList( objects_list[0], GL_COMPILE );
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan );
glMaterialfv( GL_FRONT, GL_EMISSION, black );
gluCylinder( q, 0.5, 0.5, 1.0, 15, 1 );
glEndList();
 
objects_list[1] = glGenLists(1);
glNewList( objects_list[1], GL_COMPILE );
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green );
glMaterialfv( GL_FRONT, GL_EMISSION, black );
gluCylinder( q, 1.5, 0.0, 2.5, 15, 1 );
glEndList();
}
 
static void gl_init( void )
{
png_byte img_color;
 
GLfloat yAspect = 2.5;
GLfloat xAspect = yAspect * (float) WIDTH / (float) HEIGHT;
 
//Create the OSMesa Context
ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL);
 
//Make Current Context
OSMesaMakeCurrent(ctx, rgb_565_buf, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
 
read_png_file("test.png",&Image,&ImgWidth,&ImgHeight,&img_color);
if (img_color == PNG_COLOR_TYPE_RGB && Image != NULL)
ImgFormat = GL_RGB;
else {
cprintf("Texture Load Falied !!\n");
exit(1);
}
make_table();
make_objects();
 
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, ImgWidth, ImgHeight,
ImgFormat, GL_UNSIGNED_BYTE, Image);
 
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
 
xrot = 30.0;
yrot = 50.0;
spin = 0.0;
 
glShadeModel( GL_FLAT );
glEnable( GL_LIGHT0 );
glEnable( GL_LIGHTING );
 
glClearColor( 0.5, 0.5, 0.9, 0.0 );
 
glEnable( GL_NORMALIZE );
 
glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum( -xAspect, xAspect, yAspect, -yAspect, 10.0, 30.0 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
 
}
 
static void draw_objects( GLfloat eyex, GLfloat eyey, GLfloat eyez )
{
(void) eyex;
(void) eyey;
(void) eyez;
#ifndef USE_ZBUFFER
if (eyex<0.5) {
#endif
glPushMatrix();
glTranslatef( 1.0, 1.5, 0.0 );
glRotatef( spin, 1.0, 0.5, 0.0 );
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
glCallList( objects_list[0] );
glPopMatrix();
glPushMatrix();
glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*spin) ), 0.0 );
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
glRotatef( spin, 1.0, 0.5, 0.0 );
glScalef( 0.5, 0.5, 0.5 );
glCallList( objects_list[1] );
glPopMatrix();
#ifndef USE_ZBUFFER
}
else {
glPushMatrix();
glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*spin) ), 0.0 );
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
glRotatef( spin, 1.0, 0.5, 0.0 );
glScalef( 0.5, 0.5, 0.5 );
glCallList( objects_list[1] );
glPopMatrix();
 
glPushMatrix();
glTranslatef( 1.0, 1.5, 0.0 );
glRotatef( spin, 1.0, 0.5, 0.0 );
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
glCallList( objects_list[0] );
glPopMatrix();
}
#endif
 
}
 
static void draw_table( void )
{
glCallList( table_list );
}
 
static void draw( void )
{
static GLfloat light_pos[] = { 0.0, 20.0, 0.0, 1.0 };
GLfloat dist = 20.0;
GLfloat eyex, eyey, eyez;
 
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
 
eyex = dist * cos(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
eyez = dist * sin(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
eyey = dist * sin(xrot*DEG2RAD);
 
/* view from top */
glPushMatrix();
gluLookAt( eyex, eyey, eyez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
 
glLightfv( GL_LIGHT0, GL_POSITION, light_pos );
/* draw table into stencil planes */
glDisable( GL_DEPTH_TEST );
glEnable( GL_STENCIL_TEST );
glStencilFunc( GL_ALWAYS, 1, 0xffffffff );
glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
draw_table();
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
 
glEnable( GL_DEPTH_TEST );
 
/* render view from below (reflected viewport) */
/* only draw where stencil==1 */
if (eyey>0.0) {
glPushMatrix();
glStencilFunc( GL_EQUAL, 1, 0xffffffff ); /* draw if ==1 */
glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
glScalef( 1.0, -1.0, 1.0 );
 
/* Reposition light in reflected space. */
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
 
draw_objects(eyex, eyey, eyez);
glPopMatrix();
 
/* Restore light's original unreflected position. */
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
}
 
glDisable( GL_STENCIL_TEST );
 
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
 
glEnable( GL_TEXTURE_2D );
draw_table();
glDisable( GL_TEXTURE_2D );
glDisable( GL_BLEND );
 
/* view from top */
glPushMatrix();
 
draw_objects(eyex, eyey, eyez);
 
glPopMatrix();
 
glPopMatrix();
 
glFinish();
 
}
 
static int screen()
{
 
extern DWORD flbaddr;
/* graphic card Initialization */
if (grx_init() < 1) {
exit(1);
}
if (grx_open(640, 480, 16) < 0) {
cprintf("GRX Err\n");
exit(1);
}
video_buf = (unsigned char *)flbaddr;
 
return 0;
}
 
void program_end(void *arg)
{
OSMesaDestroyContext(ctx);
free(rgb_565_buf);
 
grx_close();
 
exit(1);
 
}
 
void program_key_end(KEY_EVT *k)
{
 
exit(1);
 
}
 
TASK refresh(void)
{
 
while(1) {
 
memcpy(rgb_565_buf, video_buf, RGB565MEM);
task_endcycle();
 
}
 
exit(1);
 
}
 
 
TASK disegna(void)
{
 
char text[100];
TIME disegna_TIME, refresh_TIME;
while(1) {
jet_gettable(refresh_PID, &refresh_TIME, 1);
jet_gettable(disegna_PID, &disegna_TIME, 1);
 
spin += 2.0;
yrot += 3.0;
 
draw();
sprintf(text,"Hard Task Refresh PER:%6d us EX:%6d us",(int)PERIOD_REFRESH,(int)refresh_TIME);
grx_text(text,10,5,rgb16(0,0,255),0);
sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
grx_text(text,10,15,rgb16(0,0,255),0);
 
task_endcycle();
 
}
 
exit(1);
 
}
 
int main (int argc, char *argv[])
{
HARD_TASK_MODEL ht_refresh, ht_disegna;
 
sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT);
WCET_REFRESH =((long int) PERIOD_REFRESH * (0.2));
WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.7));
 
hard_task_default_model(ht_refresh);
hard_task_def_wcet(ht_refresh,WCET_REFRESH);
hard_task_def_mit(ht_refresh,PERIOD_REFRESH);
hard_task_def_usemath(ht_refresh);
hard_task_def_group(ht_refresh,1);
hard_task_def_ctrl_jet(ht_refresh);
 
refresh_PID = task_create("refresh", refresh, &ht_refresh, NULL);
if (refresh_PID == -1) {
exit(4);
}
 
hard_task_default_model(ht_disegna);
hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
hard_task_def_group(ht_disegna,1);
hard_task_def_ctrl_jet(ht_disegna);
hard_task_def_usemath(ht_disegna);
hard_task_def_stack(ht_disegna, 30000);
disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
if (disegna_PID == -1) {
exit(4);
}
 
{
KEY_EVT k;
k.flag = ALTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,program_key_end);
}
rgb_565_buf = malloc(RGB565MEM);
gl_init();
if (screen()) {
printk(KERN_INFO "Graphical initialization failed !!\n");
exit(1);
}
 
group_activate(1);
 
return 0;
}
/advdemos/tags/rel_1_5_beta1/mesaref/readme.txt
0,0 → 1,52
--------------------------------------
MESA Demo (reflect)
 
by
 
Giacomo Guidi <giacomo@gandalf.sssup.it>
 
Last update 20/03/2003
--------------------------------------
 
This is a simple test demo for the MESA (5.0)
libraries, the low level graphic drivers is
the SVGA (from the SVGAlib)
 
See drivers/svga/readme for supported cards
 
You need a test.png file present in the
same directory of the demo. Remember that
the file system support only a DOS FAT16 fs.
 
The PNGlib will load this file and it
will be used as a texture.
 
--------------------------------------
 
The demo is composed by:
 
MAKEFILE The makefile used to compile the application
README.TXT This file
INITFILE.C The init file (with fs initialization)
MESAREF.C The MESA Demo
TEST.PNG The PNG texture image
 
--------------------------------------
 
- To specify your card change the line
 
#define CARD <driver name>
 
- The demo calls the grx and off-screen Mesa functions.
The resolution must be 16 bitsperpixel (64K colors) and
the graphic access mode must be linear.
 
- There are two buffers
 
The video buffer (video_buf)
The virtual buffer (rgb_565_buf)
 
copy_videomem_16to16 links these buffers
 
- If the texture load fails, exit(1) is called
 
/advdemos/tags/rel_1_5_beta1/elastic/initfile.c
0,0 → 1,176
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
 
#include "intdrive/intdrive/intdrive.h"
#include "edf/edf/edf.h"
#include "elastic/elastic/elastic.h"
#include "cbs/cbs/cbs.h"
#include "rr/rr/rr.h"
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
 
#include <drivers/shark_linuxc26.h>
#include <drivers/shark_input26.h>
#include <drivers/shark_keyb26.h>
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
/*+ Interrupt Server +*/
#define INTDRIVE_Q 1000
#define INTDRIVE_T 10000
#define INTDRIVE_FLAG 0
 
void call_shutdown_task(void *arg);
int device_drivers_init();
int device_drivers_close();
void set_shutdown_task();
TASK shutdown_task_body(void *arg);
 
PID shutdown_task_PID = -1;
 
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG);
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 1);
ELASTIC_register_level(ELASTIC_ENABLE_ALL, 1, MAX_BANDWIDTH);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
return TICK;
 
}
 
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
/* Create the shutdown task. It will be activated at RUNLEVEL
SHUTDOWN */
set_shutdown_task();
 
/* Init the drivers */
device_drivers_init();
 
/* Set the shutdown task activation */
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN);
 
__call_main__(mb);
 
return (void *)0;
}
 
void set_shutdown_task() {
 
/* WARNING: the shutdown task is a background thread. It cannot execute
if the system is overloaded */
NRT_TASK_MODEL nrt;
 
nrt_task_default_model(nrt);
nrt_task_def_system(nrt);
 
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL);
if (shutdown_task_PID == NIL) {
sys_shutdown_message("Error: Cannot create shutdown task\n");
exit(1);
}
 
}
 
int device_drivers_init() {
 
KEYB_PARMS kparms = BASE_KEYB;
LINUXC26_register_module();
 
INPUT26_init();
 
keyb_def_ctrlC(kparms, NULL);
 
KEYB26_init(&kparms);
 
return 0;
 
}
 
int device_drivers_close() {
KEYB26_close();
INPUT26_close();
return 0;
}
 
#define SHUTDOWN_TIMEOUT_SEC 3
 
void call_shutdown_task(void *arg)
{
struct timespec t;
 
sys_gettime(&t);
t.tv_sec += SHUTDOWN_TIMEOUT_SEC;
 
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0);
 
task_activate(shutdown_task_PID);
}
 
TASK shutdown_task_body(void *arg) {
 
device_drivers_close();
 
sys_shutdown_message("-- S.Ha.R.K. Closed --\n");
 
return NULL;
 
}
/advdemos/tags/rel_1_5_beta1/elastic/elastic.c
0,0 → 1,279
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
* Anton Cervin
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
#include "kernel/kern.h"
#include "time.h"
#include "elastic/elastic/elastic.h"
#include <drivers/shark_keyb26.h>
 
 
#define MAX_TASKS 7
 
 
/* A task that scrolls a number (the task number) across the screen */
 
TASK elastic_test(void *arg) {
 
int y = (int)arg;
int x = 0;
 
char str[2];
str[0] = '0' + y + 1;
str[1] = '\0';
 
while(1) {
puts_xy(x,y,LIGHTGRAY," ");
x = (x + 1) % 80;
puts_xy(x,y,LIGHTGRAY,str);
task_testcancel();
task_endcycle();
}
}
 
/* A simple keyboard string input routine */
 
void myinput(char *query, char *buf, int len) {
BYTE c;
int n = 0;
 
cprintf(query);
 
do {
c = keyb_getch(NON_BLOCK);
if (c == '\r') break;
if (c == '\b') {
if (n > 0) {
cprintf("%c", '\b');
n--;
}
} else if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')) {
cprintf("%c", c);
buf[n++] = c;
}
} while (n < len);
 
buf[n] = '\0';
cprintf("\n");
}
 
/* The main program */
 
int main(int argc, char **argv)
{
ELASTIC_TASK_MODEL e;
PID el_pid;
PID pidvec[MAX_TASKS];
int quit = 0;
char buf[80];
int y;
int Tmin, Tmax, C, E, T, nbr, i;
double U, Umax;
 
for (i=0; i<MAX_TASKS; i++) pidvec[i] = NIL;
clear();
 
/* Create predefined task 1 */
elastic_task_default_model(e);
elastic_task_def_period(e, 50000, 200000);
elastic_task_def_wcet(e, 25000);
elastic_task_def_param(e, 5, PERIOD_SCALING);
elastic_task_def_arg(e, (void *)0);
el_pid = task_create("Elastic",elastic_test,&e,NULL);
if (el_pid == NIL) {
cprintf("ELASTIC_public_create failed!\n");
} else {
pidvec[0] = el_pid;
task_activate(el_pid);
}
 
/* Create predefined task 2 */
elastic_task_default_model(e);
elastic_task_def_period(e, 100000, 150000);
elastic_task_def_wcet(e, 40000);
elastic_task_def_param(e, 10, PERIOD_SCALING);
elastic_task_def_arg(e, (void *)1);
el_pid = task_create("Elastic",elastic_test,&e,NULL);
if (el_pid == NIL) {
cprintf("ELASTIC_public_create failed!\n");
} else {
pidvec[1] = el_pid;
task_activate(el_pid);
}
 
do {
 
/* Print task table */
for (y = 7; y <=15; y++) {
puts_xy(0,y,LIGHTGRAY," ");
}
place(0,7);
 
U = 0.0;
Umax = 0.0;
cprintf("Nbr Tmin Tmax C E T \n");
for (i=0; i<MAX_TASKS; i++) {
if (pidvec[i] != NIL) {
Tmin = ELASTIC_get_Tmin(pidvec[i]);
Tmax = ELASTIC_get_Tmax(pidvec[i]);
C = ELASTIC_get_C(pidvec[i]);
E = ELASTIC_get_E(pidvec[i]);
T = ELASTIC_get_period(pidvec[i]);
U += (double)C/(double)T;
Umax += (double)C/(double)Tmin;
cprintf(" %1d %4d %4d %4d %4d %4d\n", i+1, Tmin/1000, Tmax/1000, C/1000, E, T/1000);
}
}
cprintf("Maximum utilization: %5.3f Actual utilization: %5.3f\n", Umax, U);
 
puts_xy(0,16,LIGHTGRAY," ");
place(0,16);
 
myinput("(q)uit, (c)reate, (k)ill, force (p)eriod, change (e)lasticity? ", buf, 10);
for (y = 17; y <=24; y++) {
puts_xy(0,y,LIGHTGRAY," ");
}
 
switch (buf[0]) {
 
/* Quit */
case 'q':
quit = 1;
break;
 
/* Create task */
case 'c':
cprintf("Create task");
for (i=0; i<MAX_TASKS; i++) {
if (pidvec[i] == NIL) break;
}
if (i == MAX_TASKS) {
cprintf("\nNo more task slots available!\n");
break;
} else {
cprintf(" %d\n", i+1);
}
myinput("Tmin (ms): ", buf, 10);
Tmin = 1000*atoi(buf);
myinput("Tmax (ms): ", buf, 10);
Tmax = 1000*atoi(buf);
myinput("C (ms): ", buf, 10);
C = 1000*atoi(buf);
myinput("E: ", buf, 10);
E = atoi(buf);
elastic_task_default_model(e);
elastic_task_def_period(e, Tmin, Tmax);
elastic_task_def_wcet(e, C);
elastic_task_def_param(e, E, PERIOD_SCALING);
elastic_task_def_arg(e, (void *)i);
el_pid = task_create("Elastic",elastic_test,&e,NULL);
if (el_pid == NIL) {
cprintf("ELASTIC_public_create failed!\n");
} else {
pidvec[i] = el_pid;
task_activate(el_pid);
}
break;
 
/* Force period */
case 'p':
myinput("Force period\nTask nbr: ", buf, 10);
nbr = atoi(buf);
if (nbr < 1 || nbr > MAX_TASKS) {
cprintf("Invalid task number!\n");
break;
}
el_pid = pidvec[nbr-1];
if (el_pid == NIL) {
cprintf("Task does not exist!\n");
break;
}
myinput("T (ms): ", buf, 10);
T = 1000*atoi(buf);
if (ELASTIC_set_period(el_pid, T) == -1) {
cprintf("ELASTIC_set_period failed!\n");
}
break;
 
/* Kill task */
case 'k':
myinput("Kill task\nTask nbr: ", buf, 10);
nbr = atoi(buf);
if (nbr < 1 || nbr > MAX_TASKS) {
cprintf("Invalid task number!\n");
break;
}
el_pid = pidvec[nbr-1];
if (el_pid == NIL) {
cprintf("Task does not exist!\n");
break;
}
task_kill(el_pid);
pidvec[nbr-1] = NIL;
usleep(500000); // wait half a second before redrawing the task table!!!
/* also erase task number */
puts_xy(0,nbr-1,LIGHTGRAY," ");
break;
 
/* Set elasticity */
case 'e':
myinput("Set elasticity\nTask nbr: ", buf, 10);
nbr = atoi(buf);
if (nbr < 1 || nbr > MAX_TASKS) {
cprintf("Invalid task number!\n");
break;
}
el_pid = pidvec[nbr-1];
if (el_pid == NIL) {
cprintf("Task does not exist!\n");
break;
}
myinput("E: ", buf, 10);
E = atoi(buf);
if (ELASTIC_set_E(el_pid, E) == -1) {
cprintf("ELASTIC_set_E failed!\n");
}
break;
 
default:
cprintf("Unknown command\n");
break;
}
 
} while (!quit);
 
exit(1);
 
return 0;
 
}
/advdemos/tags/rel_1_5_beta1/elastic/makefile
0,0 → 1,15
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS = elastic
 
include $(BASE)/config/example.mk
 
elastic:
make -f $(SUBMAKE) APP=elastic INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__LINUXC26__ __INPUT__"
/advdemos/tags/rel_1_5_beta1/chimera/udpdump.c
0,0 → 1,115
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include <netinet/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>/* close() */
#include <stdlib.h>
#include <signal.h>
#include <string.h>
 
#define SERVER_PORT 20000
#define MAX_MSG 10000
 
FILE *output_file;
 
int miss;
 
void close_and_exit()
{
 
printf("Closing...\n");
 
if (miss == 1) printf("Possible error receiving packets !\n");
 
fclose(output_file);
 
exit(0);
 
}
 
int main(int argc, char *argv[])
{
int sd, rc, n, cliLen,count;
struct sockaddr_in cliAddr, servAddr;
char msg[MAX_MSG];
 
if (argc < 2) {
printf("%s: Enter the output file name [%s filename]\n",argv[0],argv[0]);
exit(1);
}
 
// socket creation
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0) {
printf("%s: cannot open socket \n",argv[0]);
exit(1);
}
 
output_file = fopen(argv[1],"w+b");
if (output_file == NULL) {
printf("%s: Cannot open the file\n",argv[0]);
exit(1);
}
 
// bind local server port
servAddr.sin_family = AF_INET;
 
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(SERVER_PORT);
 
rc = bind (sd, (struct sockaddr *)&servAddr,sizeof(servAddr));
if(rc < 0) {
printf("%s: cannot bind port number %d \n",
argv[0], SERVER_PORT);
exit(1);
}
 
signal(SIGINT, close_and_exit);
 
count = 1;
miss = 0;
 
while(1) {
 
printf("Wait packet...\n");
 
// receive message
cliLen = sizeof(cliAddr);
n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *)&cliAddr, &cliLen);
 
if (n > 0) {
 
count++;
 
fwrite((void *)(msg),n,1,output_file);
}
 
}
 
fclose(output_file);
 
return 0;
 
}
 
/advdemos/tags/rel_1_5_beta1/chimera/linux.c
0,0 → 1,130
#include <stdio.h>
#include <math.h>
 
#define LEG_A 100.0
#define LEG_B 66.0
#define LEG_C 26.0
#define LEG_D 38.0
#define LEG_CD_2IPO 92.087 /* 2 * sqrt(LEG_C^2 + LEG_D^2) */
#define LEG_CD_ANG 0.600 /* arctg(LEG_C/LEG_D) in radianti */
 
#define PI 3.1415
 
const float c0 = LEG_C * LEG_C;
const float c1 = LEG_B * LEG_B;
const float c2 = LEG_B * LEG_B - LEG_A * LEG_A;
const float todeg = 180.0 / PI;
const float torad = PI / 180.0;
 
int leg_to_ang(float px, float py, float pz, int *alfa, int *beta, int *gamma)
{
float px2 = px * px;
float py2 = py * py;
float pz2 = pz * pz;
 
float pxz2 = px2 + pz2;
 
float alfa1,beta1,alfa2,beta2,gamma1,gamma2;
float m,dsqrt;
 
float delta_xz = pxz2 - c0;
float s,k,k2,y1,delta_xy;
 
if (delta_xz < 0.0) return -1;
 
if (pz >= LEG_C) {
gamma2 = acos((pz * LEG_C + px * sqrt(delta_xz)) / pxz2);
gamma1 = gamma2 * todeg;
} else {
gamma2 = -acos((pz * LEG_C + px * sqrt(delta_xz)) / pxz2);
gamma1 = gamma2 * todeg;
}
 
m = pxz2 - LEG_CD_2IPO * (px * cos(gamma2+LEG_CD_ANG) + pz * sin(gamma2+LEG_CD_ANG) - LEG_CD_2IPO/4);
 
printf("M = %f\n",sqrt(m));
 
s = m + py2;
k = c2 + s;
k2 = k * k;
delta_xy = py2 * k2 - s * (k2 - 4.0 * m * c1);
 
if (delta_xy >= 0.0) {
dsqrt = sqrt(delta_xy);
y1 = (py * k + dsqrt) / (2.0 * s);
beta1 = asin(y1/LEG_B) * todeg;
alfa1 = asin((y1 - py)/LEG_A) * todeg + beta1;
y1 = (py * k - dsqrt) / (2.0 * s);
beta2 = asin(y1/LEG_B) * todeg;
alfa2 = asin((y1 - py)/LEG_A) * todeg + beta2;
 
if ((alfa1 >= 0.0 && alfa1 <= 180.0) && (beta1 >= -90.0 && beta1 <= 90.0)) {
*alfa = (int)(alfa1 * 3600.0);
*beta = (int)(beta1 * 3600.0);
*gamma = (int)(gamma1 * 3600.0);
return 0;
} else if ((alfa2 >= 0.0 && alfa2 <= 180.0) && (beta2 >= -90.0 && beta2 <= 90.0)) {
*alfa = (int)(alfa2 * 3600.0);
*beta = (int)(beta2 * 3600.0);
*gamma = (int)(gamma1 * 3600.0);
return 0;
} else {
return -1;
}
} else
return -1;
 
return -1;
 
}
 
int ang_to_leg(int alfa, int beta, int gamma, float *px, float *py, float *pz) {
 
float alfa1 = (float)(alfa)/3600.0 * torad;
float beta1 = (float)(beta)/3600.0 * torad;
float sin_gamma = sin((float)(gamma)/3600.0 * torad);
float cos_gamma = cos((float)(gamma)/3600.0 * torad);
float m;
m = LEG_B * cos(beta1) + LEG_A * cos(alfa1 - beta1);
*py = LEG_B * sin(beta1) - LEG_A * sin(alfa1 - beta1);
 
*pz = (LEG_D + m) * sin_gamma + LEG_C * cos_gamma;
*px = (LEG_D + m) * cos_gamma - LEG_C * sin_gamma;
 
return 0;
 
}
 
int main() {
 
float px,py,pz;
int a,b,c;
 
while(1) {
 
printf("Insert PX: ");
scanf("%f",&px);
 
printf("Insert PY: ");
scanf("%f",&py);
 
printf("Insert PZ: ");
scanf("%f",&pz);
 
printf("PX: %3.3f PY: %3.3f PZ: %3.3f\n",px,py,pz);
 
if (leg_to_ang(px,py,pz,&a,&b,&c))
printf("Error leg position\n");
 
ang_to_leg(a,b,c,&px,&py,&pz);
 
printf(" A: %7d B: %7d C: %7d\n",a/3600,b/3600,c/3600);
printf("PX: %.3f PY: %.3f PZ: %.3f\n",px,py,pz);
 
}
 
return 0;
 
}
/advdemos/tags/rel_1_5_beta1/chimera/list.c
0,0 → 1,87
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
 
#define READ_BUFFER 2000
#define DELTA_BUFFER 100
 
int main(int argc, char *argv[])
{
 
char buffer[READ_BUFFER+DELTA_BUFFER];
void *p, *last;
int n,delta,size;
 
unsigned long long ev = 0;
 
FILE *input_file;
if (argc < 2) {
printf("%s: Enter the input file name [%s filename]\n",argv[0],argv[0]);
exit(1);
}
 
input_file = fopen(argv[1],"rb");
 
last = buffer + READ_BUFFER;
 
while(!feof(input_file)) {
//move remaining byte
delta = (unsigned int)(buffer) + READ_BUFFER - (unsigned int)(last);
if (delta > 0) memcpy(buffer,last,delta);
 
n = fread(buffer+delta,1,READ_BUFFER+10,input_file);
fseek(input_file,-(delta+10),SEEK_CUR);
 
p = buffer;
 
while ((unsigned int)(p) + 16 <= (unsigned int)(buffer + READ_BUFFER) &&
(unsigned int)(p) + 16 <= (unsigned int)(buffer + n + delta)) {
 
printf("Sensor = %02x ",(*(unsigned int *)(p) & 0xFF));
 
printf("Current = %8d ",*(unsigned int *)(p+4));
printf("TIME = %8d:%8d\n",*(unsigned int *)(p+8),*(unsigned int *)(p+12));
 
size = 16;
 
ev++;
p += 16;
 
if ((unsigned int)(p) + 10 > (unsigned int)(buffer + n + delta)) break;
 
last = p;
}
 
if ((unsigned int)(p) + 10 > (unsigned int)(buffer + n + delta)) break;
}
 
fclose(input_file);
 
return 0;
 
}
 
/advdemos/tags/rel_1_5_beta1/chimera/action.c
0,0 → 1,161
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "chimera.h"
 
struct action_event *first_action_event = NULL;
struct action_event *action_event_list;
int total_events = 0;
 
int get_free_slot();
 
int init_action_event(int number_of_events) {
 
action_event_list = malloc(number_of_events * sizeof(struct action_event));
memset(action_event_list,0,number_of_events * sizeof(struct action_event));
total_events = number_of_events;
 
if (action_event_list != NULL) return 0;
 
total_events = 0;
return -1;
 
}
 
int insert_action_event(struct action_event *e) {
 
struct action_event *t = first_action_event, *k = NULL;
int free;
 
SYS_FLAGS f;
 
f = kern_fsave();
 
free = get_free_slot();
 
if (free != -1) {
memcpy(&(action_event_list[free]),e,sizeof(struct action_event));
e = &(action_event_list[free]);
 
} else {
 
return -1;
 
}
 
e->status = EVT_STATUS_WAIT;
 
if (!t) {
first_action_event = e;
e->next = NULL;
kern_frestore(f);
return 0;
}
 
while(t) {
if (TIMESPEC_A_LT_B(&e->time,&t->time))
break;
k = t;
t = t->next;
}
 
t = k->next;
k->next = e;
e->next = t;
 
t = first_action_event;
 
kern_frestore(f);
 
return free;
 
}
 
int delete_action_event(int event) {
struct action_event *t = first_action_event;
struct action_event *e = &(action_event_list[event]);
SYS_FLAGS f;
if ((!t || !e) && (e->status != EVT_STATUS_FREE)) return -1;
f = kern_fsave();
if (t == e) {
 
first_action_event = t->next;
e->status = EVT_STATUS_FREE;
kern_frestore(f);
return 0;
 
}
while(t) {
if (t->next == e)
break;
t = t->next;
}
if (t) {
t->next = e->next;
e->status = EVT_STATUS_FREE;
kern_frestore(f);
return 0;
}
kern_frestore(f);
return -1;
}
 
int get_free_slot() {
 
int k = 0;
 
while (k < total_events) {
 
if (action_event_list[k].status == EVT_STATUS_FREE ||
action_event_list[k].status == EVT_STATUS_DONE)
return k;
k++;
 
}
 
return -1;
 
}
 
struct action_event * get_first_old_event(struct timespec *time) {
 
struct action_event *t = first_action_event;
SYS_FLAGS f;
 
if (!t) return NULL;
 
f = kern_fsave();
 
if (TIMESPEC_A_GT_B(time,&(t->time))) {
first_action_event = t->next;
t->status = EVT_STATUS_EXEC;
kern_frestore(f);
return t;
}
 
kern_frestore(f);
return NULL;
 
}
/advdemos/tags/rel_1_5_beta1/chimera/initfile.c
0,0 → 1,166
/*
* Project: S.Ha.R.K
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
#include "kernel/kern.h"
#include "edf/edf/edf.h"
#include "cbs/cbs/cbs.h"
#include "rr/rr/rr.h"
#include "dummy/dummy/dummy.h"
#include "intdrive/intdrive/intdrive.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
 
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
#include "srp/srp/srp.h"
#include "npp/npp/npp.h"
#include "nop/nop/nop.h"
 
#include <drivers/shark_linuxc26.h>
#include <drivers/shark_input26.h>
#include <drivers/shark_pci26.h>
#include <drivers/shark_cpu26.h>
#include <drivers/shark_keyb26.h>
 
#define FRAME_BUFFER_DEVICE 0
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
/*+ Interrupt Server +*/
#define INTDRIVE_Q 1000
#define INTDRIVE_T 10000
#define INTDRIVE_FLAG 0
 
void call_shutdown_task(void *arg);
int device_drivers_init();
int device_drivers_close();
void set_shutdown_task();
TASK shutdown_task_body(void *arg);
 
PID shutdown_task_PID = -1;
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG);
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 1);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
PI_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
/* Create the shutdown task. It will be activated at RUNLEVEL
SHUTDOWN */
set_shutdown_task();
 
/* Init the drivers */
device_drivers_init();
 
/* Set the shutdown task activation */
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN);
 
__call_main__(mb);
 
return (void *)0;
}
 
void set_shutdown_task() {
 
/* WARNING: the shutdown task is a background thread. It cannot execute
if the system is overloaded */
NRT_TASK_MODEL nrt;
 
nrt_task_default_model(nrt);
nrt_task_def_system(nrt);
 
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL);
if (shutdown_task_PID == NIL) {
sys_shutdown_message("Error: Cannot create shutdown task\n");
exit(1);
}
 
}
 
int device_drivers_init() {
 
KEYB_PARMS kparms = BASE_KEYB;
LINUXC26_register_module();
 
PCI26_init();
 
CPU26_init();
 
CPU26_DVS_init();
 
INPUT26_init();
 
keyb_def_ctrlC(kparms, NULL);
 
KEYB26_init(&kparms);
 
return 0;
 
}
 
int device_drivers_close() {
KEYB26_close();
INPUT26_close();
return 0;
}
 
#define SHUTDOWN_TIMEOUT_SEC 3
 
void call_shutdown_task(void *arg)
{
struct timespec t;
 
sys_gettime(&t);
t.tv_sec += SHUTDOWN_TIMEOUT_SEC;
 
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0);
 
task_activate(shutdown_task_PID);
}
 
TASK shutdown_task_body(void *arg) {
 
device_drivers_close();
 
sys_shutdown_message("-- S.Ha.R.K. Closed --\n");
 
return NULL;
 
}
/advdemos/tags/rel_1_5_beta1/chimera/chimera.h
0,0 → 1,115
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <kernel/kern.h>
#include <kernel/func.h>
#include <semaphore.h>
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
#include <drivers/shark_keyb26.h>
 
#include <servo.h>
//#include <drivers/udpip.h>
 
/* COM Port Constants */
#define COM_PORT COM1
#define COM_SPEED 115200
 
#define com(i) ((i) / 12) ? COM1 : COM2
#define pin(i) (i) % 12
 
/* Angle bounds */
#define POS_X_MIN 0
#define POS_X_MAX 200
#define POS_Y_MIN -200
#define POS_Y_MAX 200
#define POS_Z_MIN -150
#define POS_Z_MAX 150
 
typedef struct {
int adc_in;
unsigned char pwm;
} LEG_CFG_STATE;
 
typedef struct { /*describe the position of leg*/
int x;
int y;
int z;
} LEG_POS_STATE;
 
typedef struct { /*describe the servo angles*/
int a;
int b;
int c;
} LEG_ANG_STATE;
 
typedef struct {
LEG_CFG_STATE cfg[6];
LEG_ANG_STATE ang[6];
char power;
} HEXAPOD_STATE;
 
/*****************************************/
 
#define EVT_SET_MASK_LEG_ANGLE 0x01
 
#define EVT_STATUS_FREE 0x00
#define EVT_STATUS_WAIT 0x01
#define EVT_STATUS_EXEC 0x02
#define EVT_STATUS_DONE 0x03
 
struct action_event {
 
unsigned char type;
unsigned char status;
struct timespec time;
unsigned char mask;
LEG_ANG_STATE ang; //Servo angle data
unsigned char pwm;
struct action_event *next;
 
};
 
struct action_event *get_first_old_event(struct timespec *time);
 
extern sem_t mx_status;
extern HEXAPOD_STATE status;
 
void init_send(void);
void end_send(void);
 
void init_key(void);
 
/* Calibration */
 
void calibrate_init(void);
void calibrate_step(int step);
int adjust(int angle_sec, int leg, int num);
 
/* Actions */
 
int init_action_event(int number_of_events);
int insert_action_event(struct action_event *e);
int delete_action_event(int event);
struct action_event * get_first_old_event(struct timespec *time);
 
/* Tracer */
 
int trace_init(int buffer_size);
int trace_consumption(int sensor, int value);
int trace_send();
 
/advdemos/tags/rel_1_5_beta1/chimera/calibrate.c
0,0 → 1,188
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "chimera.h"
#include <ll/i386/64bit.h>
 
volatile int calibrate_status = 0;
volatile int calibrate_exec_step = 0;
 
extern HEXAPOD_STATE status;
extern unsigned char active_leg;
 
struct leg_calibration {
int side;
int pos[6];
int delta_90[3];
int zero[3];
};
 
struct leg_calibration calibration_table[] = {
{1,{0,90,-45,45,-90,0},{432001,403201,432001},{-201600,28800,241201}},
{-1,{0,90,-45,45,-90,0},{413949,453599,431999},{216000,50401,-215599}},
{1,{0,90,-45,45,-45,45},{417601,388801,424741},{-216000,-43200,82770}},
{-1,{0,90,-45,45,-45,45},{421199,421199,443799},{165600,-8999,30600}},
{1,{0,90,-45,45,0,90},{414001,424801,410401},{-162000,39600,-122400}},
{-1,{0,90,-45,45,0,90},{410399,446399,399599},{154800,-3599,108000}},
};
 
int adjust(int angle_sec, int leg, int num) {
 
int temp;
 
smul32div32to32(angle_sec,calibration_table[leg].delta_90[num],324000,temp);
 
return calibration_table[leg].side * temp + calibration_table[leg].zero[num];
}
 
TASK calibrate(void *arg) {
 
int i, num = 0, angsec = 0, angsec_temp[6];
static int test_angle[20],set,turn_on,servo_count;
char servo_name[10];
 
for (i=0;i<20;i++) test_angle[i] = 0;
 
clear();
servo_turn_off(com(active_leg*3), pin(active_leg*3));
servo_turn_off(com(active_leg*3+1), pin(active_leg*3+1));
servo_turn_off(com(active_leg*3+2), pin(active_leg*3+2));
 
servo_count = 0;
servo_turn_on(com(active_leg*3), pin(active_leg*3));
turn_on = 0;
 
while (calibrate_status == 1) {
 
if (calibrate_exec_step == 100000) {
angsec_temp[servo_count] = test_angle[3*active_leg+num];
printf_xy(0,10+servo_count,WHITE,"%08d",test_angle[3*active_leg+num]);
servo_turn_off(com(3*active_leg+num),pin(3*active_leg+num));
servo_count++;
 
if (servo_count == 6) {
 
for (i=0;i<3;i++) {
calibration_table[active_leg].delta_90[i] = abs(angsec_temp[2*i+1] - angsec_temp[2*i] + 1);
calibration_table[active_leg].zero[i] = calibration_table[active_leg].side * abs(calibration_table[active_leg].pos[2*i] * calibration_table[active_leg].delta_90[i] / 90) + angsec_temp[2*i];
 
printf_xy(22*i,22,WHITE,"D%d %7d Z%d %7d",
i,calibration_table[active_leg].delta_90[i],
i,calibration_table[active_leg].zero[i]);
 
}
 
calibrate_status = 0;
calibrate_exec_step = 0;
 
task_kill(exec_shadow);
task_testcancel();
 
}
 
turn_on = 1;
 
calibrate_exec_step = 0;
 
}
 
switch (servo_count) {
case 0:
case 1:
sprintf(servo_name,"ALFA ");
num = 0;
break;
case 2:
case 3:
sprintf(servo_name,"BETA ");
num = 1;
break;
case 4:
case 5:
sprintf(servo_name,"GAMMA");
num = 2;
break;
}
 
if (turn_on == 1) {
servo_turn_on(com(3*active_leg+num),pin(3*active_leg+num));
turn_on = 0;
}
 
set = calibration_table[active_leg].pos[servo_count];
printf_xy(10,10+servo_count,WHITE,"Set servo %s to position %d",servo_name,set);
servo_turn_on(com(3*active_leg+num),pin(3*active_leg+num));
 
if (calibrate_exec_step != 0) {
test_angle[3*active_leg+num] += calibrate_exec_step;
printf_xy(10,20,WHITE,"Set %08d to servo %03d",test_angle[3*active_leg+num],3*active_leg+num);
servo_set_angle_sec(com(3*active_leg+num), pin(3*active_leg+num), test_angle[3*active_leg+num]);
 
calibrate_exec_step = 0;
 
}
 
angsec = servo_get_angle_sec(com(3*active_leg+num), pin(3*active_leg+num));
printf_xy(10,21,WHITE,"Angle Seconds = %08d",angsec);
 
task_endcycle();
 
}
 
return 0;
 
}
 
void calibrate_init() {
 
SOFT_TASK_MODEL st;
PID st_pid;
 
if (calibrate_status == 0) {
calibrate_status = 1;
 
soft_task_default_model(st);
soft_task_def_period(st,300000);
soft_task_def_met(st,30000);
soft_task_def_usemath(st);
soft_task_def_ctrl_jet(st);
 
st_pid = task_create("Calibration task",calibrate,&st,NULL);
if (st_pid == NIL) {
cprintf("Error creating calibration task\n");
exit(1);
}
 
task_activate(st_pid);
 
} else {
return;
}
}
 
void calibrate_step(int step) {
 
if (calibrate_status != 0 && calibrate_exec_step == 0) {
 
calibrate_exec_step = step;
 
}
 
}
/advdemos/tags/rel_1_5_beta1/chimera/chimera.c
0,0 → 1,285
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "chimera.h"
 
#define POS_B_REF 0
#define POS_B_UP 50
 
int vel_dx = 15;
int vel_sx = 15;
 
void program_key_end(KEY_EVT* e)
{
 
int i;
TIME tmp;
 
end_send();
 
for (i=3; i<MAX_PROC; i++){
if (!jet_getstat(i, NULL, &tmp, NULL, NULL))
kern_printf("Task Name : %s - Max Time : %d\n", proc_table[i].name, (int)tmp);
}
 
exit(1);
 
}
 
int beta = 30;
 
void action_stand_up(void) {
struct action_event e;
int event,alfa;
status.power = 1;
 
kern_gettime(&(e.time));
 
for (alfa=0;alfa<=90;alfa+=15) {
 
ADDUSEC2TIMESPEC(5000000,&(e.time));
e.type = EVT_SET_MASK_LEG_ANGLE;
e.mask = 0x3F;
e.ang.a = alfa * 3600;
e.ang.b = beta * 3600;
e.ang.c = 0 * 3600;
e.pwm = 7;
event = insert_action_event(&(e));
cprintf("Event num = %d\n",event);
 
}
 
}
 
TASK walk_auto_6()
{
short i, n = 0;
int vd, vs, auto_count = 0;
int pos_a[6], pos_b[6], pos_c[6];
struct action_event e;
 
float fake_sin[36] = { .00, .50, .80, 1.0, .80, .50, .00, .00, .00, .00, .00, .00,
.00, .00, .00, .00, .00, .00, .00, .00, .00, .00, .00, .00,
.00, .00, .00, .00, .00, .00, .00, .00, .00, .00, .00, .00};
 
float fake_cos[36] = {-1.0,-.75,-.50, .00, .50, .75, 1.0, .93, .86, .80, .73, .66,
.60, .53, .46, .40, .33, .26, .20, .13, .06, .00,-.06, .13,
-.20,-.26,-.33,-.40,-.46,-.53,-.60,-.66,-.73,-.80,-.86,-.93};
 
while (1) {
vd = vel_dx;
vs = vel_sx;
 
kern_gettime(&(e.time));
ADDUSEC2TIMESPEC(10000,&(e.time));
for (i = 0; i<6; i++) {
switch(i) {
case 0:
n = 0;
break;
case 1:
n = 3;
break;
case 2:
n = 4;
break;
case 3:
n = 1;
break;
case 4:
n = 2;
break;
case 5:
n = 5;
break;
}
if (i%3)
pos_c[i] = vd * fake_cos[(auto_count+6*n)%36];
else
pos_c[i] = vs * fake_cos[(auto_count+6*n)%36];
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[(auto_count+6*n)%36] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
 
e.type = EVT_SET_MASK_LEG_ANGLE;
e.mask = 1 << i;
e.ang.a = (80) * 3600;
e.ang.b = (pos_b[i]) * 3600;
e.ang.c = (pos_c[i]) * 3600;
e.pwm = 7;
insert_action_event(&(e));
}
auto_count++;
if (auto_count > 35) auto_count = 0;
 
task_testcancel();
task_endcycle();
}
return 0;
}
 
TASK walk_auto_3()
{
short i;
int vd, vs, auto_count = 0;
float cos_a;
int pos_a[6], pos_b[6], pos_c[6];
 
struct action_event e;
 
 
float fake_cos[32] = { 1.0000, .99518, .98079, .95694, .92388, .88192, .83147, .77301,
.70711, .63439, .55557, .47140, .38268, .29028, .19509, .09802,
.00000,-.09802,-.19509,-.29028,-.38268,-.47140,-.55557,-.63439,
-.70711,-.77301,-.83147,-.88192,-.92388,-.95694,-.98079,-.99518};
float fake_sin[64] = { -0.50, -0.45, -0.40, -0.30, -0.20, -0.15, -0.10, -0.05,
0.00, 0.00, 0.40, 0.40, 0.70, 0.70, 0.90, 0.90,
1.00, 1.00, 0.90, 0.90, 0.70, 0.70, 0.40, 0.40,
0.00, 0.00, -0.05, -0.10, -0.15, -0.20, -0.30, -0.40,
-0.45, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50,
-0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50,
-0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50,
-0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50, -0.50 };
 
while (1) {
cos_a = (auto_count < 32) ? fake_cos[auto_count] : -fake_cos[auto_count-32];
 
vd = vel_dx;
vs = vel_sx;
 
kern_gettime(&(e.time));
ADDUSEC2TIMESPEC(10000,&(e.time));
for (i = 0; i<6; i++) {
switch (i) {
case 0:
/* Leg 0 */
pos_c[i] = vs * cos_a;
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[(auto_count+32)%64] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
break;
case 1:
/* Leg 1 */
pos_c[i] = -vd * cos_a;
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[auto_count] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
break;
case 2:
/* Leg 2 */
pos_c[i] = -vs * cos_a;
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[auto_count] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
break;
case 3:
/* Leg 3 */
pos_c[i] = vd * cos_a;
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[(auto_count+32)%64] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
break;
case 4:
/* Leg 4 */
pos_c[i] = vs * cos_a;
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[(auto_count+32)%64] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
break;
case 5:
/* Leg 5 */
pos_c[i] = -vd * cos_a;
if ((vs) || (vd))
pos_b[i] = POS_B_REF + fake_sin[auto_count] * POS_B_UP;
else
pos_b[i] = POS_B_REF;
break;
}
 
e.type = EVT_SET_MASK_LEG_ANGLE;
e.mask = 1 << i;
e.ang.a = (80) * 3600;
e.ang.b = (pos_b[i]) * 3600;
e.ang.c = (pos_c[i]) * 3600;
e.pwm = 7;
insert_action_event(&(e));
}
 
auto_count += 4;
if (auto_count > 63) auto_count = 0;
 
task_testcancel();
task_endcycle();
}
return 0;
}
 
void action_walk(void) {
HARD_TASK_MODEL ms;
PID pid_walk;
hard_task_default_model(ms);
hard_task_def_ctrl_jet(ms);
hard_task_def_wcet(ms, 1000);
hard_task_def_mit(ms, 60000);
hard_task_def_usemath(ms);
pid_walk = task_create("Walk_Task", walk_auto_3, &ms, NULL);
if (pid_walk == NIL) {
perror("Could not create task <Walk_Auto>");
exit(1);
} else
task_activate(pid_walk);
}
 
int main(int argc, char **argv)
{
TIME seme;
KEY_EVT k;
 
seme = sys_gettime(NULL);
srand(seme);
 
k.flag = ALTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
k.status = KEY_PRESSED;
keyb_hook(k,program_key_end,FALSE);
 
clear();
 
init_send(); /* Comunication */
init_key(); /* Keyboard */
 
init_action_event(100);
 
action_walk();
//action_stand_up();
 
return 0;
 
}
/advdemos/tags/rel_1_5_beta1/chimera/send.c
0,0 → 1,303
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "chimera.h"
 
//#define DEBUG_SEND /* Print Sent Values */
#define SERIAL_ON /* Send Data using Serial Port */
 
/* Servo Tasks Constants */
#ifdef DUBUG_SEND
#define SEND_TASK_WCET 10000
#else
#define SEND_TASK_WCET 10000
#endif
#define SEND_TASK_MIT 30000
 
#define LEG_A 100.0
#define LEG_B 66.0
#define LEG_C 26.0
#define LEG_D 38.0
#define LEG_CD_2IPO 92.087 /* 2 * sqrt(LEG_C^2 + LEG_D^2) */
#define LEG_CD_ANG 0.600 /* arctg(LEG_C/LEG_D) in radianti */
 
const float c0 = LEG_C * LEG_C;
const float c1 = LEG_B * LEG_B;
const float c2 = LEG_B * LEG_B - LEG_A * LEG_A;
const float todeg = 180.0 / PI;
const float torad = PI / 180.0;
 
HEXAPOD_STATE status;
 
extern struct leg_calibration calibration_table[];
 
int leg_to_ang(float px, float py, float pz, int *alfa, int *beta, int *gamma)
{
float px2 = px * px;
float py2 = py * py;
float pz2 = pz * pz;
 
float pxz2 = px2 + pz2;
 
float alfa1,beta1,alfa2,beta2,gamma1,gamma2;
float m,dsqrt;
 
float delta_xz = pxz2 - c0;
float s,k,k2,y1,delta_xy;
 
if (delta_xz < 0.0) return -1;
 
if (pz >= LEG_C) {
gamma2 = acos((pz * LEG_C + px * sqrt(delta_xz)) / pxz2);
gamma1 = gamma2 * todeg;
} else {
gamma2 = -acos((pz * LEG_C + px * sqrt(delta_xz)) / pxz2);
gamma1 = gamma2 * todeg;
}
 
m = pxz2 - LEG_CD_2IPO * (pz * sin(gamma2+LEG_CD_ANG) + px * cos(gamma2+LEG_CD_ANG) - LEG_CD_2IPO / 4.0);
 
s = m + py2;
k = c2 + s;
k2 = k * k;
delta_xy = py2 * k2 - s * (k2 - 4.0 * m * c1);
 
if (delta_xy >= 0.0) {
dsqrt = sqrt(delta_xy);
y1 = (py * k + dsqrt) / (2.0 * s);
beta1 = asin(y1/LEG_B) * todeg;
alfa1 = asin((y1 - py)/LEG_A) * todeg + beta1;
y1 = (py * k - dsqrt) / (2.0 * s);
beta2 = asin(y1/LEG_B) * todeg;
alfa2 = asin((y1 - py)/LEG_A) * todeg + beta2;
 
if ((alfa1 >= 0.0 && alfa1 <= 180.0) && (beta1 >= -90.0 && beta1 <= 90.0)) {
*alfa = (int)(alfa1 * 3600.0);
*beta = (int)(beta1 * 3600.0);
*gamma = (int)(gamma1 * 3600.0);
return 0;
} else if ((alfa2 >= 0.0 && alfa2 <= 180.0) && (beta2 >= -90.0 && beta2 <= 90.0)) {
*alfa = (int)(alfa2 * 3600.0);
*beta = (int)(beta2 * 3600.0);
*gamma = (int)(gamma1 * 3600.0);
return 0;
} else {
return -1;
}
} else
return -1;
 
return -1;
 
}
 
int ang_to_leg(int alfa, int beta, int gamma, float *px, float *py, float *pz) {
 
float alfa1 = (float)(alfa)/3600.0 * torad;
float beta1 = (float)(beta)/3600.0 * torad;
float sin_gamma = sin((float)(gamma)/3600.0 * torad);
float cos_gamma = cos((float)(gamma)/3600.0 * torad);
float m;
m = LEG_B * cos(beta1) + LEG_A * cos(alfa1 - beta1);
*py = LEG_B * sin(beta1) - LEG_A * sin(alfa1 - beta1);
 
*pz = (LEG_D + m) * sin_gamma + LEG_C * cos_gamma;
*px = (LEG_D + m) * cos_gamma - LEG_C * sin_gamma;
 
return 0;
 
}
 
void update_event_action(void) {
 
struct timespec t;
struct action_event *e;
int i;
 
kern_gettime(&t);
 
while ((e = get_first_old_event(&t)) != NULL) {
 
if (e->type == EVT_SET_MASK_LEG_ANGLE) {
 
for (i=0;i<6;i++)
if ((e->mask >> i) & 1) {
 
status.ang[i].a = e->ang.a;
status.ang[i].b = e->ang.b;
status.ang[i].c = e->ang.c;
 
status.cfg[i].pwm = e->pwm;
 
#ifdef DEBUG_SEND
printf_xy(3,2,WHITE,"%8d: Update leg %2d angle",(int)kern_gettime(NULL),i);
#endif
 
 
}
 
e->status = EVT_STATUS_DONE;
 
}
 
}
 
}
 
TASK servo_send()
{
HEXAPOD_STATE old_status;
register char new_pos, new_pwm, new_power;
int res,n;
 
for (n=0; n<6;n++) {
old_status.ang[n].a = 0;
old_status.ang[n].b = 0;
old_status.ang[n].c = 0;
old_status.cfg[n].pwm = 0;
}
old_status.power = 0;
 
while (1) {
new_pos = 0;
new_pwm = 0;
new_power = 0;
 
update_event_action();
 
if (status.power != old_status.power) {
#ifdef SERIAL_ON
if (old_status.power) {
servo_set_RC5_switch(COM2, 1);
} else {
servo_set_RC5_switch(COM2, 0);
}
old_status.power = status.power;
#endif
}
 
for (n=0; n<6; n++){
 
if ((status.ang[n].a != old_status.ang[n].a) ||
(status.ang[n].b != old_status.ang[n].b) ||
(status.ang[n].c != old_status.ang[n].c)) {
old_status.ang[n].a = status.ang[n].a;
old_status.ang[n].b = status.ang[n].b;
old_status.ang[n].c = status.ang[n].c;
new_pos += 1 << n;
}
 
if (status.cfg[n].pwm != old_status.cfg[n].pwm) {
old_status.cfg[n].pwm = status.cfg[n].pwm;
new_pwm += 1 << n;
}
if (new_pos && (1<<n)) {
#ifdef SERIAL_ON
res = servo_set_angle_sec(com(n*3 ), pin(n*3 ), adjust(status.ang[n].a,n,0));
if (res != 0) cprintf("Error send data\n");
 
res = servo_set_angle_sec(com(n*3+1), pin(n*3+1), adjust(status.ang[n].b,n,1));
if (res != 0) cprintf("Error send data\n");
 
res = servo_set_angle_sec(com(n*3+2), pin(n*3+2), adjust(status.ang[n].c,n,2));
if (res != 0) cprintf("Error send data\n");
#endif
 
}
if (new_pwm && (1<<n)) {
#ifdef SERIAL_ON
(old_status.cfg[n].pwm & 1) ? servo_turn_on(com(n*3 ), pin(n*3 )) : servo_turn_off(com(n*3 ), pin(n*3 ));
 
(old_status.cfg[n].pwm & 2) ? servo_turn_on(com(n*3+1), pin(n*3+1)) : servo_turn_off(com(n*3+1), pin(n*3+1));
 
(old_status.cfg[n].pwm & 4) ? servo_turn_on(com(n*3+2), pin(n*3+2)) : servo_turn_off(com(n*3+2), pin(n*3+2));
#endif
 
}
 
}
 
task_endcycle();
task_testcancel();
}
return 0;
}
 
int init_serial()
{
int err;
err = servo_open(COM1, COM_SPEED);
if (!err)
err = servo_open(COM2, COM_SPEED);
 
return err;
}
 
void end_serial()
{
servo_close(COM1);
servo_close(COM2);
}
 
PID servo_pid;
 
void init_send_task()
{
HARD_TASK_MODEL ms;
 
hard_task_default_model(ms);
hard_task_def_ctrl_jet(ms);
hard_task_def_wcet(ms, SEND_TASK_WCET);
hard_task_def_mit(ms, SEND_TASK_MIT);
hard_task_def_usemath(ms);
servo_pid = task_create("Servo_Task", servo_send, &ms, NULL);
if (servo_pid == NIL) {
perror("Could not create task <Send_Task>");
exit(1);
} else
task_activate(servo_pid);
 
}
 
void init_send()
{
int i;
 
if (init_serial()) {
perror("Could not initialize serial port.");
exit(1);
}
 
for (i=0; i<6;i++) {
status.ang[i].a = 0;
status.ang[i].b = 0;
status.ang[i].c = 0;
status.cfg[i].pwm = 0;
}
status.power = 0;
 
init_send_task();
 
}
 
void end_send()
{
task_kill(servo_pid);
 
end_serial();
}
/advdemos/tags/rel_1_5_beta1/chimera/keys.c
0,0 → 1,223
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "chimera.h"
 
unsigned char active_leg;
 
extern volatile int calibrate_status;
 
void pad(KEY_EVT *k)
{
switch (k->scan) {
case KEY_Z:
status.power ^= 1;
break;
case KEY_Q:
status.cfg[active_leg].pwm ^= 0x1;
break;
case KEY_W:
status.cfg[active_leg].pwm ^= 0x2;
break;
case KEY_E:
status.cfg[active_leg].pwm ^= 0x4;
break;
case KEY_1:
active_leg = 0;
break;
case KEY_2:
active_leg = 1;
break;
case KEY_3:
active_leg = 2;
break;
case KEY_4:
active_leg = 3;
break;
case KEY_5:
active_leg = 4;
break;
case KEY_6:
active_leg = 5;
break;
case KEY_C:
if (calibrate_status != 0) calibrate_step(100000);
else calibrate_init();
break;
 
case KEY_A:
calibrate_step(-108000);
break;
case KEY_S:
calibrate_step(-3600);
break;
case KEY_D:
calibrate_step(-60);
break;
case KEY_F:
calibrate_step(+60);
break;
case KEY_G:
calibrate_step(+3600);
break;
case KEY_H:
calibrate_step(+108000);
break;
}
}
 
void init_key()
{
KEY_EVT k;
 
k.flag = 0;
k.scan = KEY_1;
k.ascii = '1';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_2;
k.ascii = '2';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_3;
k.ascii = '3';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_4;
k.ascii = '4';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_5;
k.ascii = '5';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_6;
k.ascii = '6';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_J;
k.ascii = 'j';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_K;
k.ascii = 'k';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_L;
k.ascii = 'l';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_U;
k.ascii = 'u';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_I;
k.ascii = 'i';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_O;
k.ascii = 'o';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_Q;
k.ascii = 'q';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
k.flag = 0;
k.scan = KEY_W;
k.ascii = 'w';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
k.flag = 0;
k.scan = KEY_E;
k.ascii = 'e';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
k.flag = 0;
k.scan = KEY_Z;
k.ascii = 'z';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
 
k.flag = 0;
k.scan = KEY_C;
k.ascii = 'c';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_A;
k.ascii = 'a';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_S;
k.ascii = 's';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_D;
k.ascii = 'd';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
k.flag = 0;
k.scan = KEY_F;
k.ascii = 'f';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
 
k.flag = 0;
k.scan = KEY_G;
k.ascii = 'g';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
k.flag = 0;
k.scan = KEY_H;
k.ascii = 'h';
k.status = KEY_PRESSED;
keyb_hook(k,pad,FALSE);
}
/advdemos/tags/rel_1_5_beta1/chimera/makefile
0,0 → 1,24
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= chimera
 
include $(BASE)/config/example.mk
 
chimera:
make -f $(SUBMAKE) APP=chimera INIT= OTHEROBJS="initfile.o calibrate.o send.o action.o keys.o" SHARKOPT="__LINUXC26__ __PCI__ __CPU__ __INPUT__ __SERVO__ __NET__"
 
udpdump: udpdump.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/oslib udpdump.c -o udpdump
 
list: list.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/include/trace -I$(BASE)/oslib list.c -o list
 
/advdemos/tags/rel_1_5_beta1/block/common.c
0,0 → 1,74
 
#include <kernel/func.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
 
#include <sys/mount.h>
 
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
 
/* -- */
 
int __register_sub_init(void)
{
return 0;
}
 
/* -- */
 
int __bdev_sub_init(void)
{
BDEV_PARMS bdev=BASE_BDEV;
bdev_def_showinfo(bdev,TRUE);
bdev_init(&bdev);
 
return 0;
}
 
/* -- */
 
void ctrlc_exit(KEY_EVT *k)
{
cprintf("CTRL-C pressed!\n");
exit(1);
}
 
/* -- */
 
void showmessage(char *s)
{
cputs(s);
cprintf("Press [x] to begin...");
while (keyb_getchar()!='x');
cprintf("\n");
}
 
void waitend(void)
{
int c;
cprintf("Press [x] to exit...");
while ((c=keyb_getchar())!='x');
cprintf("\n");
}
 
/* -- */
 
void debug_dump_buffer(char *buf, int size)
{
int i;
for (i=0;i<size;i++) {
if (i%16==0) {
if (i!=0) cprintf("\n");
cprintf("%04x: ",i);
}
cprintf("%02x ",(unsigned char)*(buf+i));
}
cprintf("\n");
}
/advdemos/tags/rel_1_5_beta1/block/initblk.c
0,0 → 1,113
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: initblk.c,v 1.2 2005-02-26 10:57:27 pj Exp $
*
* File: $File$
* Revision: $Revision: 1.2 $
* Last update: $Date: 2005-02-26 10:57:27 $
*/
 
#include "kernel/kern.h"
#include "edf/edf/edf.h"
#include "rr/rr/rr.h"
#include "cbs/cbs/cbs.h"
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
#include "srp/srp/srp.h"
#include "npp/npp/npp.h"
#include "nop/nop/nop.h"
#include "nopm/nopm/nopm.h"
 
#include "drivers/keyb.h"
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
extern int __register_sub_init(void);
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
CBS_register_level(CBS_ENABLE_ALL, 0);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
NOPM_register_module();
 
__register_sub_init();
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
KEYB_PARMS keyb = BASE_KEYB;
extern int __bdev_sub_init(void);
extern void ctrlc_exit(KEY_EVT *k);
HARTPORT_init();
keyb_def_ctrlC(keyb, ctrlc_exit);
KEYB_init(&keyb);
 
__bdev_sub_init();
__call_main__(mb);
 
return (void *)0;
}
/advdemos/tags/rel_1_5_beta1/block/idetest0.c
0,0 → 1,15
/*
*
*
*
*/
 
#include <fs/bdev.h>
 
#include "common.h"
 
int main(int argc,char *argv[])
{
showmessage("Have ide devices been found?\n");
return 0;
}
/advdemos/tags/rel_1_5_beta1/block/idetest1.c
0,0 → 1,20
/*
*
*
*
*/
 
#include <fs/bdev.h>
 
#include "common.h"
 
int main(int argc,char *argv[])
{
 
showmessage("This test try to identify the partions of all hard disks\n");
bdev_dump_names();
 
waitend();
return 0;
}
/advdemos/tags/rel_1_5_beta1/block/idetest2.c
0,0 → 1,77
/*
*
*
*
*/
 
#include <ll/i386/cons.h>
#include <drivers/keyb.h>
 
#include <fs/bdevinit.h>
#include <fs/bdev.h>
 
#include <string.h>
 
#include "common.h"
 
#define DISKDEVICE "ide/hda1"
 
__uint8_t buffer[2048] __attribute__ ((aligned (4)));
__dev_t dev;
 
extern char *ide_error_msg[];
 
int main(int argc,char *argv[])
{
__blkcnt_t blk;
int res;
int c;
 
showmessage("This test try to read some blocks from first hard disk\n");
 
dev=bdev_find_byname(DISKDEVICE);
if (dev<0) {
cprintf("Can't find device to operate with\n");
return -1;
}
cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
 
blk=0;
for (;;) {
cprintf("Commands: x-exit r-read n-next block p-prev block\n");
c = keyb_getchar();
switch(c) {
case 'x':
return 0;
 
case 'n':
blk++;
cprintf("Block %li\n",(long)blk);
break;
 
case 'p':
if (blk>=0) blk--;
cprintf("Block %li\n",(long)blk);
break;
case 'r':
cprintf("Reading block %li...\n",(long)blk);
memset(buffer,0xff,sizeof(buffer));
res=bdev_read(dev,blk,buffer);
cprintf("Result %i\n",res);
//cprintf("Soft reset done %i\n",ide[0].errors);
if (res!=0) {
cprintf(" %s\n",(char*)ide_error_msg[-res]);
}
debug_dump_buffer(buffer,64);
break;
 
default:
cprintf("Invalid command!\n");
break;
}
cprintf("\n");
}
return 0;
}
/advdemos/tags/rel_1_5_beta1/block/idetest3.c
0,0 → 1,66
/*
*
*
*
*/
 
#include <ll/i386/cons.h>
#include <drivers/keyb.h>
 
#include <fs/bdevinit.h>
#include <fs/bdev.h>
 
#include <string.h>
 
#include "common.h"
 
#define DISKDEVICE "ide/hda1"
#define BLOCKNUMBER 58549
 
__uint8_t buffer[2048] __attribute__ ((aligned (4)));
 
extern char *ide_error_msg[];
 
int main(int argc,char *argv[])
{
__dev_t dev;
__blkcnt_t blk;
int res;
// int c;
 
showmessage("This test tries to read a block from the first hard disk\n"
"and then it tries to write it to disk\n"
"Press [CTRL-C] to abort...");
dev=bdev_find_byname(DISKDEVICE);
if ((int)dev<0) {
cprintf("Can't find device to operate with\n");
cprintf("%s not present!\n",DISKDEVICE);
return -1;
}
cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
blk=BLOCKNUMBER;
 
cprintf("Reading block %li...\n",(long)blk);
memset(buffer,0xff,sizeof(buffer));
res=bdev_read(dev,blk,buffer);
cprintf("Result %i\n",res);
//cprintf("Soft reset done %i\n",ide[0].errors);
if (res!=0) {
cprintf(" %s\n",(char*)ide_error_msg[-res]);
return -1;
}
debug_dump_buffer(buffer,64);
 
cprintf("Writing block %li...\n",(long)blk);
res=bdev_write(dev,blk,buffer);
cprintf("Result %i\n",res);
//cprintf("Soft reset done %i\n",ide[0].errors);
if (res!=0) {
cprintf(" %s\n",(char*)ide_error_msg[-res]);
}
 
waitend();
return 0;
}
/advdemos/tags/rel_1_5_beta1/block/idelin.c
0,0 → 1,71
/*
*
*
*
*/
 
#include <ll/i386/cons.h>
#include <kernel/func.h>
 
#include <fs/bdevinit.h>
#include <fs/bdev.h>
 
#include <stdlib.h>
#include <string.h>
 
#include "common.h"
 
#define DISKDEVICE "ide/hda"
 
#define TEST_MB 16
 
#define NUMBLOCK (TEST_MB*1024l*1024l/512l)
 
__dev_t dev;
 
__uint8_t buffer[2048];
 
int main(int argc,char *argv[])
{
__blkcnt_t blk;
int res;
int errors;
TIME sttime,etime;
 
showmessage("\n"
"This test read data from first hard disk to test\n"
"disk throughtput.\n"
"Remeber that the reads are made block by block so\n"
"don't worry if you see a low throughtput.\n"
);
dev=bdev_find_byname(DISKDEVICE);
if (dev<0) {
cprintf("\nCan't find device to operate with\n");
return -1;
}
cprintf("\nUsing device %s (dev=%04x)\n",DISKDEVICE,dev);
 
cprintf("Please wait (reading %i MB linearly?!?)...",TEST_MB);
 
sttime=sys_gettime(NULL);
errors=0;
for (blk=0;blk<NUMBLOCK;blk++) {
res=bdev_read(dev,blk,buffer);
//res=bdev_seek(dev,blk);
if (res!=0) errors++;
}
etime=sys_gettime(NULL)-sttime;
 
cprintf("\nDone\n\n");
cprintf("elapse time : %li sec %li msec\n",
etime/1000000l,
(etime/1000l)%1000l);
cprintf("throughtput : %6.3f MB/s\n",
NUMBLOCK*512.0/1024.0/1024.0/etime*1000000.0);
//cprintf("soft reset made: %i\n",ide[0].errors);
cprintf("errors : %i\n",errors);
cprintf("\n");
return 0;
}
/advdemos/tags/rel_1_5_beta1/block/idernd.c
0,0 → 1,68
/*
*
*
*
*/
 
#include <ll/i386/cons.h>
#include <kernel/func.h>
 
#include <fs/bdevinit.h>
#include <fs/bdev.h>
 
#include <stdlib.h>
#include <string.h>
 
#include "common.h"
 
#define DISKDEVICE "ide/hda1"
 
#define NUMBLOCK 1000
 
__dev_t dev;
__uint8_t buffer[2048];
 
int main(int argc,char *argv[])
{
__blkcnt_t blk;
int res;
int errors;
TIME sttime,etime;
showmessage("\n"
"This test read RAMDOMLY data from first hard disk to test\n"
"disk throughtput.\n"
"Remeber that the reads are made RANDOMLY block by block so\n"
"don't worry if you see a VERY low throughtput.\n"
);
srand(7);
 
dev=bdev_find_byname(DISKDEVICE);
if (dev<0) {
cprintf("\nCan't find device to operate with\n");
return -1;
}
cprintf("\nUsing device %s (dev=%04x)\n",DISKDEVICE,dev);
 
cprintf("Please wait (reading %i KB ramdomly)...",NUMBLOCK/2);
 
sttime=sys_gettime(NULL);
errors=0;
for (blk=0;blk<NUMBLOCK;blk++) {
res=bdev_read(dev,rand()%5000,buffer);
if (res!=0) errors++;
}
etime=sys_gettime(NULL)-sttime;
 
cprintf("\nDone\n\n");
cprintf("elapse time : %li sec %li msec\n",
etime/1000000l,
(etime/1000l)%1000l);
cprintf("throughtput : %6.3f KB/s\n",
NUMBLOCK*512.0/1024.0/etime*1000000.0);
//cprintf("soft reset made: %i\n",ide[0].errors);
cprintf("errors : %i\n",errors);
cprintf("\n");
return 0;
}
/advdemos/tags/rel_1_5_beta1/block/makefile
0,0 → 1,34
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS=idetest0 idetest1 idetest2 idetest3 idelin idernd idetx430
 
include $(BASE)/config/example.mk
 
#
#
#
 
idetest0:
make -f $(SUBMAKE) BASE=$(BASE) APP=idetest0 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
 
idetest1:
make -f $(SUBMAKE) BASE=$(BASE) APP=idetest1 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
 
idetest2:
make -f $(SUBMAKE) BASE=$(BASE) APP=idetest2 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
 
idetest3:
make -f $(SUBMAKE) BASE=$(BASE) APP=idetest3 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
 
idelin:
make -f $(SUBMAKE) BASE=$(BASE) APP=idelin OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
 
idernd:
make -f $(SUBMAKE) BASE=$(BASE) APP=idernd OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
/advdemos/tags/rel_1_5_beta1/block/readme
0,0 → 1,33
Hi,
 
These are the block devices demos.
 
- THEY DO NOT WRITE ON YOUR HD, so they are not dangerous.
 
- They do not require a FAT16 Filesystem.
 
 
idetest0:
The demo identifies your Hard Disk characteristics and prints it on
the screen.
 
idetest1:
The demo identifies all the partitions of your HD.
 
idetest2:
The demo allows you to select a sector on the HD and to read it.
 
idetest3:
The demo reads a random sector and then it writes it in the same position.
 
idelin:
The demo reads 16Mb of data from the HD. The data is read block by
block, linearly.
 
idernd:
The demo reads 512Kb of data from the HD. The data is read block by
block, randomly.
 
Enjoy,
 
PJ
/advdemos/tags/rel_1_5_beta1/block/common.h
0,0 → 1,11
 
#ifndef __COMMON_H
#define __COMMON_H
 
void showmessage(char *s);
void waitend(void);
 
void debug_dump_buffer(char *buf, int size);
 
#endif
/advdemos/tags/rel_1_5_beta1/mpeg2/jetctrl.c
0,0 → 1,163
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: jetctrl.c,v 1.2 2005-01-08 15:14:32 pj Exp $
 
File: $File$
Revision: $Revision: 1.2 $
Last update: $Date: 2005-01-08 15:14:32 $
------------
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* this file is directly derived from the demos/jumpball/jetctrl.c .
* I just added this controls to check when the system will become overloaded
*/
 
#define WCET_JETDUMMY 200
#define PERIOD_JETDUMMY 100000
#define DUMMY_PID 1
 
#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
 
/* the point (x, y) is the top left corner */
#define JET_DUMMY_X (TRACK_X1+360)
#define JET_DUMMY_Y (TRACK_Y2+32)
 
// from jetdummy in the auto demo
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
/* Track dimensions */
#define TRACK_WIDTH 500
#define TRACK_HEIGHT 500
/* Track position */
#define TRACK_X1 0
#define TRACK_Y1 0
#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
#define CMD_WIDTH TRACK_WIDTH
#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
 
// JetControl
 
#include "kernel/func.h"
#include "drivers/glib.h"
 
/* useful colors... */
int white;
int black;
int red;
int lightgray;
 
TASK jetdummy_task(void *arg)
{
TIME now_dummy, last_dummy, diff_dummy, slice;
struct timespec now, last, diff;
int x = 0;
int height;
 
NULL_TIMESPEC(&last);
last_dummy = 0;
for (;;) {
task_nopreempt();
jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
sys_gettime(&now);
task_preempt();
 
SUBTIMESPEC(&now, &last, &diff);
slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
diff_dummy = now_dummy - last_dummy;
 
height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
 
TIMESPEC_ASSIGN(&last, &now);
last_dummy = now_dummy;
 
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
 
x = (x+1)%JET_DUMMY_WIDTH;
 
task_endcycle();
}
}
 
void init_jetcontrol(void)
{
SOFT_TASK_MODEL m4;
 
PID p4;
 
/* useful colors ... */
white = rgb16(255,255,255);
black = rgb16(0,0,0);
red = rgb16(255,0,0);
lightgray = rgb16(128,128,128);
 
/* scenario */
grx_text("System load",
JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
 
grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
 
grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
 
/* jetdummy task */
soft_task_default_model(m4);
soft_task_def_period(m4, PERIOD_JETDUMMY);
soft_task_def_met(m4, WCET_JETDUMMY);
soft_task_def_usemath(m4);
p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
if (p4 == -1) {
grx_close();
perror("Could not create task <jetdummy>");
exit(1);
}
task_activate(p4);
}
 
/advdemos/tags/rel_1_5_beta1/mpeg2/initfile.c
0,0 → 1,240
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: initfile.c,v 1.4 2005-02-26 10:57:27 pj Exp $
*
* File: $File$
* Revision: $Revision: 1.4 $
* Last update: $Date: 2005-02-26 10:57:27 $
*/
 
#include "kernel/kern.h"
#include "edf/edf/edf.h"
#include "rr/rr/rr.h"
#include "cbs/cbs/cbs.h"
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
#include "srp/srp/srp.h"
#include "npp/npp/npp.h"
#include "nop/nop/nop.h"
#include "nopm/nopm/nopm.h"
 
#include "drivers/keyb.h"
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
extern int __register_sub_init_prologue(void);
extern int __register_sub_init(void);
 
__register_sub_init_prologue();
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
CBS_register_level(CBS_ENABLE_ALL, 0);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
NOPM_register_module();
 
__register_sub_init();
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
KEYB_PARMS keyb = BASE_KEYB;
extern int __bdev_sub_init(void);
extern int __fs_sub_init(void);
extern void ctrlc_exit(KEY_EVT *k);
HARTPORT_init();
keyb_def_ctrlC(keyb, ctrlc_exit);
KEYB_init(&keyb);
 
__bdev_sub_init();
__fs_sub_init();
__call_main__(mb);
 
return (void *)0;
}
 
#define PSCANSCHED 1
#define NOTRACE
 
int __register_sub_init_prologue(void)
{
return 0;
}
 
int __register_sub_init(void)
{
#if defined(EDFSCHED)
extern void BD_EDF_register_module(void);
BD_EDF_register_module();
#elif defined(PSCANSCHED)
extern void BD_PSCAN_register_module(void);
BD_PSCAN_register_module();
#endif
return 0;
}
 
dev_t root_device=-1;
dev_t temp_device=-1;
 
int choose_root_callback(dev_t dev,u_int8_t fs)
{
if (fs==FS_MSDOS) return dev;
return -1;
}
 
int choose_temp_callback(__dev_t dev,__uint8_t fs)
{
static int flag=0;
if (fs==FS_MSDOS) {
if (flag) return dev;
flag=1;
}
return -1;
}
 
int __bdev_sub_init(void)
{
BDEV_PARMS bdev=BASE_BDEV;
bdev_def_showinfo(bdev,FALSE);
bdev_init(&bdev);
 
root_device=bdev_scan_devices(choose_root_callback);
if (root_device<0) {
cprintf("can't find root device to mount on /!!!\n");
exit(1);
return -1;
}
 
/*
temp_device=bdev_scan_devices(choose_temp_callback);
if (temp_device<0) {
cprintf("can't find a filesystem to mount on /TEMP!!!\n");
}
*/
return 0;
}
 
 
int __fs_sub_init(void)
{
extern int libc_initialize(void);
FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
struct mount_opts opts;
// int res;
filesystem_def_rootdevice(fs,root_device);
filesystem_def_fs(fs,FS_MSDOS);
filesystem_def_showinfo(fs,FALSE);
filesystem_def_options(fs,opts);
 
memset(&opts,0,sizeof(struct mount_opts));
opts.flags=MOUNT_FLAG_RW;
 
 
filesystem_init(&fs);
 
/*
if (temp_device>=0) {
memset(&opts,0,sizeof(struct mount_opts));
opts.flags=MOUNT_FLAG_RW;
res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
if (res!=0) {
cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
} else
cprintf("mounted /TEMP rw\n");
}
*/
libc_initialize();
 
return 0;
}
 
void ctrlc_exit(KEY_EVT *k)
{
extern void dump_sem_table(void);
extern void dump_nop_table(void);
#ifndef NOGRX
grx_close();
#endif
cprintf("CTRL-C pressed!\n");
exit(1);
}
 
 
 
 
 
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/spatscal.c
0,0 → 1,331
 
#include <stdio.h>
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh));
static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh));
static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame,
int llprogressive_frame, unsigned char *fld0, unsigned char *fld1,
short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh,
int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn,
int aperture));
static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1,
int j0, int lx, int ly, int aperture));
static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d,
int lx, int lys, int lyd, int m, int n, int j0, int dj));
static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d,
int x0, int lx, int lxs, int lxd, int ly, int m, int n));
 
 
 
/* get reference frame */
void Spatial_Prediction()
{
if(Frame_Store_Flag)
{
Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size,
lower_layer_prediction_vertical_size); /* Y */
Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
}
else
{
Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size,
lower_layer_prediction_vertical_size); /* Y */
Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
}
 
 
Make_Spatial_Prediction_Frame /* Y */
(progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0],
lltmp,current_frame[0],lower_layer_horizontal_offset,
lower_layer_vertical_offset,
lower_layer_prediction_horizontal_size,
lower_layer_prediction_vertical_size,
horizontal_size,vertical_size,vertical_subsampling_factor_m,
vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
horizontal_subsampling_factor_n,
picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */
 
Make_Spatial_Prediction_Frame /* Cb */
(progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1],
lltmp,current_frame[1],lower_layer_horizontal_offset/2,
lower_layer_vertical_offset/2,
lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1,
horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
horizontal_subsampling_factor_n,1);
 
Make_Spatial_Prediction_Frame /* Cr */
(progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2],
lltmp,current_frame[2],lower_layer_horizontal_offset/2,
lower_layer_vertical_offset/2,
lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1,
horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
horizontal_subsampling_factor_n,1);
 
}
 
static void Read_Lower_Layer_Component_Framewise(comp,lw,lh)
int comp;
int lw, lh;
{
FILE *fd;
char fname[256];
char ext[3][3] = {".Y",".U",".V"};
/* char *ext = {".Y",".U",".V"}; */
int i,j;
 
sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum);
strcat(fname,ext[comp]);
#ifdef VERBOSE
if (Verbose_Flag>1)
printf("reading %s\n",fname);
#endif
fd=fopen(fname,"rb");
if (fd==NULL) exit(-1);
for (j=0; j<lh; j++) {
for (i=0; i<lw; i++)
llframe0[comp][lw*j+i]=getc(fd);
if (! lower_layer_progressive_frame) {
j++;
for (i=0; i<lw; i++)
llframe1[comp][lw*j+i]=getc(fd);
}
}
fclose(fd);
}
 
 
static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh)
int comp;
int lw, lh;
{
FILE *fd;
char fname[256];
char ext[3][3] = {".Y",".U",".V"};
/* char *ext = {".Y",".U",".V"}; */
int i,j;
 
sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,lower_layer_progressive_frame ? 'f':'a');
strcat(fname,ext[comp]);
#ifdef VERBOSE
if (Verbose_Flag>1)
printf("reading %s\n",fname);
#endif
fd=fopen(fname,"rb");
if (fd==NULL) PJ exit(-1);
for (j=0; j<lh; j+=lower_layer_progressive_frame?1:2)
for (i=0; i<lw; i++)
llframe0[comp][lw*j+i]=getc(fd);
fclose(fd);
 
if (! lower_layer_progressive_frame) {
sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,'b');
strcat(fname,ext[comp]);
#ifdef VERBOSE
if (Verbose_Flag>1)
printf("reading %s\n",fname);
#endif
fd=fopen(fname,"rb");
if (fd==NULL) PJ exit(-1);
for (j=1; j<lh; j+=2)
for (i=0; i<lw; i++)
llframe1[comp][lw*j+i]=getc(fd);
fclose(fd);
}
}
 
 
/* form spatial prediction */
static void Make_Spatial_Prediction_Frame(progressive_frame,
llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size,
vertical_size,vm,vn,hm,hn,aperture)
int progressive_frame,llprogressive_frame;
unsigned char *fld0,*fld1;
short *tmp;
unsigned char *dst;
int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture;
{
int w, h, x0, llw2, llh2;
 
llw2 = (llw*hn)/hm;
llh2 = (llh*vn)/vm;
 
if (llprogressive_frame)
{
/* progressive -> progressive / interlaced */
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
}
else if (progressive_frame)
{
/* interlaced -> progressive */
if (lower_layer_deinterlaced_field_select)
{
Deinterlace(fld1,fld0,0,llw,llh,aperture);
Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1);
}
else
{
Deinterlace(fld0,fld1,1,llw,llh,aperture);
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
}
}
else
{
/* interlaced -> interlaced */
Deinterlace(fld0,fld1,1,llw,llh,aperture);
Deinterlace(fld1,fld0,0,llw,llh,aperture);
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
}
 
/* vertical limits */
if (lly0<0)
{
tmp-= llw*lly0;
llh2+= lly0;
if (llh2<0)
llh2 = 0;
h = (vertical_size<llh2) ? vertical_size : llh2;
}
else
{
dst+= horizontal_size*lly0;
h= vertical_size - lly0;
if (h>llh2)
h = llh2;
}
 
/* horizontal limits */
if (llx0<0)
{
x0 = -llx0;
llw2+= llx0;
if (llw2<0)
llw2 = 0;
w = (horizontal_size<llw2) ? horizontal_size : llw2;
}
else
{
dst+= llx0;
x0 = 0;
w = horizontal_size - llx0;
if (w>llw2)
w = llw2;
}
Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
}
 
/* deinterlace one field (interpolate opposite parity samples)
*
* deinterlacing is done in-place: if j0=1, fld0 contains the input field in
* its even lines and the odd lines are interpolated by this routine
* if j0=0, the input field is in the odd lines and the even lines are
* interpolated
*
* fld0: field to be deinterlaced
* fld1: other field (referenced by the two field aperture filter)
* j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
* lx: width of fld0 and fld1
* ly: height of the deinterlaced field (has to be even)
* aperture: 1: use one field aperture filter (two field otherwise)
*/
static void Deinterlace(fld0,fld1,j0,lx,ly,aperture)
unsigned char *fld0,*fld1;
int j0,lx,ly; /* ly has to be even */
int aperture;
{
int i,j,v;
unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
 
/* deinterlace one field */
for (j=j0; j<ly; j+=2)
{
p0 = fld0+lx*j;
p0m1 = (j==0) ? p0+lx : p0-lx;
p0p1 = (j==ly-1) ? p0-lx : p0+lx;
 
if (aperture)
for (i=0; i<lx; i++)
p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
else
{
p1 = fld1 + lx*j;
p1m2 = (j<2) ? p1 : p1-2*lx;
p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
for (i=0; i<lx; i++)
{
v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4];
}
}
}
}
 
/* vertical resampling */
static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj)
unsigned char *s;
short *d;
int lx, lys, lyd, m, n, j0, dj;
{
int i, j, c1, c2, jd;
unsigned char *s1, *s2;
short *d1;
 
for (j=j0; j<lyd; j+=dj)
{
d1 = d + lx*j;
jd = (j*m)/n;
s1 = s + lx*jd;
s2 = (jd<lys-1)? s1+lx : s1;
c2 = (16*((j*m)%n) + (n>>1))/n;
c1 = 16 - c2;
for (i=0; i<lx; i++)
d1[i] = c1*s1[i] + c2*s2[i];
}
}
 
/* horizontal resampling */
static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n)
short *s;
unsigned char *d;
int x0, lx, lxs, lxd, ly, m, n;
{
int i, i1, j, id, c1, c2, v;
short *s1, *s2;
unsigned char *d1;
 
for (i1=0; i1<lx; i1++)
{
d1 = d + i1;
i = x0 + i1;
id = (i*m)/n;
s1 = s+id;
s2 = (id<lxs-1) ? s1+1 : s1;
c2 = (16*((i*m)%n) + (n>>1))/n;
c1 = 16 - c2;
for (j=0; j<ly; j++)
{
v = c1*(*s1) + c2*(*s2);
*d1 = (v + ((v>=0) ? 128 : 127))>>8;
d1+= lxd;
s1+= lxs;
s2+= lxs;
}
}
}
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/store.c
0,0 → 1,529
/* store.c, picture output routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
 
#include "config.h"
#include "global.h"
#include "semaphore.h"
#include "kernel/kern.h"
 
//#debug DEBUG_MAILBOX
 
static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
 
__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b)
{
return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8);
}
 
#if 0
void xWrite_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
{
int i, j;
int y, u, v, r, g, b;
// int rm=0,gm=0,bm=0;
int crv, cbu, cgu, cgv;
unsigned char *py, *pu, *pv;
int height, width;
 
struct framebuf_struct *f;
 
cprintf("%d ",frame);
 
width = Coded_Picture_Width ;
height= Coded_Picture_Height;
 
f = get_free_framebuf();
 
dither(src);
f->f[i*width+j] = down32to16(r,g,b);
f->n = frame;
insert_frame(f);
}
#endif
 
void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
{
int i, j;
int y, u, v, r, g, b;
// int rm=0,gm=0,bm=0;
int crv, cbu, cgu, cgv;
unsigned char *py, *pu, *pv;
int height, width, incr;
static unsigned char *u422, *v422, *u444, *v444;
 
struct framebuf_struct *f;
 
cprintf("%d ",frame);
 
incr = width = Coded_Picture_Width ;
height= Coded_Picture_Height;
 
if (chroma_format==CHROMA444)
{
u444 = src[1];
v444 = src[2];
}
else
{
if (!u444)
{
if (chroma_format==CHROMA420)
{
if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
}
 
if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
*Coded_Picture_Height)))
Error("malloc failed");
 
if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
*Coded_Picture_Height)))
Error("malloc failed");
}
 
if (chroma_format==CHROMA420)
{
conv420to422(src[1],u422);
conv420to422(src[2],v422);
conv422to444(u422,u444);
conv422to444(v422,v444);
}
else
{
conv422to444(src[1],u444);
conv422to444(src[2],v444);
}
}
 
 
f = get_free_framebuf();
 
/* matrix coefficients */
crv = Inverse_Table_6_9[matrix_coefficients][0];
cbu = Inverse_Table_6_9[matrix_coefficients][1];
cgu = Inverse_Table_6_9[matrix_coefficients][2];
cgv = Inverse_Table_6_9[matrix_coefficients][3];
for (i=0; i<height; i++)
{
py = src[0] + incr*i;
pu = u444 + incr*i;
pv = v444 + incr*i;
 
for (j=0; j<width; j++)
{
u = *pu++ - 128;
v = *pv++ - 128;
y = 76309 * (*py++ - 16); /* (255/219)*65536 */
 
r = Clip[(y + crv*v + 32768)>>16];
g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
b = Clip[(y + cbu*u + 32786)>>16];
 
// rm = max(rm,r);gm=max(gm,g);bm=max(bm,b);
// cprintf("(r%dg%db%d)",rm,gm,bm);
f->f[i*width+j] = down32to16(r,g,b);
// r=g=b=rand()%255;
// f->f[i*width+j] = down32to16(r,g,b);
}
}
f->n = frame;
insert_frame(f);
}
 
/*
void Display_Image(Dithered_Image)
unsigned char *Dithered_Image;
{
/ * display dithered image */
//}
 
 
/* horizontal 1:2 interpolation filter */
static void conv422to444(src,dst)
unsigned char *src,*dst;
{
int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
 
w = Coded_Picture_Width>>1;
 
if (base.MPEG2_Flag)
{
for (j=0; j<Coded_Picture_Height; j++)
{
for (i=0; i<w; i++)
{
i2 = i<<1;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<w-1) ? i+1 : w-1;
ip2 = (i<w-2) ? i+2 : w-1;
ip3 = (i<w-3) ? i+3 : w-1;
 
/* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
/* even samples (0 0 256 0 0) */
dst[i2] = src[i];
 
/* odd samples (21 -52 159 159 -52 21) */
dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
-52*(src[im1]+src[ip2])
+159*(src[i]+src[ip1])+128)>>8];
}
src+= w;
dst+= Coded_Picture_Width;
}
}
else
{
for (j=0; j<Coded_Picture_Height; j++)
{
for (i=0; i<w; i++)
{
 
i2 = i<<1;
im3 = (i<3) ? 0 : i-3;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<w-1) ? i+1 : w-1;
ip2 = (i<w-2) ? i+2 : w-1;
ip3 = (i<w-3) ? i+3 : w-1;
 
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
dst[i2] = Clip[(int)( 5*src[im3]
-21*src[im2]
+70*src[im1]
+228*src[i]
-37*src[ip1]
+11*src[ip2]+128)>>8];
 
dst[i2+1] = Clip[(int)( 5*src[ip3]
-21*src[ip2]
+70*src[ip1]
+228*src[i]
-37*src[im1]
+11*src[im2]+128)>>8];
}
src+= w;
dst+= Coded_Picture_Width;
}
}
}
 
/* vertical 1:2 interpolation filter */
static void conv420to422(src,dst)
unsigned char *src,*dst;
{
int w, h, i, j, j2;
int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
 
w = Coded_Picture_Width>>1;
h = Coded_Picture_Height>>1;
 
if (progressive_frame)
{
/* intra frame */
for (i=0; i<w; i++)
{
for (j=0; j<h; j++)
{
j2 = j<<1;
jm3 = (j<3) ? 0 : j-3;
jm2 = (j<2) ? 0 : j-2;
jm1 = (j<1) ? 0 : j-1;
jp1 = (j<h-1) ? j+1 : h-1;
jp2 = (j<h-2) ? j+2 : h-1;
jp3 = (j<h-3) ? j+3 : h-1;
 
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
/* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
dst[w*j2] = Clip[(int)( 3*src[w*jm3]
-16*src[w*jm2]
+67*src[w*jm1]
+227*src[w*j]
-32*src[w*jp1]
+7*src[w*jp2]+128)>>8];
 
dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
-16*src[w*jp2]
+67*src[w*jp1]
+227*src[w*j]
-32*src[w*jm1]
+7*src[w*jm2]+128)>>8];
}
src++;
dst++;
}
}
else
{
/* intra field */
for (i=0; i<w; i++)
{
for (j=0; j<h; j+=2)
{
j2 = j<<1;
 
/* top field */
jm6 = (j<6) ? 0 : j-6;
jm4 = (j<4) ? 0 : j-4;
jm2 = (j<2) ? 0 : j-2;
jp2 = (j<h-2) ? j+2 : h-2;
jp4 = (j<h-4) ? j+4 : h-2;
jp6 = (j<h-6) ? j+6 : h-2;
 
/* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
/* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
dst[w*j2] = Clip[(int)( 1*src[w*jm6]
-7*src[w*jm4]
+30*src[w*jm2]
+248*src[w*j]
-21*src[w*jp2]
+5*src[w*jp4]+128)>>8];
 
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
-35*src[w*jm2]
+194*src[w*j]
+110*src[w*jp2]
-24*src[w*jp4]
+4*src[w*jp6]+128)>>8];
 
/* bottom field */
jm5 = (j<5) ? 1 : j-5;
jm3 = (j<3) ? 1 : j-3;
jm1 = (j<1) ? 1 : j-1;
jp1 = (j<h-1) ? j+1 : h-1;
jp3 = (j<h-3) ? j+3 : h-1;
jp5 = (j<h-5) ? j+5 : h-1;
jp7 = (j<h-7) ? j+7 : h-1;
 
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
-35*src[w*jp3]
+194*src[w*jp1]
+110*src[w*jm1]
-24*src[w*jm3]
+4*src[w*jm5]+128)>>8];
 
dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
-7*src[w*jp5]
+30*src[w*jp3]
+248*src[w*jp1]
-21*src[w*jm1]
+5*src[w*jm3]+128)>>8];
}
src++;
dst++;
}
}
}
 
 
 
 
 
// Frame buffer for displaying pictures
 
struct framebuf_struct *get_free_framebuf();
void insert_frame(struct framebuf_struct *f);
struct framebuf_struct *remove_frame();
 
int framebuf_sz;
 
// a queue of framebufs
struct framebuf_struct *framebuf_first;
struct framebuf_struct *framebuf_last;
 
// free framebuf list
struct framebuf_struct *framebuf_free;
 
// some semaphores
sem_t framebuf_sem;
sem_t framebuf_count;
sem_t framebuf_freecount;
 
void allocate_framebuf()
{
struct framebuf_struct *f;
 
f = (struct framebuf_struct *)malloc(sizeof(struct framebuf_struct));
if (!f) {
cputs("Not enough memory!!!\n");
exit(1);
}
 
f->f = (WORD *)malloc(framebuf_sz);
if (!f->f) {
cputs("Not enough memory for buffer!!!\n");
exit(1);
}
 
f->next = framebuf_free;
framebuf_free = f;
cprintf("(Alloc %d %d)\n",f,f->f);
}
 
void Initialize_framebuf(int sz)
{
int i;
 
framebuf_first = NULL;
framebuf_last = NULL;
framebuf_free = NULL;
framebuf_sz = sz;
 
cprintf("Coded W=%d H=%d sz=%d\n",Coded_Picture_Width,Coded_Picture_Height,sz);
 
for (i=0; i<MAX_FRAMEBUF; i++)
allocate_framebuf();
 
sem_init(&framebuf_sem,0,1);
sem_init(&framebuf_count,0,0);
sem_init(&framebuf_freecount,0,MAX_FRAMEBUF);
}
 
struct framebuf_struct *get_free_framebuf()
{
struct framebuf_struct *f;
 
#ifdef DEBUG_MAILBOX
cprintf("G");
#endif
sem_wait(&framebuf_freecount);
sem_wait(&framebuf_sem);
 
//if (!framebuf_free)
// allocate_framebuf();
 
f = framebuf_free;
 
framebuf_free = framebuf_free->next;
 
sem_post(&framebuf_sem);
 
return f;
}
 
void insert_frame(struct framebuf_struct *f)
{
struct framebuf_struct *p, *q;
int n;
 
#ifdef DEBUG_MAILBOX
cprintf("I");
#endif
sem_wait(&framebuf_sem);
 
p = NULL;
q = framebuf_first;
n = f->n;
 
while ((q != NULL) && (n >= q->n)) {
p = q;
q = q->next;
}
 
if (p)
p->next = f;
else
framebuf_first = f;
 
if (q)
q->prev = f;
else
framebuf_last = f;
 
f->next = q;
f->prev = p;
 
sem_post(&framebuf_count);
sem_post(&framebuf_sem);
}
 
struct framebuf_struct *remove_frame()
{
struct framebuf_struct *f;
 
#ifdef DEBUG_MAILBOX
cprintf("R");
#endif
sem_wait(&framebuf_count);
sem_wait(&framebuf_sem);
 
 
// remove the first frame
f = framebuf_first;
 
if (!f)
exit(69); // should never happen
 
framebuf_first = framebuf_first->next;
 
if (framebuf_first)
framebuf_first->prev = NULL;
else
framebuf_last = NULL;
 
sem_post(&framebuf_sem);
 
return f;
}
 
void give_back_framebuf(struct framebuf_struct *f)
{
#ifdef DEBUG_MAILBOX
cprintf("B");
#endif
sem_wait(&framebuf_sem);
 
f->next = framebuf_free;
framebuf_free = f;
 
sem_post(&framebuf_sem);
sem_post(&framebuf_freecount);
}
 
 
 
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/ieee1180
0,0 → 1,245
IEEE 1180 report for mpeg2decode fast integer IDCT:
 
From stefan@lis.e-technik.tu-muenchen.de Thu May 26 08:18:36 1994
 
IEEE test conditions: -L = -256, +H = 255, sign = 1, #iters = 10000
Peak absolute values of errors:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Worst peak error = 1 (meets spec limit 1)
 
Mean square errors:
0.0058 0.0118 0.0097 0.0057 0.0055 0.0117 0.0120 0.0063
0.0106 0.0157 0.0142 0.0099 0.0115 0.0168 0.0154 0.0123
0.0128 0.0156 0.0152 0.0095 0.0115 0.0147 0.0173 0.0096
0.0055 0.0115 0.0103 0.0078 0.0069 0.0092 0.0113 0.0071
0.0057 0.0134 0.0123 0.0067 0.0050 0.0109 0.0128 0.0065
0.0101 0.0172 0.0159 0.0093 0.0097 0.0148 0.0163 0.0130
0.0113 0.0171 0.0148 0.0103 0.0110 0.0153 0.0149 0.0093
0.0064 0.0123 0.0104 0.0065 0.0064 0.0111 0.0099 0.0066
Worst pmse = 0.017300 (meets spec limit 0.06)
Overall mse = 0.010998 (meets spec limit 0.02)
 
Mean errors:
0.0014 0.0004 0.0003 0.0017 0.0003 0.0011 0.0010 -0.0001
0.0000 0.0003 0.0010 0.0003 0.0007 -0.0006 0.0004 0.0033
0.0000 -0.0008 -0.0006 0.0009 -0.0015 -0.0013 -0.0017 -0.0008
-0.0017 0.0019 -0.0005 0.0010 0.0005 0.0000 -0.0017 -0.0001
0.0007 0.0034 0.0015 0.0021 0.0016 0.0007 -0.0006 0.0011
-0.0007 0.0004 -0.0001 0.0003 0.0003 0.0004 0.0031 -0.0010
0.0009 -0.0005 -0.0004 0.0003 0.0008 -0.0015 -0.0007 -0.0007
0.0024 0.0001 0.0018 -0.0003 -0.0006 -0.0001 0.0009 0.0018
Worst mean error = 0.003400 (meets spec limit 0.015)
Overall mean error = 0.000352 (meets spec limit 0.0015)
 
0 elements of IDCT(0) were not zero
 
 
25.8u 0.1s 0:27 95% 0+216k 0+2io 0pf+0w
IEEE test conditions: -L = -5, +H = 5, sign = 1, #iters = 10000
Peak absolute values of errors:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Worst peak error = 1 (meets spec limit 1)
 
Mean square errors:
0.0008 0.0008 0.0006 0.0006 0.0006 0.0006 0.0007 0.0005
0.0005 0.0003 0.0005 0.0001 0.0003 0.0007 0.0007 0.0004
0.0004 0.0012 0.0011 0.0007 0.0010 0.0008 0.0010 0.0003
0.0004 0.0004 0.0001 0.0002 0.0004 0.0007 0.0009 0.0004
0.0005 0.0005 0.0004 0.0002 0.0006 0.0004 0.0012 0.0003
0.0008 0.0006 0.0007 0.0007 0.0003 0.0012 0.0011 0.0004
0.0006 0.0002 0.0001 0.0002 0.0005 0.0005 0.0007 0.0005
0.0008 0.0004 0.0006 0.0003 0.0008 0.0006 0.0002 0.0003
Worst pmse = 0.001200 (meets spec limit 0.06)
Overall mse = 0.000561 (meets spec limit 0.02)
 
Mean errors:
0.0008 0.0006 0.0000 0.0006 0.0006 0.0002 0.0005 0.0003
0.0005 0.0003 0.0003 0.0001 0.0001 0.0001 0.0005 0.0002
0.0004 0.0006 0.0005 0.0007 0.0006 0.0004 0.0002 -0.0001
0.0002 0.0002 0.0001 0.0002 0.0004 0.0005 0.0003 0.0002
0.0003 0.0003 0.0004 0.0002 0.0006 0.0000 0.0002 0.0003
-0.0002 0.0004 0.0007 0.0005 0.0001 0.0010 0.0005 -0.0002
0.0004 0.0000 0.0001 0.0000 0.0001 0.0003 0.0005 0.0003
0.0006 0.0000 0.0002 0.0003 0.0004 0.0002 0.0002 0.0001
Worst mean error = 0.001000 (meets spec limit 0.015)
Overall mean error = 0.000311 (meets spec limit 0.0015)
 
0 elements of IDCT(0) were not zero
 
 
25.7u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
IEEE test conditions: -L = -300, +H = 300, sign = 1, #iters = 10000
Peak absolute values of errors:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Worst peak error = 1 (meets spec limit 1)
 
Mean square errors:
0.0068 0.0097 0.0119 0.0064 0.0065 0.0105 0.0112 0.0050
0.0088 0.0130 0.0128 0.0088 0.0111 0.0152 0.0139 0.0109
0.0114 0.0127 0.0157 0.0099 0.0114 0.0137 0.0153 0.0109
0.0052 0.0097 0.0120 0.0060 0.0067 0.0114 0.0099 0.0065
0.0062 0.0096 0.0091 0.0064 0.0076 0.0092 0.0111 0.0058
0.0096 0.0139 0.0166 0.0112 0.0092 0.0141 0.0122 0.0103
0.0121 0.0138 0.0131 0.0089 0.0108 0.0172 0.0127 0.0104
0.0070 0.0109 0.0092 0.0055 0.0057 0.0128 0.0102 0.0069
Worst pmse = 0.017200 (meets spec limit 0.06)
Overall mse = 0.010316 (meets spec limit 0.02)
 
Mean errors:
-0.0010 0.0015 0.0001 -0.0004 0.0005 -0.0001 0.0008 0.0000
0.0004 0.0016 0.0006 0.0000 -0.0001 0.0004 0.0011 0.0001
-0.0008 0.0013 0.0015 0.0003 0.0010 0.0005 -0.0005 0.0021
0.0006 0.0013 -0.0004 0.0000 0.0007 -0.0002 -0.0009 0.0003
0.0004 0.0004 -0.0001 -0.0004 0.0014 0.0018 0.0017 -0.0002
0.0024 0.0007 -0.0002 -0.0018 0.0004 0.0001 0.0010 0.0009
0.0001 -0.0002 0.0005 0.0003 -0.0016 0.0004 0.0013 -0.0006
-0.0012 -0.0017 -0.0008 0.0003 0.0001 0.0018 0.0008 -0.0005
Worst mean error = 0.002400 (meets spec limit 0.015)
Overall mean error = 0.000309 (meets spec limit 0.0015)
 
0 elements of IDCT(0) were not zero
 
 
25.8u 0.0s 0:27 95% 0+216k 0+4io 0pf+0w
IEEE test conditions: -L = -256, +H = 255, sign = -1, #iters = 10000
Peak absolute values of errors:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Worst peak error = 1 (meets spec limit 1)
 
Mean square errors:
0.0061 0.0118 0.0097 0.0057 0.0058 0.0113 0.0115 0.0061
0.0105 0.0159 0.0138 0.0097 0.0113 0.0166 0.0149 0.0123
0.0129 0.0155 0.0152 0.0095 0.0112 0.0145 0.0173 0.0094
0.0059 0.0112 0.0105 0.0076 0.0071 0.0091 0.0113 0.0073
0.0061 0.0130 0.0128 0.0066 0.0051 0.0108 0.0126 0.0067
0.0099 0.0168 0.0161 0.0095 0.0100 0.0149 0.0166 0.0132
0.0113 0.0171 0.0150 0.0101 0.0110 0.0157 0.0152 0.0094
0.0062 0.0121 0.0102 0.0065 0.0061 0.0112 0.0099 0.0065
Worst pmse = 0.017300 (meets spec limit 0.06)
Overall mse = 0.010980 (meets spec limit 0.02)
 
Mean errors:
-0.0005 0.0006 0.0001 -0.0007 0.0006 -0.0003 -0.0003 0.0011
0.0011 0.0003 -0.0002 0.0005 -0.0001 0.0008 0.0001 -0.0027
0.0013 0.0015 0.0010 -0.0001 0.0020 0.0019 0.0025 0.0016
0.0023 -0.0008 0.0011 -0.0002 0.0007 0.0003 0.0019 0.0009
-0.0003 -0.0030 -0.0002 -0.0012 -0.0009 0.0000 0.0010 -0.0005
0.0009 0.0002 0.0015 0.0007 0.0002 0.0001 -0.0026 0.0018
0.0001 0.0011 0.0010 0.0005 -0.0004 0.0023 0.0014 0.0014
-0.0014 0.0007 -0.0014 0.0009 0.0013 0.0006 -0.0007 -0.0007
Worst mean error = 0.003000 (meets spec limit 0.015)
Overall mean error = 0.000355 (meets spec limit 0.0015)
 
0 elements of IDCT(0) were not zero
 
 
25.8u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
IEEE test conditions: -L = -5, +H = 5, sign = -1, #iters = 10000
Peak absolute values of errors:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Worst peak error = 1 (meets spec limit 1)
 
Mean square errors:
0.0010 0.0007 0.0008 0.0004 0.0008 0.0004 0.0005 0.0007
0.0005 0.0007 0.0005 0.0004 0.0006 0.0005 0.0005 0.0003
0.0003 0.0011 0.0009 0.0007 0.0008 0.0006 0.0011 0.0006
0.0003 0.0004 0.0002 0.0002 0.0003 0.0006 0.0008 0.0006
0.0004 0.0005 0.0006 0.0006 0.0003 0.0007 0.0007 0.0003
0.0013 0.0006 0.0008 0.0005 0.0004 0.0006 0.0008 0.0004
0.0003 0.0003 0.0003 0.0002 0.0005 0.0004 0.0006 0.0005
0.0005 0.0003 0.0006 0.0005 0.0011 0.0007 0.0005 0.0003
Worst pmse = 0.001300 (meets spec limit 0.06)
Overall mse = 0.000561 (meets spec limit 0.02)
 
Mean errors:
0.0002 0.0005 0.0008 0.0000 0.0002 0.0004 0.0003 0.0007
0.0001 0.0003 0.0003 0.0002 0.0006 0.0003 0.0001 0.0003
-0.0001 0.0007 0.0003 0.0001 0.0002 0.0006 0.0005 0.0006
0.0001 0.0004 0.0002 0.0002 0.0001 0.0002 0.0004 0.0004
0.0002 0.0005 0.0006 0.0004 0.0001 0.0005 0.0005 0.0003
0.0009 0.0002 0.0000 0.0001 0.0004 0.0000 0.0006 0.0004
0.0003 0.0003 0.0003 0.0002 0.0003 0.0000 0.0004 0.0003
0.0003 0.0003 0.0004 0.0003 0.0007 0.0005 0.0005 0.0003
Worst mean error = 0.000900 (meets spec limit 0.015)
Overall mean error = 0.000333 (meets spec limit 0.0015)
 
0 elements of IDCT(0) were not zero
 
 
25.7u 0.1s 0:27 95% 0+216k 0+0io 0pf+0w
IEEE test conditions: -L = -300, +H = 300, sign = -1, #iters = 10000
Peak absolute values of errors:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Worst peak error = 1 (meets spec limit 1)
 
Mean square errors:
0.0067 0.0097 0.0118 0.0060 0.0066 0.0107 0.0113 0.0049
0.0082 0.0132 0.0128 0.0088 0.0110 0.0152 0.0140 0.0109
0.0122 0.0125 0.0156 0.0098 0.0113 0.0139 0.0152 0.0106
0.0054 0.0097 0.0121 0.0064 0.0067 0.0110 0.0096 0.0062
0.0064 0.0099 0.0090 0.0067 0.0078 0.0089 0.0112 0.0057
0.0098 0.0136 0.0165 0.0111 0.0090 0.0138 0.0120 0.0103
0.0121 0.0135 0.0131 0.0087 0.0107 0.0168 0.0128 0.0102
0.0069 0.0109 0.0091 0.0057 0.0061 0.0125 0.0103 0.0070
Worst pmse = 0.016800 (meets spec limit 0.06)
Overall mse = 0.010283 (meets spec limit 0.02)
 
Mean errors:
0.0015 -0.0009 0.0006 0.0012 0.0002 0.0007 -0.0001 0.0005
0.0004 -0.0010 0.0000 0.0004 0.0006 0.0004 -0.0004 0.0007
0.0018 -0.0009 -0.0006 0.0000 -0.0003 -0.0001 0.0014 -0.0006
-0.0002 -0.0011 0.0009 0.0004 -0.0003 0.0010 0.0010 0.0000
0.0004 0.0001 0.0010 0.0011 -0.0008 -0.0017 -0.0006 0.0009
-0.0020 0.0000 0.0007 0.0021 0.0002 0.0002 -0.0004 -0.0003
0.0003 0.0005 -0.0003 -0.0001 0.0017 0.0002 -0.0004 0.0010
0.0015 0.0023 0.0013 0.0003 0.0005 -0.0011 -0.0003 0.0006
Worst mean error = 0.002300 (meets spec limit 0.015)
Overall mean error = 0.000252 (meets spec limit 0.0015)
 
0 elements of IDCT(0) were not zero
 
 
25.8u 0.0s 0:27 94% 0+216k 0+3io 0pf+0w
 
/advdemos/tags/rel_1_5_beta1/mpeg2/makefile.lib
0,0 → 1,54
#
# The mpeg library
#
 
# (see sources for copyrights)
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
LIBRARY = mpeg2
 
OBJS_PATH = $(BASE)/ports/mpeg2
 
DECODER_SRC = util.c \
video.c \
parseblock.c \
motionvector.c \
decoders.c \
jrevdct.c \
wrapper.c \
gdith.c \
gdithmni.c \
readfile.c \
16bit.c
 
DITHER_SRC = fs2.c \
fs2fast.c \
fs4.c \
hybrid.c \
hybriderr.c \
2x2.c \
gray.c \
mono.c \
ordered.c \
ordered2.c \
mb_ordered.c
 
SRCS= $(DECODER_SRC) $(DITHER_SRC)
 
OBJS= mpeg2dec.o getpic.o motion.o getvlc.o \
gethdr.o getblk.o getbits.o store.o \
recon.o spatscal.o idct.o idctref.o \
display.o systems.o subspic.o verify.o
 
#C_WARN += -Wno-unused -Wno-uninitialized -Wno-implicit-function-declaration \
# -Wno-switch -Wno-return-type
 
#C_DEF += -DNOCONTROLS
#C_INC += -I.
 
include $(BASE)/config/lib.mk
 
/advdemos/tags/rel_1_5_beta1/mpeg2/config.h
0,0 → 1,45
/* config.h, configuration defines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/* define NON_ANSI_COMPILER for compilers without function prototyping */
/* #define NON_ANSI_COMPILER */
 
#ifdef NON_ANSI_COMPILER
#define _ANSI_ARGS_(x) ()
#else
#define _ANSI_ARGS_(x) x
#endif
 
#define RB "rb"
#define WB "wb"
 
#ifndef O_BINARY
#define O_BINARY 0
 
#endif
/advdemos/tags/rel_1_5_beta1/mpeg2/getpic.c
0,0 → 1,1225
/* getpic.c, picture decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
 
#include "config.h"
#include "global.h"
 
/* private prototypes*/
static void picture_data _ANSI_ARGS_((int framenum));
static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype,
int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv,
int *pmvscale, int *pdct_type));
static void Clear_Block _ANSI_ARGS_((int comp));
static void Sum_Block _ANSI_ARGS_((int comp));
static void Saturate _ANSI_ARGS_((short *bp));
static void Add_Block _ANSI_ARGS_((int comp, int bx, int by,
int dct_type, int addflag));
static void Update_Picture_Buffers _ANSI_ARGS_((void));
static void frame_reorder _ANSI_ARGS_((int bitstream_framenum,
int sequence_framenum));
static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc,
int MBA, int MBAmax, int *dct_type));
 
static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type,
int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
int dmvector[2], int stwtype, int dct_type));
 
static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3],
int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2],
int *stwtype, int *macroblock_type));
 
static int slice _ANSI_ARGS_((int framenum, int MBAmax));
 
static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA,
int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]));
 
static int decode_macroblock _ANSI_ARGS_((int *macroblock_type,
int *stwtype, int *stwclass, int *motion_type, int *dct_type,
int PMV[2][2][2], int dc_dct_pred[3],
int motion_vertical_field_select[2][2], int dmvector[2]));
 
 
/* decode one frame or field picture */
void Decode_Picture(bitstream_framenum, sequence_framenum)
int bitstream_framenum, sequence_framenum;
{
 
if (picture_structure==FRAME_PICTURE && Second_Field)
{
/* recover from illegal number of field pictures */
printf("odd number of field pictures\n");
Second_Field = 0;
}
 
/* IMPLEMENTATION: update picture buffer pointers */
Update_Picture_Buffers();
 
#ifdef VERIFY
Check_Headers(bitstream_framenum, sequence_framenum);
#endif /* VERIFY */
 
/* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */
/* (section number based on November 1995 (Dallas) draft of the
conformance document) */
if(Ersatz_Flag)
Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum);
 
/* form spatial scalable picture */
/* form spatial scalable picture */
/* ISO/IEC 13818-2 section 7.7: Spatial scalability */
if (base.pict_scal && !Second_Field)
{
Spatial_Prediction();
}
 
/* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
picture_data(bitstream_framenum);
 
/* write or display current or previously decoded reference frame */
/* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
frame_reorder(bitstream_framenum, sequence_framenum);
 
if (picture_structure!=FRAME_PICTURE)
Second_Field = !Second_Field;
}
 
 
/* decode all macroblocks of the current picture */
/* stages described in ISO/IEC 13818-2 section 7 */
static void picture_data(framenum)
int framenum;
{
int MBAmax;
int ret;
 
/* number of macroblocks per picture */
MBAmax = mb_width*mb_height;
 
if (picture_structure!=FRAME_PICTURE)
MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */
 
for(;;)
{
if((ret=slice(framenum, MBAmax))<0)
return;
}
 
}
 
 
 
/* decode all macroblocks of the current picture */
/* ISO/IEC 13818-2 section 6.3.16 */
static int slice(framenum, MBAmax)
int framenum, MBAmax;
{
int MBA;
int MBAinc, macroblock_type, motion_type, dct_type;
int dc_dct_pred[3];
int PMV[2][2][2], motion_vertical_field_select[2][2];
int dmvector[2];
int stwtype, stwclass;
int SNRMBA, SNRMBAinc;
int ret;
 
MBA = 0; /* macroblock address */
MBAinc = 0;
 
if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1)
return(ret);
 
if (Two_Streams && enhan.scalable_mode==SC_SNR)
{
SNRMBA=0;
SNRMBAinc=0;
}
 
Fault_Flag=0;
 
for (;;)
{
 
/* this is how we properly exit out of picture */
if (MBA>=MBAmax)
return(-1); /* all macroblocks decoded */
 
#ifdef TRACE
if (Trace_Flag)
printf("frame %d, MB %d\n",framenum,MBA);
#endif /* TRACE */
 
#ifdef DISPLAY
if (!progressive_frame && picture_structure==FRAME_PICTURE
&& MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11
&& !Display_Progressive_Flag)
{
Display_Second_Field();
}
#endif
 
ld = &base;
 
if (MBAinc==0)
{
if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
ld = &enhan;
 
if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */
{
resync: /* if Fault_Flag: resynchronize to next next_start_code */
Fault_Flag = 0;
return(0); /* trigger: go to next slice */
}
else /* neither next_start_code nor Fault_Flag */
{
if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
ld = &enhan;
 
/* decode macroblock address increment */
MBAinc = Get_macroblock_address_increment();
 
if (Fault_Flag) goto resync;
}
}
 
if (MBA>=MBAmax)
{
/* MBAinc points beyond picture dimensions */
if (!Quiet_Flag)
printf("Too many macroblocks in picture\n");
return(-1);
}
 
if (MBAinc==1) /* not skipped */
{
ret = decode_macroblock(&macroblock_type, &stwtype, &stwclass,
&motion_type, &dct_type, PMV, dc_dct_pred,
motion_vertical_field_select, dmvector);
 
if(ret==-1)
return(-1);
if(ret==0)
goto resync;
 
}
else /* MBAinc!=1: skipped macroblock */
{
/* ISO/IEC 13818-2 section 7.6.6 */
skipped_macroblock(dc_dct_pred, PMV, &motion_type,
motion_vertical_field_select, &stwtype, &macroblock_type);
}
 
/* SCALABILITY: SNR */
/* ISO/IEC 13818-2 section 7.8 */
/* NOTE: we currently ignore faults encountered in this routine */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type);
 
/* ISO/IEC 13818-2 section 7.6 */
motion_compensation(MBA, macroblock_type, motion_type, PMV,
motion_vertical_field_select, dmvector, stwtype, dct_type);
 
 
/* advance to next macroblock */
MBA++;
MBAinc--;
/* SCALABILITY: SNR */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
{
SNRMBA++;
SNRMBAinc--;
}
 
if (MBA>=MBAmax)
return(-1); /* all macroblocks decoded */
}
}
 
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass,
pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type)
int *pmacroblock_type, *pstwtype, *pstwclass;
int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale;
int *pdct_type;
{
int macroblock_type;
int stwtype, stwcode, stwclass;
int motion_type = 0;
int motion_vector_count, mv_format, dmv, mvscale;
int dct_type;
static unsigned char stwc_table[3][4]
= { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
static unsigned char stwclass_table[9]
= {0, 1, 2, 1, 1, 2, 3, 3, 4};
 
/* get macroblock_type */
macroblock_type = Get_macroblock_type();
 
if (Fault_Flag) return;
 
/* get spatial_temporal_weight_code */
if (macroblock_type & MB_WEIGHT)
{
if (spatial_temporal_weight_code_table_index==0)
stwtype = 4;
else
{
stwcode = Get_Bits(2);
#ifdef TRACE
if (Trace_Flag)
{
printf("spatial_temporal_weight_code (");
Print_Bits(stwcode,2,2);
printf("): %d\n",stwcode);
}
#endif /* TRACE */
stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
}
}
else
stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
 
/* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
stwclass = stwclass_table[stwtype];
 
/* get frame/field motion type */
if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
{
if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
{
motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
#ifdef TRACE
if (!frame_pred_frame_dct && Trace_Flag)
{
printf("frame_motion_type (");
Print_Bits(motion_type,2,2);
printf("): %s\n",motion_type==MC_FIELD?"Field":
motion_type==MC_FRAME?"Frame":
motion_type==MC_DMV?"Dual_Prime":"Invalid");
}
#endif /* TRACE */
}
else /* field_motion_type */
{
motion_type = Get_Bits(2);
#ifdef TRACE
if (Trace_Flag)
{
printf("field_motion_type (");
Print_Bits(motion_type,2,2);
printf("): %s\n",motion_type==MC_FIELD?"Field":
motion_type==MC_16X8?"16x8 MC":
motion_type==MC_DMV?"Dual_Prime":"Invalid");
}
#endif /* TRACE */
}
}
else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
{
/* concealment motion vectors */
motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
}
#if 0
else
{
printf("maroblock_modes(): unknown macroblock type\n");
motion_type = -1;
}
#endif
 
/* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
if (picture_structure==FRAME_PICTURE)
{
motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
}
else
{
motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
mv_format = MV_FIELD;
}
 
dmv = (motion_type==MC_DMV); /* dual prime */
 
/* field mv predictions in frame pictures have to be scaled
* ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
* IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
* it displaces the stage:
*
* if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
* prediction = PMV[r][s][t] DIV 2;
*/
 
mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
 
/* get dct_type (frame DCT / field DCT) */
dct_type = (picture_structure==FRAME_PICTURE)
&& (!frame_pred_frame_dct)
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
? Get_Bits(1)
: 0;
 
#ifdef TRACE
if (Trace_Flag && (picture_structure==FRAME_PICTURE)
&& (!frame_pred_frame_dct)
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
printf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
#endif /* TRACE */
 
/* return values */
*pmacroblock_type = macroblock_type;
*pstwtype = stwtype;
*pstwclass = stwclass;
*pmotion_type = motion_type;
*pmotion_vector_count = motion_vector_count;
*pmv_format = mv_format;
*pdmv = dmv;
*pmvscale = mvscale;
*pdct_type = dct_type;
}
 
 
/* move/add 8x8-Block from block[comp] to backward_reference_frame */
/* copy reconstructed 8x8 block from block[comp] to current_frame[]
* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
* This stage also embodies some of the operations implied by:
* - ISO/IEC 13818-2 section 7.6.7: Combining predictions
* - ISO/IEC 13818-2 section 6.1.3: Macroblock
*/
static void Add_Block(comp,bx,by,dct_type,addflag)
int comp,bx,by,dct_type,addflag;
{
int cc,i, j, iincr;
unsigned char *rfp;
short *bp;
 
/* derive color component index */
/* equivalent to ISO/IEC 13818-2 Table 7-1 */
cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
 
if (cc==0)
{
/* luminance */
 
if (picture_structure==FRAME_PICTURE)
if (dct_type)
{
/* field DCT coding */
rfp = current_frame[0]
+ Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
iincr = (Coded_Picture_Width<<1) - 8;
}
else
{
/* frame DCT coding */
rfp = current_frame[0]
+ Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
iincr = Coded_Picture_Width - 8;
}
else
{
/* field picture */
rfp = current_frame[0]
+ (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
iincr = (Coded_Picture_Width<<1) - 8;
}
}
else
{
/* chrominance */
 
/* scale coordinates */
if (chroma_format!=CHROMA444)
bx >>= 1;
if (chroma_format==CHROMA420)
by >>= 1;
if (picture_structure==FRAME_PICTURE)
{
if (dct_type && (chroma_format!=CHROMA420))
{
/* field DCT coding */
rfp = current_frame[cc]
+ Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8);
iincr = (Chroma_Width<<1) - 8;
}
else
{
/* frame DCT coding */
rfp = current_frame[cc]
+ Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8);
iincr = Chroma_Width - 8;
}
}
else
{
/* field picture */
rfp = current_frame[cc]
+ (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8);
iincr = (Chroma_Width<<1) - 8;
}
}
 
bp = ld->block[comp];
 
if (addflag)
{
for (i=0; i<8; i++)
{
for (j=0; j<8; j++)
{
*rfp = Clip[*bp++ + *rfp];
rfp++;
}
 
rfp+= iincr;
}
}
else
{
for (i=0; i<8; i++)
{
for (j=0; j<8; j++)
*rfp++ = Clip[*bp++ + 128];
 
rfp+= iincr;
}
}
}
 
 
/* ISO/IEC 13818-2 section 7.8 */
static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type)
int *SNRMBA, *SNRMBAinc;
int MBA, MBAmax;
int *dct_type;
{
int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy;
int slice_vert_pos_ext, quantizer_scale_code, comp, code;
 
ld = &enhan;
 
if (*SNRMBAinc==0)
{
if (!Show_Bits(23)) /* next_start_code */
{
next_start_code();
code = Show_Bits(32);
 
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
printf("SNR: Premature end of picture\n");
return;
}
 
Flush_Buffer32();
 
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
 
/* decode macroblock address increment */
*SNRMBAinc = Get_macroblock_address_increment();
 
/* set current location */
*SNRMBA =
((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1;
 
*SNRMBAinc = 1; /* first macroblock in slice: not skipped */
}
else /* not next_start_code */
{
if (*SNRMBA>=MBAmax)
{
if (!Quiet_Flag)
printf("Too many macroblocks in picture\n");
return;
}
 
/* decode macroblock address increment */
*SNRMBAinc = Get_macroblock_address_increment();
}
}
 
if (*SNRMBA!=MBA)
{
/* streams out of sync */
if (!Quiet_Flag)
printf("Cant't synchronize streams\n");
return;
}
 
if (*SNRMBAinc==1) /* not skipped */
{
macroblock_modes(&SNRmacroblock_type, &dummy, &dummy,
&dummy, &dummy, &dummy, &dummy, &dummy,
&SNRdct_type);
 
if (SNRmacroblock_type & MACROBLOCK_PATTERN)
*dct_type = SNRdct_type;
 
if (SNRmacroblock_type & MACROBLOCK_QUANT)
{
quantizer_scale_code = Get_Bits(5);
ld->quantizer_scale =
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
}
 
/* macroblock_pattern */
if (SNRmacroblock_type & MACROBLOCK_PATTERN)
{
SNRcoded_block_pattern = Get_coded_block_pattern();
 
if (chroma_format==CHROMA422)
SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */
else if (chroma_format==CHROMA444)
SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */
}
else
SNRcoded_block_pattern = 0;
 
/* decode blocks */
for (comp=0; comp<block_count; comp++)
{
Clear_Block(comp);
 
if (SNRcoded_block_pattern & (1<<(block_count-1-comp)))
Decode_MPEG2_Non_Intra_Block(comp);
}
}
else /* SNRMBAinc!=1: skipped macroblock */
{
for (comp=0; comp<block_count; comp++)
Clear_Block(comp);
}
 
ld = &base;
}
 
 
 
/* IMPLEMENTATION: set scratch pad macroblock to zero */
static void Clear_Block(comp)
int comp;
{
short *Block_Ptr;
int i;
 
Block_Ptr = ld->block[comp];
 
for (i=0; i<64; i++)
*Block_Ptr++ = 0;
}
 
 
/* SCALABILITY: add SNR enhancement layer block data to base layer */
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */
static void Sum_Block(comp)
int comp;
{
short *Block_Ptr1, *Block_Ptr2;
int i;
 
Block_Ptr1 = base.block[comp];
Block_Ptr2 = enhan.block[comp];
 
for (i=0; i<64; i++)
*Block_Ptr1++ += *Block_Ptr2++;
}
 
 
/* limit coefficients to -2048..2047 */
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
static void Saturate(Block_Ptr)
short *Block_Ptr;
{
int i, sum, val;
 
sum = 0;
 
/* ISO/IEC 13818-2 section 7.4.3: Saturation */
for (i=0; i<64; i++)
{
val = Block_Ptr[i];
 
if (val>2047)
val = 2047;
else if (val<-2048)
val = -2048;
 
Block_Ptr[i] = val;
sum+= val;
}
 
/* ISO/IEC 13818-2 section 7.4.4: Mismatch control */
if ((sum&1)==0)
Block_Ptr[63]^= 1;
 
}
 
 
/* reuse old picture buffers as soon as they are no longer needed
based on life-time axioms of MPEG */
static void Update_Picture_Buffers()
{
int cc; /* color component index */
unsigned char *tmp; /* temporary swap pointer */
 
for (cc=0; cc<3; cc++)
{
/* B pictures do not need to be save for future reference */
if (picture_coding_type==B_TYPE)
{
current_frame[cc] = auxframe[cc];
}
else
{
/* only update at the beginning of the coded frame */
if (!Second_Field)
{
tmp = forward_reference_frame[cc];
 
/* the previously decoded reference frame is stored
coincident with the location where the backward
reference frame is stored (backwards prediction is not
needed in P pictures) */
forward_reference_frame[cc] = backward_reference_frame[cc];
/* update pointer for potential future B pictures */
backward_reference_frame[cc] = tmp;
}
 
/* can erase over old backward reference frame since it is not used
in a P picture, and since any subsequent B pictures will use the
previously decoded I or P frame as the backward_reference_frame */
current_frame[cc] = backward_reference_frame[cc];
}
 
/* IMPLEMENTATION:
one-time folding of a line offset into the pointer which stores the
memory address of the current frame saves offsets and conditional
branches throughout the remainder of the picture processing loop */
if (picture_structure==BOTTOM_FIELD)
current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width;
}
}
 
 
/* store last frame */
 
void Output_Last_Frame_of_Sequence(Framenum)
int Framenum;
{
if (Second_Field)
printf("last frame incomplete, not stored\n");
else
Write_Frame(backward_reference_frame,Framenum-1);
}
 
 
 
static void frame_reorder(Bitstream_Framenum, Sequence_Framenum)
int Bitstream_Framenum, Sequence_Framenum;
{
/* tracking variables to insure proper output in spatial scalability */
static int Oldref_progressive_frame, Newref_progressive_frame;
 
if (Sequence_Framenum!=0)
{
if (picture_structure==FRAME_PICTURE || Second_Field)
{
if (picture_coding_type==B_TYPE)
Write_Frame(auxframe,Bitstream_Framenum-1);
else
{
Newref_progressive_frame = progressive_frame;
progressive_frame = Oldref_progressive_frame;
 
Write_Frame(forward_reference_frame,Bitstream_Framenum-1);
 
Oldref_progressive_frame = progressive_frame = Newref_progressive_frame;
}
}
#ifdef DISPLAY
else if (Output_Type==T_X11)
{
if(!Display_Progressive_Flag)
Display_Second_Field();
}
#endif
}
else
Oldref_progressive_frame = progressive_frame;
 
}
 
 
/* ISO/IEC 13818-2 section 7.6 */
static void motion_compensation(MBA, macroblock_type, motion_type, PMV,
motion_vertical_field_select, dmvector, stwtype, dct_type)
int MBA;
int macroblock_type;
int motion_type;
int PMV[2][2][2];
int motion_vertical_field_select[2][2];
int dmvector[2];
int stwtype;
int dct_type;
{
int bx, by;
int comp;
 
/* derive current macroblock position within picture */
/* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
bx = 16*(MBA%mb_width);
by = 16*(MBA/mb_width);
 
/* motion compensation */
if (!(macroblock_type & MACROBLOCK_INTRA))
form_predictions(bx,by,macroblock_type,motion_type,PMV,
motion_vertical_field_select,dmvector,stwtype);
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
ld = &base;
 
/* copy or add block data into picture */
for (comp=0; comp<block_count; comp++)
{
/* SCALABILITY: SNR */
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
the two a layers */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
Sum_Block(comp); /* add SNR enhancement layer data to base layer */
 
/* MPEG-2 saturation and mismatch control */
/* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
Saturate(ld->block[comp]);
 
/* ISO/IEC 13818-2 section Annex A: inverse DCT */
if (Reference_IDCT_Flag)
Reference_IDCT(ld->block[comp]);
else
Fast_IDCT(ld->block[comp]);
/* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
}
 
}
 
 
 
/* ISO/IEC 13818-2 section 7.6.6 */
static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
motion_vertical_field_select, stwtype, macroblock_type)
int dc_dct_pred[3];
int PMV[2][2][2];
int *motion_type;
int motion_vertical_field_select[2][2];
int *stwtype;
int *macroblock_type;
{
int comp;
/* SCALABILITY: Data Paritioning */
if (base.scalable_mode==SC_DP)
ld = &base;
 
for (comp=0; comp<block_count; comp++)
Clear_Block(comp);
 
/* reset intra_dc predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
 
/* reset motion vector predictors */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
if (picture_coding_type==P_TYPE)
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
 
/* derive motion_type */
if (picture_structure==FRAME_PICTURE)
*motion_type = MC_FRAME;
else
{
*motion_type = MC_FIELD;
 
/* predict from field of same parity */
/* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
picture */
motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
(picture_structure==BOTTOM_FIELD);
}
 
/* skipped I are spatial-only predicted, */
/* skipped P and B are temporal-only predicted */
/* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
*stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
 
/* IMPLEMENTATION: clear MACROBLOCK_INTRA */
*macroblock_type&= ~MACROBLOCK_INTRA;
 
}
 
 
/* return==-1 means go to next picture */
/* the expression "start of slice" is used throughout the normative
body of the MPEG specification */
static int start_of_slice(MBAmax, MBA, MBAinc,
dc_dct_pred, PMV)
int MBAmax;
int *MBA;
int *MBAinc;
int dc_dct_pred[3];
int PMV[2][2][2];
{
unsigned int code;
int slice_vert_pos_ext;
 
ld = &base;
 
Fault_Flag = 0;
 
next_start_code();
code = Show_Bits(32);
 
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
printf("start_of_slice(): Premature end of picture\n");
 
return(-1); /* trigger: go to next picture */
}
 
Flush_Buffer32();
 
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
 
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
{
ld = &enhan;
next_start_code();
code = Show_Bits(32);
 
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
printf("DP: Premature end of picture\n");
return(-1); /* trigger: go to next picture */
}
 
Flush_Buffer32();
 
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
 
if (base.priority_breakpoint!=1)
ld = &base;
}
 
/* decode macroblock address increment */
*MBAinc = Get_macroblock_address_increment();
 
if (Fault_Flag)
{
printf("start_of_slice(): MBAinc unsuccessful\n");
return(0); /* trigger: go to next slice */
}
 
/* set current location */
/* NOTE: the arithmetic used to derive macroblock_address below is
* equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
*/
*MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
*MBAinc = 1; /* first macroblock in slice: not skipped */
 
/* reset all DC coefficient and motion vector predictors */
/* reset all DC coefficient and motion vector predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
 
/* successfull: trigger decode macroblocks in slice */
return(1);
}
 
 
/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
static int decode_macroblock(macroblock_type, stwtype, stwclass,
motion_type, dct_type, PMV, dc_dct_pred,
motion_vertical_field_select, dmvector)
int *macroblock_type;
int *stwtype;
int *stwclass;
int *motion_type;
int *dct_type;
int PMV[2][2][2];
int dc_dct_pred[3];
int motion_vertical_field_select[2][2];
int dmvector[2];
{
/* locals */
int quantizer_scale_code;
int comp;
 
int motion_vector_count;
int mv_format;
int dmv;
int mvscale;
int coded_block_pattern;
 
/* SCALABILITY: Data Patitioning */
if (base.scalable_mode==SC_DP)
{
if (base.priority_breakpoint<=2)
ld = &enhan;
else
ld = &base;
}
 
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
macroblock_modes(macroblock_type, stwtype, stwclass,
motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
dct_type);
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
if (*macroblock_type & MACROBLOCK_QUANT)
{
quantizer_scale_code = Get_Bits(5);
 
#ifdef TRACE
if (Trace_Flag)
{
printf("quantiser_scale_code (");
Print_Bits(quantizer_scale_code,5,5);
printf("): %d\n",quantizer_scale_code);
}
#endif /* TRACE */
 
/* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
if (ld->MPEG2_Flag)
ld->quantizer_scale =
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
: (quantizer_scale_code << 1);
else
ld->quantizer_scale = quantizer_scale_code;
 
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
/* make sure base.quantizer_scale is valid */
base.quantizer_scale = ld->quantizer_scale;
}
 
/* motion vectors */
 
 
/* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
 
/* decode forward motion vectors */
if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
|| ((*macroblock_type & MACROBLOCK_INTRA)
&& concealment_motion_vectors))
{
if (ld->MPEG2_Flag)
motion_vectors(PMV,dmvector,motion_vertical_field_select,
0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
dmv,mvscale);
else
motion_vector(PMV[0][0],dmvector,
forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
}
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
/* decode backward motion vectors */
if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
{
if (ld->MPEG2_Flag)
motion_vectors(PMV,dmvector,motion_vertical_field_select,
1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
mvscale);
else
motion_vector(PMV[0][1],dmvector,
backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
}
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
Flush_Buffer(1); /* remove marker_bit */
 
if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
ld = &enhan;
 
/* macroblock_pattern */
/* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
if (*macroblock_type & MACROBLOCK_PATTERN)
{
coded_block_pattern = Get_coded_block_pattern();
 
if (chroma_format==CHROMA422)
{
/* coded_block_pattern_1 */
coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
 
#ifdef TRACE
if (Trace_Flag)
{
printf("coded_block_pattern_1: ");
Print_Bits(coded_block_pattern,2,2);
printf(" (%d)\n",coded_block_pattern&3);
}
#endif /* TRACE */
}
else if (chroma_format==CHROMA444)
{
/* coded_block_pattern_2 */
coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
 
#ifdef TRACE
if (Trace_Flag)
{
printf("coded_block_pattern_2: ");
Print_Bits(coded_block_pattern,6,6);
printf(" (%d)\n",coded_block_pattern&63);
}
#endif /* TRACE */
}
}
else
coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
(1<<block_count)-1 : 0;
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
/* decode blocks */
for (comp=0; comp<block_count; comp++)
{
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
ld = &base;
 
Clear_Block(comp);
 
if (coded_block_pattern & (1<<(block_count-1-comp)))
{
if (*macroblock_type & MACROBLOCK_INTRA)
{
if (ld->MPEG2_Flag)
Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
else
Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
}
else
{
if (ld->MPEG2_Flag)
Decode_MPEG2_Non_Intra_Block(comp);
else
Decode_MPEG1_Non_Intra_Block(comp);
}
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
}
}
 
if(picture_coding_type==D_TYPE)
{
/* remove end_of_macroblock (always 1, prevents startcode emulation) */
/* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
marker_bit("D picture end_of_macroblock bit");
}
 
/* reset intra_dc predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
if (!(*macroblock_type & MACROBLOCK_INTRA))
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
 
/* reset motion vector predictors */
if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
{
/* intra mb without concealment motion vectors */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
}
 
/* special "No_MC" macroblock_type case */
/* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
if ((picture_coding_type==P_TYPE)
&& !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
{
/* non-intra mb without forward mv in a P picture */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
 
/* derive motion_type */
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
if (picture_structure==FRAME_PICTURE)
*motion_type = MC_FRAME;
else
{
*motion_type = MC_FIELD;
/* predict from field of same parity */
motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
}
}
 
if (*stwclass==4)
{
/* purely spatially predicted macroblock */
/* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
}
 
/* successfully decoded macroblock */
return(1);
 
} /* decode_macroblock */
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/spatial.doc
0,0 → 1,154
The following changes have been made to debug spatial scalability:
 
gethdr.c
--------
 
Temporal_reference is used to compute the frame number of each frame,
named true_framenum. The periodic reset at each GOP header as well as
the wrap of temporal_reference at 1024 cause a base value
temp_ref_base to be incremented accordingly.
 
spatscal.c
----------
 
getspatref()
 
A potential problem: Variable char fname[32] was dimensioned
statically and too small.
 
true_framenum is used instead of lower_layer_temporal_reference to
determine the lower layer frame to be read for spatial prediction.
 
The verification of lower_layer_temporal_reference is not possible
since the temporal reference values that have been encoded into the
base layer bitstream are not available to the enhancement layer
decoder.
 
Since there is no decoder timing information available, the rules on
which frames can legally be used as spatial prediction frames cannot
be checked.
 
Lower layer frames are read field-wise or frame-wise, depending on the
lower_layer_progressive_frame flag. Consistency between layers is
checked since the file format for frame and field pictures differs.
 
Note that the base layer decoder must not use the -f option to enforce
frame-wise storage.
 
Note further that only yuv image format (option -o0) is supported as
input format.
 
spatpred()
 
The code for the various combinations of llprog_frame, llfieldsel and
prog_frame has been completed and verified with the tceh_conf23
bitstream that uses all permissive combinations.
 
 
getpic.c
--------
 
A small bug when storing an I- or P-frame: The prog_frame flag that
the decoder knows when storing the oldrefframe belongs to the current
refframe. Therefore the old value of the flag needs to be memorized.
 
 
store.c
-------
 
A potential problem: the filename variables char outname[32],
tmpname[32] are statically dimensioned and quite small.
 
 
The concept of time in this video decoder software
--------------------------------------------------
 
When decoding a non-scalable bitstream, the frame number (i.e.
temporal position) of the current I- or P-frame can be derived
implicitly from the number of preceding B-frames after they have been
decoded. Therefore the temporal_reference entry in the picture header
is somewhat redundant and does not necessarily have to be evaluated in
the decoding process.
 
Decoding of the enhancement layer of a spatial scalable hierarchy,
however, requires to know the temporal position of each frame at the
instant when it is decoded, since data from a lower layer reference
frame has to be incorporated.
 
In the architecture of this video-only decoder decoding of a spatial
scalable hierarchy of bitstreams is done by calling mpeg2decode once
for the base layer bitstream and a second time for the enhancement
layer bitstream, indicating where the decoded base layer frames can be
found (option -s<filename>).
 
Here the concept of time is only present in the form of frame numbers.
Therefore spatial scalable bitstream hierarchies can only be handled
under the assumption that base and enhancement layer bitstreams are
decoded to image sequences where corresponding images of both layers
have identical frame numbers.
 
More specifically this means that base and enhancement layer
bitstreams must contain video with the same frame rate. Furthermore
only the temporally coincident frame of the base layer can be accessed
for spatial prediction by the enhancement layer decoder, since it is
not possible to resolve unambiguously the lower_layer_temporal_reference
which is meant to further specify the lower layer reference frame.
 
======================== SPATIAL.DOC ========================0
 
Decoding a spatial scalable hierarchy of bitstreams
---------------------------------------------------
 
With this video-only decoder decoding of a spatial scalable hierarchy
of bitstreams is done by calling mpeg2decode once for the base layer
bitstream and a second time for the enhancement layer bitstream,
indicating where the decoded base layer frames can be found
(using option -s and supplying <spatial base filename>).
 
mpeg2decode -r -o0 base.mpg base%d%c
mpeg2decode -r -o0 -f -s base%d%c enh.mpg enh%d
 
Note that the base layer decoder must not use the -f option to enforce
frame-wise storage.
 
Note further that only yuv image format (option -o0) is supported as
input format.
 
 
Timing / layer synchronisation in this video decoder software
-------------------------------------------------------------
 
When decoding a non-scalable bitstream, the frame number (i.e.
temporal position) of the current I- or P-frame can be derived
implicitly from the number of preceding B-frames after they have been
decoded. Therefore the temporal_reference entry in the picture header
is somewhat redundant and does not necessarily have to be evaluated in
the decoding process.
 
Decoding of the enhancement layer of a spatial scalable hierarchy,
however, requires to know the temporal position of each frame at the
instant when it is decoded, since data from a lower layer reference
frame has to be incorporated.
 
The concept of time is only present in the form of frame numbers.
Therefore spatial scalable bitstream hierarchies can only be handled
under the assumption that base and enhancement layer bitstreams are
decoded to image sequences where corresponding images of both layers
have identical frame numbers.
 
More specifically this means that base and enhancement layer
bitstreams must contain video with the same frame rate. Furthermore
only the temporally coincident frame of the base layer can be accessed
for spatial prediction by the enhancement layer decoder, since it is
not possible to resolve unambiguously the lower_layer_temporal_reference
which is meant to further specify the lower layer reference frame.
 
Lower layer frames are read field-wise or frame-wise, depending on the
lower_layer_progressive_frame flag. Consistency between layers in this
respect is checked since the file format for frame and field pictures
differs.
 
 
 
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/idctref.c
0,0 → 1,108
/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
* direct matrix multiply) Inverse Discrete Cosine Transform
*/
 
 
/* Here we use math.h to generate constants. Compiler results may
vary a little */
 
#include <math.h>
 
#include "config.h"
 
#ifndef PI
# ifdef M_PI
# define PI M_PI
# else
# define PI 3.14159265358979323846
# endif
#endif
 
/* global declarations */
void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
void Reference_IDCT _ANSI_ARGS_((short *block));
 
/* private data */
 
/* cosine transform matrix for 8x1 IDCT */
static double c[8][8];
 
/* initialize DCT coefficient matrix */
 
void Initialize_Reference_IDCT()
{
int freq, time;
double scale;
 
for (freq=0; freq < 8; freq++)
{
scale = (freq == 0) ? sqrt(0.125) : 0.5;
for (time=0; time<8; time++)
c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
}
}
 
/* perform IDCT matrix multiply for 8x8 coefficient block */
 
void Reference_IDCT(block)
short *block;
{
int i, j, k, v;
double partial_product;
double tmp[64];
 
for (i=0; i<8; i++)
for (j=0; j<8; j++)
{
partial_product = 0.0;
 
for (k=0; k<8; k++)
partial_product+= c[k][j]*block[8*i+k];
 
tmp[8*i+j] = partial_product;
}
 
/* Transpose operation is integrated into address mapping by switching
loop order of i and j */
 
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
partial_product = 0.0;
 
for (k=0; k<8; k++)
partial_product+= c[k][i]*tmp[8*k+j];
 
v = (int) floor(partial_product+0.5);
block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
}
}
/advdemos/tags/rel_1_5_beta1/mpeg2/test.m2v
0,0 → 1,73
³€#ú 0µ‚µ#²MPEG-2 Verification Sequence
¸_¿l@
+Öߧâȧ@¥EJ_‹s6WKXT%• æÐöý$Lµ}iÑG•Â×Çi”@Bí-»’e´aà?{reLRÃùí–D7!GidÞ+fJ–€E +4ãQ#l&ØP8{iªì˳Õ*@«NÅZ؞UȲ©d‹iQ±­Ñ V÷<?'‰Ð¿Š\lU%’À-) ªUk­KèLC a°ä&¶‹t < AMm-¬ÃM!,P“ɨ­n¡0*ùC‚À‰YVìR‚Š<ó&ÁVÄ.SÂÀûfɀS՚’!£éç!Gs²–ÖR£ÍÚCXáÔæó©UÒÏA瞣ì)»‹¶ê 
+8£Ûä[ê©MëÙ@ªù-ƒaV*µ§¬ …H¡v*žÕÈ°øð9BcfÙdž©R’ŽC›VͶŸŒuV?2K<Û
+môxAÈóõ
+ƒÛ›»6C6„(h cÙ Ë ¯ü£hb—|—×Ԑ5‡´7Ñ*y­AÕ–ƒÐåD2µ»M±< ‹áæ2cjÍÞ"ÚJ$”ï؇P¹@ó”åhÛ­ãËf–\Bèß ¦ì\*—e¨PXW†·SgžU4Þ6Ä:D€5­íy… ™ÂÚ6’èÈTnº[Djo˜ùÁnæÎ+½Ý©J&¨ÂgídXPæôÿzñ'ÚoÒ¾EI
+––dßJُ}ÙÜR]­ëVhé$ƒ[©[ˆs2¦ÍÉf.ÑäʉT–Är­m2š²Ñò­µhm +
+³VCÀy$0±¤Ú¥y¡AL»%ô°aGB‚t¶ù1£›ê›¼š”àD!BÔ`ÚXbÙ `B©ò7J¿Ö⏔>éÔl7e£(û
+æ鷺¨²TP&FÁ2¸`JÑ£|Cɍ×v)r(Ö
+µ«Á†ãï–q
+ƒŠROŽ6šZJZ]¡'ÐÚ
+¯º¡Á/‰cz(L{yÿ}®PíûY·#•.Ëi:¥€DÝt¦jˆ60SÌçT‘3qç¦L ¥RÆÖæfU§\ñŽ´6î¶',»k|֐›õñ>>MMï:tåîË%à¥ØùlB†8ûÛ÷ÖóÆÏÆñlHf™-§@Œ
+oÏù–¶ÐÖôÞÈúM×ò.[N)fÉõŠØ}a9MZNF©úvÀü¸”6DK(`E=³]6–X–.ȶŒy¨°¤9¸½~p¢ÉãV’¡MÝÄï](7^m5Nñ¬©u¼q(íÆ­ìòÍëiÃY¢` ۇ^™G@–õNô§QOÈßt¿L°üø6„ÝjµOºøPÂ;Y졛Ÿ-ù?¥(û¼µÝ×òÙìñîn 
+š›˜d++Só>¶ãì¦ç?hù|e–7ä:ÀFVúßÀ!?D\L¢¾æD»²–O?JoŒŠ¦@GÿšÇ8uµ¿9¸rK[í<=N3¥gÐüvÏÖñr,ˆ«‡·šQFÑ(õn3s¥»œû æé–~¯:ú¶ùãËm©u=¿Ð"äþëàvpF²­æ}-¾‰…]67˜›m³$
+Hsy1
+âςe$7<)¹©Ííá}´fç9T¢›ó¥ûgnÑ=åá“Ö{ù@Jw k|O þ\*-6wtôÖMéu€;ù. ^3m o=ÀQ‚Z¾&{·#ÈMû§µJ2ãÛôkTe˜¬±C+£y–ßt‹…“öOc[ÈMÂF¨Ë~ÝҀòñ±°q C«»Fñà€ZúÏF/K·àœÐ`ÿö½¾¼‚40zò÷8X:Îۃ¸}½Ø‹•4Ÿ&’µÍ®CåúÌhcxb8{öµ#=;Â>À @\‡æH¹œU7Æ·”ÆÒo–­ú [§:%'Yð Eƒ‡áu¾VGÉö™«&:õq\g….©[žSr Š9¹¬'D-|[ñ@ãªïŸœ°>A–ßµ“ßîéœ8@¡‹j©·»T†ß–ˆûžýŠ–oÿ¯s`°q„Ùëc~˜Êz/š‹`©‡šT™ nh@ xÔFÄ[ <3Õ¿tF7âRfðE”`K|„RýŠÈýBYÅDSߢÐc|ÔBÿ®žð×¾*Üô<)®þu7âEÛ2­ç~y”àÉ»¨_8;0Cõ|M9¼¤q­æÒ[z¡@…þ"r!7¨1
+nÒf¼!‚k°z G”À"£óßo•Ù؊…”}ômbêÉCç|ßiæäJŽr/è$qÀB¶—ìËՉ…VpòÃË°)¼Ž’]o£oäbˑJÒ!(*Ž¤¶é ‘ᐈ .9aMõûÎQ’H6aë
+¡zÜøTkh{!ùB1¸T‘K ‡þ©U¸¯A{vÌo¹âj‘m…1<[Íw&!2;ŠYð)T±íxYcÛ¯èà¦ø̔šO¶QƝ™dZXŠûK•܋ɹ<ä1Ðí—Yéu
+kue… ñ}RÙaU£
+¼ŒpbQʉüƒÎäøÀş׀ӏ9GWÀàYFlÂÜøðbÿý„àwˆ¢G‘9„g€Ð–<Ï_"wƒðq´7
+dG7xÀD(åšÉ°aÁ`"€j¸6ÿ€h¼È Ȑ4ø{ž}|Àv ÷€Øã8Ÿ @Z ÐÞð6Ø `85‘þ8èÀ9¨nà¾çp*$®õÌ qª€À, ¡¿‘ÀjÒúà@-à6 _ÿ™Cwx €óŸHv`l~x“˜ˆú;‹)ÅՄ¤µÛ
+ÎØðât ÿþ(pát7õƒP€G,s€ÈžO¨ÔÂ)Š´qÔµCÇвQš8¦4â¶Á¯¨_€òÙñ
+õðfÿòp˜v8\ ßþ°5°°³mæèWáÊ$8…—Ð |G4ÀÓÿàGG™¿³Ãˆø:è÷KLÙFƒP³ì© :<0%c&Z›
+ª 7«=”ÈXÀʾ2’²·È7Ô4MðL‚`’
+Ó¦ÔK©V•H@?o•,1¾œ¦‰Ç7Q8G '™‘=őXq¯œÄ§Ç‘€9ÀjeœOàÇQò¸ê\ø¥l©R¡a@QÍ ½ˆ£èññV¡ÛªuJU-Ú*ÙOéFúo’o«hœ`˜% ‘ˆ%¡[1áafð<Öàg
+Käx
+höd ž¨›°êã7ôšÖcÀÛVn {j¹š~e
+BCà ÉxGîmé £àpú
+_UžÖêh‰íùüG±:©*Ê ù±¹¶ à jØ<Ѐ ¼UoÓcÍ4J–c#Àа•¦lGð €
+pwà"aPД9áî €ñà>€P ÿA¿áTM•®•ï>Y=ï¨1B«h ÚV,Qжó@|ß^f@6څÂPpI>À_‘’ŒWl9húAa®X .Ð`-=C
+)ÖÀ|Á†¢ävËרMã¬h%dÏ·b7´v„½ Ò ‚
+éã~# ø¿ÄÎ.U¤ŸèNcŋ%"-SÖÙ©?Ñ
+¢u…Ž0]ôÎ<Œ¨ªy æ€éÄÁ :É¢^¬Z"¹Ù0œAËóàaIc*°gkР½½ˆ0º}úÀb€GBu„ÀjbyQi*INm¡¢ÊAÏóÑ ¡‰úá–Éʵ¬wÖã…Ñ;AÇ@à5æûK›Ÿ‹R'ùtN0ŒÁ€†€äd–R_n΋NC{›øb¾à¼áƒ\hxޅFQ9ÃçÐox{HPÓÿiD€ý?@áõ·
\ No newline at end of file
/advdemos/tags/rel_1_5_beta1/mpeg2/getbits.c
0,0 → 1,202
/* getbits.c, bit level routines */
 
/*
* All modifications (mpeg2decode -> mpeg2play) are
* Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
*/
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
#include <stdlib.h>
 
#include "config.h"
#include "global.h"
 
/* initialize buffer, call once before first getbits or showbits */
 
void Initialize_Buffer()
{
ld->Incnt = 0;
ld->Rdptr = ld->Rdbfr + 2048;
ld->Rdmax = ld->Rdptr;
 
#ifdef VERIFY
/* only the verifier uses this particular bit counter
* Bitcnt keeps track of the current parser position with respect
* to the video elementary stream being decoded, regardless
* of whether or not it is wrapped within a systems layer stream
*/
ld->Bitcnt = 0;
#endif
 
ld->Bfr = 0;
Flush_Buffer(0); /* fills valid data into bfr */
}
 
void Fill_Buffer()
{
int Buffer_Level;
 
Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
ld->Rdptr = ld->Rdbfr;
 
if (System_Stream_Flag)
ld->Rdmax -= 2048;
 
/* end of the bitstream file */
if (Buffer_Level < 2048)
{
/* just to be safe */
if (Buffer_Level < 0)
Buffer_Level = 0;
 
/* pad until the next to the next 32-bit word boundary */
while (Buffer_Level & 3)
ld->Rdbfr[Buffer_Level++] = 0;
 
/* pad the buffer with sequence end codes */
while (Buffer_Level < 2048)
{
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
}
}
}
 
 
/* MPEG-1 system layer demultiplexer */
 
int Get_Byte()
{
while(ld->Rdptr >= ld->Rdbfr+2048)
{
read(ld->Infile,ld->Rdbfr,2048);
ld->Rdptr -= 2048;
ld->Rdmax -= 2048;
}
return *ld->Rdptr++;
}
 
/* extract a 16-bit word from the bitstream buffer */
int Get_Word()
{
int Val;
 
Val = Get_Byte();
return (Val<<8) | Get_Byte();
}
 
 
/* return next n bits (right adjusted) without advancing */
 
unsigned int Show_Bits(N)
int N;
{
return ld->Bfr >> (32-N);
}
 
 
/* return next bit (could be made faster than Get_Bits(1)) */
 
unsigned int Get_Bits1()
{
return Get_Bits(1);
}
 
 
/* advance by n bits */
 
void Flush_Buffer(N)
int N;
{
int Incnt;
 
ld->Bfr <<= N;
 
Incnt = ld->Incnt -= N;
 
if (Incnt <= 24)
{
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
{
do
{
if (ld->Rdptr >= ld->Rdmax)
Next_Packet();
ld->Bfr |= Get_Byte() << (24 - Incnt);
Incnt += 8;
}
while (Incnt <= 24);
}
else if (ld->Rdptr < ld->Rdbfr+2044)
{
do
{
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
Incnt += 8;
}
while (Incnt <= 24);
}
else
{
do
{
if (ld->Rdptr >= ld->Rdbfr+2048)
Fill_Buffer();
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
Incnt += 8;
}
while (Incnt <= 24);
}
ld->Incnt = Incnt;
}
 
#ifdef VERIFY
ld->Bitcnt += N;
#endif /* VERIFY */
 
}
 
 
/* return next n bits (right adjusted) */
 
unsigned int Get_Bits(N)
int N;
{
unsigned int Val;
 
Val = Show_Bits(N);
Flush_Buffer(N);
 
return Val;
}
 
/advdemos/tags/rel_1_5_beta1/mpeg2/store.ori
0,0 → 1,576
/* store.c, picture output routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
 
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void store_one _ANSI_ARGS_((char *outname, unsigned char *src[],
int offset, int incr, int height));
static void store_yuv _ANSI_ARGS_((char *outname, unsigned char *src[],
int offset, int incr, int height));
static void store_sif _ANSI_ARGS_((char *outname, unsigned char *src[],
int offset, int incr, int height));
static void store_ppm_tga _ANSI_ARGS_((char *outname, unsigned char *src[],
int offset, int incr, int height, int tgaflag));
static void store_yuv1 _ANSI_ARGS_((char *name, unsigned char *src,
int offset, int incr, int width, int height));
static void putbyte _ANSI_ARGS_((int c));
static void putword _ANSI_ARGS_((int w));
static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
 
#define OBFRSIZE 4096
static unsigned char obfr[OBFRSIZE];
static unsigned char *optr;
static int outfile;
 
/*
* store a picture as either one frame or two fields
*/
void Write_Frame(src,frame)
unsigned char *src[];
int frame;
{
char outname[FILENAME_LENGTH];
 
if (progressive_sequence || progressive_frame || Frame_Store_Flag)
{
/* progressive */
sprintf(outname,Output_Picture_Filename,frame,'f');
store_one(outname,src,0,Coded_Picture_Width,vertical_size);
}
else
{
/* interlaced */
sprintf(outname,Output_Picture_Filename,frame,'a');
store_one(outname,src,0,Coded_Picture_Width<<1,vertical_size>>1);
 
sprintf(outname,Output_Picture_Filename,frame,'b');
store_one(outname,src,
Coded_Picture_Width,Coded_Picture_Width<<1,vertical_size>>1);
}
}
 
/*
* store one frame or one field
*/
static void store_one(outname,src,offset,incr,height)
char *outname;
unsigned char *src[];
int offset, incr, height;
{
switch (Output_Type)
{
case T_YUV:
store_yuv(outname,src,offset,incr,height);
break;
case T_SIF:
store_sif(outname,src,offset,incr,height);
break;
case T_TGA:
store_ppm_tga(outname,src,offset,incr,height,1);
break;
case T_PPM:
store_ppm_tga(outname,src,offset,incr,height,0);
break;
#ifdef DISPLAY
case T_X11:
dither(src);
break;
#endif
default:
break;
}
}
 
/* separate headerless files for y, u and v */
static void store_yuv(outname,src,offset,incr,height)
char *outname;
unsigned char *src[];
int offset,incr,height;
{
int hsize;
char tmpname[FILENAME_LENGTH];
 
hsize = horizontal_size;
 
sprintf(tmpname,"%s.Y",outname);
store_yuv1(tmpname,src[0],offset,incr,hsize,height);
 
if (chroma_format!=CHROMA444)
{
offset>>=1; incr>>=1; hsize>>=1;
}
 
if (chroma_format==CHROMA420)
{
height>>=1;
}
 
sprintf(tmpname,"%s.U",outname);
store_yuv1(tmpname,src[1],offset,incr,hsize,height);
 
sprintf(tmpname,"%s.V",outname);
store_yuv1(tmpname,src[2],offset,incr,hsize,height);
}
 
/* auxiliary routine */
static void store_yuv1(name,src,offset,incr,width,height)
char *name;
unsigned char *src;
int offset,incr,width,height;
{
int i, j;
unsigned char *p;
 
if (!Quiet_Flag)
fprintf(stderr,"saving %s\n",name);
 
if ((outfile = open(name,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
{
sprintf(Error_Text,"Couldn't create %s\n",name);
Error(Error_Text);
}
 
optr=obfr;
 
for (i=0; i<height; i++)
{
p = src + offset + incr*i;
for (j=0; j<width; j++)
putbyte(*p++);
}
 
if (optr!=obfr)
write(outfile,obfr,optr-obfr);
 
close(outfile);
}
 
/*
* store as headerless file in U,Y,V,Y format
*/
static void store_sif (outname,src,offset,incr,height)
char *outname;
unsigned char *src[];
int offset, incr, height;
{
int i,j;
unsigned char *py, *pu, *pv;
static unsigned char *u422, *v422;
 
if (chroma_format==CHROMA444)
Error("4:4:4 not supported for SIF format");
 
if (chroma_format==CHROMA422)
{
u422 = src[1];
v422 = src[2];
}
else
{
if (!u422)
{
if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
}
conv420to422(src[1],u422);
conv420to422(src[2],v422);
}
 
strcat(outname,".SIF");
 
if (!Quiet_Flag)
fprintf(stderr,"saving %s\n",outname);
 
if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
{
sprintf(Error_Text,"Couldn't create %s\n",outname);
Error(Error_Text);
}
 
optr = obfr;
 
for (i=0; i<height; i++)
{
py = src[0] + offset + incr*i;
pu = u422 + (offset>>1) + (incr>>1)*i;
pv = v422 + (offset>>1) + (incr>>1)*i;
 
for (j=0; j<horizontal_size; j+=2)
{
putbyte(*pu++);
putbyte(*py++);
putbyte(*pv++);
putbyte(*py++);
}
}
 
if (optr!=obfr)
write(outfile,obfr,optr-obfr);
 
close(outfile);
}
 
/*
* store as PPM (PBMPLUS) or uncompressed Truevision TGA ('Targa') file
*/
static void store_ppm_tga(outname,src,offset,incr,height,tgaflag)
char *outname;
unsigned char *src[];
int offset, incr, height;
int tgaflag;
{
int i, j;
int y, u, v, r, g, b;
int crv, cbu, cgu, cgv;
unsigned char *py, *pu, *pv;
static unsigned char tga24[14] = {0,0,2,0,0,0,0, 0,0,0,0,0,24,32};
char header[FILENAME_LENGTH];
static unsigned char *u422, *v422, *u444, *v444;
 
if (chroma_format==CHROMA444)
{
u444 = src[1];
v444 = src[2];
}
else
{
if (!u444)
{
if (chroma_format==CHROMA420)
{
if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
}
 
if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
*Coded_Picture_Height)))
Error("malloc failed");
 
if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
*Coded_Picture_Height)))
Error("malloc failed");
}
 
if (chroma_format==CHROMA420)
{
conv420to422(src[1],u422);
conv420to422(src[2],v422);
conv422to444(u422,u444);
conv422to444(v422,v444);
}
else
{
conv422to444(src[1],u444);
conv422to444(src[2],v444);
}
}
 
strcat(outname,tgaflag ? ".tga" : ".ppm");
 
if (!Quiet_Flag)
fprintf(stderr,"saving %s\n",outname);
 
if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
{
sprintf(Error_Text,"Couldn't create %s\n",outname);
Error(Error_Text);
}
 
optr = obfr;
 
if (tgaflag)
{
/* TGA header */
for (i=0; i<12; i++)
putbyte(tga24[i]);
 
putword(horizontal_size); putword(height);
putbyte(tga24[12]); putbyte(tga24[13]);
}
else
{
/* PPM header */
sprintf(header,"P6\n%d %d\n255\n",horizontal_size,height);
 
for (i=0; header[i]!=0; i++)
putbyte(header[i]);
}
 
/* matrix coefficients */
crv = Inverse_Table_6_9[matrix_coefficients][0];
cbu = Inverse_Table_6_9[matrix_coefficients][1];
cgu = Inverse_Table_6_9[matrix_coefficients][2];
cgv = Inverse_Table_6_9[matrix_coefficients][3];
for (i=0; i<height; i++)
{
py = src[0] + offset + incr*i;
pu = u444 + offset + incr*i;
pv = v444 + offset + incr*i;
 
for (j=0; j<horizontal_size; j++)
{
u = *pu++ - 128;
v = *pv++ - 128;
y = 76309 * (*py++ - 16); /* (255/219)*65536 */
r = Clip[(y + crv*v + 32768)>>16];
g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
b = Clip[(y + cbu*u + 32786)>>16];
 
if (tgaflag)
{
putbyte(b); putbyte(g); putbyte(r);
}
else
{
putbyte(r); putbyte(g); putbyte(b);
}
}
}
 
if (optr!=obfr)
write(outfile,obfr,optr-obfr);
 
close(outfile);
}
 
static void putbyte(c)
int c;
{
*optr++ = c;
 
if (optr == obfr+OBFRSIZE)
{
write(outfile,obfr,OBFRSIZE);
optr = obfr;
}
}
 
static void putword(w)
int w;
{
putbyte(w); putbyte(w>>8);
}
 
/* horizontal 1:2 interpolation filter */
static void conv422to444(src,dst)
unsigned char *src,*dst;
{
int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
 
w = Coded_Picture_Width>>1;
 
if (base.MPEG2_Flag)
{
for (j=0; j<Coded_Picture_Height; j++)
{
for (i=0; i<w; i++)
{
i2 = i<<1;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<w-1) ? i+1 : w-1;
ip2 = (i<w-2) ? i+2 : w-1;
ip3 = (i<w-3) ? i+3 : w-1;
 
/* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
/* even samples (0 0 256 0 0) */
dst[i2] = src[i];
 
/* odd samples (21 -52 159 159 -52 21) */
dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
-52*(src[im1]+src[ip2])
+159*(src[i]+src[ip1])+128)>>8];
}
src+= w;
dst+= Coded_Picture_Width;
}
}
else
{
for (j=0; j<Coded_Picture_Height; j++)
{
for (i=0; i<w; i++)
{
 
i2 = i<<1;
im3 = (i<3) ? 0 : i-3;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<w-1) ? i+1 : w-1;
ip2 = (i<w-2) ? i+2 : w-1;
ip3 = (i<w-3) ? i+3 : w-1;
 
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
dst[i2] = Clip[(int)( 5*src[im3]
-21*src[im2]
+70*src[im1]
+228*src[i]
-37*src[ip1]
+11*src[ip2]+128)>>8];
 
dst[i2+1] = Clip[(int)( 5*src[ip3]
-21*src[ip2]
+70*src[ip1]
+228*src[i]
-37*src[im1]
+11*src[im2]+128)>>8];
}
src+= w;
dst+= Coded_Picture_Width;
}
}
}
 
/* vertical 1:2 interpolation filter */
static void conv420to422(src,dst)
unsigned char *src,*dst;
{
int w, h, i, j, j2;
int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
 
w = Coded_Picture_Width>>1;
h = Coded_Picture_Height>>1;
 
if (progressive_frame)
{
/* intra frame */
for (i=0; i<w; i++)
{
for (j=0; j<h; j++)
{
j2 = j<<1;
jm3 = (j<3) ? 0 : j-3;
jm2 = (j<2) ? 0 : j-2;
jm1 = (j<1) ? 0 : j-1;
jp1 = (j<h-1) ? j+1 : h-1;
jp2 = (j<h-2) ? j+2 : h-1;
jp3 = (j<h-3) ? j+3 : h-1;
 
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
/* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
dst[w*j2] = Clip[(int)( 3*src[w*jm3]
-16*src[w*jm2]
+67*src[w*jm1]
+227*src[w*j]
-32*src[w*jp1]
+7*src[w*jp2]+128)>>8];
 
dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
-16*src[w*jp2]
+67*src[w*jp1]
+227*src[w*j]
-32*src[w*jm1]
+7*src[w*jm2]+128)>>8];
}
src++;
dst++;
}
}
else
{
/* intra field */
for (i=0; i<w; i++)
{
for (j=0; j<h; j+=2)
{
j2 = j<<1;
 
/* top field */
jm6 = (j<6) ? 0 : j-6;
jm4 = (j<4) ? 0 : j-4;
jm2 = (j<2) ? 0 : j-2;
jp2 = (j<h-2) ? j+2 : h-2;
jp4 = (j<h-4) ? j+4 : h-2;
jp6 = (j<h-6) ? j+6 : h-2;
 
/* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
/* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
dst[w*j2] = Clip[(int)( 1*src[w*jm6]
-7*src[w*jm4]
+30*src[w*jm2]
+248*src[w*j]
-21*src[w*jp2]
+5*src[w*jp4]+128)>>8];
 
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
-35*src[w*jm2]
+194*src[w*j]
+110*src[w*jp2]
-24*src[w*jp4]
+4*src[w*jp6]+128)>>8];
 
/* bottom field */
jm5 = (j<5) ? 1 : j-5;
jm3 = (j<3) ? 1 : j-3;
jm1 = (j<1) ? 1 : j-1;
jp1 = (j<h-1) ? j+1 : h-1;
jp3 = (j<h-3) ? j+3 : h-1;
jp5 = (j<h-5) ? j+5 : h-1;
jp7 = (j<h-7) ? j+7 : h-1;
 
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
-35*src[w*jp3]
+194*src[w*jp1]
+110*src[w*jm1]
-24*src[w*jm3]
+4*src[w*jm5]+128)>>8];
 
dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
-7*src[w*jp5]
+30*src[w*jp3]
+248*src[w*jp1]
-21*src[w*jm1]
+5*src[w*jm3]+128)>>8];
}
src++;
dst++;
}
}
}
/advdemos/tags/rel_1_5_beta1/mpeg2/verify.c
0,0 → 1,303
/* verify.c
*
* Bitstream verification routines
*
*
*/
#ifdef VERIFY
 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <math.h> /* needed for ceil() */
 
#include "config.h"
#include "global.h"
 
/* #define DEBUG */
#ifdef DEBUG
#define PC
#endif
 
#ifdef PC
#include <conio.h> /* needed for getch() */
#endif /* PC */
 
/*
Check picture headers: due to the VBV definition of picture data,
this routine must be called immediately before any picture data
is parsed. (before the first slice start code, including any slice
start code stuffing).
*/
 
 
static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
 
 
void Check_Headers(Bitstream_Framenum, Sequence_Framenum)
int Bitstream_Framenum;
int Sequence_Framenum;
{
 
 
if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF))
Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum);
 
/* clear out the header tracking variables so we have an accurate
count next time */
Clear_Verify_Headers();
}
 
 
 
/*
* Verify vbv_delay value in picture header
* (low_delay==1 checks not implemented. this does not exhaustively test all
* possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks
* for constant rate streams)
*
* Q:how do we tell a variable rate stream from a constant rate stream anyway?
* it's not as simple as vbv_delay==0xFFFF, since we need meaningful
* vbv_delay values to calculate the piecewise rate in the first place!
*
* Also: no special provisions at the beginning or end of a sequence
*/
 
static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum)
int Bitstream_Framenum;
int Sequence_Framenum;
{
double B; /* buffer size */
double Bn; /* buffer fullness for picture n */
double R; /* bitrate */
double I; /* time interval (t[n+1] - t[n]) */
double T; /* inverse of the frame rate (frame period) */
 
int d;
int internal_vbv_delay;
static int previous_IorP_picture_structure;
static int previous_IorP_repeat_first_field;
static int previous_IorP_top_field_first;
static int previous_vbv_delay;
static int previous_bitstream_position;
 
static double previous_Bn;
static double E; /* maximum quantization error or mismatch */
 
 
if((Sequence_Framenum==0)&&(!Second_Field))
{ /* first coded picture of sequence */
 
R = bit_rate;
 
/* the initial buffer occupancy is taken on faith
that is, we believe what is transmitted in the first coded picture header
to be the true/actual buffer occupancy */
Bn = (R * (double) vbv_delay) / 90000.0;
B = 16 * 1024 * vbv_buffer_size;
 
/* maximum quantization error in bitrate (bit_rate_value is quantized/
rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2
section 6.3.3 */
E = (400.0/frame_rate) + 400;
 
#ifdef DEBUG
printf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n",
B, Bn, E, bit_rate, vbv_delay, frame_rate);
#endif
 
}
else /* not the first coded picture of sequence */
{
 
/* derive the interval (I). The interval tells us how many constant rate bits
* will have been downloaded to the buffer during the current picture period
*
* interval assumes that:
* 1. whilst we are decoding the current I or P picture, we are displaying
* the previous I or P picture which was stored in the reorder
* buffer (pointed to by forward_reference_frame in this implementation)
*
* 2. B pictures are output ("displayed") at the time when they are decoded
*
*/
 
if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */
{
 
T = 1/frame_rate; /* inverse of the frame rate (frame period) */
 
if(picture_coding_type==B_TYPE)
{
if(repeat_first_field==1)
{
if(top_field_first==1)
I = T*3; /* three frame periods */
else
I = T*2; /* two frame periods */
}
else
I = T; /* one frame period */
}
else /* P or I frame */
{
if(previous_IorP_repeat_first_field==1)
{
if(previous_IorP_top_field_first==1)
I = 3*T;
else
I = 2*T;
}
else
I = T;
}
}
else /* Annex C.11 (progressive_sequence==0, low_delay==0) */
{
T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */
 
if(picture_coding_type==B_TYPE)
{
if(picture_structure==FRAME_PICTURE)
{
if(repeat_first_field==0)
I = 2*T; /* two field periods */
else
I = 3*T; /* three field periods */
}
else /* B field */
{
I = T; /* one field period */
}
}
else /* I or P picture */
{
if(picture_structure==FRAME_PICTURE)
{
if(previous_IorP_repeat_first_field==0)
I = 2*T;
else
I = 3*T;
}
else
{
if(Second_Field==0) /* first field of current frame */
I = T;
else /* second field of current frame */
{
/* formula: previous I or P display period (2*T or 3*T) minus the
very recent decode period (T) of the first field of the current
frame */
 
if(previous_IorP_picture_structure!=FRAME_PICTURE
|| previous_IorP_repeat_first_field==0)
I = 2*T - T; /* a net of one field period */
else if(previous_IorP_picture_structure==FRAME_PICTURE
&& previous_IorP_repeat_first_field==1)
I = 3*T - T; /* a net of two field periods */
}
}
}
}
 
/* derive coded size of previous picture */
d = ld->Bitcnt - previous_bitstream_position;
 
/* Rate = Distance/Time */
 
/* piecewise constant rate (variable rate stream) calculation
* R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I));
*/
 
R = bit_rate;
 
/* compute buffer fullness just before removing picture n
*
* Bn = previous_Bn + (I*R) - d; (recursive formula)
*
* where:
*
* n is the current picture
*
* Bn is the buffer fullness for the current picture
*
* previous_Bn is the buffer fullness of the previous picture
*
* (I*R ) is the bits accumulated during the current picture
* period
*
* d is the number of bits removed during the decoding of the
* previous picture
*/
 
Bn = previous_Bn + (I*R) - d;
 
/* compute internally derived vbv_delay (rouding up with ceil()) */
internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate));
 
#ifdef DEBUG
printf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay);
printf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d);
printf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum,
picture_structure, picture_coding_type);
 
/* report error */
if(internal_vbv_delay != vbv_delay)
{
printf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n",
internal_vbv_delay, vbv_delay);
}
#endif
 
} /* not the first coded picture of sequence */
 
 
#ifdef PC
getch();
#endif /* PC */
/* update generic tracking variables */
previous_bitstream_position = ld->Bitcnt ;
previous_vbv_delay = vbv_delay;
previous_Bn = Bn;
 
/* reference picture: reordered/delayed output picture */
if(picture_coding_type!=B_TYPE)
{
previous_IorP_repeat_first_field = repeat_first_field;
previous_IorP_top_field_first = top_field_first;
previous_IorP_picture_structure = picture_structure;
}
 
}
 
 
 
/* variables to keep track of the occurance of redundant headers between pictures */
void Clear_Verify_Headers()
{
verify_sequence_header = 0;
verify_group_of_pictures_header = 0;
verify_picture_header = 0;
verify_slice_header = 0;
verify_sequence_extension = 0;
verify_sequence_display_extension = 0;
verify_quant_matrix_extension = 0;
verify_sequence_scalable_extension = 0;
verify_picture_display_extension = 0;
verify_picture_coding_extension = 0;
verify_picture_spatial_scalable_extension = 0;
verify_picture_temporal_scalable_extension = 0;
verify_copyright_extension = 0;
}
 
#endif /* VERIFY */
 
/advdemos/tags/rel_1_5_beta1/mpeg2/motion.c
0,0 → 1,236
/* motion.c, motion vector decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
 
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code,
int motion_residualesidual, int full_pel_vector));
 
/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
void motion_vectors(PMV,dmvector,
motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale)
int PMV[2][2][2];
int dmvector[2];
int motion_vertical_field_select[2][2];
int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale;
{
if (motion_vector_count==1)
{
if (mv_format==MV_FIELD && !dmv)
{
motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1);
#ifdef TRACE
if (Trace_Flag)
{
printf("motion_vertical_field_select[][%d] (%d): %d\n",s,
motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
}
#endif /* TRACE */
}
 
motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
 
/* update other motion vector predictors */
PMV[1][s][0] = PMV[0][s][0];
PMV[1][s][1] = PMV[0][s][1];
}
else
{
motion_vertical_field_select[0][s] = Get_Bits(1);
#ifdef TRACE
if (Trace_Flag)
{
printf("motion_vertical_field_select[0][%d] (%d): %d\n",s,
motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
}
#endif /* TRACE */
motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
 
motion_vertical_field_select[1][s] = Get_Bits(1);
#ifdef TRACE
if (Trace_Flag)
{
printf("motion_vertical_field_select[1][%d] (%d): %d\n",s,
motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]);
}
#endif /* TRACE */
motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
}
}
 
/* get and decode motion vector and differential motion vector
for one prediction */
void motion_vector(PMV,dmvector,
h_r_size,v_r_size,dmv,mvscale,full_pel_vector)
int *PMV;
int *dmvector;
int h_r_size;
int v_r_size;
int dmv; /* MPEG-2 only: get differential motion vectors */
int mvscale; /* MPEG-2 only: field vector in frame pic */
int full_pel_vector; /* MPEG-1 only */
{
int motion_code, motion_residual;
 
/* horizontal component */
/* ISO/IEC 13818-2 Table B-10 */
motion_code = Get_motion_code();
 
motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
 
#ifdef TRACE
if (Trace_Flag)
{
if (h_r_size!=0 && motion_code!=0)
{
printf("motion_residual (");
Print_Bits(motion_residual,h_r_size,h_r_size);
printf("): %d\n",motion_residual);
}
}
#endif /* TRACE */
 
 
decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
 
if (dmv)
dmvector[0] = Get_dmvector();
 
 
/* vertical component */
motion_code = Get_motion_code();
motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
 
#ifdef TRACE
if (Trace_Flag)
{
if (v_r_size!=0 && motion_code!=0)
{
printf("motion_residual (");
Print_Bits(motion_residual,v_r_size,v_r_size);
printf("): %d\n",motion_residual);
}
}
#endif /* TRACE */
 
if (mvscale)
PMV[1] >>= 1; /* DIV 2 */
 
decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
 
if (mvscale)
PMV[1] <<= 1;
 
if (dmv)
dmvector[1] = Get_dmvector();
 
#ifdef TRACE
if (Trace_Flag)
printf("PMV = %d,%d\n",PMV[0],PMV[1]);
#endif /* TRACE */
}
 
/* calculate motion vector component */
/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
/* Note: the arithmetic here is more elegant than that which is shown
in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */
 
static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector)
int *pred;
int r_size, motion_code, motion_residual;
int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */
{
int lim, vec;
 
lim = 16<<r_size;
vec = full_pel_vector ? (*pred >> 1) : (*pred);
 
if (motion_code>0)
{
vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
if (vec>=lim)
vec-= lim + lim;
}
else if (motion_code<0)
{
vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
if (vec<-lim)
vec+= lim + lim;
}
*pred = full_pel_vector ? (vec<<1) : vec;
}
 
 
/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy)
int DMV[][2];
int *dmvector; /* differential motion vector */
int mvx, mvy; /* decoded mv components (always in field format) */
{
if (picture_structure==FRAME_PICTURE)
{
if (top_field_first)
{
/* vector for prediction of top field from bottom field */
DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1;
 
/* vector for prediction of bottom field from top field */
DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
}
else
{
/* vector for prediction of top field from bottom field */
DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
 
/* vector for prediction of bottom field from top field */
DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1;
}
}
else
{
/* vector for prediction from field of opposite 'parity' */
DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
 
/* correct for vertical field shift */
if (picture_structure==TOP_FIELD)
DMV[0][1]--;
else
DMV[0][1]++;
}
}
 
/advdemos/tags/rel_1_5_beta1/mpeg2/global.h
0,0 → 1,515
/* global.h, global variables */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "mpeg2dec.h"
 
/* choose between declaration (GLOBAL undefined)
* and definition (GLOBAL defined)
* GLOBAL is defined in exactly one file mpeg2dec.c)
*/
 
#ifndef GLOBAL
#define EXTERN extern
#else
#define EXTERN
#endif
 
/* prototypes of global functions */
/* readpic.c */
void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum,
int sequence_framenum));
 
/* Get_Bits.c */
void Initialize_Buffer _ANSI_ARGS_((void));
void Fill_Buffer _ANSI_ARGS_((void));
unsigned int Show_Bits _ANSI_ARGS_((int n));
unsigned int Get_Bits1 _ANSI_ARGS_((void));
void Flush_Buffer _ANSI_ARGS_((int n));
unsigned int Get_Bits _ANSI_ARGS_((int n));
int Get_Byte _ANSI_ARGS_((void));
int Get_Word _ANSI_ARGS_((void));
 
/* systems.c */
void Next_Packet _ANSI_ARGS_((void));
int Get_Long _ANSI_ARGS_((void));
void Flush_Buffer32 _ANSI_ARGS_((void));
unsigned int Get_Bits32 _ANSI_ARGS_((void));
 
 
/* getblk.c */
void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
 
/* gethdr.c */
int Get_Hdr _ANSI_ARGS_((void));
void next_start_code _ANSI_ARGS_((void));
int slice_header _ANSI_ARGS_((void));
void marker_bit _ANSI_ARGS_((char *text));
 
/* getpic.c */
void Decode_Picture _ANSI_ARGS_((int bitstream_framenum,
int sequence_framenum));
void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
 
/* getvlc.c */
int Get_macroblock_type _ANSI_ARGS_((void));
int Get_motion_code _ANSI_ARGS_((void));
int Get_dmvector _ANSI_ARGS_((void));
int Get_coded_block_pattern _ANSI_ARGS_((void));
int Get_macroblock_address_increment _ANSI_ARGS_((void));
int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
 
/* idct.c */
void Fast_IDCT _ANSI_ARGS_((short *block));
void Initialize_Fast_IDCT _ANSI_ARGS_((void));
 
/* Reference_IDCT.c */
void Initialize_Reference_IDCT _ANSI_ARGS_((void));
void Reference_IDCT _ANSI_ARGS_((short *block));
 
/* motion.c */
void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
int motion_vertical_field_select[2][2], int s, int motion_vector_count,
int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
 
/* mpeg2dec.c */
void Error _ANSI_ARGS_((char *text));
void Warning _ANSI_ARGS_((char *text));
void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
 
/* recon.c */
void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type,
int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
int dmvector[2], int stwtype));
 
/* spatscal.c */
void Spatial_Prediction _ANSI_ARGS_((void));
 
/* store.c */
void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
 
#ifdef DISPLAY
/* display.c */
void Initialize_Display_Process _ANSI_ARGS_((char *name));
void Terminate_Display_Process _ANSI_ARGS_((void));
void Display_Second_Field _ANSI_ARGS_((void));
void dither _ANSI_ARGS_((unsigned char *src[]));
void Initialize_Dither_Matrix _ANSI_ARGS_((void));
#endif
 
/* global variables */
 
EXTERN char Version[]
#ifdef GLOBAL
="mpeg2decode V1.2a, 96/07/19"
#endif
;
 
EXTERN char Author[]
#ifdef GLOBAL
="(C) 1996, MPEG Software Simulation Group"
#endif
;
 
 
/* zig-zag and alternate scan patterns */
EXTERN unsigned char scan[2][64]
#ifdef GLOBAL
=
{
{ /* Zig-Zag scan pattern */
0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
},
{ /* Alternate scan pattern */
0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
}
}
#endif
;
 
/* default intra quantization matrix */
EXTERN unsigned char default_intra_quantizer_matrix[64]
#ifdef GLOBAL
=
{
8, 16, 19, 22, 26, 27, 29, 34,
16, 16, 22, 24, 27, 29, 34, 37,
19, 22, 26, 27, 29, 34, 34, 38,
22, 22, 26, 27, 29, 34, 37, 40,
22, 26, 27, 29, 32, 35, 40, 48,
26, 27, 29, 32, 35, 40, 48, 58,
26, 27, 29, 34, 38, 46, 56, 69,
27, 29, 35, 38, 46, 56, 69, 83
}
#endif
;
 
/* non-linear quantization coefficient table */
EXTERN unsigned char Non_Linear_quantizer_scale[32]
#ifdef GLOBAL
=
{
0, 1, 2, 3, 4, 5, 6, 7,
8,10,12,14,16,18,20,22,
24,28,32,36,40,44,48,52,
56,64,72,80,88,96,104,112
}
#endif
;
 
/* color space conversion coefficients
* for YCbCr -> RGB mapping
*
* entries are {crv,cbu,cgu,cgv}
*
* crv=(255/224)*65536*(1-cr)/0.5
* cbu=(255/224)*65536*(1-cb)/0.5
* cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
* cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
*
* where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
*/
 
/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
 
EXTERN int Inverse_Table_6_9[8][4]
#ifdef GLOBAL
=
{
{117504, 138453, 13954, 34903}, /* no sequence_display_extension */
{117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
{104597, 132201, 25675, 53279}, /* unspecified */
{104597, 132201, 25675, 53279}, /* reserved */
{104448, 132798, 24759, 53109}, /* FCC */
{104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
{104597, 132201, 25675, 53279}, /* SMPTE 170M */
{117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
}
#endif
;
 
 
 
 
 
/* output types (Output_Type) */
#define T_YUV 0
#define T_SIF 1
#define T_TGA 2
#define T_PPM 3
#define T_X11 4
#define T_X11HIQ 5
 
/* decoder operation control variables */
EXTERN int Output_Type;
EXTERN int hiQdither;
 
/* decoder operation control flags */
EXTERN int Quiet_Flag;
EXTERN int Trace_Flag;
EXTERN int Fault_Flag;
EXTERN int Verbose_Flag;
EXTERN int Two_Streams;
EXTERN int Spatial_Flag;
EXTERN int Reference_IDCT_Flag;
EXTERN int Frame_Store_Flag;
EXTERN int System_Stream_Flag;
EXTERN int Display_Progressive_Flag;
EXTERN int Ersatz_Flag;
EXTERN int Big_Picture_Flag;
EXTERN int Verify_Flag;
EXTERN int Stats_Flag;
EXTERN int User_Data_Flag;
EXTERN int Main_Bitstream_Flag;
 
 
/* filenames */
EXTERN char *Output_Picture_Filename;
EXTERN char *Substitute_Picture_Filename;
EXTERN char *Main_Bitstream_Filename;
EXTERN char *Enhancement_Layer_Bitstream_Filename;
 
 
/* buffers for multiuse purposes */
EXTERN char Error_Text[256];
EXTERN unsigned char *Clip;
 
/* pointers to generic picture buffers */
EXTERN unsigned char *backward_reference_frame[3];
EXTERN unsigned char *forward_reference_frame[3];
 
EXTERN unsigned char *auxframe[3];
EXTERN unsigned char *current_frame[3];
EXTERN unsigned char *substitute_frame[3];
 
 
/* pointers to scalability picture buffers */
EXTERN unsigned char *llframe0[3];
EXTERN unsigned char *llframe1[3];
 
EXTERN short *lltmp;
EXTERN char *Lower_Layer_Picture_Filename;
 
 
 
 
/* non-normative variables derived from normative elements */
EXTERN int Coded_Picture_Width;
EXTERN int Coded_Picture_Height;
EXTERN int Chroma_Width;
EXTERN int Chroma_Height;
EXTERN int block_count;
EXTERN int Second_Field;
EXTERN int profile, level;
 
/* normative derived variables (as per ISO/IEC 13818-2) */
EXTERN int horizontal_size;
EXTERN int vertical_size;
EXTERN int mb_width;
EXTERN int mb_height;
EXTERN double bit_rate;
EXTERN double frame_rate;
 
 
 
/* headers */
 
/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
EXTERN int aspect_ratio_information;
EXTERN int frame_rate_code;
EXTERN int bit_rate_value;
EXTERN int vbv_buffer_size;
EXTERN int constrained_parameters_flag;
 
/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
EXTERN int profile_and_level_indication;
EXTERN int progressive_sequence;
EXTERN int chroma_format;
EXTERN int low_delay;
EXTERN int frame_rate_extension_n;
EXTERN int frame_rate_extension_d;
 
/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
EXTERN int video_format;
EXTERN int color_description;
EXTERN int color_primaries;
EXTERN int transfer_characteristics;
EXTERN int matrix_coefficients;
EXTERN int display_horizontal_size;
EXTERN int display_vertical_size;
 
/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
EXTERN int temporal_reference;
EXTERN int picture_coding_type;
EXTERN int vbv_delay;
EXTERN int full_pel_forward_vector;
EXTERN int forward_f_code;
EXTERN int full_pel_backward_vector;
EXTERN int backward_f_code;
 
 
/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
EXTERN int f_code[2][2];
EXTERN int intra_dc_precision;
EXTERN int picture_structure;
EXTERN int top_field_first;
EXTERN int frame_pred_frame_dct;
EXTERN int concealment_motion_vectors;
 
EXTERN int intra_vlc_format;
 
EXTERN int repeat_first_field;
 
EXTERN int chroma_420_type;
EXTERN int progressive_frame;
EXTERN int composite_display_flag;
EXTERN int v_axis;
EXTERN int field_sequence;
EXTERN int sub_carrier;
EXTERN int burst_amplitude;
EXTERN int sub_carrier_phase;
 
 
 
/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
EXTERN int frame_center_horizontal_offset[3];
EXTERN int frame_center_vertical_offset[3];
 
 
 
/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
EXTERN int layer_id;
EXTERN int lower_layer_prediction_horizontal_size;
EXTERN int lower_layer_prediction_vertical_size;
EXTERN int horizontal_subsampling_factor_m;
EXTERN int horizontal_subsampling_factor_n;
EXTERN int vertical_subsampling_factor_m;
EXTERN int vertical_subsampling_factor_n;
 
 
/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
EXTERN int lower_layer_temporal_reference;
EXTERN int lower_layer_horizontal_offset;
EXTERN int lower_layer_vertical_offset;
EXTERN int spatial_temporal_weight_code_table_index;
EXTERN int lower_layer_progressive_frame;
EXTERN int lower_layer_deinterlaced_field_select;
 
 
 
 
 
 
/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
EXTERN int copyright_flag;
EXTERN int copyright_identifier;
EXTERN int original_or_copy;
EXTERN int copyright_number_1;
EXTERN int copyright_number_2;
EXTERN int copyright_number_3;
 
/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
EXTERN int drop_flag;
EXTERN int hour;
EXTERN int minute;
EXTERN int sec;
EXTERN int frame;
EXTERN int closed_gop;
EXTERN int broken_link;
 
 
 
/* layer specific variables (needed for SNR and DP scalability) */
EXTERN struct layer_data {
/* bit input */
int Infile;
unsigned char Rdbfr[2048];
unsigned char *Rdptr;
unsigned char Inbfr[16];
/* from mpeg2play */
unsigned int Bfr;
unsigned char *Rdmax;
int Incnt;
int Bitcnt;
/* sequence header and quant_matrix_extension() */
int intra_quantizer_matrix[64];
int non_intra_quantizer_matrix[64];
int chroma_intra_quantizer_matrix[64];
int chroma_non_intra_quantizer_matrix[64];
int load_intra_quantizer_matrix;
int load_non_intra_quantizer_matrix;
int load_chroma_intra_quantizer_matrix;
int load_chroma_non_intra_quantizer_matrix;
 
int MPEG2_Flag;
/* sequence scalable extension */
int scalable_mode;
/* picture coding extension */
int q_scale_type;
int alternate_scan;
/* picture spatial scalable extension */
int pict_scal;
/* slice/macroblock */
int priority_breakpoint;
int quantizer_scale;
int intra_slice;
short block[12][64];
} base, enhan, *ld;
 
 
 
#ifdef VERIFY
EXTERN int verify_sequence_header;
EXTERN int verify_group_of_pictures_header;
EXTERN int verify_picture_header;
EXTERN int verify_slice_header;
EXTERN int verify_sequence_extension;
EXTERN int verify_sequence_display_extension;
EXTERN int verify_quant_matrix_extension;
EXTERN int verify_sequence_scalable_extension;
EXTERN int verify_picture_display_extension;
EXTERN int verify_picture_coding_extension;
EXTERN int verify_picture_spatial_scalable_extension;
EXTERN int verify_picture_temporal_scalable_extension;
EXTERN int verify_copyright_extension;
#endif /* VERIFY */
 
 
EXTERN int Decode_Layer;
 
/* verify.c */
#ifdef VERIFY
void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
void Clear_Verify_Headers _ANSI_ARGS_((void));
#endif /* VERIFY */
 
 
EXTERN int global_MBA;
EXTERN int global_pic;
EXTERN int True_Framenum;
 
// PJ
 
void gvideo_init(void);
 
// Insertion/removal from display buffer
 
// number of preallocated frames
#define MAX_FRAMEBUF 20
 
struct framebuf_struct {
int n;
WORD *f;
struct framebuf_struct *next;
struct framebuf_struct *prev;
};
 
void Initialize_framebuf(int sz);
struct framebuf_struct *get_free_framebuf();
void insert_frame(struct framebuf_struct *f);
struct framebuf_struct *remove_frame();
void give_back_framebuf(struct framebuf_struct *f);
void init_jetcontrol(void);
 
 
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/recon.c
0,0 → 1,467
/* Predict.c, motion compensation routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
 
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
unsigned char *dst[], int dfield,
int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
int average_flag));
 
static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
 
void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
int bx, by;
int macroblock_type;
int motion_type;
int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
int stwtype;
{
int currentfield;
unsigned char **predframe;
int DMV[2][2];
int stwtop, stwbot;
 
stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
stwbot = stwtype/3;
 
if ((macroblock_type & MACROBLOCK_MOTION_FORWARD)
|| (picture_coding_type==P_TYPE))
{
if (picture_structure==FRAME_PICTURE)
{
if ((motion_type==MC_FRAME)
|| !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
{
/* frame-based prediction (broken into top and bottom halves
for spatial scalability prediction purposes) */
if (stwtop<2)
form_prediction(forward_reference_frame,0,current_frame,0,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][0][0],PMV[0][0][1],stwtop);
 
if (stwbot<2)
form_prediction(forward_reference_frame,1,current_frame,1,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][0][0],PMV[0][0][1],stwbot);
}
else if (motion_type==MC_FIELD) /* field-based prediction */
{
/* top field prediction */
if (stwtop<2)
form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
 
/* bottom field prediction */
if (stwbot<2)
form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
}
else if (motion_type==MC_DMV) /* dual prime prediction */
{
/* calculate derived motion vectors */
Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
 
if (stwtop<2)
{
/* predict top field from top field */
form_prediction(forward_reference_frame,0,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
PMV[0][0][0],PMV[0][0][1]>>1,0);
 
/* predict and add to top field from bottom field */
form_prediction(forward_reference_frame,1,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
DMV[0][0],DMV[0][1],1);
}
 
if (stwbot<2)
{
/* predict bottom field from bottom field */
form_prediction(forward_reference_frame,1,current_frame,1,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
PMV[0][0][0],PMV[0][0][1]>>1,0);
 
/* predict and add to bottom field from top field */
form_prediction(forward_reference_frame,0,current_frame,1,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
DMV[1][0],DMV[1][1],1);
}
}
else
/* invalid motion_type */
printf("invalid motion_type\n");
}
else /* TOP_FIELD or BOTTOM_FIELD */
{
/* field picture */
currentfield = (picture_structure==BOTTOM_FIELD);
 
/* determine which frame to use for prediction */
if ((picture_coding_type==P_TYPE) && Second_Field
&& (currentfield!=motion_vertical_field_select[0][0]))
predframe = backward_reference_frame; /* same frame */
else
predframe = forward_reference_frame; /* previous frame */
 
if ((motion_type==MC_FIELD)
|| !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
{
/* field-based prediction */
if (stwtop<2)
form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
PMV[0][0][0],PMV[0][0][1],stwtop);
}
else if (motion_type==MC_16X8)
{
if (stwtop<2)
{
form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][0][0],PMV[0][0][1],stwtop);
 
/* determine which frame to use for lower half prediction */
if ((picture_coding_type==P_TYPE) && Second_Field
&& (currentfield!=motion_vertical_field_select[1][0]))
predframe = backward_reference_frame; /* same frame */
else
predframe = forward_reference_frame; /* previous frame */
 
form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
PMV[1][0][0],PMV[1][0][1],stwtop);
}
}
else if (motion_type==MC_DMV) /* dual prime prediction */
{
if (Second_Field)
predframe = backward_reference_frame; /* same frame */
else
predframe = forward_reference_frame; /* previous frame */
 
/* calculate derived motion vectors */
Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
 
/* predict from field of same parity */
form_prediction(forward_reference_frame,currentfield,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
PMV[0][0][0],PMV[0][0][1],0);
 
/* predict from field of opposite parity */
form_prediction(predframe,!currentfield,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
DMV[0][0],DMV[0][1],1);
}
else
/* invalid motion_type */
printf("invalid motion_type\n");
}
stwtop = stwbot = 1;
}
 
if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
{
if (picture_structure==FRAME_PICTURE)
{
if (motion_type==MC_FRAME)
{
/* frame-based prediction */
if (stwtop<2)
form_prediction(backward_reference_frame,0,current_frame,0,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][1][0],PMV[0][1][1],stwtop);
 
if (stwbot<2)
form_prediction(backward_reference_frame,1,current_frame,1,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][1][0],PMV[0][1][1],stwbot);
}
else /* field-based prediction */
{
/* top field prediction */
if (stwtop<2)
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
 
/* bottom field prediction */
if (stwbot<2)
form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
}
}
else /* TOP_FIELD or BOTTOM_FIELD */
{
/* field picture */
if (motion_type==MC_FIELD)
{
/* field-based prediction */
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
}
else if (motion_type==MC_16X8)
{
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
 
form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
}
else
/* invalid motion_type */
printf("invalid motion_type\n");
}
}
}
 
static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
unsigned char *src[]; /* prediction source buffer */
int sfield; /* prediction source field number (0 or 1) */
unsigned char *dst[]; /* prediction destination buffer */
int dfield; /* prediction destination field number (0 or 1)*/
int lx,lx2; /* line strides */
int w,h; /* prediction block/sub-block width, height */
int x,y; /* pixel co-ordinates of top-left sample in current MB */
int dx,dy; /* horizontal, vertical prediction address */
int average_flag; /* add prediction error to prediction ? */
{
/* Y */
form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
lx,lx2,w,h,x,y,dx,dy,average_flag);
 
if (chroma_format!=CHROMA444)
{
lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
}
 
if (chroma_format==CHROMA420)
{
h>>=1; y>>=1; dy/=2;
}
 
/* Cb */
form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
lx,lx2,w,h,x,y,dx,dy,average_flag);
 
/* Cr */
form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
lx,lx2,w,h,x,y,dx,dy,average_flag);
}
 
/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
/* NOTE: the arithmetic below produces numerically equivalent results
* to 7.6.4, yet is more elegant. It differs in the following ways:
*
* 1. the vectors (dx, dy) are based on cartesian frame
* coordiantes along a half-pel grid (always positive numbers)
* In contrast, vector[r][s][t] are differential (with positive and
* negative values). As a result, deriving the integer vectors
* (int_vec[t]) from dx, dy is accomplished by a simple right shift.
*
* 2. Half pel flags (xh, yh) are equivalent to the LSB (Least
* Significant Bit) of the half-pel coordinates (dx,dy).
*
*
* NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
* is distributed among several other stages. This is accomplished by
* folding line offsets into the source and destination (src,dst)
* addresses (note the call arguments to form_prediction() in Predict()),
* line stride variables lx and lx2, the block dimension variables (w,h),
* average_flag, and by the very order in which Predict() is called.
* This implementation design (implicitly different than the spec)
* was chosen for its elegance.
*/
 
static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
unsigned char *src;
unsigned char *dst;
int lx; /* raster line increment */
int lx2;
int w,h;
int x,y;
int dx,dy;
int average_flag; /* flag that signals bi-directional or Dual-Prime
averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
a previously formed prediction has been stored in
pel_pred[] */
{
int xint; /* horizontal integer sample vector: analogous to int_vec[0] */
int yint; /* vertical integer sample vectors: analogous to int_vec[1] */
int xh; /* horizontal half sample flag: analogous to half_flag[0] */
int yh; /* vertical half sample flag: analogous to half_flag[1] */
int i, j, v;
unsigned char *s; /* source pointer: analogous to pel_ref[][] */
unsigned char *d; /* destination pointer: analogous to pel_pred[][] */
 
/* half pel scaling for integer vectors */
xint = dx>>1;
yint = dy>>1;
 
/* derive half pel flags */
xh = dx & 1;
yh = dy & 1;
 
/* compute the linear address of pel_ref[][] and pel_pred[][]
based on cartesian/raster cordinates provided */
s = src + lx*(y+yint) + x + xint;
d = dst + lx*y + x;
 
if (!xh && !yh) /* no horizontal nor vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i]+s[i];
d[i] = (v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = s[i];
}
s+= lx2;
d+= lx2;
}
}
}
else if (!xh && yh) /* no horizontal but vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
d[i]=(v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
}
 
s+= lx2;
d+= lx2;
}
}
}
else if (xh && !yh) /* horizontal but no vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
d[i] = (v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
}
 
s+= lx2;
d+= lx2;
}
}
}
else /* if (xh && yh) horizontal and vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
d[i] = (v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
}
 
s+= lx2;
d+= lx2;
}
}
}
}
/advdemos/tags/rel_1_5_beta1/mpeg2/systems.c
0,0 → 1,200
/* systems.c, systems-specific routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
#include <stdlib.h>
 
#include "config.h"
#include "global.h"
 
/* initialize buffer, call once before first getbits or showbits */
 
/* parse system layer, ignore everything we don't need */
void Next_Packet()
{
unsigned int code;
int l;
 
for(;;)
{
code = Get_Long();
 
/* remove system layer byte stuffing */
while ((code & 0xffffff00) != 0x100)
code = (code<<8) | Get_Byte();
 
switch(code)
{
case PACK_START_CODE: /* pack header */
/* skip pack header (system_clock_reference and mux_rate) */
ld->Rdptr += 8;
break;
case VIDEO_ELEMENTARY_STREAM:
code = Get_Word(); /* packet_length */
ld->Rdmax = ld->Rdptr + code;
 
code = Get_Byte();
 
if((code>>6)==0x02)
{
ld->Rdptr++;
code=Get_Byte(); /* parse PES_header_data_length */
ld->Rdptr+=code; /* advance pointer by PES_header_data_length */
printf("MPEG-2 PES packet\n");
return;
}
else if(code==0xff)
{
/* parse MPEG-1 packet header */
while((code=Get_Byte())== 0xFF);
}
/* stuffing bytes */
if(code>=0x40)
{
if(code>=0x80)
{
fprintf(stderr,"Error in packet header\n");
exit(1);
}
/* skip STD_buffer_scale */
ld->Rdptr++;
code = Get_Byte();
}
 
if(code>=0x30)
{
if(code>=0x40)
{
fprintf(stderr,"Error in packet header\n");
exit(1);
}
/* skip presentation and decoding time stamps */
ld->Rdptr += 9;
}
else if(code>=0x20)
{
/* skip presentation time stamps */
ld->Rdptr += 4;
}
else if(code!=0x0f)
{
fprintf(stderr,"Error in packet header\n");
exit(1);
}
return;
case ISO_END_CODE: /* end */
/* simulate a buffer full of sequence end codes */
l = 0;
while (l<2048)
{
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
}
ld->Rdptr = ld->Rdbfr;
ld->Rdmax = ld->Rdbfr + 2048;
return;
default:
if(code>=SYSTEM_START_CODE)
{
/* skip system headers and non-video packets*/
code = Get_Word();
ld->Rdptr += code;
}
else
{
fprintf(stderr,"Unexpected startcode %08x in system layer\n",code);
exit(1);
}
break;
}
}
}
 
 
 
void Flush_Buffer32()
{
int Incnt;
 
ld->Bfr = 0;
 
Incnt = ld->Incnt;
Incnt -= 32;
 
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
{
while (Incnt <= 24)
{
if (ld->Rdptr >= ld->Rdmax)
Next_Packet();
ld->Bfr |= Get_Byte() << (24 - Incnt);
Incnt += 8;
}
}
else
{
while (Incnt <= 24)
{
if (ld->Rdptr >= ld->Rdbfr+2048)
Fill_Buffer();
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
Incnt += 8;
}
}
ld->Incnt = Incnt;
 
#ifdef VERIFY
ld->Bitcnt += 32;
#endif /* VERIFY */
}
 
 
unsigned int Get_Bits32()
{
unsigned int l;
 
l = Show_Bits(32);
Flush_Buffer32();
 
return l;
}
 
 
int Get_Long()
{
int i;
 
i = Get_Word();
return (i<<16) | Get_Word();
}
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/subspic.c
0,0 → 1,392
/* #define DEBUG */
/* subspic.c, Frame buffer substitution routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
 
#include "config.h"
#include "global.h"
 
/* private prototypes*/
static void Read_Frame _ANSI_ARGS_((char *filename,
unsigned char *frame_buffer[], int framenum));
static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
int width, int height, int parity, int incr));
static int Read_Components _ANSI_ARGS_ ((char *filename,
unsigned char *frame[3], int framenum));
static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame,
int width, int height));
static int Extract_Components _ANSI_ARGS_ ((char *filename,
unsigned char *frame[3], int framenum));
 
 
/* substitute frame buffer routine */
void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum)
int bitstream_framenum;
int sequence_framenum;
{
/* static tracking variables */
static int previous_temporal_reference;
static int previous_bitstream_framenum;
static int previous_anchor_temporal_reference;
static int previous_anchor_bitstream_framenum;
static int previous_picture_coding_type;
static int bgate;
/* local temporary variables */
int substitute_display_framenum;
 
 
#ifdef DEBUG
printf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n",
sequence_framenum, bitstream_framenum, temporal_reference,
picture_structure, picture_coding_type);
#endif
 
/* we don't substitute at the first picture of a sequence */
if((sequence_framenum!=0)||(Second_Field))
{
/* only at the start of the frame */
if ((picture_structure==FRAME_PICTURE)||(!Second_Field))
{
if(picture_coding_type==P_TYPE)
{
/* the most recently decoded reference frame needs substituting */
substitute_display_framenum = bitstream_framenum - 1;
Read_Frame(Substitute_Picture_Filename, forward_reference_frame,
substitute_display_framenum);
}
/* only the first B frame in a consequitve set of B pictures
loads a substitute backward_reference_frame since all subsequent
B frames predict from the same reference pictures */
else if((picture_coding_type==B_TYPE)&&(bgate!=1))
{
substitute_display_framenum =
(previous_temporal_reference - temporal_reference)
+ bitstream_framenum - 1;
 
Read_Frame(Substitute_Picture_Filename, backward_reference_frame,
substitute_display_framenum);
}
} /* P fields can predict from the two most recently decoded fields, even
from the first field of the same frame being decoded */
else if(Second_Field && (picture_coding_type==P_TYPE))
{
/* our favourite case: the IP field picture pair */
if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE))
{
substitute_display_framenum = bitstream_framenum;
}
else /* our more generic P field picture pair */
{
substitute_display_framenum =
(temporal_reference - previous_anchor_temporal_reference)
+ bitstream_framenum - 1;
}
 
Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum);
}
#ifdef DEBUG
else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE))
{
printf("NO SUBS FOR THIS PICTURE\n");
}
#endif
}
 
 
/* set b gate so we don't redundantly load next time around */
if(picture_coding_type==B_TYPE)
bgate = 1;
else
bgate = 0;
 
/* update general tracking variables */
if((picture_structure==FRAME_PICTURE)||(!Second_Field))
{
previous_temporal_reference = temporal_reference;
previous_bitstream_framenum = bitstream_framenum;
}
/* update reference frame tracking variables */
if((picture_coding_type!=B_TYPE) &&
((picture_structure==FRAME_PICTURE)||Second_Field))
{
previous_anchor_temporal_reference = temporal_reference;
previous_anchor_bitstream_framenum = bitstream_framenum;
}
 
previous_picture_coding_type = picture_coding_type;
 
}
 
 
/* Note: fields are only read to serve as the same-frame reference for
a second field */
static void Read_Frame(fname,frame,framenum)
char *fname;
unsigned char *frame[];
int framenum;
{
int parity;
int rerr = 0;
int field_mode;
 
if(framenum<0)
printf("ERROR: framenum (%d) is less than zero\n", framenum);
 
 
if(Big_Picture_Flag)
rerr = Extract_Components(fname, substitute_frame, framenum);
else
rerr = Read_Components(fname, substitute_frame, framenum);
 
if(rerr!=0)
{
printf("was unable to substitute frame\n");
}
 
/* now copy to the appropriate buffer */
/* first field (which we are attempting to substitute) must be
of opposite field parity to the current one */
if((Second_Field)&&(picture_coding_type==P_TYPE))
{
parity = (picture_structure==TOP_FIELD ? 1:0);
field_mode = (picture_structure==FRAME_PICTURE ? 0:1);
}
else
{
/* Like frame structued pictures, B pictures only substitute an entire frame
since both fields always predict from the same frame (with respect
to forward/backwards directions) */
parity = 0;
field_mode = 0;
}
 
 
Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width,
Coded_Picture_Height, parity, field_mode);
Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height,
parity, field_mode);
Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height,
parity, field_mode);
 
#ifdef VERBOSE
if(Verbose_Flag > NO_LAYER)
printf("substituted %s %d\n",
(field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum);
#endif
}
 
 
 
 
static int Read_Components(filename, frame, framenum)
char *filename;
unsigned char *frame[3];
int framenum;
{
int err = 0;
char outname[FILENAME_LENGTH];
char name[FILENAME_LENGTH];
 
sprintf(outname,filename,framenum);
 
 
sprintf(name,"%s.Y",outname);
err += Read_Component(name, frame[0], Coded_Picture_Width,
Coded_Picture_Height);
 
sprintf(name,"%s.U",outname);
err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height);
 
sprintf(name,"%s.V",outname);
err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height);
 
return(err);
}
 
 
static int Read_Component(Filename, Frame, Width, Height)
char *Filename;
unsigned char *Frame;
int Width;
int Height;
{
int Size;
int Bytes_Read;
int Infile;
 
Size = Width*Height;
 
#ifdef DEBUG
printf("SUBS: reading %s\n", filename);
#endif
 
if(!(Infile=open(Filename,O_RDONLY|O_BINARY))<0)
{
printf("ERROR: unable to open reference filename (%s)\n", Filename);
return(-1);
}
 
Bytes_Read = read(Infile, Frame, Size);
if(Bytes_Read!=Size)
{
printf("was able to read only %d bytes of %d of file %s\n",
Bytes_Read, Size, Filename);
}
close(Infile);
return(0);
}
 
 
/* optimization: do not open the big file each time. Open once at start
of decoder, and close at the very last frame */
 
/* Note: "big" files were used in E-mail exchanges almost exclusively by the
MPEG Committee's syntax validation and conformance ad-hoc groups from
the year 1993 until 1995 */
static int Extract_Components(filename, frame, framenum)
char *filename;
unsigned char *frame[3];
int framenum;
{
/* int err = 0; */
FILE *fd;
int line;
int size, offset;
 
 
if (!(fd = fopen(filename,"rb")))
{
sprintf(Error_Text,"Couldn't open %s\n",filename);
return(-1);
}
 
/* compute size of each frame (in bytes) */
size = (Coded_Picture_Width*Coded_Picture_Height);
 
if(chroma_format==CHROMA444)
size = (size * 3);
else if(chroma_format==CHROMA422)
size = (size * 2);
else if(chroma_format==CHROMA420)
size = ((size*3)>>1);
else
printf("ERROR: chroma_format (%d) not recognized\n", chroma_format);
 
 
/* compute distance into "big" file */
offset = size*framenum;
 
#ifdef DEBUG
printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n",
framenum, offset, size, filename);
#endif
 
/* seek to location in big file where desired frame begins */
/* note: this offset cannot exceed a few billion bytes due to the */
/* obvious limitations of 32-bit integers */
fseek(fd, offset, 0);
 
/* Y */
for (line=0; line<Coded_Picture_Height; line++)
{
fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd);
}
 
/* Cb */
for (line=0; line<Chroma_Height; line++)
{
fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd);
}
 
/* Cr */
for (line=0; line<Chroma_Height; line++)
{
fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd);
}
 
 
fclose(fd);
return(0);
}
 
 
static void Copy_Frame(src, dst, width, height, parity, field_mode)
unsigned char *src;
unsigned char *dst;
int width;
int height;
int parity; /* field parity (top or bottom) to overwrite */
int field_mode; /* 0 = frame, 1 = field */
{
int row, col;
int s, d;
int incr;
 
s = d = 0;
 
#ifdef DEBUG
printf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n",
width,height,parity,field_mode);
#endif /* DEBUG */
 
if(field_mode)
{
incr = 2;
 
if(parity==0)
s += width;
}
else
{
incr = 1;
}
 
for(row=0; row<height; row+=incr)
{
for(col=0; col<width; col++)
{
dst[d+col] = src[s+col];
}
d += (width*incr);
s += (width*incr);
}
 
}
 
/advdemos/tags/rel_1_5_beta1/mpeg2/getblk.c
0,0 → 1,570
/* getblk.c, DCT block decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
 
#include "config.h"
#include "global.h"
 
 
/* defined in getvlc.h */
typedef struct {
char run, level, len;
} DCTtab;
 
extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
extern DCTtab DCTtab0a[],DCTtab1a[];
 
 
/* decode one intra coded MPEG-1 block */
 
void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
int comp;
int dc_dct_pred[];
{
int val, i, j, sign;
unsigned int code;
DCTtab *tab;
short *bp;
 
bp = ld->block[comp];
 
/* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
/* decode DC coefficients */
if (comp<4)
bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
else if (comp==4)
bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
else
bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
 
if (Fault_Flag) return;
 
/* D-pictures do not contain AC coefficients */
if(picture_coding_type == D_TYPE)
return;
 
/* decode AC coefficients */
for (i=1; ; i++)
{
code = Show_Bits(16);
if (code>=16384)
tab = &DCTtabnext[(code>>12)-4];
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
printf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
if (tab->run==64) /* end_of_block */
return;
 
if (tab->run==65) /* escape */
{
i+= Get_Bits(6);
 
val = Get_Bits(8);
if (val==0)
val = Get_Bits(8);
else if (val==128)
val = Get_Bits(8) - 256;
else if (val>128)
val -= 256;
 
if((sign = (val<0)))
val = -val;
}
else
{
i+= tab->run;
val = tab->level;
sign = Get_Bits(1);
}
 
if (i>=64)
{
if (!Quiet_Flag)
fprintf(stderr,"DCT coeff index (i) out of bounds (intra)\n");
Fault_Flag = 1;
return;
}
 
j = scan[ZIG_ZAG][i];
val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
 
/* mismatch control ('oddification') */
if (val!=0) /* should always be true, but it's not guaranteed */
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
 
/* saturation */
if (!sign)
bp[j] = (val>2047) ? 2047 : val; /* positive */
else
bp[j] = (val>2048) ? -2048 : -val; /* negative */
}
}
 
 
/* decode one non-intra coded MPEG-1 block */
 
void Decode_MPEG1_Non_Intra_Block(comp)
int comp;
{
int val, i, j, sign;
unsigned int code;
DCTtab *tab;
short *bp;
 
bp = ld->block[comp];
 
/* decode AC coefficients */
for (i=0; ; i++)
{
code = Show_Bits(16);
if (code>=16384)
{
if (i==0)
tab = &DCTtabfirst[(code>>12)-4];
else
tab = &DCTtabnext[(code>>12)-4];
}
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
if (tab->run==64) /* end_of_block */
return;
 
if (tab->run==65) /* escape */
{
i+= Get_Bits(6);
 
val = Get_Bits(8);
if (val==0)
val = Get_Bits(8);
else if (val==128)
val = Get_Bits(8) - 256;
else if (val>128)
val -= 256;
 
if((sign = (val<0)))
val = -val;
}
else
{
i+= tab->run;
val = tab->level;
sign = Get_Bits(1);
}
 
if (i>=64)
{
if (!Quiet_Flag)
fprintf(stderr,"DCT coeff index (i) out of bounds (inter)\n");
Fault_Flag = 1;
return;
}
 
j = scan[ZIG_ZAG][i];
val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
 
/* mismatch control ('oddification') */
if (val!=0) /* should always be true, but it's not guaranteed */
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
 
/* saturation */
if (!sign)
bp[j] = (val>2047) ? 2047 : val; /* positive */
else
bp[j] = (val>2048) ? -2048 : -val; /* negative */
}
}
 
 
/* decode one intra coded MPEG-2 block */
 
void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
int comp;
int dc_dct_pred[];
{
int val, i, j, sign, nc, cc, run;
unsigned int code;
DCTtab *tab;
short *bp;
int *qmat;
struct layer_data *ld1;
 
/* with data partitioning, data always goes to base layer */
ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
bp = ld1->block[comp];
 
if (base.scalable_mode==SC_DP)
if (base.priority_breakpoint<64)
ld = &enhan;
else
ld = &base;
 
cc = (comp<4) ? 0 : (comp&1)+1;
 
qmat = (comp<4 || chroma_format==CHROMA420)
? ld1->intra_quantizer_matrix
: ld1->chroma_intra_quantizer_matrix;
 
/* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
if (cc==0)
val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
else if (cc==1)
val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
else
val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
 
if (Fault_Flag) return;
 
bp[0] = val << (3-intra_dc_precision);
 
nc=0;
 
#ifdef TRACE
if (Trace_Flag)
printf("DCT(%d)i:",comp);
#endif /* TRACE */
 
/* decode AC coefficients */
for (i=1; ; i++)
{
code = Show_Bits(16);
if (code>=16384 && !intra_vlc_format)
tab = &DCTtabnext[(code>>12)-4];
else if (code>=1024)
{
if (intra_vlc_format)
tab = &DCTtab0a[(code>>8)-4];
else
tab = &DCTtab0[(code>>8)-4];
}
else if (code>=512)
{
if (intra_vlc_format)
tab = &DCTtab1a[(code>>6)-8];
else
tab = &DCTtab1[(code>>6)-8];
}
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
printf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
#ifdef TRACE
if (Trace_Flag)
{
printf(" (");
Print_Bits(code,16,tab->len);
}
#endif /* TRACE */
 
if (tab->run==64) /* end_of_block */
{
#ifdef TRACE
if (Trace_Flag)
printf("): EOB\n");
#endif /* TRACE */
return;
}
 
if (tab->run==65) /* escape */
{
#ifdef TRACE
if (Trace_Flag)
{
putchar(' ');
Print_Bits(Show_Bits(6),6,6);
}
#endif /* TRACE */
 
i+= run = Get_Bits(6);
 
#ifdef TRACE
if (Trace_Flag)
{
putchar(' ');
Print_Bits(Show_Bits(12),12,12);
}
#endif /* TRACE */
 
val = Get_Bits(12);
if ((val&2047)==0)
{
if (!Quiet_Flag)
printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
Fault_Flag = 1;
return;
}
if((sign = (val>=2048)))
val = 4096 - val;
}
else
{
i+= run = tab->run;
val = tab->level;
sign = Get_Bits(1);
 
#ifdef TRACE
if (Trace_Flag)
printf("%d",sign);
#endif /* TRACE */
}
 
if (i>=64)
{
if (!Quiet_Flag)
fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)\n");
Fault_Flag = 1;
return;
}
 
#ifdef TRACE
if (Trace_Flag)
printf("): %d/%d",run,sign ? -val : val);
#endif /* TRACE */
 
j = scan[ld1->alternate_scan][i];
val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
bp[j] = sign ? -val : val;
nc++;
 
if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
ld = &enhan;
}
}
 
 
/* decode one non-intra coded MPEG-2 block */
 
void Decode_MPEG2_Non_Intra_Block(comp)
int comp;
{
int val, i, j, sign, nc, run;
unsigned int code;
DCTtab *tab;
short *bp;
int *qmat;
struct layer_data *ld1;
 
/* with data partitioning, data always goes to base layer */
ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
bp = ld1->block[comp];
 
if (base.scalable_mode==SC_DP)
if (base.priority_breakpoint<64)
ld = &enhan;
else
ld = &base;
 
qmat = (comp<4 || chroma_format==CHROMA420)
? ld1->non_intra_quantizer_matrix
: ld1->chroma_non_intra_quantizer_matrix;
 
nc = 0;
 
#ifdef TRACE
if (Trace_Flag)
printf("DCT(%d)n:",comp);
#endif /* TRACE */
 
/* decode AC coefficients */
for (i=0; ; i++)
{
code = Show_Bits(16);
if (code>=16384)
{
if (i==0)
tab = &DCTtabfirst[(code>>12)-4];
else
tab = &DCTtabnext[(code>>12)-4];
}
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
#ifdef TRACE
if (Trace_Flag)
{
printf(" (");
Print_Bits(code,16,tab->len);
}
#endif /* TRACE */
 
if (tab->run==64) /* end_of_block */
{
#ifdef TRACE
if (Trace_Flag)
printf("): EOB\n");
#endif /* TRACE */
return;
}
 
if (tab->run==65) /* escape */
{
#ifdef TRACE
if (Trace_Flag)
{
putchar(' ');
Print_Bits(Show_Bits(6),6,6);
}
#endif /* TRACE */
 
i+= run = Get_Bits(6);
 
#ifdef TRACE
if (Trace_Flag)
{
putchar(' ');
Print_Bits(Show_Bits(12),12,12);
}
#endif /* TRACE */
 
val = Get_Bits(12);
if ((val&2047)==0)
{
if (!Quiet_Flag)
printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
Fault_Flag = 1;
return;
}
if((sign = (val>=2048)))
val = 4096 - val;
}
else
{
i+= run = tab->run;
val = tab->level;
sign = Get_Bits(1);
 
#ifdef TRACE
if (Trace_Flag)
printf("%d",sign);
#endif /* TRACE */
}
 
if (i>=64)
{
if (!Quiet_Flag)
fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)\n");
Fault_Flag = 1;
return;
}
 
#ifdef TRACE
if (Trace_Flag)
printf("): %d/%d",run,sign?-val:val);
#endif /* TRACE */
 
j = scan[ld1->alternate_scan][i];
val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
bp[j] = sign ? -val : val;
nc++;
 
if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
ld = &enhan;
}
}
/advdemos/tags/rel_1_5_beta1/mpeg2/readme
0,0 → 1,72
This is the S.Ha.R.K. porting of the MPEG2 decoder from the
MPEG Software Simulation Group.
 
---------------------------------------------------------------------------
 
The original source code is available on the web at
http://www.mpeg.org
 
The demo uses the FAT16 filesystem and the graphics card.
I just added these files:
- gvideo.c Video initialization and output
- jetctrl.c Idle time visualization
- makefile S.Ha.R.K. Makefile for the demo
- store.c interface between the original decoder and S.Ha.R.K.
 
The original makefile and store.c files has also been renamed to store.ori.
 
---------------------------------------------------------------------------
 
The demo simply intercets the Write_Frame function and puts the decoded
frame into a buffer. The task created in gvideo is a periodic CBS task
that reads a picture from the buffer and simply displays it.
 
===========================================================================
 
This is the original readme file:
 
 
January 9, 1995:
=====
Pre-release caveats:
 
- has only been tested with gcc. (I'm not sure we will even bother
with acc, or cc in the future).
 
- I'm fully aware of the warnings received by -Wall
 
- Verifier still not integrated (due to complexity), although
experimental vbv_delay code included in verify.c
 
 
December 20, 1995
===============================================================
Frame buffer substitution edition of decoder.
 
Restrictions:
- temporal_reference in bitstream must be correct.
 
- substitute pictures must have pixel (luminance samples) width
and height equal to coded_picture_width (mb_width*16) and
coded_picture_height (mb_height*16) rather than horizontal_size
and vertical_size, respectively.
 
- all input pictures must be interleaved into a frame.
 
- frame count (index) is based on absolute display frame order with
no repeated (3:2 pulldown) fields or frames.
 
--------------------------------------------------------
Notes:
 
- command line arguements in this edition differ from verifier
style. This decoder's arguments are the same as the
public distribution's (July 4, 1994) code .
 
please note that this code, with frame buffer substitution, when it
is released will use the verifier style of arguments.
 
- Carsten's updated spatial scalability decoder routines have been
incorperated.
 
/advdemos/tags/rel_1_5_beta1/mpeg2/gvideo.c
0,0 → 1,157
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: gvideo.c,v 1.1.1.1 2004-05-24 17:54:50 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 17:54:50 $
*/
 
//#include "config.h"
 
#include <kernel/func.h>
#include <kernel/model.h>
#include <kernel/const.h>
 
#include <drivers/glib.h>
 
#include <stdlib.h>
 
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
 
#include "config.h"
#include "global.h"
 
#define COLORFG rgb16(255,255,255)
#define COLORBG rgb16(0,0,0)
 
#define SP rgb16(0,128,0)
#define FG rgb16(255,255,255)
#define BG rgb16(0,0,0)
 
/* border size (pixels) */
#define BO 4
 
 
//#define NOGRX
 
/*
*
*/
 
 
void draw_frame(int x, int y, int dx, int dy)
{
#ifndef NOGRX
grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
grx_box(x,y,x+dx-1,y+dy-1,BG);
grx_rect(x-1,y-1,x+dx,y+dy,FG);
#endif
}
 
static TASK play(void *arg)
{
int x1,y1,x2,y2;
int moreframes;
struct framebuf_struct *fbuf;
x1=1;
y1=1;
x2=x1+Coded_Picture_Width-1;
y2=y1+Coded_Picture_Height-1;
moreframes=1;
task_nopreempt();
 
while (moreframes) {
fbuf = remove_frame();
#ifndef NOGRX
// grxlock();
// grx_rect(10,10,10+5*fbuf->n,10+5*fbuf->n,FG);
grx_putimage(x1, y1, x2, y2, fbuf->f);
// grxunlock();
#else
cprintf("(%d %d)\n",fbuf->n, fbuf->f);
#endif
give_back_framebuf(fbuf);
task_endcycle();
}
return NULL;
}
 
void gvideo_init(void)
{
SOFT_TASK_MODEL model;
PID pid;
int period,wcet;
 
#ifndef NOGRX
grx_init();
grx_setmode(grx_getmode(800, 600, 16));
#endif
 
// draw_frame(0, 0, CodedImageWidth,CodedImageHeight);
 
srand(7);
 
period=1000000/20;
wcet=20000;
soft_task_default_model(model);
soft_task_def_met(model,wcet);
soft_task_def_wcet(model,wcet);
soft_task_def_period(model,period);
soft_task_def_periodic(model);
soft_task_def_ctrl_jet(model);
pid=task_create("Video",play,&model,NULL);
if (pid!=-1) task_activate(pid);
}
 
 
 
 
 
 
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/gethdr.c
0,0 → 1,1077
/* gethdr.c, header decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
 
#include "config.h"
#include "global.h"
 
 
/* private prototypes */
static void sequence_header _ANSI_ARGS_((void));
static void group_of_pictures_header _ANSI_ARGS_((void));
static void picture_header _ANSI_ARGS_((void));
static void extension_and_user_data _ANSI_ARGS_((void));
static void sequence_extension _ANSI_ARGS_((void));
static void sequence_display_extension _ANSI_ARGS_((void));
static void quant_matrix_extension _ANSI_ARGS_((void));
static void sequence_scalable_extension _ANSI_ARGS_((void));
static void picture_display_extension _ANSI_ARGS_((void));
static void picture_coding_extension _ANSI_ARGS_((void));
static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
static int extra_bit_information _ANSI_ARGS_((void));
static void copyright_extension _ANSI_ARGS_((void));
static void user_data _ANSI_ARGS_((void));
static void user_data _ANSI_ARGS_((void));
 
 
 
 
/* introduced in September 1995 to assist spatial scalable decoding */
static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
/* private variables */
static int Temporal_Reference_Base = 0;
static int True_Framenum_max = -1;
static int Temporal_Reference_GOP_Reset = 0;
 
#define RESERVED -1
static double frame_rate_Table[16] =
{
0.0,
((23.0*1000.0)/1001.0),
24.0,
25.0,
((30.0*1000.0)/1001.0),
30.0,
50.0,
((60.0*1000.0)/1001.0),
60.0,
RESERVED,
RESERVED,
RESERVED,
RESERVED,
RESERVED,
RESERVED,
RESERVED
};
 
/*
* decode headers from one input stream
* until an End of Sequence or picture start code
* is found
*/
int Get_Hdr()
{
unsigned int code;
 
for (;;)
{
/* look for next_start_code */
next_start_code();
code = Get_Bits32();
switch (code)
{
case SEQUENCE_HEADER_CODE:
sequence_header();
break;
case GROUP_START_CODE:
group_of_pictures_header();
break;
case PICTURE_START_CODE:
picture_header();
return 1;
break;
case SEQUENCE_END_CODE:
return 0;
break;
default:
if (!Quiet_Flag)
fprintf(stderr,"Unexpected next_start_code %08x (ignored)\n",code);
break;
}
}
}
 
 
/* align to start of next next_start_code */
 
void next_start_code()
{
/* byte align */
Flush_Buffer(ld->Incnt&7);
while (Show_Bits(24)!=0x01L)
Flush_Buffer(8);
}
 
 
/* decode sequence header */
 
static void sequence_header()
{
int i;
int pos;
 
pos = ld->Bitcnt;
horizontal_size = Get_Bits(12);
vertical_size = Get_Bits(12);
aspect_ratio_information = Get_Bits(4);
frame_rate_code = Get_Bits(4);
bit_rate_value = Get_Bits(18);
marker_bit("sequence_header()");
vbv_buffer_size = Get_Bits(10);
constrained_parameters_flag = Get_Bits(1);
 
if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
else
{
for (i=0; i<64; i++)
ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
}
 
if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
else
{
for (i=0; i<64; i++)
ld->non_intra_quantizer_matrix[i] = 16;
}
 
/* copy luminance to chrominance matrices */
for (i=0; i<64; i++)
{
ld->chroma_intra_quantizer_matrix[i] =
ld->intra_quantizer_matrix[i];
 
ld->chroma_non_intra_quantizer_matrix[i] =
ld->non_intra_quantizer_matrix[i];
}
 
#ifdef VERBOSE
if (Verbose_Flag > NO_LAYER)
{
printf("sequence header (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag > SEQUENCE_LAYER)
{
printf(" horizontal_size=%d\n",horizontal_size);
printf(" vertical_size=%d\n",vertical_size);
printf(" aspect_ratio_information=%d\n",aspect_ratio_information);
printf(" frame_rate_code=%d",frame_rate_code);
printf(" bit_rate_value=%d\n",bit_rate_value);
printf(" vbv_buffer_size=%d\n",vbv_buffer_size);
printf(" constrained_parameters_flag=%d\n",constrained_parameters_flag);
printf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix);
printf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_header++;
#endif /* VERIFY */
 
extension_and_user_data();
}
 
 
 
/* decode group of pictures header */
/* ISO/IEC 13818-2 section 6.2.2.6 */
static void group_of_pictures_header()
{
int pos;
 
if (ld == &base)
{
Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
Temporal_Reference_GOP_Reset = 1;
}
pos = ld->Bitcnt;
drop_flag = Get_Bits(1);
hour = Get_Bits(5);
minute = Get_Bits(6);
marker_bit("group_of_pictures_header()");
sec = Get_Bits(6);
frame = Get_Bits(6);
closed_gop = Get_Bits(1);
broken_link = Get_Bits(1);
 
#ifdef VERBOSE
if (Verbose_Flag > NO_LAYER)
{
printf("group of pictures (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag > SEQUENCE_LAYER)
{
printf(" drop_flag=%d\n",drop_flag);
printf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);
printf(" closed_gop=%d\n",closed_gop);
printf(" broken_link=%d\n",broken_link);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_group_of_pictures_header++;
#endif /* VERIFY */
 
extension_and_user_data();
 
}
 
 
/* decode picture header */
 
/* ISO/IEC 13818-2 section 6.2.3 */
static void picture_header()
{
int pos;
int Extra_Information_Byte_Count;
 
/* unless later overwritten by picture_spatial_scalable_extension() */
ld->pict_scal = 0;
pos = ld->Bitcnt;
temporal_reference = Get_Bits(10);
picture_coding_type = Get_Bits(3);
vbv_delay = Get_Bits(16);
 
if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
{
full_pel_forward_vector = Get_Bits(1);
forward_f_code = Get_Bits(3);
}
if (picture_coding_type==B_TYPE)
{
full_pel_backward_vector = Get_Bits(1);
backward_f_code = Get_Bits(3);
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("picture header (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
printf(" temporal_reference=%d\n",temporal_reference);
printf(" picture_coding_type=%d\n",picture_coding_type);
printf(" vbv_delay=%d\n",vbv_delay);
if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
{
printf(" full_pel_forward_vector=%d\n",full_pel_forward_vector);
printf(" forward_f_code =%d\n",forward_f_code);
}
if (picture_coding_type==B_TYPE)
{
printf(" full_pel_backward_vector=%d\n",full_pel_backward_vector);
printf(" backward_f_code =%d\n",backward_f_code);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_header++;
#endif /* VERIFY */
 
Extra_Information_Byte_Count =
extra_bit_information();
extension_and_user_data();
 
/* update tracking information used to assist spatial scalability */
Update_Temporal_Reference_Tacking_Data();
}
 
/* decode slice header */
 
/* ISO/IEC 13818-2 section 6.2.4 */
int slice_header()
{
int slice_vertical_position_extension;
int quantizer_scale_code;
int pos;
int slice_picture_id_enable = 0;
int slice_picture_id = 0;
int extra_information_slice = 0;
 
pos = ld->Bitcnt;
 
slice_vertical_position_extension =
(ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
 
if (ld->scalable_mode==SC_DP)
ld->priority_breakpoint = Get_Bits(7);
 
quantizer_scale_code = Get_Bits(5);
ld->quantizer_scale =
ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
 
/* slice_id introduced in March 1995 as part of the video corridendum
(after the IS was drafted in November 1994) */
if (Get_Bits(1))
{
ld->intra_slice = Get_Bits(1);
 
slice_picture_id_enable = Get_Bits(1);
slice_picture_id = Get_Bits(6);
 
extra_information_slice = extra_bit_information();
}
else
ld->intra_slice = 0;
 
#ifdef VERBOSE
if (Verbose_Flag>PICTURE_LAYER)
{
printf("slice header (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SLICE_LAYER)
{
if (ld->MPEG2_Flag && vertical_size>2800)
printf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension);
if (ld->scalable_mode==SC_DP)
printf(" priority_breakpoint=%d\n",ld->priority_breakpoint);
 
printf(" quantizer_scale_code=%d\n",quantizer_scale_code);
 
printf(" slice_picture_id_enable = %d\n", slice_picture_id_enable);
 
if(slice_picture_id_enable)
printf(" slice_picture_id = %d\n", slice_picture_id);
 
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_slice_header++;
#endif /* VERIFY */
 
 
return slice_vertical_position_extension;
}
 
 
/* decode extension and user data */
/* ISO/IEC 13818-2 section 6.2.2.2 */
static void extension_and_user_data()
{
int code,ext_ID;
 
next_start_code();
 
while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
{
if (code==EXTENSION_START_CODE)
{
Flush_Buffer32();
ext_ID = Get_Bits(4);
switch (ext_ID)
{
case SEQUENCE_EXTENSION_ID:
sequence_extension();
break;
case SEQUENCE_DISPLAY_EXTENSION_ID:
sequence_display_extension();
break;
case QUANT_MATRIX_EXTENSION_ID:
quant_matrix_extension();
break;
case SEQUENCE_SCALABLE_EXTENSION_ID:
sequence_scalable_extension();
break;
case PICTURE_DISPLAY_EXTENSION_ID:
picture_display_extension();
break;
case PICTURE_CODING_EXTENSION_ID:
picture_coding_extension();
break;
case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
picture_spatial_scalable_extension();
break;
case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
picture_temporal_scalable_extension();
break;
case COPYRIGHT_EXTENSION_ID:
copyright_extension();
break;
default:
fprintf(stderr,"reserved extension start code ID %d\n",ext_ID);
break;
}
next_start_code();
}
else
{
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
printf("user data\n");
#endif /* VERBOSE */
Flush_Buffer32();
user_data();
}
}
}
 
 
/* decode sequence extension */
 
/* ISO/IEC 13818-2 section 6.2.2.3 */
static void sequence_extension()
{
int horizontal_size_extension;
int vertical_size_extension;
int bit_rate_extension;
int vbv_buffer_size_extension;
int pos;
 
/* derive bit position for trace */
#ifdef VERBOSE
pos = ld->Bitcnt;
#endif
 
ld->MPEG2_Flag = 1;
 
ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
profile_and_level_indication = Get_Bits(8);
progressive_sequence = Get_Bits(1);
chroma_format = Get_Bits(2);
horizontal_size_extension = Get_Bits(2);
vertical_size_extension = Get_Bits(2);
bit_rate_extension = Get_Bits(12);
marker_bit("sequence_extension");
vbv_buffer_size_extension = Get_Bits(8);
low_delay = Get_Bits(1);
frame_rate_extension_n = Get_Bits(2);
frame_rate_extension_d = Get_Bits(5);
 
frame_rate = frame_rate_Table[frame_rate_code] *
((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
 
/* special case for 422 profile & level must be made */
if((profile_and_level_indication>>7) & 1)
{ /* escape bit of profile_and_level_indication set */
/* 4:2:2 Profile @ Main Level */
if((profile_and_level_indication&15)==5)
{
profile = PROFILE_422;
level = MAIN_LEVEL;
}
}
else
{
profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
level = profile_and_level_indication & 0xF; /* Level is lower nibble */
}
horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
 
 
/* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
* both the original bit_rate_value parsed in sequence_header() and
* the optional bit_rate_extension in sequence_extension_header().
* However, we use it for bitstream verification purposes.
*/
 
bit_rate_value += (bit_rate_extension << 18);
bit_rate = ((double) bit_rate_value) * 400.0;
vbv_buffer_size += (vbv_buffer_size_extension << 10);
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("sequence extension (byte %d)\n",(pos>>3)-4);
 
if (Verbose_Flag>SEQUENCE_LAYER)
{
printf(" profile_and_level_indication=%d\n",profile_and_level_indication);
 
if (profile_and_level_indication<128)
{
printf(" profile=%d, level=%d\n",profile,level);
}
 
printf(" progressive_sequence=%d\n",progressive_sequence);
printf(" chroma_format=%d\n",chroma_format);
printf(" horizontal_size_extension=%d\n",horizontal_size_extension);
printf(" vertical_size_extension=%d\n",vertical_size_extension);
printf(" bit_rate_extension=%d\n",bit_rate_extension);
printf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension);
printf(" low_delay=%d\n",low_delay);
printf(" frame_rate_extension_n=%d\n",frame_rate_extension_n);
printf(" frame_rate_extension_d=%d\n",frame_rate_extension_d);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_extension++;
#endif /* VERIFY */
 
 
}
 
 
/* decode sequence display extension */
 
static void sequence_display_extension()
{
int pos;
 
pos = ld->Bitcnt;
video_format = Get_Bits(3);
color_description = Get_Bits(1);
 
if (color_description)
{
color_primaries = Get_Bits(8);
transfer_characteristics = Get_Bits(8);
matrix_coefficients = Get_Bits(8);
}
 
display_horizontal_size = Get_Bits(14);
marker_bit("sequence_display_extension");
display_vertical_size = Get_Bits(14);
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("sequence display extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
 
printf(" video_format=%d\n",video_format);
printf(" color_description=%d\n",color_description);
 
if (color_description)
{
printf(" color_primaries=%d\n",color_primaries);
printf(" transfer_characteristics=%d\n",transfer_characteristics);
printf(" matrix_coefficients=%d\n",matrix_coefficients);
}
printf(" display_horizontal_size=%d\n",display_horizontal_size);
printf(" display_vertical_size=%d\n",display_vertical_size);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_display_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode quant matrix entension */
/* ISO/IEC 13818-2 section 6.2.3.2 */
static void quant_matrix_extension()
{
int i;
int pos;
 
pos = ld->Bitcnt;
 
if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
{
ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= Get_Bits(8);
}
}
 
if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
{
ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= Get_Bits(8);
}
}
 
if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
 
if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("quant matrix extension (byte %d)\n",(pos>>3)-4);
printf(" load_intra_quantizer_matrix=%d\n",
ld->load_intra_quantizer_matrix);
printf(" load_non_intra_quantizer_matrix=%d\n",
ld->load_non_intra_quantizer_matrix);
printf(" load_chroma_intra_quantizer_matrix=%d\n",
ld->load_chroma_intra_quantizer_matrix);
printf(" load_chroma_non_intra_quantizer_matrix=%d\n",
ld->load_chroma_non_intra_quantizer_matrix);
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_quant_matrix_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode sequence scalable extension */
/* ISO/IEC 13818-2 section 6.2.2.5 */
static void sequence_scalable_extension()
{
int pos;
 
pos = ld->Bitcnt;
 
/* values (without the +1 offset) of scalable_mode are defined in
Table 6-10 of ISO/IEC 13818-2 */
ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
 
layer_id = Get_Bits(4);
 
if (ld->scalable_mode==SC_SPAT)
{
lower_layer_prediction_horizontal_size = Get_Bits(14);
marker_bit("sequence_scalable_extension()");
lower_layer_prediction_vertical_size = Get_Bits(14);
horizontal_subsampling_factor_m = Get_Bits(5);
horizontal_subsampling_factor_n = Get_Bits(5);
vertical_subsampling_factor_m = Get_Bits(5);
vertical_subsampling_factor_n = Get_Bits(5);
}
 
if (ld->scalable_mode==SC_TEMP)
Error("temporal scalability not implemented\n");
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("sequence scalable extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
printf(" scalable_mode=%d\n",ld->scalable_mode-1);
printf(" layer_id=%d\n",layer_id);
if (ld->scalable_mode==SC_SPAT)
{
printf(" lower_layer_prediction_horiontal_size=%d\n",
lower_layer_prediction_horizontal_size);
printf(" lower_layer_prediction_vertical_size=%d\n",
lower_layer_prediction_vertical_size);
printf(" horizontal_subsampling_factor_m=%d\n",
horizontal_subsampling_factor_m);
printf(" horizontal_subsampling_factor_n=%d\n",
horizontal_subsampling_factor_n);
printf(" vertical_subsampling_factor_m=%d\n",
vertical_subsampling_factor_m);
printf(" vertical_subsampling_factor_n=%d\n",
vertical_subsampling_factor_n);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_scalable_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode picture display extension */
/* ISO/IEC 13818-2 section 6.2.3.3. */
static void picture_display_extension()
{
int i;
int number_of_frame_center_offsets;
int pos;
 
pos = ld->Bitcnt;
/* based on ISO/IEC 13818-2 section 6.3.12
(November 1994) Picture display extensions */
 
/* derive number_of_frame_center_offsets */
if(progressive_sequence)
{
if(repeat_first_field)
{
if(top_field_first)
number_of_frame_center_offsets = 3;
else
number_of_frame_center_offsets = 2;
}
else
{
number_of_frame_center_offsets = 1;
}
}
else
{
if(picture_structure!=FRAME_PICTURE)
{
number_of_frame_center_offsets = 1;
}
else
{
if(repeat_first_field)
number_of_frame_center_offsets = 3;
else
number_of_frame_center_offsets = 2;
}
}
 
 
/* now parse */
for (i=0; i<number_of_frame_center_offsets; i++)
{
frame_center_horizontal_offset[i] = Get_Bits(16);
marker_bit("picture_display_extension, first marker bit");
frame_center_vertical_offset[i] = Get_Bits(16);
marker_bit("picture_display_extension, second marker bit");
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("picture display extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
 
for (i=0; i<number_of_frame_center_offsets; i++)
{
printf(" frame_center_horizontal_offset[%d]=%d\n",i,
frame_center_horizontal_offset[i]);
printf(" frame_center_vertical_offset[%d]=%d\n",i,
frame_center_vertical_offset[i]);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_display_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode picture coding extension */
static void picture_coding_extension()
{
int pos;
 
pos = ld->Bitcnt;
 
f_code[0][0] = Get_Bits(4);
f_code[0][1] = Get_Bits(4);
f_code[1][0] = Get_Bits(4);
f_code[1][1] = Get_Bits(4);
 
intra_dc_precision = Get_Bits(2);
picture_structure = Get_Bits(2);
top_field_first = Get_Bits(1);
frame_pred_frame_dct = Get_Bits(1);
concealment_motion_vectors = Get_Bits(1);
ld->q_scale_type = Get_Bits(1);
intra_vlc_format = Get_Bits(1);
ld->alternate_scan = Get_Bits(1);
repeat_first_field = Get_Bits(1);
chroma_420_type = Get_Bits(1);
progressive_frame = Get_Bits(1);
composite_display_flag = Get_Bits(1);
 
if (composite_display_flag)
{
v_axis = Get_Bits(1);
field_sequence = Get_Bits(3);
sub_carrier = Get_Bits(1);
burst_amplitude = Get_Bits(7);
sub_carrier_phase = Get_Bits(8);
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("picture coding extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
printf(" forward horizontal f_code=%d\n", f_code[0][0]);
printf(" forward vertical f_code=%d\n", f_code[0][1]);
printf(" backward horizontal f_code=%d\n", f_code[1][0]);
printf(" backward_vertical f_code=%d\n", f_code[1][1]);
printf(" intra_dc_precision=%d\n",intra_dc_precision);
printf(" picture_structure=%d\n",picture_structure);
printf(" top_field_first=%d\n",top_field_first);
printf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct);
printf(" concealment_motion_vectors=%d\n",concealment_motion_vectors);
printf(" q_scale_type=%d\n",ld->q_scale_type);
printf(" intra_vlc_format=%d\n",intra_vlc_format);
printf(" alternate_scan=%d\n",ld->alternate_scan);
printf(" repeat_first_field=%d\n",repeat_first_field);
printf(" chroma_420_type=%d\n",chroma_420_type);
printf(" progressive_frame=%d\n",progressive_frame);
printf(" composite_display_flag=%d\n",composite_display_flag);
 
if (composite_display_flag)
{
printf(" v_axis=%d\n",v_axis);
printf(" field_sequence=%d\n",field_sequence);
printf(" sub_carrier=%d\n",sub_carrier);
printf(" burst_amplitude=%d\n",burst_amplitude);
printf(" sub_carrier_phase=%d\n",sub_carrier_phase);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_coding_extension++;
#endif /* VERIFY */
}
 
 
/* decode picture spatial scalable extension */
/* ISO/IEC 13818-2 section 6.2.3.5. */
static void picture_spatial_scalable_extension()
{
int pos;
 
pos = ld->Bitcnt;
 
ld->pict_scal = 1; /* use spatial scalability in this picture */
 
lower_layer_temporal_reference = Get_Bits(10);
marker_bit("picture_spatial_scalable_extension(), first marker bit");
lower_layer_horizontal_offset = Get_Bits(15);
if (lower_layer_horizontal_offset>=16384)
lower_layer_horizontal_offset-= 32768;
marker_bit("picture_spatial_scalable_extension(), second marker bit");
lower_layer_vertical_offset = Get_Bits(15);
if (lower_layer_vertical_offset>=16384)
lower_layer_vertical_offset-= 32768;
spatial_temporal_weight_code_table_index = Get_Bits(2);
lower_layer_progressive_frame = Get_Bits(1);
lower_layer_deinterlaced_field_select = Get_Bits(1);
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
printf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
printf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference);
printf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset);
printf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset);
printf(" spatial_temporal_weight_code_table_index=%d\n",
spatial_temporal_weight_code_table_index);
printf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame);
printf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_spatial_scalable_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode picture temporal scalable extension
*
* not implemented
*/
/* ISO/IEC 13818-2 section 6.2.3.4. */
static void picture_temporal_scalable_extension()
{
Error("temporal scalability not supported\n");
 
#ifdef VERIFY
verify_picture_temporal_scalable_extension++;
#endif /* VERIFY */
}
 
 
/* decode extra bit information */
/* ISO/IEC 13818-2 section 6.2.3.4. */
static int extra_bit_information()
{
int Byte_Count = 0;
 
while (Get_Bits1())
{
Flush_Buffer(8);
Byte_Count++;
}
 
return(Byte_Count);
}
 
 
 
/* ISO/IEC 13818-2 section 5.3 */
/* Purpose: this function is mainly designed to aid in bitstream conformance
testing. A simple Flush_Buffer(1) would do */
void marker_bit(text)
char *text;
{
int marker;
 
marker = Get_Bits(1);
 
#ifdef VERIFY
if(!marker)
printf("ERROR: %s--marker_bit set to 0",text);
#endif
}
 
 
/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
static void user_data()
{
/* skip ahead to the next start code */
next_start_code();
}
 
 
 
/* Copyright extension */
/* ISO/IEC 13818-2 section 6.2.3.6. */
/* (header added in November, 1994 to the IS document) */
 
 
static void copyright_extension()
{
int pos;
int reserved_data;
 
pos = ld->Bitcnt;
 
copyright_flag = Get_Bits(1);
copyright_identifier = Get_Bits(8);
original_or_copy = Get_Bits(1);
/* reserved */
reserved_data = Get_Bits(7);
 
marker_bit("copyright_extension(), first marker bit");
copyright_number_1 = Get_Bits(20);
marker_bit("copyright_extension(), second marker bit");
copyright_number_2 = Get_Bits(22);
marker_bit("copyright_extension(), third marker bit");
copyright_number_3 = Get_Bits(22);
 
if(Verbose_Flag>NO_LAYER)
{
printf("copyright_extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
printf(" copyright_flag =%d\n",copyright_flag);
printf(" copyright_identifier=%d\n",copyright_identifier);
printf(" original_or_copy = %d (original=1, copy=0)\n",
original_or_copy);
printf(" copyright_number_1=%d\n",copyright_number_1);
printf(" copyright_number_2=%d\n",copyright_number_2);
printf(" copyright_number_3=%d\n",copyright_number_3);
}
}
 
#ifdef VERIFY
verify_copyright_extension++;
#endif /* VERIFY */
}
 
 
 
/* introduced in September 1995 to assist Spatial Scalability */
static void Update_Temporal_Reference_Tacking_Data()
{
static int temporal_reference_wrap = 0;
static int temporal_reference_old = 0;
 
if (ld == &base) /* *CH* */
{
if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
/* check first field of */
{
/* non-B-frame */
if (temporal_reference_wrap)
{/* wrap occured at previous I- or P-frame */
/* now all intervening B-frames which could
still have high temporal_reference values are done */
Temporal_Reference_Base += 1024;
temporal_reference_wrap = 0;
}
/* distinguish from a reset */
if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
temporal_reference_old = temporal_reference;
Temporal_Reference_GOP_Reset = 0;
}
 
True_Framenum = Temporal_Reference_Base + temporal_reference;
/* temporary wrap of TR at 1024 for M frames */
if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
True_Framenum += 1024;
 
True_Framenum_max = (True_Framenum > True_Framenum_max) ?
True_Framenum : True_Framenum_max;
}
}
/advdemos/tags/rel_1_5_beta1/mpeg2/m.bat
0,0 → 1,0
x mpeg2dec -b /shark/mpeg2/m.m2v
/advdemos/tags/rel_1_5_beta1/mpeg2/idct.c
0,0 → 1,211
/* idct.c, inverse fast discrete cosine transform */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/**********************************************************/
/* inverse two dimensional DCT, Chen-Wang algorithm */
/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
/* 32-bit integer arithmetic (8 bit coefficients) */
/* 11 mults, 29 adds per DCT */
/* sE, 18.8.91 */
/**********************************************************/
/* coefficients extended to 12 bit for IEEE1180-1990 */
/* compliance sE, 2.1.94 */
/**********************************************************/
 
/* this code assumes >> to be a two's-complement arithmetic */
/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
 
#include "config.h"
 
#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
 
/* global declarations */
void Initialize_Fast_IDCT _ANSI_ARGS_((void));
void Fast_IDCT _ANSI_ARGS_((short *block));
 
/* private data */
static short iclip[1024]; /* clipping table */
static short *iclp;
 
/* private prototypes */
static void idctrow _ANSI_ARGS_((short *blk));
static void idctcol _ANSI_ARGS_((short *blk));
 
/* row (horizontal) IDCT
*
* 7 pi 1
* dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
* l=0 8 2
*
* where: c[0] = 128
* c[1..7] = 128*sqrt(2)
*/
 
static void idctrow(blk)
short *blk;
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
 
/* shortcut */
if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
(x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
{
blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
return;
}
 
x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
 
/* first stage */
x8 = W7*(x4+x5);
x4 = x8 + (W1-W7)*x4;
x5 = x8 - (W1+W7)*x5;
x8 = W3*(x6+x7);
x6 = x8 - (W3-W5)*x6;
x7 = x8 - (W3+W5)*x7;
/* second stage */
x8 = x0 + x1;
x0 -= x1;
x1 = W6*(x3+x2);
x2 = x1 - (W2+W6)*x2;
x3 = x1 + (W2-W6)*x3;
x1 = x4 + x6;
x4 -= x6;
x6 = x5 + x7;
x5 -= x7;
/* third stage */
x7 = x8 + x3;
x8 -= x3;
x3 = x0 + x2;
x0 -= x2;
x2 = (181*(x4+x5)+128)>>8;
x4 = (181*(x4-x5)+128)>>8;
/* fourth stage */
blk[0] = (x7+x1)>>8;
blk[1] = (x3+x2)>>8;
blk[2] = (x0+x4)>>8;
blk[3] = (x8+x6)>>8;
blk[4] = (x8-x6)>>8;
blk[5] = (x0-x4)>>8;
blk[6] = (x3-x2)>>8;
blk[7] = (x7-x1)>>8;
}
 
/* column (vertical) IDCT
*
* 7 pi 1
* dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
* l=0 8 2
*
* where: c[0] = 1/1024
* c[1..7] = (1/1024)*sqrt(2)
*/
static void idctcol(blk)
short *blk;
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
 
/* shortcut */
if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
(x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
{
blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
iclp[(blk[8*0]+32)>>6];
return;
}
 
x0 = (blk[8*0]<<8) + 8192;
 
/* first stage */
x8 = W7*(x4+x5) + 4;
x4 = (x8+(W1-W7)*x4)>>3;
x5 = (x8-(W1+W7)*x5)>>3;
x8 = W3*(x6+x7) + 4;
x6 = (x8-(W3-W5)*x6)>>3;
x7 = (x8-(W3+W5)*x7)>>3;
/* second stage */
x8 = x0 + x1;
x0 -= x1;
x1 = W6*(x3+x2) + 4;
x2 = (x1-(W2+W6)*x2)>>3;
x3 = (x1+(W2-W6)*x3)>>3;
x1 = x4 + x6;
x4 -= x6;
x6 = x5 + x7;
x5 -= x7;
/* third stage */
x7 = x8 + x3;
x8 -= x3;
x3 = x0 + x2;
x0 -= x2;
x2 = (181*(x4+x5)+128)>>8;
x4 = (181*(x4-x5)+128)>>8;
/* fourth stage */
blk[8*0] = iclp[(x7+x1)>>14];
blk[8*1] = iclp[(x3+x2)>>14];
blk[8*2] = iclp[(x0+x4)>>14];
blk[8*3] = iclp[(x8+x6)>>14];
blk[8*4] = iclp[(x8-x6)>>14];
blk[8*5] = iclp[(x0-x4)>>14];
blk[8*6] = iclp[(x3-x2)>>14];
blk[8*7] = iclp[(x7-x1)>>14];
}
 
/* two dimensional inverse discrete cosine transform */
void Fast_IDCT(block)
short *block;
{
int i;
 
for (i=0; i<8; i++)
idctrow(block+8*i);
 
for (i=0; i<8; i++)
idctcol(block+i);
}
 
void Initialize_Fast_IDCT()
{
int i;
 
iclp = iclip+512;
for (i= -512; i<512; i++)
iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
}
/advdemos/tags/rel_1_5_beta1/mpeg2/makefile.ori
0,0 → 1,98
# Makefile for mpeg2decode
 
# Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved.
 
#
# Disclaimer of Warranty
#
# These software programs are available to the user without any license fee or
# royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
# any and all warranties, whether express, implied, or statuary, including any
# implied warranties or merchantability or of fitness for a particular
# purpose. In no event shall the copyright-holder be liable for any
# incidental, punitive, or consequential damages of any kind whatsoever
# arising from the use of these programs.
#
# This disclaimer of warranty extends to the user of these programs and user's
# customers, employees, agents, transferees, successors, and assigns.
#
# The MPEG Software Simulation Group does not represent or warrant that the
# programs furnished hereunder are free of infringement of any third-party
# patents.
#
# Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
# are subject to royalty fees to patent holders. Many of these patents are
# general enough such that they are unavoidable regardless of implementation
# design.
#
#
 
#WARNINGS = -Wall
#VERIFY = -DVERIFY
 
#disable this flag if you do not want bitstream element tracing
#this will speed up the decoder some since it does not have to test
#the trace flag at several critical inner loop locations.
TRACE = -DTRACE
 
#disable this flag if you do not need verbose trace, such as
#header information
VERBOSE = -DVERBOSE
 
# uncomment the following two lines if you want to include X11 support
 
#USE_DISP = -DDISPLAY
#LIBS = -lX11
 
# uncomment the following two lines if you want to use shared memory
# (faster display if server and client run on the same machine)
 
#USE_SHMEM = -DSH_MEM
#LIBS = -lXext -lX11
 
# if your X11 include files / libraries are in a non standard location:
# set INCLUDEDIR to -I followed by the appropriate include file path and
# set LIBRARYDIR to -L followed by the appropriate library path and
 
#INCLUDEDIR = -I/usr/openwin/include
#LIBRARYDIR = -L/usr/openwin/lib
 
#
# GNU gcc
#
CC = gcc
CFLAGS = -O2 $(USE_DISP) $(USE_SHMEM) $(INCLUDEDIR) $(TRACE) $(VERBOSE) $(VERIFY) $(WARNINGS)
 
OBJ = mpeg2dec.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o display.o systems.o subspic.o verify.o
 
all: mpeg2decode
 
pc: mpeg2dec.exe
 
clean:
rm -f *.o *% core mpeg2decode
 
mpeg2dec.exe: mpeg2decode
coff2exe mpeg2dec
 
mpeg2decode: $(OBJ)
$(CC) $(CFLAGS) $(LIBRARYDIR) -o mpeg2decode $(OBJ) -lm $(LIBS)
 
display.o : display.c config.h global.h mpeg2dec.h
getbits.o : getbits.c config.h global.h mpeg2dec.h
getblk.o : getblk.c config.h global.h mpeg2dec.h
gethdr.o : gethdr.c config.h global.h mpeg2dec.h
getpic.o : getpic.c config.h global.h mpeg2dec.h
getvlc.o : getvlc.c config.h global.h mpeg2dec.h getvlc.h
idct.o : idct.c config.h
idctref.o : idctref.c config.h
motion.o : motion.c config.h global.h mpeg2dec.h
mpeg2dec.o : mpeg2dec.c config.h global.h mpeg2dec.h
recon.o : recon.c config.h global.h mpeg2dec.h
spatscal.o : spatscal.c config.h global.h mpeg2dec.h
store.o : store.c config.h global.h mpeg2dec.h
 
# additions since July 4, 1994 edition
systems.o : systems.c config.h global.h mpeg2dec.h
subspic.o : subspic.c config.h global.h mpeg2dec.h
verify.o: verify.c config.h global.h mpeg2dec.h
/advdemos/tags/rel_1_5_beta1/mpeg2/getvlc.c
0,0 → 1,799
/* getvlc.c, variable length decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
 
#include "config.h"
#include "global.h"
#include "getvlc.h"
 
/* private prototypes */
/* generic picture macroblock type processing functions */
static int Get_I_macroblock_type _ANSI_ARGS_((void));
static int Get_P_macroblock_type _ANSI_ARGS_((void));
static int Get_B_macroblock_type _ANSI_ARGS_((void));
static int Get_D_macroblock_type _ANSI_ARGS_((void));
 
/* spatial picture macroblock type processing functions */
static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
 
int Get_macroblock_type()
{
int macroblock_type = 0;
 
if (ld->scalable_mode==SC_SNR)
macroblock_type = Get_SNR_macroblock_type();
else
{
switch (picture_coding_type)
{
case I_TYPE:
macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type();
break;
case P_TYPE:
macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type();
break;
case B_TYPE:
macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type();
break;
case D_TYPE:
macroblock_type = Get_D_macroblock_type();
break;
default:
printf("Get_macroblock_type(): unrecognized picture coding type\n");
break;
}
}
 
return macroblock_type;
}
 
static int Get_I_macroblock_type()
{
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_type(I) ");
#endif /* TRACE */
 
if (Get_Bits1())
{
#ifdef TRACE
if (Trace_Flag)
printf("(1): Intra (1)\n");
#endif /* TRACE */
return 1;
}
 
if (!Get_Bits1())
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
}
 
#ifdef TRACE
if (Trace_Flag)
printf("(01): Intra, Quant (17)\n");
#endif /* TRACE */
 
return 17;
}
 
static char *MBdescr[]={
"", "Intra", "No MC, Coded", "",
"Bwd, Not Coded", "", "Bwd, Coded", "",
"Fwd, Not Coded", "", "Fwd, Coded", "",
"Interp, Not Coded", "", "Interp, Coded", "",
"", "Intra, Quant", "No MC, Coded, Quant", "",
"", "", "Bwd, Coded, Quant", "",
"", "", "Fwd, Coded, Quant", "",
"", "", "Interp, Coded, Quant", ""
};
 
static int Get_P_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_type(P) (");
#endif /* TRACE */
 
if ((code = Show_Bits(6))>=8)
{
code >>= 3;
Flush_Buffer(PMBtab0[code].len);
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,3,PMBtab0[code].len);
printf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
}
#endif /* TRACE */
return PMBtab0[code].val;
}
 
if (code==0)
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(PMBtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,6,PMBtab1[code].len);
printf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
}
#endif /* TRACE */
 
return PMBtab1[code].val;
}
 
static int Get_B_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_type(B) (");
#endif /* TRACE */
 
if ((code = Show_Bits(6))>=8)
{
code >>= 2;
Flush_Buffer(BMBtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,4,BMBtab0[code].len);
printf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
}
#endif /* TRACE */
 
return BMBtab0[code].val;
}
 
if (code==0)
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(BMBtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,6,BMBtab1[code].len);
printf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
}
#endif /* TRACE */
 
return BMBtab1[code].val;
}
 
static int Get_D_macroblock_type()
{
if (!Get_Bits1())
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag=1;
}
 
return 1;
}
 
/* macroblock_type for pictures with spatial scalability */
static int Get_I_Spatial_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_type(I,spat) (");
#endif /* TRACE */
 
code = Show_Bits(4);
 
if (code==0)
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,4,spIMBtab[code].len);
printf("): %02x\n",spIMBtab[code].val);
}
#endif /* TRACE */
 
Flush_Buffer(spIMBtab[code].len);
return spIMBtab[code].val;
}
 
static int Get_P_Spatial_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_type(P,spat) (");
#endif /* TRACE */
 
code = Show_Bits(7);
 
if (code<2)
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
if (code>=16)
{
code >>= 3;
Flush_Buffer(spPMBtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,4,spPMBtab0[code].len);
printf("): %02x\n",spPMBtab0[code].val);
}
#endif /* TRACE */
 
return spPMBtab0[code].val;
}
 
Flush_Buffer(spPMBtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,7,spPMBtab1[code].len);
printf("): %02x\n",spPMBtab1[code].val);
}
#endif /* TRACE */
 
return spPMBtab1[code].val;
}
 
static int Get_B_Spatial_macroblock_type()
{
int code;
VLCtab *p;
 
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_type(B,spat) (");
#endif /* TRACE */
 
code = Show_Bits(9);
 
if (code>=64)
p = &spBMBtab0[(code>>5)-2];
else if (code>=16)
p = &spBMBtab1[(code>>2)-4];
else if (code>=8)
p = &spBMBtab2[code-8];
else
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(p->len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,9,p->len);
printf("): %02x\n",p->val);
}
#endif /* TRACE */
 
return p->val;
}
 
static int Get_SNR_macroblock_type()
{
int code;
 
#ifdef TRACE /* *CH* */
if (Trace_Flag)
printf("macroblock_type(SNR) (");
#endif
 
code = Show_Bits(3);
 
if (code==0)
{
if (!Quiet_Flag)
printf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(SNRMBtab[code].len);
 
#ifdef TRACE /* *CH* */
if (Trace_Flag)
{
Print_Bits(code,3,SNRMBtab[code].len);
printf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
}
#endif
 
 
return SNRMBtab[code].val;
}
 
int Get_motion_code()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
printf("motion_code (");
#endif /* TRACE */
 
if (Get_Bits1())
{
#ifdef TRACE
if (Trace_Flag)
printf("0): 0\n");
#endif /* TRACE */
return 0;
}
 
if ((code = Show_Bits(9))>=64)
{
code >>= 6;
Flush_Buffer(MVtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,3,MVtab0[code].len);
printf("%d): %d\n",
Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
}
#endif /* TRACE */
 
return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
}
 
if (code>=24)
{
code >>= 3;
Flush_Buffer(MVtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,6,MVtab1[code].len);
printf("%d): %d\n",
Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
}
#endif /* TRACE */
 
return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
}
 
if ((code-=12)<0)
{
if (!Quiet_Flag)
/* HACK */
printf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
Fault_Flag=1;
return 0;
}
 
Flush_Buffer(MVtab2[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code+12,9,MVtab2[code].len);
printf("%d): %d\n",
Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
}
#endif /* TRACE */
 
return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
}
 
/* get differential motion vector (for dual prime prediction) */
int Get_dmvector()
{
#ifdef TRACE
if (Trace_Flag)
printf("dmvector (");
#endif /* TRACE */
 
if (Get_Bits(1))
{
#ifdef TRACE
if (Trace_Flag)
printf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");
#endif /* TRACE */
return Get_Bits(1) ? -1 : 1;
}
else
{
#ifdef TRACE
if (Trace_Flag)
printf("0): 0\n");
#endif /* TRACE */
return 0;
}
}
 
int Get_coded_block_pattern()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
printf("coded_block_pattern_420 (");
#endif /* TRACE */
 
if ((code = Show_Bits(9))>=128)
{
code >>= 4;
Flush_Buffer(CBPtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,5,CBPtab0[code].len);
printf("): ");
Print_Bits(CBPtab0[code].val,6,6);
printf(" (%d)\n",CBPtab0[code].val);
}
#endif /* TRACE */
 
return CBPtab0[code].val;
}
 
if (code>=8)
{
code >>= 1;
Flush_Buffer(CBPtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,8,CBPtab1[code].len);
printf("): ");
Print_Bits(CBPtab1[code].val,6,6);
printf(" (%d)\n",CBPtab1[code].val);
}
#endif /* TRACE */
 
return CBPtab1[code].val;
}
 
if (code<1)
{
if (!Quiet_Flag)
printf("Invalid coded_block_pattern code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(CBPtab2[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,9,CBPtab2[code].len);
printf("): ");
Print_Bits(CBPtab2[code].val,6,6);
printf(" (%d)\n",CBPtab2[code].val);
}
#endif /* TRACE */
 
return CBPtab2[code].val;
}
 
int Get_macroblock_address_increment()
{
int code, val;
 
#ifdef TRACE
if (Trace_Flag)
printf("macroblock_address_increment (");
#endif /* TRACE */
 
val = 0;
 
while ((code = Show_Bits(11))<24)
{
if (code!=15) /* if not macroblock_stuffing */
{
if (code==8) /* if macroblock_escape */
{
#ifdef TRACE
if (Trace_Flag)
printf("00000001000 ");
#endif /* TRACE */
 
val+= 33;
}
else
{
if (!Quiet_Flag)
printf("Invalid macroblock_address_increment code\n");
 
Fault_Flag = 1;
return 1;
}
}
else /* macroblock suffing */
{
#ifdef TRACE
if (Trace_Flag)
printf("00000001111 ");
#endif /* TRACE */
}
 
Flush_Buffer(11);
}
 
/* macroblock_address_increment == 1 */
/* ('1' is in the MSB position of the lookahead) */
if (code>=1024)
{
Flush_Buffer(1);
#ifdef TRACE
if (Trace_Flag)
printf("1): %d\n",val+1);
#endif /* TRACE */
return val + 1;
}
 
/* codes 00010 ... 011xx */
if (code>=128)
{
/* remove leading zeros */
code >>= 6;
Flush_Buffer(MBAtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,5,MBAtab1[code].len);
printf("): %d\n",val+MBAtab1[code].val);
}
#endif /* TRACE */
 
return val + MBAtab1[code].val;
}
/* codes 00000011000 ... 0000111xxxx */
code-= 24; /* remove common base */
Flush_Buffer(MBAtab2[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code+24,11,MBAtab2[code].len);
printf("): %d\n",val+MBAtab2[code].val);
}
#endif /* TRACE */
 
return val + MBAtab2[code].val;
}
 
/* combined MPEG-1 and MPEG-2 stage. parse VLC and
perform dct_diff arithmetic.
 
MPEG-1: ISO/IEC 11172-2 section
MPEG-2: ISO/IEC 13818-2 section 7.2.1
Note: the arithmetic here is presented more elegantly than
the spec, yet the results, dct_diff, are the same.
*/
 
int Get_Luma_DC_dct_diff()
{
int code, size, dct_diff;
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("dct_dc_size_luminance: (");
*/
#endif /* TRACE */
 
/* decode length */
code = Show_Bits(5);
 
if (code<31)
{
size = DClumtab0[code].val;
Flush_Buffer(DClumtab0[code].len);
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code,5,DClumtab0[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
else
{
code = Show_Bits(9) - 0x1f0;
size = DClumtab1[code].val;
Flush_Buffer(DClumtab1[code].len);
 
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code+0x1f0,9,DClumtab1[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf(", dct_dc_differential (");
*/
#endif /* TRACE */
 
if (size==0)
dct_diff = 0;
else
{
dct_diff = Get_Bits(size);
#ifdef TRACE
/*
if (Trace_Flag)
Print_Bits(dct_diff,size,size);
*/
#endif /* TRACE */
if ((dct_diff & (1<<(size-1)))==0)
dct_diff-= (1<<size) - 1;
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("): %d\n",dct_diff);
*/
#endif /* TRACE */
 
return dct_diff;
}
 
 
int Get_Chroma_DC_dct_diff()
{
int code, size, dct_diff;
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("dct_dc_size_chrominance: (");
*/
#endif /* TRACE */
 
/* decode length */
code = Show_Bits(5);
 
if (code<31)
{
size = DCchromtab0[code].val;
Flush_Buffer(DCchromtab0[code].len);
 
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code,5,DCchromtab0[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
else
{
code = Show_Bits(10) - 0x3e0;
size = DCchromtab1[code].val;
Flush_Buffer(DCchromtab1[code].len);
 
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf(", dct_dc_differential (");
*/
#endif /* TRACE */
 
if (size==0)
dct_diff = 0;
else
{
dct_diff = Get_Bits(size);
#ifdef TRACE
/*
if (Trace_Flag)
Print_Bits(dct_diff,size,size);
*/
#endif /* TRACE */
if ((dct_diff & (1<<(size-1)))==0)
dct_diff-= (1<<size) - 1;
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("): %d\n",dct_diff);
*/
#endif /* TRACE */
 
return dct_diff;
}
/advdemos/tags/rel_1_5_beta1/mpeg2/todo
0,0 → 1,73
1. Test bitstream
Small example bitstream (128x128 pixel dimensions) which employs all
picture_structure (top field, bottom field, frame), picture_coding_type
(I, P, and B), macroblock_type (forwards/backwards/interpolated,
intra/non-intra, coded/not-coded, quant/no quant, etc.), and
motion_type (field, frame, 16X8, dual prime) modes.
 
2. add trace printing for mpeg1 getblk routines.
 
3. modify getsys.c to parse program layer bitstreams (Systems)
with variable-length packets.
 
4. 24 bit X11 display
(borrow from Berkeley or find way for our code to use their interface)
 
5. MPEG-2 Transport layer systems streams parsing
 
6. Document IPR issue
 
provide CableLabs URL
how IPR relates to our disclaimer.
 
7. TIFF library support (YCbCr 4:4:4, 4:2:2, and 4:2:0 pictures)
[deferred]
10. IDCT rounding
As per IDCT corridgendum (Savatier, MPEG 95/XXX)
[done, but verified ?]
 
 
12. green dots in can
[ appears to be a display issue, probably related to convmat[]
error ]
 
19. move Dual_Prime calculation into picture_data()
 
20. motion vector calculation to include tappable stages to test
whether elements fall within [low:high] range.
 
21. Integrate verifier routines
 
22. Inter-layer verification routines
- check base and enhancement layers (e.g. SNR)
 
23. Spatial verification
- considering that no base layer is available.
 
24. SNR verification
[ done ]
 
25. DP verification
[ not done. No longer any bitstreams with Data Partitioning distributed
since DP is not part of any official Profile ]
 
26. merge all global bitsteam element variables into
common data structure (similar to layer_data). This is needed
for the verifier (whether or not headers in SNR and DP streams
are identical where needed to that of the base layer).
 
27. investigate why MS-DOS wants an extra % sign for filename patterns
when more than one filename pattern is used in the command line argument
 
28. convert -t (trace) flag into levels, merge with Verbose.
 
29. seek to a specified frame number (support for MCI-like functions)
 
30. document the "flash" VLC table decoding method in detail.
(namely how to map tables in Annex B to those in getvlc.h)
 
31. MPEG-2 program stream compatibility
(a few minor bits of difference in the system header ).
 
--------
/advdemos/tags/rel_1_5_beta1/mpeg2/mpeg2dec.c
0,0 → 1,770
 
/* mpeg2dec.c, main(), initialization, option processing */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
 
#define GLOBAL
#include "config.h"
#include "global.h"
 
/* private prototypes */
static int video_sequence _ANSI_ARGS_((int *framenum));
static int Decode_Bitstream _ANSI_ARGS_((void));
static int Headers _ANSI_ARGS_((void));
static void Initialize_Sequence _ANSI_ARGS_((void));
static void Initialize_Decoder _ANSI_ARGS_((void));
static void Deinitialize_Sequence _ANSI_ARGS_((void));
static void Process_Options _ANSI_ARGS_((int argc, char *argv[]));
 
 
#if OLD
static int Get_Val _ANSI_ARGS_((char *argv[]));
#endif
 
/* #define DEBUG */
 
static void Clear_Options();
#ifdef DEBUG
static void Print_Options();
#endif
 
int main(argc,argv)
int argc;
char *argv[];
{
int ret, code;
 
Clear_Options();
 
/* decode command line arguments */
Process_Options(argc,argv);
 
#ifdef DEBUG
Print_Options();
#endif
 
ld = &base; /* select base layer context */
 
/* open MPEG base layer bitstream file(s) */
/* NOTE: this is either a base layer stream or a spatial enhancement stream */
if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
{
fprintf(stderr,"Base layer input file %s not found\n", Main_Bitstream_Filename);
exit(1);
}
 
 
if(base.Infile != 0)
{
Initialize_Buffer();
if(Show_Bits(8)==0x47)
{
sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
Error(Error_Text);
}
 
next_start_code();
code = Show_Bits(32);
 
switch(code)
{
case SEQUENCE_HEADER_CODE:
break;
case PACK_START_CODE:
System_Stream_Flag = 1;
case VIDEO_ELEMENTARY_STREAM:
System_Stream_Flag = 1;
break;
default:
sprintf(Error_Text,"Unable to recognize stream type\n");
Error(Error_Text);
break;
}
 
lseek(base.Infile, 0l, 0);
Initialize_Buffer();
}
 
if(base.Infile!=0)
{
lseek(base.Infile, 0l, 0);
}
 
Initialize_Buffer();
 
if(Two_Streams)
{
ld = &enhan; /* select enhancement layer context */
 
if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
{
sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
Enhancement_Layer_Bitstream_Filename);
 
Error(Error_Text);
}
 
Initialize_Buffer();
ld = &base;
}
 
Initialize_Decoder();
 
ret = Decode_Bitstream();
 
close(base.Infile);
 
if (Two_Streams)
close(enhan.Infile);
 
return 0;
}
 
/* IMPLEMENTAION specific rouintes */
static void Initialize_Decoder()
{
int i;
 
/* Clip table */
if (!(Clip=(unsigned char *)malloc(1024)))
Error("Clip[] malloc failed\n");
 
Clip += 384;
 
for (i=-384; i<640; i++)
Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
 
/* IDCT */
if (Reference_IDCT_Flag)
Initialize_Reference_IDCT();
else
Initialize_Fast_IDCT();
 
}
 
/* mostly IMPLEMENTAION specific rouintes */
static void Initialize_Sequence()
{
int cc, size;
static int Table_6_20[3] = {6,8,12};
 
/* check scalability mode of enhancement layer */
if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP))
Error("unsupported scalability mode\n");
 
/* force MPEG-1 parameters for proper decoder behavior */
/* see ISO/IEC 13818-2 section D.9.14 */
if (!base.MPEG2_Flag)
{
progressive_sequence = 1;
progressive_frame = 1;
picture_structure = FRAME_PICTURE;
frame_pred_frame_dct = 1;
chroma_format = CHROMA420;
matrix_coefficients = 5;
}
 
/* round to nearest multiple of coded macroblocks */
/* ISO/IEC 13818-2 section 6.3.3 sequence_header() */
mb_width = (horizontal_size+15)/16;
mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32)
: (vertical_size+15)/16;
 
Coded_Picture_Width = 16*mb_width;
Coded_Picture_Height = 16*mb_height;
 
/* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */
Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width
: Coded_Picture_Width>>1;
Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height
: Coded_Picture_Height>>1;
/* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */
block_count = Table_6_20[chroma_format-1];
 
for (cc=0; cc<3; cc++)
{
if (cc==0)
size = Coded_Picture_Width*Coded_Picture_Height;
else
size = Chroma_Width*Chroma_Height;
 
if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size)))
Error("backward_reference_frame[] malloc failed\n");
 
if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size)))
Error("forward_reference_frame[] malloc failed\n");
 
if (!(auxframe[cc] = (unsigned char *)malloc(size)))
Error("auxframe[] malloc failed\n");
 
if(Ersatz_Flag)
if (!(substitute_frame[cc] = (unsigned char *)malloc(size)))
Error("substitute_frame[] malloc failed\n");
 
 
if (base.scalable_mode==SC_SPAT)
{
/* this assumes lower layer is 4:2:0 */
if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
Error("llframe0 malloc failed\n");
if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
Error("llframe1 malloc failed\n");
}
}
 
/* SCALABILITY: Spatial */
if (base.scalable_mode==SC_SPAT)
{
if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short))))
Error("lltmp malloc failed\n");
}
 
// PJ
Initialize_framebuf( Coded_Picture_Width*Coded_Picture_Height*sizeof(WORD) );
gvideo_init();
init_jetcontrol();
#ifdef DISPLAY
if (Output_Type==T_X11)
{
Initialize_Display_Process("");
Initialize_Dither_Matrix();
}
#endif /* DISPLAY */
 
}
 
void Error(text)
char *text;
{
fprintf(stderr,text);
exit(1);
}
 
/* Trace_Flag output */
void Print_Bits(code,bits,len)
int code,bits,len;
{
int i;
for (i=0; i<len; i++)
printf("%d",(code>>(bits-1-i))&1);
}
 
 
 
/* option processing */
static void Process_Options(argc,argv)
int argc; /* argument count */
char *argv[]; /* argument vector */
{
int i, LastArg, NextArg;
 
/* at least one argument should be present */
if (argc<2)
{
printf("\n%s, %s\n",Version,Author);
printf("Usage: mpeg2decode {options}\n\
Options: -b file main bitstream (base or spatial enhancement layer)\n\
-cn file conformance report (n: level)\n\
-e file enhancement layer bitstream (SNR or Data Partitioning)\n\
-f store/display interlaced video in frame format\n\
-g concatenated file format for substitution method (-x)\n\
-in file information & statistics report (n: level)\n\
-l file file name pattern for lower layer sequence\n\
(for spatial scalability)\n\
-on file output format (0:YUV 1:SIF 2:TGA 3:PPM 4:X11 5:X11HiQ)\n\
-q disable warnings to stderr\n\
-r use double precision reference IDCT\n\
-t enable low level tracing to stdout\n\
-u file print user_data to stdio or file\n\
-vn verbose output (n: level)\n\
-x file filename pattern of picture substitution sequence\n\n\
File patterns: for sequential filenames, \"printf\" style, e.g. rec%%d\n\
or rec%%d%%c for fieldwise storage\n\
Levels: 0:none 1:sequence 2:picture 3:slice 4:macroblock 5:block\n\n\
Example: mpeg2decode -b bitstream.mpg -f -r -o0 rec%%d\n\
\n");
exit(0);
}
 
 
Output_Type = -1;
i = 1;
 
/* command-line options are proceeded by '-' */
 
while(i < argc)
{
/* check if this is the last argument */
LastArg = ((argc-i)==1);
 
/* parse ahead to see if another flag immediately follows current
argument (this is used to tell if a filename is missing) */
if(!LastArg)
NextArg = (argv[i+1][0]=='-');
else
NextArg = 0;
 
/* second character, [1], after '-' is the switch */
if(argv[i][0]=='-')
{
switch(toupper(argv[i][1]))
{
/* third character. [2], is the value */
case 'B':
Main_Bitstream_Flag = 1;
 
if(NextArg || LastArg)
{
printf("ERROR: -b must be followed the main bitstream filename\n");
}
else
Main_Bitstream_Filename = argv[++i];
 
break;
 
 
case 'C':
 
#ifdef VERIFY
Verify_Flag = atoi(&argv[i][2]);
 
if((Verify_Flag < NO_LAYER) || (Verify_Flag > ALL_LAYERS))
{
printf("ERROR: -c level (%d) out of range [%d,%d]\n",
Verify_Flag, NO_LAYER, ALL_LAYERS);
exit(ERROR);
}
#else /* VERIFY */
printf("This program not compiled for Verify_Flag option\n");
#endif /* VERIFY */
break;
 
case 'E':
Two_Streams = 1; /* either Data Partitioning (DP) or SNR Scalability enhancment */
if(NextArg || LastArg)
{
printf("ERROR: -e must be followed by filename\n");
exit(ERROR);
}
else
Enhancement_Layer_Bitstream_Filename = argv[++i];
 
break;
 
 
case 'F':
Frame_Store_Flag = 1;
break;
 
case 'G':
Big_Picture_Flag = 1;
break;
 
 
case 'I':
#ifdef VERIFY
Stats_Flag = atoi(&argv[i][2]);
#else /* VERIFY */
printf("WARNING: This program not compiled for -i option\n");
#endif /* VERIFY */
break;
case 'L': /* spatial scalability flag */
Spatial_Flag = 1;
 
if(NextArg || LastArg)
{
printf("ERROR: -l must be followed by filename\n");
exit(ERROR);
}
else
Lower_Layer_Picture_Filename = argv[++i];
 
break;
 
case 'O':
Output_Type = atoi(&argv[i][2]);
if((Output_Type==4) || (Output_Type==5))
Output_Picture_Filename = ""; /* no need of filename */
else if(NextArg || LastArg)
{
printf("ERROR: -o must be followed by filename\n");
exit(ERROR);
}
else
/* filename is separated by space, so it becomes the next argument */
Output_Picture_Filename = argv[++i];
 
#ifdef DISPLAY
if (Output_Type==T_X11HIQ)
{
hiQdither = 1;
Output_Type=T_X11;
}
#endif /* DISPLAY */
break;
 
case 'Q':
Quiet_Flag = 1;
break;
 
case 'R':
Reference_IDCT_Flag = 1;
break;
case 'T':
#ifdef TRACE
Trace_Flag = 1;
#else /* TRACE */
printf("WARNING: This program not compiled for -t option\n");
#endif /* TRACE */
break;
 
case 'U':
User_Data_Flag = 1;
 
case 'V':
#ifdef VERBOSE
Verbose_Flag = atoi(&argv[i][2]);
#else /* VERBOSE */
printf("This program not compiled for -v option\n");
#endif /* VERBOSE */
break;
 
 
case 'X':
Ersatz_Flag = 1;
 
if(NextArg || LastArg)
{
printf("ERROR: -x must be followed by filename\n");
exit(ERROR);
}
else
Substitute_Picture_Filename = argv[++i];
 
break;
 
 
 
default:
fprintf(stderr,"undefined option -%c ignored. Exiting program\n",
argv[i][1]);
 
exit(ERROR);
} /* switch() */
} /* if argv[i][0] == '-' */
i++;
 
/* check for bitstream filename argument (there must always be one, at the very end
of the command line arguments */
 
} /* while() */
 
 
/* options sense checking */
 
if(Main_Bitstream_Flag!=1)
{
printf("There must be a main bitstream specified (-b filename)\n");
}
 
/* force display process to show frame pictures */
if((Output_Type==4 || Output_Type==5) && Frame_Store_Flag)
Display_Progressive_Flag = 1;
else
Display_Progressive_Flag = 0;
 
#ifdef VERIFY
/* parse the bitstream, do not actually decode it completely */
 
#if 0
if(Output_Type==-1)
{
Decode_Layer = Verify_Flag;
printf("FYI: Decoding bitstream elements up to: %s\n",
Layer_Table[Decode_Layer]);
}
else
#endif
Decode_Layer = ALL_LAYERS;
 
#endif /* VERIFY */
 
/* no output type specified */
if(Output_Type==-1)
{
Output_Type = 9;
Output_Picture_Filename = "";
}
 
 
#ifdef DISPLAY
if (Output_Type==T_X11)
{
if(Frame_Store_Flag)
Display_Progressive_Flag = 1;
else
Display_Progressive_Flag = 0;
 
Frame_Store_Flag = 1; /* to avoid calling dither() twice */
}
#endif
 
 
}
 
 
#ifdef OLD
/*
this is an old routine used to convert command line arguments
into integers
*/
static int Get_Val(argv)
char *argv[];
{
int val;
 
if (sscanf(argv[1]+2,"%d",&val)!=1)
return 0;
 
while (isdigit(argv[1][2]))
argv[1]++;
 
return val;
}
#endif
 
 
 
static int Headers()
{
int ret;
 
ld = &base;
 
/* return when end of sequence (0) or picture
header has been parsed (1) */
 
ret = Get_Hdr();
 
 
if (Two_Streams)
{
ld = &enhan;
if (Get_Hdr()!=ret && !Quiet_Flag)
fprintf(stderr,"streams out of sync\n");
ld = &base;
}
 
return ret;
}
 
 
 
static int Decode_Bitstream()
{
int ret;
int Bitstream_Framenum;
 
Bitstream_Framenum = 0;
 
for(;;)
{
 
#ifdef VERIFY
Clear_Verify_Headers();
#endif /* VERIFY */
 
ret = Headers();
if(ret==1)
{
ret = video_sequence(&Bitstream_Framenum);
}
else
return(ret);
}
 
}
 
 
static void Deinitialize_Sequence()
{
int i;
 
/* clear flags */
base.MPEG2_Flag=0;
 
for(i=0;i<3;i++)
{
free(backward_reference_frame[i]);
free(forward_reference_frame[i]);
free(auxframe[i]);
 
if (base.scalable_mode==SC_SPAT)
{
free(llframe0[i]);
free(llframe1[i]);
}
}
 
if (base.scalable_mode==SC_SPAT)
free(lltmp);
 
#ifdef DISPLAY
if (Output_Type==T_X11)
Terminate_Display_Process();
#endif
}
 
 
static int video_sequence(Bitstream_Framenumber)
int *Bitstream_Framenumber;
{
int Bitstream_Framenum;
int Sequence_Framenum;
int Return_Value;
 
Bitstream_Framenum = *Bitstream_Framenumber;
Sequence_Framenum=0;
 
Initialize_Sequence();
 
/* decode picture whose header has already been parsed in
Decode_Bitstream() */
 
 
Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
 
/* update picture numbers */
if (!Second_Field)
{
Bitstream_Framenum++;
Sequence_Framenum++;
}
 
/* loop through the rest of the pictures in the sequence */
while ((Return_Value=Headers()))
{
Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
 
if (!Second_Field)
{
Bitstream_Framenum++;
Sequence_Framenum++;
}
}
 
/* put last frame */
if (Sequence_Framenum!=0)
{
Output_Last_Frame_of_Sequence(Bitstream_Framenum);
}
 
Deinitialize_Sequence();
 
#ifdef VERIFY
Clear_Verify_Headers();
#endif /* VERIFY */
 
*Bitstream_Framenumber = Bitstream_Framenum;
return(Return_Value);
}
 
 
 
static void Clear_Options()
{
Verbose_Flag = 0;
Output_Type = 0;
Output_Picture_Filename = " ";
hiQdither = 0;
Output_Type = 0;
Frame_Store_Flag = 0;
Spatial_Flag = 0;
Lower_Layer_Picture_Filename = " ";
Reference_IDCT_Flag = 0;
Trace_Flag = 0;
Quiet_Flag = 0;
Ersatz_Flag = 0;
Substitute_Picture_Filename = " ";
Two_Streams = 0;
Enhancement_Layer_Bitstream_Filename = " ";
Big_Picture_Flag = 0;
Main_Bitstream_Flag = 0;
Main_Bitstream_Filename = " ";
Verify_Flag = 0;
Stats_Flag = 0;
User_Data_Flag = 0;
}
 
 
#ifdef DEBUG
static void Print_Options()
{
printf("Verbose_Flag = %d\n", Verbose_Flag);
printf("Output_Type = %d\n", Output_Type);
printf("Output_Picture_Filename = %s\n", Output_Picture_Filename);
printf("hiQdither = %d\n", hiQdither);
printf("Output_Type = %d\n", Output_Type);
printf("Frame_Store_Flag = %d\n", Frame_Store_Flag);
printf("Spatial_Flag = %d\n", Spatial_Flag);
printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename);
printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag);
printf("Trace_Flag = %d\n", Trace_Flag);
printf("Quiet_Flag = %d\n", Quiet_Flag);
printf("Ersatz_Flag = %d\n", Ersatz_Flag);
printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename);
printf("Two_Streams = %d\n", Two_Streams);
printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
printf("Big_Picture_Flag = %d\n", Big_Picture_Flag);
printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag);
printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename);
printf("Verify_Flag = %d\n", Verify_Flag);
printf("Stats_Flag = %d\n", Stats_Flag);
printf("User_Data_Flag = %d\n", User_Data_Flag);
 
}
#endif
/advdemos/tags/rel_1_5_beta1/mpeg2/changes
0,0 → 1,95
CHANGES
----------
 
January 9, 1996 to July 17, 1996
- cleaned up some code which gave warnings.
- altered some code to be compatible with Sun CC compiler.
However, support in the makefile for non-ansi C compilers
has been dropped (this is a stupid thing to support).
 
December 20, 1995 to January 9, 1996:
 
verified on HHI #22, TCEH #23 bitstreams.
 
1. new arguments format. Got to be so many argument fields that
a new more consistent format was devised.
 
2. Frame_Store_Flag (-f) option now controls lower layer prediciton
picture format (field or framewise)
 
3. getpic() structural changes
 
 
Since December 18, 1995:
 
1. added special case for current B pictures subsframe.c which
loads entire reference frame for buffer substitution.
 
2. fixed -l omission (-lXext) in Makefile that drives Tristan nuts everytime.
 
 
Since December 14, 1995:
 
1. organized frame buffer substitution routines into subspic.c
2. added "big file" -b mode for Tristan ;-)
 
 
Since July 4, 1994:
 
1. Concatenated elementary sequences within same bitstream
 
Decode can now handle concatenated elementary video sequences of
arbitrary parameters.
2. TRACE and VERBOSE #ifdef flags
 
3. More disciplined naming convention
 
normative variables and bitstream elements defined in 13818 are
verbatim, lower case. Implementation specific routines and variables
are capitolized.
 
4. Spatial scalability corrections
- see Carsten's document (spatscal.doc)
 
5. D-pictures (picture_coding_type==D_TYPE)
 
Only two small changes were necessary to accomodate D-pictures:
 
a. in Decode_MPEG1_Intra_Block() added line which termines
subroutine after DC coefficient has been processed.
 
b. in picture_data(), added line which parses marker bit.
 
 
6. forced decoder to display frame progressively (regardless of whether
the picture is frame structured or field structured) when -f flag
is invoked in the command line arguements.
 
also: progressive_frame now decides whether a frame is to be displayed
as a frame picture to two field pictures, rather than the older convention
of testing progressive_sequence.
 
7. Adapted systems parser from Stefan's mpeg2play to mpeg2decode.
The major changes are:
 
mpeg2dec.c:
- fseek() called twice
 
gethdr.c, getpic.c:
instances of Flush_Bits(par,32) changed to Flush_Bits32(par)
 
gethdr.c
Get_Bits(par,32) changed to Get_32_Bits(par)
 
global.h
added rdmax, sysstream, and bfr[] to parameters struct.
 
8. Restructuring of getpic.c:
 
a. moved picture pointer rotation into Update_Picture_Buffers()
b. moved picture output logic into Output_Current_Frame() to
in anticipation of 3:2 pulldown
 
 
 
/advdemos/tags/rel_1_5_beta1/mpeg2/getvlc.h
0,0 → 1,491
/* getvlc.h, variable length code tables */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case
as per C programming convention. However, the MPEG document
(ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */
 
/* NOTE: the VLC tables are in a flash format---a transformation
of the tables in Annex B to a form more convenient towards
parallel (more than one-bit-at-a-time) decoding */
 
typedef struct {
char val, len;
} VLCtab;
 
typedef struct {
char run, level, len;
} DCTtab;
 
/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
static VLCtab PMBtab0[8] = {
{ERROR,0},
{MACROBLOCK_MOTION_FORWARD,3},
{MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
};
 
/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
static VLCtab PMBtab1[8] = {
{ERROR,0},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
{MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
};
 
/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
static VLCtab BMBtab0[16] = {
{ERROR,0},
{ERROR,0},
{MACROBLOCK_MOTION_FORWARD,4},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
};
 
/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
static VLCtab BMBtab1[8] = {
{ERROR,0},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
{MACROBLOCK_INTRA,5},
{MACROBLOCK_INTRA,5}
};
 
/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */
static VLCtab spIMBtab[16] = {
{ERROR,0},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,4},
{MACROBLOCK_INTRA,4},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}
};
 
/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */
static VLCtab spPMBtab0[16] =
{
{ERROR,0},
{ERROR,0},
{MACROBLOCK_MOTION_FORWARD,4},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}
};
 
/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */
static VLCtab spPMBtab1[16] = {
{ERROR,0},
{ERROR,0},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7},
{MACROBLOCK_PATTERN,7},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,7},
{MACROBLOCK_INTRA,7},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}
};
 
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */
static VLCtab spBMBtab0[14] = {
{MACROBLOCK_MOTION_FORWARD,4},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
};
 
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */
static VLCtab spBMBtab1[12] = {
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
{MACROBLOCK_INTRA,7},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}
};
 
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */
static VLCtab spBMBtab2[8] = {
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9}
};
 
/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */
static VLCtab SNRMBtab[8] = {
{ERROR,0},
{0,3},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{MACROBLOCK_PATTERN,1},
{MACROBLOCK_PATTERN,1},
{MACROBLOCK_PATTERN,1},
{MACROBLOCK_PATTERN,1}
};
 
/* Table B-10, motion_code, codes 0001 ... 01xx */
static VLCtab MVtab0[8] =
{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
};
 
/* Table B-10, motion_code, codes 0000011 ... 000011x */
static VLCtab MVtab1[8] =
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
};
 
/* Table B-10, motion_code, codes 0000001100 ... 000001011x */
static VLCtab MVtab2[12] =
{ {16,9}, {15,9}, {14,9}, {13,9},
{12,9}, {11,9}, {10,8}, {10,8},
{9,8}, {9,8}, {8,8}, {8,8}
};
 
/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
static VLCtab CBPtab0[32] =
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
{ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
{62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5},
{40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
{8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3}
};
 
/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
static VLCtab CBPtab1[64] =
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
{58,8}, {54,8}, {46,8}, {30,8},
{57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
{43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
{41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
{34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7},
{33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7},
{63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6},
{36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
};
 
/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
static VLCtab CBPtab2[8] =
{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
};
 
/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
static VLCtab MBAtab1[16] =
{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4},
{3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
};
 
/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
static VLCtab MBAtab2[104] =
{
{33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
{25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
{19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
{15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8},
{14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8},
{13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8},
{12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8},
{11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8},
{10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8},
{9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
{9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
{8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7},
{8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}
};
 
/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
static VLCtab DClumtab0[32] =
{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
{0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
{4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0}
};
 
/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
static VLCtab DClumtab1[16] =
{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
{8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
};
 
/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
static VLCtab DCchromtab0[32] =
{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
{1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
{3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0}
};
 
/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
static VLCtab DCchromtab1[32] =
{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
{6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
{7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
{8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 0100 ... 1xxx (used for first (DC) coefficient)
*/
DCTtab DCTtabfirst[12] =
{
{0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
{0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
{0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 0100 ... 1xxx (used for all other coefficients)
*/
DCTtab DCTtabnext[12] =
{
{0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
{64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 000001xx ... 00111xxx
*/
DCTtab DCTtab0[60] =
{
{65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
{2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
{0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
{7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
{6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
{1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
{5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
{13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
{3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
{0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
{0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
{4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
{4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
};
 
/* Table B-15, DCT coefficients table one,
* codes 000001xx ... 11111111
*/
DCTtab DCTtab0a[252] =
{
{65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
{7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
{6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
{0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
{0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
{4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
{5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
{1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
{13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
{2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
{2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
{1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
{1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
{0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
{0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
{0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
{9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
{10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
{0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
{2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 0000001000 ... 0000001111
*/
DCTtab DCTtab1[8] =
{
{16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
{1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
};
 
/* Table B-15, DCT coefficients table one,
* codes 000000100x ... 000000111x
*/
DCTtab DCTtab1a[8] =
{
{5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
{2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 000000010000 ... 000000011111
*/
DCTtab DCTtab2[16] =
{
{0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
{2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
{0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
{3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 0000000010000 ... 0000000011111
*/
DCTtab DCTtab3[16] =
{
{10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
{2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
{0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
{25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 00000000010000 ... 00000000011111
*/
DCTtab DCTtab4[16] =
{
{0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
{0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
{0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
{0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 000000000010000 ... 000000000011111
*/
DCTtab DCTtab5[16] =
{
{0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
{0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
{0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
{1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 0000000000010000 ... 0000000000011111
*/
DCTtab DCTtab6[16] =
{
{1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
{6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
{13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
{30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
};
 
/advdemos/tags/rel_1_5_beta1/mpeg2/const.h
0,0 → 1,141
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
 
/**
------------
CVS : $Id: const.h,v 1.1.1.1 2004-05-24 17:54:50 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 17:54:50 $
------------
**/
 
/*
* Copyright (C) 2000 Marco Dallera and Marco Fiocca
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* AUTO
*
* Another Unuseful Track simulatOr
*
* Authors: Marco Dallera
* Marco Fiocca
*
*/
 
/* ------------------ */
/* Useful constants */
/* ------------------ */
 
#ifndef __CONST_H_
 
#define __CONST_H_
 
/* Screen dimensions */
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
#define SCREEN_BIT_COLORS 8
 
/* Visible area */
#define TEL_WIDTH 50
#define TEL_HEIGHT 50
 
/* Car dimensions */
#define CAR_WIDTH 12
#define CAR_HEIGHT 12
#define CAR_W 8
#define CAR_H 10
 
/* Track dimensions */
#define TRACK_WIDTH 500
#define TRACK_HEIGHT 500
 
/* Track position */
#define TRACK_X1 0
#define TRACK_Y1 0
#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
 
/* Max number of car on track */
#define MAX_CAR_NUMBER 10
#define DRIVERS_NUMBER 20
#define MAX_DRIVER_NAME_LENGTH 20
#define MAX_TRACK_NAME_LENGTH 20
#define TRACK_NUMBER 4
 
/* Lap direction */
#define CLOCK 0
#define ANTICLOCK 1
 
/* Information display coords */
#define CMD_WIDTH TRACK_WIDTH
#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
 
/* Car position limits */
#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
 
/* Road constants */
#define LEFT_ONLY 10
#define RIGHT_ONLY 11
#define ROAD_OK 12
#define NO_ROAD 13
 
/* Collision constants */
#define COLLISION_LEFT 20
#define COLLISION_RIGHT 21
#define COLLISION_BACK 22
#define NO_COLL 0
 
/* CAB constants */
#define ROAD_MSG_DIM sizeof(road_info)
#define ROAD_MSG_READER 4
 
#define CAR_MSG_DIM sizeof(car_status)
#define CAR_MSG_READER 5
 
/* Tasks parameters */
#define SENSOR_WCET 3000
#define SENSOR_PERIOD 40000
#define CONTROL_WCET 1000
#define CONTROL_PERIOD 40000
 
#endif
 
/advdemos/tags/rel_1_5_beta1/mpeg2/mpeg2dec.h
0,0 → 1,129
/* mpeg2dec.h, MPEG specific defines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#define ERROR (-1)
 
#define PICTURE_START_CODE 0x100
#define SLICE_START_CODE_MIN 0x101
#define SLICE_START_CODE_MAX 0x1AF
#define USER_DATA_START_CODE 0x1B2
#define SEQUENCE_HEADER_CODE 0x1B3
#define SEQUENCE_ERROR_CODE 0x1B4
#define EXTENSION_START_CODE 0x1B5
#define SEQUENCE_END_CODE 0x1B7
#define GROUP_START_CODE 0x1B8
#define SYSTEM_START_CODE_MIN 0x1B9
#define SYSTEM_START_CODE_MAX 0x1FF
 
#define ISO_END_CODE 0x1B9
#define PACK_START_CODE 0x1BA
#define SYSTEM_START_CODE 0x1BB
 
#define VIDEO_ELEMENTARY_STREAM 0x1e0
 
/* scalable_mode */
#define SC_NONE 0
#define SC_DP 1
#define SC_SPAT 2
#define SC_SNR 3
#define SC_TEMP 4
 
/* picture coding type */
#define I_TYPE 1
#define P_TYPE 2
#define B_TYPE 3
#define D_TYPE 4
 
/* picture structure */
#define TOP_FIELD 1
#define BOTTOM_FIELD 2
#define FRAME_PICTURE 3
 
/* macroblock type */
#define MACROBLOCK_INTRA 1
#define MACROBLOCK_PATTERN 2
#define MACROBLOCK_MOTION_BACKWARD 4
#define MACROBLOCK_MOTION_FORWARD 8
#define MACROBLOCK_QUANT 16
#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32
#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64
 
 
/* motion_type */
#define MC_FIELD 1
#define MC_FRAME 2
#define MC_16X8 2
#define MC_DMV 3
 
/* mv_format */
#define MV_FIELD 0
#define MV_FRAME 1
 
/* chroma_format */
#define CHROMA420 1
#define CHROMA422 2
#define CHROMA444 3
 
/* extension start code IDs */
 
#define SEQUENCE_EXTENSION_ID 1
#define SEQUENCE_DISPLAY_EXTENSION_ID 2
#define QUANT_MATRIX_EXTENSION_ID 3
#define COPYRIGHT_EXTENSION_ID 4
#define SEQUENCE_SCALABLE_EXTENSION_ID 5
#define PICTURE_DISPLAY_EXTENSION_ID 7
#define PICTURE_CODING_EXTENSION_ID 8
#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
 
#define ZIG_ZAG 0
 
#define PROFILE_422 (128+5)
#define MAIN_LEVEL 8
 
/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */
#define NO_LAYER 0
#define SEQUENCE_LAYER 1
#define PICTURE_LAYER 2
#define SLICE_LAYER 3
#define MACROBLOCK_LAYER 4
#define BLOCK_LAYER 5
#define EVENT_LAYER 6
#define ALL_LAYERS 7
 
 
 
#define FILENAME_LENGTH 256
 
 
 
 
#define MB_WEIGHT 32
#define MB_CLASS4 64
 
/advdemos/tags/rel_1_5_beta1/mpeg2/makefile
0,0 → 1,19
#
# The mpeg library
#
 
# (see sources for copyrights)
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= mpeg2dec
 
include $(BASE)/config/example.mk
 
OBJS= "initfile.o jetctrl.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o systems.o subspic.o verify.o gvideo.o"
 
mpeg2dec:
make -f $(SUBMAKE) APP=mpeg2dec INIT= OTHEROBJS=$(OBJS) OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
/advdemos/tags/rel_1_5_beta1/mpeg2/examples
0,0 → 1,49
EXAMPLES:
 
1. to decode a bitstream with double precision IDCT, such as
to create a reference reconstruction set of frames:
 
mpeg2decode -r -f -o0 rec%d -b bitstream.mpg
 
2. to decode a bitstream with fast integer IDCT, such as
to create a test reconstruction set of frames:
 
mpeg2decode -f -o0 rec%d -b bitstream.mpg
 
3. To substitute reference pictures with external reference
pictures (ref%d):
 
mpeg2decode -f -x ref%d -b bitstream.mpg -o0 rec%d
 
 
4. Same as 3. only using a single large concatenated file for the
sequence of reconstruction frames.
 
mpeg2decode -f -g -x ref%d bitstream.mpg -o0 rec%d
 
5. Decode an SNR enhancement bitstream at the same time as base layer
stream:
 
mpeg2decode -o0 rec%d -e snr_bitstream.mpg -b base_bitstream.mpg
 
6. Decode a Spatially scalable bitstream
 
Step 1: create lower layer reconstruction
 
mpeg2decode -f -o0 llrec%d -b base_layer.mpg
 
Step 2: decode enhancement bitstream, combined reconstruction.
 
mpeg2decode -f -l llrec%d -b enhancement_layer.mpg -o0 rec%d
 
------------
where:
-o0 specifies .Y, .U, .V input
-f specifies field interleaved format
-b is the bitstream flag
-g specifies substitute file is a large concatendated one.
-e substitution flag
ref.pic filename of substitution sequence
bitstream.mpg bitstream
test%d output file pattern
 
/advdemos/tags/rel_1_5_beta1/rtw/control.c
0,0 → 1,67
#include "kernel/kern.h"
#include "cabs/cabs/cabs.h"
 
#include "tmwtypes.h"
 
#include "rtw.h"
 
extern CAB input_cid[NINPUTCAB];
 
TASK CONTROL_body(void *arg) {
 
real_T *p;
input_cid[0] = cab_create("INPUT0", sizeof(real_T), 2);
input_cid[1] = cab_create("INPUT1", sizeof(real_T), 2);
while(1) {
/* Reserve a message */
p = (real_T *)cab_reserve(input_cid[0]);
/* Save PAR1 data */
*p = 1000.0;
/* Put CAB message */
cab_putmes(input_cid[0], p);
 
/* Reserve a message */
p = (real_T *)cab_reserve(input_cid[1]);
/* Save PAR2 data */
*p = 1000.0;
/* Put CAB message */
cab_putmes(input_cid[1], p);
task_endcycle();
}
return NULL;
 
}
 
void activate_control() {
 
HARD_TASK_MODEL CONTROL_task;
PID CONTROL_pid;
 
hard_task_default_model(CONTROL_task);
hard_task_def_mit(CONTROL_task,10000);
hard_task_def_wcet(CONTROL_task,500);
hard_task_def_usemath(CONTROL_task);
hard_task_def_ctrl_jet(CONTROL_task);
CONTROL_pid = task_create("CONTROL",CONTROL_body,&CONTROL_task,NULL);
if (CONTROL_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [CONTROL] Task\n");
exit(1);
}
 
task_activate(CONTROL_pid);
 
}
 
 
 
/advdemos/tags/rel_1_5_beta1/rtw/initfile.c
0,0 → 1,120
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.2 2005-02-26 10:57:27 pj Exp $
 
File: $File$
Revision: $Revision: 1.2 $
Last update: $Date: 2005-02-26 10:57:27 $
------------
 
System initialization file
 
This file contains the 2 functions needed to initialize the system.
 
These functions register the following levels:
 
an EDF (Earliest Deadline First) level
a RR (Round Robin) level
a CBS (Costant Bandwidth Server) level
a Dummy level
 
It can accept these task models:
 
HARD_TASK_MODEL (wcet+mit) at level 0
SOFT_TASK_MODEL (met, period) at level 1
NRT_TASK_MODEL at level 2
 
This file is similar to the configuration of kernel/init/hartik3.c
 
TICK is set to 0 (one-shot timer is used)
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "edf/edf/edf.h"
#include "cbs/cbs/cbs.h"
#include "rr/rr/rr.h"
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/advdemos/tags/rel_1_5_beta1/rtw/actuators.c
0,0 → 1,62
#include "kernel/kern.h"
#include "cabs/cabs/cabs.h"
 
#include "tmwtypes.h"
 
#include "rtw.h"
 
extern CAB output_cid[NOUTPUTCAB];
 
TASK ACTUATOR_body(void *output_port) {
 
real_T *p, value;
int out = (int)(output_port);
if (out >= NOUTPUTCAB) return NULL;
while(1) {
/* Get CAB message */
p = (real_T *)cab_getmes(output_cid[out]);
/* Set value */
value = *p;
/* Release CAB message */
cab_unget(output_cid[out], p);
 
cprintf("Value = %lf\n",value);
task_endcycle();
}
return NULL;
 
}
 
void activate_actuators() {
 
HARD_TASK_MODEL ACTUATOR_task;
PID ACTUATOR_pid;
 
hard_task_default_model(ACTUATOR_task);
hard_task_def_mit(ACTUATOR_task,20000);
hard_task_def_wcet(ACTUATOR_task,4000);
/* Set actuator port number */
hard_task_def_arg(ACTUATOR_task,(void *)(0));
hard_task_def_usemath(ACTUATOR_task);
hard_task_def_ctrl_jet(ACTUATOR_task);
ACTUATOR_pid = task_create("ACTUATOR0",ACTUATOR_body,&ACTUATOR_task,NULL);
if (ACTUATOR_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [ACTUATOR0] Task\n");
exit(1);
}
 
task_activate(ACTUATOR_pid);
 
}
 
 
 
/advdemos/tags/rel_1_5_beta1/rtw/rtw.c
0,0 → 1,585
#include "tmwtypes.h"
#include "rtmodel.h"
#include "rt_sim.h"
#include "rt_logging.h"
#include "rt_nonfinite.h"
 
#include "ext_work.h"
#include "rt_nonfinite.h"
 
#include "kernel/kern.h"
#include "cabs/cabs/cabs.h"
#include "percorso.h"
 
#include "rtw.h"
 
/*=========*
* Defines *
*=========*/
 
#ifndef TRUE
#define FALSE (0)
#define TRUE (1)
#endif
 
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#endif
 
#define QUOTE1(name) #name
#define QUOTE(name) QUOTE1(name) /* need to expand name */
 
#define RUN_FOREVER -1.0
 
#define EXPAND_CONCAT(name1,name2) name1 ## name2
#define CONCAT(name1,name2) EXPAND_CONCAT(name1,name2)
#define RT_MODEL CONCAT(MODEL,_rtModel)
 
extern RT_MODEL *MODEL(void);
extern void MdlInitializeSizes(void);
extern void MdlInitializeSampleTimes(void);
extern void MdlStart(void);
extern void MdlOutputs(int_T tid);
extern void MdlUpdate(int_T tid);
extern void MdlTerminate(void);
 
real_T rtInf;
real_T rtMinusInf;
real_T rtNaN;
 
CAB input_cid[NINPUTCAB];
CAB output_cid[NOUTPUTCAB];
 
#ifdef EXT_MODE
# define rtExtModeSingleTaskUpload(S) \
{ \
int stIdx; \
rtExtModeUploadCheckTrigger(); \
for (stIdx=0; stIdx<NUMST; stIdx++) { \
if (rtmIsSampleHit(S, stIdx, 0 /*unused*/)) { \
rtExtModeUpload(stIdx,rtmGetTaskTime(S,stIdx)); \
} \
} \
}
#else
# define rtExtModeSingleTaskUpload(S) /* Do nothing */
#endif
 
#if NCSTATES > 0
extern void rt_ODECreateIntegrationData(RTWSolverInfo *si);
extern void rt_ODEUpdateContinuousStates(RTWSolverInfo *si);
# define rt_CreateIntegrationData(S) \
rt_ODECreateIntegrationData(rtmGetRTWSolverInfo(S));
# define rt_UpdateContinuousStates(S) \
rt_ODEUpdateContinuousStates(rtmGetRTWSolverInfo(S));
# else
# define rt_CreateIntegrationData(S) \
rtsiSetSolverName(rtmGetRTWSolverInfo(S),"FixedStepDiscrete");
# define rt_UpdateContinuousStates(S) \
rtmSetT(S, rtsiGetSolverStopTime(rtmGetRTWSolverInfo(S)));
#endif
 
/*==================================*
* Global data local to this module *
*==================================*/
 
RT_MODEL *S;
const char *status;
real_T finaltime = -2.0;
volatile int simulation_run;
static struct {
int_T stopExecutionFlag;
int_T isrOverrun;
int_T overrunFlags[NUMST];
const char_T *errmsg;
} GBLbuf;
 
/* Function: rt_InitInfAndNaN ==================================================
* Abstract:
* Initialize the rtInf, rtMinusInf, and rtNaN needed by the
* generated code. NaN is initialized as non-signaling. Assumes IEEE.
*/
void rt_InitInfAndNaN(int_T realSize)
{
short one = 1;
enum {
LittleEndian,
BigEndian
} machByteOrder = (*((char *) &one) == 1) ? LittleEndian : BigEndian;
 
switch (realSize) {
case 4:
switch (machByteOrder) {
case LittleEndian: {
typedef struct {
uint32_T fraction : 23;
uint32_T exponent : 8;
uint32_T sign : 1;
} LittleEndianIEEEDouble;
(*(LittleEndianIEEEDouble*)&rtInf).sign = 0;
(*(LittleEndianIEEEDouble*)&rtInf).exponent = 0xFF;
(*(LittleEndianIEEEDouble*)&rtInf).fraction = 0;
rtMinusInf = rtInf;
rtNaN = rtInf;
(*(LittleEndianIEEEDouble*)&rtMinusInf).sign = 1;
(*(LittleEndianIEEEDouble*)&rtNaN).fraction = 0x7FFFFF;
}
break;
case BigEndian: {
typedef struct {
uint32_T sign : 1;
uint32_T exponent : 8;
uint32_T fraction : 23;
} BigEndianIEEEDouble;
(*(BigEndianIEEEDouble*)&rtInf).sign = 0;
(*(BigEndianIEEEDouble*)&rtInf).exponent = 0xFF;
(*(BigEndianIEEEDouble*)&rtInf).fraction = 0;
rtMinusInf = rtInf;
rtNaN = rtInf;
(*(BigEndianIEEEDouble*)&rtMinusInf).sign = 1;
(*(BigEndianIEEEDouble*)&rtNaN).fraction = 0x7FFFFF;
}
break;
}
break;
case 8:
switch (machByteOrder) {
case LittleEndian: {
typedef struct {
struct {
uint32_T fraction2;
} wordH;
struct {
uint32_T fraction1 : 20;
uint32_T exponent : 11;
uint32_T sign : 1;
} wordL;
} LittleEndianIEEEDouble;
(*(LittleEndianIEEEDouble*)&rtInf).wordL.sign = 0;
(*(LittleEndianIEEEDouble*)&rtInf).wordL.exponent = 0x7FF;
(*(LittleEndianIEEEDouble*)&rtInf).wordL.fraction1 = 0;
(*(LittleEndianIEEEDouble*)&rtInf).wordH.fraction2 = 0;
rtMinusInf = rtInf;
(*(LittleEndianIEEEDouble*)&rtMinusInf).wordL.sign = 1;
(*(LittleEndianIEEEDouble*)&rtNaN).wordL.sign = 0;
(*(LittleEndianIEEEDouble*)&rtNaN).wordL.exponent = 0x7FF;
(*(LittleEndianIEEEDouble*)&rtNaN).wordL.fraction1 = 0xFFFFF;
(*(LittleEndianIEEEDouble*)&rtNaN).wordH.fraction2 = 0xFFFFFFFF;
}
break;
case BigEndian: {
typedef struct {
struct {
uint32_T sign : 1;
uint32_T exponent : 11;
uint32_T fraction1 : 20;
} wordL;
struct {
uint32_T fraction2;
} wordH;
} BigEndianIEEEDouble;
(*(BigEndianIEEEDouble*)&rtInf).wordL.sign = 0;
(*(BigEndianIEEEDouble*)&rtInf).wordL.exponent = 0x7FF;
(*(BigEndianIEEEDouble*)&rtInf).wordL.fraction1 = 0;
(*(BigEndianIEEEDouble*)&rtInf).wordH.fraction2 = 0;
rtMinusInf = rtInf;
(*(BigEndianIEEEDouble*)&rtMinusInf).wordL.sign = 1;
(*(BigEndianIEEEDouble*)&rtNaN).wordL.sign = 0;
(*(BigEndianIEEEDouble*)&rtNaN).wordL.exponent = 0x7FF;
(*(BigEndianIEEEDouble*)&rtNaN).wordL.fraction1 = 0xFFFFF;
(*(BigEndianIEEEDouble*)&rtNaN).wordH.fraction2 = 0xFFFFFFFF;
}
break;
}
break;
default:
cprintf("Error: Unable to initialize rtInf, rtMinusInf and rtNaN\n");
exit(1);
break;
}
 
} /* end rt_InitInfAndNaN */
 
/* Function: rtOneStep ========================================================
*
* Abstract:
* Perform one step of the model. This function is modeled such that
* it could be called from an interrupt service routine (ISR) with minor
* modifications.
*/
static void rt_OneStep(RT_MODEL *S)
{
real_T tnext;
/***********************************************
* Check and see if base step time is too fast *
***********************************************/
if (GBLbuf.isrOverrun++) {
GBLbuf.stopExecutionFlag = 1;
return;
}
/***********************************************
* Check and see if error status has been set *
***********************************************/
if (rtmGetErrorStatus(S) != NULL) {
GBLbuf.stopExecutionFlag = 1;
return;
}
/* enable interrupts here */
rtExtModeOneStep(rtmGetRTWExtModeInfo(S),
(boolean_T *)&rtmGetStopRequested(S));
tnext = rt_SimGetNextSampleHit();
rtsiSetSolverStopTime(rtmGetRTWSolverInfo(S),tnext);
MdlOutputs(0);
rtExtModeSingleTaskUpload(S);
if (GBLbuf.errmsg != NULL) {
GBLbuf.stopExecutionFlag = 1;
return;
}
MdlUpdate(0);
rt_SimUpdateDiscreteTaskSampleHits(rtmGetNumSampleTimes(S),
rtmGetTimingData(S),
rtmGetSampleHitPtr(S),
rtmGetTPtr(S));
if (rtmGetSampleTime(S,0) == CONTINUOUS_SAMPLE_TIME) {
rt_UpdateContinuousStates(S);
}
GBLbuf.isrOverrun--;
rtExtModeCheckEndTrigger();
 
} /* end rtOneStep */
 
void Init_RealTime_Workshop() {
 
/****************************
* Initialize global memory *
****************************/
(void)memset(&GBLbuf, 0, sizeof(GBLbuf));
 
/************************
* Initialize the model *
************************/
rt_InitInfAndNaN(sizeof(real_T));
 
S = MODEL();
if (rtmGetErrorStatus(S) != NULL) {
cprintf("Error: Model registration: %s\n",
rtmGetErrorStatus(S));
exit(1);
}
if (finaltime >= 0.0 || finaltime == RUN_FOREVER) rtmSetTFinal(S,finaltime);
 
MdlInitializeSizes();
MdlInitializeSampleTimes();
status = rt_SimInitTimingEngine(rtmGetNumSampleTimes(S),
rtmGetStepSize(S),
rtmGetSampleTimePtr(S),
rtmGetOffsetTimePtr(S),
rtmGetSampleHitPtr(S),
rtmGetSampleTimeTaskIDPtr(S),
rtmGetTStart(S),
&rtmGetSimTimeStep(S),
&rtmGetTimingData(S));
 
if (status != NULL) {
cprintf("Error: Failed to initialize sample time engine: %s\n", status);
exit(1);
}
rt_CreateIntegrationData(S);
 
rtExtModeCheckInit();
rtExtModeWaitForStartMsg(rtmGetRTWExtModeInfo(S),
(boolean_T *)&rtmGetStopRequested(S));
 
cprintf("\n** Starting the model **\n");
 
MdlStart();
if (rtmGetErrorStatus(S) != NULL) {
GBLbuf.stopExecutionFlag = 1;
}
 
/*************************************************************************
* Execute the model. You may attach rtOneStep to an ISR, if so replace *
* the call to rtOneStep (below) with a call to a background task *
* application. *
*************************************************************************/
 
if (rtmGetTFinal(S) == RUN_FOREVER) {
cprintf("\n**May run forever. Model stop time set to infinity.**\n");
}
 
}
 
void Close_RealTime_Workshop() {
 
/********************
* Cleanup and exit *
********************/
 
rtExtModeShutdown();
 
if (GBLbuf.errmsg) {
cprintf("Error: %s\n",GBLbuf.errmsg);
exit(1);
}
 
if (GBLbuf.isrOverrun) {
cprintf("Error: %s: ISR overrun - base sampling rate is too fast\n",QUOTE(MODEL));
exit(1);
}
 
if (rtmGetErrorStatus(S) != NULL) {
cprintf("Error: %s\n", rtmGetErrorStatus(S));
exit(1);
}
 
MdlTerminate();
 
}
 
TASK RTW_body(void *arg) {
real_T *input, *p;
 
input = (real_T *)rtmGetU(S);
simulation_run = 1;
 
while (!GBLbuf.stopExecutionFlag &&
(rtmGetTFinal(S) == RUN_FOREVER ||
rtmGetTFinal(S)-rtmGetT(S) > rtmGetT(S)*DBL_EPSILON)) {
rtExtModePauseIfNeeded(rtmGetRTWExtModeInfo(S),
(boolean_T *)&rtmGetStopRequested(S));
if (rtmGetStopRequested(S)) break;
/* Get PAR0 */
if (input_cid[0] != -1) {
p = (real_T *)cab_getmes(input_cid[0]);
input[0] = *p;
cab_unget(input_cid[0], p);
}
 
/* Get PAR1 */
if (input_cid[1] != -1) {
p = (real_T *)cab_getmes(input_cid[1]);
input[1] = *p;
cab_unget(input_cid[1], p);
}
rt_OneStep(S);
 
task_endcycle();
 
}
 
if (!GBLbuf.stopExecutionFlag && !rtmGetStopRequested(S)) {
/* Execute model last time step */
rt_OneStep(S);
}
 
simulation_run = 0;
 
return NULL;
 
}
 
TASK OUTPUT_body(void *arg) {
 
real_T *output, *p;
real_T th;
 
POINT pos;
PATH_ELEM *e;
real_T distance = 0;
real_T angle = 0;
real_T curve = 0;
 
output_cid[0] = cab_create("DISTANCE", sizeof(real_T), 2);
output_cid[1] = cab_create("ANGLE", sizeof(real_T), 2);
output_cid[2] = cab_create("CURVE", sizeof(real_T), 2);
 
output = (real_T *)rtmGetY(S);
 
while(1) {
 
pos.x = output[0];
pos.y = output[1];
th = output[2];
e = find_closest_elem(&pos, 1.0);
if (e != 0) {
distance = get_distance_from_elem(&pos, e);
angle = th - get_angle_from_elem(&pos,e);
curve = is_curve(e);
}
/* Send Distance */
p = (real_T *)cab_reserve(output_cid[0]);
*p = distance;
cab_putmes(output_cid[0], p);
 
/* Send Angle */
p = (real_T *)cab_reserve(output_cid[1]);
*p = angle;
cab_putmes(output_cid[1], p);
 
/* Send Curve */
p = (real_T *)cab_reserve(output_cid[2]);
*p = curve;
cab_putmes(output_cid[2], p);
 
task_endcycle();
}
return NULL;
}
 
TASK OUTPUT_w_body(void *arg) {
 
real_T *output, *p;
 
real_T wr = 0;
real_T wl = 0;
 
output_cid[0] = cab_create("WR", sizeof(real_T), 2);
output_cid[1] = cab_create("WL", sizeof(real_T), 2);
 
output = (real_T *)rtmGetY(S);
 
while(1) {
 
wr = output[3];
wl = output[4];
/* Send wr */
p = (real_T *)cab_reserve(output_cid[3]);
*p = wr;
cab_putmes(output_cid[3], p);
 
/* Send wl */
p = (real_T *)cab_reserve(output_cid[4]);
*p = wl;
cab_putmes(output_cid[4], p);
 
task_endcycle();
 
}
 
return NULL;
 
}
 
void Init_Rtw() {
 
HARD_TASK_MODEL RTW_task,OUTPUT_task;
PID RTW_pid,OUTPUT_pid,OUTPUT_w_pid;
int i;
int RTW_period;
int RTW_wcet;
int OUTPUT_period;
int OUTPUT_wcet;
 
Init_RealTime_Workshop();
Init_All_Path();
 
for (i=0;i<NINPUTCAB;i++) input_cid[i] = -1;
for (i=0;i<NOUTPUTCAB;i++) output_cid[i] = -1;
RTW_period =(int)(rtmGetStepSize(S) * 1000000.0);
RTW_wcet = (int)(rtmGetStepSize(S) * 1000000.0 * 0.45);
OUTPUT_period = (int)(10000.0);
OUTPUT_wcet = (int)(10000.0 * 0.10);
cprintf("Task Setup\n");
cprintf("RTW (P %8d W %8d)\n",RTW_period,RTW_wcet);
cprintf("OUTPUT (P %8d W %8d)\n",OUTPUT_period,OUTPUT_wcet);
hard_task_default_model(RTW_task);
hard_task_def_mit(RTW_task,RTW_period);
hard_task_def_wcet(RTW_task,RTW_wcet);
hard_task_def_usemath(RTW_task);
hard_task_def_ctrl_jet(RTW_task);
RTW_pid = task_create("RTW",RTW_body,&RTW_task,NULL);
if (RTW_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [RTW] Task\n");
exit(1);
}
 
hard_task_default_model(OUTPUT_task);
hard_task_def_mit(OUTPUT_task,OUTPUT_period);
hard_task_def_wcet(OUTPUT_task,OUTPUT_wcet);
hard_task_def_usemath(OUTPUT_task);
hard_task_def_ctrl_jet(OUTPUT_task);
OUTPUT_pid = task_create("OUTPUT",OUTPUT_body,&OUTPUT_task,NULL);
if (OUTPUT_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [OUTPUT] Task\n");
exit(1);
}
hard_task_def_mit(OUTPUT_task,OUTPUT_period);
hard_task_def_wcet(OUTPUT_task,OUTPUT_wcet);
OUTPUT_w_pid = task_create("OUTPUTW",OUTPUT_w_body,&OUTPUT_task,NULL);
if (OUTPUT_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [OUTPUTW] Task\n");
exit(1);
}
task_activate(RTW_pid);
task_activate(OUTPUT_pid);
task_activate(OUTPUT_w_pid);
 
}
 
int main() {
 
Init_Rtw();
 
activate_sensors();
activate_control();
 
while(simulation_run);
Close_RealTime_Workshop();
 
exit(1);
 
return 0;
 
}
/advdemos/tags/rel_1_5_beta1/rtw/sensors.c
0,0 → 1,93
#include "kernel/kern.h"
#include "cabs/cabs/cabs.h"
 
#include "tmwtypes.h"
 
#include "rtw.h"
 
extern CAB output_cid[NOUTPUTCAB];
 
TASK SENSOR_body(void *output_port) {
 
real_T *p, value;
int out = (int)(output_port);
if (out >= NOUTPUTCAB) return NULL;
while(1) {
/* Get CAB message */
p = (real_T *)cab_getmes(output_cid[out]);
/* Set value */
value = *p;
/* Release CAB message */
cab_unget(output_cid[out], p);
 
cprintf("Value %d = %lf\n",out,value);
task_endcycle();
}
return NULL;
 
}
 
void activate_sensors() {
 
HARD_TASK_MODEL SENSOR_task;
PID DISTANCE_pid,ANGLE_pid,CURVE_pid,WR_pid,WL_pid;
 
hard_task_default_model(SENSOR_task);
hard_task_def_mit(SENSOR_task,60000);
hard_task_def_wcet(SENSOR_task,4000);
hard_task_def_usemath(SENSOR_task);
hard_task_def_ctrl_jet(SENSOR_task);
hard_task_def_arg(SENSOR_task,(void *)(0));
DISTANCE_pid = task_create("DISTANCE",SENSOR_body,&SENSOR_task,NULL);
if (DISTANCE_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [DISTACE] Task\n");
exit(1);
}
 
hard_task_def_arg(SENSOR_task,(void *)(1));
ANGLE_pid = task_create("ANGLE",SENSOR_body,&SENSOR_task,NULL);
if (DISTANCE_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [DISTACE] Task\n");
exit(1);
}
 
hard_task_def_arg(SENSOR_task,(void *)(2));
CURVE_pid = task_create("CURVE",SENSOR_body,&SENSOR_task,NULL);
if (CURVE_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [CURVE] Task\n");
exit(1);
}
 
hard_task_def_arg(SENSOR_task,(void *)(3));
WR_pid = task_create("WR",SENSOR_body,&SENSOR_task,NULL);
if (WR_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [WR] Task\n");
exit(1);
}
 
hard_task_def_arg(SENSOR_task,(void *)(4));
WL_pid = task_create("CURVE",SENSOR_body,&SENSOR_task,NULL);
if (WR_pid == NIL) {
cprintf("Error: Cannot create RealTime Workshop [WL] Task\n");
exit(1);
}
task_activate(DISTANCE_pid);
task_activate(ANGLE_pid);
task_activate(CURVE_pid);
task_activate(WR_pid);
task_activate(WL_pid);
 
}
 
 
 
/advdemos/tags/rel_1_5_beta1/rtw/rtw.h
0,0 → 1,10
#ifndef __RTW_H__
#define __RTW_H__
 
#define NINPUTCAB 10
#define NOUTPUTCAB 10
 
void activate_sensors();
void activate_control();
 
#endif
/advdemos/tags/rel_1_5_beta1/rtw/percorso.h
0,0 → 1,48
#ifndef __PERCORSO_H__
#define __PERCORSO_H__
 
#define PATH_ELEM_ARC 1
#define PATH_ELEM_LINE 2
 
#define CLOCKWISE -1
#define COUNTERCLOCK 1
 
typedef struct point {
double x,y;
} POINT;
 
typedef struct path_elem {
int type;
void *data;
struct path_elem *next;
} PATH_ELEM;
 
typedef struct pd_arc {
POINT c;
double r;
double alpha1;
double alpha2;
int dir;
} PATH_DATA_ARC;
 
typedef struct pd_line {
POINT p1;
POINT p2;
double alpha;
int dir;
} PATH_DATA_LINE;
 
 
PATH_ELEM *find_closest_elem(POINT *p, double radius);
double get_distance_from_elem(POINT *p, PATH_ELEM *e);
double get_angle_from_elem(POINT *p, PATH_ELEM *e);
/* ritorna:
1 : curva a sinistra
-1 : curva a destra
0 : dritto
*/
int is_curve(PATH_ELEM *e);
 
void Init_All_Path();
 
#endif
/advdemos/tags/rel_1_5_beta1/rtw/rt_sim_shark.c
0,0 → 1,385
#include <math.h>
 
#include "tmwtypes.h"
#ifdef USE_RTMODEL
# include "simstruc_types.h"
#else
# include "simstruc.h"
#endif
#include "rt_sim.h"
 
#include "kernel/kern.h"
 
#ifndef RT_MALLOC /* statically declare data */
 
/*==========*
* Struct's *
*==========*/
 
/*
* TimingData
*/
typedef struct TimingData_Tag {
real_T period[NUMST]; /* Task periods in seconds */
real_T offset[NUMST]; /* Task offsets in seconds */
real_T clockTick[NUMST]; /* Flint task time tick counter */
int_T taskTick[NUMST]; /* Counter for determining task hits */
int_T nTaskTicks[NUMST]; /* Number base rate ticks for a task hit */
int_T firstDiscIdx; /* First discrete task index */
} TimingData;
 
/*=========================*
* Data local to this file *
*=========================*/
 
static TimingData td;
 
/*==================*
* Visible routines *
*==================*/
 
/* Function: rt_SimInitTimingEngine ============================================
* Abstract:
* This function is for use with single tasking or multitasking
* real-time systems.
*
* Initializes the timing engine for a fixed-step real-time system.
* It is assumed that start time is 0.0.
*
* Returns:
* NULL - success
* non-NULL - error string
*/
const char *rt_SimInitTimingEngine(int_T rtmNumSampTimes,
real_T rtmStepSize,
real_T *rtmSampleTimePtr,
real_T *rtmOffsetTimePtr,
int_T *rtmSampleHitPtr,
int_T *rtmSampleTimeTaskIDPtr,
real_T rtmTStart,
SimTimeStep *rtmSimTimeStepPtr,
void **rtmTimingDataPtr)
{
int_T i;
int *tsMap = rtmSampleTimeTaskIDPtr;
real_T *period = rtmSampleTimePtr;
real_T *offset = rtmOffsetTimePtr;
int_T *sampleHit = rtmSampleHitPtr;
real_T stepSize = rtmStepSize;
 
if (rtmTStart != 0.0) {
return("Start time must be zero for real-time systems");
}
 
*rtmSimTimeStepPtr = MAJOR_TIME_STEP;
 
*rtmTimingDataPtr = (void*)&td;
 
for (i = 0; i < NUMST; i++) {
tsMap[i] = i;
td.period[i] = period[i];
td.offset[i] = offset[i];
td.nTaskTicks[i] = (int_T)floor(period[i]/stepSize + 0.5);
if (td.period[i] == CONTINUOUS_SAMPLE_TIME ||
td.offset[i] == 0.0) {
td.taskTick[i] = 0;
td.clockTick[i] = 0.0;
sampleHit[i] = 1;
} else {
td.taskTick[i] = (int_T)floor((td.period[i]-td.offset[i]) /
stepSize+0.5);
td.clockTick[i] = -1.0;
sampleHit[i] = 0;
}
}
 
/* Correct first sample time if continuous task */
td.period[0] = stepSize;
td.nTaskTicks[0] = 1;
 
/* Set first discrete task index */
#if NUMST == 1
td.firstDiscIdx = (int_T)(period[0] == CONTINUOUS_SAMPLE_TIME);
#else
td.firstDiscIdx = ((int_T)(period[0] == CONTINUOUS_SAMPLE_TIME) +
(int_T)(period[1] == CONTINUOUS_SAMPLE_TIME));
#endif
 
return(NULL); /* success */
 
} /* end rt_SimInitTimingEngine */
 
 
#if !defined(MULTITASKING)
 
/*###########################################################################*/
/*########################### SINGLE TASKING ################################*/
/*###########################################################################*/
 
/* Function: rt_SimGetNextSampleHit ============================================
* Abstract:
* For a single tasking real-time system, return time of next sample hit.
*/
time_T rt_SimGetNextSampleHit(void)
{
time_T timeOfNextHit;
td.clockTick[0] += 1;
timeOfNextHit = td.clockTick[0] * td.period[0];
 
# if NUMST > 1
{
int i;
for (i = 1; i < NUMST; i++) {
if (++td.taskTick[i] == td.nTaskTicks[i]) {
td.taskTick[i] = 0;
td.clockTick[i]++;
}
}
}
# endif
 
return(timeOfNextHit);
 
} /* end rt_SimGetNextSampleHit */
 
 
 
/* Function: rt_SimUpdateDiscreteTaskSampleHits ================================
* Abstract:
* This function is for use with single tasking real-time systems.
*
* If the number of sample times is greater than one, then we need to
* update the discrete task sample hits for the next time step. Note,
* task 0 always has a hit since it's sample time is the fundamental
* sample time.
*/
void rt_SimUpdateDiscreteTaskSampleHits(int_T rtmNumSampTimes,
void *rtmTimingData,
int_T *rtmSampleHitPtr,
real_T *rtmTPtr)
{
int_T *sampleHit = rtmSampleHitPtr;
int i;
UNUSED_PARAMETER(rtmTimingData);
UNUSED_PARAMETER(rtmNumSampTimes);
for (i = td.firstDiscIdx; i < NUMST; i++) {
int_T hit = (td.taskTick[i] == 0);
if (hit) {
rttiSetTaskTime(rtmTPtr, i,
td.clockTick[i]*td.period[i] + td.offset[i]);
}
sampleHit[i] = hit;
}
} /* rt_SimUpdateDiscreteTaskSampleHits */
 
 
 
#else /* defined(MULTITASKING) */
 
/*###########################################################################*/
/*############################## MULTITASKING ###############################*/
/*###########################################################################*/
 
 
/* Function: rt_SimUpdateDiscreteEvents ========================================
* Abstract:
* This function is for use with multitasking real-time systems.
*
* This function updates the status of the RT_MODEL sampleHits
* flags and the perTaskSampleHits matrix which is used to determine
* when special sample hits occur.
*
* The RT_MODEL contains a matrix, called perTaskSampleHits.
* This matrix is used by the ssIsSpecialSampleHit macro. The row and
* column indices are both task id's (equivalent to the root RT_MODEL
* sample time indices). This is a upper triangle matrix. This routine
* only updates the slower task hits (kept in column j) for row
* i if we have a sample hit in row i.
*
* column j
* tid 0 1 2 3 4 5
* -------------------------
* 0 | | X | X | X | X | X |
* r -------------------------
* o 1 | | | X | X | X | X | This matrix(i,j) answers:
* w ------------------------- If we are in task i, does
* 2 | | | | X | X | X | slower task j have a hit now?
* i -------------------------
* 3 | | | | | X | X |
* -------------------------
* 4 | | | | | | X | X = 0 or 1
* -------------------------
* 5 | | | | | | |
* -------------------------
*
* How macros index this matrix:
*
* ssSetSampleHitInTask(S, j, i, X) => matrix(i,j) = X
*
* ssIsSpecialSampleHit(S, my_sti, promoted_sti, tid) =>
* (tid_for(promoted_sti) == tid && !minor_time_step &&
* matrix(tid,tid_for(my_sti))
* )
*
* my_sti = My (the block's) original sample time index.
* promoted_sti = The block's promoted sample time index resulting
* from a transition via a ZOH from a fast to a
* slow block or a transition via a unit delay from
* a slow to a fast block.
*
* The perTaskSampleHits array, of dimension n*n, is accessed using
* perTaskSampleHits[j + i*n] where n is the total number of sample
* times, 0 <= i < n, and 0 <= j < n. The C language stores arrays in
* row-major order, that is, row 0 followed by row 1, etc.
*
*/
time_T rt_SimUpdateDiscreteEvents(int_T rtmNumSampTimes,
void *rtmTimingData,
int_T *rtmSampleHitPtr,
int_T *rtmPerTaskSampleHits)
{
int i, j;
int_T *sampleHit = rtmSampleHitPtr;
UNUSED_PARAMETER(rtmTimingData);
/*
* Run this loop in reverse so that we do lower priority events first.
*/
i = NUMST;
while (--i >= 0) {
if (td.taskTick[i] == 0) {
/*
* Got a sample hit, reset the counter, and update the clock
* tick counter.
*/
sampleHit[i] = 1;
td.clockTick[i]++;
 
/*
* Record the state of all "slower" events
*/
for (j = i + 1; j < NUMST; j++) {
rttiSetSampleHitInTask(rtmPerTaskSampleHits, rtmNumSampTimes,
j, i, sampleHit[j]);
}
} else {
/*
* no sample hit, increment the counter
*/
sampleHit[i] = 0;
}
 
if (++td.taskTick[i] == td.nTaskTicks[i]) { /* update for next time */
td.taskTick[i] = 0;
}
}
 
return(td.clockTick[0]*td.period[0]);
} /* rt_SimUpdateDiscreteEvents */
 
 
 
/* Function: rt_SimUpdateDiscreteTaskTime ======================================
* Abstract:
* This function is for use with multitasking systems.
*
* After a discrete task output and update has been performed, this
* function must be called to update the discrete task time for next
* time around.
*/
void rt_SimUpdateDiscreteTaskTime(real_T *rtmTPtr,
void *rtmTimingData,
int tid)
{
UNUSED_PARAMETER(rtmTimingData);
rttiSetTaskTime(rtmTPtr, tid,
td.clockTick[tid]*td.period[tid] + td.offset[tid]);
}
 
#endif /* MULTITASKING */
 
#else
 
#include "mrt_sim.c" /* dynamically allocate data */
 
#endif /* RT_MALLOC */
 
/*
*******************************************************************************
* FUNCTIONS MAINTAINED FOR BACKWARDS COMPATIBILITY WITH THE SimStruct
*******************************************************************************
*/
#ifndef USE_RTMODEL
const char *rt_InitTimingEngine(SimStruct *S)
{
const char_T *retVal = rt_SimInitTimingEngine(
ssGetNumSampleTimes(S),
ssGetStepSize(S),
ssGetSampleTimePtr(S),
ssGetOffsetTimePtr(S),
ssGetSampleHitPtr(S),
ssGetSampleTimeTaskIDPtr(S),
ssGetTStart(S),
&ssGetSimTimeStep(S),
&ssGetTimingData(S));
return(retVal);
}
 
# ifdef RT_MALLOC
void rt_DestroyTimingEngine(SimStruct *S)
{
rt_SimDestroyTimingEngine(ssGetTimingData(S));
}
# endif
 
# if !defined(MULTITASKING)
void rt_UpdateDiscreteTaskSampleHits(SimStruct *S)
{
rt_SimUpdateDiscreteTaskSampleHits(
ssGetNumSampleTimes(S),
ssGetTimingData(S),
ssGetSampleHitPtr(S),
ssGetTPtr(S));
}
 
# ifndef RT_MALLOC
 
time_T rt_GetNextSampleHit(void)
{
return(rt_SimGetNextSampleHit());
}
 
# else /* !RT_MALLOC */
 
time_T rt_GetNextSampleHit(SimStruct *S)
{
return(rt_SimGetNextSampleHit(ssGetTimingData(S),
ssGetNumSampleTimes(S)));
}
 
# endif
 
# else /* MULTITASKING */
 
time_T rt_UpdateDiscreteEvents(SimStruct *S)
{
return(rt_SimUpdateDiscreteEvents(
ssGetNumSampleTimes(S),
ssGetTimingData(S),
ssGetSampleHitPtr(S),
ssGetPerTaskSampleHitsPtr(S)));
}
 
void rt_UpdateDiscreteTaskTime(SimStruct *S, int tid)
{
rt_SimUpdateDiscreteTaskTime(ssGetTPtr(S), ssGetTimingData(S), tid);
}
 
#endif
#endif
 
/* EOF: rt_sim.c */
/advdemos/tags/rel_1_5_beta1/rtw/makefile
0,0 → 1,36
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
MATLAB_RTW_DEMO_DIR = ./carrello0_grt_rtw/
 
DEFINE_MODEL = carrello0
DEFINE_NUMST = 2
DEFINE_NCSTATES = 7
DEFINE_TID01EQ = 1
DEFINE_RTWLIB += -lrtw
DEFINE_SOLVER = ode4.o
 
FILE_CODE = $(DEFINE_MODEL).o
FILE_DATA = $(DEFINE_MODEL)_data.o
 
PROGS = rtw
 
RTW_CFG = "-I. -I$(MATLAB_RTW_DEMO_DIR) -DUSE_RTMODEL -DRT -DMODEL=$(DEFINE_MODEL) -DNUMST=$(DEFINE_NUMST) -DNCSTATES=$(DEFINE_NCSTATES) -DTID01EQ=$(DEFINE_TID01EQ)"
 
RTW_OBJS = $(MATLAB_RTW_DEMO_DIR)/$(FILE_CODE) $(DEFINE_SOLVER) $(MODULES_rtwlib)
 
ifeq ($(FILE_DATA),$(DEFINE_MODEL)_data.o)
RTW_OBJS += $(MATLAB_RTW_DEMO_DIR)/$(FILE_DATA)
endif
 
include $(BASE)/config/example.mk
 
rtw:
make -f $(SUBMAKE) OTHERLIBS=$(DEFINE_RTWLIB) OTHERINCL=$(RTW_CFG) APP=rtw INIT= OTHEROBJS="initfile.o control.o sensors.o percorso.o rt_sim_shark.o $(RTW_OBJS)" SHARKOPT="__OLDCHAR__"
 
/advdemos/tags/rel_1_5_beta1/rtw/percorso.c
0,0 → 1,288
#include <stdio.h>
#include <math.h>
#include "percorso.h"
 
int nelem;
PATH_ELEM * head;
 
/* void print_elem(PATH_ELEM *elem) */
/* { */
/* if (elem->type == PATH_ELEM_ARC) { */
/* PATH_DATA_ARC *arc= (PATH_DATA_ARC *) elem->data; */
/* printf("Center: x =%3.3lf y =%3.3lf\n", arc->c.x, arc->c.y); */
/* printf("angles: a1=%3.3lf a2=%3.3lf\n", arc->alpha1, arc->alpha2); */
/* printf("Radius: r =%3.3lf\n", arc->r); */
/* } */
/* else if (elem->type == PATH_ELEM_LINE) { */
/* PATH_DATA_LINE *line = (PATH_DATA_LINE *) elem->data; */
/* printf("x1 = %3.3lf y1 = %3.3lf x2 = %3.3lf y2 = %3.3lf\n", */
/* line->p1.x, line->p1.y, line->p2.x, line->p2.y); */
/* } */
/* } */
 
/* void print_point(POINT *p) */
/* { */
/* printf("p.x = %3.3lf p.y = %3.3lf\n", p->x, p->y); */
/* } */
 
 
/*-----------------------------------------------------------------*/
 
inline double point_dist(POINT *p1, POINT *p2)
{
return sqrt((p1->x - p2->x)*(p1->x - p2->x) +
(p1->y - p2->y)*(p1->y - p2->y));
}
 
double get_angle_from_arc(POINT *p1, PATH_DATA_ARC *arc)
{
return acos((p1->x - arc->c.x) / point_dist(p1, &(arc->c)));
}
 
int inside_arc(PATH_DATA_ARC *arc, POINT *p)
{
double alpha = get_angle_from_arc(p, arc);
if (p->y < arc->c.y) alpha = 2*M_PI - alpha;
 
if (alpha <= arc->alpha2 && alpha >= arc->alpha1) return 1;
else return 0;
}
 
double get_distance_from_arc(POINT *p1, PATH_DATA_ARC *arc)
{
return point_dist (p1,&(arc->c)) - arc->r;
}
 
 
double get_distance_from_line(POINT *p, PATH_DATA_LINE *l)
{
return ((l->p1.y - l->p2.y) * p->x +
(l->p2.x - l->p1.x) * p->y +
(l->p1.x * l->p2.y - l->p2.x * l->p1.y)) /
point_dist(&(l->p1), &(l->p2));
}
 
 
inline double get_t(POINT *p, PATH_DATA_LINE *line)
{
double t = ( (line->p2.x - line->p1.x) * (p->x - line->p1.x) +
(line->p2.y - line->p1.y) * (p->y - line->p1.y)) /
(point_dist(&(line->p1), &(line->p2)) *
point_dist(&(line->p1), &(line->p2)));
return t;
}
 
 
double get_angle_from_line(POINT *p, PATH_DATA_LINE *l)
{
return atan2(l->p1.y - l->p2.y, l->p1.x - l->p2.x);
}
 
int includes_elem(POINT *p, PATH_ELEM *e, double radius)
{
if (e->type == PATH_ELEM_ARC) {
PATH_DATA_ARC *arc = (PATH_DATA_ARC *) e->data;
if (get_distance_from_arc(p, arc) <= radius && inside_arc(arc,p))
return 1;
else return 0;
}
else if (e->type==PATH_ELEM_LINE) {
PATH_DATA_LINE *line = (PATH_DATA_LINE *) e->data;
double t = get_t(p, line);
double d = get_distance_from_line(p, line);
if (t >= 0 && t <= 1 && d < radius) return 1;
else return 0;
}
return 0;
}
 
void init_arc(PATH_DATA_ARC *arc, double cx, double cy, double r,
double a1, double a2, int dir)
{
arc->c.x = cx;
arc->c.y = cy;
arc->r = r;
arc->alpha1 = a1;
arc->alpha2 = a2;
arc->dir = dir;
}
 
void init_line(PATH_DATA_LINE *l, double x1, double y1, double x2,
double y2, int dir)
{
//printf("%3.3lf %3.3lf %3.3lf %3.3lf \n", x1,y1,x2,y2);
l->p1.x = x1;
l->p2.x = x2;
l->p1.y = y1;
l->p2.y = y2;
l->dir = dir;
//printf("%3.3lf %3.3lf %3.3lf %3.3lf \n", l->p1.x,l->p1.y,l->p2.x,l->p2.y);
}
 
/*---------------------------------------------------------------*/
 
PATH_ELEM *find_closest_elem(POINT *p, double radius)
{
PATH_ELEM *cur = head;
int i = 0;
for (i=0; i<nelem; i++) {
//printf("Searching element %d \n", i);
//print_elem(cur);
if (includes_elem(p, cur, radius)) return cur;
else cur = cur->next;
}
return 0;
}
 
double get_distance_from_elem(POINT *p, PATH_ELEM *e)
{
double d = 0;
if (e->type == PATH_ELEM_ARC) {
PATH_DATA_ARC *arc = e->data;
d = get_distance_from_arc(p, arc);
}
else if (e->type == PATH_ELEM_LINE) {
PATH_DATA_LINE *line = e->data;
d = get_distance_from_line(p, line);
}
return d;
}
 
double get_angle_from_elem(POINT *p, PATH_ELEM *e)
{
double alpha = 0;
if (e->type == PATH_ELEM_ARC) {
PATH_DATA_ARC *arc = e->data;
alpha = get_angle_from_arc(p, arc) - M_PI/2;
}
else if (e->type == PATH_ELEM_LINE) {
PATH_DATA_LINE *line = e->data;
alpha = get_angle_from_line(p, line);
}
return alpha;
}
 
 
/* ritorna:
1 : curva a sinistra
-1 : curva a destra
0 : dritto */
int is_curve(PATH_ELEM *e)
{
if (e->type == PATH_ELEM_ARC) {
PATH_DATA_ARC *arc = e->data;
return arc->dir;
}
else return 0;
}
 
/*---------------------------------------------------------------*/
 
PATH_ELEM elems[11];
PATH_DATA_ARC arcs[6];
PATH_DATA_LINE lines[5];
 
void Init_All_Path()
{
init_line(&lines[0], 0,0,3,0, -1);
elems[0].type = PATH_ELEM_LINE;
elems[0].data = &lines[0];
elems[0].next = &elems[1];
 
init_arc(&arcs[0], 3,1, 1, -M_PI/2,0, 1);
elems[1].type = PATH_ELEM_ARC;
elems[1].data = &arcs[0];
elems[1].next = &elems[2];
 
init_line(&lines[1], 4,1,4,7, -1);
elems[2].type = PATH_ELEM_LINE;
elems[2].data = &lines[1];
elems[2].next = &elems[3];
 
init_arc(&arcs[1], 2,7, 2, 0, M_PI/2, 1);
elems[3].type = PATH_ELEM_ARC;
elems[3].data = &arcs[1];
elems[3].next = &elems[4];
 
init_line(&lines[2], 2,9,-1,9, 1);
elems[4].type = PATH_ELEM_LINE;
elems[4].data = &lines[2];
elems[4].next = &elems[5];
 
init_arc(&arcs[2], -2,8, 1, M_PI/2, M_PI, 1);
elems[5].type = PATH_ELEM_ARC;
elems[5].data = &arcs[2];
elems[5].next = &elems[6];
 
init_line(&lines[3], -3,8,-3,5, 1);
elems[6].type = PATH_ELEM_LINE;
elems[6].data = &lines[3];
elems[6].next = &elems[7];
 
init_arc(&arcs[3], -2,5, 1, M_PI, 3*M_PI/2, 1);
elems[7].type = PATH_ELEM_ARC;
elems[7].data = &arcs[3];
elems[7].next = &elems[8];
 
init_arc(&arcs[4], -2,3, 1, 0, M_PI/2, -1);
elems[8].type = PATH_ELEM_ARC;
elems[8].data = &arcs[4];
elems[8].next = &elems[9];
 
init_line(&lines[4], -1,3,-1,1, 1);
elems[9].type = PATH_ELEM_LINE;
elems[9].data = &lines[4];
elems[9].next = &elems[10];
 
init_arc(&arcs[5], 0,1, 1, M_PI, 3*M_PI/2, -1);
elems[10].type = PATH_ELEM_ARC;
elems[10].data = &arcs[5];
elems[10].next = &elems[0];
 
head = &elems[0];
nelem = 11;
}
 
 
/* int main(void) */
/* { */
/* double d; */
/* double alpha; */
/* POINT p; */
 
/* init_all(); */
 
/* p.x = -1.75; */
/* p.y = 4.25; */
 
/* PATH_ELEM *e = find_closest_elem(&p, head, 1); */
 
/* if (e != 0) { */
/* d = get_distance_from_elem(&p, e); */
/* alpha = get_angle_from_elem(&p, e); */
/* print_elem(e); */
/* printf("distance : %3.3lf alpha %3.3lf\n", d, alpha); */
/* printf("direzione %d\n", is_curve(e)); */
/* } */
/* else */
/* printf("Not found!\n"); */
 
 
/* p.x = 4.75; */
/* p.y = 7.1; */
/* e = find_closest_elem(&p, head, 1); */
 
/* if (e != 0) { */
/* d = get_distance_from_elem(&p, e); */
/* alpha = get_angle_from_elem(&p, e); */
/* print_elem(e); */
/* printf("distance : %3.3lf alpha %3.3lf\n", d, alpha); */
/* printf("direzione %d\n", is_curve(e)); */
/* } */
/* else */
/* printf("Not found!\n"); */
 
/* } */
/advdemos/tags/rel_1_5_beta1/makefile
0,0 → 1,28
include ../shark.cfg
 
ifeq ($(findstring NEW,$(TRACER)) , NEW)
TRC = newtrace
endif
 
dirs := $(filter-out CVS cvs makefile readme.txt newtrace README.TXT, $(wildcard *))
dirs += $(TRC)
p_all := $(addprefix prefixall_, $(dirs))
p_install := $(addprefix prefixinstall_, $(dirs))
p_clean := $(addprefix prefixclean_, $(dirs))
pcleanall := $(addprefix prefixcleanall_, $(dirs))
pdepend := $(addprefix prefixdepend_, $(dirs))
 
 
.PHONY: all clean
 
 
 
all: $(p_all)
 
clean: $(p_clean)
 
prefixall_%:
make -C $*
 
prefixclean_%:
make -C $* clean
/advdemos/tags/rel_1_5_beta1/fsf/test1.c
0,0 → 1,352
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2002 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
 
#include "edf/edf/edf.h"
#include "cbs/cbs/cbs.h"
 
#include "pthread.h"
#include "posix/posix/posix.h"
 
#include "fsf_contract.h"
#include "fsf_server.h"
 
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
 
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
 
#include "drivers/keyb.h"
#include <stdlib.h>
 
// --------------------------------------------------
// --------------------------------------------------
// Init Part
// --------------------------------------------------
// --------------------------------------------------
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
int grubstar_level;
 
EDF_register_level(EDF_ENABLE_ALL);
POSIX_register_level(RRTICK, 1, mb, 32);
grubstar_level = GRUBSTAR_register_level(4, 0);
FSF_register_module(grubstar_level, (int)(MAX_BANDWIDTH * 0.9));
dummy_register_level();
 
// for the keyboard...
CBS_register_level(CBS_ENABLE_ALL, 0);
 
PI_register_module();
PC_register_module();
 
SEM_register_module();
 
PTHREAD_register_module(1, 0, 1);
 
return TICK;
}
 
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
HARTPORT_init();
 
KEYB_init(NULL);
__call_main__(mb);
 
return (void *)0;
 
}
 
// --------------------------------------------------
// --------------------------------------------------
// The Test
// --------------------------------------------------
// --------------------------------------------------
 
pthread_t j1 = -1;
pthread_t j2 = -1;
pthread_t j3 = -1;
pthread_t j4 = -1;
fsf_server_id_t server1 = -1;
fsf_server_id_t server2 = -1;
fsf_server_id_t server3 = -1;
fsf_server_id_t server4 = -1;
fsf_contract_parameters_t contract1, contract2;
 
pthread_mutex_t mux;
 
#define TASK_PERIOD 1000000
 
void *periodic_star(void *arg)
{
struct timespec actual,end,next_time;
int actpersecond,act,cycle;
int mean,nmean;
bool was_deadline_missed, was_budget_overran;
 
act = 0;
actpersecond = 0;
mean = 0;
nmean = 0;
cycle = 0;
for (;;) {
kern_gettime(&actual);
cycle++;
 
if (act == 0) {
TIMESPEC_ASSIGN(&end,&actual);
end.tv_sec++;
}
 
if (TIMESPEC_A_LT_B(&actual,&end)) {
act++;
} else {
actpersecond = act;
act = 0;
mean = (mean * nmean + actpersecond) / (nmean+1);
nmean++;
}
 
//pthread_mutex_lock(&mux);
printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d Mean = %8d Cycle = %8d",
exec_shadow,actpersecond,mean,cycle);
//pthread_mutex_unlock(&mux);
 
kern_gettime(&next_time);
ADDUSEC2TIMESPEC(TASK_PERIOD, &next_time);
fsf_schedule_next_timed_job(NULL, NULL, NULL, &was_deadline_missed, &was_budget_overran);
 
}
 
return NULL;
 
}
 
void *star(void *arg)
{
struct timespec actual,end;
int actpersecond,act;
int mean,nmean,cycle;
 
act = 0;
actpersecond = 0;
mean = 0;
nmean = 0;
cycle = 0;
for (;;) {
cycle++;
kern_gettime(&actual);
 
if (act == 0) {
TIMESPEC_ASSIGN(&end,&actual);
end.tv_sec++;
}
 
if (TIMESPEC_A_LT_B(&actual,&end)) {
act++;
} else {
actpersecond = act;
act = 0;
mean = (mean * nmean + actpersecond) / (nmean+1);
nmean++;
}
 
//pthread_mutex_lock(&mux);
printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d Mean = %8d Cycle = %8d",
exec_shadow,actpersecond,mean,cycle);
//pthread_mutex_unlock(&mux);
 
}
 
return NULL;
 
}
 
void *edftask(void *arg)
{
int i,j;
while(1) {
for (i=0;i<5; i++) {
for (j=0; j<10; j++);
//cputc('#');
//cputs((char *)(arg));
}
 
task_endcycle();
}
 
return NULL;
}
 
 
void create()
{
HARD_TASK_MODEL mhard;
 
struct timespec period1 = {0,100000000};
struct timespec period2 = {0,100000000};
struct timespec budget1 = {0,30000000};
struct timespec budget2 = {0,30000000};
PID t1, t2;
 
kern_printf("(Start Create)");
 
hard_task_default_model(mhard);
hard_task_def_ctrl_jet(mhard);
hard_task_def_mit(mhard,32000);
hard_task_def_wcet(mhard,3000);
hard_task_def_arg(mhard,(void *)"X");
hard_task_def_group(mhard,1);
hard_task_def_periodic(mhard);
t1 = task_create("X", edftask, &mhard, NULL);
if (t1 == NIL) {
perror("Could not create task X ...");
exit(1);
}
 
hard_task_def_mit(mhard,32000);
hard_task_def_wcet(mhard,3000);
hard_task_def_arg(mhard,(void *)"Y");
t2 = task_create("Y", edftask, &mhard, NULL);
if (t2 == NIL) {
perror("Could not create task Y ...");
exit(1);
}
 
group_activate(1);
 
fsf_initialize_contract(&contract1);
fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_initialize_contract(&contract2);
fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
 
kern_printf("(End Create)");
 
}
 
int main(int argc, char **argv)
{
NRT_TASK_MODEL nrt;
char ch = 0;
int err;
 
pthread_mutex_init(&mux,NULL);
 
create();
 
nrt_task_default_model(nrt);
nrt_task_def_save_arrivals(nrt);
nrt_task_def_ctrl_jet(nrt);
 
do {
ch = keyb_getch(BLOCK);
 
switch(ch) {
case '1':
err = fsf_create_thread(server1,&j1,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
break;
case '2':
err = fsf_create_thread(server2,&j2,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
break;
case '3':
err = fsf_create_thread(server1,&j3,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
break;
case '4':
err = fsf_create_thread(server2,&j4,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
break;
case 'q':
err = fsf_negotiate_contract(&contract1,&server1);
cprintf("(%d)",err);
break;
case 'w':
err = fsf_negotiate_contract(&contract2,&server2);
kern_printf("(%d)",err);
break;
case 'e':
err = fsf_negotiate_contract(&contract1,&server3);
kern_printf("(%d)",err);
break;
case 'r':
err = fsf_cancel_contract(&server1);
kern_printf("(%d)",err);
break;
case 't':
err = fsf_cancel_contract(&server2);
kern_printf("(%d)",err);
break;
case 'y':
err = fsf_cancel_contract(&server3);
kern_printf("(%d)",err);
break;
 
}
 
} while(ch != ESC);
 
exit(1);
 
return 0;
 
}
 
/advdemos/tags/rel_1_5_beta1/fsf/test2.c
0,0 → 1,302
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
#include "kernel/kern.h"
 
#include "fsf_contract.h"
 
#include "stdlib.h"
#include "unistd.h"
#include "string.h"
 
#include "pthread.h"
 
#include "drivers/keyb.h"
#include "drivers/glib.h"
 
#define TEST_PERIOD 50000
 
mutex_t mux;
 
void program_key_end(KEY_EVT *k)
{
 
exit(1);
 
}
 
void print_timer(int x, int y)
{
 
long nsec,sec,min,hrs,day;
struct timespec actual_timer;
char tmp[100];
 
sys_gettime(&actual_timer);
 
nsec = actual_timer.tv_nsec;
sec = actual_timer.tv_sec;
min = sec / 60;
sec %= 60;
hrs = min / 60;
min %= 60;
day = hrs / 24;
hrs %= 24;
 
sprintf(tmp,"Time: %2ld d %2ld h %2ld m %2ld s %12ld ns",day,hrs,min,sec,(long)nsec);
//mutex_lock(&mux);
grx_text(tmp,x,y,rgb16(255,255,255),0);
//mutex_unlock(&mux);
 
}
 
#define LOAD_VARIATION 10
 
#define MAX_V_QOS 30
#define MIN_V_QOS 2
 
void *test_task_variable(void *arg) {
 
char tmp[100];
long long i;
int task_qos;
int var_load, rd_per;
 
TIME exectime;
 
task_qos = 7;
var_load = 5;
rd_per = 0;
while(1) {
 
print_timer(307,10+30*exec_shadow);
sprintf(tmp,"Test Thread V QOS = %5d PID = %3d VLOAD = %3d",task_qos,exec_shadow,var_load);
//mutex_lock(&mux);
grx_text(tmp,307,20+30*exec_shadow,rgb16(255,255,255),0);
//mutex_unlock(&mux);
 
jet_gettable(exec_shadow, &exectime, 1);
sprintf(tmp,"Thread Exec Timer = %10d us",(int)exectime);
grx_text(tmp,307,30+30*exec_shadow,rgb16(255,255,255),0);
 
if (rd_per > LOAD_VARIATION) {
var_load += rand()%3-1;
if (var_load > 20) var_load = 20;
if (var_load < 0) var_load = 0;
rd_per = 0;
} else {
rd_per++;
}
for(i = 0; i < 10000*(task_qos+var_load); i++);
}
 
return NULL;
 
}
 
#define MAX_C_QOS 30
#define MIN_C_QOS 2
 
void *test_task_constant(void *arg) {
 
char tmp[100];
long long i;
int task_qos;
 
task_qos = 7;
while(1) {
 
print_timer(307,10+20*exec_shadow);
sprintf(tmp,"Test Task C QOS = %5d PID = %3d",task_qos,exec_shadow);
//mutex_lock(&mux);
grx_text(tmp,307,20+20*exec_shadow,rgb16(255,255,255),0);
//mutex_unlock(&mux);
for(i = 0; i < 10000*task_qos; i++);
}
 
return NULL;
 
}
 
void draw_box(int x1, int y1, int x2, int y2)
{
 
grx_rect(x1,y1,x2,y2,rgb16(160,160,160));
grx_rect(x1+2,y1+2,x2-2,y2-2,rgb16(210,210,210));
 
}
 
void layout_screen()
{
 
draw_box(0,0,300,500);
grx_text("Application Task List",5,5,rgb16(255,255,255),0);
draw_box(303,0,799,500);
grx_text("Task Output",305,5,rgb16(255,255,255),0);
draw_box(0,503,799,599);
grx_line(140,505,140,597,rgb16(255,255,255));
grx_line(140,583,797,583,rgb16(255,255,255));
grx_text("Application Statistics",142,507,rgb16(255,255,255),0);
}
 
void program_end()
{
 
grx_close();
}
 
void *mpeg2decoder(void *arg);
 
void add_posixstar_thread(fsf_server_id_t server)
{
NRT_TASK_MODEL nrt;
pthread_t j = -1;
nrt_task_default_model(nrt);
fsf_create_thread(server, &j, NULL, test_task_variable, NULL, &nrt);
 
}
 
void add_edfstar_thread(fsf_server_id_t server)
{
 
pthread_t j = -1;
HARD_TASK_MODEL ht;
 
hard_task_default_model(ht);
hard_task_def_mit(ht,100000);
hard_task_def_wcet(ht,90000);
fsf_create_thread(server, &j, NULL, mpeg2decoder, NULL, &ht);
 
}
 
int main(int argc, char **argv)
{
char ch;
int err;
KEY_EVT k;
PI_mutexattr_t a;
 
struct timespec period1 = {0,10000000};
struct timespec period2 = {0,10000000};
struct timespec budget1 = {0,4000000};
struct timespec budget2 = {0,4000000};
 
fsf_server_id_t server1, server2;
fsf_contract_parameters_t contract1, contract2;
 
sys_atrunlevel(program_end, NULL, RUNLEVEL_BEFORE_EXIT);
k.flag = ALTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,program_key_end);
srand(sys_gettime(NULL));
 
// graphic card Initialization
if (grx_init() < 1) {
exit(1);
}
if (grx_open(800, 600, 16) < 0) {
cprintf("GRX Err\n");
exit(1);
}
 
layout_screen();
PI_mutexattr_default(a);
mutex_init(&mux,&a);
 
fsf_initialize_contract(&contract1);
fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_initialize_contract(&contract2);
fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_set_local_scheduler_parameter(&contract2, FSF_SCHEDULER_EDF);
err = fsf_negotiate_contract(&contract1,&server1);
if (err) cprintf("(FSF ERROR %d)",err);
err = fsf_negotiate_contract(&contract2,&server2);
if (err) cprintf("(FSF ERROR %d)",err);
ch = keyb_getch(BLOCK);
while(ch != ESC) {
 
switch (ch) {
 
case '1':
add_posixstar_thread(server1);
break;
case '2':
add_edfstar_thread(server2);
break;
case '3':
break;
case '4':
break;
case '5':
break;
}
 
ch = keyb_getch(BLOCK);
}
 
exit(1);
return 0;
 
}
/advdemos/tags/rel_1_5_beta1/fsf/test3.c
0,0 → 1,379
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2002 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
 
#include "edf/edf/edf.h"
#include "cbs/cbs/cbs.h"
 
#include "pthread.h"
#include "posix/posix/posix.h"
 
#include "fsf_contract.h"
#include "fsf_server.h"
 
#include "dummy/dummy/dummy.h"
 
#include "sem/sem/sem.h"
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
 
#include "hartport/hartport/hartport.h"
#include "cabs/cabs/cabs.h"
 
#include "drivers/keyb.h"
#include <stdlib.h>
 
// --------------------------------------------------
// --------------------------------------------------
// Init Part
// --------------------------------------------------
// --------------------------------------------------
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
int grubstar_level;
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
POSIX_register_level(RRTICK, 1, mb, 32);
grubstar_level = GRUBSTAR_register_level(5, 0);
FSF_register_module(grubstar_level, (int)(MAX_BANDWIDTH * 0.9));
dummy_register_level();
 
// for the keyboard...
CBS_register_level(CBS_ENABLE_ALL, 0);
 
PI_register_module();
PC_register_module();
 
SEM_register_module();
 
PTHREAD_register_module(1, 0, 1);
 
return TICK;
}
 
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
HARTPORT_init();
 
KEYB_init(NULL);
__call_main__(mb);
 
return (void *)0;
 
}
 
// --------------------------------------------------
// --------------------------------------------------
// The Test
// --------------------------------------------------
// --------------------------------------------------
 
pthread_t jposix = -1;
pthread_t j1 = -1;
pthread_t j2 = -1;
pthread_t j3 = -1;
pthread_t j4 = -1;
fsf_server_id_t server1 = -1;
fsf_server_id_t server2 = -1;
fsf_server_id_t server3 = -1;
fsf_server_id_t server4 = -1;
fsf_contract_parameters_t contract;
 
pthread_mutex_t mux;
 
void *posix(void *arg)
{
struct timespec actual,end;
int actpersecond,act;
int cycle;
 
act = 0;
actpersecond = 0;
cycle = 0;
for (;;) {
cycle++;
kern_gettime(&actual);
 
if (act == 0) {
TIMESPEC_ASSIGN(&end,&actual);
end.tv_sec++;
}
 
if (TIMESPEC_A_LT_B(&actual,&end)) {
act++;
} else {
actpersecond = act;
act = 0;
}
 
pthread_mutex_lock(&mux);
printf_xy(0,exec_shadow,GREEN,"Thread %3d Act_per_Second = %8d cycle = %8d",
exec_shadow,actpersecond,cycle);
pthread_mutex_unlock(&mux);
 
}
 
return NULL;
 
}
 
void *star(void *arg)
{
struct timespec actual,end;
int actpersecond,act;
int cycle,rec;
 
act = 0;
actpersecond = 0;
cycle = 0;
rec = 0;
for (;;) {
cycle++;
kern_gettime(&actual);
rec = SERVER_get_last_reclaiming(grubstar_level,exec_shadow);
 
if (act == 0) {
TIMESPEC_ASSIGN(&end,&actual);
end.tv_sec++;
}
 
if (TIMESPEC_A_LT_B(&actual,&end)) {
act++;
} else {
actpersecond = act;
act = 0;
}
 
pthread_mutex_lock(&mux);
printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d cycle = %8d rec = %8d",
exec_shadow,actpersecond,cycle,rec);
pthread_mutex_unlock(&mux);
 
}
 
return NULL;
 
}
 
void *periodic_star(void *arg)
{
struct timespec actual,end;
int actpersecond,act;
int cycle,rec;
 
act = 0;
actpersecond = 0;
cycle = 0;
rec = 0;
for (;;) {
cycle++;
kern_gettime(&actual);
rec = SERVER_get_last_reclaiming(grubstar_level,exec_shadow);
 
if (act == 0) {
TIMESPEC_ASSIGN(&end,&actual);
end.tv_sec++;
}
 
if (TIMESPEC_A_LT_B(&actual,&end)) {
act++;
} else {
actpersecond = act;
act = 0;
}
 
pthread_mutex_lock(&mux);
printf_xy(0,exec_shadow,RED,"Thread %3d Act_per_Second = %8d cycle = %8d rec = %8d",
exec_shadow,actpersecond,cycle,rec);
pthread_mutex_unlock(&mux);
 
task_endcycle();
 
}
 
return NULL;
 
}
 
int keyinc = 5;
 
void *edftask(void *arg)
{
long long j;
while(1) {
for (j=0; j<10000*keyinc; j++);
task_endcycle();
}
 
return NULL;
}
 
 
void create()
{
HARD_TASK_MODEL mhard;
int err;
 
struct timespec period1 = {0,90000000}; //30%
struct timespec period2 = {0,300000000}; //20%
struct timespec period3 = {0,300000000}; //10%
struct timespec budget1 = {0,30000000};
struct timespec budget2 = {0,60000000};
struct timespec budget3 = {0,30000000};
PID t1, t2;
 
kern_printf("(Start Create)");
 
hard_task_default_model(mhard);
hard_task_def_ctrl_jet(mhard);
hard_task_def_mit(mhard,30000); //5%
hard_task_def_wcet(mhard,1500);
hard_task_def_arg(mhard,(void *)"X");
hard_task_def_group(mhard,1);
hard_task_def_periodic(mhard);
hard_task_def_level(mhard,0);
t1 = task_create("X", edftask, &mhard, NULL);
if (t1 == NIL) {
perror("Could not create task X ...");
exit(1);
}
 
hard_task_def_mit(mhard,30000); //5%
hard_task_def_wcet(mhard,1500);
hard_task_def_arg(mhard,(void *)"Y");
t2 = task_create("Y", edftask, &mhard, NULL);
if (t2 == NIL) {
perror("Could not create task Y ...");
exit(1);
}
 
group_activate(1);
 
fsf_initialize_contract(&contract);
 
fsf_set_contract_basic_parameters(&contract,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_negotiate_contract(&contract,&server1);
 
fsf_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_negotiate_contract(&contract,&server2);
 
fsf_set_contract_basic_parameters(&contract,&budget3,&period3,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_negotiate_contract(&contract,&server3);
fsf_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_set_local_scheduler_parameter(&contract, FSF_SCHEDULER_EDF);
fsf_negotiate_contract(&contract,&server4);
 
err = pthread_create(&jposix, NULL, posix, NULL);
if (err) kern_printf("(Error creating posix task)");
 
kern_printf("(End Create)");
 
}
 
int main(int argc, char **argv)
{
 
int err;
HARD_TASK_MODEL ht;
NRT_TASK_MODEL nrt;
struct timespec endtimer;
 
pthread_mutex_init(&mux,NULL);
 
srand(kern_gettime(NULL));
create();
 
nrt_task_default_model(nrt);
kern_gettime(&endtimer);
endtimer.tv_sec += 20;
kern_event_post(&endtimer, (void (*)(void *))(exit), NULL);
 
err = fsf_create_thread(server1,&j1,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
err = fsf_create_thread(server2,&j2,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
err = fsf_create_thread(server3,&j3,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
hard_task_default_model(ht);
hard_task_def_mit(ht,200000);
hard_task_def_wcet(ht,50000);
err = fsf_create_thread(server4,&j4,NULL,periodic_star,NULL,&ht);
kern_printf("(%d)",err);
 
/* hard_task_default_model(ht);
hard_task_def_mit(ht,159000);
hard_task_def_wcet(ht,50000);
err = fsf_create_thread(server4,&j4,NULL,periodic_star,NULL,&ht);
kern_printf("(%d)",err);
*/
err = fsf_create_thread(server1,&j1,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
err = fsf_create_thread(server2,&j2,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
err = fsf_create_thread(server3,&j3,NULL,star,NULL,&nrt);
kern_printf("(%d)",err);
 
return 0;
 
}
 
/advdemos/tags/rel_1_5_beta1/fsf/initfile.c
0,0 → 1,116
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "edf/edf/edf.h"
#include "cbs/cbs/cbs.h"
#include "posix/posix/posix.h"
#include "pthread.h"
#include "drivers/keyb.h"
#include "sem/sem/sem.h"
#include "dummy/dummy/dummy.h"
#include "hartport/hartport/hartport.h"
 
#include "fsf_contract.h"
#include "fsf_server.h"
 
#include "pi/pi/pi.h"
#include "pc/pc/pc.h"
 
#define TICK 0
 
#define RRTICK 10000
 
void load_file();
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
int grubstar_level;
 
EDF_register_level(EDF_ENABLE_ALL);
POSIX_register_level(RRTICK, 1, mb, 32);
grubstar_level = GRUBSTAR_register_level(FSF_MAX_N_SERVERS, 0);
FSF_register_module(grubstar_level, (int)(MAX_BANDWIDTH * 0.9));
dummy_register_level();
CBS_register_level(CBS_ENABLE_ALL,0);
 
SEM_register_module();
 
PI_register_module();
PC_register_module();
 
PTHREAD_register_module(1, 0, 1);
 
load_file();
 
return TICK;
 
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
 
int dos_video_preload(void *filename, long max_size, void **start, void **end);
 
void *start_file;
void *end_file;
 
void load_file()
{
start_file = NULL;
end_file = NULL;
dos_video_preload("test.m2v",5000000,&start_file,&end_file);
 
cprintf("Start file ptr = %08lx\n",(long)(start_file));
cprintf("End file ptr = %08lx\n",(long)(end_file));
cprintf("Size = %8ld\n",(long)(end_file - start_file));
 
}
 
/advdemos/tags/rel_1_5_beta1/fsf/demos.txt
0,0 → 1,48
FSF demo for S.Ha.R.K
 
test1.c:
 
This demo shows the main feature of service contract implementation.
 
A set of 4 threads is created using the pthread standard functions.
At the beginning, these threads run without temporal restrictions
and they don't respect any deadline.
 
Two service contracts are initialized and set
 
fsf_initialize_contract(&contract1);
fsf_initialize_contract(&contract2);
fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
 
whit the button 'q','w','e' you can respectively
negotiate contract for a server
 
[err = fsf_negotiate_contract(&contractX,&serverY);]
 
'q' -> negotiate contract1 for server1
'w' -> negotiate contract2 for server2
'e' -> negotiate contract1 for server3
 
now with button '1','2','3','4' you can bind the thread to a server
 
[err = fsf_bind_thread_to_server(serverY,jZ);]
 
'1' -> bind thread1 to server1
'2' -> bind thread2 to server2
'3' -> bind thread3 to server3
'4' -> bind thread4 to server2
 
threads will start to respect the assigned budget. It's possible
to bind more threads to one server. The local scheduler specified in the
contract define how the threads will get the server resources.
 
With '5','6','7','8' the thread is unbind from the server
 
[err = fsf_unbind_thread_from_server(jZ);]
 
With 'r','t','y' a server is removed
 
[err = fsf_cancel_contract(&server2);]
 
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/getbits.c
0,0 → 1,217
/* getbits.c, bit level routines */
 
/*
* All modifications (mpeg2decode -> mpeg2play) are
* Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
*/
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdlib.h>
 
#include "drivers/glib.h"
 
#include "config.h"
#include "global.h"
 
/* initialize buffer, call once before first getbits or showbits */
 
void Initialize_Buffer()
{
ld->Incnt = 0;
ld->Rdptr = ld->Rdbfr + 2048;
ld->Rdmax = ld->Rdptr;
 
#ifdef VERIFY
/* only the verifier uses this particular bit counter
* Bitcnt keeps track of the current parser position with respect
* to the video elementary stream being decoded, regardless
* of whether or not it is wrapped within a systems layer stream
*/
ld->Bitcnt = 0;
#endif
 
ld->Bfr = 0;
Flush_Buffer(0); /* fills valid data into bfr */
}
 
int read(int Infile, void *Rdbfr, int rdsize) {
if (ld->actual_file_ptr + 2048 > ld->end_file_ptr)
rdsize = (int)(ld->end_file_ptr - ld->actual_file_ptr);
if (rdsize < 0) return 0;
memcpy(Rdbfr,ld->actual_file_ptr,rdsize);
ld->actual_file_ptr += rdsize;
 
return rdsize;
 
}
void Fill_Buffer()
{
int Buffer_Level;
 
Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
ld->Rdptr = ld->Rdbfr;
 
if (System_Stream_Flag)
ld->Rdmax -= 2048;
 
/* end of the bitstream file */
if (Buffer_Level < 2048)
{
/* just to be safe */
if (Buffer_Level < 0)
Buffer_Level = 0;
 
/* pad until the next to the next 32-bit word boundary */
while (Buffer_Level & 3)
ld->Rdbfr[Buffer_Level++] = 0;
 
/* pad the buffer with sequence end codes */
while (Buffer_Level < 2048)
{
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
}
}
}
 
 
/* MPEG-1 system layer demultiplexer */
 
int Get_Byte()
{
while(ld->Rdptr >= ld->Rdbfr+2048)
{
read(ld->Infile,ld->Rdbfr,2048);
ld->Rdptr -= 2048;
ld->Rdmax -= 2048;
}
return *ld->Rdptr++;
}
 
/* extract a 16-bit word from the bitstream buffer */
int Get_Word()
{
int Val;
 
Val = Get_Byte();
return (Val<<8) | Get_Byte();
}
 
 
/* return next n bits (right adjusted) without advancing */
 
unsigned int Show_Bits(N)
int N;
{
return ld->Bfr >> (32-N);
}
 
 
/* return next bit (could be made faster than Get_Bits(1)) */
 
unsigned int Get_Bits1()
{
return Get_Bits(1);
}
 
 
/* advance by n bits */
 
void Flush_Buffer(N)
int N;
{
int Incnt;
 
ld->Bfr <<= N;
 
Incnt = ld->Incnt -= N;
 
if (Incnt <= 24)
{
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
{
do
{
if (ld->Rdptr >= ld->Rdmax)
Next_Packet();
ld->Bfr |= Get_Byte() << (24 - Incnt);
Incnt += 8;
}
while (Incnt <= 24);
}
else if (ld->Rdptr < ld->Rdbfr+2044)
{
do
{
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
Incnt += 8;
}
while (Incnt <= 24);
}
else
{
do
{
if (ld->Rdptr >= ld->Rdbfr+2048)
Fill_Buffer();
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
Incnt += 8;
}
while (Incnt <= 24);
}
ld->Incnt = Incnt;
}
 
#ifdef VERIFY
ld->Bitcnt += N;
#endif /* VERIFY */
 
}
 
 
/* return next n bits (right adjusted) */
 
unsigned int Get_Bits(N)
int N;
{
unsigned int Val;
 
Val = Show_Bits(N);
Flush_Buffer(N);
 
return Val;
}
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/verify.c
0,0 → 1,300
/* verify.c
*
* Bitstream verification routines
*
*
*/
#ifdef VERIFY
 
#include <stdlib.h>
#include <math.h> /* needed for ceil() */
 
#include "config.h"
#include "global.h"
 
/* #define DEBUG */
#ifdef DEBUG
#define PC
#endif
 
#ifdef PC
#include <conio.h> /* needed for getch() */
#endif /* PC */
 
/*
Check picture headers: due to the VBV definition of picture data,
this routine must be called immediately before any picture data
is parsed. (before the first slice start code, including any slice
start code stuffing).
*/
 
 
static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
 
 
void Check_Headers(Bitstream_Framenum, Sequence_Framenum)
int Bitstream_Framenum;
int Sequence_Framenum;
{
 
 
if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF))
Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum);
 
/* clear out the header tracking variables so we have an accurate
count next time */
Clear_Verify_Headers();
}
 
 
 
/*
* Verify vbv_delay value in picture header
* (low_delay==1 checks not implemented. this does not exhaustively test all
* possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks
* for constant rate streams)
*
* Q:how do we tell a variable rate stream from a constant rate stream anyway?
* it's not as simple as vbv_delay==0xFFFF, since we need meaningful
* vbv_delay values to calculate the piecewise rate in the first place!
*
* Also: no special provisions at the beginning or end of a sequence
*/
 
static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum)
int Bitstream_Framenum;
int Sequence_Framenum;
{
double B; /* buffer size */
double Bn; /* buffer fullness for picture n */
double R; /* bitrate */
double I; /* time interval (t[n+1] - t[n]) */
double T; /* inverse of the frame rate (frame period) */
 
int d;
int internal_vbv_delay;
static int previous_IorP_picture_structure;
static int previous_IorP_repeat_first_field;
static int previous_IorP_top_field_first;
static int previous_vbv_delay;
static int previous_bitstream_position;
 
static double previous_Bn;
static double E; /* maximum quantization error or mismatch */
 
 
if((Sequence_Framenum==0)&&(!Second_Field))
{ /* first coded picture of sequence */
 
R = bit_rate;
 
/* the initial buffer occupancy is taken on faith
that is, we believe what is transmitted in the first coded picture header
to be the true/actual buffer occupancy */
Bn = (R * (double) vbv_delay) / 90000.0;
B = 16 * 1024 * vbv_buffer_size;
 
/* maximum quantization error in bitrate (bit_rate_value is quantized/
rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2
section 6.3.3 */
E = (400.0/frame_rate) + 400;
 
#ifdef DEBUG
cprintf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n",
B, Bn, E, bit_rate, vbv_delay, frame_rate);
#endif
 
}
else /* not the first coded picture of sequence */
{
 
/* derive the interval (I). The interval tells us how many constant rate bits
* will have been downloaded to the buffer during the current picture period
*
* interval assumes that:
* 1. whilst we are decoding the current I or P picture, we are displaying
* the previous I or P picture which was stored in the reorder
* buffer (pointed to by forward_reference_frame in this implementation)
*
* 2. B pictures are output ("displayed") at the time when they are decoded
*
*/
 
if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */
{
 
T = 1/frame_rate; /* inverse of the frame rate (frame period) */
 
if(picture_coding_type==B_TYPE)
{
if(repeat_first_field==1)
{
if(top_field_first==1)
I = T*3; /* three frame periods */
else
I = T*2; /* two frame periods */
}
else
I = T; /* one frame period */
}
else /* P or I frame */
{
if(previous_IorP_repeat_first_field==1)
{
if(previous_IorP_top_field_first==1)
I = 3*T;
else
I = 2*T;
}
else
I = T;
}
}
else /* Annex C.11 (progressive_sequence==0, low_delay==0) */
{
T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */
 
if(picture_coding_type==B_TYPE)
{
if(picture_structure==FRAME_PICTURE)
{
if(repeat_first_field==0)
I = 2*T; /* two field periods */
else
I = 3*T; /* three field periods */
}
else /* B field */
{
I = T; /* one field period */
}
}
else /* I or P picture */
{
if(picture_structure==FRAME_PICTURE)
{
if(previous_IorP_repeat_first_field==0)
I = 2*T;
else
I = 3*T;
}
else
{
if(Second_Field==0) /* first field of current frame */
I = T;
else /* second field of current frame */
{
/* formula: previous I or P display period (2*T or 3*T) minus the
very recent decode period (T) of the first field of the current
frame */
 
if(previous_IorP_picture_structure!=FRAME_PICTURE
|| previous_IorP_repeat_first_field==0)
I = 2*T - T; /* a net of one field period */
else if(previous_IorP_picture_structure==FRAME_PICTURE
&& previous_IorP_repeat_first_field==1)
I = 3*T - T; /* a net of two field periods */
}
}
}
}
 
/* derive coded size of previous picture */
d = ld->Bitcnt - previous_bitstream_position;
 
/* Rate = Distance/Time */
 
/* piecewise constant rate (variable rate stream) calculation
* R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I));
*/
 
R = bit_rate;
 
/* compute buffer fullness just before removing picture n
*
* Bn = previous_Bn + (I*R) - d; (recursive formula)
*
* where:
*
* n is the current picture
*
* Bn is the buffer fullness for the current picture
*
* previous_Bn is the buffer fullness of the previous picture
*
* (I*R ) is the bits accumulated during the current picture
* period
*
* d is the number of bits removed during the decoding of the
* previous picture
*/
 
Bn = previous_Bn + (I*R) - d;
 
/* compute internally derived vbv_delay (rouding up with ceil()) */
internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate));
 
#ifdef DEBUG
cprintf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay);
cprintf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d);
cprintf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum,
picture_structure, picture_coding_type);
 
/* report error */
if(internal_vbv_delay != vbv_delay)
{
cprintf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n",
internal_vbv_delay, vbv_delay);
}
#endif
 
} /* not the first coded picture of sequence */
 
 
#ifdef PC
getch();
#endif /* PC */
/* update generic tracking variables */
previous_bitstream_position = ld->Bitcnt ;
previous_vbv_delay = vbv_delay;
previous_Bn = Bn;
 
/* reference picture: reordered/delayed output picture */
if(picture_coding_type!=B_TYPE)
{
previous_IorP_repeat_first_field = repeat_first_field;
previous_IorP_top_field_first = top_field_first;
previous_IorP_picture_structure = picture_structure;
}
 
}
 
 
 
/* variables to keep track of the occurance of redundant headers between pictures */
void Clear_Verify_Headers()
{
verify_sequence_header = 0;
verify_group_of_pictures_header = 0;
verify_picture_header = 0;
verify_slice_header = 0;
verify_sequence_extension = 0;
verify_sequence_display_extension = 0;
verify_quant_matrix_extension = 0;
verify_sequence_scalable_extension = 0;
verify_picture_display_extension = 0;
verify_picture_coding_extension = 0;
verify_picture_spatial_scalable_extension = 0;
verify_picture_temporal_scalable_extension = 0;
verify_copyright_extension = 0;
}
 
#endif /* VERIFY */
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/global.h
0,0 → 1,497
/* global.h, global variables */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "ll/sys/types.h"
#include "kernel/kern.h"
#include "mpeg2dec.h"
 
/* choose between declaration (GLOBAL undefined)
* and definition (GLOBAL defined)
* GLOBAL is defined in exactly one file mpeg2dec.c)
*/
 
#ifndef GLOBAL
#define EXTERN extern
#else
#define EXTERN
#endif
 
/* prototypes of global functions */
/* readpic.c */
void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum,
int sequence_framenum));
 
/* Get_Bits.c */
void Initialize_Buffer _ANSI_ARGS_((void));
void Fill_Buffer _ANSI_ARGS_((void));
unsigned int Show_Bits _ANSI_ARGS_((int n));
unsigned int Get_Bits1 _ANSI_ARGS_((void));
void Flush_Buffer _ANSI_ARGS_((int n));
unsigned int Get_Bits _ANSI_ARGS_((int n));
int Get_Byte _ANSI_ARGS_((void));
int Get_Word _ANSI_ARGS_((void));
 
/* systems.c */
void Next_Packet _ANSI_ARGS_((void));
int Get_Long _ANSI_ARGS_((void));
void Flush_Buffer32 _ANSI_ARGS_((void));
unsigned int Get_Bits32 _ANSI_ARGS_((void));
 
 
/* getblk.c */
void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
 
/* gethdr.c */
int Get_Hdr _ANSI_ARGS_((void));
void next_start_code _ANSI_ARGS_((void));
int slice_header _ANSI_ARGS_((void));
void marker_bit _ANSI_ARGS_((char *text));
 
/* getpic.c */
void Decode_Picture _ANSI_ARGS_((int bitstream_framenum,
int sequence_framenum));
void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
 
/* getvlc.c */
int Get_macroblock_type _ANSI_ARGS_((void));
int Get_motion_code _ANSI_ARGS_((void));
int Get_dmvector _ANSI_ARGS_((void));
int Get_coded_block_pattern _ANSI_ARGS_((void));
int Get_macroblock_address_increment _ANSI_ARGS_((void));
int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
 
/* idct.c */
void Fast_IDCT _ANSI_ARGS_((short *block));
void Initialize_Fast_IDCT _ANSI_ARGS_((void));
 
/* Reference_IDCT.c */
void Initialize_Reference_IDCT _ANSI_ARGS_((void));
void Reference_IDCT _ANSI_ARGS_((short *block));
 
/* motion.c */
void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
int motion_vertical_field_select[2][2], int s, int motion_vector_count,
int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
 
/* mpeg2dec.c */
void Error _ANSI_ARGS_((char *text));
void Warning _ANSI_ARGS_((char *text));
void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
 
/* recon.c */
void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type,
int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
int dmvector[2], int stwtype));
 
/* spatscal.c */
void Spatial_Prediction _ANSI_ARGS_((void));
 
/* store.c */
void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
 
#ifdef DISPLAY
/* display.c */
void Initialize_Display_Process _ANSI_ARGS_((char *name));
void Terminate_Display_Process _ANSI_ARGS_((void));
void Display_Second_Field _ANSI_ARGS_((void));
void dither _ANSI_ARGS_((unsigned char *src[]));
void Initialize_Dither_Matrix _ANSI_ARGS_((void));
#endif
 
/* global variables */
 
EXTERN char Version[]
#ifdef GLOBAL
="mpeg2decode V1.2a, 96/07/19"
#endif
;
 
EXTERN char Author[]
#ifdef GLOBAL
="(C) 1996, MPEG Software Simulation Group"
#endif
;
 
 
/* zig-zag and alternate scan patterns */
EXTERN unsigned char scan[2][64]
#ifdef GLOBAL
=
{
{ /* Zig-Zag scan pattern */
0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
},
{ /* Alternate scan pattern */
0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
}
}
#endif
;
 
/* default intra quantization matrix */
EXTERN unsigned char default_intra_quantizer_matrix[64]
#ifdef GLOBAL
=
{
8, 16, 19, 22, 26, 27, 29, 34,
16, 16, 22, 24, 27, 29, 34, 37,
19, 22, 26, 27, 29, 34, 34, 38,
22, 22, 26, 27, 29, 34, 37, 40,
22, 26, 27, 29, 32, 35, 40, 48,
26, 27, 29, 32, 35, 40, 48, 58,
26, 27, 29, 34, 38, 46, 56, 69,
27, 29, 35, 38, 46, 56, 69, 83
}
#endif
;
 
/* non-linear quantization coefficient table */
EXTERN unsigned char Non_Linear_quantizer_scale[32]
#ifdef GLOBAL
=
{
0, 1, 2, 3, 4, 5, 6, 7,
8,10,12,14,16,18,20,22,
24,28,32,36,40,44,48,52,
56,64,72,80,88,96,104,112
}
#endif
;
 
/* color space conversion coefficients
* for YCbCr -> RGB mapping
*
* entries are {crv,cbu,cgu,cgv}
*
* crv=(255/224)*65536*(1-cr)/0.5
* cbu=(255/224)*65536*(1-cb)/0.5
* cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
* cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
*
* where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
*/
 
/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
 
EXTERN int Inverse_Table_6_9[8][4]
#ifdef GLOBAL
=
{
{117504, 138453, 13954, 34903}, /* no sequence_display_extension */
{117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
{104597, 132201, 25675, 53279}, /* unspecified */
{104597, 132201, 25675, 53279}, /* reserved */
{104448, 132798, 24759, 53109}, /* FCC */
{104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
{104597, 132201, 25675, 53279}, /* SMPTE 170M */
{117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
}
#endif
;
 
 
 
 
 
/* output types (Output_Type) */
#define T_YUV 0
#define T_SIF 1
#define T_TGA 2
#define T_PPM 3
#define T_X11 4
#define T_X11HIQ 5
 
/* decoder operation control variables */
EXTERN int Output_Type;
EXTERN int hiQdither;
 
/* decoder operation control flags */
EXTERN int Quiet_Flag;
EXTERN int Trace_Flag;
EXTERN int Fault_Flag;
EXTERN int Verbose_Flag;
EXTERN int Two_Streams;
EXTERN int Spatial_Flag;
EXTERN int Reference_IDCT_Flag;
EXTERN int Frame_Store_Flag;
EXTERN int System_Stream_Flag;
EXTERN int Display_Progressive_Flag;
EXTERN int Ersatz_Flag;
EXTERN int Big_Picture_Flag;
EXTERN int Verify_Flag;
EXTERN int Stats_Flag;
EXTERN int User_Data_Flag;
EXTERN int Main_Bitstream_Flag;
 
 
/* filenames */
EXTERN char *Output_Picture_Filename;
EXTERN char *Substitute_Picture_Filename;
EXTERN char *Main_Bitstream_Filename;
EXTERN char *Enhancement_Layer_Bitstream_Filename;
 
 
/* buffers for multiuse purposes */
EXTERN char Error_Text[256];
EXTERN unsigned char *Clip;
 
/* pointers to generic picture buffers */
EXTERN unsigned char *backward_reference_frame[3];
EXTERN unsigned char *forward_reference_frame[3];
 
EXTERN unsigned char *auxframe[3];
EXTERN unsigned char *current_frame[3];
EXTERN unsigned char *substitute_frame[3];
 
 
/* pointers to scalability picture buffers */
EXTERN unsigned char *llframe0[3];
EXTERN unsigned char *llframe1[3];
 
EXTERN short *lltmp;
EXTERN char *Lower_Layer_Picture_Filename;
 
 
 
 
/* non-normative variables derived from normative elements */
EXTERN int Coded_Picture_Width;
EXTERN int Coded_Picture_Height;
EXTERN int Chroma_Width;
EXTERN int Chroma_Height;
EXTERN int block_count;
EXTERN int Second_Field;
EXTERN int profile, level;
 
/* normative derived variables (as per ISO/IEC 13818-2) */
EXTERN int horizontal_size;
EXTERN int vertical_size;
EXTERN int mb_width;
EXTERN int mb_height;
EXTERN double bit_rate;
EXTERN double frame_rate;
 
 
 
/* headers */
 
/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
EXTERN int aspect_ratio_information;
EXTERN int frame_rate_code;
EXTERN int bit_rate_value;
EXTERN int vbv_buffer_size;
EXTERN int constrained_parameters_flag;
 
/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
EXTERN int profile_and_level_indication;
EXTERN int progressive_sequence;
EXTERN int chroma_format;
EXTERN int low_delay;
EXTERN int frame_rate_extension_n;
EXTERN int frame_rate_extension_d;
 
/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
EXTERN int video_format;
EXTERN int color_description;
EXTERN int color_primaries;
EXTERN int transfer_characteristics;
EXTERN int matrix_coefficients;
EXTERN int display_horizontal_size;
EXTERN int display_vertical_size;
 
/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
EXTERN int temporal_reference;
EXTERN int picture_coding_type;
EXTERN int vbv_delay;
EXTERN int full_pel_forward_vector;
EXTERN int forward_f_code;
EXTERN int full_pel_backward_vector;
EXTERN int backward_f_code;
 
 
/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
EXTERN int f_code[2][2];
EXTERN int intra_dc_precision;
EXTERN int picture_structure;
EXTERN int top_field_first;
EXTERN int frame_pred_frame_dct;
EXTERN int concealment_motion_vectors;
 
EXTERN int intra_vlc_format;
 
EXTERN int repeat_first_field;
 
EXTERN int chroma_420_type;
EXTERN int progressive_frame;
EXTERN int composite_display_flag;
EXTERN int v_axis;
EXTERN int field_sequence;
EXTERN int sub_carrier;
EXTERN int burst_amplitude;
EXTERN int sub_carrier_phase;
 
 
 
/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
EXTERN int frame_center_horizontal_offset[3];
EXTERN int frame_center_vertical_offset[3];
 
 
 
/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
EXTERN int layer_id;
EXTERN int lower_layer_prediction_horizontal_size;
EXTERN int lower_layer_prediction_vertical_size;
EXTERN int horizontal_subsampling_factor_m;
EXTERN int horizontal_subsampling_factor_n;
EXTERN int vertical_subsampling_factor_m;
EXTERN int vertical_subsampling_factor_n;
 
 
/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
EXTERN int lower_layer_temporal_reference;
EXTERN int lower_layer_horizontal_offset;
EXTERN int lower_layer_vertical_offset;
EXTERN int spatial_temporal_weight_code_table_index;
EXTERN int lower_layer_progressive_frame;
EXTERN int lower_layer_deinterlaced_field_select;
 
 
 
 
 
 
/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
EXTERN int copyright_flag;
EXTERN int copyright_identifier;
EXTERN int original_or_copy;
EXTERN int copyright_number_1;
EXTERN int copyright_number_2;
EXTERN int copyright_number_3;
 
/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
EXTERN int drop_flag;
EXTERN int hour;
EXTERN int minute;
EXTERN int sec;
EXTERN int frame;
EXTERN int closed_gop;
EXTERN int broken_link;
 
 
 
/* layer specific variables (needed for SNR and DP scalability) */
EXTERN struct layer_data {
/* bit input */
int Infile;
 
void *start_file_ptr;
void *actual_file_ptr;
void *end_file_ptr;
int px;
int py;
unsigned char Rdbfr[2048];
unsigned char *Rdptr;
unsigned char Inbfr[16];
/* from mpeg2play */
unsigned int Bfr;
unsigned char *Rdmax;
int Incnt;
int Bitcnt;
/* sequence header and quant_matrix_extension() */
int intra_quantizer_matrix[64];
int non_intra_quantizer_matrix[64];
int chroma_intra_quantizer_matrix[64];
int chroma_non_intra_quantizer_matrix[64];
int load_intra_quantizer_matrix;
int load_non_intra_quantizer_matrix;
int load_chroma_intra_quantizer_matrix;
int load_chroma_non_intra_quantizer_matrix;
 
int MPEG2_Flag;
/* sequence scalable extension */
int scalable_mode;
/* picture coding extension */
int q_scale_type;
int alternate_scan;
/* picture spatial scalable extension */
int pict_scal;
/* slice/macroblock */
int priority_breakpoint;
int quantizer_scale;
int intra_slice;
short block[12][64];
} base, enhan, *ld;
 
#ifdef VERIFY
EXTERN int verify_sequence_header;
EXTERN int verify_group_of_pictures_header;
EXTERN int verify_picture_header;
EXTERN int verify_slice_header;
EXTERN int verify_sequence_extension;
EXTERN int verify_sequence_display_extension;
EXTERN int verify_quant_matrix_extension;
EXTERN int verify_sequence_scalable_extension;
EXTERN int verify_picture_display_extension;
EXTERN int verify_picture_coding_extension;
EXTERN int verify_picture_spatial_scalable_extension;
EXTERN int verify_picture_temporal_scalable_extension;
EXTERN int verify_copyright_extension;
#endif /* VERIFY */
 
 
EXTERN int Decode_Layer;
 
/* verify.c */
#ifdef VERIFY
void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
void Clear_Verify_Headers _ANSI_ARGS_((void));
#endif /* VERIFY */
 
 
EXTERN int global_MBA;
EXTERN int global_pic;
EXTERN int True_Framenum;
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/motion.c
0,0 → 1,234
/* motion.c, motion vector decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code,
int motion_residualesidual, int full_pel_vector));
 
/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
void motion_vectors(PMV,dmvector,
motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale)
int PMV[2][2][2];
int dmvector[2];
int motion_vertical_field_select[2][2];
int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale;
{
if (motion_vector_count==1)
{
if (mv_format==MV_FIELD && !dmv)
{
motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1);
#ifdef TRACE
if (Trace_Flag)
{
cprintf("motion_vertical_field_select[][%d] (%d): %d\n",s,
motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
}
#endif /* TRACE */
}
 
motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
 
/* update other motion vector predictors */
PMV[1][s][0] = PMV[0][s][0];
PMV[1][s][1] = PMV[0][s][1];
}
else
{
motion_vertical_field_select[0][s] = Get_Bits(1);
#ifdef TRACE
if (Trace_Flag)
{
cprintf("motion_vertical_field_select[0][%d] (%d): %d\n",s,
motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
}
#endif /* TRACE */
motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
 
motion_vertical_field_select[1][s] = Get_Bits(1);
#ifdef TRACE
if (Trace_Flag)
{
cprintf("motion_vertical_field_select[1][%d] (%d): %d\n",s,
motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]);
}
#endif /* TRACE */
motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
}
}
 
/* get and decode motion vector and differential motion vector
for one prediction */
void motion_vector(PMV,dmvector,
h_r_size,v_r_size,dmv,mvscale,full_pel_vector)
int *PMV;
int *dmvector;
int h_r_size;
int v_r_size;
int dmv; /* MPEG-2 only: get differential motion vectors */
int mvscale; /* MPEG-2 only: field vector in frame pic */
int full_pel_vector; /* MPEG-1 only */
{
int motion_code, motion_residual;
 
/* horizontal component */
/* ISO/IEC 13818-2 Table B-10 */
motion_code = Get_motion_code();
 
motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
 
#ifdef TRACE
if (Trace_Flag)
{
if (h_r_size!=0 && motion_code!=0)
{
cprintf("motion_residual (");
Print_Bits(motion_residual,h_r_size,h_r_size);
cprintf("): %d\n",motion_residual);
}
}
#endif /* TRACE */
 
 
decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
 
if (dmv)
dmvector[0] = Get_dmvector();
 
 
/* vertical component */
motion_code = Get_motion_code();
motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
 
#ifdef TRACE
if (Trace_Flag)
{
if (v_r_size!=0 && motion_code!=0)
{
cprintf("motion_residual (");
Print_Bits(motion_residual,v_r_size,v_r_size);
cprintf("): %d\n",motion_residual);
}
}
#endif /* TRACE */
 
if (mvscale)
PMV[1] >>= 1; /* DIV 2 */
 
decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
 
if (mvscale)
PMV[1] <<= 1;
 
if (dmv)
dmvector[1] = Get_dmvector();
 
#ifdef TRACE
if (Trace_Flag)
cprintf("PMV = %d,%d\n",PMV[0],PMV[1]);
#endif /* TRACE */
}
 
/* calculate motion vector component */
/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
/* Note: the arithmetic here is more elegant than that which is shown
in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */
 
static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector)
int *pred;
int r_size, motion_code, motion_residual;
int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */
{
int lim, vec;
 
lim = 16<<r_size;
vec = full_pel_vector ? (*pred >> 1) : (*pred);
 
if (motion_code>0)
{
vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
if (vec>=lim)
vec-= lim + lim;
}
else if (motion_code<0)
{
vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
if (vec<-lim)
vec+= lim + lim;
}
*pred = full_pel_vector ? (vec<<1) : vec;
}
 
 
/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy)
int DMV[][2];
int *dmvector; /* differential motion vector */
int mvx, mvy; /* decoded mv components (always in field format) */
{
if (picture_structure==FRAME_PICTURE)
{
if (top_field_first)
{
/* vector for prediction of top field from bottom field */
DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1;
 
/* vector for prediction of bottom field from top field */
DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
}
else
{
/* vector for prediction of top field from bottom field */
DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
 
/* vector for prediction of bottom field from top field */
DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1;
}
}
else
{
/* vector for prediction from field of opposite 'parity' */
DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
 
/* correct for vertical field shift */
if (picture_structure==TOP_FIELD)
DMV[0][1]--;
else
DMV[0][1]++;
}
}
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/recon.c
0,0 → 1,465
/* Predict.c, motion compensation routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
unsigned char *dst[], int dfield,
int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
int average_flag));
 
static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
 
void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
int bx, by;
int macroblock_type;
int motion_type;
int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
int stwtype;
{
int currentfield;
unsigned char **predframe;
int DMV[2][2];
int stwtop, stwbot;
 
stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
stwbot = stwtype/3;
 
if ((macroblock_type & MACROBLOCK_MOTION_FORWARD)
|| (picture_coding_type==P_TYPE))
{
if (picture_structure==FRAME_PICTURE)
{
if ((motion_type==MC_FRAME)
|| !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
{
/* frame-based prediction (broken into top and bottom halves
for spatial scalability prediction purposes) */
if (stwtop<2)
form_prediction(forward_reference_frame,0,current_frame,0,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][0][0],PMV[0][0][1],stwtop);
 
if (stwbot<2)
form_prediction(forward_reference_frame,1,current_frame,1,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][0][0],PMV[0][0][1],stwbot);
}
else if (motion_type==MC_FIELD) /* field-based prediction */
{
/* top field prediction */
if (stwtop<2)
form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
 
/* bottom field prediction */
if (stwbot<2)
form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
}
else if (motion_type==MC_DMV) /* dual prime prediction */
{
/* calculate derived motion vectors */
Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
 
if (stwtop<2)
{
/* predict top field from top field */
form_prediction(forward_reference_frame,0,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
PMV[0][0][0],PMV[0][0][1]>>1,0);
 
/* predict and add to top field from bottom field */
form_prediction(forward_reference_frame,1,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
DMV[0][0],DMV[0][1],1);
}
 
if (stwbot<2)
{
/* predict bottom field from bottom field */
form_prediction(forward_reference_frame,1,current_frame,1,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
PMV[0][0][0],PMV[0][0][1]>>1,0);
 
/* predict and add to bottom field from top field */
form_prediction(forward_reference_frame,0,current_frame,1,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
DMV[1][0],DMV[1][1],1);
}
}
else
/* invalid motion_type */
cprintf("invalid motion_type\n");
}
else /* TOP_FIELD or BOTTOM_FIELD */
{
/* field picture */
currentfield = (picture_structure==BOTTOM_FIELD);
 
/* determine which frame to use for prediction */
if ((picture_coding_type==P_TYPE) && Second_Field
&& (currentfield!=motion_vertical_field_select[0][0]))
predframe = backward_reference_frame; /* same frame */
else
predframe = forward_reference_frame; /* previous frame */
 
if ((motion_type==MC_FIELD)
|| !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
{
/* field-based prediction */
if (stwtop<2)
form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
PMV[0][0][0],PMV[0][0][1],stwtop);
}
else if (motion_type==MC_16X8)
{
if (stwtop<2)
{
form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][0][0],PMV[0][0][1],stwtop);
 
/* determine which frame to use for lower half prediction */
if ((picture_coding_type==P_TYPE) && Second_Field
&& (currentfield!=motion_vertical_field_select[1][0]))
predframe = backward_reference_frame; /* same frame */
else
predframe = forward_reference_frame; /* previous frame */
 
form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
PMV[1][0][0],PMV[1][0][1],stwtop);
}
}
else if (motion_type==MC_DMV) /* dual prime prediction */
{
if (Second_Field)
predframe = backward_reference_frame; /* same frame */
else
predframe = forward_reference_frame; /* previous frame */
 
/* calculate derived motion vectors */
Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
 
/* predict from field of same parity */
form_prediction(forward_reference_frame,currentfield,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
PMV[0][0][0],PMV[0][0][1],0);
 
/* predict from field of opposite parity */
form_prediction(predframe,!currentfield,current_frame,0,
Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
DMV[0][0],DMV[0][1],1);
}
else
/* invalid motion_type */
cprintf("invalid motion_type\n");
}
stwtop = stwbot = 1;
}
 
if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
{
if (picture_structure==FRAME_PICTURE)
{
if (motion_type==MC_FRAME)
{
/* frame-based prediction */
if (stwtop<2)
form_prediction(backward_reference_frame,0,current_frame,0,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][1][0],PMV[0][1][1],stwtop);
 
if (stwbot<2)
form_prediction(backward_reference_frame,1,current_frame,1,
Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
PMV[0][1][0],PMV[0][1][1],stwbot);
}
else /* field-based prediction */
{
/* top field prediction */
if (stwtop<2)
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
 
/* bottom field prediction */
if (stwbot<2)
form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
}
}
else /* TOP_FIELD or BOTTOM_FIELD */
{
/* field picture */
if (motion_type==MC_FIELD)
{
/* field-based prediction */
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
}
else if (motion_type==MC_16X8)
{
form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
 
form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
}
else
/* invalid motion_type */
cprintf("invalid motion_type\n");
}
}
}
 
static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
unsigned char *src[]; /* prediction source buffer */
int sfield; /* prediction source field number (0 or 1) */
unsigned char *dst[]; /* prediction destination buffer */
int dfield; /* prediction destination field number (0 or 1)*/
int lx,lx2; /* line strides */
int w,h; /* prediction block/sub-block width, height */
int x,y; /* pixel co-ordinates of top-left sample in current MB */
int dx,dy; /* horizontal, vertical prediction address */
int average_flag; /* add prediction error to prediction ? */
{
/* Y */
form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
lx,lx2,w,h,x,y,dx,dy,average_flag);
 
if (chroma_format!=CHROMA444)
{
lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
}
 
if (chroma_format==CHROMA420)
{
h>>=1; y>>=1; dy/=2;
}
 
/* Cb */
form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
lx,lx2,w,h,x,y,dx,dy,average_flag);
 
/* Cr */
form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
lx,lx2,w,h,x,y,dx,dy,average_flag);
}
 
/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
/* NOTE: the arithmetic below produces numerically equivalent results
* to 7.6.4, yet is more elegant. It differs in the following ways:
*
* 1. the vectors (dx, dy) are based on cartesian frame
* coordiantes along a half-pel grid (always positive numbers)
* In contrast, vector[r][s][t] are differential (with positive and
* negative values). As a result, deriving the integer vectors
* (int_vec[t]) from dx, dy is accomplished by a simple right shift.
*
* 2. Half pel flags (xh, yh) are equivalent to the LSB (Least
* Significant Bit) of the half-pel coordinates (dx,dy).
*
*
* NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
* is distributed among several other stages. This is accomplished by
* folding line offsets into the source and destination (src,dst)
* addresses (note the call arguments to form_prediction() in Predict()),
* line stride variables lx and lx2, the block dimension variables (w,h),
* average_flag, and by the very order in which Predict() is called.
* This implementation design (implicitly different than the spec)
* was chosen for its elegance.
*/
 
static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
unsigned char *src;
unsigned char *dst;
int lx; /* raster line increment */
int lx2;
int w,h;
int x,y;
int dx,dy;
int average_flag; /* flag that signals bi-directional or Dual-Prime
averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
a previously formed prediction has been stored in
pel_pred[] */
{
int xint; /* horizontal integer sample vector: analogous to int_vec[0] */
int yint; /* vertical integer sample vectors: analogous to int_vec[1] */
int xh; /* horizontal half sample flag: analogous to half_flag[0] */
int yh; /* vertical half sample flag: analogous to half_flag[1] */
int i, j, v;
unsigned char *s; /* source pointer: analogous to pel_ref[][] */
unsigned char *d; /* destination pointer: analogous to pel_pred[][] */
 
/* half pel scaling for integer vectors */
xint = dx>>1;
yint = dy>>1;
 
/* derive half pel flags */
xh = dx & 1;
yh = dy & 1;
 
/* compute the linear address of pel_ref[][] and pel_pred[][]
based on cartesian/raster cordinates provided */
s = src + lx*(y+yint) + x + xint;
d = dst + lx*y + x;
 
if (!xh && !yh) /* no horizontal nor vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i]+s[i];
d[i] = (v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = s[i];
}
s+= lx2;
d+= lx2;
}
}
}
else if (!xh && yh) /* no horizontal but vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
d[i]=(v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
}
 
s+= lx2;
d+= lx2;
}
}
}
else if (xh && !yh) /* horizontal but no vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
d[i] = (v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
}
 
s+= lx2;
d+= lx2;
}
}
}
else /* if (xh && yh) horizontal and vertical half-pel */
{
if (average_flag)
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
d[i] = (v+(v>=0?1:0))>>1;
}
s+= lx2;
d+= lx2;
}
}
else
{
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
}
 
s+= lx2;
d+= lx2;
}
}
}
}
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/systems.c
0,0 → 1,195
/* systems.c, systems-specific routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdlib.h>
 
#include "config.h"
#include "global.h"
 
/* initialize buffer, call once before first getbits or showbits */
 
/* parse system layer, ignore everything we don't need */
void Next_Packet()
{
unsigned int code;
int l;
 
for(;;)
{
code = Get_Long();
 
/* remove system layer byte stuffing */
while ((code & 0xffffff00) != 0x100)
code = (code<<8) | Get_Byte();
 
switch(code)
{
case PACK_START_CODE: /* pack header */
/* skip pack header (system_clock_reference and mux_rate) */
ld->Rdptr += 8;
break;
case VIDEO_ELEMENTARY_STREAM:
code = Get_Word(); /* packet_length */
ld->Rdmax = ld->Rdptr + code;
 
code = Get_Byte();
 
if((code>>6)==0x02)
{
ld->Rdptr++;
code=Get_Byte(); /* parse PES_header_data_length */
ld->Rdptr+=code; /* advance pointer by PES_header_data_length */
cprintf("MPEG-2 PES packet\n");
return;
}
else if(code==0xff)
{
/* parse MPEG-1 packet header */
while((code=Get_Byte())== 0xFF);
}
/* stuffing bytes */
if(code>=0x40)
{
if(code>=0x80)
{
cprintf("Error in packet header\n");
}
/* skip STD_buffer_scale */
ld->Rdptr++;
code = Get_Byte();
}
 
if(code>=0x30)
{
if(code>=0x40)
{
cprintf("Error in packet header\n");
}
/* skip presentation and decoding time stamps */
ld->Rdptr += 9;
}
else if(code>=0x20)
{
/* skip presentation time stamps */
ld->Rdptr += 4;
}
else if(code!=0x0f)
{
cprintf("Error in packet header\n");
}
return;
case ISO_END_CODE: /* end */
/* simulate a buffer full of sequence end codes */
l = 0;
while (l<2048)
{
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
}
ld->Rdptr = ld->Rdbfr;
ld->Rdmax = ld->Rdbfr + 2048;
return;
default:
if(code>=SYSTEM_START_CODE)
{
/* skip system headers and non-video packets*/
code = Get_Word();
ld->Rdptr += code;
}
else
{
cprintf("Unexpected startcode %08x in system layer\n",code);
}
break;
}
}
}
 
 
 
void Flush_Buffer32()
{
int Incnt;
 
ld->Bfr = 0;
 
Incnt = ld->Incnt;
Incnt -= 32;
 
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
{
while (Incnt <= 24)
{
if (ld->Rdptr >= ld->Rdmax)
Next_Packet();
ld->Bfr |= Get_Byte() << (24 - Incnt);
Incnt += 8;
}
}
else
{
while (Incnt <= 24)
{
if (ld->Rdptr >= ld->Rdbfr+2048)
Fill_Buffer();
ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
Incnt += 8;
}
}
ld->Incnt = Incnt;
 
#ifdef VERIFY
ld->Bitcnt += 32;
#endif /* VERIFY */
}
 
 
unsigned int Get_Bits32()
{
unsigned int l;
 
l = Show_Bits(32);
Flush_Buffer32();
 
return l;
}
 
 
int Get_Long()
{
int i;
 
i = Get_Word();
return (i<<16) | Get_Word();
}
 
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/subspic.c
0,0 → 1,384
/* #define DEBUG */
/* subspic.c, Frame buffer substitution routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdlib.h>
 
#include "config.h"
#include "global.h"
 
/* private prototypes*/
static void Read_Frame _ANSI_ARGS_((char *filename,
unsigned char *frame_buffer[], int framenum));
static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
int width, int height, int parity, int incr));
static int Read_Components _ANSI_ARGS_ ((char *filename,
unsigned char *frame[3], int framenum));
static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame,
int width, int height));
static int Extract_Components _ANSI_ARGS_ ((char *filename,
unsigned char *frame[3], int framenum));
 
extern int read(int Infile, void *Rdbfr, int rdsize);
 
/* substitute frame buffer routine */
void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum)
int bitstream_framenum;
int sequence_framenum;
{
/* static tracking variables */
static int previous_temporal_reference;
static int previous_bitstream_framenum;
static int previous_anchor_temporal_reference;
static int previous_anchor_bitstream_framenum;
static int previous_picture_coding_type;
static int bgate;
/* local temporary variables */
int substitute_display_framenum;
 
 
#ifdef DEBUG
cprintf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n",
sequence_framenum, bitstream_framenum, temporal_reference,
picture_structure, picture_coding_type);
#endif
 
/* we don't substitute at the first picture of a sequence */
if((sequence_framenum!=0)||(Second_Field))
{
/* only at the start of the frame */
if ((picture_structure==FRAME_PICTURE)||(!Second_Field))
{
if(picture_coding_type==P_TYPE)
{
/* the most recently decoded reference frame needs substituting */
substitute_display_framenum = bitstream_framenum - 1;
Read_Frame(Substitute_Picture_Filename, forward_reference_frame,
substitute_display_framenum);
}
/* only the first B frame in a consequitve set of B pictures
loads a substitute backward_reference_frame since all subsequent
B frames predict from the same reference pictures */
else if((picture_coding_type==B_TYPE)&&(bgate!=1))
{
substitute_display_framenum =
(previous_temporal_reference - temporal_reference)
+ bitstream_framenum - 1;
 
Read_Frame(Substitute_Picture_Filename, backward_reference_frame,
substitute_display_framenum);
}
} /* P fields can predict from the two most recently decoded fields, even
from the first field of the same frame being decoded */
else if(Second_Field && (picture_coding_type==P_TYPE))
{
/* our favourite case: the IP field picture pair */
if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE))
{
substitute_display_framenum = bitstream_framenum;
}
else /* our more generic P field picture pair */
{
substitute_display_framenum =
(temporal_reference - previous_anchor_temporal_reference)
+ bitstream_framenum - 1;
}
 
Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum);
}
#ifdef DEBUG
else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE))
{
cprintf("NO SUBS FOR THIS PICTURE\n");
}
#endif
}
 
 
/* set b gate so we don't redundantly load next time around */
if(picture_coding_type==B_TYPE)
bgate = 1;
else
bgate = 0;
 
/* update general tracking variables */
if((picture_structure==FRAME_PICTURE)||(!Second_Field))
{
previous_temporal_reference = temporal_reference;
previous_bitstream_framenum = bitstream_framenum;
}
/* update reference frame tracking variables */
if((picture_coding_type!=B_TYPE) &&
((picture_structure==FRAME_PICTURE)||Second_Field))
{
previous_anchor_temporal_reference = temporal_reference;
previous_anchor_bitstream_framenum = bitstream_framenum;
}
 
previous_picture_coding_type = picture_coding_type;
 
}
 
 
/* Note: fields are only read to serve as the same-frame reference for
a second field */
static void Read_Frame(fname,frame,framenum)
char *fname;
unsigned char *frame[];
int framenum;
{
int parity;
int rerr = 0;
int field_mode;
 
if(framenum<0)
cprintf("ERROR: framenum (%d) is less than zero\n", framenum);
 
 
if(Big_Picture_Flag)
rerr = Extract_Components(fname, substitute_frame, framenum);
else
rerr = Read_Components(fname, substitute_frame, framenum);
 
if(rerr!=0)
{
cprintf("was unable to substitute frame\n");
}
 
/* now copy to the appropriate buffer */
/* first field (which we are attempting to substitute) must be
of opposite field parity to the current one */
if((Second_Field)&&(picture_coding_type==P_TYPE))
{
parity = (picture_structure==TOP_FIELD ? 1:0);
field_mode = (picture_structure==FRAME_PICTURE ? 0:1);
}
else
{
/* Like frame structued pictures, B pictures only substitute an entire frame
since both fields always predict from the same frame (with respect
to forward/backwards directions) */
parity = 0;
field_mode = 0;
}
 
 
Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width,
Coded_Picture_Height, parity, field_mode);
Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height,
parity, field_mode);
Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height,
parity, field_mode);
 
#ifdef VERBOSE
if(Verbose_Flag > NO_LAYER)
cprintf("substituted %s %d\n",
(field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum);
#endif
}
 
 
 
 
static int Read_Components(filename, frame, framenum)
char *filename;
unsigned char *frame[3];
int framenum;
{
int err = 0;
char outname[FILENAME_LENGTH];
char name[FILENAME_LENGTH];
 
sprintf(outname,filename,framenum);
 
 
sprintf(name,"%s.Y",outname);
err += Read_Component(name, frame[0], Coded_Picture_Width,
Coded_Picture_Height);
 
sprintf(name,"%s.U",outname);
err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height);
 
sprintf(name,"%s.V",outname);
err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height);
 
return(err);
}
 
 
static int Read_Component(Filename, Frame, Width, Height)
char *Filename;
unsigned char *Frame;
int Width;
int Height;
{
int Size;
int Bytes_Read;
int Infile;
 
Size = Width*Height;
 
#ifdef DEBUG
cprintf("SUBS: reading %s\n", filename);
#endif
 
if(!(Infile=1)<0)
{
cprintf("ERROR: unable to open reference filename (%s)\n", Filename);
return(-1);
}
 
Bytes_Read = read(Infile, Frame, Size);
if(Bytes_Read!=Size)
{
cprintf("was able to read only %d bytes of %d of file %s\n",
Bytes_Read, Size, Filename);
}
return(0);
}
 
 
/* optimization: do not open the big file each time. Open once at start
of decoder, and close at the very last frame */
 
/* Note: "big" files were used in E-mail exchanges almost exclusively by the
MPEG Committee's syntax validation and conformance ad-hoc groups from
the year 1993 until 1995 */
static int Extract_Components(filename, frame, framenum)
char *filename;
unsigned char *frame[3];
int framenum;
{
/* int err = 0; */
int line;
int size, offset;
 
cprintf("Extract_Components\n");
/* compute size of each frame (in bytes) */
size = (Coded_Picture_Width*Coded_Picture_Height);
 
if(chroma_format==CHROMA444)
size = (size * 3);
else if(chroma_format==CHROMA422)
size = (size * 2);
else if(chroma_format==CHROMA420)
size = ((size*3)>>1);
else
cprintf("ERROR: chroma_format (%d) not recognized\n", chroma_format);
 
 
/* compute distance into "big" file */
offset = size*framenum;
 
#ifdef DEBUG
printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n",
framenum, offset, size, filename);
#endif
 
/* seek to location in big file where desired frame begins */
/* note: this offset cannot exceed a few billion bytes due to the */
/* obvious limitations of 32-bit integers */
//fseek(fd, offset, 0);
 
/* Y */
for (line=0; line<Coded_Picture_Height; line++)
{
//fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd);
}
 
/* Cb */
for (line=0; line<Chroma_Height; line++)
{
//fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd);
}
 
/* Cr */
for (line=0; line<Chroma_Height; line++)
{
//fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd);
}
 
 
//fclose(fd);
return(0);
}
 
 
static void Copy_Frame(src, dst, width, height, parity, field_mode)
unsigned char *src;
unsigned char *dst;
int width;
int height;
int parity; /* field parity (top or bottom) to overwrite */
int field_mode; /* 0 = frame, 1 = field */
{
int row, col;
int s, d;
int incr;
 
s = d = 0;
 
#ifdef DEBUG
cprintf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n",
width,height,parity,field_mode);
#endif /* DEBUG */
 
if(field_mode)
{
incr = 2;
 
if(parity==0)
s += width;
}
else
{
incr = 1;
}
 
for(row=0; row<height; row+=incr)
{
for(col=0; col<width; col++)
{
dst[d+col] = src[s+col];
}
d += (width*incr);
s += (width*incr);
}
 
}
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/getblk.c
0,0 → 1,571
/* getblk.c, DCT block decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "config.h"
#include "global.h"
 
 
/* defined in getvlc.h */
typedef struct {
char run, level, len;
} DCTtab;
 
extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
extern DCTtab DCTtab0a[],DCTtab1a[];
 
 
/* decode one intra coded MPEG-1 block */
 
void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
int comp;
int dc_dct_pred[];
{
int val, i, j, sign;
unsigned int code;
DCTtab *tab;
short *bp;
 
bp = ld->block[comp];
 
/* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
/* decode DC coefficients */
if (comp<4)
bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
else if (comp==4)
bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
else
bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
 
if (Fault_Flag) return;
 
/* D-pictures do not contain AC coefficients */
if(picture_coding_type == D_TYPE)
return;
 
/* decode AC coefficients */
for (i=1; ; i++)
{
code = Show_Bits(16);
if (code>=16384)
tab = &DCTtabnext[(code>>12)-4];
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
cprintf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
if (tab->run==64) /* end_of_block */
return;
 
if (tab->run==65) /* escape */
{
i+= Get_Bits(6);
 
val = Get_Bits(8);
if (val==0)
val = Get_Bits(8);
else if (val==128)
val = Get_Bits(8) - 256;
else if (val>128)
val -= 256;
 
if((sign = (val<0)))
val = -val;
}
else
{
i+= tab->run;
val = tab->level;
sign = Get_Bits(1);
}
 
if (i>=64)
{
if (!Quiet_Flag)
cprintf("DCT coeff index (i) out of bounds (intra)\n");
Fault_Flag = 1;
return;
}
 
j = scan[ZIG_ZAG][i];
val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
 
/* mismatch control ('oddification') */
if (val!=0) /* should always be true, but it's not guaranteed */
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
 
/* saturation */
if (!sign)
bp[j] = (val>2047) ? 2047 : val; /* positive */
else
bp[j] = (val>2048) ? -2048 : -val; /* negative */
}
}
 
 
/* decode one non-intra coded MPEG-1 block */
 
void Decode_MPEG1_Non_Intra_Block(comp)
int comp;
{
int val, i, j, sign;
unsigned int code;
DCTtab *tab;
short *bp;
 
bp = ld->block[comp];
 
/* decode AC coefficients */
for (i=0; ; i++)
{
code = Show_Bits(16);
if (code>=16384)
{
if (i==0)
tab = &DCTtabfirst[(code>>12)-4];
else
tab = &DCTtabnext[(code>>12)-4];
}
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
cprintf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
if (tab->run==64) /* end_of_block */
return;
 
if (tab->run==65) /* escape */
{
i+= Get_Bits(6);
 
val = Get_Bits(8);
if (val==0)
val = Get_Bits(8);
else if (val==128)
val = Get_Bits(8) - 256;
else if (val>128)
val -= 256;
 
if((sign = (val<0)))
val = -val;
}
else
{
i+= tab->run;
val = tab->level;
sign = Get_Bits(1);
}
 
if (i>=64)
{
if (!Quiet_Flag)
cprintf("DCT coeff index (i) out of bounds (inter)\n");
Fault_Flag = 1;
return;
}
 
j = scan[ZIG_ZAG][i];
val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
 
/* mismatch control ('oddification') */
if (val!=0) /* should always be true, but it's not guaranteed */
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
 
/* saturation */
if (!sign)
bp[j] = (val>2047) ? 2047 : val; /* positive */
else
bp[j] = (val>2048) ? -2048 : -val; /* negative */
}
}
 
 
/* decode one intra coded MPEG-2 block */
 
void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
int comp;
int dc_dct_pred[];
{
int val, i, j, sign, nc, cc, run;
unsigned int code;
DCTtab *tab;
short *bp;
int *qmat;
struct layer_data *ld1;
 
/* with data partitioning, data always goes to base layer */
ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
bp = ld1->block[comp];
 
if (base.scalable_mode==SC_DP) {
if (base.priority_breakpoint<64)
ld = &enhan;
else
ld = &base;
}
 
cc = (comp<4) ? 0 : (comp&1)+1;
 
qmat = (comp<4 || chroma_format==CHROMA420)
? ld1->intra_quantizer_matrix
: ld1->chroma_intra_quantizer_matrix;
 
/* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
if (cc==0)
val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
else if (cc==1)
val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
else
val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
 
if (Fault_Flag) return;
 
bp[0] = val << (3-intra_dc_precision);
 
nc=0;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("DCT(%d)i:",comp);
#endif /* TRACE */
 
/* decode AC coefficients */
for (i=1; ; i++)
{
code = Show_Bits(16);
if (code>=16384 && !intra_vlc_format)
tab = &DCTtabnext[(code>>12)-4];
else if (code>=1024)
{
if (intra_vlc_format)
tab = &DCTtab0a[(code>>8)-4];
else
tab = &DCTtab0[(code>>8)-4];
}
else if (code>=512)
{
if (intra_vlc_format)
tab = &DCTtab1a[(code>>6)-8];
else
tab = &DCTtab1[(code>>6)-8];
}
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
cprintf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
#ifdef TRACE
if (Trace_Flag)
{
printf(" (");
Print_Bits(code,16,tab->len);
}
#endif /* TRACE */
 
if (tab->run==64) /* end_of_block */
{
#ifdef TRACE
if (Trace_Flag)
printf("): EOB\n");
#endif /* TRACE */
return;
}
 
if (tab->run==65) /* escape */
{
#ifdef TRACE
if (Trace_Flag)
{
putchar(' ');
Print_Bits(Show_Bits(6),6,6);
}
#endif /* TRACE */
 
i+= run = Get_Bits(6);
 
#ifdef TRACE
if (Trace_Flag)
{
putchar(' ');
Print_Bits(Show_Bits(12),12,12);
}
#endif /* TRACE */
 
val = Get_Bits(12);
if ((val&2047)==0)
{
if (!Quiet_Flag)
cprintf("invalid escape in Decode_MPEG2_Intra_Block()\n");
Fault_Flag = 1;
return;
}
if((sign = (val>=2048)))
val = 4096 - val;
}
else
{
i+= run = tab->run;
val = tab->level;
sign = Get_Bits(1);
 
#ifdef TRACE
if (Trace_Flag)
cprintf("%d",sign);
#endif /* TRACE */
}
 
if (i>=64)
{
if (!Quiet_Flag)
cprintf("DCT coeff index (i) out of bounds (intra2)\n");
Fault_Flag = 1;
return;
}
 
#ifdef TRACE
if (Trace_Flag)
cprintf("): %d/%d",run,sign ? -val : val);
#endif /* TRACE */
 
j = scan[ld1->alternate_scan][i];
val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
bp[j] = sign ? -val : val;
nc++;
 
if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
ld = &enhan;
}
}
 
 
/* decode one non-intra coded MPEG-2 block */
 
void Decode_MPEG2_Non_Intra_Block(comp)
int comp;
{
int val, i, j, sign, nc, run;
unsigned int code;
DCTtab *tab;
short *bp;
int *qmat;
struct layer_data *ld1;
 
/* with data partitioning, data always goes to base layer */
ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
bp = ld1->block[comp];
 
if (base.scalable_mode==SC_DP) {
if (base.priority_breakpoint<64)
ld = &enhan;
else
ld = &base;
}
 
qmat = (comp<4 || chroma_format==CHROMA420)
? ld1->non_intra_quantizer_matrix
: ld1->chroma_non_intra_quantizer_matrix;
 
nc = 0;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("DCT(%d)n:",comp);
#endif /* TRACE */
 
/* decode AC coefficients */
for (i=0; ; i++)
{
code = Show_Bits(16);
if (code>=16384)
{
if (i==0)
tab = &DCTtabfirst[(code>>12)-4];
else
tab = &DCTtabnext[(code>>12)-4];
}
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
cprintf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
Fault_Flag = 1;
return;
}
 
Flush_Buffer(tab->len);
 
#ifdef TRACE
if (Trace_Flag)
{
cprintf(" (");
Print_Bits(code,16,tab->len);
}
#endif /* TRACE */
 
if (tab->run==64) /* end_of_block */
{
#ifdef TRACE
if (Trace_Flag)
cprintf("): EOB\n");
#endif /* TRACE */
return;
}
 
if (tab->run==65) /* escape */
{
#ifdef TRACE
if (Trace_Flag)
{
cprintf(" ");
Print_Bits(Show_Bits(6),6,6);
}
#endif /* TRACE */
 
i+= run = Get_Bits(6);
 
#ifdef TRACE
if (Trace_Flag)
{
cprintf(" ");
Print_Bits(Show_Bits(12),12,12);
}
#endif /* TRACE */
 
val = Get_Bits(12);
if ((val&2047)==0)
{
if (!Quiet_Flag)
cprintf("invalid escape in Decode_MPEG2_Intra_Block()\n");
Fault_Flag = 1;
return;
}
if((sign = (val>=2048)))
val = 4096 - val;
}
else
{
i+= run = tab->run;
val = tab->level;
sign = Get_Bits(1);
 
#ifdef TRACE
if (Trace_Flag)
cprintf("%d",sign);
#endif /* TRACE */
}
 
if (i>=64)
{
if (!Quiet_Flag)
cprintf("DCT coeff index (i) out of bounds (inter2)\n");
Fault_Flag = 1;
return;
}
 
#ifdef TRACE
if (Trace_Flag)
cprintf("): %d/%d",run,sign?-val:val);
#endif /* TRACE */
 
j = scan[ld1->alternate_scan][i];
val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
bp[j] = sign ? -val : val;
nc++;
 
if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
ld = &enhan;
}
}
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/spatscal.c
0,0 → 1,275
 
#include "config.h"
#include "global.h"
 
/* private prototypes */
static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh));
static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh));
static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame,
int llprogressive_frame, unsigned char *fld0, unsigned char *fld1,
short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh,
int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn,
int aperture));
static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1,
int j0, int lx, int ly, int aperture));
static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d,
int lx, int lys, int lyd, int m, int n, int j0, int dj));
static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d,
int x0, int lx, int lxs, int lxd, int ly, int m, int n));
 
 
 
/* get reference frame */
void Spatial_Prediction()
{
if(Frame_Store_Flag)
{
Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size,
lower_layer_prediction_vertical_size); /* Y */
Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
}
else
{
Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size,
lower_layer_prediction_vertical_size); /* Y */
Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
}
 
 
Make_Spatial_Prediction_Frame /* Y */
(progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0],
lltmp,current_frame[0],lower_layer_horizontal_offset,
lower_layer_vertical_offset,
lower_layer_prediction_horizontal_size,
lower_layer_prediction_vertical_size,
horizontal_size,vertical_size,vertical_subsampling_factor_m,
vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
horizontal_subsampling_factor_n,
picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */
 
Make_Spatial_Prediction_Frame /* Cb */
(progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1],
lltmp,current_frame[1],lower_layer_horizontal_offset/2,
lower_layer_vertical_offset/2,
lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1,
horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
horizontal_subsampling_factor_n,1);
 
Make_Spatial_Prediction_Frame /* Cr */
(progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2],
lltmp,current_frame[2],lower_layer_horizontal_offset/2,
lower_layer_vertical_offset/2,
lower_layer_prediction_horizontal_size>>1,
lower_layer_prediction_vertical_size>>1,
horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
horizontal_subsampling_factor_n,1);
 
}
 
static void Read_Lower_Layer_Component_Framewise(comp,lw,lh)
int comp;
int lw, lh;
{
cprintf("Read_Lower_Layer_Component_Framewise\n");
}
 
 
static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh)
int comp;
int lw, lh;
{
cprintf("Read_Lower_Layer_Component_Fieldwise\n");
}
 
 
/* form spatial prediction */
static void Make_Spatial_Prediction_Frame(progressive_frame,
llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size,
vertical_size,vm,vn,hm,hn,aperture)
int progressive_frame,llprogressive_frame;
unsigned char *fld0,*fld1;
short *tmp;
unsigned char *dst;
int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture;
{
int w, h, x0, llw2, llh2;
 
llw2 = (llw*hn)/hm;
llh2 = (llh*vn)/vm;
 
if (llprogressive_frame)
{
/* progressive -> progressive / interlaced */
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
}
else if (progressive_frame)
{
/* interlaced -> progressive */
if (lower_layer_deinterlaced_field_select)
{
Deinterlace(fld1,fld0,0,llw,llh,aperture);
Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1);
}
else
{
Deinterlace(fld0,fld1,1,llw,llh,aperture);
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
}
}
else
{
/* interlaced -> interlaced */
Deinterlace(fld0,fld1,1,llw,llh,aperture);
Deinterlace(fld1,fld0,0,llw,llh,aperture);
Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
}
 
/* vertical limits */
if (lly0<0)
{
tmp-= llw*lly0;
llh2+= lly0;
if (llh2<0)
llh2 = 0;
h = (vertical_size<llh2) ? vertical_size : llh2;
}
else
{
dst+= horizontal_size*lly0;
h= vertical_size - lly0;
if (h>llh2)
h = llh2;
}
 
/* horizontal limits */
if (llx0<0)
{
x0 = -llx0;
llw2+= llx0;
if (llw2<0)
llw2 = 0;
w = (horizontal_size<llw2) ? horizontal_size : llw2;
}
else
{
dst+= llx0;
x0 = 0;
w = horizontal_size - llx0;
if (w>llw2)
w = llw2;
}
Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
}
 
/* deinterlace one field (interpolate opposite parity samples)
*
* deinterlacing is done in-place: if j0=1, fld0 contains the input field in
* its even lines and the odd lines are interpolated by this routine
* if j0=0, the input field is in the odd lines and the even lines are
* interpolated
*
* fld0: field to be deinterlaced
* fld1: other field (referenced by the two field aperture filter)
* j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
* lx: width of fld0 and fld1
* ly: height of the deinterlaced field (has to be even)
* aperture: 1: use one field aperture filter (two field otherwise)
*/
static void Deinterlace(fld0,fld1,j0,lx,ly,aperture)
unsigned char *fld0,*fld1;
int j0,lx,ly; /* ly has to be even */
int aperture;
{
int i,j,v;
unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
 
/* deinterlace one field */
for (j=j0; j<ly; j+=2)
{
p0 = fld0+lx*j;
p0m1 = (j==0) ? p0+lx : p0-lx;
p0p1 = (j==ly-1) ? p0-lx : p0+lx;
 
if (aperture)
for (i=0; i<lx; i++)
p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
else
{
p1 = fld1 + lx*j;
p1m2 = (j<2) ? p1 : p1-2*lx;
p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
for (i=0; i<lx; i++)
{
v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4];
}
}
}
}
 
/* vertical resampling */
static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj)
unsigned char *s;
short *d;
int lx, lys, lyd, m, n, j0, dj;
{
int i, j, c1, c2, jd;
unsigned char *s1, *s2;
short *d1;
 
for (j=j0; j<lyd; j+=dj)
{
d1 = d + lx*j;
jd = (j*m)/n;
s1 = s + lx*jd;
s2 = (jd<lys-1)? s1+lx : s1;
c2 = (16*((j*m)%n) + (n>>1))/n;
c1 = 16 - c2;
for (i=0; i<lx; i++)
d1[i] = c1*s1[i] + c2*s2[i];
}
}
 
/* horizontal resampling */
static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n)
short *s;
unsigned char *d;
int x0, lx, lxs, lxd, ly, m, n;
{
int i, i1, j, id, c1, c2, v;
short *s1, *s2;
unsigned char *d1;
 
for (i1=0; i1<lx; i1++)
{
d1 = d + i1;
i = x0 + i1;
id = (i*m)/n;
s1 = s+id;
s2 = (id<lxs-1) ? s1+1 : s1;
c2 = (16*((i*m)%n) + (n>>1))/n;
c1 = 16 - c2;
for (j=0; j<ly; j++)
{
v = c1*(*s1) + c2*(*s2);
*d1 = (v + ((v>=0) ? 128 : 127))>>8;
d1+= lxd;
s1+= lxs;
s2+= lxs;
}
}
}
 
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/config.h
0,0 → 1,45
/* config.h, configuration defines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/* define NON_ANSI_COMPILER for compilers without function prototyping */
/* #define NON_ANSI_COMPILER */
 
#ifdef NON_ANSI_COMPILER
#define _ANSI_ARGS_(x) ()
#else
#define _ANSI_ARGS_(x) x
#endif
 
#define RB "rb"
#define WB "wb"
 
#ifndef O_BINARY
#define O_BINARY 0
 
#endif
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/getpic.c
0,0 → 1,1223
/* getpic.c, picture decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "config.h"
#include "global.h"
 
/* private prototypes*/
static void picture_data _ANSI_ARGS_((int framenum));
static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype,
int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv,
int *pmvscale, int *pdct_type));
static void Clear_Block _ANSI_ARGS_((int comp));
static void Sum_Block _ANSI_ARGS_((int comp));
static void Saturate _ANSI_ARGS_((short *bp));
static void Add_Block _ANSI_ARGS_((int comp, int bx, int by,
int dct_type, int addflag));
static void Update_Picture_Buffers _ANSI_ARGS_((void));
static void frame_reorder _ANSI_ARGS_((int bitstream_framenum,
int sequence_framenum));
static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc,
int MBA, int MBAmax, int *dct_type));
 
static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type,
int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
int dmvector[2], int stwtype, int dct_type));
 
static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3],
int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2],
int *stwtype, int *macroblock_type));
 
static int slice _ANSI_ARGS_((int framenum, int MBAmax));
 
static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA,
int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]));
 
static int decode_macroblock _ANSI_ARGS_((int *macroblock_type,
int *stwtype, int *stwclass, int *motion_type, int *dct_type,
int PMV[2][2][2], int dc_dct_pred[3],
int motion_vertical_field_select[2][2], int dmvector[2]));
 
 
/* decode one frame or field picture */
void Decode_Picture(bitstream_framenum, sequence_framenum)
int bitstream_framenum, sequence_framenum;
{
 
if (picture_structure==FRAME_PICTURE && Second_Field)
{
/* recover from illegal number of field pictures */
cprintf("odd number of field pictures\n");
Second_Field = 0;
}
 
/* IMPLEMENTATION: update picture buffer pointers */
Update_Picture_Buffers();
 
#ifdef VERIFY
Check_Headers(bitstream_framenum, sequence_framenum);
#endif /* VERIFY */
 
/* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */
/* (section number based on November 1995 (Dallas) draft of the
conformance document) */
if(Ersatz_Flag)
Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum);
 
/* form spatial scalable picture */
/* form spatial scalable picture */
/* ISO/IEC 13818-2 section 7.7: Spatial scalability */
if (base.pict_scal && !Second_Field)
{
Spatial_Prediction();
}
 
/* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
picture_data(bitstream_framenum);
 
/* write or display current or previously decoded reference frame */
/* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
frame_reorder(bitstream_framenum, sequence_framenum);
 
if (picture_structure!=FRAME_PICTURE)
Second_Field = !Second_Field;
}
 
 
/* decode all macroblocks of the current picture */
/* stages described in ISO/IEC 13818-2 section 7 */
static void picture_data(framenum)
int framenum;
{
int MBAmax;
int ret;
 
/* number of macroblocks per picture */
MBAmax = mb_width*mb_height;
 
if (picture_structure!=FRAME_PICTURE)
MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */
 
for(;;)
{
if((ret=slice(framenum, MBAmax))<0)
return;
}
 
}
 
 
 
/* decode all macroblocks of the current picture */
/* ISO/IEC 13818-2 section 6.3.16 */
static int slice(framenum, MBAmax)
int framenum, MBAmax;
{
int MBA;
int MBAinc, macroblock_type, motion_type, dct_type;
int dc_dct_pred[3];
int PMV[2][2][2], motion_vertical_field_select[2][2];
int dmvector[2];
int stwtype, stwclass;
int SNRMBA, SNRMBAinc;
int ret;
 
MBA = 0; /* macroblock address */
MBAinc = 0;
 
if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1)
return(ret);
 
if (Two_Streams && enhan.scalable_mode==SC_SNR)
{
SNRMBA=0;
SNRMBAinc=0;
}
 
Fault_Flag=0;
 
for (;;)
{
 
/* this is how we properly exit out of picture */
if (MBA>=MBAmax)
return(-1); /* all macroblocks decoded */
 
#ifdef TRACE
if (Trace_Flag)
cprintf("frame %d, MB %d\n",framenum,MBA);
#endif /* TRACE */
 
#ifdef DISPLAY
if (!progressive_frame && picture_structure==FRAME_PICTURE
&& MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11
&& !Display_Progressive_Flag)
{
Display_Second_Field();
}
#endif
 
ld = &base;
 
if (MBAinc==0)
{
if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
ld = &enhan;
 
if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */
{
resync: /* if Fault_Flag: resynchronize to next next_start_code */
Fault_Flag = 0;
return(0); /* trigger: go to next slice */
}
else /* neither next_start_code nor Fault_Flag */
{
if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
ld = &enhan;
 
/* decode macroblock address increment */
MBAinc = Get_macroblock_address_increment();
 
if (Fault_Flag) goto resync;
}
}
 
if (MBA>=MBAmax)
{
/* MBAinc points beyond picture dimensions */
if (!Quiet_Flag)
cprintf("Too many macroblocks in picture\n");
return(-1);
}
 
if (MBAinc==1) /* not skipped */
{
ret = decode_macroblock(&macroblock_type, &stwtype, &stwclass,
&motion_type, &dct_type, PMV, dc_dct_pred,
motion_vertical_field_select, dmvector);
 
if(ret==-1)
return(-1);
if(ret==0)
goto resync;
 
}
else /* MBAinc!=1: skipped macroblock */
{
/* ISO/IEC 13818-2 section 7.6.6 */
skipped_macroblock(dc_dct_pred, PMV, &motion_type,
motion_vertical_field_select, &stwtype, &macroblock_type);
}
 
/* SCALABILITY: SNR */
/* ISO/IEC 13818-2 section 7.8 */
/* NOTE: we currently ignore faults encountered in this routine */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type);
 
/* ISO/IEC 13818-2 section 7.6 */
motion_compensation(MBA, macroblock_type, motion_type, PMV,
motion_vertical_field_select, dmvector, stwtype, dct_type);
 
 
/* advance to next macroblock */
MBA++;
MBAinc--;
/* SCALABILITY: SNR */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
{
SNRMBA++;
SNRMBAinc--;
}
 
if (MBA>=MBAmax)
return(-1); /* all macroblocks decoded */
}
}
 
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass,
pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type)
int *pmacroblock_type, *pstwtype, *pstwclass;
int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale;
int *pdct_type;
{
int macroblock_type;
int stwtype, stwcode, stwclass;
int motion_type = 0;
int motion_vector_count, mv_format, dmv, mvscale;
int dct_type;
static unsigned char stwc_table[3][4]
= { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
static unsigned char stwclass_table[9]
= {0, 1, 2, 1, 1, 2, 3, 3, 4};
 
/* get macroblock_type */
macroblock_type = Get_macroblock_type();
 
if (Fault_Flag) return;
 
/* get spatial_temporal_weight_code */
if (macroblock_type & MB_WEIGHT)
{
if (spatial_temporal_weight_code_table_index==0)
stwtype = 4;
else
{
stwcode = Get_Bits(2);
#ifdef TRACE
if (Trace_Flag)
{
cprintf("spatial_temporal_weight_code (");
Print_Bits(stwcode,2,2);
cprintf("): %d\n",stwcode);
}
#endif /* TRACE */
stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
}
}
else
stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
 
/* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
stwclass = stwclass_table[stwtype];
 
/* get frame/field motion type */
if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
{
if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
{
motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
#ifdef TRACE
if (!frame_pred_frame_dct && Trace_Flag)
{
cprintf("frame_motion_type (");
Print_Bits(motion_type,2,2);
cprintf("): %s\n",motion_type==MC_FIELD?"Field":
motion_type==MC_FRAME?"Frame":
motion_type==MC_DMV?"Dual_Prime":"Invalid");
}
#endif /* TRACE */
}
else /* field_motion_type */
{
motion_type = Get_Bits(2);
#ifdef TRACE
if (Trace_Flag)
{
cprintf("field_motion_type (");
Print_Bits(motion_type,2,2);
cprintf("): %s\n",motion_type==MC_FIELD?"Field":
motion_type==MC_16X8?"16x8 MC":
motion_type==MC_DMV?"Dual_Prime":"Invalid");
}
#endif /* TRACE */
}
}
else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
{
/* concealment motion vectors */
motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
}
#if 0
else
{
printf("maroblock_modes(): unknown macroblock type\n");
motion_type = -1;
}
#endif
 
/* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
if (picture_structure==FRAME_PICTURE)
{
motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
}
else
{
motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
mv_format = MV_FIELD;
}
 
dmv = (motion_type==MC_DMV); /* dual prime */
 
/* field mv predictions in frame pictures have to be scaled
* ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
* IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
* it displaces the stage:
*
* if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
* prediction = PMV[r][s][t] DIV 2;
*/
 
mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
 
/* get dct_type (frame DCT / field DCT) */
dct_type = (picture_structure==FRAME_PICTURE)
&& (!frame_pred_frame_dct)
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
? Get_Bits(1)
: 0;
 
#ifdef TRACE
if (Trace_Flag && (picture_structure==FRAME_PICTURE)
&& (!frame_pred_frame_dct)
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
cprintf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
#endif /* TRACE */
 
/* return values */
*pmacroblock_type = macroblock_type;
*pstwtype = stwtype;
*pstwclass = stwclass;
*pmotion_type = motion_type;
*pmotion_vector_count = motion_vector_count;
*pmv_format = mv_format;
*pdmv = dmv;
*pmvscale = mvscale;
*pdct_type = dct_type;
}
 
 
/* move/add 8x8-Block from block[comp] to backward_reference_frame */
/* copy reconstructed 8x8 block from block[comp] to current_frame[]
* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
* This stage also embodies some of the operations implied by:
* - ISO/IEC 13818-2 section 7.6.7: Combining predictions
* - ISO/IEC 13818-2 section 6.1.3: Macroblock
*/
static void Add_Block(comp,bx,by,dct_type,addflag)
int comp,bx,by,dct_type,addflag;
{
int cc,i, j, iincr;
unsigned char *rfp;
short *bp;
 
/* derive color component index */
/* equivalent to ISO/IEC 13818-2 Table 7-1 */
cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
 
if (cc==0)
{
/* luminance */
 
if (picture_structure==FRAME_PICTURE)
if (dct_type)
{
/* field DCT coding */
rfp = current_frame[0]
+ Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
iincr = (Coded_Picture_Width<<1) - 8;
}
else
{
/* frame DCT coding */
rfp = current_frame[0]
+ Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
iincr = Coded_Picture_Width - 8;
}
else
{
/* field picture */
rfp = current_frame[0]
+ (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
iincr = (Coded_Picture_Width<<1) - 8;
}
}
else
{
/* chrominance */
 
/* scale coordinates */
if (chroma_format!=CHROMA444)
bx >>= 1;
if (chroma_format==CHROMA420)
by >>= 1;
if (picture_structure==FRAME_PICTURE)
{
if (dct_type && (chroma_format!=CHROMA420))
{
/* field DCT coding */
rfp = current_frame[cc]
+ Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8);
iincr = (Chroma_Width<<1) - 8;
}
else
{
/* frame DCT coding */
rfp = current_frame[cc]
+ Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8);
iincr = Chroma_Width - 8;
}
}
else
{
/* field picture */
rfp = current_frame[cc]
+ (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8);
iincr = (Chroma_Width<<1) - 8;
}
}
 
bp = ld->block[comp];
 
if (addflag)
{
for (i=0; i<8; i++)
{
for (j=0; j<8; j++)
{
*rfp = Clip[*bp++ + *rfp];
rfp++;
}
 
rfp+= iincr;
}
}
else
{
for (i=0; i<8; i++)
{
for (j=0; j<8; j++)
*rfp++ = Clip[*bp++ + 128];
 
rfp+= iincr;
}
}
}
 
 
/* ISO/IEC 13818-2 section 7.8 */
static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type)
int *SNRMBA, *SNRMBAinc;
int MBA, MBAmax;
int *dct_type;
{
int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy;
int slice_vert_pos_ext, quantizer_scale_code, comp, code;
 
ld = &enhan;
 
if (*SNRMBAinc==0)
{
if (!Show_Bits(23)) /* next_start_code */
{
next_start_code();
code = Show_Bits(32);
 
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
cprintf("SNR: Premature end of picture\n");
return;
}
 
Flush_Buffer32();
 
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
 
/* decode macroblock address increment */
*SNRMBAinc = Get_macroblock_address_increment();
 
/* set current location */
*SNRMBA =
((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1;
 
*SNRMBAinc = 1; /* first macroblock in slice: not skipped */
}
else /* not next_start_code */
{
if (*SNRMBA>=MBAmax)
{
if (!Quiet_Flag)
cprintf("Too many macroblocks in picture\n");
return;
}
 
/* decode macroblock address increment */
*SNRMBAinc = Get_macroblock_address_increment();
}
}
 
if (*SNRMBA!=MBA)
{
/* streams out of sync */
if (!Quiet_Flag)
cprintf("Cant't synchronize streams\n");
return;
}
 
if (*SNRMBAinc==1) /* not skipped */
{
macroblock_modes(&SNRmacroblock_type, &dummy, &dummy,
&dummy, &dummy, &dummy, &dummy, &dummy,
&SNRdct_type);
 
if (SNRmacroblock_type & MACROBLOCK_PATTERN)
*dct_type = SNRdct_type;
 
if (SNRmacroblock_type & MACROBLOCK_QUANT)
{
quantizer_scale_code = Get_Bits(5);
ld->quantizer_scale =
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
}
 
/* macroblock_pattern */
if (SNRmacroblock_type & MACROBLOCK_PATTERN)
{
SNRcoded_block_pattern = Get_coded_block_pattern();
 
if (chroma_format==CHROMA422)
SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */
else if (chroma_format==CHROMA444)
SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */
}
else
SNRcoded_block_pattern = 0;
 
/* decode blocks */
for (comp=0; comp<block_count; comp++)
{
Clear_Block(comp);
 
if (SNRcoded_block_pattern & (1<<(block_count-1-comp)))
Decode_MPEG2_Non_Intra_Block(comp);
}
}
else /* SNRMBAinc!=1: skipped macroblock */
{
for (comp=0; comp<block_count; comp++)
Clear_Block(comp);
}
 
ld = &base;
}
 
 
 
/* IMPLEMENTATION: set scratch pad macroblock to zero */
static void Clear_Block(comp)
int comp;
{
short *Block_Ptr;
int i;
 
Block_Ptr = ld->block[comp];
 
for (i=0; i<64; i++)
*Block_Ptr++ = 0;
}
 
 
/* SCALABILITY: add SNR enhancement layer block data to base layer */
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */
static void Sum_Block(comp)
int comp;
{
short *Block_Ptr1, *Block_Ptr2;
int i;
 
Block_Ptr1 = base.block[comp];
Block_Ptr2 = enhan.block[comp];
 
for (i=0; i<64; i++)
*Block_Ptr1++ += *Block_Ptr2++;
}
 
 
/* limit coefficients to -2048..2047 */
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
static void Saturate(Block_Ptr)
short *Block_Ptr;
{
int i, sum, val;
 
sum = 0;
 
/* ISO/IEC 13818-2 section 7.4.3: Saturation */
for (i=0; i<64; i++)
{
val = Block_Ptr[i];
 
if (val>2047)
val = 2047;
else if (val<-2048)
val = -2048;
 
Block_Ptr[i] = val;
sum+= val;
}
 
/* ISO/IEC 13818-2 section 7.4.4: Mismatch control */
if ((sum&1)==0)
Block_Ptr[63]^= 1;
 
}
 
 
/* reuse old picture buffers as soon as they are no longer needed
based on life-time axioms of MPEG */
static void Update_Picture_Buffers()
{
int cc; /* color component index */
unsigned char *tmp; /* temporary swap pointer */
 
for (cc=0; cc<3; cc++)
{
/* B pictures do not need to be save for future reference */
if (picture_coding_type==B_TYPE)
{
current_frame[cc] = auxframe[cc];
}
else
{
/* only update at the beginning of the coded frame */
if (!Second_Field)
{
tmp = forward_reference_frame[cc];
 
/* the previously decoded reference frame is stored
coincident with the location where the backward
reference frame is stored (backwards prediction is not
needed in P pictures) */
forward_reference_frame[cc] = backward_reference_frame[cc];
/* update pointer for potential future B pictures */
backward_reference_frame[cc] = tmp;
}
 
/* can erase over old backward reference frame since it is not used
in a P picture, and since any subsequent B pictures will use the
previously decoded I or P frame as the backward_reference_frame */
current_frame[cc] = backward_reference_frame[cc];
}
 
/* IMPLEMENTATION:
one-time folding of a line offset into the pointer which stores the
memory address of the current frame saves offsets and conditional
branches throughout the remainder of the picture processing loop */
if (picture_structure==BOTTOM_FIELD)
current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width;
}
}
 
 
/* store last frame */
 
void Output_Last_Frame_of_Sequence(Framenum)
int Framenum;
{
if (Second_Field)
cprintf("last frame incomplete, not stored\n");
else
Write_Frame(backward_reference_frame,Framenum-1);
}
 
 
 
static void frame_reorder(Bitstream_Framenum, Sequence_Framenum)
int Bitstream_Framenum, Sequence_Framenum;
{
/* tracking variables to insure proper output in spatial scalability */
static int Oldref_progressive_frame, Newref_progressive_frame;
 
if (Sequence_Framenum!=0)
{
if (picture_structure==FRAME_PICTURE || Second_Field)
{
if (picture_coding_type==B_TYPE)
Write_Frame(auxframe,Bitstream_Framenum-1);
else
{
Newref_progressive_frame = progressive_frame;
progressive_frame = Oldref_progressive_frame;
 
Write_Frame(forward_reference_frame,Bitstream_Framenum-1);
 
Oldref_progressive_frame = progressive_frame = Newref_progressive_frame;
}
}
#ifdef DISPLAY
else if (Output_Type==T_X11)
{
if(!Display_Progressive_Flag)
Display_Second_Field();
}
#endif
}
else
Oldref_progressive_frame = progressive_frame;
 
}
 
 
/* ISO/IEC 13818-2 section 7.6 */
static void motion_compensation(MBA, macroblock_type, motion_type, PMV,
motion_vertical_field_select, dmvector, stwtype, dct_type)
int MBA;
int macroblock_type;
int motion_type;
int PMV[2][2][2];
int motion_vertical_field_select[2][2];
int dmvector[2];
int stwtype;
int dct_type;
{
int bx, by;
int comp;
 
/* derive current macroblock position within picture */
/* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
bx = 16*(MBA%mb_width);
by = 16*(MBA/mb_width);
 
/* motion compensation */
if (!(macroblock_type & MACROBLOCK_INTRA))
form_predictions(bx,by,macroblock_type,motion_type,PMV,
motion_vertical_field_select,dmvector,stwtype);
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
ld = &base;
 
/* copy or add block data into picture */
for (comp=0; comp<block_count; comp++)
{
/* SCALABILITY: SNR */
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
the two a layers */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
Sum_Block(comp); /* add SNR enhancement layer data to base layer */
 
/* MPEG-2 saturation and mismatch control */
/* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
Saturate(ld->block[comp]);
 
/* ISO/IEC 13818-2 section Annex A: inverse DCT */
if (Reference_IDCT_Flag)
Reference_IDCT(ld->block[comp]);
else
Fast_IDCT(ld->block[comp]);
/* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
}
 
}
 
 
 
/* ISO/IEC 13818-2 section 7.6.6 */
static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
motion_vertical_field_select, stwtype, macroblock_type)
int dc_dct_pred[3];
int PMV[2][2][2];
int *motion_type;
int motion_vertical_field_select[2][2];
int *stwtype;
int *macroblock_type;
{
int comp;
/* SCALABILITY: Data Paritioning */
if (base.scalable_mode==SC_DP)
ld = &base;
 
for (comp=0; comp<block_count; comp++)
Clear_Block(comp);
 
/* reset intra_dc predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
 
/* reset motion vector predictors */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
if (picture_coding_type==P_TYPE)
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
 
/* derive motion_type */
if (picture_structure==FRAME_PICTURE)
*motion_type = MC_FRAME;
else
{
*motion_type = MC_FIELD;
 
/* predict from field of same parity */
/* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
picture */
motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
(picture_structure==BOTTOM_FIELD);
}
 
/* skipped I are spatial-only predicted, */
/* skipped P and B are temporal-only predicted */
/* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
*stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
 
/* IMPLEMENTATION: clear MACROBLOCK_INTRA */
*macroblock_type&= ~MACROBLOCK_INTRA;
 
}
 
 
/* return==-1 means go to next picture */
/* the expression "start of slice" is used throughout the normative
body of the MPEG specification */
static int start_of_slice(MBAmax, MBA, MBAinc,
dc_dct_pred, PMV)
int MBAmax;
int *MBA;
int *MBAinc;
int dc_dct_pred[3];
int PMV[2][2][2];
{
unsigned int code;
int slice_vert_pos_ext;
 
ld = &base;
 
Fault_Flag = 0;
 
next_start_code();
code = Show_Bits(32);
 
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
cprintf("start_of_slice(): Premature end of picture\n");
 
return(-1); /* trigger: go to next picture */
}
 
Flush_Buffer32();
 
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
 
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
{
ld = &enhan;
next_start_code();
code = Show_Bits(32);
 
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
cprintf("DP: Premature end of picture\n");
return(-1); /* trigger: go to next picture */
}
 
Flush_Buffer32();
 
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
 
if (base.priority_breakpoint!=1)
ld = &base;
}
 
/* decode macroblock address increment */
*MBAinc = Get_macroblock_address_increment();
 
if (Fault_Flag)
{
cprintf("start_of_slice(): MBAinc unsuccessful\n");
return(0); /* trigger: go to next slice */
}
 
/* set current location */
/* NOTE: the arithmetic used to derive macroblock_address below is
* equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
*/
*MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
*MBAinc = 1; /* first macroblock in slice: not skipped */
 
/* reset all DC coefficient and motion vector predictors */
/* reset all DC coefficient and motion vector predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
 
/* successfull: trigger decode macroblocks in slice */
return(1);
}
 
 
/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
static int decode_macroblock(macroblock_type, stwtype, stwclass,
motion_type, dct_type, PMV, dc_dct_pred,
motion_vertical_field_select, dmvector)
int *macroblock_type;
int *stwtype;
int *stwclass;
int *motion_type;
int *dct_type;
int PMV[2][2][2];
int dc_dct_pred[3];
int motion_vertical_field_select[2][2];
int dmvector[2];
{
/* locals */
int quantizer_scale_code;
int comp;
 
int motion_vector_count;
int mv_format;
int dmv;
int mvscale;
int coded_block_pattern;
 
/* SCALABILITY: Data Patitioning */
if (base.scalable_mode==SC_DP)
{
if (base.priority_breakpoint<=2)
ld = &enhan;
else
ld = &base;
}
 
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
macroblock_modes(macroblock_type, stwtype, stwclass,
motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
dct_type);
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
if (*macroblock_type & MACROBLOCK_QUANT)
{
quantizer_scale_code = Get_Bits(5);
 
#ifdef TRACE
if (Trace_Flag)
{
cprintf("quantiser_scale_code (");
Print_Bits(quantizer_scale_code,5,5);
cprintf("): %d\n",quantizer_scale_code);
}
#endif /* TRACE */
 
/* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
if (ld->MPEG2_Flag)
ld->quantizer_scale =
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
: (quantizer_scale_code << 1);
else
ld->quantizer_scale = quantizer_scale_code;
 
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
/* make sure base.quantizer_scale is valid */
base.quantizer_scale = ld->quantizer_scale;
}
 
/* motion vectors */
 
 
/* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
 
/* decode forward motion vectors */
if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
|| ((*macroblock_type & MACROBLOCK_INTRA)
&& concealment_motion_vectors))
{
if (ld->MPEG2_Flag)
motion_vectors(PMV,dmvector,motion_vertical_field_select,
0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
dmv,mvscale);
else
motion_vector(PMV[0][0],dmvector,
forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
}
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
/* decode backward motion vectors */
if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
{
if (ld->MPEG2_Flag)
motion_vectors(PMV,dmvector,motion_vertical_field_select,
1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
mvscale);
else
motion_vector(PMV[0][1],dmvector,
backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
}
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
Flush_Buffer(1); /* remove marker_bit */
 
if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
ld = &enhan;
 
/* macroblock_pattern */
/* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
if (*macroblock_type & MACROBLOCK_PATTERN)
{
coded_block_pattern = Get_coded_block_pattern();
 
if (chroma_format==CHROMA422)
{
/* coded_block_pattern_1 */
coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
 
#ifdef TRACE
if (Trace_Flag)
{
cprintf("coded_block_pattern_1: ");
Print_Bits(coded_block_pattern,2,2);
cprintf(" (%d)\n",coded_block_pattern&3);
}
#endif /* TRACE */
}
else if (chroma_format==CHROMA444)
{
/* coded_block_pattern_2 */
coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
 
#ifdef TRACE
if (Trace_Flag)
{
cprintf("coded_block_pattern_2: ");
Print_Bits(coded_block_pattern,6,6);
cprintf(" (%d)\n",coded_block_pattern&63);
}
#endif /* TRACE */
}
}
else
coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
(1<<block_count)-1 : 0;
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
 
/* decode blocks */
for (comp=0; comp<block_count; comp++)
{
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
ld = &base;
 
Clear_Block(comp);
 
if (coded_block_pattern & (1<<(block_count-1-comp)))
{
if (*macroblock_type & MACROBLOCK_INTRA)
{
if (ld->MPEG2_Flag)
Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
else
Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
}
else
{
if (ld->MPEG2_Flag)
Decode_MPEG2_Non_Intra_Block(comp);
else
Decode_MPEG1_Non_Intra_Block(comp);
}
 
if (Fault_Flag) return(0); /* trigger: go to next slice */
}
}
 
if(picture_coding_type==D_TYPE)
{
/* remove end_of_macroblock (always 1, prevents startcode emulation) */
/* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
marker_bit("D picture end_of_macroblock bit");
}
 
/* reset intra_dc predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
if (!(*macroblock_type & MACROBLOCK_INTRA))
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
 
/* reset motion vector predictors */
if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
{
/* intra mb without concealment motion vectors */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
}
 
/* special "No_MC" macroblock_type case */
/* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
if ((picture_coding_type==P_TYPE)
&& !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
{
/* non-intra mb without forward mv in a P picture */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
 
/* derive motion_type */
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
if (picture_structure==FRAME_PICTURE)
*motion_type = MC_FRAME;
else
{
*motion_type = MC_FIELD;
/* predict from field of same parity */
motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
}
}
 
if (*stwclass==4)
{
/* purely spatially predicted macroblock */
/* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
}
 
/* successfully decoded macroblock */
return(1);
 
} /* decode_macroblock */
 
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/gethdr.c
0,0 → 1,1074
/* gethdr.c, header decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "config.h"
#include "global.h"
 
 
/* private prototypes */
static void sequence_header _ANSI_ARGS_((void));
static void group_of_pictures_header _ANSI_ARGS_((void));
static void picture_header _ANSI_ARGS_((void));
static void extension_and_user_data _ANSI_ARGS_((void));
static void sequence_extension _ANSI_ARGS_((void));
static void sequence_display_extension _ANSI_ARGS_((void));
static void quant_matrix_extension _ANSI_ARGS_((void));
static void sequence_scalable_extension _ANSI_ARGS_((void));
static void picture_display_extension _ANSI_ARGS_((void));
static void picture_coding_extension _ANSI_ARGS_((void));
static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
static int extra_bit_information _ANSI_ARGS_((void));
static void copyright_extension _ANSI_ARGS_((void));
static void user_data _ANSI_ARGS_((void));
static void user_data _ANSI_ARGS_((void));
 
 
 
 
/* introduced in September 1995 to assist spatial scalable decoding */
static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
/* private variables */
static int Temporal_Reference_Base = 0;
static int True_Framenum_max = -1;
static int Temporal_Reference_GOP_Reset = 0;
 
#define RESERVED -1
static double frame_rate_Table[16] =
{
0.0,
((23.0*1000.0)/1001.0),
24.0,
25.0,
((30.0*1000.0)/1001.0),
30.0,
50.0,
((60.0*1000.0)/1001.0),
60.0,
RESERVED,
RESERVED,
RESERVED,
RESERVED,
RESERVED,
RESERVED,
RESERVED
};
 
/*
* decode headers from one input stream
* until an End of Sequence or picture start code
* is found
*/
int Get_Hdr()
{
unsigned int code;
 
for (;;)
{
/* look for next_start_code */
next_start_code();
code = Get_Bits32();
switch (code)
{
case SEQUENCE_HEADER_CODE:
sequence_header();
break;
case GROUP_START_CODE:
group_of_pictures_header();
break;
case PICTURE_START_CODE:
picture_header();
return 1;
break;
case SEQUENCE_END_CODE:
return 0;
break;
default:
if (!Quiet_Flag)
cprintf("Unexpected next_start_code %08x (ignored)\n",code);
break;
}
}
}
 
 
/* align to start of next next_start_code */
 
void next_start_code()
{
/* byte align */
Flush_Buffer(ld->Incnt&7);
while (Show_Bits(24)!=0x01L)
Flush_Buffer(8);
}
 
 
/* decode sequence header */
 
static void sequence_header()
{
int i;
int pos;
 
pos = ld->Bitcnt;
horizontal_size = Get_Bits(12);
vertical_size = Get_Bits(12);
aspect_ratio_information = Get_Bits(4);
frame_rate_code = Get_Bits(4);
bit_rate_value = Get_Bits(18);
marker_bit("sequence_header()");
vbv_buffer_size = Get_Bits(10);
constrained_parameters_flag = Get_Bits(1);
 
if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
else
{
for (i=0; i<64; i++)
ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
}
 
if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
else
{
for (i=0; i<64; i++)
ld->non_intra_quantizer_matrix[i] = 16;
}
 
/* copy luminance to chrominance matrices */
for (i=0; i<64; i++)
{
ld->chroma_intra_quantizer_matrix[i] =
ld->intra_quantizer_matrix[i];
 
ld->chroma_non_intra_quantizer_matrix[i] =
ld->non_intra_quantizer_matrix[i];
}
 
#ifdef VERBOSE
if (Verbose_Flag > NO_LAYER)
{
cprintf("sequence header (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag > SEQUENCE_LAYER)
{
cprintf(" horizontal_size=%d\n",horizontal_size);
cprintf(" vertical_size=%d\n",vertical_size);
cprintf(" aspect_ratio_information=%d\n",aspect_ratio_information);
cprintf(" frame_rate_code=%d",frame_rate_code);
cprintf(" bit_rate_value=%d\n",bit_rate_value);
cprintf(" vbv_buffer_size=%d\n",vbv_buffer_size);
cprintf(" constrained_parameters_flag=%d\n",constrained_parameters_flag);
cprintf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix);
cprintf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_header++;
#endif /* VERIFY */
 
extension_and_user_data();
}
 
 
 
/* decode group of pictures header */
/* ISO/IEC 13818-2 section 6.2.2.6 */
static void group_of_pictures_header()
{
int pos;
 
if (ld == &base)
{
Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
Temporal_Reference_GOP_Reset = 1;
}
pos = ld->Bitcnt;
drop_flag = Get_Bits(1);
hour = Get_Bits(5);
minute = Get_Bits(6);
marker_bit("group_of_pictures_header()");
sec = Get_Bits(6);
frame = Get_Bits(6);
closed_gop = Get_Bits(1);
broken_link = Get_Bits(1);
 
#ifdef VERBOSE
if (Verbose_Flag > NO_LAYER)
{
cprintf("group of pictures (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag > SEQUENCE_LAYER)
{
cprintf(" drop_flag=%d\n",drop_flag);
cprintf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);
cprintf(" closed_gop=%d\n",closed_gop);
cprintf(" broken_link=%d\n",broken_link);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_group_of_pictures_header++;
#endif /* VERIFY */
 
extension_and_user_data();
 
}
 
 
/* decode picture header */
 
/* ISO/IEC 13818-2 section 6.2.3 */
static void picture_header()
{
int pos;
int Extra_Information_Byte_Count;
 
/* unless later overwritten by picture_spatial_scalable_extension() */
ld->pict_scal = 0;
pos = ld->Bitcnt;
temporal_reference = Get_Bits(10);
picture_coding_type = Get_Bits(3);
vbv_delay = Get_Bits(16);
 
if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
{
full_pel_forward_vector = Get_Bits(1);
forward_f_code = Get_Bits(3);
}
if (picture_coding_type==B_TYPE)
{
full_pel_backward_vector = Get_Bits(1);
backward_f_code = Get_Bits(3);
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("picture header (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
cprintf(" temporal_reference=%d\n",temporal_reference);
cprintf(" picture_coding_type=%d\n",picture_coding_type);
cprintf(" vbv_delay=%d\n",vbv_delay);
if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
{
cprintf(" full_pel_forward_vector=%d\n",full_pel_forward_vector);
cprintf(" forward_f_code =%d\n",forward_f_code);
}
if (picture_coding_type==B_TYPE)
{
cprintf(" full_pel_backward_vector=%d\n",full_pel_backward_vector);
cprintf(" backward_f_code =%d\n",backward_f_code);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_header++;
#endif /* VERIFY */
 
Extra_Information_Byte_Count =
extra_bit_information();
extension_and_user_data();
 
/* update tracking information used to assist spatial scalability */
Update_Temporal_Reference_Tacking_Data();
}
 
/* decode slice header */
 
/* ISO/IEC 13818-2 section 6.2.4 */
int slice_header()
{
int slice_vertical_position_extension;
int quantizer_scale_code;
int pos;
int slice_picture_id_enable = 0;
int slice_picture_id = 0;
int extra_information_slice = 0;
 
pos = ld->Bitcnt;
 
slice_vertical_position_extension =
(ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
 
if (ld->scalable_mode==SC_DP)
ld->priority_breakpoint = Get_Bits(7);
 
quantizer_scale_code = Get_Bits(5);
ld->quantizer_scale =
ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
 
/* slice_id introduced in March 1995 as part of the video corridendum
(after the IS was drafted in November 1994) */
if (Get_Bits(1))
{
ld->intra_slice = Get_Bits(1);
 
slice_picture_id_enable = Get_Bits(1);
slice_picture_id = Get_Bits(6);
 
extra_information_slice = extra_bit_information();
}
else
ld->intra_slice = 0;
 
#ifdef VERBOSE
if (Verbose_Flag>PICTURE_LAYER)
{
cprintf("slice header (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SLICE_LAYER)
{
if (ld->MPEG2_Flag && vertical_size>2800)
cprintf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension);
if (ld->scalable_mode==SC_DP)
cprintf(" priority_breakpoint=%d\n",ld->priority_breakpoint);
 
cprintf(" quantizer_scale_code=%d\n",quantizer_scale_code);
 
cprintf(" slice_picture_id_enable = %d\n", slice_picture_id_enable);
 
if(slice_picture_id_enable)
cprintf(" slice_picture_id = %d\n", slice_picture_id);
 
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_slice_header++;
#endif /* VERIFY */
 
 
return slice_vertical_position_extension;
}
 
 
/* decode extension and user data */
/* ISO/IEC 13818-2 section 6.2.2.2 */
static void extension_and_user_data()
{
int code,ext_ID;
 
next_start_code();
 
while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
{
if (code==EXTENSION_START_CODE)
{
Flush_Buffer32();
ext_ID = Get_Bits(4);
switch (ext_ID)
{
case SEQUENCE_EXTENSION_ID:
sequence_extension();
break;
case SEQUENCE_DISPLAY_EXTENSION_ID:
sequence_display_extension();
break;
case QUANT_MATRIX_EXTENSION_ID:
quant_matrix_extension();
break;
case SEQUENCE_SCALABLE_EXTENSION_ID:
sequence_scalable_extension();
break;
case PICTURE_DISPLAY_EXTENSION_ID:
picture_display_extension();
break;
case PICTURE_CODING_EXTENSION_ID:
picture_coding_extension();
break;
case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
picture_spatial_scalable_extension();
break;
case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
picture_temporal_scalable_extension();
break;
case COPYRIGHT_EXTENSION_ID:
copyright_extension();
break;
default:
cprintf("reserved extension start code ID %d\n",ext_ID);
break;
}
next_start_code();
}
else
{
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
cprintf("user data\n");
#endif /* VERBOSE */
Flush_Buffer32();
user_data();
}
}
}
 
 
/* decode sequence extension */
 
/* ISO/IEC 13818-2 section 6.2.2.3 */
static void sequence_extension()
{
int horizontal_size_extension;
int vertical_size_extension;
int bit_rate_extension;
int vbv_buffer_size_extension;
 
/* derive bit position for trace */
#ifdef VERBOSE
pos = ld->Bitcnt;
#endif
 
ld->MPEG2_Flag = 1;
 
ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
profile_and_level_indication = Get_Bits(8);
progressive_sequence = Get_Bits(1);
chroma_format = Get_Bits(2);
horizontal_size_extension = Get_Bits(2);
vertical_size_extension = Get_Bits(2);
bit_rate_extension = Get_Bits(12);
marker_bit("sequence_extension");
vbv_buffer_size_extension = Get_Bits(8);
low_delay = Get_Bits(1);
frame_rate_extension_n = Get_Bits(2);
frame_rate_extension_d = Get_Bits(5);
 
frame_rate = frame_rate_Table[frame_rate_code] *
((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
 
/* special case for 422 profile & level must be made */
if((profile_and_level_indication>>7) & 1)
{ /* escape bit of profile_and_level_indication set */
/* 4:2:2 Profile @ Main Level */
if((profile_and_level_indication&15)==5)
{
profile = PROFILE_422;
level = MAIN_LEVEL;
}
}
else
{
profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
level = profile_and_level_indication & 0xF; /* Level is lower nibble */
}
horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
 
 
/* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
* both the original bit_rate_value parsed in sequence_header() and
* the optional bit_rate_extension in sequence_extension_header().
* However, we use it for bitstream verification purposes.
*/
 
bit_rate_value += (bit_rate_extension << 18);
bit_rate = ((double) bit_rate_value) * 400.0;
vbv_buffer_size += (vbv_buffer_size_extension << 10);
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("sequence extension (byte %d)\n",(pos>>3)-4);
 
if (Verbose_Flag>SEQUENCE_LAYER)
{
cprintf(" profile_and_level_indication=%d\n",profile_and_level_indication);
 
if (profile_and_level_indication<128)
{
cprintf(" profile=%d, level=%d\n",profile,level);
}
 
cprintf(" progressive_sequence=%d\n",progressive_sequence);
cprintf(" chroma_format=%d\n",chroma_format);
cprintf(" horizontal_size_extension=%d\n",horizontal_size_extension);
cprintf(" vertical_size_extension=%d\n",vertical_size_extension);
cprintf(" bit_rate_extension=%d\n",bit_rate_extension);
cprintf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension);
cprintf(" low_delay=%d\n",low_delay);
cprintf(" frame_rate_extension_n=%d\n",frame_rate_extension_n);
cprintf(" frame_rate_extension_d=%d\n",frame_rate_extension_d);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_extension++;
#endif /* VERIFY */
 
 
}
 
 
/* decode sequence display extension */
 
static void sequence_display_extension()
{
int pos;
 
pos = ld->Bitcnt;
video_format = Get_Bits(3);
color_description = Get_Bits(1);
 
if (color_description)
{
color_primaries = Get_Bits(8);
transfer_characteristics = Get_Bits(8);
matrix_coefficients = Get_Bits(8);
}
 
display_horizontal_size = Get_Bits(14);
marker_bit("sequence_display_extension");
display_vertical_size = Get_Bits(14);
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("sequence display extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
 
cprintf(" video_format=%d\n",video_format);
cprintf(" color_description=%d\n",color_description);
 
if (color_description)
{
cprintf(" color_primaries=%d\n",color_primaries);
cprintf(" transfer_characteristics=%d\n",transfer_characteristics);
cprintf(" matrix_coefficients=%d\n",matrix_coefficients);
}
cprintf(" display_horizontal_size=%d\n",display_horizontal_size);
cprintf(" display_vertical_size=%d\n",display_vertical_size);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_display_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode quant matrix entension */
/* ISO/IEC 13818-2 section 6.2.3.2 */
static void quant_matrix_extension()
{
int i;
int pos;
 
pos = ld->Bitcnt;
 
if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
{
ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= Get_Bits(8);
}
}
 
if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
{
ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
= Get_Bits(8);
}
}
 
if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
 
if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
{
for (i=0; i<64; i++)
ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("quant matrix extension (byte %d)\n",(pos>>3)-4);
cprintf(" load_intra_quantizer_matrix=%d\n",
ld->load_intra_quantizer_matrix);
cprintf(" load_non_intra_quantizer_matrix=%d\n",
ld->load_non_intra_quantizer_matrix);
cprintf(" load_chroma_intra_quantizer_matrix=%d\n",
ld->load_chroma_intra_quantizer_matrix);
cprintf(" load_chroma_non_intra_quantizer_matrix=%d\n",
ld->load_chroma_non_intra_quantizer_matrix);
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_quant_matrix_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode sequence scalable extension */
/* ISO/IEC 13818-2 section 6.2.2.5 */
static void sequence_scalable_extension()
{
int pos;
 
pos = ld->Bitcnt;
 
/* values (without the +1 offset) of scalable_mode are defined in
Table 6-10 of ISO/IEC 13818-2 */
ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
 
layer_id = Get_Bits(4);
 
if (ld->scalable_mode==SC_SPAT)
{
lower_layer_prediction_horizontal_size = Get_Bits(14);
marker_bit("sequence_scalable_extension()");
lower_layer_prediction_vertical_size = Get_Bits(14);
horizontal_subsampling_factor_m = Get_Bits(5);
horizontal_subsampling_factor_n = Get_Bits(5);
vertical_subsampling_factor_m = Get_Bits(5);
vertical_subsampling_factor_n = Get_Bits(5);
}
 
if (ld->scalable_mode==SC_TEMP)
Error("temporal scalability not implemented\n");
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("sequence scalable extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
cprintf(" scalable_mode=%d\n",ld->scalable_mode-1);
cprintf(" layer_id=%d\n",layer_id);
if (ld->scalable_mode==SC_SPAT)
{
cprintf(" lower_layer_prediction_horiontal_size=%d\n",
lower_layer_prediction_horizontal_size);
cprintf(" lower_layer_prediction_vertical_size=%d\n",
lower_layer_prediction_vertical_size);
cprintf(" horizontal_subsampling_factor_m=%d\n",
horizontal_subsampling_factor_m);
cprintf(" horizontal_subsampling_factor_n=%d\n",
horizontal_subsampling_factor_n);
cprintf(" vertical_subsampling_factor_m=%d\n",
vertical_subsampling_factor_m);
cprintf(" vertical_subsampling_factor_n=%d\n",
vertical_subsampling_factor_n);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_sequence_scalable_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode picture display extension */
/* ISO/IEC 13818-2 section 6.2.3.3. */
static void picture_display_extension()
{
int i;
int number_of_frame_center_offsets;
int pos;
 
pos = ld->Bitcnt;
/* based on ISO/IEC 13818-2 section 6.3.12
(November 1994) Picture display extensions */
 
/* derive number_of_frame_center_offsets */
if(progressive_sequence)
{
if(repeat_first_field)
{
if(top_field_first)
number_of_frame_center_offsets = 3;
else
number_of_frame_center_offsets = 2;
}
else
{
number_of_frame_center_offsets = 1;
}
}
else
{
if(picture_structure!=FRAME_PICTURE)
{
number_of_frame_center_offsets = 1;
}
else
{
if(repeat_first_field)
number_of_frame_center_offsets = 3;
else
number_of_frame_center_offsets = 2;
}
}
 
 
/* now parse */
for (i=0; i<number_of_frame_center_offsets; i++)
{
frame_center_horizontal_offset[i] = Get_Bits(16);
marker_bit("picture_display_extension, first marker bit");
frame_center_vertical_offset[i] = Get_Bits(16);
marker_bit("picture_display_extension, second marker bit");
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("picture display extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
 
for (i=0; i<number_of_frame_center_offsets; i++)
{
cprintf(" frame_center_horizontal_offset[%d]=%d\n",i,
frame_center_horizontal_offset[i]);
cprintf(" frame_center_vertical_offset[%d]=%d\n",i,
frame_center_vertical_offset[i]);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_display_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode picture coding extension */
static void picture_coding_extension()
{
int pos;
 
pos = ld->Bitcnt;
 
f_code[0][0] = Get_Bits(4);
f_code[0][1] = Get_Bits(4);
f_code[1][0] = Get_Bits(4);
f_code[1][1] = Get_Bits(4);
 
intra_dc_precision = Get_Bits(2);
picture_structure = Get_Bits(2);
top_field_first = Get_Bits(1);
frame_pred_frame_dct = Get_Bits(1);
concealment_motion_vectors = Get_Bits(1);
ld->q_scale_type = Get_Bits(1);
intra_vlc_format = Get_Bits(1);
ld->alternate_scan = Get_Bits(1);
repeat_first_field = Get_Bits(1);
chroma_420_type = Get_Bits(1);
progressive_frame = Get_Bits(1);
composite_display_flag = Get_Bits(1);
 
if (composite_display_flag)
{
v_axis = Get_Bits(1);
field_sequence = Get_Bits(3);
sub_carrier = Get_Bits(1);
burst_amplitude = Get_Bits(7);
sub_carrier_phase = Get_Bits(8);
}
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("picture coding extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
cprintf(" forward horizontal f_code=%d\n", f_code[0][0]);
cprintf(" forward vertical f_code=%d\n", f_code[0][1]);
cprintf(" backward horizontal f_code=%d\n", f_code[1][0]);
cprintf(" backward_vertical f_code=%d\n", f_code[1][1]);
cprintf(" intra_dc_precision=%d\n",intra_dc_precision);
cprintf(" picture_structure=%d\n",picture_structure);
cprintf(" top_field_first=%d\n",top_field_first);
cprintf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct);
cprintf(" concealment_motion_vectors=%d\n",concealment_motion_vectors);
cprintf(" q_scale_type=%d\n",ld->q_scale_type);
cprintf(" intra_vlc_format=%d\n",intra_vlc_format);
cprintf(" alternate_scan=%d\n",ld->alternate_scan);
cprintf(" repeat_first_field=%d\n",repeat_first_field);
cprintf(" chroma_420_type=%d\n",chroma_420_type);
cprintf(" progressive_frame=%d\n",progressive_frame);
cprintf(" composite_display_flag=%d\n",composite_display_flag);
 
if (composite_display_flag)
{
cprintf(" v_axis=%d\n",v_axis);
cprintf(" field_sequence=%d\n",field_sequence);
cprintf(" sub_carrier=%d\n",sub_carrier);
cprintf(" burst_amplitude=%d\n",burst_amplitude);
cprintf(" sub_carrier_phase=%d\n",sub_carrier_phase);
}
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_coding_extension++;
#endif /* VERIFY */
}
 
 
/* decode picture spatial scalable extension */
/* ISO/IEC 13818-2 section 6.2.3.5. */
static void picture_spatial_scalable_extension()
{
int pos;
 
pos = ld->Bitcnt;
 
ld->pict_scal = 1; /* use spatial scalability in this picture */
 
lower_layer_temporal_reference = Get_Bits(10);
marker_bit("picture_spatial_scalable_extension(), first marker bit");
lower_layer_horizontal_offset = Get_Bits(15);
if (lower_layer_horizontal_offset>=16384)
lower_layer_horizontal_offset-= 32768;
marker_bit("picture_spatial_scalable_extension(), second marker bit");
lower_layer_vertical_offset = Get_Bits(15);
if (lower_layer_vertical_offset>=16384)
lower_layer_vertical_offset-= 32768;
spatial_temporal_weight_code_table_index = Get_Bits(2);
lower_layer_progressive_frame = Get_Bits(1);
lower_layer_deinterlaced_field_select = Get_Bits(1);
 
#ifdef VERBOSE
if (Verbose_Flag>NO_LAYER)
{
cprintf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
cprintf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference);
cprintf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset);
cprintf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset);
cprintf(" spatial_temporal_weight_code_table_index=%d\n",
spatial_temporal_weight_code_table_index);
cprintf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame);
cprintf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select);
}
}
#endif /* VERBOSE */
 
#ifdef VERIFY
verify_picture_spatial_scalable_extension++;
#endif /* VERIFY */
 
}
 
 
/* decode picture temporal scalable extension
*
* not implemented
*/
/* ISO/IEC 13818-2 section 6.2.3.4. */
static void picture_temporal_scalable_extension()
{
Error("temporal scalability not supported\n");
 
#ifdef VERIFY
verify_picture_temporal_scalable_extension++;
#endif /* VERIFY */
}
 
 
/* decode extra bit information */
/* ISO/IEC 13818-2 section 6.2.3.4. */
static int extra_bit_information()
{
int Byte_Count = 0;
 
while (Get_Bits1())
{
Flush_Buffer(8);
Byte_Count++;
}
 
return(Byte_Count);
}
 
 
 
/* ISO/IEC 13818-2 section 5.3 */
/* Purpose: this function is mainly designed to aid in bitstream conformance
testing. A simple Flush_Buffer(1) would do */
void marker_bit(text)
char *text;
{
int marker;
 
marker = Get_Bits(1);
 
#ifdef VERIFY
if(!marker)
cprintf("ERROR: %s--marker_bit set to 0",text);
#endif
}
 
 
/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
static void user_data()
{
/* skip ahead to the next start code */
next_start_code();
}
 
 
 
/* Copyright extension */
/* ISO/IEC 13818-2 section 6.2.3.6. */
/* (header added in November, 1994 to the IS document) */
 
 
static void copyright_extension()
{
int pos;
int reserved_data;
 
pos = ld->Bitcnt;
 
copyright_flag = Get_Bits(1);
copyright_identifier = Get_Bits(8);
original_or_copy = Get_Bits(1);
/* reserved */
reserved_data = Get_Bits(7);
 
marker_bit("copyright_extension(), first marker bit");
copyright_number_1 = Get_Bits(20);
marker_bit("copyright_extension(), second marker bit");
copyright_number_2 = Get_Bits(22);
marker_bit("copyright_extension(), third marker bit");
copyright_number_3 = Get_Bits(22);
 
if(Verbose_Flag>NO_LAYER)
{
cprintf("copyright_extension (byte %d)\n",(pos>>3)-4);
if (Verbose_Flag>SEQUENCE_LAYER)
{
cprintf(" copyright_flag =%d\n",copyright_flag);
cprintf(" copyright_identifier=%d\n",copyright_identifier);
cprintf(" original_or_copy = %d (original=1, copy=0)\n",
original_or_copy);
cprintf(" copyright_number_1=%d\n",copyright_number_1);
cprintf(" copyright_number_2=%d\n",copyright_number_2);
cprintf(" copyright_number_3=%d\n",copyright_number_3);
}
}
 
#ifdef VERIFY
verify_copyright_extension++;
#endif /* VERIFY */
}
 
 
 
/* introduced in September 1995 to assist Spatial Scalability */
static void Update_Temporal_Reference_Tacking_Data()
{
static int temporal_reference_wrap = 0;
static int temporal_reference_old = 0;
 
if (ld == &base) /* *CH* */
{
if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
/* check first field of */
{
/* non-B-frame */
if (temporal_reference_wrap)
{/* wrap occured at previous I- or P-frame */
/* now all intervening B-frames which could
still have high temporal_reference values are done */
Temporal_Reference_Base += 1024;
temporal_reference_wrap = 0;
}
/* distinguish from a reset */
if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
temporal_reference_old = temporal_reference;
Temporal_Reference_GOP_Reset = 0;
}
 
True_Framenum = Temporal_Reference_Base + temporal_reference;
/* temporary wrap of TR at 1024 for M frames */
if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
True_Framenum += 1024;
 
True_Framenum_max = (True_Framenum > True_Framenum_max) ?
True_Framenum : True_Framenum_max;
}
}
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/gvideo.c
0,0 → 1,51
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "drivers/glib.h"
 
#include "fsf_contract.h"
 
#include "config.h"
#include "global.h"
 
extern void *start_file;
extern void *end_file;
 
int Init_Mpeg_Decoder(void *start,void *end);
int Decode_Bitstream();
 
void *mpeg2decoder(void *arg)
{
int init = 1;
Init_Mpeg_Decoder(start_file,end_file);
while(1) {
if (init == 1) {
Decode_Bitstream();
}
 
}
return 0;
 
}
 
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/idctref.c
0,0 → 1,108
/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
* direct matrix multiply) Inverse Discrete Cosine Transform
*/
 
 
/* Here we use math.h to generate constants. Compiler results may
vary a little */
 
#include <math.h>
 
#include "config.h"
 
#ifndef PI
# ifdef M_PI
# define PI M_PI
# else
# define PI 3.14159265358979323846
# endif
#endif
 
/* global declarations */
void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
void Reference_IDCT _ANSI_ARGS_((short *block));
 
/* private data */
 
/* cosine transform matrix for 8x1 IDCT */
static double c[8][8];
 
/* initialize DCT coefficient matrix */
 
void Initialize_Reference_IDCT()
{
int freq, time;
double scale;
 
for (freq=0; freq < 8; freq++)
{
scale = (freq == 0) ? sqrt(0.125) : 0.5;
for (time=0; time<8; time++)
c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
}
}
 
/* perform IDCT matrix multiply for 8x8 coefficient block */
 
void Reference_IDCT(block)
short *block;
{
int i, j, k, v;
double partial_product;
double tmp[64];
 
for (i=0; i<8; i++)
for (j=0; j<8; j++)
{
partial_product = 0.0;
 
for (k=0; k<8; k++)
partial_product+= c[k][j]*block[8*i+k];
 
tmp[8*i+j] = partial_product;
}
 
/* Transpose operation is integrated into address mapping by switching
loop order of i and j */
 
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
partial_product = 0.0;
 
for (k=0; k<8; k++)
partial_product+= c[k][i]*tmp[8*k+j];
 
v = (int) floor(partial_product+0.5);
block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
}
}
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/idct.c
0,0 → 1,211
/* idct.c, inverse fast discrete cosine transform */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/**********************************************************/
/* inverse two dimensional DCT, Chen-Wang algorithm */
/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
/* 32-bit integer arithmetic (8 bit coefficients) */
/* 11 mults, 29 adds per DCT */
/* sE, 18.8.91 */
/**********************************************************/
/* coefficients extended to 12 bit for IEEE1180-1990 */
/* compliance sE, 2.1.94 */
/**********************************************************/
 
/* this code assumes >> to be a two's-complement arithmetic */
/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
 
#include "config.h"
 
#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
 
/* global declarations */
void Initialize_Fast_IDCT _ANSI_ARGS_((void));
void Fast_IDCT _ANSI_ARGS_((short *block));
 
/* private data */
static short iclip[1024]; /* clipping table */
static short *iclp;
 
/* private prototypes */
static void idctrow _ANSI_ARGS_((short *blk));
static void idctcol _ANSI_ARGS_((short *blk));
 
/* row (horizontal) IDCT
*
* 7 pi 1
* dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
* l=0 8 2
*
* where: c[0] = 128
* c[1..7] = 128*sqrt(2)
*/
 
static void idctrow(blk)
short *blk;
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
 
/* shortcut */
if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
(x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
{
blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
return;
}
 
x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
 
/* first stage */
x8 = W7*(x4+x5);
x4 = x8 + (W1-W7)*x4;
x5 = x8 - (W1+W7)*x5;
x8 = W3*(x6+x7);
x6 = x8 - (W3-W5)*x6;
x7 = x8 - (W3+W5)*x7;
/* second stage */
x8 = x0 + x1;
x0 -= x1;
x1 = W6*(x3+x2);
x2 = x1 - (W2+W6)*x2;
x3 = x1 + (W2-W6)*x3;
x1 = x4 + x6;
x4 -= x6;
x6 = x5 + x7;
x5 -= x7;
/* third stage */
x7 = x8 + x3;
x8 -= x3;
x3 = x0 + x2;
x0 -= x2;
x2 = (181*(x4+x5)+128)>>8;
x4 = (181*(x4-x5)+128)>>8;
/* fourth stage */
blk[0] = (x7+x1)>>8;
blk[1] = (x3+x2)>>8;
blk[2] = (x0+x4)>>8;
blk[3] = (x8+x6)>>8;
blk[4] = (x8-x6)>>8;
blk[5] = (x0-x4)>>8;
blk[6] = (x3-x2)>>8;
blk[7] = (x7-x1)>>8;
}
 
/* column (vertical) IDCT
*
* 7 pi 1
* dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
* l=0 8 2
*
* where: c[0] = 1/1024
* c[1..7] = (1/1024)*sqrt(2)
*/
static void idctcol(blk)
short *blk;
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
 
/* shortcut */
if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
(x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
{
blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
iclp[(blk[8*0]+32)>>6];
return;
}
 
x0 = (blk[8*0]<<8) + 8192;
 
/* first stage */
x8 = W7*(x4+x5) + 4;
x4 = (x8+(W1-W7)*x4)>>3;
x5 = (x8-(W1+W7)*x5)>>3;
x8 = W3*(x6+x7) + 4;
x6 = (x8-(W3-W5)*x6)>>3;
x7 = (x8-(W3+W5)*x7)>>3;
/* second stage */
x8 = x0 + x1;
x0 -= x1;
x1 = W6*(x3+x2) + 4;
x2 = (x1-(W2+W6)*x2)>>3;
x3 = (x1+(W2-W6)*x3)>>3;
x1 = x4 + x6;
x4 -= x6;
x6 = x5 + x7;
x5 -= x7;
/* third stage */
x7 = x8 + x3;
x8 -= x3;
x3 = x0 + x2;
x0 -= x2;
x2 = (181*(x4+x5)+128)>>8;
x4 = (181*(x4-x5)+128)>>8;
/* fourth stage */
blk[8*0] = iclp[(x7+x1)>>14];
blk[8*1] = iclp[(x3+x2)>>14];
blk[8*2] = iclp[(x0+x4)>>14];
blk[8*3] = iclp[(x8+x6)>>14];
blk[8*4] = iclp[(x8-x6)>>14];
blk[8*5] = iclp[(x0-x4)>>14];
blk[8*6] = iclp[(x3-x2)>>14];
blk[8*7] = iclp[(x7-x1)>>14];
}
 
/* two dimensional inverse discrete cosine transform */
void Fast_IDCT(block)
short *block;
{
int i;
 
for (i=0; i<8; i++)
idctrow(block+8*i);
 
for (i=0; i<8; i++)
idctcol(block+i);
}
 
void Initialize_Fast_IDCT()
{
int i;
 
iclp = iclip+512;
for (i= -512; i<512; i++)
iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
}
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/getvlc.c
0,0 → 1,797
/* getvlc.c, variable length decoding */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "config.h"
#include "global.h"
#include "getvlc.h"
 
/* private prototypes */
/* generic picture macroblock type processing functions */
static int Get_I_macroblock_type _ANSI_ARGS_((void));
static int Get_P_macroblock_type _ANSI_ARGS_((void));
static int Get_B_macroblock_type _ANSI_ARGS_((void));
static int Get_D_macroblock_type _ANSI_ARGS_((void));
 
/* spatial picture macroblock type processing functions */
static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
 
int Get_macroblock_type()
{
int macroblock_type = 0;
 
if (ld->scalable_mode==SC_SNR)
macroblock_type = Get_SNR_macroblock_type();
else
{
switch (picture_coding_type)
{
case I_TYPE:
macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type();
break;
case P_TYPE:
macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type();
break;
case B_TYPE:
macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type();
break;
case D_TYPE:
macroblock_type = Get_D_macroblock_type();
break;
default:
cprintf("Get_macroblock_type(): unrecognized picture coding type\n");
break;
}
}
 
return macroblock_type;
}
 
static int Get_I_macroblock_type()
{
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_type(I) ");
#endif /* TRACE */
 
if (Get_Bits1())
{
#ifdef TRACE
if (Trace_Flag)
cprintf("(1): Intra (1)\n");
#endif /* TRACE */
return 1;
}
 
if (!Get_Bits1())
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
}
 
#ifdef TRACE
if (Trace_Flag)
cprintf("(01): Intra, Quant (17)\n");
#endif /* TRACE */
 
return 17;
}
 
static char *MBdescr[]={
"", "Intra", "No MC, Coded", "",
"Bwd, Not Coded", "", "Bwd, Coded", "",
"Fwd, Not Coded", "", "Fwd, Coded", "",
"Interp, Not Coded", "", "Interp, Coded", "",
"", "Intra, Quant", "No MC, Coded, Quant", "",
"", "", "Bwd, Coded, Quant", "",
"", "", "Fwd, Coded, Quant", "",
"", "", "Interp, Coded, Quant", ""
};
 
static int Get_P_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_type(P) (");
#endif /* TRACE */
 
if ((code = Show_Bits(6))>=8)
{
code >>= 3;
Flush_Buffer(PMBtab0[code].len);
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,3,PMBtab0[code].len);
cprintf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
}
#endif /* TRACE */
return PMBtab0[code].val;
}
 
if (code==0)
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(PMBtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,6,PMBtab1[code].len);
cprintf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
}
#endif /* TRACE */
 
return PMBtab1[code].val;
}
 
static int Get_B_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_type(B) (");
#endif /* TRACE */
 
if ((code = Show_Bits(6))>=8)
{
code >>= 2;
Flush_Buffer(BMBtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,4,BMBtab0[code].len);
cprintf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
}
#endif /* TRACE */
 
return BMBtab0[code].val;
}
 
if (code==0)
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(BMBtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,6,BMBtab1[code].len);
cprintf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
}
#endif /* TRACE */
 
return BMBtab1[code].val;
}
 
static int Get_D_macroblock_type()
{
if (!Get_Bits1())
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag=1;
}
 
return 1;
}
 
/* macroblock_type for pictures with spatial scalability */
static int Get_I_Spatial_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_type(I,spat) (");
#endif /* TRACE */
 
code = Show_Bits(4);
 
if (code==0)
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,4,spIMBtab[code].len);
cprintf("): %02x\n",spIMBtab[code].val);
}
#endif /* TRACE */
 
Flush_Buffer(spIMBtab[code].len);
return spIMBtab[code].val;
}
 
static int Get_P_Spatial_macroblock_type()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_type(P,spat) (");
#endif /* TRACE */
 
code = Show_Bits(7);
 
if (code<2)
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
if (code>=16)
{
code >>= 3;
Flush_Buffer(spPMBtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,4,spPMBtab0[code].len);
cprintf("): %02x\n",spPMBtab0[code].val);
}
#endif /* TRACE */
 
return spPMBtab0[code].val;
}
 
Flush_Buffer(spPMBtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,7,spPMBtab1[code].len);
cprintf("): %02x\n",spPMBtab1[code].val);
}
#endif /* TRACE */
 
return spPMBtab1[code].val;
}
 
static int Get_B_Spatial_macroblock_type()
{
int code;
VLCtab *p;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_type(B,spat) (");
#endif /* TRACE */
 
code = Show_Bits(9);
 
if (code>=64)
p = &spBMBtab0[(code>>5)-2];
else if (code>=16)
p = &spBMBtab1[(code>>2)-4];
else if (code>=8)
p = &spBMBtab2[code-8];
else
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(p->len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,9,p->len);
printf("): %02x\n",p->val);
}
#endif /* TRACE */
 
return p->val;
}
 
static int Get_SNR_macroblock_type()
{
int code;
 
#ifdef TRACE /* *CH* */
if (Trace_Flag)
cprintf("macroblock_type(SNR) (");
#endif
 
code = Show_Bits(3);
 
if (code==0)
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_type code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(SNRMBtab[code].len);
 
#ifdef TRACE /* *CH* */
if (Trace_Flag)
{
Print_Bits(code,3,SNRMBtab[code].len);
cprintf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
}
#endif
 
 
return SNRMBtab[code].val;
}
 
int Get_motion_code()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("motion_code (");
#endif /* TRACE */
 
if (Get_Bits1())
{
#ifdef TRACE
if (Trace_Flag)
cprintf("0): 0\n");
#endif /* TRACE */
return 0;
}
 
if ((code = Show_Bits(9))>=64)
{
code >>= 6;
Flush_Buffer(MVtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,3,MVtab0[code].len);
cprintf("%d): %d\n",
Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
}
#endif /* TRACE */
 
return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
}
 
if (code>=24)
{
code >>= 3;
Flush_Buffer(MVtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,6,MVtab1[code].len);
cprintf("%d): %d\n",
Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
}
#endif /* TRACE */
 
return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
}
 
if ((code-=12)<0)
{
if (!Quiet_Flag)
/* HACK */
cprintf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
Fault_Flag=1;
return 0;
}
 
Flush_Buffer(MVtab2[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code+12,9,MVtab2[code].len);
cprintf("%d): %d\n",
Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
}
#endif /* TRACE */
 
return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
}
 
/* get differential motion vector (for dual prime prediction) */
int Get_dmvector()
{
#ifdef TRACE
if (Trace_Flag)
cprintf("dmvector (");
#endif /* TRACE */
 
if (Get_Bits(1))
{
#ifdef TRACE
if (Trace_Flag)
cprintf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");
#endif /* TRACE */
return Get_Bits(1) ? -1 : 1;
}
else
{
#ifdef TRACE
if (Trace_Flag)
cprintf("0): 0\n");
#endif /* TRACE */
return 0;
}
}
 
int Get_coded_block_pattern()
{
int code;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("coded_block_pattern_420 (");
#endif /* TRACE */
 
if ((code = Show_Bits(9))>=128)
{
code >>= 4;
Flush_Buffer(CBPtab0[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,5,CBPtab0[code].len);
cprintf("): ");
Print_Bits(CBPtab0[code].val,6,6);
cprintf(" (%d)\n",CBPtab0[code].val);
}
#endif /* TRACE */
 
return CBPtab0[code].val;
}
 
if (code>=8)
{
code >>= 1;
Flush_Buffer(CBPtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,8,CBPtab1[code].len);
cprintf("): ");
Print_Bits(CBPtab1[code].val,6,6);
cprintf(" (%d)\n",CBPtab1[code].val);
}
#endif /* TRACE */
 
return CBPtab1[code].val;
}
 
if (code<1)
{
if (!Quiet_Flag)
cprintf("Invalid coded_block_pattern code\n");
Fault_Flag = 1;
return 0;
}
 
Flush_Buffer(CBPtab2[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,9,CBPtab2[code].len);
cprintf("): ");
Print_Bits(CBPtab2[code].val,6,6);
cprintf(" (%d)\n",CBPtab2[code].val);
}
#endif /* TRACE */
 
return CBPtab2[code].val;
}
 
int Get_macroblock_address_increment()
{
int code, val;
 
#ifdef TRACE
if (Trace_Flag)
cprintf("macroblock_address_increment (");
#endif /* TRACE */
 
val = 0;
 
while ((code = Show_Bits(11))<24)
{
if (code!=15) /* if not macroblock_stuffing */
{
if (code==8) /* if macroblock_escape */
{
#ifdef TRACE
if (Trace_Flag)
cprintf("00000001000 ");
#endif /* TRACE */
 
val+= 33;
}
else
{
if (!Quiet_Flag)
cprintf("Invalid macroblock_address_increment code\n");
 
Fault_Flag = 1;
return 1;
}
}
else /* macroblock suffing */
{
#ifdef TRACE
if (Trace_Flag)
cprintf("00000001111 ");
#endif /* TRACE */
}
 
Flush_Buffer(11);
}
 
/* macroblock_address_increment == 1 */
/* ('1' is in the MSB position of the lookahead) */
if (code>=1024)
{
Flush_Buffer(1);
#ifdef TRACE
if (Trace_Flag)
cprintf("1): %d\n",val+1);
#endif /* TRACE */
return val + 1;
}
 
/* codes 00010 ... 011xx */
if (code>=128)
{
/* remove leading zeros */
code >>= 6;
Flush_Buffer(MBAtab1[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code,5,MBAtab1[code].len);
printf("): %d\n",val+MBAtab1[code].val);
}
#endif /* TRACE */
 
return val + MBAtab1[code].val;
}
/* codes 00000011000 ... 0000111xxxx */
code-= 24; /* remove common base */
Flush_Buffer(MBAtab2[code].len);
 
#ifdef TRACE
if (Trace_Flag)
{
Print_Bits(code+24,11,MBAtab2[code].len);
cprintf("): %d\n",val+MBAtab2[code].val);
}
#endif /* TRACE */
 
return val + MBAtab2[code].val;
}
 
/* combined MPEG-1 and MPEG-2 stage. parse VLC and
perform dct_diff arithmetic.
 
MPEG-1: ISO/IEC 11172-2 section
MPEG-2: ISO/IEC 13818-2 section 7.2.1
Note: the arithmetic here is presented more elegantly than
the spec, yet the results, dct_diff, are the same.
*/
 
int Get_Luma_DC_dct_diff()
{
int code, size, dct_diff;
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("dct_dc_size_luminance: (");
*/
#endif /* TRACE */
 
/* decode length */
code = Show_Bits(5);
 
if (code<31)
{
size = DClumtab0[code].val;
Flush_Buffer(DClumtab0[code].len);
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code,5,DClumtab0[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
else
{
code = Show_Bits(9) - 0x1f0;
size = DClumtab1[code].val;
Flush_Buffer(DClumtab1[code].len);
 
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code+0x1f0,9,DClumtab1[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf(", dct_dc_differential (");
*/
#endif /* TRACE */
 
if (size==0)
dct_diff = 0;
else
{
dct_diff = Get_Bits(size);
#ifdef TRACE
/*
if (Trace_Flag)
Print_Bits(dct_diff,size,size);
*/
#endif /* TRACE */
if ((dct_diff & (1<<(size-1)))==0)
dct_diff-= (1<<size) - 1;
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("): %d\n",dct_diff);
*/
#endif /* TRACE */
 
return dct_diff;
}
 
 
int Get_Chroma_DC_dct_diff()
{
int code, size, dct_diff;
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("dct_dc_size_chrominance: (");
*/
#endif /* TRACE */
 
/* decode length */
code = Show_Bits(5);
 
if (code<31)
{
size = DCchromtab0[code].val;
Flush_Buffer(DCchromtab0[code].len);
 
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code,5,DCchromtab0[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
else
{
code = Show_Bits(10) - 0x3e0;
size = DCchromtab1[code].val;
Flush_Buffer(DCchromtab1[code].len);
 
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf(", dct_dc_differential (");
*/
#endif /* TRACE */
 
if (size==0)
dct_diff = 0;
else
{
dct_diff = Get_Bits(size);
#ifdef TRACE
/*
if (Trace_Flag)
Print_Bits(dct_diff,size,size);
*/
#endif /* TRACE */
if ((dct_diff & (1<<(size-1)))==0)
dct_diff-= (1<<size) - 1;
}
 
#ifdef TRACE
/*
if (Trace_Flag)
printf("): %d\n",dct_diff);
*/
#endif /* TRACE */
 
return dct_diff;
}
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/mpeg2dec.c
0,0 → 1,495
 
/* mpeg2dec.c, main(), initialization, option processing */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include "stdlib.h"
#include "drivers/glib.h"
 
#include "fsf_contract.h"
 
#define GLOBAL
#include "config.h"
#include "global.h"
 
/* private prototypes */
static int video_sequence _ANSI_ARGS_((int *framenum));
static int Headers _ANSI_ARGS_((void));
static void Initialize_Sequence _ANSI_ARGS_((void));
static void Initialize_Decoder _ANSI_ARGS_((void));
static void Deinitialize_Sequence _ANSI_ARGS_((void));
 
/* #define DEBUG */
 
static void Clear_Options();
#ifdef DEBUG
static void Print_Options();
#endif
 
#define MAX_M_QOS 0
#define MIN_M_QOS 0
 
int dos_video_preload(char *file_name, long max_size, void **start, void **end)
{
DOS_FILE* file;
void *buf;
long rd;
 
file = DOS_fopen(file_name,"r");
if (file == NULL) return -1;
 
buf = malloc(max_size);
*start = buf;
 
while(((rd = DOS_fread(buf, sizeof(BYTE), 2048, file)) == 2048) &&
((buf - *start + rd) < (max_size-2048))) {
buf += rd;
}
*end = buf + rd;
DOS_fclose(file);
return(0);
 
}
 
int Init_Mpeg_Decoder(void *start, void *end)
{
int code;
Clear_Options();
 
#ifdef DEBUG
Print_Options();
#endif
 
ld = &base; /* select base layer context */
ld->start_file_ptr = start;
ld->end_file_ptr = end;
ld->actual_file_ptr = ld->start_file_ptr;
 
/* open MPEG base layer bitstream file(s) */
/* NOTE: this is either a base layer stream or a spatial enhancement stream */
if ((base.Infile=1)<0)
{
cprintf("Base layer input file %s not found\n", Main_Bitstream_Filename);
}
 
 
if(base.Infile != 0)
{
Initialize_Buffer();
if(Show_Bits(8)==0x47)
{
sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
Error(Error_Text);
}
 
next_start_code();
code = Show_Bits(32);
 
switch(code)
{
case SEQUENCE_HEADER_CODE:
break;
case PACK_START_CODE:
System_Stream_Flag = 1;
case VIDEO_ELEMENTARY_STREAM:
System_Stream_Flag = 1;
break;
default:
sprintf(Error_Text,"Unable to recognize stream type\n");
Error(Error_Text);
break;
}
 
ld->actual_file_ptr = ld->start_file_ptr;
Initialize_Buffer();
}
 
if(base.Infile!=0)
{
ld->actual_file_ptr = ld->start_file_ptr;
}
 
Initialize_Buffer();
 
if(Two_Streams)
{
ld = &enhan; /* select enhancement layer context */
 
if ((enhan.Infile = 1)<0)
{
sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
Enhancement_Layer_Bitstream_Filename);
 
Error(Error_Text);
}
 
Initialize_Buffer();
ld = &base;
}
 
Initialize_Decoder();
 
//Decode_Bitstream();
 
return 0;
}
 
/* IMPLEMENTAION specific rouintes */
static void Initialize_Decoder()
{
int i;
 
/* Clip table */
if (!(Clip=(unsigned char *)malloc(1024)))
Error("Clip[] malloc failed\n");
 
Clip += 384;
 
for (i=-384; i<640; i++)
Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
 
/* IDCT */
if (Reference_IDCT_Flag)
Initialize_Reference_IDCT();
else
Initialize_Fast_IDCT();
 
}
 
/* mostly IMPLEMENTAION specific rouintes */
static void Initialize_Sequence()
{
int cc, size;
static int Table_6_20[3] = {6,8,12};
 
/* check scalability mode of enhancement layer */
if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP))
Error("unsupported scalability mode\n");
 
/* force MPEG-1 parameters for proper decoder behavior */
/* see ISO/IEC 13818-2 section D.9.14 */
if (!base.MPEG2_Flag)
{
progressive_sequence = 1;
progressive_frame = 1;
picture_structure = FRAME_PICTURE;
frame_pred_frame_dct = 1;
chroma_format = CHROMA420;
matrix_coefficients = 5;
}
 
/* round to nearest multiple of coded macroblocks */
/* ISO/IEC 13818-2 section 6.3.3 sequence_header() */
mb_width = (horizontal_size+15)/16;
mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32)
: (vertical_size+15)/16;
 
Coded_Picture_Width = 16*mb_width;
Coded_Picture_Height = 16*mb_height;
 
/* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */
Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width
: Coded_Picture_Width>>1;
Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height
: Coded_Picture_Height>>1;
/* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */
block_count = Table_6_20[chroma_format-1];
 
for (cc=0; cc<3; cc++)
{
if (cc==0)
size = Coded_Picture_Width*Coded_Picture_Height;
else
size = Chroma_Width*Chroma_Height;
 
if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size)))
Error("backward_reference_frame[] malloc failed\n");
 
if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size)))
Error("forward_reference_frame[] malloc failed\n");
 
if (!(auxframe[cc] = (unsigned char *)malloc(size)))
Error("auxframe[] malloc failed\n");
 
if(Ersatz_Flag)
if (!(substitute_frame[cc] = (unsigned char *)malloc(size)))
Error("substitute_frame[] malloc failed\n");
 
 
if (base.scalable_mode==SC_SPAT)
{
/* this assumes lower layer is 4:2:0 */
if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
Error("llframe0 malloc failed\n");
if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
Error("llframe1 malloc failed\n");
}
}
 
/* SCALABILITY: Spatial */
if (base.scalable_mode==SC_SPAT)
{
if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short))))
Error("lltmp malloc failed\n");
}
 
#ifdef DISPLAY
if (Output_Type==T_X11)
{
Initialize_Display_Process("");
Initialize_Dither_Matrix();
}
#endif /* DISPLAY */
 
}
 
void Error(text)
char *text;
{
cprintf(text);
}
 
/* Trace_Flag output */
void Print_Bits(code,bits,len)
int code,bits,len;
{
int i;
for (i=0; i<len; i++)
cprintf("%d",(code>>(bits-1-i))&1);
}
 
static int Headers()
{
int ret;
 
ld = &base;
 
/* return when end of sequence (0) or picture
header has been parsed (1) */
 
ret = Get_Hdr();
 
 
if (Two_Streams)
{
ld = &enhan;
if (Get_Hdr()!=ret && !Quiet_Flag)
cprintf("streams out of sync\n");
ld = &base;
}
 
return ret;
}
 
int Decode_Bitstream()
{
int ret;
int Bitstream_Framenum;
 
Bitstream_Framenum = 0;
 
for(;;)
{
 
#ifdef VERIFY
Clear_Verify_Headers();
#endif /* VERIFY */
 
ld->actual_file_ptr = ld->start_file_ptr;
 
ret = Headers();
if(ret==1)
{
ret = video_sequence(&Bitstream_Framenum);
}
else
return(ret);
}
 
}
 
 
static void Deinitialize_Sequence()
{
int i;
 
/* clear flags */
base.MPEG2_Flag=0;
 
for(i=0;i<3;i++)
{
free(backward_reference_frame[i]);
free(forward_reference_frame[i]);
free(auxframe[i]);
 
if (base.scalable_mode==SC_SPAT)
{
free(llframe0[i]);
free(llframe1[i]);
}
}
 
if (base.scalable_mode==SC_SPAT)
free(lltmp);
 
#ifdef DISPLAY
if (Output_Type==T_X11)
Terminate_Display_Process();
#endif
}
 
 
static int video_sequence(Bitstream_Framenumber)
int *Bitstream_Framenumber;
{
int Bitstream_Framenum;
int Sequence_Framenum;
int Return_Value;
 
char tmp[100];
 
Bitstream_Framenum = *Bitstream_Framenumber;
Sequence_Framenum=0;
 
Initialize_Sequence();
 
/* decode picture whose header has already been parsed in
Decode_Bitstream() */
 
ld->px = 310+(rand()%(500-Coded_Picture_Width));
ld->py = 100+(rand()%(400-Coded_Picture_Height));
sprintf(tmp,"Wx = %3d Wy = %3d",Coded_Picture_Width,Coded_Picture_Height);
grx_text(tmp,ld->px,ld->py-10,rgb16(255,255,255),0);
 
Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
 
/* update picture numbers */
if (!Second_Field)
{
Bitstream_Framenum++;
Sequence_Framenum++;
}
 
fsf_schedule_next_timed_job(NULL, NULL, NULL, NULL, NULL);
 
/* loop through the rest of the pictures in the sequence */
while ((Return_Value=Headers()))
{
Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
 
if (!Second_Field)
{
Bitstream_Framenum++;
Sequence_Framenum++;
}
 
fsf_schedule_next_timed_job(NULL, NULL, NULL, NULL, NULL);
}
 
/* put last frame */
if (Sequence_Framenum!=0)
{
Output_Last_Frame_of_Sequence(Bitstream_Framenum);
}
 
Deinitialize_Sequence();
 
#ifdef VERIFY
Clear_Verify_Headers();
#endif /* VERIFY */
 
*Bitstream_Framenumber = Bitstream_Framenum;
return(Return_Value);
}
 
 
 
static void Clear_Options()
{
Verbose_Flag = 0;
Output_Type = 0;
Output_Picture_Filename = " ";
hiQdither = 0;
Output_Type = 0;
Frame_Store_Flag = 0;
Spatial_Flag = 0;
Lower_Layer_Picture_Filename = " ";
Reference_IDCT_Flag = 0;
Trace_Flag = 0;
Quiet_Flag = 0;
Ersatz_Flag = 0;
Substitute_Picture_Filename = " ";
Two_Streams = 0;
Enhancement_Layer_Bitstream_Filename = " ";
Big_Picture_Flag = 0;
Main_Bitstream_Flag = 0;
Main_Bitstream_Filename = " ";
Verify_Flag = 0;
Stats_Flag = 0;
User_Data_Flag = 0;
}
 
 
#ifdef DEBUG
static void Print_Options()
{
printf("Verbose_Flag = %d\n", Verbose_Flag);
printf("Output_Type = %d\n", Output_Type);
printf("Output_Picture_Filename = %s\n", Output_Picture_Filename);
printf("hiQdither = %d\n", hiQdither);
printf("Output_Type = %d\n", Output_Type);
printf("Frame_Store_Flag = %d\n", Frame_Store_Flag);
printf("Spatial_Flag = %d\n", Spatial_Flag);
printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename);
printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag);
printf("Trace_Flag = %d\n", Trace_Flag);
printf("Quiet_Flag = %d\n", Quiet_Flag);
printf("Ersatz_Flag = %d\n", Ersatz_Flag);
printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename);
printf("Two_Streams = %d\n", Two_Streams);
printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
printf("Big_Picture_Flag = %d\n", Big_Picture_Flag);
printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag);
printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename);
printf("Verify_Flag = %d\n", Verify_Flag);
printf("Stats_Flag = %d\n", Stats_Flag);
printf("User_Data_Flag = %d\n", User_Data_Flag);
 
}
#endif
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/getvlc.h
0,0 → 1,491
/* getvlc.h, variable length code tables */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case
as per C programming convention. However, the MPEG document
(ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */
 
/* NOTE: the VLC tables are in a flash format---a transformation
of the tables in Annex B to a form more convenient towards
parallel (more than one-bit-at-a-time) decoding */
 
typedef struct {
char val, len;
} VLCtab;
 
typedef struct {
char run, level, len;
} DCTtab;
 
/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
static VLCtab PMBtab0[8] = {
{ERROR,0},
{MACROBLOCK_MOTION_FORWARD,3},
{MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
};
 
/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
static VLCtab PMBtab1[8] = {
{ERROR,0},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
{MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
};
 
/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
static VLCtab BMBtab0[16] = {
{ERROR,0},
{ERROR,0},
{MACROBLOCK_MOTION_FORWARD,4},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
};
 
/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
static VLCtab BMBtab1[8] = {
{ERROR,0},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
{MACROBLOCK_INTRA,5},
{MACROBLOCK_INTRA,5}
};
 
/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */
static VLCtab spIMBtab[16] = {
{ERROR,0},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,4},
{MACROBLOCK_INTRA,4},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}
};
 
/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */
static VLCtab spPMBtab0[16] =
{
{ERROR,0},
{ERROR,0},
{MACROBLOCK_MOTION_FORWARD,4},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}
};
 
/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */
static VLCtab spPMBtab1[16] = {
{ERROR,0},
{ERROR,0},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7},
{MACROBLOCK_PATTERN,7},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,7},
{MACROBLOCK_INTRA,7},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}
};
 
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */
static VLCtab spBMBtab0[14] = {
{MACROBLOCK_MOTION_FORWARD,4},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
{MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
};
 
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */
static VLCtab spBMBtab1[12] = {
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
{MACROBLOCK_INTRA,7},
{MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}
};
 
/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */
static VLCtab spBMBtab2[8] = {
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
{MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
{SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9},
{PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9}
};
 
/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */
static VLCtab SNRMBtab[8] = {
{ERROR,0},
{0,3},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
{MACROBLOCK_PATTERN,1},
{MACROBLOCK_PATTERN,1},
{MACROBLOCK_PATTERN,1},
{MACROBLOCK_PATTERN,1}
};
 
/* Table B-10, motion_code, codes 0001 ... 01xx */
static VLCtab MVtab0[8] =
{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
};
 
/* Table B-10, motion_code, codes 0000011 ... 000011x */
static VLCtab MVtab1[8] =
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
};
 
/* Table B-10, motion_code, codes 0000001100 ... 000001011x */
static VLCtab MVtab2[12] =
{ {16,9}, {15,9}, {14,9}, {13,9},
{12,9}, {11,9}, {10,8}, {10,8},
{9,8}, {9,8}, {8,8}, {8,8}
};
 
/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
static VLCtab CBPtab0[32] =
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
{ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
{62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5},
{40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
{8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3}
};
 
/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
static VLCtab CBPtab1[64] =
{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
{58,8}, {54,8}, {46,8}, {30,8},
{57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
{43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
{41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
{34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7},
{33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7},
{63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6},
{36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
};
 
/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
static VLCtab CBPtab2[8] =
{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
};
 
/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
static VLCtab MBAtab1[16] =
{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4},
{3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
};
 
/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
static VLCtab MBAtab2[104] =
{
{33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
{25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
{19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
{15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8},
{14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8},
{13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8},
{12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8},
{11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8},
{10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8},
{9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
{9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
{8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7},
{8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}
};
 
/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
static VLCtab DClumtab0[32] =
{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
{0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
{4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0}
};
 
/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
static VLCtab DClumtab1[16] =
{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
{8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
};
 
/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
static VLCtab DCchromtab0[32] =
{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
{1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
{3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0}
};
 
/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
static VLCtab DCchromtab1[32] =
{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
{6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
{7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
{8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 0100 ... 1xxx (used for first (DC) coefficient)
*/
DCTtab DCTtabfirst[12] =
{
{0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
{0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
{0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 0100 ... 1xxx (used for all other coefficients)
*/
DCTtab DCTtabnext[12] =
{
{0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
{64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 000001xx ... 00111xxx
*/
DCTtab DCTtab0[60] =
{
{65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
{2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
{0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
{7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
{6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
{1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
{5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
{13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
{3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
{0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
{0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
{4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
{4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
};
 
/* Table B-15, DCT coefficients table one,
* codes 000001xx ... 11111111
*/
DCTtab DCTtab0a[252] =
{
{65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
{7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
{6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
{0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
{0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
{4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
{5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
{1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
{13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
{2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
{2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
{1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
{1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
{3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
{64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
{0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
{0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
{0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
{0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
{9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
{10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
{0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
{2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
};
 
/* Table B-14, DCT coefficients table zero,
* codes 0000001000 ... 0000001111
*/
DCTtab DCTtab1[8] =
{
{16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
{1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
};
 
/* Table B-15, DCT coefficients table one,
* codes 000000100x ... 000000111x
*/
DCTtab DCTtab1a[8] =
{
{5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
{2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 000000010000 ... 000000011111
*/
DCTtab DCTtab2[16] =
{
{0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
{2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
{0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
{3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 0000000010000 ... 0000000011111
*/
DCTtab DCTtab3[16] =
{
{10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
{2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
{0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
{25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 00000000010000 ... 00000000011111
*/
DCTtab DCTtab4[16] =
{
{0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
{0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
{0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
{0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 000000000010000 ... 000000000011111
*/
DCTtab DCTtab5[16] =
{
{0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
{0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
{0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
{1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
};
 
/* Table B-14/15, DCT coefficients table zero / one,
* codes 0000000000010000 ... 0000000000011111
*/
DCTtab DCTtab6[16] =
{
{1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
{6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
{13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
{30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
};
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/const.h
0,0 → 1,141
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
 
/**
------------
CVS : $Id: const.h,v 1.1.1.1 2004-05-24 17:54:51 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 17:54:51 $
------------
**/
 
/*
* Copyright (C) 2000 Marco Dallera and Marco Fiocca
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* AUTO
*
* Another Unuseful Track simulatOr
*
* Authors: Marco Dallera
* Marco Fiocca
*
*/
 
/* ------------------ */
/* Useful constants */
/* ------------------ */
 
#ifndef __CONST_H_
 
#define __CONST_H_
 
/* Screen dimensions */
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
#define SCREEN_BIT_COLORS 8
 
/* Visible area */
#define TEL_WIDTH 50
#define TEL_HEIGHT 50
 
/* Car dimensions */
#define CAR_WIDTH 12
#define CAR_HEIGHT 12
#define CAR_W 8
#define CAR_H 10
 
/* Track dimensions */
#define TRACK_WIDTH 500
#define TRACK_HEIGHT 500
 
/* Track position */
#define TRACK_X1 0
#define TRACK_Y1 0
#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
 
/* Max number of car on track */
#define MAX_CAR_NUMBER 10
#define DRIVERS_NUMBER 20
#define MAX_DRIVER_NAME_LENGTH 20
#define MAX_TRACK_NAME_LENGTH 20
#define TRACK_NUMBER 4
 
/* Lap direction */
#define CLOCK 0
#define ANTICLOCK 1
 
/* Information display coords */
#define CMD_WIDTH TRACK_WIDTH
#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
 
/* Car position limits */
#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
 
/* Road constants */
#define LEFT_ONLY 10
#define RIGHT_ONLY 11
#define ROAD_OK 12
#define NO_ROAD 13
 
/* Collision constants */
#define COLLISION_LEFT 20
#define COLLISION_RIGHT 21
#define COLLISION_BACK 22
#define NO_COLL 0
 
/* CAB constants */
#define ROAD_MSG_DIM sizeof(road_info)
#define ROAD_MSG_READER 4
 
#define CAR_MSG_DIM sizeof(car_status)
#define CAR_MSG_READER 5
 
/* Tasks parameters */
#define SENSOR_WCET 3000
#define SENSOR_PERIOD 40000
#define CONTROL_WCET 1000
#define CONTROL_PERIOD 40000
 
#endif
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/mpeg2dec.h
0,0 → 1,129
/* mpeg2dec.h, MPEG specific defines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#define ERROR (-1)
 
#define PICTURE_START_CODE 0x100
#define SLICE_START_CODE_MIN 0x101
#define SLICE_START_CODE_MAX 0x1AF
#define USER_DATA_START_CODE 0x1B2
#define SEQUENCE_HEADER_CODE 0x1B3
#define SEQUENCE_ERROR_CODE 0x1B4
#define EXTENSION_START_CODE 0x1B5
#define SEQUENCE_END_CODE 0x1B7
#define GROUP_START_CODE 0x1B8
#define SYSTEM_START_CODE_MIN 0x1B9
#define SYSTEM_START_CODE_MAX 0x1FF
 
#define ISO_END_CODE 0x1B9
#define PACK_START_CODE 0x1BA
#define SYSTEM_START_CODE 0x1BB
 
#define VIDEO_ELEMENTARY_STREAM 0x1e0
 
/* scalable_mode */
#define SC_NONE 0
#define SC_DP 1
#define SC_SPAT 2
#define SC_SNR 3
#define SC_TEMP 4
 
/* picture coding type */
#define I_TYPE 1
#define P_TYPE 2
#define B_TYPE 3
#define D_TYPE 4
 
/* picture structure */
#define TOP_FIELD 1
#define BOTTOM_FIELD 2
#define FRAME_PICTURE 3
 
/* macroblock type */
#define MACROBLOCK_INTRA 1
#define MACROBLOCK_PATTERN 2
#define MACROBLOCK_MOTION_BACKWARD 4
#define MACROBLOCK_MOTION_FORWARD 8
#define MACROBLOCK_QUANT 16
#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32
#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64
 
 
/* motion_type */
#define MC_FIELD 1
#define MC_FRAME 2
#define MC_16X8 2
#define MC_DMV 3
 
/* mv_format */
#define MV_FIELD 0
#define MV_FRAME 1
 
/* chroma_format */
#define CHROMA420 1
#define CHROMA422 2
#define CHROMA444 3
 
/* extension start code IDs */
 
#define SEQUENCE_EXTENSION_ID 1
#define SEQUENCE_DISPLAY_EXTENSION_ID 2
#define QUANT_MATRIX_EXTENSION_ID 3
#define COPYRIGHT_EXTENSION_ID 4
#define SEQUENCE_SCALABLE_EXTENSION_ID 5
#define PICTURE_DISPLAY_EXTENSION_ID 7
#define PICTURE_CODING_EXTENSION_ID 8
#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
 
#define ZIG_ZAG 0
 
#define PROFILE_422 (128+5)
#define MAIN_LEVEL 8
 
/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */
#define NO_LAYER 0
#define SEQUENCE_LAYER 1
#define PICTURE_LAYER 2
#define SLICE_LAYER 3
#define MACROBLOCK_LAYER 4
#define BLOCK_LAYER 5
#define EVENT_LAYER 6
#define ALL_LAYERS 7
 
 
 
#define FILENAME_LENGTH 256
 
 
 
 
#define MB_WEIGHT 32
#define MB_CLASS4 64
 
/advdemos/tags/rel_1_5_beta1/fsf/mpeg2/store.c
0,0 → 1,319
/* store.c, picture output routines */
 
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
 
/*
* Disclaimer of Warranty
*
* These software programs are available to the user without any license fee or
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
* any and all warranties, whether express, implied, or statuary, including any
* implied warranties or merchantability or of fitness for a particular
* purpose. In no event shall the copyright-holder be liable for any
* incidental, punitive, or consequential damages of any kind whatsoever
* arising from the use of these programs.
*
* This disclaimer of warranty extends to the user of these programs and user's
* customers, employees, agents, transferees, successors, and assigns.
*
* The MPEG Software Simulation Group does not represent or warrant that the
* programs furnished hereunder are free of infringement of any third-party
* patents.
*
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
* are subject to royalty fees to patent holders. Many of these patents are
* general enough such that they are unavoidable regardless of implementation
* design.
*
*/
 
#include <stdlib.h>
 
#include "drivers/glib.h"
 
#include "config.h"
#include "global.h"
 
extern DWORD flbaddr;
 
static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
 
__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b)
{
return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8);
}
 
void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
{
int i, j;
int y, u, v, r, g, b;
// int rm=0,gm=0,bm=0;
int crv, cbu, cgu, cgv;
unsigned char *py, *pu, *pv;
int height, width, incr;
static unsigned char *u422, *v422, *u444, *v444;
incr = width = Coded_Picture_Width ;
height = Coded_Picture_Height;
 
if (chroma_format==CHROMA444)
{
u444 = src[1];
v444 = src[2];
}
else
{
if (!u444)
{
if (chroma_format==CHROMA420)
{
if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
*Coded_Picture_Height)))
Error("malloc failed");
}
 
if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
*Coded_Picture_Height)))
Error("malloc failed");
 
if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
*Coded_Picture_Height)))
Error("malloc failed");
}
 
if (chroma_format==CHROMA420)
{
conv420to422(src[1],u422);
conv420to422(src[2],v422);
conv422to444(u422,u444);
conv422to444(v422,v444);
}
else
{
conv422to444(src[1],u444);
conv422to444(src[2],v444);
}
}
 
/* matrix coefficients */
crv = Inverse_Table_6_9[matrix_coefficients][0];
cbu = Inverse_Table_6_9[matrix_coefficients][1];
cgu = Inverse_Table_6_9[matrix_coefficients][2];
cgv = Inverse_Table_6_9[matrix_coefficients][3];
for (i=0; i<height; i++)
{
py = src[0] + incr*i;
pu = u444 + incr*i;
pv = v444 + incr*i;
 
for (j=0; j<width; j++)
{
u = *pu++ - 128;
v = *pv++ - 128;
y = 76309 * (*py++ - 16); /* (255/219)*65536 */
 
r = Clip[(y + crv*v + 32768)>>16];
g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
b = Clip[(y + cbu*u + 32786)>>16];
 
*(WORD *)(flbaddr+((i+ld->py)*800+(j+ld->px))*2) = down32to16(r,g,b);
}
}
}
 
/*
void Display_Image(Dithered_Image)
unsigned char *Dithered_Image;
{
/ * display dithered image */
//}
 
 
/* horizontal 1:2 interpolation filter */
static void conv422to444(src,dst)
unsigned char *src,*dst;
{
int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
 
w = Coded_Picture_Width>>1;
 
if (base.MPEG2_Flag)
{
for (j=0; j<Coded_Picture_Height; j++)
{
for (i=0; i<w; i++)
{
i2 = i<<1;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<w-1) ? i+1 : w-1;
ip2 = (i<w-2) ? i+2 : w-1;
ip3 = (i<w-3) ? i+3 : w-1;
 
/* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
/* even samples (0 0 256 0 0) */
dst[i2] = src[i];
 
/* odd samples (21 -52 159 159 -52 21) */
dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
-52*(src[im1]+src[ip2])
+159*(src[i]+src[ip1])+128)>>8];
}
src+= w;
dst+= Coded_Picture_Width;
}
}
else
{
for (j=0; j<Coded_Picture_Height; j++)
{
for (i=0; i<w; i++)
{
 
i2 = i<<1;
im3 = (i<3) ? 0 : i-3;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<w-1) ? i+1 : w-1;
ip2 = (i<w-2) ? i+2 : w-1;
ip3 = (i<w-3) ? i+3 : w-1;
 
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
dst[i2] = Clip[(int)( 5*src[im3]
-21*src[im2]
+70*src[im1]
+228*src[i]
-37*src[ip1]
+11*src[ip2]+128)>>8];
 
dst[i2+1] = Clip[(int)( 5*src[ip3]
-21*src[ip2]
+70*src[ip1]
+228*src[i]
-37*src[im1]
+11*src[im2]+128)>>8];
}
src+= w;
dst+= Coded_Picture_Width;
}
}
}
 
/* vertical 1:2 interpolation filter */
static void conv420to422(src,dst)
unsigned char *src,*dst;
{
int w, h, i, j, j2;
int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
 
w = Coded_Picture_Width>>1;
h = Coded_Picture_Height>>1;
 
if (progressive_frame)
{
/* intra frame */
for (i=0; i<w; i++)
{
for (j=0; j<h; j++)
{
j2 = j<<1;
jm3 = (j<3) ? 0 : j-3;
jm2 = (j<2) ? 0 : j-2;
jm1 = (j<1) ? 0 : j-1;
jp1 = (j<h-1) ? j+1 : h-1;
jp2 = (j<h-2) ? j+2 : h-1;
jp3 = (j<h-3) ? j+3 : h-1;
 
/* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
/* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
dst[w*j2] = Clip[(int)( 3*src[w*jm3]
-16*src[w*jm2]
+67*src[w*jm1]
+227*src[w*j]
-32*src[w*jp1]
+7*src[w*jp2]+128)>>8];
 
dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
-16*src[w*jp2]
+67*src[w*jp1]
+227*src[w*j]
-32*src[w*jm1]
+7*src[w*jm2]+128)>>8];
}
src++;
dst++;
}
}
else
{
/* intra field */
for (i=0; i<w; i++)
{
for (j=0; j<h; j+=2)
{
j2 = j<<1;
 
/* top field */
jm6 = (j<6) ? 0 : j-6;
jm4 = (j<4) ? 0 : j-4;
jm2 = (j<2) ? 0 : j-2;
jp2 = (j<h-2) ? j+2 : h-2;
jp4 = (j<h-4) ? j+4 : h-2;
jp6 = (j<h-6) ? j+6 : h-2;
 
/* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
/* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
dst[w*j2] = Clip[(int)( 1*src[w*jm6]
-7*src[w*jm4]
+30*src[w*jm2]
+248*src[w*j]
-21*src[w*jp2]
+5*src[w*jp4]+128)>>8];
 
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
-35*src[w*jm2]
+194*src[w*j]
+110*src[w*jp2]
-24*src[w*jp4]
+4*src[w*jp6]+128)>>8];
 
/* bottom field */
jm5 = (j<5) ? 1 : j-5;
jm3 = (j<3) ? 1 : j-3;
jm1 = (j<1) ? 1 : j-1;
jp1 = (j<h-1) ? j+1 : h-1;
jp3 = (j<h-3) ? j+3 : h-1;
jp5 = (j<h-5) ? j+5 : h-1;
jp7 = (j<h-7) ? j+7 : h-1;
 
/* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
/* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
-35*src[w*jp3]
+194*src[w*jp1]
+110*src[w*jm1]
-24*src[w*jm3]
+4*src[w*jm5]+128)>>8];
 
dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
-7*src[w*jp5]
+30*src[w*jp3]
+248*src[w*jp1]
-21*src[w*jm1]
+5*src[w*jm3]+128)>>8];
}
src++;
dst++;
}
}
}
 
/advdemos/tags/rel_1_5_beta1/fsf/makefile
0,0 → 1,23
#
#
 
BASE=../..
include $(BASE)/config/config.mk
 
PROGS= test1 test2 test3
 
MPEG2 = ./mpeg2/getbits.o ./mpeg2/getblk.o ./mpeg2/gethdr.o ./mpeg2/getpic.o\
./mpeg2/getvlc.o ./mpeg2/idct.o ./mpeg2/idctref.o ./mpeg2/motion.o\
./mpeg2/mpeg2dec.o ./mpeg2/recon.o ./mpeg2/spatscal.o ./mpeg2/store.o\
./mpeg2/subspic.o ./mpeg2/systems.o ./mpeg2/verify.o ./mpeg2/gvideo.o
 
include $(BASE)/config/example.mk
 
test1:
make -f $(SUBMAKE) APP=test1 INIT= OTHEROBJS= OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__"
 
test2:
make -f $(SUBMAKE) APP=test2 INIT= OTHEROBJS="initfile.o $(MPEG2)" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__ __FIRST__"
test3:
make -f $(SUBMAKE) APP=test3 INIT= OTHEROBJS= OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__"