[xiph-cvs] cvs commit: snatch libsnatch.c snatch.pl snatchppm.h x11.c

Monty xiphmont at xiph.org
Fri Nov 2 15:10:30 PST 2001



xiphmont    01/11/02 15:10:29

  Added:       .        libsnatch.c snatch.pl snatchppm.h x11.c
  Log:
  Actual functionality not currently turned on.  Builds and runs tho.
  
  Monty

Revision  Changes    Path
1.1                  snatch/libsnatch.c

Index: libsnatch.c
===================================================================
/* top layer of subversion library to intercept RealPlayer socket and
   device I/O. --Monty 20011101 */

#define _GNU_SOURCE
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/uio.h>
#include <string.h>
#include <dlfcn.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <stdarg.h>
#include <linux/soundcard.h>
#include <pthread.h>

tatic int    (*libc_open)(const char *,int,mode_t);
static int    (*libc_connect)(int sockfd, const struct sockaddr *serv_addr,
                           socklen_t addrlen);
static int    (*libc_close)(int);
static size_t (*libc_read)(int,void *,size_t);
static size_t (*libc_write)(int,const void *,size_t);
static int    (*libc_readv)(int,const struct iovec *,int);
static int    (*libc_writev)(int,const struct iovec *,int);
static int    (*libc_ioctl)(int,int,void *);
static pid_t  (*libc_fork)(void);

/* of the members of the poll family, RP only uses select */
static int  (*libc_select)(int,fd_set *,fd_set *,fd_set *,
                           struct timeval *timeout);

tatic int debug;
static char *outpath;
static char *audioname;
static char *Xname;
static unsigned long Xinet_port;
static char *Xunix_socket;

tatic FILE *backchannel_fd=NULL;

tatic int audio_fd=-1;
static int audio_channels=-1;
static int audio_rate=-1;
static int audio_format=-1;

tatic int X_fd=-1;

tatic pthread_t snatch_backchannel_thread;

#include "x11.c" /* yeah, ugly, but I don't want to leak symbols. 
                    Oh and I'm lazy. */

tatic char *audio_fmts[]={"unknown format",
                          "8 bit mu-law",
                          "8 bit A-law",
                          "ADPCM",
                          "unsigned, 8 bit",
                          "signed, 16 bit, little endian",
                          "signed, 16 bit, big endian",
                          "signed, 8 bit",
                          "unsigned, 16 bit, little endian",
                          "unsigned, 16 bit, big endian",
                          "MPEG 2",
                          "Dolby Digial AC3"};

tatic char *formatname(int format){
  int i;
  for(i=0;i<12;i++)
    if(format==((1<<i)>>1))return(audio_fmts[i]);
  return(audio_fmts[0]);
}

/* although RealPlayer is both multiprocess and multithreaded, we
don't lock because we assume only one thread/process will be mucking
with a specific X drawable or audio device at a time */

void *get_me_symbol(char *symbol){
  void *ret=dlsym(RTLD_NEXT,symbol);
  if(ret==NULL){
    char *dlerr=dlerror();
    fprintf(stderr,
            "**ERROR: libsnatch.so could not find the function '%s()'\n"
            "         in libc.  This shouldn't happen and I'm not going to\n"
            "         make any wild guesses as to what caused it.  The\n"
            "         error returned by dlsym() was:\n         %s",
            symbol,(dlerr?dlerr:"no such symbol"));
    fprintf (stderr,"\n\nCannot continue.  exit(1)ing...\n\n");
    exit(1);
  }else
    if(debug)
      fprintf(stderr,"    ...: symbol '%s()' found and subverted.\n",symbol);

  return(ret);
}

void *backchannel_and_timer(void *dummy){
  if(debug)
    fprintf(stderr,"    ...: Backchannel thread %lx reporting for duty!\n",
            (unsigned long)pthread_self());

  while(1){
    char length;
    size_t bytes=fread(&length,1,1,backchannel_fd);
    
    if(bytes<=0){
      fprintf(stderr,"**ERROR: Backchannel lost!  exit(1)ing...\n");
      exit(1);
    }

    if(debug)
      fprintf(stderr,"    ...: Backchannel request\n");
  }
}

void initialize(void){
  if(!libc_open){

    /* be chatty? */    
    if(getenv("SNATCH_DEBUG"))debug=1;
    if(debug)fprintf(stderr,
                     "----env: SNATCH_DEBUG\n"
                     "           set\n");

    /* get handles to the libc symbols we're subverting */
    libc_open=get_me_symbol("open");
    libc_close=get_me_symbol("close");
    libc_read=get_me_symbol("read");
    libc_readv=get_me_symbol("readv");
    libc_write=get_me_symbol("write");
    libc_writev=get_me_symbol("writev");
    libc_connect=get_me_symbol("connect");
    libc_ioctl=get_me_symbol("ioctl");
    libc_fork=get_me_symbol("fork");
    libc_select=get_me_symbol("select");

    /* output path? */
    outpath=getenv("SNATCH_OUTPUT_PATH");
    if(!outpath){
      if(debug)
        fprintf(stderr,
                "----env: SNATCH_OUTPUT_PATH\n"
                "           not set. Using current working directory.\n");
      outpath=".";
    }else{
      if(debug)
        fprintf(stderr,
                "----env: SNATCH_OUTPUT_PATH\n"
                "           set (%s)\n",outpath);
    }

    /* audio device? */
    audioname=getenv("SNATCH_AUDIO_DEVICE");
    if(!audioname){
      if(debug)
        fprintf(stderr,
                "----env: SNATCH_AUDIO_DEVICE\n"
                "           not set. Using default (/dev/dsp*).\n");
      audioname="/dev/dsp*";
    }else{
      if(debug)
        fprintf(stderr,
                "----env: SNATCH_AUDIO_DEVICE\n"
                "           set (%s)\n",audioname);
    }

    if(debug)
      fprintf(stderr,"    ...: Now watching for RealPlayer audio output.\n");

    /* X socket? */
    Xname=getenv("SNATCH_X_PORT");
    if(!Xname){
      char *display=getenv("DISPLAY");
      
      if(!display){
        fprintf(stderr,
                "**ERROR: DISPLAY environment variable not set, and no explicit\n"
                "         socket/host/port set via SNATCH_X_PORT. exit(1)ing...\n\n");
        exit(1);
      }

      Xname=display;	

      if(debug)
        fprintf(stderr,
                "----env: SNATCH_X_PORT\n"
                "           not set. Using DISPLAY value (%s).\n",display);
    }else{
      if(debug)
        fprintf(stderr,
                "----env: SNATCH_X_PORT\n"
                "           set (%s)\n",Xname);
    }
    
    if(Xname[0]==':'){
      /* local display */
      Xunix_socket=strdup("/tmp/.X11-unix/X                          ");
      sprintf(Xunix_socket+16,"%d",atoi(Xname+1));

      if(debug)
        fprintf(stderr,
                "    ...: Now watching for RealPlayer X connection on\n"
                "         local AF_UNIX socket %s\n",Xunix_socket);

    }else if(Xname[0]=='/'){
      Xunix_socket=strdup(Xname);

      if(debug)
        fprintf(stderr,
                "    ...: Now watching for RealPlayer X connection on\n"
                "         local AF_UNIX socket %s\n",Xunix_socket);
    }else{
      /* named host/port.  We only pay attention to port. */
      char *colonpos=strchr(Xname,':');

      if(!colonpos)
        Xinet_port=6000;
      else
        Xinet_port=atoi(colonpos)+6000;

      if(debug)
        fprintf(stderr,
                "    ...: Now watching for RealPlayer X connection on\n"
                "         AF_INET socket *.*.*.*:%ld\n",Xinet_port);
      
    }

    {
      int ret;
      struct sockaddr_un addr;
      char backchannel_socket[sizeof(addr.sun_path)];
      int temp_fd;

      memset(backchannel_socket,0,sizeof(backchannel_socket));
      if(getenv("SNATCH_COMM_SOCKET"))
        strncpy(backchannel_socket,getenv("SNATCH_COMM_SOCKET"),
                sizeof(addr.sun_path)-1);

      if(backchannel_socket[0]){

        if(debug)
          fprintf(stderr,
                  "----env: SNATCH_COMM_SOCKET\n"
                  "         set to %s; trying to connect...\n",
                  backchannel_socket);
        temp_fd=socket(AF_UNIX,SOCK_STREAM,0);
        if(temp_fd<0){
          fprintf(stderr,
                  "**ERROR: socket() call for backchannel failed.\n"
                  "         returned error %d:%s\n"
                  "         exit(1)ing...\n\n",errno,strerror(errno));
          exit(1);
        }

        addr.sun_family=AF_UNIX;
        strcpy(addr.sun_path,backchannel_socket);

        if((*libc_connect)(temp_fd,(struct sockaddr *)&addr,sizeof(addr))<0){
          fprintf(stderr,
                  "**ERROR: connect() call for backchannel failed.\n"
                  "         returned error %d: %s\n"
                  "         exit(1)ing...\n\n",errno,strerror(errno));
          exit(1);
        }
        if(debug)
          fprintf(stderr,
                  "    ...: connected to backchannel\n");

        backchannel_fd=fdopen(temp_fd,"w+");
        if(backchannel_fd==NULL){
          fprintf(stderr,
                  "**ERROR: fdopen() failed on backchannel fd.  error returned:\n"
                  "         %s\n         exit(1)ing...\n\n",strerror(errno));
          exit(1);
        }

        if(debug)
          fprintf(stderr,
                  "    ...: starting backchannel/fake event thread...\n");
        
        if((ret=pthread_create(&snatch_backchannel_thread,NULL,
                       backchannel_and_timer,NULL))){
          fprintf(stderr,
                  "**ERROR: could not create backchannel worker thread.\n"
                  "         Error code returned: %d\n"
                  "         exit(1)ing...\n\n",ret);
          exit(1);
        }else
          if(debug)
            fprintf(stderr,
                    "         ...done.\n");

      }else
        if(debug)
          fprintf(stderr,
                  "----env: SNATCH_COMM_SOCKET\n"
                  "         not set \n");

    }

    StartClientConnection();
    StartServerConnection();
  }
}

pid_t fork(void){
  initialize();
  return((*libc_fork)());
}

/* The audio device is subverted through open() */
int open(const char *pathname,int flags,mode_t mode){
  int ret;

  initialize();
  ret=(*libc_open)(pathname,flags,mode);

  if(ret>-1){
    /* open needs only watch for the audio device. */
    if( (audioname[strlen(audioname)-1]=='*' &&
         !strncmp(pathname,audioname,strlen(audioname)-1)) ||
        (audioname[strlen(audioname)-1]!='*' &&
         !strcmp(pathname,audioname))){
      
      /* a match! */
      if(audio_fd>-1){
        /* umm... an audio fd is already open.  report the problem and
           continue */
        fprintf(stderr,
                "\n"
                "WARNING: RealPlayer is attempting to open more than one\n"
                "         audio device (in this case, %s).\n"
                "         This behavior is unexpected; ignoring this open()\n"
                "         request.\n",pathname);
      }else{
        audio_fd=ret;
        audio_channels=-1;
        audio_rate=-1;
        audio_format=-1;
        if(debug)
          fprintf(stderr,
                  "    ...: Caught RealPlayer opening audio device "
                  "%s (fd %d).\n",
                  pathname,ret);
      }
    }
  }
  return(ret);
}

/* The X channel is subverted through connect */
int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen){
  int ret;
  initialize();

  ret=(*libc_connect)(sockfd,serv_addr,addrlen);

  if(ret>-1){
    if(serv_addr->sa_family==AF_UNIX){
      struct sockaddr_un *addr=(struct sockaddr_un *)serv_addr;
      if(!strcmp(Xunix_socket,addr->sun_path)){
              X_fd=sockfd;
        if(debug)
          fprintf(stderr,
                  "    ...: Caught RealPlayer connecting to X server\n"
                  "         local socket %s (fd %d).\n",
                  Xunix_socket,ret);
      } 
    }
    
    if(Xinet_port && serv_addr->sa_family==AF_INET){
      struct sockaddr_in *addr=(struct sockaddr_in *)serv_addr;
      unsigned int port=ntohs(addr->sin_port);
      unsigned long host=ntohl(addr->sin_addr.s_addr);
      if(Xinet_port==port){
        X_fd=sockfd;
        if(debug)
          fprintf(stderr,
                  "    ...: Caught RealPlayer connecting to X server\n"
                  "         on host %ld.%ld.%ld.%ld port %d (fd %d).\n",
                  (host>>24)&0xff,(host>>16)&0xff,(host>>8)&0xff,	host&0xff,
                  port,ret);
      }
    }
  }

  return(ret);
}

int close(int fd){
  int ret;

  initialize();

  ret=(*libc_close)(fd);
  
  if(fd==audio_fd){
    audio_fd=-1;
    if(debug)
      fprintf(stderr,
              "    ...: RealPlayer closed audio playback fd %d\n",fd);
  }
  if(fd==X_fd){
    X_fd=-1;
    if(debug)
      fprintf(stderr,
              "    ...: RealPlayer shut down X socket fd %d\n",fd);

    StopClientConnection();
    StopServerConnection();
  }
  
  return(ret);
}

ize_t write(int fd, const void *buf,size_t count){
  initialize();

  if(fd==X_fd){
    ProcessBuffer(&clientCS,(void *)buf,count,DataToServer);
    return(count);
  }

  return((*libc_write)(fd,buf,count));
}

ize_t read(int fd, void *buf,size_t count){
  int ret;
  initialize();

  ret=(*libc_read)(fd,buf,count);

  if(ret>0)
    if(fd==X_fd)
      ProcessBuffer(&serverCS,buf,ret,NULL);
  
  return(ret);
}

int readv(int fd,const struct iovec *v,int n){
  if(fd==audio_fd || fd==X_fd){
    int i,ret,count=0;
    for(i=0;i<n;i++){
      ret=read(fd,v[i].iov_base,v[i].iov_len);
      if(ret<0 && count==0)return(ret);
      if(ret<0)return(count);
      count+=ret;
      if(ret<v[i].iov_len)return(count);
    }
    return(count);
  }else
    return((*libc_readv)(fd,v,n));
}

int writev(int fd,const struct iovec *v,int n){
  if(fd==audio_fd || fd==X_fd){
    int i,ret,count=0;
    for(i=0;i<n;i++){
      ret=write(fd,v[i].iov_base,v[i].iov_len);
      if(ret<0 && count==0)return(ret);
      if(ret<0)return(count);
      count+=ret;
      if(ret<v[i].iov_len)return(count);
    }
    return(count);
  }else
    return((*libc_writev)(fd,v,n));
}

/* watch audio ioctl()s to track playback rate/channels/depth */
/* stdargs are here only to force the clean compile */
int ioctl(int fd,unsigned long int rq, ...){
  va_list optional;
  void *arg;
  int ret;
  initialize();
  
  va_start(optional,rq);
  arg=va_arg(optional,void *);
  va_end(optional);
  
  if(fd==audio_fd){
    if(rq==SNDCTL_DSP_SPEED ||
       rq==SNDCTL_DSP_CHANNELS ||
       rq==SNDCTL_DSP_SETFMT){

      ret=(*libc_ioctl)(fd,rq,arg);
      
      if(ret==0){
        switch(rq){
        case SNDCTL_DSP_SPEED:
          audio_rate=*(int *)arg;
          if(debug)
            fprintf(stderr,
                    "    ...: Audio output sampling rate set to %dHz.\n",
                    audio_rate);
          break;
        case SNDCTL_DSP_CHANNELS:
          audio_channels=*(int *)arg;
          if(debug)
            fprintf(stderr,
                    "    ...: Audio output set to %d channels.\n",
                    audio_channels);
          break;
        case SNDCTL_DSP_SETFMT:
          audio_format=*(int *)arg;
          if(debug)
            fprintf(stderr,
                    "    ...: Audio output format set to %s.\n",
                    formatname(audio_format));
          break;
        }
      }
      return(ret);
    }
  }
  return((*libc_ioctl)(fd,rq,arg));
}

int select(int  n,  fd_set  *readfds,  fd_set  *writefds,
           fd_set *exceptfds, struct timeval *timeout){
  int ret;

  ret=(*libc_select)(n,readfds,writefds,exceptfds,timeout);

  /* it turns out that RealPlayer busywaits using select [jeez], so we
     don't need to do any extra work to wake it up to send our own
     events. However, just in case, if we're called with a large
     timeout, shave it down a bit. */

  /* do we have a pending synthetic event? */
  
  /* is one of the read fds our X socket? */

  return (*libc_select)(n,readfds,writefds,exceptfds,timeout);

}

1.1                  snatch/snatch.pl

Index: snatch.pl
===================================================================
#!/usr/bin/perl

use Socket;
use Sys::Hostname;
use Tk;

use Tk qw(exit); 

my $backchannel_socket="/tmp/snatch";
my $uaddr=sockaddr_un($backchannel_socket);
my $proto=getprotobyname('tcp');

die $! unless socket(LISTEN_SOCK, PF_UNIX, SOCK_STREAM,0);
unlink($backchannel_socket);
die $! unless bind(LISTEN_SOCK,$uaddr);
die $! unless listen(LISTEN_SOCK,SOMAXCONN);
die $! unless accept(COMM_SOCK,LISTEN_SOCK);

while(1){
    $char=getc STDIN;
    syswrite COMM_SOCK,$char,1;
}

1.1                  snatch/snatchppm.h

Index: snatchppm.h
===================================================================
static long snatchwidth=91;
static long snatchheight=68;
static unsigned char snatchppm[]={
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,125, 48, 55, 60, 22, 21, 30,  9,  4,
 30, 10,  4, 30, 10,  4, 23,  7,  0, 30,  9,  4, 30, 10,  4,
 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4,
 30,  9,  4, 30,  9,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4,
 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4,
 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4,
 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4,
 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4,
 30,  9,  4, 60, 23, 21, 60, 23, 21, 30,  9,  4, 30,  9,  4,
 60, 23, 21, 60, 23, 21, 30,  9,  4, 30,  9,  4, 60, 23, 21,
 60, 23, 21, 30,  9,  4, 30,  9,  4, 60, 23, 21, 60, 23, 21,
 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4,
 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4,
 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4,
 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4,
 30, 10,  4, 24,  8,  0, 30, 10,  4, 30, 10,  4, 30,  9,  4,
 60, 22, 21,125, 48, 55,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 28,  4,  0, 74, 40, 37, 82, 38, 35,
 84, 34, 33, 85, 36, 34, 84, 36, 35, 86, 37, 38, 84, 35, 36,
 85, 36, 34, 83, 35, 34, 85, 36, 37, 84, 35, 36, 85, 36, 34,
 84, 36, 35, 85, 36, 37, 84, 35, 36, 84, 36, 35, 84, 36, 35,
 84, 35, 36, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36,
 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35,
 85, 36, 37, 84, 35, 36, 84, 36, 35, 84, 36, 35, 84, 35, 36,
 84, 35, 36, 84, 36, 35, 84, 36, 35, 84, 35, 36, 84, 35, 36,
 84, 36, 35, 84, 36, 35, 84, 35, 36, 84, 35, 36, 84, 36, 35,
 84, 36, 35, 84, 35, 36, 84, 35, 36, 85, 36, 34, 84, 36, 35,
 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36,
 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
 84, 36, 35, 85, 36, 34, 84, 36, 35, 84, 34, 33, 85, 36, 34,
 85, 36, 34, 82, 38, 35, 75, 39, 34, 30,  4,  0, 92, 35, 38,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 28,  4,  0, 91, 35, 34,108, 31, 33,
 99, 10,  8,105,  4,  4,155, 56, 58,153, 54, 58,154, 53, 60,
153, 52, 59,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,154, 53, 60,153, 52, 59,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,154, 53, 60,
155, 54, 59,106,  5,  5,101, 12,  8,109, 32, 33, 94, 36, 33,
 76, 39, 33, 24,  7,  0,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 28,  4,  0, 84, 35, 36, 87,  8,  8,
158, 57, 59,164, 53, 56,165, 54, 57,157, 54, 58,155, 54, 59,
156, 53, 61,154, 53, 60,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,155, 54, 59,153, 54, 58,153, 54, 58,
153, 54, 58,153, 54, 58,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,153, 54, 58,153, 54, 58,153, 54, 58,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,154, 53, 60,
153, 52, 59,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,
153, 54, 58,155, 54, 59,153, 54, 58,155, 54, 59,153, 54, 58,
153, 52, 59,156, 53, 60,164, 53, 58,166, 53, 58,159, 54, 59,
 96,  5,  5, 99, 34, 32, 78, 40, 33, 92, 35, 38,142, 55, 64,
142, 55, 64,142, 55, 64, 28,  4,  0, 89, 35, 34, 87,  8,  8,
155, 46, 64,158, 43, 64,168, 71, 81, 84,  7,  9, 92, 37, 35,
 85, 36, 34, 85, 36, 37, 85, 36, 37, 85, 36, 34, 84, 36, 35,
 85, 36, 37, 84, 36, 35, 85, 36, 34, 84, 36, 35, 84, 36, 35,
 84, 35, 36, 84, 35, 36, 84, 35, 36, 85, 36, 37, 84, 35, 36,
 84, 36, 35, 84, 36, 35, 84, 35, 36, 84, 36, 35, 85, 36, 34,
 84, 36, 35, 85, 36, 34, 84, 35, 36, 84, 36, 35, 84, 36, 35,
 84, 35, 36, 84, 36, 35, 85, 36, 34, 84, 36, 35, 85, 36, 34,
 84, 35, 36, 85, 36, 37, 84, 35, 36, 85, 36, 37, 84, 35, 36,
 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35,
 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36,
 85, 36, 34, 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34,
 84, 36, 35, 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35,
 85, 36, 37, 84, 35, 36, 85, 36, 34, 84, 36, 35, 85, 36, 37,
 84, 35, 36, 84, 36, 35, 91, 34, 35,134, 53, 64,176, 69, 89,
166, 39, 63,169, 42, 60,102,  5,  7,104, 33, 31, 30,  2,  0,
142, 55, 64,142, 55, 64,125, 48, 55, 74, 40, 37,108, 31, 33,
157, 54, 61,162, 39, 65,178, 65, 91, 99, 24, 35, 48,  2,  0,
 44,  1,  0, 42,  2,  0, 44,  1,  0, 46,  1,  0, 42,  0,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  2,  0, 44,  2,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  2,  0, 44,  2,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  2,  0, 44,  2,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  2,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  2,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0, 44,  1,  0,
 44,  1,  0, 42,  0,  0, 42,  3,  0, 42,  0,  0, 46,  0,  2,
101, 16, 38,201, 66,101,180, 33, 64,171, 50, 58, 94, 13,  9,
 76, 38, 35,125, 48, 55,142, 55, 64, 60, 23, 21, 82, 38, 35,
 97,  6,  6,167, 46, 58,182, 55, 85, 92,  0, 17, 40,  0,  1,
 33,  0,  1, 54,  2,  0, 68,  3,  0, 74,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 76,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 76,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0, 78,  3,  0,
 78,  3,  0, 78,  3,  0, 76,  3,  0, 70,  3,  0, 56,  0,  1,
 33,  0,  1, 44,  0,  3,160, 31, 68,215, 64,100,175, 46, 58,
101,  6,  6, 82, 38, 35, 60, 23, 21,142, 55, 64, 30, 10,  4,
 84, 36, 35,155, 54, 59,169, 42, 60,195, 70,102, 70,  0,  4,
 34,  0,  2, 36,  2,  0, 96, 10,  7,183, 64, 67,187, 62, 65,
189, 60, 63,190, 61, 64,190, 61, 64,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,191, 60, 63,191, 60, 63,191, 60, 63,
191, 60, 63,191, 60, 63,191, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
190, 61, 64,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,190, 61, 64,189, 60, 63,
189, 58, 64,189, 58, 64,189, 58, 64,189, 58, 64,190, 61, 64,
189, 60, 63,189, 60, 63,188, 59, 62,188, 59, 62,189, 60, 63,
189, 58, 64,189, 58, 64,190, 61, 64,189, 60, 63,189, 60, 63,
188, 59, 62,188, 59, 62,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,190, 61, 64,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,187, 62, 65,165, 49, 46,
 96,  7, 10, 34,  3,  0, 34,  0,  2,124,  5, 41,212, 61,104,
175, 40, 62,153, 54, 58, 85, 36, 34, 24,  7,  0,142, 55, 64,
 30,  9,  4, 84, 35, 36,152, 51, 60,166, 39, 63,190, 65,106,
 70,  0,  6, 44,  2,  0, 80, 22, 15,198, 61, 61,230, 51, 60,
231, 52, 60,233, 52, 56,233, 52, 56,233, 52, 56,233, 52, 56,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
231, 50, 59,231, 50, 59,233, 50, 59,233, 48, 57,233, 48, 57,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 48, 57,233, 48, 57,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
232, 49, 58,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,231, 52, 60,
231, 52, 57,196, 61, 61, 52,  1,  0, 38,  0,  0,120,  7, 39,
204, 63,103,186, 55, 82,150, 49, 61, 89, 34, 34, 28,  7,  0,
142, 55, 64, 30,  9,  4, 84, 36, 35,150, 49, 63,180, 55, 84,
186, 63,106, 70,  0,  6, 48,  0,  1, 92, 20, 13,219, 58, 58,
254, 45, 55,254, 47, 52,254, 47, 52,254, 47, 52,254, 47, 52,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,
242, 51, 56,242, 51, 56,242, 51, 56,242, 51, 56,247, 48, 53,
247, 48, 53,247, 48, 53,246, 51, 56,242, 51, 56,242, 51, 56,
240, 53, 58,240, 53, 58,242, 51, 56,246, 51, 56,247, 48, 53,
247, 48, 53,246, 47, 52,247, 48, 53,249, 48, 53,253, 48, 58,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,213, 54, 58, 78, 17, 17, 38,  0,  0,
117,  8, 39,201, 62,105,185, 54, 85,150, 47, 64, 92, 37, 35,
 69, 44, 34,142, 55, 64, 30, 10,  4, 81, 35, 34,148, 47, 63,
179, 54, 86,186, 63,106, 70,  0,  6, 48,  0,  1, 92, 20, 13,
219, 58, 58,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,230, 40, 49,230, 40, 49,230, 40, 49,
230, 40, 49,230, 40, 49,230, 40, 49,230, 40, 49,229, 39, 48,
230, 40, 49,230, 40, 49,230, 40, 49,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,212, 61, 65,
215, 60, 64,212, 61, 65,212, 61, 65,217, 60, 64,226, 57, 57,
231, 54, 54,231, 54, 54,231, 54, 54,233, 56, 56,238, 55, 55,
249, 48, 53,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,214, 55, 59, 52,  2,  0,
 32,  0,  3,115,  8, 41,201, 62,105,185, 54, 85,152, 47, 64,
 96, 34, 33, 73, 43, 34,125, 48, 55, 30, 10,  4, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 68,  0,  7, 42,  0,  0,
 87, 20, 14,217, 58, 58,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
196, 34, 42,196, 34, 42,196, 34, 42,195, 35, 43,150, 28, 33,
146, 28, 30,141, 30, 33,138, 30, 32,135, 30, 33,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,116, 13, 11,
116, 13, 11,116, 13, 11,114, 16, 11,114, 16, 11,119, 13, 10,
123, 11,  6,127,  2,  2,127,  7,  4,151, 38, 40,151, 38, 40,
151, 38, 40,167, 42, 45,167, 42, 45,167, 42, 45,175, 42, 45,
181, 41, 45,183, 40, 47,214, 45, 49,222, 44, 52,249, 48, 53,
253, 48, 58,254, 45, 55,254, 45, 55,254, 45, 55,212, 55, 63,
 50,  2,  0, 30,  0,  4,115,  8, 41,201, 62,105,185, 54, 85,
152, 47, 64, 98, 34, 33, 75, 42, 32,125, 48, 55, 30, 10,  4,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 64,  0,  9,
 32,  0,  3, 56,  2,  0,214, 55, 59,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,223, 39, 48,172, 30, 36,145, 24, 31,
102, 17, 21, 52,  8, 11, 46,  8,  9, 42,  7,  9, 42,  8,  9,
 41,  8,  9, 38,  8,  9, 33,  9,  9, 19,  6,  6,  5,  1,  1,
  1,  0,  0,  1,  0,  0,  2,  0,  0,  8,  0,  0,  1,  0,  0,
 15,  0,  0, 30,  1,  0, 36,  2,  0, 36,  2,  0, 36,  2,  0,
 36,  2,  0, 36,  2,  0, 36,  2,  0, 36,  2,  0, 36,  2,  0,
 36,  2,  0, 36,  2,  0, 36,  2,  0, 36,  2,  0, 36,  2,  0,
 36,  2,  0, 36,  2,  0, 36,  2,  0, 36,  2,  0, 42,  0,  0,
 40,  1,  0, 38,  1,  0, 32,  1,  0, 25,  2,  0, 22,  1,  0,
 20,  1,  0, 21,  0,  0, 21,  0,  0, 21,  0,  0, 24,  0,  0,
 27,  0,  0, 26,  1,  0, 11,  0,  0,  1,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 23,  4,  5, 23,  4,  5, 63, 10, 13,
100, 16, 20,131, 22, 27,192, 35, 42,243, 44, 54,254, 45, 55,
212, 55, 63, 50,  2,  0, 30,  0,  4,114,  7, 40,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55,
 30, 10,  4, 82, 36, 35,146, 47, 63,178, 53, 88,186, 63,106,
 62,  0, 10, 26,  0,  4, 48,  2,  0,212, 55, 59,254, 45, 55,
254, 45, 55,254, 47, 57,253, 44, 54,254, 45, 55,254, 45, 55,
254, 45, 55,217, 38, 47,129, 22, 27, 63, 11, 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,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 22,  3,  1, 11,  5,  2,  6,  5,  3,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  6,  5,  3,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  6,  1,  5,  3,  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,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0, 71, 12, 14,137, 28, 31,
230, 48, 53,205, 58, 62, 48,  2,  0, 32,  0,  3,115,  8, 41,
202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 24,  7,  0, 84, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62,  0, 10, 26,  0,  6, 48,  2,  0,212, 55, 59,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,186, 33, 40, 90, 15, 19,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  8,  3,  5,  7,  2,  6,  7,  2,  6,
  5,  1,  4,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 73, 13, 15,116, 27, 28,194, 59, 62, 44,  2,  0, 32,  0,  3,
114,  7, 40,202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35,
 75, 42, 32,125, 48, 55, 24,  7,  0, 84, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  4, 48,  2,  0,
208, 55, 62,253, 48, 58,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,217, 38, 47, 86, 14, 18,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  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,  1,  2,  5,  1,  4,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  8,  3,  5,  7,  2,  6,
  5,  1,  4,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,113,113,113,
207,207,207,226,226,226,179,179,179, 28, 28, 28,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 84,  9, 10, 99,  6,  6, 32,  0,  0,
 32,  0,  3,115,  8, 41,202, 63,102,185, 54, 85,152, 47, 64,
 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  4,
 48,  2,  0,206, 59, 63,247, 50, 55,253, 46, 56,254, 45, 55,
254, 45, 55,254, 45, 55,128, 22, 27,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  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,  0,  1,  4,  1,  4,
  6,  1,  5,  7,  2,  6,  7,  2,  6,  8,  3,  5,  7,  2,  6,
  7,  2,  6,  3,  0,  2,  0,  0,  0, 85, 85, 85,141,141,141,
122,122,122, 56, 56, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
198,198,198,255,255,255,255,255,255,255,255,255,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0, 53,  4,  6,
 15,  5,  2, 30,  0,  4,113,  8, 40,201, 62,105,183, 54, 84,
152, 47, 64, 98, 33, 35, 75, 42, 32,142, 55, 64, 22,  7,  0,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10,
 26,  0,  4, 46,  2,  0,171, 34, 34,242, 53, 58,251, 48, 58,
253, 44, 54,254, 45, 55,236, 41, 51, 64, 11, 14,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  1,  5,  1,  4,  6,  1,  5,  8,  3,  7,
  7,  2,  6,  7,  2,  6,  2,  0,  1, 85, 85, 85,255,255,255,
255,255,255,255,255,255,113,113,113,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,255,255,255,255,255,255,255,255,255,198,198,198,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  7,  2,  6, 30,  0,  4,115,  8, 41,201, 62,105,
183, 54, 84,152, 47, 64, 98, 33, 35, 75, 42, 32,142, 55, 64,
 20,  7,  0, 80, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
 62,  0, 10, 26,  0,  4, 44,  0,  1,166, 43, 37,237, 56, 56,
249, 48, 53,254, 45, 55,254, 45, 55,172, 30, 37,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  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,  0,  5,  1,  4,
  6,  1,  5,  7,  2,  6,  7,  2,  6,  2,  0,  2,141,141,141,
255,255,255,255,255,255,255,255,255, 56, 56, 56,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 56, 56, 56,255,255,255,255,255,255,255,255,255,
141,141,141,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  7,  2,  6, 30,  0,  4,113,  8, 40,
201, 62,105,183, 54, 84,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 20,  7,  0, 80, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62,  0, 10, 26,  0,  4, 44,  0,  1,163, 42, 36,
235, 62, 58,247, 50, 55,254, 45, 55,254, 45, 55, 95, 17, 21,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 28, 28, 28,179,179,179,255,255,255,255,255,255,
255,255,255,255,255,255,223,223,223,113,113,113,  0,  0,  0,
  0,  0,  0, 85, 85, 85,198,198,198,226,226,226,188,188,188,
144,144,144,238,238,238,255,255,255,255,255,255,255,255,255,
141,141,141,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28, 28, 28,
179,179,179,245,245,245,255,255,255,255,255,255,255,255,255,
242,242,242,155,153,155, 34, 29, 33, 61, 57, 60,189,188,188,
245,245,245,255,255,255,255,255,255,255,255,255,207,207,207,
113,113,113,  0,  0,  0, 28, 28, 28,153,153,153,242,242,242,
255,255,255,255,255,255,255,255,255,217,217,217, 85, 85, 85,
  0,  0,  0,  0,  0,  0,113,113,113,255,255,255,255,255,255,
255,255,255,160,160,160,223,223,223,255,255,255,255,255,255,
255,255,255,141,141,141,  0,  0,  0,  8,  3,  7, 30,  0,  4,
114,  7, 40,201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35,
 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  4, 44,  0,  1,
163, 42, 36,233, 56, 56,247, 48, 53,253, 44, 54,242, 42, 52,
 65, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 85, 85, 85,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
142,141,142,  3,  0,  2,170,170,170,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,113,113,113,  0,  0,  0, 56, 56, 56,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,199,198,199, 89, 86, 89,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255, 87, 85, 86, 89, 85, 88,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255, 85, 85, 85,  0,  0,  0,170,170,170,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,113,113,113,  7,  2,  6,
 30,  0,  4,115,  8, 41,201, 62,105,185, 54, 85,152, 47, 64,
 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62,  0,  8, 26,  0,  4,
 44,  0,  1,126,  5,  3,233, 56, 56,247, 48, 53,254, 45, 55,
210, 39, 48,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,226,226,226,255,255,255,255,255,255,
229,229,229, 28, 28, 28,113,113,113,255,255,255,255,255,255,
255,255,255,255,255,255,  0,  0,  0,255,255,255,255,255,255,
255,255,255,255,255,255,179,179,179, 52, 52, 52,204,204,204,
255,255,255,255,255,255,255,255,255,170,170,170,  0,  0,  0,
226,226,226,255,255,255,255,255,255,232,232,232, 56, 56, 56,
 85, 85, 85,255,255,255,255,255,255,255,255,255,255,255,255,
 56, 56, 56,144,144,144,255,255,255,255,255,255,255,255,255,
217,217,217,103,103,103, 52, 52, 52,255,255,255,255,255,255,
255,255,255,255,255,255, 85, 85, 85,113,113,113,255,255,255,
255,255,255,255,255,255,198,198,198,  0,  0,  0,226,226,226,
255,255,255,255,255,255,255,255,255,179,179,179, 52, 52, 52,
204,204,204,255,255,255,255,255,255,255,255,255,170,170,170,
  7,  2,  6, 30,  0,  4,115,  8, 41,202, 63,106,185, 54, 85,
152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0,  8,
 26,  0,  4, 44,  0,  1,127,  7,  4,231, 54, 54,247, 48, 53,
254, 49, 59,187, 36, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 85, 85, 85,255,255,255,255,255,255,
255,255,255,198,198,198,  0,  0,  0,  0,  0,  0,170,170,170,
226,226,226,226,226,226,170,170,170, 28, 28, 28,255,255,255,
255,255,255,255,255,255,226,226,226,  0,  0,  0,  0,  0,  0,
 85, 85, 85,255,255,255,255,255,255,255,255,255,170,170,170,
 28, 28, 28,179,179,179,226,226,226,198,198,198, 85, 85, 85,
  0,  0,  0, 28, 28, 28,255,255,255,255,255,255,255,255,255,
170,170,170,  0,  0,  0, 85, 85, 85,255,255,255,255,255,255,
255,255,255, 85, 85, 85,  0,  0,  0,141,141,141,255,255,255,
255,255,255,255,255,255,113,113,113,  0,  0,  0,  0,  0,  0,
255,255,255,255,255,255,255,255,255,255,255,255,  0,  0,  0,
255,255,255,255,255,255,255,255,255,229,229,229, 28, 28, 28,
  0,  0,  0, 85, 85, 85,255,255,255,255,255,255,255,255,255,
172,170,172,  7,  2,  6, 30,  0,  4,115,  8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 34,125, 48, 55,
 22,  7,  0, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
 62,  0,  8, 26,  0,  4, 42,  0,  0,123,  6,  4,230, 55, 55,
246, 49, 59,249, 48, 53,147, 33, 33,  1,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 85,255,255,255,
255,255,255,255,255,255,255,255,255,245,245,245,198,198,198,
 85, 85, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 85,
255,255,255,255,255,255,255,255,255,113,113,113,  0,  0,  0,
  0,  0,  0,113,113,113,255,255,255,255,255,255,255,255,255,
 85, 85, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 85,
141,141,141,179,179,179,242,242,242,255,255,255,255,255,255,
255,255,255,141,141,141,  0,  0,  0,170,170,170,255,255,255,
255,255,255,255,255,255, 56, 56, 56, 28, 28, 28,255,255,255,
255,255,255,255,255,255,226,226,226,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 56, 56, 56,122,122,122,141,141,141, 85, 85, 85,
 85, 85, 85,255,255,255,255,255,255,255,255,255,141,141,141,
  0,  0,  0,  0,  0,  0,113,113,113,255,255,255,255,255,255,
255,255,255, 89, 86, 89,  8,  3,  7, 30,  0,  4,115,  8, 41,
201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 34,
125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62,  0,  8, 24,  0,  3, 40,  0,  0,118,  7,  5,
223, 58, 58,244, 51, 56,246, 51, 56,149, 41, 39,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
170,170,170,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255, 85, 85, 85,  0,  0,  0,
141,141,141,255,255,255,255,255,255,255,255,255, 56, 56, 56,
  0,  0,  0,  0,  0,  0,170,170,170,255,255,255,255,255,255,
255,255,255, 56, 56, 56,  0,  0,  0,141,141,141,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255, 85, 85, 85,  0,  0,  0,198,198,198,
255,255,255,255,255,255,255,255,255,  0,  0,  0, 85, 85, 85,
255,255,255,255,255,255,255,255,255,141,141,141,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,113,113,113,255,255,255,255,255,255,255,255,255,
 85, 85, 85,  0,  0,  0,  0,  0,  0,170,170,170,255,255,255,
255,255,255,255,255,255, 59, 56, 59,  6,  1,  5, 30,  0,  4,
115,  8, 41,200, 61,104,185, 54, 85,152, 47, 64, 98, 33, 35,
 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62,  0, 10, 24,  0,  5, 36,  1,  0,
137, 34, 28,217, 64, 60,242, 51, 56,242, 51, 56,172, 53, 47,
  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 56, 56, 56,188,188,188,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
 56, 56, 56,198,198,198,255,255,255,255,255,255,255,255,255,
  0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,255,255,255,255,
255,255,255,255,255,255,  0,  0,  0,198,198,198,255,255,255,
255,255,255,255,255,255,179,179,179,122,122,122,166,166,166,
255,255,255,255,255,255,255,255,255, 28, 28, 28,  0,  0,  0,
255,255,255,255,255,255,255,255,255,198,198,198,  0,  0,  0,
170,170,170,255,255,255,255,255,255,255,255,255, 85, 85, 85,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,170,170,170,255,255,255,255,255,255,
255,255,255, 28, 28, 28,  0,  0,  0,  0,  0,  0,255,255,255,
255,255,255,255,255,255,255,255,255,  0,  0,  0,  5,  0,  4,
 30,  0,  4,115,  8, 41,202, 63,102,185, 54, 85,152, 47, 64,
 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10, 24,  0,  5,
 34,  3,  0,114, 13, 11,214, 69, 61,240, 51, 55,240, 51, 55,
197, 65, 58, 23,  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, 85, 85, 85,235,235,235,255,255,255,255,255,255,
255,255,255, 85, 85, 85,255,255,255,255,255,255,255,255,255,
198,198,198,  0,  0,  0,  0,  0,  0, 28, 28, 28,255,255,255,
255,255,255,255,255,255,170,170,170,113,113,113,255,255,255,
255,255,255,255,255,255,113,113,113,  0,  0,  0,  0,  0,  0,
226,226,226,255,255,255,255,255,255,226,226,226,  0,  0,  0,
 85, 85, 85,255,255,255,255,255,255,255,255,255,141,141,141,
  0,  0,  0,170,170,170,255,255,255,255,255,255,255,255,255,
 85, 85, 85,  0,  0,  0,  0,  0,  0,113,113,113,207,207,207,
226,226,226,170,170,170,  0,  0,  0,255,255,255,255,255,255,
255,255,255,226,226,226,  0,  0,  0,  0,  0,  0, 28, 28, 28,
255,255,255,255,255,255,255,255,255,170,170,170,  0,  0,  0,
  3,  0,  2, 30,  0,  4,115,  8, 41,202, 63,102,185, 54, 85,
152, 47, 62, 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10,
 24,  0,  5, 52,  6,  5, 78,  9, 12,208, 61, 65,238, 53, 58,
242, 51, 56,217, 69, 62, 90, 18, 19,  1,  0,  0,  0,  0,  0,
  0,  0,  0,170,170,170,255,255,255,255,255,255,255,255,255,
113,113,113,  0,  0,  0,  0,  0,  0,198,198,198,255,255,255,
255,255,255,255,255,255, 77, 77, 77,255,255,255,255,255,255,
255,255,255,170,170,170,  0,  0,  0,  0,  0,  0, 85, 85, 85,
255,255,255,255,255,255,255,255,255,141,141,141,170,170,170,
255,255,255,255,255,255,255,255,255, 85, 85, 85,  0,  0,  0,
113,113,113,255,255,255,255,255,255,255,255,255,170,170,170,
  0,  0,  0,113,113,113,255,255,255,255,255,255,255,255,255,
 85, 85, 85,  0,  0,  0,141,141,141,255,255,255,255,255,255,
255,255,255,141,141,141,  0,  0,  0, 28, 28, 28,255,255,255,
255,255,255,255,255,255,198,198,198, 28, 28, 28,255,255,255,
255,255,255,255,255,255,170,170,170,  0,  0,  0,  0,  0,  0,
 85, 85, 85,255,255,255,255,255,255,255,255,255,141,141,141,
  0,  0,  0,  0,  0,  0,  0,  0,  0,115,  8, 41,202, 63,102,
185, 54, 85,152, 47, 62, 98, 33, 35, 75, 42, 32,125, 48, 55,
 22,  7,  0, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
 62,  0, 10, 24,  0,  5, 32,  3,  0,  9,  0,  0, 64, 20, 18,
157, 34, 37,247, 50, 55,235, 54, 54,134, 28, 28, 22,  1,  0,
  0,  0,  0,  0,  0,  0,141,141,141,255,255,255,255,255,255,
255,255,255,255,255,255,226,226,226,245,245,245,255,255,255,
255,255,255,255,255,255,141,141,141, 85, 85, 85,255,255,255,
255,255,255,255,255,255, 85, 85, 85,  0,  0,  0,  0,  0,  0,
141,141,141,255,255,255,255,255,255,255,255,255, 85, 85, 85,
141,141,141,255,255,255,255,255,255,255,255,255,245,245,245,
236,236,236,255,255,255,255,255,255,255,255,255,255,255,255,
170,170,170,  0,  0,  0,170,170,170,255,255,255,255,255,255,
255,255,255,238,238,238,113,113,113, 56, 56, 56,255,255,255,
255,255,255,255,255,255,255,255,255,236,236,236,245,245,245,
255,255,255,255,255,255,229,229,229, 28, 28, 28, 85, 85, 85,
255,255,255,255,255,255,255,255,255,113,113,113,  0,  0,  0,
  0,  0,  0,141,141,141,255,255,255,255,255,255,255,255,255,
 85, 85, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,  8, 41,
202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62,  0, 10, 26,  0,  4, 30,  2,  1, 79, 10, 13,
101, 28, 28, 40,  7,  7, 78, 15, 16,154, 31, 34,103, 27, 27,
 23,  0,  0, 10,  1,  0,  0,  0,  0,  0,  0,  0,141,141,141,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,113,113,113,  0,  0,  0,170,170,170,
255,255,255,255,255,255,255,255,255, 56, 56, 56,  0,  0,  0,
  0,  0,  0,170,170,170,255,255,255,255,255,255,255,255,255,
 28, 28, 28, 28, 28, 28,229,229,229,255,255,255,255,255,255,
255,255,255,255,255,255,223,223,223,255,255,255,255,255,255,
255,255,255,170,170,170,  0,  0,  0,113,113,113,255,255,255,
255,255,255,255,255,255,255,255,255,113,113,113,  0,  0,  0,
 85, 85, 85,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,204,204,204, 28, 28, 28,  0,  0,  0,
141,141,141,255,255,255,255,255,255,255,255,255, 85, 85, 85,
  0,  0,  0,  0,  0,  0,170,170,170,255,255,255,255,255,255,
255,255,255, 28, 28, 28, 25,  1,  0,  0,  0,  0,  0,  0,  0,
115,  8, 41,201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35,
 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  4, 29,  2,  0,
 74,  3,  0,192, 61, 61,233, 52, 56,164, 30, 36, 73, 11, 15,
 35,  8,  9, 64,  7,  7, 19,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 28, 28, 28,103,103,103,141,141,141,141,141,141,
141,141,141, 85, 85, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0, 28, 28, 28,103,103,103,
141,141,141,122,122,122, 56, 56, 56,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 56, 56, 56,122,122,122,141,141,141,103,103,103, 28, 28, 28,
  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 85,141,141,141,
141,141,141,122,122,122, 56, 56, 56,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 30,  0,  0, 67,  5,  2,  0,  0,  0,
  0,  0,  0,114,  7, 40,201, 62,105,185, 54, 85,152, 47, 64,
 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  4,
 27,  2,  0, 72,  3,  0,189, 60, 63,233, 52, 56,254, 45, 55,
253, 44, 54,175, 37, 40, 81, 25, 24, 38,  3,  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,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  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,  5,  5, 88, 26, 25,
  0,  0,  0,  0,  0,  0,114,  7, 40,201, 62,105,185, 54, 85,
152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10,
 26,  0,  4, 27,  2,  0, 72,  3,  0,189, 60, 63,233, 50, 59,
254, 45, 55,254, 45, 55,249, 48, 58,238, 51, 56, 87, 18, 21,
 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  3,
  6,  1,  5,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  0,  0,  0,  0,  0,  0,  7,  2,  6,  7,  2,  6,
  6,  5,  6,  4,  3,  4,  6,  6,  6,  6,  3,  5,  6,  3,  5,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  4,  3,  4,  6,  3,  5,
  6,  3,  5,  6,  6,  6,  4,  3,  4,  6,  5,  6,  7,  2,  6,
  7,  2,  6,  0,  0,  0,  0,  0,  0,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  6,  1,  5,  4,  0,  3,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  1,  0,  0, 81, 15, 18,159, 50, 52,
 77,  4,  1,  0,  0,  0,  0,  0,  0,115,  8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55,
 22,  7,  0, 82, 36, 35,146, 47, 63,179, 52, 88,186, 63,106,
 62,  0, 10, 26,  0,  4, 25,  2,  2, 66,  3,  0,185, 64, 64,
231, 52, 60,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
244, 46, 54,205, 45, 50, 66, 11, 13,  7,  1,  1,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  3,  0,  2,  6,  1,  5,  5,  1,  5,  2,  0,  2,
  1,  0,  0,  1,  0,  1,  4,  1,  4,  6,  1,  5,  7,  2,  6,
  7,  2,  6,  0,  0,  0,  0,  0,  0,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  3,  1,  3,  4,  1,  4,  6,  1,  5,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  0,  0,  0,  0,  0,  0,
  7,  2,  6,  7,  2,  6,  6,  1,  5,  4,  1,  4,  1,  0,  1,
  1,  0,  0,  2,  0,  2,  5,  1,  5,  6,  1,  5,  3,  0,  2,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 11,  1,  2,162, 28, 34,229, 51, 59,
185, 64, 64, 66,  3,  0,  0,  0,  0,  0,  0,  0,115,  8, 41,
202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 22,  7,  0, 82, 36, 35,148, 47, 63,179, 52, 88,
186, 63,106, 62,  0, 10, 26,  0,  4, 22,  4,  1, 56,  0,  1,
145, 41, 38,228, 53, 57,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 45, 55,253, 45, 55,240, 45, 54,155, 25, 30,
 76, 13, 16, 15,  2,  3,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  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,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0, 15,  2,  3, 99, 17, 21,234, 41, 50,254, 45, 55,
228, 53, 57,145, 41, 38, 56,  0,  1,  0,  0,  0,  0,  0,  0,
115,  8, 41,202, 63,102,185, 54, 85,152, 47, 64, 98, 33, 35,
 75, 42, 32, 92, 35, 38, 22,  7,  0, 82, 36, 35,148, 47, 63,
179, 52, 88,186, 63,106, 62,  0, 10, 26,  0,  4, 20,  4,  1,
 50,  2,  0,140, 44, 39,226, 55, 59,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 45, 55,
252, 45, 54,220, 39, 47,118, 20, 25,  9,  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,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  9,  1,  2,118, 20, 25,251, 44, 54,254, 45, 55,
254, 45, 55,226, 55, 59,140, 44, 39, 50,  2,  0,  0,  0,  0,
  0,  0,  0,114,  7, 40,202, 63,102,185, 54, 85,152, 47, 64,
 98, 33, 35, 75, 42, 32, 92, 35, 38, 22,  7,  0, 82, 36, 35,
146, 47, 63,179, 52, 88,186, 63,106, 62,  0, 10, 26,  0,  4,
 20,  4,  1, 50,  2,  0,141, 38, 41,224, 55, 59,253, 46, 56,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
253, 45, 55,253, 45, 55,253, 45, 54,250, 44, 53,186, 32, 39,
 59, 10, 12,  7,  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,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  7,  1,  1, 59, 10, 12,186, 32, 39,250, 44, 53,254, 45, 55,
254, 45, 55,253, 46, 56,224, 55, 59,141, 38, 41, 50,  2,  0,
  0,  0,  0,  0,  0,  0,115,  8, 41,202, 63,102,185, 54, 85,
152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10,
 26,  0,  4, 20,  4,  1, 50,  1,  0,140, 44, 39,224, 55, 59,
253, 46, 56,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,253, 45, 55,253, 45, 54,
252, 44, 54,193, 34, 41, 69, 11, 15,  7,  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,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  7,  1,  1, 69, 11, 15,193, 34, 41,252, 44, 54,253, 45, 54,
254, 45, 55,254, 45, 55,253, 46, 56,224, 55, 59,140, 44, 39,
 50,  1,  0,  0,  0,  0,  0,  0,  0,115,  8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,125, 48, 55,
 22,  7,  0, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
 62,  0, 10, 26,  0,  4, 20,  4,  1, 48,  1,  0,107, 12,  8,
224, 53, 57,254, 47, 57,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
253, 45, 55,253, 45, 54,253, 44, 54,223, 38, 48,137, 24, 29,
 39,  7,  8,  4,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  1,
 39,  7,  8,137, 24, 29,223, 38, 48,253, 44, 54,253, 45, 54,
253, 45, 55,254, 45, 55,254, 45, 55,254, 47, 57,224, 53, 57,
107, 12,  8, 48,  1,  0,  0,  0,  0,  0,  0,  0,115,  8, 41,
201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35, 75, 42, 32,
125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62,  0, 10, 26,  0,  4, 20,  4,  1, 48,  0,  1,
105, 12,  8,226, 53, 57,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,
251, 44, 54,194, 34, 41, 49,  8, 10,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  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,  8, 10,194, 34, 41,251, 44, 54,253, 44, 54,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
226, 53, 57,105, 12,  8, 48,  0,  1,  0,  0,  0,  0,  0,  0,
115,  8, 41,201, 62,105,185, 54, 85,152, 47, 64, 98, 33, 35,
 75, 42, 32,125, 48, 55, 22,  7,  0, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  6, 20,  4,  1,
 48,  0,  1,105, 12,  8,227, 54, 58,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,254, 45, 55,236, 41, 51, 85, 15, 18,
 19,  3,  4,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  1,  0,  0, 12,  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,  0,  0,  0,  0,  0,  0,
  1,  0,  0, 12,  2,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0, 19,  3,  4,
 85, 15, 18,236, 41, 51,254, 45, 55,253, 44, 54,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,227, 54, 58,105, 12,  8, 48,  0,  1,  0,  0,  0,
  0,  0,  0,115,  8, 41,201, 62,105,185, 52, 86,152, 45, 63,
 98, 33, 35, 75, 42, 32, 92, 36, 38, 22,  7,  0, 82, 36, 35,
146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  6,
 20,  4,  1, 48,  1,  0,102, 11,  7,224, 55, 59,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
252, 44, 54,138, 24, 29, 19,  3,  4,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  3,  4,
138, 24, 29,252, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,224, 55, 59,102, 11,  7, 48,  1,  0,
  0,  0,  0,  0,  0,  0,115,  8, 41,201, 62,105,185, 52, 86,
152, 45, 63, 98, 33, 35, 75, 42, 32,125, 48, 55, 22,  7,  0,
 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10,
 26,  0,  4, 18,  6,  1, 42,  5,  0,100,  7,  7,223, 54, 58,
254, 45, 55,254, 45, 55,253, 44, 54,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 47, 52,254, 46, 52,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,253, 44, 54,185, 32, 39, 63, 11, 13,
  9,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  2, 63, 11, 13,
185, 32, 39,253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
253, 44, 54,254, 45, 55,254, 45, 55,223, 54, 58,100,  7,  7,
 42,  5,  0,  0,  0,  0,  0,  0,  0,115,  8, 41,201, 62,105,
185, 54, 85,152, 47, 64, 97, 32, 34, 75, 42, 32,125, 48, 55,
 22,  7,  0, 82, 36, 35,146, 47, 63,179, 52, 88,186, 63,106,
 62,  0, 10, 26,  0,  4, 16,  7,  0, 36,  8,  0,101, 18, 14,
221, 56, 60,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 47, 52,254, 47, 52,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,
241, 42, 51,117, 20, 24,  4,  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,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  1,117, 20, 24,
241, 42, 51,253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,221, 56, 60,
101, 18, 14, 36,  8,  0,  0,  0,  0,  0,  0,  0,113,  8, 40,
201, 62,105,183, 54, 84,150, 47, 64, 94, 37, 35, 71, 43, 34,
142, 55, 64, 22,  7,  0, 82, 36, 35,148, 47, 63,179, 52, 88,
186, 63,106, 62,  0, 10, 26,  0,  4, 15,  7,  0, 32, 11,  0,
 94, 20, 11,219, 58, 58,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,247, 43, 53,113, 19, 23,  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,  0,  0,  0,  0,
  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,  0,  0,113, 19, 23,
247, 43, 53,253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
219, 58, 58, 94, 20, 11, 32, 11,  0,  0,  0,  0,  0,  0,  0,
113,  8, 40,201, 62,105,183, 54, 84,148, 47, 63, 85, 38, 36,
 24,  6,  0,142, 55, 64, 22,  7,  0, 82, 36, 35,148, 47, 63,
179, 52, 88,186, 63,106, 62,  0, 10, 26,  0,  4, 11,  7,  0,
 24, 11,  0, 88, 21, 15,217, 58, 58,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 54,247, 43, 52,
157, 27, 33,  7,  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,  0,  0,  0,  0,  0,  0,  2,  0,  0,
  2,  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,  0,  0,  0,  0,  0,  0,  0,  7,  0,  1,157, 27, 33,
247, 43, 52,254, 45, 54,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,217, 58, 58, 88, 21, 15, 24, 11,  0,  0,  0,  0,
  0,  0,  0,113,  8, 40,201, 62,105,183, 54, 84,146, 47, 63,
 82, 36, 35, 30, 10,  4,142, 55, 64, 24,  7,  0, 84, 36, 35,
146, 47, 63,179, 52, 88,186, 63,106, 62,  0, 10, 26,  0,  4,
  8,  7,  3, 11,  7,  0, 56,  2,  0,214, 55, 59,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,252, 44, 54,215, 37, 46, 60,  9, 12,  4,  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,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  4,  0,  1, 60,  9, 12,215, 37, 46,
252, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,214, 55, 59, 56,  2,  0, 11,  7,  0,
  0,  0,  0,  0,  0,  0,113,  8, 40,201, 62,105,183, 54, 84,
146, 47, 63, 82, 36, 35, 30, 10,  4,142, 55, 64, 24,  7,  0,
 84, 36, 35,146, 47, 63,178, 51, 87,186, 63,106, 62,  0, 10,
 26,  0,  4,  7,  2,  6,  7,  2,  6, 48,  2,  0,212, 55, 59,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,253, 44, 54,252, 44, 54,
177, 30, 38, 32,  5,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0, 32,  5,  6,177, 30, 38,252, 44, 54,
253, 44, 54,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,212, 55, 59, 48,  2,  0,
  7,  2,  6,  0,  0,  0,  0,  0,  0,114,  7, 40,201, 62,105,
185, 54, 85,146, 47, 63, 82, 36, 35, 30, 10,  4,142, 55, 64,
 30, 10,  4, 82, 36, 35,146, 47, 63,178, 51, 87,186, 63,106,
 62,  0, 10, 26,  0,  4,  7,  2,  6,  7,  2,  6, 48,  2,  0,
212, 55, 59,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,253, 44, 54,236, 41, 51,131, 22, 27, 57, 10, 12,
  9,  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,
  9,  1,  2, 57, 10, 12,131, 22, 27,236, 41, 51,253, 44, 54,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,
254, 45, 55,254, 45, 55,254, 45, 55,254, 45, 55,212, 55, 59,
 48,  2,  0,  7,  2,  6,  0,  0,  0,  0,  0,  0,114,  7, 40,
201, 62,105,185, 54, 85,146, 47, 63, 82, 36, 35, 30,  9,  4,
142, 55, 64, 30, 10,  4, 82, 36, 35,146, 47, 63,178, 51, 87,
186, 63,106, 62,  0, 10, 26,  0,  4,  7,  2,  6,  7,  2,  6,
 44,  2,  0,192, 59, 65,230, 51, 60,231, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
247, 43, 53,194, 33, 41,146, 25, 31,115, 20, 25, 57, 10, 12,
  9,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  9,  1,  2, 57, 10, 12,115, 20, 25,
146, 25, 31,194, 33, 41,247, 43, 53,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,233, 50, 59,
233, 50, 59,233, 50, 59,233, 50, 59,231, 50, 59,230, 51, 60,
192, 59, 65, 44,  2,  0,  7,  2,  6,  0,  0,  0,  0,  0,  0,
114,  7, 40,202, 63,106,185, 52, 86,146, 45, 64, 82, 35, 36,
 30,  9,  4,142, 55, 64, 30, 10,  4, 82, 36, 35,146, 47, 63,
178, 51, 87,186, 63,106, 62,  0, 10, 26,  0,  6,  6,  5,  3,
  6,  5,  3, 30,  1,  1, 92,  5,  7,179, 62, 64,185, 60, 66,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,151, 31, 35, 53, 15, 16, 40, 15, 15, 34, 12, 12,
 33, 11, 11, 35, 11, 11, 53, 15, 16,151, 31, 35,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,
189, 60, 63,189, 60, 63,189, 60, 63,189, 60, 63,185, 60, 66,
179, 62, 64, 92,  5,  7, 30,  1,  1,  6,  5,  3,  0,  0,  0,
  0,  0,  0,115,  8, 41,201, 62,105,185, 52, 86,146, 45, 64,
 82, 35, 36, 30,  9,  4,142, 55, 64, 30, 10,  4, 82, 36, 35,
146, 47, 63,177, 54, 86,186, 63,106, 62,  0, 10, 24,  0,  6,
  6,  5,  3,  6,  5,  3, 18,  3,  1, 48,  2,  0, 62,  2,  0,
 68,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0, 72,  3,  0,
 68,  3,  0, 62,  2,  0, 48,  2,  0, 18,  3,  1,  6,  5,  3,
  0,  0,  0,  0,  0,  0,115,  8, 41,201, 62,105,185, 52, 86,
146, 45, 64, 82, 36, 35, 30,  9,  4,142, 55, 64, 30,  9,  4,
 82, 36, 35,146, 47, 63,177, 54, 86,186, 63,106, 62,  0, 10,
 24,  0,  5,  8,  3,  5,  7,  2,  6,  9,  5,  2, 20,  3,  1,
 23,  2,  2, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0, 27,  2,  0,
 27,  2,  0, 27,  2,  0, 23,  2,  2, 20,  3,  1,  9,  5,  2,
  7,  2,  6,  0,  0,  0,  0,  0,  0,115,  8, 41,201, 62,105,
185, 54, 85,146, 45, 64, 82, 36, 35, 30, 10,  4,142, 55, 64,
 30,  9,  4, 82, 36, 35,148, 49, 63,178, 55, 84,186, 63,106,
 62,  0, 10, 24,  0,  5,  8,  3,  5,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  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,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  5,  7,  2,  5,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6, 30,  0,  4,115,  8, 41,
202, 63,102,185, 54, 85,146, 47, 63, 82, 36, 35, 30, 10,  4,
142, 55, 64, 30, 10,  4, 84, 35, 36,150, 49, 61,182, 55, 85,
187, 64,107, 62,  0,  8, 22,  0,  4,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  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,  0,  0,  0,  0,  0,  7,  2,  6,  7,  2,  6,  8,  3,  7,
  8,  3,  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,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  6,  4,  3,  6,  4,  3,
  7,  6,  3,  7,  6,  3,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6, 30,  0,  4,
115,  8, 41,202, 63,102,186, 55, 82,148, 49, 63, 82, 35, 36,
 60, 23, 21,142, 55, 64, 30, 10,  4, 84, 35, 36,152, 51, 60,
166, 39, 63,190, 63,105, 64,  0,  9, 26,  0,  4,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  6,  1,  5,  6,  1,  5,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  8,  3,  7,  8,  3,  7,  8,  3,  7,
  8,  3,  7,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  8,  3,  7,  8,  3,  7,  7,  2,  6,  7,  2,  6,  8,  3,  7,
  8,  3,  7,  8,  3,  7,  8,  3,  7,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  6,  4,  3,
  6,  4,  3,  7,  6,  3,  7,  6,  3,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
 30,  0,  4,113,  6, 41,200, 61,104,165, 36, 63,146, 49, 63,
 81, 35, 34, 30,  7,  4,142, 55, 64, 30, 10,  4, 84, 36, 35,
156, 55, 60,169, 42, 63,194, 63,106, 70,  0,  9, 28,  0,  5,
  7,  2,  6,  7,  2,  6,  6,  1,  5,  7,  2,  6,  7,  2,  6,
  8,  3,  7,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,  7,  2,  6,
  7,  2,  6, 30,  0,  4,110,  5, 42,196, 59,104,158, 35, 64,
141, 50, 65, 81, 34, 35, 26,  3,  0,142, 55, 64, 60, 23, 21,
 82, 38, 35, 97, 10,  8,165, 46, 60,188, 59, 92, 90,  0, 19,
 38,  0,  4, 16,  3,  3, 13,  5,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2, 11,  7,  2,
 13,  5,  2, 18,  1,  3, 41,  0,  3,147, 32, 70,188, 53, 94,
240,129,153,211,132,143,184,143,146, 58, 39, 37,172,168,163,
125, 48, 55, 73, 39, 36,108, 31, 31,158, 57, 59,164, 43, 63,
171, 60, 84, 58,  0,  2, 36,  0,  3, 27,  3,  0, 22,  7,  0,
 22,  6,  0, 22,  6,  0, 22,  7,  0, 24,  8,  0, 22,  6,  0,
 22,  6,  0, 22,  7,  0, 22,  7,  0, 22,  6,  0, 22,  6,  0,
 22,  7,  0, 22,  7,  0, 22,  6,  0, 22,  6,  0, 22,  7,  0,
 22,  7,  0, 22,  6,  0, 22,  6,  0, 22,  7,  0, 22,  7,  0,
 22,  7,  0, 22,  7,  0, 22,  7,  0, 22,  7,  0, 22,  6,  0,
 22,  6,  0, 22,  7,  0, 22,  7,  0, 22,  7,  0, 22,  7,  0,
 22,  7,  0, 22,  7,  0, 22,  6,  0, 22,  6,  0, 22,  7,  0,
 22,  7,  0, 22,  6,  0, 22,  6,  0, 22,  7,  0, 22,  7,  0,
 22,  6,  0, 22,  6,  0, 22,  7,  0, 22,  7,  0, 22,  6,  0,
 22,  6,  0, 22,  7,  0, 22,  7,  0, 22,  6,  0, 22,  6,  0,
 22,  7,  0, 22,  7,  0, 22,  6,  0, 22,  6,  0, 22,  7,  0,
 22,  6,  0, 22,  6,  0, 22,  6,  0, 22,  6,  0, 22,  7,  0,
 22,  6,  0, 22,  6,  0, 22,  7,  0, 22,  7,  0, 24,  6,  0,
 24,  6,  0, 22,  7,  0, 22,  7,  0, 22,  6,  0, 22,  6,  0,
 22,  7,  0, 29,  2,  0, 40,  0,  2,102, 17, 39,199, 68,102,
169, 32, 64,174, 79, 95,148, 87, 94,208,177,180,173,164,164,
254,252,251,142, 55, 64, 28,  4,  0, 91, 36, 32, 90, 13,  9,
160, 53, 58,160, 47, 63,168, 73, 91, 76,  1, 13, 89, 36, 34,
 84, 36, 35, 82, 36, 35, 82, 36, 35, 81, 35, 34, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 35, 36,
 82, 35, 36, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 35, 36, 82, 35, 36, 82, 36, 35,
 82, 36, 35, 82, 35, 36, 82, 35, 36, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 35, 36, 82, 35, 36, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 84, 36, 35, 84, 36, 35, 84, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 84, 35, 36, 91, 34, 35,133, 52, 67,176, 69, 92,
170, 39, 63,166, 43, 63,163, 88, 95,126, 85, 86,148,129,130,
227,223,222,166,165,163,142, 55, 64,142, 55, 64, 32,  3,  0,
 92, 35, 33, 98,  9,  7,166, 53, 56,164, 51, 59,160, 51, 58,
157, 54, 58,152, 53, 60,167, 68, 82,165, 66, 82,168, 67, 83,
167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,
165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,
167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,
167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,
165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,
167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,
167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,165, 66, 82,
165, 66, 82,167, 66, 82,167, 66, 82,165, 64, 83,165, 64, 83,
167, 66, 82,167, 66, 82,165, 66, 82,165, 66, 82,167, 66, 82,
167, 66, 82,165, 66, 82,167, 66, 82,167, 66, 82,167, 66, 82,
165, 66, 82,167, 68, 82,152, 53, 60,156, 53, 60,162, 49, 60,
166, 49, 58,169, 50, 56,101,  4,  7, 89, 34, 34, 26,  2,  0,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
 92, 35, 38, 73, 39, 36,101, 32, 34, 96, 13,  9,101,  6,  6,
155, 56, 58,154, 55, 57,152, 53, 60,148, 49, 63,146, 45, 64,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,
146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,
146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,
146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,
146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,
146, 47, 63,146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,
146, 47, 63,148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,
148, 47, 63,148, 47, 63,146, 47, 63,146, 47, 63,148, 47, 63,
148, 47, 63,146, 47, 63,147, 48, 62,152, 51, 60,155, 54, 59,
155, 56, 58,100,  5,  5, 96, 13,  9,101, 33, 32, 73, 40, 34,
 92, 35, 38,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64, 76, 28, 30, 30,  2,  0, 76, 38, 35,
 82, 35, 35, 85, 36, 34, 85, 36, 34, 84, 35, 36, 82, 36, 35,
 82, 35, 36, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35,
 82, 36, 35, 82, 36, 35, 82, 36, 35, 82, 36, 35, 84, 35, 36,
 85, 36, 37, 85, 36, 34, 82, 35, 35, 77, 39, 36, 32,  3,  0,
 92, 35, 38,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
125, 48, 55, 60, 22, 21, 30,  9,  4, 30,  9,  4, 30,  9,  4,
 30,  9,  4, 30,  9,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4,
 30, 10,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4,
 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4,
 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4,
 30, 10,  4, 30, 10,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4,
 30,  9,  4, 30, 10,  4, 30, 10,  4, 30, 10,  4, 30, 10,  4,
 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4,
 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4,
 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4,
 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4,
 30, 10,  4, 30, 10,  4, 30, 10,  4, 30, 10,  4, 30, 10,  4,
 30, 10,  4, 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4,
 30,  9,  4, 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4,
 30,  9,  4, 30, 10,  4, 30, 10,  4, 30,  9,  4, 30,  9,  4,
 30,  8,  4, 30,  9,  4, 30,  9,  4, 60, 22, 21,125, 48, 55,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,142, 55, 64,
142, 55, 64,142, 55, 64,142, 55, 64};

1.1                  snatch/x11.c

Index: x11.c
===================================================================
/* X11 layer of subversion library to intercept RealPlayer socket and
   device I/O. --Monty 20011101 */

#include <stdio.h>
#include <errno.h>
#include <sys/time.h>
#include "snatchppm.h"
static int savefile=-1;

tatic unsigned long window_id_base=0;
static unsigned long window_id_mask=0;

tatic unsigned long rpshell_window=0;
static unsigned long rpmain_window=0;
static unsigned long rpmenu_window=0;
static unsigned long rpplay_window=0;
static unsigned long rpplay_width=0;
static unsigned long rpplay_height=0;

tatic unsigned long logo_x=0;
static unsigned long logo_y=0;
static unsigned long logo_prev=-1;

tatic unsigned long play_blackleft=-1;
static unsigned long play_blackright=-1;
static unsigned long play_blackupper=-1;
static unsigned long play_blacklower=-1;

tatic unsigned long rpvideo_window=0;
static int video_width=-1;
static int video_length=-1;
static int bigendian_p=0;

/* Built out of a few pieces of xscope by James Peterson, 1988 
   xscope is (c) Copyright MCC, 1988 */

tatic int littleEndian;

tatic unsigned long ILong(unsigned char *buf){
  if(littleEndian)
    return((((((buf[3] << 8) | buf[2]) << 8) | buf[1]) << 8) | buf[0]);
  return((((((buf[0] << 8) | buf[1]) << 8) | buf[2]) << 8) | buf[3]);
}

tatic unsigned short IShort(unsigned char *buf){
  if(littleEndian)
    return (buf[1] << 8) | buf[0];
  return((buf[0] << 8) | buf[1]);
}

tatic unsigned short IByte (unsigned char *buf){
  return(buf[0]);
}

tatic void SetUpReply(unsigned char *buf){
  if(IByte(&buf[0])){
    window_id_base=ILong(&buf[12]);
    window_id_mask=ILong(&buf[16]);
    bigendian_p=IByte(&buf[30]);
    
    if(debug){
      fprintf(stderr,
              "    ...: RealPlayer X setup\n"
              "           window id base = %lx\n"
              "           window id mask = %lx\n"
              "           server image endianness = %s\n",
              window_id_base,window_id_mask,(bigendian_p?"big":"small"));
    }
  }
}

tatic void CreateWindow(unsigned char *buf){
  unsigned long id=ILong(&buf[4]);
  unsigned long parent=ILong(&buf[8]);
   
  if((id & ~window_id_mask) == window_id_base){

    if(parent==rpshell_window){
      rpmain_window=id;
      rpplay_window=0;
      if(debug)
        fprintf(stderr,
                "    ...: RealPlayer main window id=%lx\n",rpmain_window);
      
    }else if(rpshell_window){
      if(parent==rpmain_window){
        if(!rpplay_window){
          rpplay_window=id;

          if(debug)
            fprintf(stderr,
                    "    ...: RealPlayer console window id=%lx\n",rpplay_window);
        }else{
          rpmenu_window=id;
        }
      }else if(parent==rpplay_window){
        rpvideo_window=id;
        if(debug)
          fprintf(stderr,
                  "    ...: RealPlayer video window id=%lx\n",rpvideo_window);
      }
    }
  }
}

tatic void ConfigureWindow(unsigned char *buf){
  unsigned long id=ILong(&buf[4]);

  if(id==rpplay_window){
    unsigned long bitmask=IShort(&buf[8]);
    int i,count=0;
    
    for(i=0;i<16;i++){
      unsigned long testmask=1<<i;
      unsigned long val;
      if(bitmask & testmask){
        if(bigendian_p)
          val=IShort(&buf[12+count+2]);
        else
          val=IShort(&buf[12+count]);

        if(testmask==0x4){ /* width */
          rpplay_width=val;
        }
        if(testmask==0x8){ /* height */
          rpplay_height=val;
        }
        count+=4;
      }
    }
  }
}

tatic void ChangeProperty(unsigned char *buf){
  long    n;

  unsigned long id=ILong(&buf[4]);
  long property=ILong(&buf[8]);
  long type=ILong(&buf[12]);
  long format=ILong(&buf[16]);
  char *data;

  if(rpshell_window==0){
    if(property==67 && type==31){ /* WM_CLASS and STRING */
      n = ILong(&buf[20])*format/8;
      data=&buf[24];
      
      if(debug)
        fprintf(stderr,
                "    ...: looking for our shell window...\n"
                "           candidate: id=%lx, name=%s class=%s\n",
                id,(data?data:""),(data?strchr(data,'\0')+1:""));
                                   
      if(n>26 &&  !memcmp(data,"RealPlayer\0RCACoreAppShell\0",27)){
        /* it's our shell window above the WM parent */
        rpshell_window=id;
        
        /* re-setup */
        rpmain_window=0;
        rpmenu_window=0;
        rpplay_window=0;
        rpplay_width=0;
        rpplay_height=0;
        
        logo_x=0;
        logo_y=0;
        logo_prev=-1;
        
        rpvideo_window=0;
        video_width=-1;
        video_length=-1;

        if(debug)
          fprintf(stderr,"           GOT IT!\n");
      }else{
        if(debug)
          fprintf(stderr,"           nope...\n");
      }
    }
  }
}

tatic void PutImage(unsigned char *buf){
  int id=ILong(&buf[4]);
  
  if(id==rpvideo_window){
    int width=IShort(&buf[12])+IByte(&buf[20]);
    int height=IShort(&buf[14]);
    int n = width*height*4,i,j;
    char *work=alloca(n+1),*ptr=&buf[24],charbuf[80]; 
    
    static long ZeroTime1 = -1;
    static long ZeroTime2 = -1;
    static struct timeval   tp;
    static long lastsec = 0;
    long    sec /* seconds */ ;
    long    hsec /* hundredths of a second */ ;
    
    //if(savefile==-1)
    //savefile=open("realplayer-out.ppm",O_RDWR|O_APPEND|O_CREAT,0770);

    (void)gettimeofday(&tp, (struct timezone *)NULL);
    if (ZeroTime1 == -1 || (tp.tv_sec - lastsec) >= 1000)
      {
        ZeroTime1 = tp.tv_sec;
        ZeroTime2 = tp.tv_usec / 10000;
      }
    
    lastsec = tp.tv_sec;
    sec = tp.tv_sec - ZeroTime1;
    hsec = tp.tv_usec / 10000 - ZeroTime2;
    if (hsec < 0)
      {
        hsec += 100;
        sec -= 1;
      }

    sprintf(charbuf,"P6\n# time %ld.%08ld\n%d %d 255\n",sec,hsec,width, height);
    //write(savefile,charbuf,strlen(charbuf));
    
    for(i=0,j=0;i<n;i+=4){
      work[j++]=ptr[i+2];
      work[j++]=ptr[i+1];
      work[j++]=ptr[i];
    }
    work[j++]='\n';
    
    //write(savefile,work,j);
  }
  
  /* Subvert the Real sign on logo; paste the Snatch logo in.
     Although this might seem like a vanity issue, the primary reason
     for doing this is to give the user a clear indication Snatch is
     working properly, so some care should be taken to get it right. */

  if(id==rpplay_window){
    int width=IShort(&buf[12])+IByte(&buf[20]);
    int height=IShort(&buf[14]);
    int x=IShort(&buf[16]);
    int y=IShort(&buf[18]);

    char *ptr=&buf[24]; 
    long i,j,k;

    if(x==0 && width==rpplay_width){
      if(y==0){
        play_blackupper=42;
        play_blacklower=-1;
        play_blackleft=-1;
        play_blackright=-1;
      }

      if(y<=play_blackupper && y+width>play_blackupper){
        for(play_blackleft=20;play_blackleft>0;play_blackleft--)
          if(ptr[(play_blackupper-y)*width*4+play_blackleft*4+1]!=0)break;
        play_blackleft++;
        for(play_blackright=width-20;play_blackright<width;play_blackright++)
          if(ptr[(play_blackupper-y)*width*4+play_blackright*4+1]!=0)break;
      }

      if(play_blacklower==-1){
        play_blacklower=42;
        if(y>play_blacklower)play_blacklower=y;
        for(;play_blacklower<y+height;play_blacklower++)
          if(ptr[(play_blacklower-y)*width*4+81]!=0)break;
        
        if(play_blacklower==y+height)play_blacklower=-1;
      }
    }

    /* after a resize, look where to put the logo... */
    if(x==0 && y<rpplay_height/2 && width==rpplay_width){
      if(y<=logo_prev)
        logo_y=-1;

      if(logo_y==-1){
        /* look for the real logo in the data; it's in the middle of the
           big black block */
        int test;
        
        for(test=play_blackupper;test<height+y;test++)
          if(test>=y)
            if(ptr[(test-y)*width*4+(width/2*4)+1]!=0)break;
        
        if(test<height+y && 
           (test+snatchheight<play_blacklower || play_blacklower==-1) && 
           test!=y){
          logo_y=test;
          
          /* verify enough room to display... */
          if(test<50){
            long blacklower;
            
            for(blacklower=test;blacklower<y+height;blacklower++)
            if(ptr[(blacklower-y)*width*4+(20*4)+1]!=0)break;
            
            if(blacklower-test<snatchheight)logo_y=-1;
          }
        }
      }
      logo_prev=y;
      logo_x=(width/2)-(snatchwidth/2);
    }

    /* blank background */
    if(bigendian_p){
      int lower=(play_blacklower==-1?y+height:play_blacklower);
      for(i=play_blackupper;i<lower;i++)
        if(i>=y && i<y+height)
          for(j=play_blackleft;j<play_blackright;j++)
            if(j>=x && j<x+width){
              ptr[(i-y)*width*4+(j-x)*4]=0x00;
              ptr[(i-y)*width*4+(j-x)*4+1]=snatchppm[0];
              ptr[(i-y)*width*4+(j-x)*4+2]=snatchppm[1];
              ptr[(i-y)*width*4+(j-x)*4+3]=snatchppm[2];
            }
    }else{
      int lower=(play_blacklower==-1?y+height:play_blacklower);
      for(i=play_blackupper;i<lower;i++)
        if(i>=y && i<y+height)
          for(j=play_blackleft;j<play_blackright;j++)
            if(j>=x && j<x+width){
              ptr[(i-y)*width*4+(j-x)*4+3]=0x00;
              ptr[(i-y)*width*4+(j-x)*4+2]=snatchppm[0];
                ptr[(i-y)*width*4+(j-x)*4+1]=snatchppm[1];
                ptr[(i-y)*width*4+(j-x)*4]=snatchppm[2];
            }
    }

    /* paint logo */
    if(logo_y!=-1){
      for(i=0;i<snatchheight;i++){
        if(i+logo_y>=y && i+logo_y<height+y){
          char *snatch=snatchppm+snatchwidth*3*i;
          char *real;
          long end;
          
          k=x-logo_x;
          if(k<0)k=0;
          end=x+snatchwidth-logo_x;
          j=(logo_x-x)*4;
          if(j<0)j=0;
          
          real=ptr+width*4*(i+logo_y-y);
          snatch=snatchppm+snatchwidth*3*i;
          
          if(bigendian_p){
            for(k*=3;k<snatchwidth*3 && j<width*4;){
              real[++j]=snatch[k++];
              real[++j]=snatch[k++];
              real[++j]=snatch[k++];
              ++j;
            }
            
            
          }else{
            for(k*=3;k<snatchwidth*3 && j<width*4;j+=4){
              real[j+2]=snatch[k++];
              real[j+1]=snatch[k++];
              real[j]=snatch[k++];
            }
          }
        }
      }
    }
  }
}
 
/* Client-to-Server and Server-to-Client interception processing */
/* Here are the most in-tact bits of xscope */
struct ConnState {
    unsigned char   *SavedBytes;
    long    SizeofSavedBytes;
    long    NumberofSavedBytes;
    long    NumberofBytesNeeded;
    long    (*ByteProcessing)();
};
 
static struct ConnState serverCS;
static struct ConnState clientCS;

tatic void DecodeRequest(unsigned char *buf,long n){
  int   Request = IByte (&buf[0]);
  switch (Request){
  case 1:
    CreateWindow(buf);
    break;
  case 12:
    ConfigureWindow(buf);
    break;
  case 18:
    ChangeProperty(buf);
    break;
  case 72:
    PutImage(buf);
    break;
  }
}

tatic long DataToServer(unsigned char *buf,long n){
  long togo=n;
  unsigned char *p=buf;
  
  while(togo>0){
    int bw=(*libc_write)(X_fd,p,togo);
    if(bw<0 && (errno==EAGAIN || errno==EINTR))bw=0;
    if(bw>=0)
      p+=bw;
    else
      return(bw);
    togo-=bw;
  }
  return(0);
}

tatic void SaveBytes(struct ConnState *cs,unsigned char *buf,long n){

  /* check if there is enough space to hold the bytes we want */
  if (cs->NumberofSavedBytes + n > cs->SizeofSavedBytes){
    long    SizeofNewBytes = (cs->NumberofSavedBytes + n + 1);
    if(cs->SavedBytes)
      cs->SavedBytes = realloc(cs->SavedBytes,SizeofNewBytes);
    else
      cs->SavedBytes = malloc(SizeofNewBytes);

    cs->SizeofSavedBytes = SizeofNewBytes;
  }

  /* now copy the new bytes onto the end of the old bytes */
  memcpy(cs->SavedBytes + cs->NumberofSavedBytes,buf,n);
  cs->NumberofSavedBytes += n;
}

tatic void RemoveSavedBytes(struct ConnState *cs,long n){
  /* check if all bytes are being removed -- easiest case */
  if (cs->NumberofSavedBytes <= n)
    cs->NumberofSavedBytes = 0;
  else if (n == 0)
    return;
  else{
    /* not all bytes are being removed -- shift the remaining ones down  */
    memmove(cs->SavedBytes,cs->SavedBytes+n,cs->NumberofSavedBytes - n);
    cs->NumberofSavedBytes -= n;
  }
}

tatic long pad(long n){
  return((n + 3) & ~0x3);
}

tatic long FinishRequest(struct ConnState *cs,unsigned char *buf,long n);

tatic long StartRequest(struct ConnState *cs,unsigned char *buf,long n){
  unsigned short requestlength;

  /* bytes 0,1 are ignored now; bytes 2,3 tell us the request length */
  requestlength = IShort(&buf[2]);
  cs->ByteProcessing = FinishRequest;
  cs->NumberofBytesNeeded = 4 * requestlength;
  return(0);
}

tatic long FinishSetUpMessage(struct ConnState *cs,unsigned char *buf,long n){
  littleEndian = (buf[0] == 'l');
  cs->ByteProcessing = StartRequest;
  cs->NumberofBytesNeeded = 4;
  return(n);
}

tatic long StartSetUpMessage(struct ConnState *cs,unsigned char *buf,long n){
  short   namelength;
  short   datalength;

  namelength = IShort(&buf[6]);
  datalength = IShort(&buf[8]);
  cs->ByteProcessing = FinishSetUpMessage;
  cs->NumberofBytesNeeded = n + pad((long)namelength) + pad((long)datalength);
  return(0);
}

tatic long FinishRequest(struct ConnState *cs,unsigned char *buf,long n){
  DecodeRequest(buf, n);
  cs->ByteProcessing = StartRequest;
  cs->NumberofBytesNeeded = 4;
  return(n);
}

/* ************************************************************ */

tatic long FinishSetUpReply(struct ConnState *cs,unsigned char *buf,long n){
  SetUpReply(buf);
  cs->ByteProcessing = NULL; /* no further reason to watch the stream */
  cs->NumberofBytesNeeded = 0;
  return(n);
}

tatic long StartSetUpReply(struct ConnState *cs,unsigned char *buf,long n){
  int replylength = IShort(&buf[6]);
  cs->ByteProcessing = FinishSetUpReply;
  cs->NumberofBytesNeeded = n + 4 * replylength;
  return(0);
}

tatic void StartClientConnection(void){
  memset(&clientCS,0,sizeof(clientCS));
  clientCS.ByteProcessing = StartSetUpMessage;
  clientCS.NumberofBytesNeeded = 12;
}

tatic void StopClientConnection(void){
  if (clientCS.SizeofSavedBytes > 0)
    free(clientCS.SavedBytes);
  memset(&clientCS,0,sizeof(clientCS));
}

tatic void StartServerConnection(void){
  memset(&serverCS,0,sizeof(clientCS));
  serverCS.ByteProcessing = StartSetUpReply;
  serverCS.NumberofBytesNeeded = 8;
}

tatic void StopServerConnection(void){
  if(serverCS.SizeofSavedBytes > 0)
    free(serverCS.SavedBytes);
  memset(&serverCS,0,sizeof(clientCS));
}

tatic void ProcessBuffer(struct ConnState *cs,unsigned char *buf,long n,
                     long (*w)(unsigned char *,long)){
  unsigned char   *BytesToProcess;
  long             NumberofUsedBytes;
  
  while (cs->ByteProcessing && /* we turn off watching replies from
                                    the server after grabbing set up */
         
         cs->NumberofSavedBytes + n >= cs->NumberofBytesNeeded){
    if (cs->NumberofSavedBytes == 0){
      /* no saved bytes, so just process the first bytes in the
         read buffer */
      BytesToProcess = buf /* address of request bytes */;
    }else{
      if (cs->NumberofSavedBytes < cs->NumberofBytesNeeded){
        /* first determine the number of bytes we need to
           transfer; then transfer them and remove them from
           the read buffer. (there may be additional requests
           in the read buffer) */
        long    m;
        m = cs->NumberofBytesNeeded - cs->NumberofSavedBytes;
        SaveBytes(cs, buf, m);
        buf += m;
        n -= m;
      }
      BytesToProcess = cs->SavedBytes /* address of request bytes */;
    }
    
    NumberofUsedBytes = (*cs->ByteProcessing)
      (cs, BytesToProcess, cs->NumberofBytesNeeded);
    
    /* *After* we've processed the buffer (and possibly caused side
       effects), we ship the request off to the recipient */
    if(w)(*w)(BytesToProcess,NumberofUsedBytes);
    
    /* the number of bytes that were actually used is normally (but not
       always) the number of bytes needed.  Discard the bytes that were
       actually used, not the bytes that were needed. The number of used
       bytes must be less than or equal to the number of needed bytes. */
    
    if (NumberofUsedBytes > 0){
      if (cs->NumberofSavedBytes > 0)
        RemoveSavedBytes(cs, NumberofUsedBytes);
      else{
        /* there are no saved bytes, so the bytes that were
           used must have been in the read buffer */
        buf += NumberofUsedBytes;
        n -= NumberofUsedBytes;
      }
    }
  } /* end of while (NumberofSavedBytes + n >= NumberofBytesNeeded) */

  /* not enough bytes -- just save the new bytes for more later */
  if (cs->ByteProcessing && n > 0)
    SaveBytes(cs, buf, n);
  return;
}

--- >8 ----
List archives:  http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'cvs-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.



More information about the commits mailing list